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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
|
package protoregistry_test
import (
"fmt"
"testing"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitaly/v14/internal/praefect/protoregistry"
"gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testassert"
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
)
func TestNewProtoRegistry(t *testing.T) {
expectedResults := map[string]map[string]protoregistry.OpType{
"BlobService": map[string]protoregistry.OpType{
"GetBlob": protoregistry.OpAccessor,
"GetBlobs": protoregistry.OpAccessor,
"GetLFSPointers": protoregistry.OpAccessor,
},
"CleanupService": map[string]protoregistry.OpType{
"ApplyBfgObjectMapStream": protoregistry.OpMutator,
},
"CommitService": map[string]protoregistry.OpType{
"CommitIsAncestor": protoregistry.OpAccessor,
"TreeEntry": protoregistry.OpAccessor,
"CommitsBetween": protoregistry.OpAccessor,
"CountCommits": protoregistry.OpAccessor,
"CountDivergingCommits": protoregistry.OpAccessor,
"GetTreeEntries": protoregistry.OpAccessor,
"ListFiles": protoregistry.OpAccessor,
"FindCommit": protoregistry.OpAccessor,
"CommitStats": protoregistry.OpAccessor,
"FindAllCommits": protoregistry.OpAccessor,
"FindCommits": protoregistry.OpAccessor,
"CommitLanguages": protoregistry.OpAccessor,
"RawBlame": protoregistry.OpAccessor,
"LastCommitForPath": protoregistry.OpAccessor,
"ListLastCommitsForTree": protoregistry.OpAccessor,
"CommitsByMessage": protoregistry.OpAccessor,
"ListCommitsByOid": protoregistry.OpAccessor,
"FilterShasWithSignatures": protoregistry.OpAccessor,
},
"ConflictsService": map[string]protoregistry.OpType{
"ListConflictFiles": protoregistry.OpAccessor,
"ResolveConflicts": protoregistry.OpMutator,
},
"DiffService": map[string]protoregistry.OpType{
"CommitDiff": protoregistry.OpAccessor,
"CommitDelta": protoregistry.OpAccessor,
"RawDiff": protoregistry.OpAccessor,
"RawPatch": protoregistry.OpAccessor,
"DiffStats": protoregistry.OpAccessor,
},
"NamespaceService": map[string]protoregistry.OpType{
"AddNamespace": protoregistry.OpMutator,
"RemoveNamespace": protoregistry.OpMutator,
"RenameNamespace": protoregistry.OpMutator,
"NamespaceExists": protoregistry.OpAccessor,
},
"ObjectPoolService": map[string]protoregistry.OpType{
"CreateObjectPool": protoregistry.OpMutator,
"DeleteObjectPool": protoregistry.OpMutator,
"LinkRepositoryToObjectPool": protoregistry.OpMutator,
"UnlinkRepositoryFromObjectPool": protoregistry.OpMutator,
"ReduplicateRepository": protoregistry.OpMutator,
"DisconnectGitAlternates": protoregistry.OpMutator,
},
"OperationService": map[string]protoregistry.OpType{
"UserCreateBranch": protoregistry.OpMutator,
"UserUpdateBranch": protoregistry.OpMutator,
"UserDeleteBranch": protoregistry.OpMutator,
"UserCreateTag": protoregistry.OpMutator,
"UserDeleteTag": protoregistry.OpMutator,
"UserMergeToRef": protoregistry.OpMutator,
"UserMergeBranch": protoregistry.OpMutator,
"UserFFBranch": protoregistry.OpMutator,
"UserCherryPick": protoregistry.OpMutator,
"UserCommitFiles": protoregistry.OpMutator,
"UserRevert": protoregistry.OpMutator,
"UserSquash": protoregistry.OpMutator,
"UserApplyPatch": protoregistry.OpMutator,
"UserUpdateSubmodule": protoregistry.OpMutator,
},
"RefService": map[string]protoregistry.OpType{
"FindDefaultBranchName": protoregistry.OpAccessor,
"FindAllBranchNames": protoregistry.OpAccessor,
"FindAllTagNames": protoregistry.OpAccessor,
"FindLocalBranches": protoregistry.OpAccessor,
"FindAllBranches": protoregistry.OpAccessor,
"FindAllTags": protoregistry.OpAccessor,
"FindAllRemoteBranches": protoregistry.OpAccessor,
"RefExists": protoregistry.OpAccessor,
"FindBranch": protoregistry.OpAccessor,
"DeleteRefs": protoregistry.OpMutator,
"ListBranchNamesContainingCommit": protoregistry.OpAccessor,
"ListTagNamesContainingCommit": protoregistry.OpAccessor,
"GetTagMessages": protoregistry.OpAccessor,
"ListNewCommits": protoregistry.OpAccessor,
"ListNewBlobs": protoregistry.OpAccessor,
"PackRefs": protoregistry.OpMutator,
},
"RemoteService": map[string]protoregistry.OpType{
"AddRemote": protoregistry.OpMutator,
"FetchInternalRemote": protoregistry.OpMutator,
"RemoveRemote": protoregistry.OpMutator,
"UpdateRemoteMirror": protoregistry.OpAccessor,
"FindRemoteRepository": protoregistry.OpAccessor,
"FindRemoteRootRef": protoregistry.OpAccessor,
},
"RepositoryService": map[string]protoregistry.OpType{
"RepositoryExists": protoregistry.OpAccessor,
"RepackIncremental": protoregistry.OpMutator,
"RepackFull": protoregistry.OpMutator,
"GarbageCollect": protoregistry.OpMutator,
"RepositorySize": protoregistry.OpAccessor,
"ApplyGitattributes": protoregistry.OpMutator,
"FetchRemote": protoregistry.OpMutator,
"CreateRepository": protoregistry.OpMutator,
"GetArchive": protoregistry.OpAccessor,
"HasLocalBranches": protoregistry.OpAccessor,
"FetchSourceBranch": protoregistry.OpMutator,
"Fsck": protoregistry.OpAccessor,
"WriteRef": protoregistry.OpMutator,
"FindMergeBase": protoregistry.OpAccessor,
"CreateFork": protoregistry.OpMutator,
"IsSquashInProgress": protoregistry.OpAccessor,
"CreateRepositoryFromURL": protoregistry.OpMutator,
"CreateBundle": protoregistry.OpAccessor,
"CreateRepositoryFromBundle": protoregistry.OpMutator,
"SetConfig": protoregistry.OpMutator,
"DeleteConfig": protoregistry.OpMutator,
"FindLicense": protoregistry.OpAccessor,
"GetInfoAttributes": protoregistry.OpAccessor,
"CalculateChecksum": protoregistry.OpAccessor,
"Cleanup": protoregistry.OpMutator,
"GetSnapshot": protoregistry.OpAccessor,
"CreateRepositoryFromSnapshot": protoregistry.OpMutator,
"GetRawChanges": protoregistry.OpAccessor,
"SearchFilesByContent": protoregistry.OpAccessor,
"SearchFilesByName": protoregistry.OpAccessor,
"RestoreCustomHooks": protoregistry.OpMutator,
"BackupCustomHooks": protoregistry.OpAccessor,
},
"SmartHTTPService": map[string]protoregistry.OpType{
"InfoRefsUploadPack": protoregistry.OpAccessor,
"InfoRefsReceivePack": protoregistry.OpAccessor,
"PostUploadPack": protoregistry.OpAccessor,
"PostReceivePack": protoregistry.OpMutator,
},
"SSHService": map[string]protoregistry.OpType{
"SSHUploadPack": protoregistry.OpAccessor,
"SSHReceivePack": protoregistry.OpMutator,
"SSHUploadArchive": protoregistry.OpAccessor,
},
"WikiService": map[string]protoregistry.OpType{
"WikiWritePage": protoregistry.OpMutator,
"WikiUpdatePage": protoregistry.OpMutator,
"WikiFindPage": protoregistry.OpAccessor,
"WikiGetAllPages": protoregistry.OpAccessor,
"WikiListPages": protoregistry.OpAccessor,
},
}
for serviceName, methods := range expectedResults {
for methodName, opType := range methods {
method := fmt.Sprintf("/gitaly.%s/%s", serviceName, methodName)
methodInfo, err := protoregistry.GitalyProtoPreregistered.LookupMethod(method)
require.NoError(t, err)
require.Equalf(t, opType, methodInfo.Operation, "expect %s:%s to have the correct op type", serviceName, methodName)
require.Equal(t, method, methodInfo.FullMethodName())
require.False(t, protoregistry.GitalyProtoPreregistered.IsInterceptedMethod(method), method)
}
}
}
func TestNewProtoRegistry_IsInterceptedMethod(t *testing.T) {
for service, methods := range map[string][]string{
"ServerService": {
"ServerInfo",
"DiskStatistics",
},
"PraefectInfoService": {
"RepositoryReplicas",
"DatalossCheck",
"SetAuthoritativeStorage",
},
} {
t.Run(service, func(t *testing.T) {
for _, method := range methods {
t.Run(method, func(t *testing.T) {
fullMethodName := fmt.Sprintf("/gitaly.%s/%s", service, method)
require.True(t, protoregistry.GitalyProtoPreregistered.IsInterceptedMethod(fullMethodName))
methodInfo, err := protoregistry.GitalyProtoPreregistered.LookupMethod(fullMethodName)
require.Empty(t, methodInfo)
require.Error(t, err, "full method name not found:")
})
}
})
}
}
func TestRequestFactory(t *testing.T) {
mInfo, err := protoregistry.GitalyProtoPreregistered.LookupMethod("/gitaly.RepositoryService/RepositoryExists")
require.NoError(t, err)
pb, err := mInfo.UnmarshalRequestProto([]byte{})
require.NoError(t, err)
testassert.ProtoEqual(t, &gitalypb.RepositoryExistsRequest{}, pb)
}
func TestMethodInfoScope(t *testing.T) {
for _, tt := range []struct {
method string
scope protoregistry.Scope
}{
{
method: "/gitaly.RepositoryService/RepositoryExists",
scope: protoregistry.ScopeRepository,
},
} {
t.Run(tt.method, func(t *testing.T) {
mInfo, err := protoregistry.GitalyProtoPreregistered.LookupMethod(tt.method)
require.NoError(t, err)
require.Exactly(t, tt.scope, mInfo.Scope)
})
}
}
|