fork of https://github.com/sourcegraph/zoekt
1package grpc
2
3import (
4 "context"
5 "net/http/httptest"
6 "net/url"
7 "testing"
8
9 "golang.org/x/net/http2"
10 "golang.org/x/net/http2/h2c"
11 "google.golang.org/grpc"
12 "google.golang.org/grpc/credentials/insecure"
13 "google.golang.org/protobuf/proto"
14
15 "github.com/sourcegraph/zoekt"
16 v1 "github.com/sourcegraph/zoekt/grpc/v1"
17 "github.com/sourcegraph/zoekt/internal/mockSearcher"
18 "github.com/sourcegraph/zoekt/query"
19)
20
21func TestClientServer(t *testing.T) {
22 mock := &mockSearcher.MockSearcher{
23 WantSearch: query.NewAnd(mustParse("hello world|universe"), query.NewSingleBranchesRepos("HEAD", 1, 2)),
24 SearchResult: &zoekt.SearchResult{
25 Files: []zoekt.FileMatch{
26 {FileName: "bin.go"},
27 },
28 },
29
30 WantList: &query.Const{Value: true},
31 RepoList: &zoekt.RepoList{
32 Repos: []*zoekt.RepoListEntry{
33 {
34 Repository: zoekt.Repository{
35 ID: 2,
36 Name: "foo/bar",
37 },
38 },
39 },
40 },
41 }
42
43 gs := grpc.NewServer()
44 v1.RegisterWebserverServiceServer(gs, NewServer(adapter{mock}))
45 ts := httptest.NewServer(h2c.NewHandler(gs, &http2.Server{}))
46
47 u, err := url.Parse(ts.URL)
48 if err != nil {
49 t.Fatal(err)
50 }
51 cc, err := grpc.Dial(u.Host, grpc.WithTransportCredentials(insecure.NewCredentials()))
52 if err != nil {
53 t.Fatal(err)
54 }
55 client := v1.NewWebserverServiceClient(cc)
56
57 r, err := client.Search(context.Background(), &v1.SearchRequest{Query: query.QToProto(mock.WantSearch)})
58 if err != nil {
59 t.Fatal(err)
60 }
61 if !proto.Equal(r, mock.SearchResult.ToProto()) {
62 t.Fatalf("got %+v, want %+v", r, mock.SearchResult.ToProto())
63 }
64
65 l, err := client.List(context.Background(), &v1.ListRequest{Query: query.QToProto(mock.WantList)})
66 if err != nil {
67 t.Fatal(err)
68 }
69
70 if !proto.Equal(l, mock.RepoList.ToProto()) {
71 t.Fatalf("got %+v, want %+v", l, mock.RepoList.ToProto())
72 }
73}
74
75func mustParse(s string) query.Q {
76 q, err := query.Parse(s)
77 if err != nil {
78 panic(err)
79 }
80 return q
81}
82
83type adapter struct {
84 zoekt.Searcher
85}
86
87func (a adapter) StreamSearch(ctx context.Context, q query.Q, opts *zoekt.SearchOptions, sender zoekt.Sender) (err error) {
88 sr, err := a.Searcher.Search(ctx, q, opts)
89 if err != nil {
90 return err
91 }
92 sender.Send(sr)
93 return nil
94}