1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
package linter
import (
"errors"
"testing"
"github.com/golang/protobuf/protoc-gen-go/descriptor"
plugin "github.com/golang/protobuf/protoc-gen-go/plugin"
"github.com/stretchr/testify/require"
_ "gitlab.com/gitlab-org/gitaly/v14/proto/go/internal/linter/testdata"
"google.golang.org/protobuf/reflect/protodesc"
protoreg "google.golang.org/protobuf/reflect/protoregistry"
)
func TestLintFile(t *testing.T) {
for _, tt := range []struct {
protoPath string
errs []error
}{
{
protoPath: "go/internal/linter/testdata/valid.proto",
errs: nil,
},
{
protoPath: "go/internal/linter/testdata/invalid.proto",
errs: []error{
formatError("go/internal/linter/testdata/invalid.proto", "InterceptedWithOperationType", "InvalidMethod", errors.New("operation type defined on an intercepted method")),
formatError("go/internal/linter/testdata/invalid.proto", "InvalidService", "InvalidMethod0", errors.New("missing op_type extension")),
formatError("go/internal/linter/testdata/invalid.proto", "InvalidService", "InvalidMethod1", errors.New("op set to UNKNOWN")),
formatError("go/internal/linter/testdata/invalid.proto", "InvalidService", "InvalidMethod2", errors.New("unexpected count of target_repository fields 0, expected 1, found target_repository label at: []")),
formatError("go/internal/linter/testdata/invalid.proto", "InvalidService", "InvalidMethod4", errors.New("unexpected count of target_repository fields 0, expected 1, found target_repository label at: []")),
formatError("go/internal/linter/testdata/invalid.proto", "InvalidService", "InvalidMethod5", errors.New("wrong type of field RequestWithWrongTypeRepository.header.repository, expected .gitaly.Repository, got .test.InvalidMethodResponse")),
formatError("go/internal/linter/testdata/invalid.proto", "InvalidService", "InvalidMethod6", errors.New("unexpected count of target_repository fields 0, expected 1, found target_repository label at: []")),
formatError("go/internal/linter/testdata/invalid.proto", "InvalidService", "InvalidMethod7", errors.New("unexpected count of target_repository fields 0, expected 1, found target_repository label at: []")),
formatError("go/internal/linter/testdata/invalid.proto", "InvalidService", "InvalidMethod8", errors.New("unexpected count of target_repository fields 0, expected 1, found target_repository label at: []")),
formatError("go/internal/linter/testdata/invalid.proto", "InvalidService", "InvalidMethod9", errors.New("unexpected count of target_repository fields 1, expected 0, found target_repository label at: [InvalidMethodRequestWithRepo.destination]")),
formatError("go/internal/linter/testdata/invalid.proto", "InvalidService", "InvalidMethod10", errors.New("unexpected count of storage field 1, expected 0, found storage label at: [RequestWithStorageAndRepo.storage_name]")),
formatError("go/internal/linter/testdata/invalid.proto", "InvalidService", "InvalidMethod11", errors.New("unexpected count of storage field 1, expected 0, found storage label at: [RequestWithNestedStorageAndRepo.inner_message.storage_name]")),
formatError("go/internal/linter/testdata/invalid.proto", "InvalidService", "InvalidMethod13", errors.New("unexpected count of storage field 0, expected 1, found storage label at: []")),
formatError("go/internal/linter/testdata/invalid.proto", "InvalidService", "InvalidMethod14", errors.New("unexpected count of storage field 2, expected 1, found storage label at: [RequestWithMultipleNestedStorage.inner_message.storage_name RequestWithMultipleNestedStorage.storage_name]")),
},
},
} {
t.Run(tt.protoPath, func(t *testing.T) {
fd, err := protoreg.GlobalFiles.FindFileByPath(tt.protoPath)
require.NoError(t, err)
fdToCheck := protodesc.ToFileDescriptorProto(fd)
req := &plugin.CodeGeneratorRequest{
ProtoFile: []*descriptor.FileDescriptorProto{fdToCheck},
}
for _, protoPath := range []string{
// as we have no input stream we can use to create CodeGeneratorRequest
// we must create it by hands with all required dependencies loaded
"google/protobuf/descriptor.proto",
"google/protobuf/timestamp.proto",
"lint.proto",
"shared.proto",
} {
fd, err := protoreg.GlobalFiles.FindFileByPath(protoPath)
require.NoError(t, err)
req.ProtoFile = append(req.ProtoFile, protodesc.ToFileDescriptorProto(fd))
}
errs := LintFile(fdToCheck, req)
require.Equal(t, tt.errs, errs)
})
}
}
|