fork of https://github.com/sourcegraph/zoekt
0

Configure Feed

Select the types of activity you want to include in your feed.

Add tests for file-based streaming strategy (#537)

Ensures the new "flush collect sender" is exercised in tests.

+70 -54
+70 -54
shards/shards_test.go
··· 929 929 func TestFileBasedSearch(t *testing.T) { 930 930 cases := []struct { 931 931 name string 932 - testShardedSearch func(t *testing.T, q query.Q, ib *zoekt.IndexBuilder) []zoekt.FileMatch 932 + testShardedSearch func(t *testing.T, q query.Q, ib *zoekt.IndexBuilder, useDocumentRanks bool) []zoekt.FileMatch 933 933 }{ 934 934 {"Search", testShardedSearch}, 935 935 {"StreamSearch", testShardedStreamSearch}, ··· 945 945 ) 946 946 947 947 for _, tt := range cases { 948 - t.Run(tt.name, func(t *testing.T) { 949 - matches := tt.testShardedSearch(t, &query.Substring{ 950 - CaseSensitive: false, 951 - Pattern: "ananas", 952 - }, b) 948 + for _, useDocumentRanks := range []bool{false, true} { 949 + t.Run(tt.name, func(t *testing.T) { 950 + matches := tt.testShardedSearch(t, &query.Substring{ 951 + CaseSensitive: false, 952 + Pattern: "ananas", 953 + }, b, useDocumentRanks) 953 954 954 - if len(matches) != 2 { 955 - t.Fatalf("got %v, want 2 matches", matches) 956 - } 957 - if matches[0].FileName != "f2" || matches[1].FileName != "f1" { 958 - t.Fatalf("got %v, want matches {f1,f2}", matches) 959 - } 960 - if matches[0].LineMatches[0].LineFragments[0].Offset != 10 || matches[1].LineMatches[0].LineFragments[0].Offset != 8 { 961 - t.Fatalf("got %#v, want offsets 10,8", matches) 962 - } 963 - }) 955 + if len(matches) != 2 { 956 + t.Fatalf("got %v, want 2 matches", matches) 957 + } 958 + if matches[0].FileName != "f2" || matches[1].FileName != "f1" { 959 + t.Fatalf("got %v, want matches {f1,f2}", matches) 960 + } 961 + if matches[0].LineMatches[0].LineFragments[0].Offset != 10 || matches[1].LineMatches[0].LineFragments[0].Offset != 8 { 962 + t.Fatalf("got %#v, want offsets 10,8", matches) 963 + } 964 + }) 965 + } 964 966 } 965 967 } 966 968 967 969 func TestWordBoundaryRanking(t *testing.T) { 968 970 cases := []struct { 969 971 name string 970 - testShardedSearch func(t *testing.T, q query.Q, ib *zoekt.IndexBuilder) []zoekt.FileMatch 972 + testShardedSearch func(t *testing.T, q query.Q, ib *zoekt.IndexBuilder, useDocumentRanks bool) []zoekt.FileMatch 971 973 }{ 972 974 {"Search", testShardedSearch}, 973 975 {"StreamSearch", testShardedStreamSearch}, ··· 980 982 zoekt.Document{Name: "f3", Content: []byte("xbytex ybytex")}) 981 983 982 984 for _, tt := range cases { 983 - t.Run(tt.name, func(t *testing.T) { 984 - files := tt.testShardedSearch(t, &query.Substring{Pattern: "byte"}, b) 985 + for _, useDocumentRanks := range []bool{false, true} { 986 + t.Run(tt.name, func(t *testing.T) { 987 + files := tt.testShardedSearch(t, &query.Substring{Pattern: "byte"}, b, useDocumentRanks) 985 988 986 - if len(files) != 3 { 987 - t.Fatalf("got %#v, want 3 files", files) 988 - } 989 + if len(files) != 3 { 990 + t.Fatalf("got %#v, want 3 files", files) 991 + } 989 992 990 - file0 := files[0] 991 - if file0.FileName != "f2" || len(file0.LineMatches) != 3 { 992 - t.Fatalf("got file %s, num matches %d (%#v), want 3 matches in file f2", file0.FileName, len(file0.LineMatches), file0) 993 - } 993 + file0 := files[0] 994 + if file0.FileName != "f2" || len(file0.LineMatches) != 3 { 995 + t.Fatalf("got file %s, num matches %d (%#v), want 3 matches in file f2", file0.FileName, len(file0.LineMatches), file0) 996 + } 994 997 995 - if file0.LineMatches[0].LineFragments[0].Offset != 13 { 996 - t.Fatalf("got first match %#v, want full word match", files[0].LineMatches[0]) 997 - } 998 - if file0.LineMatches[1].LineFragments[0].Offset != 7 { 999 - t.Fatalf("got second match %#v, want partial word match", files[0].LineMatches[1]) 1000 - } 1001 - }) 998 + if file0.LineMatches[0].LineFragments[0].Offset != 13 { 999 + t.Fatalf("got first match %#v, want full word match", files[0].LineMatches[0]) 1000 + } 1001 + if file0.LineMatches[1].LineFragments[0].Offset != 7 { 1002 + t.Fatalf("got second match %#v, want partial word match", files[0].LineMatches[1]) 1003 + } 1004 + }) 1005 + } 1002 1006 } 1003 1007 } 1004 1008 1005 1009 func TestAtomCountScore(t *testing.T) { 1006 1010 cases := []struct { 1007 1011 name string 1008 - testShardedSearch func(t *testing.T, q query.Q, ib *zoekt.IndexBuilder) []zoekt.FileMatch 1012 + testShardedSearch func(t *testing.T, q query.Q, ib *zoekt.IndexBuilder, useDocumentRanks bool) []zoekt.FileMatch 1009 1013 }{ 1010 1014 {"Search", testShardedSearch}, 1011 1015 {"StreamSearch", testShardedStreamSearch}, ··· 1023 1027 zoekt.Document{Name: "needle-file", Content: []byte("needle content"), Branches: []string{"branches"}}) 1024 1028 1025 1029 for _, tt := range cases { 1026 - t.Run(tt.name, func(t *testing.T) { 1027 - files := tt.testShardedSearch(t, 1028 - query.NewOr( 1029 - &query.Substring{Pattern: "needle"}, 1030 - &query.Substring{Pattern: "needle", FileName: true}, 1031 - &query.Branch{Pattern: "needle"}, 1032 - ), b) 1033 - var got []string 1034 - for _, f := range files { 1035 - got = append(got, f.FileName) 1036 - } 1037 - want := []string{"needle-file-branch", "needle-file", "f1"} 1038 - if !reflect.DeepEqual(got, want) { 1039 - t.Errorf("got %v, want %v", got, want) 1040 - } 1041 - }) 1030 + for _, useDocumentRanks := range []bool{false, true} { 1031 + t.Run(tt.name, func(t *testing.T) { 1032 + files := tt.testShardedSearch(t, 1033 + query.NewOr( 1034 + &query.Substring{Pattern: "needle"}, 1035 + &query.Substring{Pattern: "needle", FileName: true}, 1036 + &query.Branch{Pattern: "needle"}, 1037 + ), b, useDocumentRanks) 1038 + var got []string 1039 + for _, f := range files { 1040 + got = append(got, f.FileName) 1041 + } 1042 + want := []string{"needle-file-branch", "needle-file", "f1"} 1043 + if !reflect.DeepEqual(got, want) { 1044 + t.Errorf("got %v, want %v", got, want) 1045 + } 1046 + }) 1047 + } 1042 1048 } 1043 1049 } 1044 1050 1045 - func testShardedStreamSearch(t *testing.T, q query.Q, ib *zoekt.IndexBuilder) []zoekt.FileMatch { 1051 + func testShardedStreamSearch(t *testing.T, q query.Q, ib *zoekt.IndexBuilder, useDocumentRanks bool) []zoekt.FileMatch { 1046 1052 ss := newShardedSearcher(1) 1047 1053 searcher := searcherForTest(t, ib) 1048 1054 ss.replace(map[string]zoekt.Searcher{"r1": searcher}) ··· 1052 1058 files = append(files, result.Files...) 1053 1059 }) 1054 1060 1055 - if err := ss.StreamSearch(context.Background(), q, &zoekt.SearchOptions{}, sender); err != nil { 1061 + opts := zoekt.SearchOptions{} 1062 + if useDocumentRanks { 1063 + opts.UseDocumentRanks = true 1064 + opts.FlushWallTime = 10 * time.Millisecond 1065 + } 1066 + if err := ss.StreamSearch(context.Background(), q, &opts, sender); err != nil { 1056 1067 t.Fatal(err) 1057 1068 } 1058 1069 return files 1059 1070 } 1060 1071 1061 - func testShardedSearch(t *testing.T, q query.Q, ib *zoekt.IndexBuilder) []zoekt.FileMatch { 1072 + func testShardedSearch(t *testing.T, q query.Q, ib *zoekt.IndexBuilder, useDocumentRanks bool) []zoekt.FileMatch { 1062 1073 ss := newShardedSearcher(1) 1063 1074 searcher := searcherForTest(t, ib) 1064 1075 ss.replace(map[string]zoekt.Searcher{"r1": searcher}) 1065 1076 1066 - sres, _ := ss.Search(context.Background(), q, &zoekt.SearchOptions{}) 1077 + opts := zoekt.SearchOptions{} 1078 + if useDocumentRanks { 1079 + opts.UseDocumentRanks = true 1080 + opts.FlushWallTime = 50 * time.Millisecond 1081 + } 1082 + sres, _ := ss.Search(context.Background(), q, &opts) 1067 1083 return sres.Files 1068 1084 } 1069 1085