@@ -3,6 +3,7 @@ package api
3
3
import (
4
4
"context"
5
5
"net/http/httptest"
6
+ "sort"
6
7
"testing"
7
8
"time"
8
9
@@ -17,6 +18,7 @@ import (
17
18
"github.com/sourcegraph/sourcegraph/cmd/symbols/internal/fetcher"
18
19
"github.com/sourcegraph/sourcegraph/cmd/symbols/internal/gitserver"
19
20
"github.com/sourcegraph/sourcegraph/cmd/symbols/internal/parser"
21
+ "github.com/sourcegraph/sourcegraph/internal/conf"
20
22
"github.com/sourcegraph/sourcegraph/internal/ctags_config"
21
23
"github.com/sourcegraph/sourcegraph/internal/database/dbmocks"
22
24
"github.com/sourcegraph/sourcegraph/internal/diskcache"
@@ -38,42 +40,68 @@ func TestHandler(t *testing.T) {
38
40
tmpDir := t .TempDir ()
39
41
40
42
cache := diskcache .NewStore (tmpDir , "symbols" , diskcache .WithBackgroundTimeout (20 * time .Minute ))
41
-
43
+ // This ensures the ctags config is initialized properly
44
+ conf .MockAndNotifyWatchers (& conf.Unified {})
42
45
parserFactory := func (source ctags_config.ParserType ) (ctags.Parser , error ) {
43
- pathToEntries := map [string ][]* ctags.Entry {
44
- "a.js" : {
45
- {
46
- Name : "x" ,
47
- Path : "a.js" ,
48
- Language : "JavaScript" ,
49
- Line : 1 , // ctags line numbers are 1-based
46
+ var pathToEntries map [string ][]* ctags.Entry
47
+ if source == ctags_config .UniversalCtags {
48
+ pathToEntries = map [string ][]* ctags.Entry {
49
+ "a.pl" : {
50
+ {
51
+ Name : "x" ,
52
+ Path : "a.pl" ,
53
+ Language : "Perl" ,
54
+ Line : 1 , // ctags line numbers are 1-based
55
+ },
56
+ {
57
+ Name : "y" ,
58
+ Path : "a.pl" ,
59
+ Language : "Perl" ,
60
+ Line : 2 ,
61
+ },
50
62
},
51
- {
52
- Name : "y" ,
53
- Path : "a.js" ,
54
- Language : "JavaScript" ,
55
- Line : 2 ,
63
+ ".zshrc" : {
64
+ {
65
+ Name : "z" ,
66
+ Path : ".zshrc" ,
67
+ Language : "Zsh" ,
68
+ Line : 1 ,
69
+ },
56
70
},
57
- },
58
- ".zshrc" : {
59
- {
60
- Name : "z" ,
61
- Path : ".zshrc" ,
62
- Language : "Zsh" ,
63
- Line : 1 ,
71
+ }
72
+ } else if source == ctags_config .ScipCtags {
73
+ pathToEntries = map [string ][]* ctags.Entry {
74
+ "b.magik" : {
75
+ {
76
+ Name : "v" ,
77
+ Path : "b.magik" ,
78
+ Language : "Magik" ,
79
+ Line : 1 , // ctags line numbers are 1-based
80
+ },
81
+ {
82
+ Name : "w" ,
83
+ Path : "b.magik" ,
84
+ Language : "Magik" ,
85
+ Line : 2 ,
86
+ },
64
87
},
65
- },
88
+ }
89
+ } else {
90
+ t .Errorf ("Invalid ctags type %d" , source )
66
91
}
92
+
67
93
return newMockParser (pathToEntries ), nil
68
94
}
69
- parserPool , err := parser .NewParserPool (parserFactory , 15 , parser .DefaultParserTypes )
95
+
96
+ parserPool , err := parser .NewParserPool (observation .TestContextTB (t ), "test" , parserFactory , 15 , parser .DefaultParserTypes )
70
97
if err != nil {
71
98
t .Fatal (err )
72
99
}
73
100
74
101
files := map [string ]string {
75
- "a.js" : "var x = 1\n var y = 2" ,
76
- ".zshrc" : "z=42" ,
102
+ "a.pl" : "$x = 1\n $y = 2" ,
103
+ ".zshrc" : "z=42" ,
104
+ "b.magik" : "v << 1\n w<<2" ,
77
105
}
78
106
gitserverClient := NewMockGitserverClient ()
79
107
gitserverClient .FetchTarFunc .SetDefaultHook (gitserver .CreateTestFetchTarFunc (files ))
@@ -94,16 +122,18 @@ func TestHandler(t *testing.T) {
94
122
GRPCConnectionCache : connectionCache ,
95
123
}
96
124
97
- x := result.Symbol {Name : "x" , Path : "a.js " , Language : "JavaScript " , Line : 0 , Character : 4 }
98
- y := result.Symbol {Name : "y" , Path : "a.js " , Language : "JavaScript " , Line : 1 , Character : 4 }
125
+ x := result.Symbol {Name : "x" , Path : "a.pl " , Language : "Perl " , Line : 0 , Character : 1 }
126
+ y := result.Symbol {Name : "y" , Path : "a.pl " , Language : "Perl " , Line : 1 , Character : 1 }
99
127
z := result.Symbol {Name : "z" , Path : ".zshrc" , Language : "Zsh" , Line : 0 , Character : 0 }
128
+ v := result.Symbol {Name : "v" , Path : "b.magik" , Language : "Magik" , Line : 0 , Character : 0 }
129
+ w := result.Symbol {Name : "w" , Path : "b.magik" , Language : "Magik" , Line : 1 , Character : 0 }
100
130
101
131
testCases := map [string ]struct {
102
132
args search.SymbolsParameters
103
133
expected result.Symbols
104
134
}{
105
135
"simple" : {
106
- args : search.SymbolsParameters {IncludePatterns : []string {"^a.js $" }, First : 10 },
136
+ args : search.SymbolsParameters {IncludePatterns : []string {"^a.pl $" }, First : 10 },
107
137
expected : []result.Symbol {x , y },
108
138
},
109
139
"onematch" : {
@@ -127,38 +157,48 @@ func TestHandler(t *testing.T) {
127
157
expected : nil ,
128
158
},
129
159
"caseinsensitiveexactpathmatch" : {
130
- args : search.SymbolsParameters {IncludePatterns : []string {"^A.js $" }, First : 10 },
160
+ args : search.SymbolsParameters {IncludePatterns : []string {"^A.pl $" }, First : 10 },
131
161
expected : []result.Symbol {x , y },
132
162
},
133
163
"casesensitiveexactpathmatch" : {
134
- args : search.SymbolsParameters {IncludePatterns : []string {"^a.js $" }, IsCaseSensitive : true , First : 10 },
164
+ args : search.SymbolsParameters {IncludePatterns : []string {"^a.pl $" }, IsCaseSensitive : true , First : 10 },
135
165
expected : []result.Symbol {x , y },
136
166
},
137
167
"casesensitivenoexactpathmatch" : {
138
- args : search.SymbolsParameters {IncludePatterns : []string {"^A.js $" }, IsCaseSensitive : true , First : 10 },
168
+ args : search.SymbolsParameters {IncludePatterns : []string {"^A.pl $" }, IsCaseSensitive : true , First : 10 },
139
169
expected : nil ,
140
170
},
141
171
"exclude" : {
142
- args : search.SymbolsParameters {ExcludePattern : "a.js " , IsCaseSensitive : true , First : 10 },
143
- expected : []result.Symbol {z },
172
+ args : search.SymbolsParameters {ExcludePattern : "a.pl " , IsCaseSensitive : true , First : 10 },
173
+ expected : []result.Symbol {z , v , w },
144
174
},
145
175
"include lang filters" : {
146
- args : search.SymbolsParameters {Query : ".*" , IncludeLangs : []string {"Javascript " }, IsCaseSensitive : true , First : 10 },
176
+ args : search.SymbolsParameters {Query : ".*" , IncludeLangs : []string {"Perl " }, IsCaseSensitive : true , First : 10 },
147
177
expected : []result.Symbol {x , y },
148
178
},
149
179
"include lang filters with ctags conversion" : {
150
180
args : search.SymbolsParameters {Query : ".*" , IncludeLangs : []string {"Shell" }, IsCaseSensitive : true , First : 10 },
151
181
expected : []result.Symbol {z },
152
182
},
153
183
"exclude lang filters" : {
154
- args : search.SymbolsParameters {Query : ".*" , ExcludeLangs : []string {"Javascript " }, IsCaseSensitive : true , First : 10 },
184
+ args : search.SymbolsParameters {Query : ".*" , ExcludeLangs : []string {"Perl" , "Magik " }, IsCaseSensitive : true , First : 10 },
155
185
expected : []result.Symbol {z },
156
186
},
187
+ "scip-ctags only language" : {
188
+ args : search.SymbolsParameters {Query : ".*" , IncludeLangs : []string {"Magik" }, IsCaseSensitive : true , First : 10 },
189
+ expected : []result.Symbol {v , w },
190
+ },
157
191
}
158
192
159
193
for label , testCase := range testCases {
160
194
t .Run (label , func (t * testing.T ) {
161
195
resultSymbols , limitHit , err := client .Search (context .Background (), testCase .args )
196
+
197
+ // Sort to ensure consistent comparisons
198
+ sort .Slice (resultSymbols , func (i , j int ) bool {
199
+ return resultSymbols [i ].Path < resultSymbols [j ].Path
200
+ })
201
+
162
202
if err != nil {
163
203
t .Fatalf ("unexpected error performing search: %s" , err )
164
204
}
0 commit comments