featurebase/diagnostics/diagnostics_test.go
2017-10-18 10:14:19 -05:00

143 lines
3.2 KiB
Go

package diagnostics_test
import (
"encoding/json"
"io/ioutil"
"net/http"
"net/http/httptest"
"reflect"
"strings"
"testing"
"time"
"github.com/pilosa/pilosa/diagnostics"
)
func TestDiagnosticsClient(t *testing.T) {
// Mock server.
server := httptest.NewServer(nil)
defer server.Close()
// Create a new client.
d := diagnostics.New(server.URL)
d.SetLogger(ioutil.Discard)
defer d.Close()
dur, _ := time.ParseDuration("123us")
d.CountWithCustomTags("ct", 1, 1.0, []string{"foo:bar"})
d.Count("cc", 1, 1.0)
d.Gauge("gg", 10, 1.0)
d.Histogram("hh", 1, 1.0)
d.Timing("tt", dur, 1.0)
d.Set("ss", "ss", 1.0)
d1 := d.WithTags("test")
if !reflect.DeepEqual(d, d1) {
t.Fatalf("Diagnostics is a singleton")
}
if s := d.Tags(); s != nil {
t.Fatalf("No Diagnostics Tags")
}
data, err := d.MarshalJSON()
if err != nil {
t.Fatal(err)
}
// Test the recorded metrics, note that some types are skipped.
var eq bool
output1 := []byte(`{"ct":1,"cc":1,"gg":"10","ss":"ss"}`)
if eq, err = compareJSON(data, output1); err != nil {
t.Fatal(err)
}
if !eq {
t.Fatalf("unexpected diagnostics: %+v", string(data))
}
// Test the metrics after a flush.
d.Flush()
data, err = d.MarshalJSON()
if err != nil {
t.Fatal(err)
}
output2 := []byte(`{"gg":"10","ss":"ss","uptime":"0"}`)
if eq, err = compareJSON(data, output2); err != nil {
t.Fatal(err)
}
if !eq {
t.Fatalf("unexpected diagnostics after flush: %+v", string(data))
}
}
func TestDiagnosticsVersion_Parse(t *testing.T) {
version := "0.1.1"
vs := diagnostics.VersionSegments(version)
output := []int{0, 1, 1}
if !reflect.DeepEqual(vs, output) {
t.Fatalf("unexpected version: %+v", vs)
}
}
func TestDiagnosticsVersion_Compare(t *testing.T) {
d := diagnostics.New("localhost:10101")
defer d.Close()
version := "0.1.1"
d.SetVersion(version)
err := d.CompareVersion("1.7.0")
if !strings.Contains(err.Error(), "The latest Major release is") {
t.Fatalf("Expected Major Version Missmatch, actual error: %s", err)
}
err = d.CompareVersion("0.7.0")
if !strings.Contains(err.Error(), "The latest Minor release is") {
t.Fatalf("Expected Minor Version Missmatch, actual error: %s", err)
}
err = d.CompareVersion("0.1.2")
if !strings.Contains(err.Error(), "There is a new patch relese of Pilosa") {
t.Fatalf("Expected Patch Version Missmatch, actual error: %s", err)
}
err = d.CompareVersion("0.1.1")
if err != nil {
t.Fatalf("Versions should match")
}
}
func TestDiagnosticsVersion_Check(t *testing.T) {
// Mock server.
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(versionResponse{
Version: "1.1.1",
})
}))
defer server.Close()
// Create a new client.
d := diagnostics.New("localhost:10101")
defer d.Close()
version := "0.1.1"
d.SetVersion(version)
d.VersionURL = server.URL
d.CheckVersion()
}
type versionResponse struct {
Version string `json:"version"`
}
func compareJSON(a, b []byte) (bool, error) {
var j1, j2 interface{}
if err := json.Unmarshal(a, &j1); err != nil {
return false, err
}
if err := json.Unmarshal(b, &j2); err != nil {
return false, err
}
return reflect.DeepEqual(j1, j2), nil
}