mirror of
https://github.com/zeromicro/go-zero.git
synced 2026-05-11 00:40:00 +08:00
feat(goctl/rpc): support external proto imports with cross-package ty… (#5472)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
107
tools/goctl/rpc/parser/import_test.go
Normal file
107
tools/goctl/rpc/parser/import_test.go
Normal file
@@ -0,0 +1,107 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user