mirror of
https://github.com/zeromicro/go-zero.git
synced 2026-05-07 23:20:00 +08:00
108 lines
3.0 KiB
Go
108 lines
3.0 KiB
Go
package parser
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestResolveImports_Basic(t *testing.T) {
|
|
// test.proto imports "base.proto", which lives in the same directory.
|
|
absDir, err := filepath.Abs(".")
|
|
assert.NoError(t, err)
|
|
|
|
paths, err := ResolveImports("./test.proto", []string{absDir})
|
|
assert.NoError(t, err)
|
|
assert.Len(t, paths, 1)
|
|
assert.True(t, strings.HasSuffix(paths[0], "base.proto"))
|
|
assert.True(t, filepath.IsAbs(paths[0]))
|
|
}
|
|
|
|
func TestResolveImports_SourceExcluded(t *testing.T) {
|
|
// The source file itself must not appear in the result.
|
|
absDir, err := filepath.Abs(".")
|
|
assert.NoError(t, err)
|
|
|
|
absSrc, err := filepath.Abs("./test.proto")
|
|
assert.NoError(t, err)
|
|
|
|
paths, err := ResolveImports("./test.proto", []string{absDir})
|
|
assert.NoError(t, err)
|
|
for _, p := range paths {
|
|
assert.NotEqual(t, absSrc, p)
|
|
}
|
|
}
|
|
|
|
func TestResolveImports_NotFound(t *testing.T) {
|
|
// Imports that cannot be located in protoPaths are silently skipped.
|
|
paths, err := ResolveImports("./test.proto", []string{"/nonexistent/path"})
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, paths)
|
|
}
|
|
|
|
func TestResolveImports_NoDuplicates(t *testing.T) {
|
|
// Even if the same proto is found via multiple search paths, it should
|
|
// appear only once.
|
|
absDir, err := filepath.Abs(".")
|
|
assert.NoError(t, err)
|
|
|
|
paths, err := ResolveImports("./test.proto", []string{absDir, absDir})
|
|
assert.NoError(t, err)
|
|
|
|
seen := make(map[string]int)
|
|
for _, p := range paths {
|
|
seen[p]++
|
|
}
|
|
for p, count := range seen {
|
|
assert.Equal(t, 1, count, "duplicate path: %s", p)
|
|
}
|
|
}
|
|
|
|
func TestParseImportedProtos_Basic(t *testing.T) {
|
|
absDir, err := filepath.Abs(".")
|
|
assert.NoError(t, err)
|
|
|
|
protos, err := ParseImportedProtos("./test.proto", []string{absDir})
|
|
assert.NoError(t, err)
|
|
assert.Len(t, protos, 1)
|
|
|
|
imp := protos[0]
|
|
assert.Equal(t, "github.com/zeromicro/go-zero/tools/goctl/rpc/parser/base", imp.GoPackage)
|
|
assert.Equal(t, "base", imp.PbPackage)
|
|
assert.True(t, filepath.IsAbs(imp.Src))
|
|
}
|
|
|
|
func TestParseImportedProtos_EmptyWhenNoImports(t *testing.T) {
|
|
// test_option.proto has no imports, so the result should be empty.
|
|
absDir, err := filepath.Abs(".")
|
|
assert.NoError(t, err)
|
|
|
|
protos, err := ParseImportedProtos("./test_option.proto", []string{absDir})
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, protos)
|
|
}
|
|
|
|
func TestIsWellKnownProto(t *testing.T) {
|
|
assert.True(t, isWellKnownProto("google/protobuf/timestamp.proto"))
|
|
assert.True(t, isWellKnownProto("google/protobuf/empty.proto"))
|
|
assert.False(t, isWellKnownProto("base.proto"))
|
|
assert.False(t, isWellKnownProto("common/types.proto"))
|
|
}
|
|
|
|
func TestLookupProtoFile_Found(t *testing.T) {
|
|
absDir, err := filepath.Abs(".")
|
|
assert.NoError(t, err)
|
|
|
|
got, err := lookupProtoFile("base.proto", []string{absDir})
|
|
assert.NoError(t, err)
|
|
assert.True(t, filepath.IsAbs(got))
|
|
assert.True(t, strings.HasSuffix(got, "base.proto"))
|
|
}
|
|
|
|
func TestLookupProtoFile_NotFound(t *testing.T) {
|
|
_, err := lookupProtoFile("nonexistent.proto", []string{"/no/such/dir"})
|
|
assert.Error(t, err)
|
|
}
|