func TestDeleteSketch(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() m := NewManager() info := datamodel.NewEmptyInfo() typ := pb.SketchType_CARD info.Properties.MaxUniqueItems = utils.Int64p(10000) info.Name = utils.Stringp(fmt.Sprintf("marvel")) info.Type = &typ if err := m.CreateSketch(info); err != nil { t.Error("Expected no errors, got", err) } if sketches := m.GetSketches(); len(sketches) != 1 { t.Error("Expected 1 sketches, got", len(sketches)) } else if sketches[0][0] != "marvel" || sketches[0][1] != "card" { t.Error("Expected [[marvel card]], got", sketches) } if err := m.DeleteSketch(info.ID()); err != nil { t.Error("Expected no errors, got", err) } if sketches := m.GetSketches(); len(sketches) != 0 { t.Error("Expected 0 sketches, got", len(sketches)) } }
func TestAdd(t *testing.T) { utils.SetupTests() defer utils.TearDownTests() info := datamodel.NewEmptyInfo() info.Properties.MaxUniqueItems = utils.Int64p(1000000) info.Name = utils.Stringp("marvel") sketch, err := NewCMLSketch(info) if err != nil { t.Error("expected avengers to have no error, got", err) } values := [][]byte{ []byte("sabertooth"), []byte("thunderbolt"), []byte("havoc"), []byte("cyclops"), []byte("cyclops"), []byte("cyclops"), []byte("havoc")} if _, err := sketch.Add(values); err != nil { t.Error("expected no errors, got", err) } if res, err := sketch.Get([][]byte{[]byte("cyclops")}); err != nil { t.Error("expected no errors, got", err) } else if res.(*pb.FrequencyResult).Frequencies[0].GetCount() != 3 { t.Error("expected 'cyclops' count == 3, got", res.(*pb.FrequencyResult).Frequencies[0].GetCount()) } }
func TestCreateDeleteDomain(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() m := NewManager() info := datamodel.NewEmptyInfo() info.Properties.MaxUniqueItems = utils.Int64p(10000) info.Properties.Size = utils.Int64p(10000) info.Name = utils.Stringp(fmt.Sprintf("marvel")) if err := m.CreateDomain(info); err != nil { t.Error("Expected no errors, got", err) } if sketches := m.GetSketches(); len(sketches) != 4 { t.Error("Expected 1 sketches, got", len(sketches)) } else if sketches[0][0] != "marvel" || sketches[0][1] != "card" { t.Error("Expected [[marvel card]], got", sketches) } // Create a second Sketch info2 := datamodel.NewEmptyInfo() info2.Properties.MaxUniqueItems = utils.Int64p(10000) info2.Name = utils.Stringp("dc") if err := m.CreateDomain(info2); err != nil { t.Error("Expected no errors, got", err) } if sketches := m.GetSketches(); len(sketches) != 8 { t.Error("Expected 8 sketches, got", len(sketches)) } else if sketches[0][0] != "dc" || sketches[0][1] != "card" { t.Error("Expected [[dc card]], got", sketches[0][0], sketches[0][1]) } else if sketches[1][0] != "dc" || sketches[1][1] != "freq" { t.Error("Expected [[dc freq]], got", sketches[1][0], sketches[1][1]) } }
func TestStressHLLPP(t *testing.T) { utils.SetupTests() defer utils.TearDownTests() values := make([][]byte, 10) for i := 0; i < 1024; i++ { avenger := "avenger" + strconv.Itoa(i) values = append(values, []byte(avenger)) } for i := 0; i < 1024; i++ { info := datamodel.NewEmptyInfo() info.Properties.MaxUniqueItems = utils.Int64p(1024) info.Name = utils.Stringp("marvel" + strconv.Itoa(i)) sketch, err := NewHLLPPSketch(info) if err != nil { t.Error("expected avengers to have no error, got", err) } if _, err := sketch.Add(values); err != nil { t.Error("expected no errors, got", err) } } }
func TestCreateAddDeleteAddSketch(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() client, conn := setupClient() defer tearDownClient(conn) typ := pb.SketchType_CARD name := "yoyo" in := &pb.Sketch{ Name: proto.String(name), Type: &typ, Properties: &pb.SketchProperties{ MaxUniqueItems: proto.Int64(1337), // FIXME: Allow default as -1 Size: proto.Int64(7), }, } addReq := &pb.AddRequest{ Sketch: in, Values: []string{"a", "b", "c", "d", "a", "b"}, } if _, err := client.CreateSketch(context.Background(), in); err != nil { t.Error("Did not expect error, got", err) } typ = pb.SketchType_RANK if _, err := client.CreateSketch(context.Background(), in); err != nil { t.Error("Did not expect error, got", err) } if _, err := client.Add(context.Background(), addReq); err != nil { t.Error("Did not expect error, got", err) } if res, err := client.ListAll(context.Background(), &pb.Empty{}); err != nil { t.Error("Did not expect error, got", err) } else if len(res.GetSketches()) != 2 { t.Error("Expected len(res) == 2, got ", len(res.GetSketches())) } if _, err := client.DeleteSketch(context.Background(), in); err != nil { t.Error("Did not expect error, got", err) } if _, err := client.Add(context.Background(), addReq); err == nil { t.Error("Expected error, got", err) } if res, err := client.ListAll(context.Background(), &pb.Empty{}); err != nil { t.Error("Did not expect error, got", err) } else if len(res.GetSketches()) != 1 { t.Error("Expected len(res) == 1, got ", len(res.GetSketches())) } }
func TestNoSketches(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() m := NewManager() if sketches := m.GetSketches(); len(sketches) != 0 { t.Error("Expected 0 sketches, got", len(sketches)) } }
func TestAddGetFreqSketch(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() client, conn := setupClient() defer tearDownClient(conn) typ := pb.SketchType_FREQ name := "yoyo" in := &pb.Sketch{ Name: proto.String(name), Type: &typ, Properties: &pb.SketchProperties{ MaxUniqueItems: proto.Int64(1337), // FIXME: Allow default as -1 Size: proto.Int64(7), }, } if res, err := client.CreateSketch(context.Background(), in); err != nil { t.Error("Did not expect error, got", err) } else if res.GetName() != in.GetName() { t.Errorf("Expected name == %s, got %s", in.GetName(), res.GetName()) } else if res.GetType() != in.GetType() { t.Errorf("Expected name == %q, got %q", in.GetType(), res.GetType()) } addReq := &pb.AddRequest{ Sketch: in, Values: []string{"a", "a", "b", "c", "d"}, } expected := map[string]int64{ "a": 2, "b": 1, "c": 1, "d": 1, "e": 0, } if _, err := client.Add(context.Background(), addReq); err != nil { t.Error("Did not expect error, got", err) } getReq := &pb.GetRequest{ Sketches: []*pb.Sketch{in}, Values: []string{"a", "b", "c", "d", "e", "b"}, } if res, err := client.GetFrequency(context.Background(), getReq); err != nil { t.Error("Did not expect error, got", err) } else { for _, v := range res.GetResults()[0].GetFrequencies() { if expected[v.GetValue()] != v.GetCount() { t.Errorf("Expected %s == %d, got", v.GetValue(), v.GetCount()) } } } }
func TestAddBloom(t *testing.T) { utils.SetupTests() defer utils.TearDownTests() info := datamodel.NewEmptyInfo() info.Properties.MaxUniqueItems = utils.Int64p(1024) info.Name = utils.Stringp("marvel") sketch, err := NewBloomSketch(info) if err != nil { t.Error("expected avengers to have no error, got", err) } values := [][]byte{ []byte("sabertooth"), []byte("thunderbolt"), []byte("havoc"), []byte("cyclops"), []byte("cyclops"), []byte("cyclops"), []byte("havoc")} if _, err := sketch.Add(values); err != nil { t.Error("expected no errors, got", err) } check := map[string]bool{ "sabertooth": true, "thunderbolt": true, "havoc": true, "cyclops": true, "wolverine": false, "iceman": false, "rogue": false, "storm": false} if res, err := sketch.Get(values); err != nil { t.Error("expected no errors, got", err) } else { tmp := res.(*pb.MembershipResult) mres := tmp.GetMemberships() for key := range check { for i := 0; i < len(mres); i++ { if mres[i].GetValue() == key && mres[i].GetIsMember() != check[key] { t.Error("expected member == "+strconv.FormatBool(check[key])+", got", mres[i].GetIsMember()) } } } } }
func TestAddGetCardSketch(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() client, conn := setupClient() defer tearDownClient(conn) typ := pb.SketchType_CARD name := "yoyo" in := &pb.Sketch{ Name: proto.String(name), Type: &typ, Properties: &pb.SketchProperties{ MaxUniqueItems: proto.Int64(1337), // FIXME: Allow default as -1 Size: proto.Int64(7), }, } if res, err := client.CreateSketch(context.Background(), in); err != nil { t.Error("Did not expect error, got", err) } else if res.GetName() != in.GetName() { t.Errorf("Expected name == %s, got %s", in.GetName(), res.GetName()) } else if res.GetType() != in.GetType() { t.Errorf("Expected name == %q, got %q", in.GetType(), res.GetType()) } addReq := &pb.AddRequest{ Sketch: in, Values: []string{"a", "b", "c", "d", "a", "b"}, } if _, err := client.Add(context.Background(), addReq); err != nil { t.Error("Did not expect error, got", err) } getReq := &pb.GetRequest{ Sketches: []*pb.Sketch{in}, Values: []string{}, } if res, err := client.GetCardinality(context.Background(), getReq); err != nil { t.Error("Did not expect error, got", err) } else if res.GetResults()[0].GetCardinality() != 4 { t.Error("Expected cardinality 4, got", res.GetResults()[0].GetCardinality()) } }
func TestCreateInvalidSketch(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() m := NewManager() info := datamodel.NewEmptyInfo() info.Properties.MaxUniqueItems = utils.Int64p(10000) info.Name = utils.Stringp("avengers") info.Type = nil if err := m.CreateSketch(info); err == nil { t.Error("Expected error invalid sketch, got", err) } if sketches := m.GetSketches(); len(sketches) != 0 { t.Error("Expected 0 sketches, got", len(sketches)) } }
func TestDeleteNonExistingSketch(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() m := NewManager() info := datamodel.NewEmptyInfo() typ := pb.SketchType_CARD info.Properties.MaxUniqueItems = utils.Int64p(10000) info.Name = utils.Stringp(fmt.Sprintf("marvel")) info.Type = &typ if err := m.DeleteSketch(info.ID()); err == nil { t.Error("Expected errors deleting non-existing sketch, got", err) } if sketches := m.GetSketches(); len(sketches) != 0 { t.Error("Expected 0 sketches, got", len(sketches)) } }
func TestMembershipSaveLoad(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() m := NewManager() info := datamodel.NewEmptyInfo() typ := pb.SketchType_MEMB info.Properties.MaxUniqueItems = utils.Int64p(1000) info.Name = utils.Stringp(fmt.Sprintf("marvel")) info.Type = &typ if err := m.CreateSketch(info); err != nil { t.Error("Expected no errors, got", err) } if sketches := m.GetSketches(); len(sketches) != 1 { t.Error("Expected 1 sketch, got", len(sketches)) } else if sketches[0][0] != "marvel" || sketches[0][1] != "memb" { t.Error("Expected [[marvel memb]], got", sketches) } if err := m.AddToSketch(info.ID(), []string{"hulk", "hulk", "thor", "iron man", "hawk-eye"}); err != nil { t.Error("Expected no errors, got", err) } if err := m.AddToSketch(info.ID(), []string{"hulk", "black widow", "black widow", "black widow", "black widow"}); err != nil { t.Error("Expected no errors, got", err) } if res, err := m.GetFromSketch(info.ID(), []string{"hulk", "captian america", "black widow"}); err != nil { t.Error("Expected no errors, got", err) } else if len(res.(*pb.MembershipResult).GetMemberships()) != 3 { t.Error("Expected len(res) = 3, got", len(res.(*pb.MembershipResult).GetMemberships())) } else if v := res.(*pb.MembershipResult).GetMemberships()[0].GetIsMember(); !v { t.Error("Expected 'hulk' == true , got", v) } else if v := res.(*pb.MembershipResult).GetMemberships()[1].GetIsMember(); v { t.Error("Expected 'captian america' == false , got", v) } else if v := res.(*pb.MembershipResult).GetMemberships()[2].GetIsMember(); !v { t.Error("Expected 'captian america' == true , got", v) } }
func TestAddHLLPP(t *testing.T) { utils.SetupTests() defer utils.TearDownTests() info := datamodel.NewEmptyInfo() info.Properties.MaxUniqueItems = utils.Int64p(1024) info.Name = utils.Stringp("marvel") sketch, err := NewHLLPPSketch(info) if err != nil { t.Error("expected avengers to have no error, got", err) } values := [][]byte{ []byte("sabertooth"), []byte("thunderbolt"), []byte("havoc"), []byte("cyclops"), []byte("cyclops"), []byte("cyclops"), []byte("havoc")} if _, err := sketch.Add(values); err != nil { t.Error("expected no errors, got", err) } const expectedCardinality int64 = 4 if res, err := sketch.Get(values); err != nil { t.Error("expected no errors, got", err) } else { tmp := res.(*pb.CardinalityResult) mres := tmp.GetCardinality() if mres != int64(expectedCardinality) { t.Error("expected cardinality == "+strconv.FormatInt(expectedCardinality, 10)+", got", mres) } } }
func TestRankSaveLoad(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() m := NewManager() info := datamodel.NewEmptyInfo() typ := pb.SketchType_RANK info.Properties.Size = utils.Int64p(10) info.Name = utils.Stringp(fmt.Sprintf("marvel")) info.Type = &typ if err := m.CreateSketch(info); err != nil { t.Error("Expected no errors, got", err) } if sketches := m.GetSketches(); len(sketches) != 1 { t.Error("Expected 1 sketch, got", len(sketches)) } else if sketches[0][0] != "marvel" || sketches[0][1] != "rank" { t.Error("Expected [[marvel rank]], got", sketches) } if err := m.AddToSketch(info.ID(), []string{"hulk", "hulk", "thor", "iron man", "hawk-eye"}); err != nil { t.Error("Expected no errors, got", err) } if err := m.AddToSketch(info.ID(), []string{"hulk", "black widow", "black widow", "black widow", "black widow"}); err != nil { t.Error("Expected no errors, got", err) } if res, err := m.GetFromSketch(info.ID(), nil); err != nil { t.Error("Expected no errors, got", err) } else if len(res.(*pb.RankingsResult).GetRankings()) != 5 { t.Error("Expected len(res) = 5, got", len(res.(*pb.RankingsResult).GetRankings())) } else if res.(*pb.RankingsResult).GetRankings()[0].GetValue() != "black widow" { t.Error("Expected 'black widow', got", res.(*pb.RankingsResult).GetRankings()[0].GetValue()) } }
func BenchmarkBloom(b *testing.B) { utils.SetupTests() defer utils.TearDownTests() values := make([][]byte, 10) for i := 0; i < 1024; i++ { avenger := "avenger" + strconv.Itoa(i) values = append(values, []byte(avenger)) } for n := 0; n < b.N; n++ { info := datamodel.NewEmptyInfo() info.Properties.MaxUniqueItems = utils.Int64p(1000) info.Name = utils.Stringp("marvel") sketch, err := NewBloomSketch(info) if err != nil { b.Error("expected no errors, got", err) } for i := 0; i < 1000; i++ { if _, err := sketch.Add(values); err != nil { b.Error("expected no errors, got", err) } } } }
func TestFreqSaveLoad(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() m := NewManager() info := datamodel.NewEmptyInfo() typ := pb.SketchType_FREQ info.Properties.MaxUniqueItems = utils.Int64p(10000) info.Name = utils.Stringp(fmt.Sprintf("marvel")) info.Type = &typ if err := m.CreateSketch(info); err != nil { t.Error("Expected no errors, got", err) } if sketches := m.GetSketches(); len(sketches) != 1 { t.Error("Expected 1 sketch, got", len(sketches)) } else if sketches[0][0] != "marvel" || sketches[0][1] != "freq" { t.Error("Expected [[marvel freq]], got", sketches) } if err := m.AddToSketch(info.ID(), []string{"hulk", "thor", "iron man", "hawk-eye"}); err != nil { t.Error("Expected no errors, got", err) } if err := m.AddToSketch(info.ID(), []string{"hulk", "black widow"}); err != nil { t.Error("Expected no errors, got", err) } if res, err := m.GetFromSketch(info.ID(), []string{"hulk", "thor", "iron man", "hawk-eye"}); err != nil { t.Error("Expected no errors, got", err) } else if res.(*pb.FrequencyResult).GetFrequencies()[0].GetCount() != 2 { t.Error("Expected res = 2, got", res.(*pb.FrequencyResult).GetFrequencies()[0].GetCount()) } }
func TestCreateSketch(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() client, conn := setupClient() defer tearDownClient(conn) typ := pb.SketchType_CARD name := "yoyo" in := &pb.Sketch{ Name: proto.String(name), Type: &typ, } if res, err := client.CreateSketch(context.Background(), in); err != nil { t.Error("Did not expect error, got", err) } else if res.GetName() != in.GetName() { t.Errorf("Expected name == %s, got %s", in.GetName(), res.GetName()) } else if res.GetType() != in.GetType() { t.Errorf("Expected name == %q, got %q", in.GetType(), res.GetType()) } }
func TestCreateDeleteSketch(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() path := filepath.Join(config.GetConfig().DataDir, "skizze.aof") aof := NewAOF(path) aof.Run() sketch := createSketch("skz1", pb.SketchType_CARD) err := aof.Append(CreateDom, sketch) if err != nil { t.Error("Expected no error, got", err) } sketch = createSketch("skz2", pb.SketchType_FREQ) err = aof.Append(CreateDom, sketch) if err != nil { t.Error("Expected no error, got", err) } // Create new AOF aof = NewAOF(path) for { e, err2 := aof.Read() if err2 != nil { if err2.Error() != "EOF" { t.Error("Expected no error, got", err2) } break } sketch := &pb.Sketch{} err = proto.Unmarshal(e.raw, sketch) if err != nil { t.Error("Expected no error, got", err) } } aof.Run() sketch = createSketch("skz3", pb.SketchType_RANK) err = aof.Append(CreateDom, sketch) if err != nil { t.Error("Expected no error, got", err) } sketch = createSketch("skz1", pb.SketchType_RANK) if err = aof.Append(DeleteDom, sketch); err != nil { t.Error("Expected no error, got", err) } addReq := &pb.AddRequest{ Sketch: sketch, Values: []string{"foo", "bar", "hello", "world"}, } if err = aof.Append(4, addReq); err != nil { t.Error("Expected no error, got", err) } aof = NewAOF(path) for { e, err := aof.Read() if err != nil { if err.Error() != "EOF" { t.Error("Expected no error, got", err) } break } if e.op == Add { req := &pb.AddRequest{} err = proto.Unmarshal(e.raw, req) } else { sketch := &pb.Sketch{} err = proto.Unmarshal(e.raw, sketch) } if err != nil { t.Error("Expected no error, got", err) } } }
func TestCreateDeleteSketch(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() _ = os.Remove("test.log") aof := NewAOF("test.log") sketch := createSketch("skz1", pb.SketchType_CARD) err := aof.AppendDomOp(CreateDom, sketch) if err != nil { t.Error("Expected no error, got", err) } sketch = createSketch("skz2", pb.SketchType_FREQ) err = aof.AppendDomOp(CreateDom, sketch) if err != nil { t.Error("Expected no error, got", err) } // Create new AOF aof = NewAOF("test.log") if err != nil { t.Error("Expected no error, got", err) } for { e, err2 := aof.Read() if err2 != nil { if err2.Error() != "EOF" { t.Error("Expected no error, got", err2) } break } sketch := &pb.Sketch{} err = proto.Unmarshal(e.args, sketch) if err != nil { t.Error("Expected no error, got", err) } } sketch = createSketch("skz3", pb.SketchType_RANK) err = aof.AppendDomOp(CreateDom, sketch) if err != nil { t.Error("Expected no error, got", err) } sketch = createSketch("skz1", pb.SketchType_RANK) if err = aof.AppendDomOp(DeleteDom, sketch); err != nil { t.Error("Expected no error, got", err) } addReq := &pb.AddRequest{ Sketch: sketch, Values: []string{"foo", "bar", "hello", "world"}, } if err = aof.AppendAddOp(addReq); err != nil { t.Error("Expected no error, got", err) } aof = NewAOF("test.log") for { e, err := aof.Read() if err != nil { if err.Error() != "EOF" { t.Error("Expected no error, got", err) } break } if e.op == Add { req := &pb.AddRequest{} err = proto.Unmarshal(e.args, req) } else { sketch := &pb.Sketch{} err = proto.Unmarshal(e.args, sketch) } if err != nil { t.Error("Expected no error, got", err) } } }
func TestCreateDeleteDom(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() _ = os.Remove("test.log") aof := NewAOF("test.log") dom := createDom("test1") err := aof.AppendDomOp(CreateDom, dom) if err != nil { t.Error("Expected no error, got", err) } dom = createDom("test2") err = aof.AppendDomOp(CreateDom, dom) if err != nil { t.Error("Expected no error, got", err) } // Create new AOF aof = NewAOF("test.log") for { e, err2 := aof.Read() if err2 != nil { if err2.Error() != "EOF" { t.Error("Expected no error, got", err2) } break } dom := &pb.Domain{} err = proto.Unmarshal(e.args, dom) if err != nil { t.Error("Expected no error, got", err) } } dom = createDom("test3") if err = aof.AppendDomOp(CreateDom, dom); err != nil { t.Error("Expected no error, got", err) } dom = new(pb.Domain) dom.Name = utils.Stringp("test1") if err = aof.AppendDomOp(DeleteDom, dom); err != nil { t.Error("Expected no error, got", err) } aof = NewAOF("test.log") for { e, err := aof.Read() if err != nil { if err.Error() != "EOF" { t.Error("Expected no error, got", err) } break } dom := &pb.Domain{} err = proto.Unmarshal(e.args, dom) if err != nil { t.Error("Expected no error, got", err) } } }
func TestCreateDeleteDom(t *testing.T) { config.Reset() utils.SetupTests() defer utils.TearDownTests() path := filepath.Join(config.GetConfig().DataDir, "skizze.aof") aof := NewAOF(path) aof.Run() dom := createDom("test1") err := aof.Append(CreateDom, dom) if err != nil { t.Error("Expected no error, got", err) } dom = createDom("test2") err = aof.Append(CreateDom, dom) if err != nil { t.Error("Expected no error, got", err) } // Create new AOF aof = NewAOF(path) for { e, err2 := aof.Read() if err2 != nil { if err2.Error() != "EOF" { t.Error("Expected no error, got", err2) } break } dom := &pb.Domain{} err = proto.Unmarshal(e.raw, dom) if err != nil { t.Error("Expected no error, got", err) break } } aof.Run() dom = createDom("test3") if err = aof.Append(CreateDom, dom); err != nil { t.Error("Expected no error, got", err) } dom = new(pb.Domain) dom.Name = utils.Stringp("test1") if err = aof.Append(DeleteDom, dom); err != nil { t.Error("Expected no error, got", err) } aof = NewAOF(path) for { e, err := aof.Read() if err != nil { if err.Error() != "EOF" { t.Error("Expected no error, got", err) } break } dom := &pb.Domain{} err = proto.Unmarshal(e.raw, dom) if err != nil { t.Error("Expected no error, got", err) break } } }
func TestAddTopK(t *testing.T) { utils.SetupTests() defer utils.TearDownTests() info := datamodel.NewEmptyInfo() info.Properties.Size = utils.Int64p(3) info.Name = utils.Stringp("marvel") sketch, err := NewTopKSketch(info) if err != nil { t.Error("expected avengers to have no error, got", err) } values := [][]byte{ []byte("sabertooth"), []byte("thunderbolt"), []byte("thunderbolt"), []byte("havoc"), []byte("cyclops"), []byte("cyclops"), []byte("cyclops"), []byte("havoc")} if _, err := sketch.Add(values); err != nil { t.Error("expected no errors, got", err) } type RankingsStruct struct { Value string Position int64 Count int64 } expectedRankings := make([]*RankingsStruct, 4, 4) expectedRankings[0] = &RankingsStruct{ Value: "cyclops", Count: 3, Position: 1, } expectedRankings[1] = &RankingsStruct{ Value: "thunderbolt", Count: 2, Position: 2, } expectedRankings[2] = &RankingsStruct{ Value: "havoc", Count: 2, Position: 3, } expectedRankings[3] = &RankingsStruct{ Value: "sabertooth", Count: 1, Position: 4, } if res, err := sketch.Get(values); err != nil { t.Error("expected no errors, got", err) } else { tmp := res.(*pb.RankingsResult) rres := tmp.GetRankings() for i := 0; i < len(rres); i++ { count := rres[i].GetCount() value := rres[i].GetValue() for j := 0; j < len(expectedRankings); j++ { if expectedRankings[j].Value == value && expectedRankings[j].Count != count && expectedRankings[j].Position != int64(i) { t.Error("expected ranking == "+strconv.FormatInt(expectedRankings[j].Position, 10)+", got", count) } } } } }