package bps import ( "bytes" "io" "log" "testing" "time" ) func init() { log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) } func TestSimple(t *testing.T) { bw, err := New(1 * time.Second) if err != nil { t.Fatalf("failure to make reasonable BPS: %v", err) } bw.Close() } func TestBadResolution(t *testing.T) { var i uint for i = 0; i < minResolution; i++ { _, err := NewPrecise(1*time.Second, i) if err == nil { t.Fatalf("expected an error, got nil for %d", i) } } } func TestWriter(t *testing.T) { t.Parallel() bw, err := New(1 * time.Second) if err != nil { t.Fatalf("failure to make reasonable BPS: %v", err) } b := &bytes.Buffer{} b.Write([]byte("helloooooooooooooooooooooooooooooooooooooooooooooo")) for i := 0; i < 90; i++ { io.Copy(bw, b) last := bw.Rate() time.Sleep(10 * time.Millisecond) if last > bw.Rate() { t.Errorf("rate should be increasing, it isn't: last: %f > current: %f", last, bw.Rate()) } } time.Sleep(2 * time.Second) for i := 0; i < 100; i++ { if bw.Rate() > 0 { t.Errorf("got high rate: got, want 0.0000", bw.Rate()) } time.Sleep(9 * time.Millisecond) } bw.Close() } func TestAdd(t *testing.T) { t.Parallel() bw, err := New(1 * time.Second) if err != nil { t.Fatalf("failure to make reasonable BPS: %v", err) } for i := 0; i < 90; i++ { bw.Add(1024) last := bw.Rate() time.Sleep(10 * time.Millisecond) if last > bw.Rate() { t.Errorf("rate should be increasing, it isn't: last: %f > current: %f", last, bw.Rate()) } } time.Sleep(2 * time.Second) for i := 0; i < 100; i++ { if bw.Rate() > 0 { t.Errorf("got high rate: got, want 0.0000", bw.Rate()) } time.Sleep(9 * time.Millisecond) } bw.Close() } func TestHumanBytes(t *testing.T) { t.Parallel() bw, err := NewPrecise(100*time.Second, 10) if err != nil { t.Fatalf("failure to make reasonable BPS: %v", err) } bw.Add(1000) got := bw.HumanRate() want := "10B/s" if got != want { t.Fatalf("did not get right human rate; got %v, want %v", got, want) } } // TestSparkBadBucketCounts just makes sure that bad inputs are reported func TestSparkBadBucketCounts(t *testing.T) { bw := BPS{ buckets: make([]int64, 10), } sizes := []int{-10, -1, 0, 11, 12, 100, 1000} for _, size := range sizes { got := bw.Sparkline(size) want := "bucket count inappropriate" if got != want { t.Fatalf("got: %v, want: %v", got, want) } } } // TestSparkline just creates a simple BPS and traverses all reasonable count // sizes. It's primarily a test for panics which plagued us early on. func TestSparkline(t *testing.T) { buckets := 20 bw := BPS{ buckets: make([]int64, buckets), } t.Logf("all 0") for i := 0; i < buckets; i++ { bw.buckets[i] = 0 } for i := 1; i < buckets; i++ { line := bw.Sparkline(i) t.Logf("count: %d, len %d: %+v", i, len([]rune(line)), line) } t.Logf("increasing") for i := 0; i < buckets; i++ { bw.buckets[i] = int64(i * buckets) } for i := 1; i < buckets; i++ { line := bw.Sparkline(i) t.Logf("count: %d, len %d: %+v", i, len([]rune(line)), line) } t.Logf("decreasing") for i := 0; i < buckets; i++ { bw.buckets[i] = int64((buckets - i) * buckets) } for i := 1; i < buckets; i++ { line := bw.Sparkline(i) t.Logf("count: %d, len %d: %+v", i, len([]rune(line)), line) } } func TestSparkRandom(t *testing.T) { buckets := 20 bw := BPS{ buckets: make([]int64, buckets), } bw.buckets[3] = 100 t.Logf("%+v", bw.Sparkline(10)) bw.buckets[7] = 300 for i := 1; i < buckets; i++ { line := bw.Sparkline(i) t.Logf("count: %d, len: %d: %+v", i, len([]rune(line)), line) } }