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