fork of https://github.com/sourcegraph/zoekt
1package zoekt
2
3import (
4 "bytes"
5 "encoding/gob"
6 "testing"
7 "time"
8
9 "github.com/google/go-cmp/cmp"
10)
11
12func BenchmarkRepoList_Encode(b *testing.B) {
13 set := genRepoList(1000)
14
15 // do one write to amortize away the cost of gob registration
16 w := &countWriter{}
17 enc := gob.NewEncoder(w)
18 if err := enc.Encode(set); err != nil {
19 b.Fatal(err)
20 }
21
22 b.ResetTimer()
23 b.ReportAllocs()
24
25 b.ReportMetric(float64(w.n), "bytes")
26
27 for n := 0; n < b.N; n++ {
28 if err := enc.Encode(set); err != nil {
29 b.Fatal(err)
30 }
31 }
32}
33
34func BenchmarkRepoList_Decode(b *testing.B) {
35 set := genRepoList(1000)
36
37 var buf bytes.Buffer
38 if err := gob.NewEncoder(&buf).Encode(set); err != nil {
39 b.Fatal(err)
40 }
41
42 b.ResetTimer()
43 b.ReportAllocs()
44
45 for n := 0; n < b.N; n++ {
46 // We need to include gob.NewDecoder cost to avoid measuring encoding.
47 var repoBranches RepoList
48 if err := gob.NewDecoder(bytes.NewReader(buf.Bytes())).Decode(&repoBranches); err != nil {
49 b.Fatal(err)
50 }
51 }
52}
53
54func TestRepoList_Marshal(t *testing.T) {
55 for i := range []int{0, 1, 10, 100} {
56 want := genRepoList(i)
57
58 var buf bytes.Buffer
59 if err := gob.NewEncoder(&buf).Encode(want); err != nil {
60 t.Fatal(err)
61 }
62
63 var got RepoList
64 if err := gob.NewDecoder(bytes.NewReader(buf.Bytes())).Decode(&got); err != nil {
65 t.Fatal(err)
66 }
67
68 if diff := cmp.Diff(want, &got); diff != "" {
69 t.Fatalf("mismatch for reposmap size %d (-want +got):\n%s", i, diff)
70 }
71 }
72}
73
74func genRepoList(size int) *RepoList {
75 m := make(ReposMap, size)
76 indexTime := time.Now().Unix()
77 for i := range size {
78 m[uint32(i)] = MinimalRepoListEntry{
79 HasSymbols: true,
80 IndexTimeUnix: indexTime,
81 Branches: []RepositoryBranch{{
82 Name: "HEAD",
83 Version: "c301e5c82b6e1632dce5c39902691c359559852e",
84 }},
85 }
86 }
87 return &RepoList{ReposMap: m}
88}
89
90type countWriter struct {
91 n int
92}
93
94func (w *countWriter) Write(b []byte) (int, error) {
95 w.n += len(b)
96 return len(b), nil
97}