| OLD | NEW |
| (Empty) | |
| 1 package traceservice |
| 2 |
| 3 import ( |
| 4 "encoding/binary" |
| 5 "fmt" |
| 6 "math" |
| 7 "os" |
| 8 "testing" |
| 9 "time" |
| 10 |
| 11 "github.com/stretchr/testify/assert" |
| 12 "go.skia.org/infra/go/util" |
| 13 "go.skia.org/infra/perf/go/types" |
| 14 "golang.org/x/net/context" |
| 15 ) |
| 16 |
| 17 const ( |
| 18 FILENAME = "/tmp/tracestore_test.db" |
| 19 ) |
| 20 |
| 21 func cleanup() { |
| 22 if err := os.Remove(FILENAME); err != nil { |
| 23 fmt.Printf("Failed to clean up %s: %s", FILENAME, err) |
| 24 } |
| 25 } |
| 26 func TestCommitID(t *testing.T) { |
| 27 // Test that CommitIDs round trip through byte slices. |
| 28 now := time.Unix(time.Now().Unix(), 0) |
| 29 c := &CommitID{ |
| 30 Timestamp: now.Unix(), |
| 31 Id: "abc1234", |
| 32 Source: "master", |
| 33 } |
| 34 cp, err := CommitIDFromBytes(CommitIDToBytes(c)) |
| 35 assert.NoError(t, err) |
| 36 assert.Equal(t, c, cp) |
| 37 |
| 38 // Handle error conditions such as empty byte slices. |
| 39 _, err = CommitIDFromBytes([]byte{}) |
| 40 assert.Error(t, err) |
| 41 |
| 42 b := CommitIDToBytes(c) |
| 43 short1 := b[:8] |
| 44 _, err = CommitIDFromBytes(short1) |
| 45 assert.Error(t, err, "Input []byte has malformed time.") |
| 46 |
| 47 _, err = CommitIDFromBytes([]byte("fred!barney")) |
| 48 assert.Error(t, err, "Input []byte value too few seperators.") |
| 49 } |
| 50 |
| 51 func TestImpl(t *testing.T) { |
| 52 ts, err := NewTraceServiceServer(FILENAME) |
| 53 assert.NoError(t, err) |
| 54 defer util.Close(ts) |
| 55 defer cleanup() |
| 56 |
| 57 now := time.Now() |
| 58 |
| 59 first := now.Unix() |
| 60 second := now.Add(time.Minute).Unix() |
| 61 |
| 62 commitIDs := []*CommitID{ |
| 63 &CommitID{ |
| 64 Timestamp: first, |
| 65 Id: "abc123", |
| 66 Source: "master", |
| 67 }, |
| 68 &CommitID{ |
| 69 Timestamp: second, |
| 70 Id: "xyz789", |
| 71 Source: "master", |
| 72 }, |
| 73 } |
| 74 |
| 75 params := &AddParamsRequest{ |
| 76 Params: map[string]*Params{ |
| 77 "key:8888:android": &Params{ |
| 78 Params: map[string]string{ |
| 79 "config": "8888", |
| 80 "platform": "android", |
| 81 "type": "skp", |
| 82 }, |
| 83 }, |
| 84 "key:gpu:win8": &Params{ |
| 85 Params: map[string]string{ |
| 86 "config": "gpu", |
| 87 "platform": "win8", |
| 88 "type": "skp", |
| 89 }, |
| 90 }, |
| 91 }, |
| 92 } |
| 93 |
| 94 ctx := context.Background() |
| 95 |
| 96 // Confirm that these traceids don't have Params stored in the db yet. |
| 97 missingRequest := &MissingParamsRequest{ |
| 98 Traceids: []string{"key:8888:android", "key:gpu:win8"}, |
| 99 } |
| 100 missingResp, err := ts.MissingParams(ctx, missingRequest) |
| 101 assert.NoError(t, err) |
| 102 assert.Equal(t, missingResp.Traceids, missingRequest.Traceids) |
| 103 |
| 104 // Now add the Params for them. |
| 105 _, err = ts.AddParams(ctx, params) |
| 106 assert.NoError(t, err) |
| 107 |
| 108 // Confirm the missing list is now empty. |
| 109 nowMissing, err := ts.MissingParams(ctx, missingRequest) |
| 110 assert.Equal(t, []string{}, nowMissing.Traceids) |
| 111 |
| 112 addReq := &AddRequest{ |
| 113 Commitid: commitIDs[0], |
| 114 Entries: map[string][]byte{ |
| 115 "key:gpu:win8": types.BytesFromFloat64(1.234), |
| 116 "key:8888:android": types.BytesFromFloat64(0.01), |
| 117 }, |
| 118 } |
| 119 |
| 120 // Add a commit. |
| 121 _, err = ts.Add(ctx, addReq) |
| 122 assert.NoError(t, err) |
| 123 |
| 124 // List, GetValues, and GetParams for the added commit. |
| 125 listReq := &ListRequest{ |
| 126 Begin: first, |
| 127 End: second, |
| 128 } |
| 129 listResp, err := ts.List(ctx, listReq) |
| 130 assert.NoError(t, err) |
| 131 assert.Equal(t, 1, len(listResp.Commitids)) |
| 132 assert.Equal(t, "abc123", listResp.Commitids[0].Id) |
| 133 |
| 134 valuesReq := &GetValuesRequest{ |
| 135 Commitid: commitIDs[0], |
| 136 } |
| 137 valuesResp, err := ts.GetValues(ctx, valuesReq) |
| 138 assert.NoError(t, err) |
| 139 assert.Equal(t, 2, len(valuesResp.Values)) |
| 140 assert.Equal(t, 0.01, math.Float64frombits(binary.LittleEndian.Uint64(va
luesResp.Values["key:8888:android"]))) |
| 141 assert.Equal(t, 1.234, math.Float64frombits(binary.LittleEndian.Uint64(v
aluesResp.Values["key:gpu:win8"]))) |
| 142 |
| 143 paramsReq := &GetParamsRequest{ |
| 144 Traceids: []string{"key:8888:android", "key:gpu:win8"}, |
| 145 } |
| 146 paramsResp, err := ts.GetParams(ctx, paramsReq) |
| 147 assert.NoError(t, err) |
| 148 assert.Equal(t, "8888", paramsResp.Params["key:8888:android"].Params["co
nfig"]) |
| 149 assert.Equal(t, "win8", paramsResp.Params["key:gpu:win8"].Params["platfo
rm"]) |
| 150 |
| 151 // Remove the commit. |
| 152 removeRequest := &RemoveRequest{ |
| 153 Commitid: commitIDs[0], |
| 154 } |
| 155 _, err = ts.Remove(ctx, removeRequest) |
| 156 assert.NoError(t, err) |
| 157 |
| 158 listResp, err = ts.List(ctx, listReq) |
| 159 assert.NoError(t, err) |
| 160 assert.Equal(t, 0, len(listResp.Commitids)) |
| 161 } |
| 162 |
| 163 func TestAtomize(t *testing.T) { |
| 164 ts, err := NewTraceServiceServer(FILENAME) |
| 165 assert.NoError(t, err) |
| 166 defer util.Close(ts) |
| 167 defer cleanup() |
| 168 |
| 169 ids, err := ts.atomize([]string{"foo"}) |
| 170 assert.NoError(t, err) |
| 171 assert.Equal(t, uint64(1), ids["foo"]) |
| 172 |
| 173 ids, err = ts.atomize([]string{"foo"}) |
| 174 assert.NoError(t, err) |
| 175 assert.Equal(t, uint64(1), ids["foo"]) |
| 176 |
| 177 ids, err = ts.atomize([]string{"bar"}) |
| 178 assert.NoError(t, err) |
| 179 assert.Equal(t, uint64(2), ids["bar"]) |
| 180 |
| 181 ids, err = ts.atomize([]string{"foo"}) |
| 182 assert.NoError(t, err) |
| 183 assert.Equal(t, uint64(1), ids["foo"]) |
| 184 |
| 185 } |
| 186 |
| 187 func TestCommitInfo(t *testing.T) { |
| 188 // Test roundtripping through []byte. |
| 189 c := &commitinfo{ |
| 190 Values: map[uint64][]byte{ |
| 191 uint64(1): []byte("foo"), |
| 192 uint64(3): []byte(""), |
| 193 uint64(0xffffffff): []byte("last"), |
| 194 }, |
| 195 } |
| 196 cp, err := newCommitInfo(c.ToBytes()) |
| 197 if err != nil { |
| 198 t.Fatalf("Failed newCommitInfo: %s", err) |
| 199 } |
| 200 assert.Equal(t, 3, len(cp.Values)) |
| 201 assert.Equal(t, "foo", string(cp.Values[uint64(1)])) |
| 202 assert.Equal(t, c, cp) |
| 203 |
| 204 // Test error handling. |
| 205 cnil, err := newCommitInfo(nil) |
| 206 if err != nil { |
| 207 t.Fatalf("Failed newCommitInfo: %s", err) |
| 208 } |
| 209 assert.Equal(t, 0, len(cnil.Values)) |
| 210 |
| 211 b := c.ToBytes() |
| 212 |
| 213 // Test inputs that should fail. |
| 214 _, err = newCommitInfo(b[1:]) |
| 215 assert.Error(t, err) |
| 216 |
| 217 _, err = newCommitInfo(b[:len(b)-1]) |
| 218 assert.Error(t, err) |
| 219 } |
| OLD | NEW |