// Send a query. func doQuery(hcl *htrace.Client, query *common.Query) error { if *verbose { qbytes, err := json.Marshal(*query) if err != nil { qbytes = []byte("marshaling error: " + err.Error()) } fmt.Printf("Sending query: %s\n", string(qbytes)) } spans, err := hcl.Query(query) if err != nil { return err } if *verbose { fmt.Printf("%d results...\n", len(spans)) } for i := range spans { fmt.Printf("%s\n", spans[i].ToJson()) } return nil }
func TestClientOperations(t *testing.T) { htraceBld := &MiniHTracedBuilder{Name: "TestClientOperations", DataDirs: make([]string, 2)} ht, err := htraceBld.Build() if err != nil { t.Fatalf("failed to create datastore: %s", err.Error()) } defer ht.Close() var hcl *htrace.Client hcl, err = htrace.NewClient(ht.ClientConf()) if err != nil { t.Fatalf("failed to create client: %s", err.Error()) } // Create some random trace spans. NUM_TEST_SPANS := 30 allSpans := createRandomTestSpans(NUM_TEST_SPANS) // Write half of the spans to htraced via the client. err = hcl.WriteSpans(&common.WriteSpansReq{ Spans: allSpans[0 : NUM_TEST_SPANS/2], }) if err != nil { t.Fatalf("WriteSpans(0:%d) failed: %s\n", NUM_TEST_SPANS/2, err.Error()) } // Look up the first half of the spans. They should be found. var span *common.Span for i := 0; i < NUM_TEST_SPANS/2; i++ { span, err = hcl.FindSpan(allSpans[i].Id) if err != nil { t.Fatalf("FindSpan(%d) failed: %s\n", i, err.Error()) } common.ExpectSpansEqual(t, allSpans[i], span) } // Look up the second half of the spans. They should not be found. for i := NUM_TEST_SPANS / 2; i < NUM_TEST_SPANS; i++ { span, err = hcl.FindSpan(allSpans[i].Id) if err != nil { t.Fatalf("FindSpan(%d) failed: %s\n", i, err.Error()) } if span != nil { t.Fatalf("Unexpectedly found a span we never write to "+ "the server: FindSpan(%d) succeeded\n", i) } } // Test FindChildren childSpan := allSpans[1] parentId := childSpan.Parents[0] var children []common.SpanId children, err = hcl.FindChildren(parentId, 1) if err != nil { t.Fatalf("FindChildren(%s) failed: %s\n", parentId, err.Error()) } if len(children) != 1 { t.Fatalf("FindChildren(%s) returned an invalid number of "+ "children: expected %d, got %d\n", parentId, 1, len(children)) } if !children[0].Equal(childSpan.Id) { t.Fatalf("FindChildren(%s) returned an invalid child id: expected %s, "+ " got %s\n", parentId, childSpan.Id, children[0]) } // Test FindChildren on a span that has no children childlessSpan := allSpans[NUM_TEST_SPANS/2] children, err = hcl.FindChildren(childlessSpan.Id, 10) if err != nil { t.Fatalf("FindChildren(%d) failed: %s\n", childlessSpan.Id, err.Error()) } if len(children) != 0 { t.Fatalf("FindChildren(%d) returned an invalid number of "+ "children: expected %d, got %d\n", childlessSpan.Id, 0, len(children)) } // Test Query var query common.Query query = common.Query{Lim: 10} spans, err := hcl.Query(&query) if err != nil { t.Fatalf("Query({lim: %d}) failed: %s\n", 10, err.Error()) } if len(spans) != 10 { t.Fatalf("Query({lim: %d}) returned an invalid number of "+ "children: expected %d, got %d\n", 10, 10, len(spans)) } }