blob: 4230e5fc3f453c57778ad63fdd9a22df98b7f7d1 [file] [log] [blame]
package cache
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import (
"bytes"
"io/ioutil"
"net/http"
"os"
"testing"
"github.com/apache/trafficcontrol/traffic_monitor/poller"
)
func TestStatsOverHTTPParse(t *testing.T) {
fd, err := os.Open("stats_over_http.json")
if err != nil {
t.Fatal(err)
}
pl := &poller.HTTPPollCtx{HTTPHeader: http.Header{}}
ctx := interface{}(pl)
ctx.(*poller.HTTPPollCtx).HTTPHeader.Set("Content-Type", "text/json")
stats, misc, err := statsOverHTTPParse("test", fd, ctx)
if err != nil {
t.Fatal(err)
}
// Floating-Point arithmetic...
if misc["plugin.remap_stats.edge-cache-0.delivery.service.zero.in_bytes"] != float64(296727207) {
t.Errorf("Expected 296727207 for remap_stats edge-cache in_bytes, got %.10f", misc["plugin.remap_stats.edge-cache-0.delivery.service.zero.in_bytes"])
}
if stats.Loadavg.One <= 0.092773437 || stats.Loadavg.One >= 0.092773439 {
t.Errorf("Incorrect one-minute loadavg, expected roughly 0.092773438, got '%.10f'", stats.Loadavg.One)
}
if stats.Loadavg.Five <= 0.25439453 || stats.Loadavg.Five >= 0.254394532 {
t.Errorf("Incorrect five-minute loadavg, expected roughly 0.254394531, got %.10f", stats.Loadavg.Five)
}
if stats.Loadavg.Fifteen <= 0.639160155 || stats.Loadavg.Fifteen >= 639160157 {
t.Errorf("Incorrect fifteen-minute loadavg, expected roughly 0.639160156, got %.10f", stats.Loadavg.Fifteen)
}
if stats.Loadavg.TotalProcesses != 803 {
t.Errorf("Incorrect current_processes, expected 803, got %d", stats.Loadavg.CurrentProcesses)
}
if len(stats.Interfaces) != 1 {
t.Errorf("Expected exactly one interface, got %d", len(stats.Interfaces))
if len(stats.Interfaces) < 1 {
t.FailNow()
}
}
found := false
for name, iface := range stats.Interfaces {
if name != "docker0" {
t.Errorf("Found unexpected network interface '%s'", name)
continue
}
found = true
if iface.Speed != 70000 {
t.Errorf("Incorrect interface speed, expected 70000, got %d", iface.Speed)
}
if iface.BytesIn != 4363732 {
t.Errorf("Incorrect interface rx_bytes, expected 4363732, got %d", iface.BytesIn)
}
if iface.BytesOut != 237634637 {
t.Errorf("Incorrect interface tx_bytes, expceted 237634637, got %d", iface.BytesOut)
}
}
if !found {
t.Error("Didn't find the expected 'docker0' network interface")
}
}
func TestStatsOverHTTPParseCSV(t *testing.T) {
fd, err := os.Open("stats_over_http.csv")
if err != nil {
t.Fatal(err)
}
pl := &poller.HTTPPollCtx{HTTPHeader: http.Header{}}
ctx := interface{}(pl)
ctx.(*poller.HTTPPollCtx).HTTPHeader.Set("Content-Type", "text/csv")
stats, misc, err := statsOverHTTPParse("test", fd, ctx)
if err != nil {
t.Fatal(err)
}
// Floating-Point arithmetic...
if misc["plugin.remap_stats.edge-cache-0.delivery.service.zero.in_bytes"] != float64(296727207) {
t.Errorf("Expected 296727207 for remap_stats edge-cache in_bytes, got %.10f", misc["plugin.remap_stats.edge-cache-0.delivery.service.zero.in_bytes"])
}
if stats.Loadavg.One <= 0.092773437 || stats.Loadavg.One >= 0.092773439 {
t.Errorf("Incorrect one-minute loadavg, expected roughly 0.092773438, got '%.10f'", stats.Loadavg.One)
}
if stats.Loadavg.Five <= 0.25439453 || stats.Loadavg.Five >= 0.254394532 {
t.Errorf("Incorrect five-minute loadavg, expected roughly 0.254394531, got %.10f", stats.Loadavg.Five)
}
if stats.Loadavg.Fifteen <= 0.639160155 || stats.Loadavg.Fifteen >= 639160157 {
t.Errorf("Incorrect fifteen-minute loadavg, expected roughly 0.639160156, got %.10f", stats.Loadavg.Fifteen)
}
if stats.Loadavg.TotalProcesses != 803 {
t.Errorf("Incorrect current_processes, expected 803, got %d", stats.Loadavg.TotalProcesses)
}
if len(stats.Interfaces) != 1 {
t.Errorf("Expected exactly one interface, got %d", len(stats.Interfaces))
if len(stats.Interfaces) < 1 {
t.FailNow()
}
}
found := false
for name, iface := range stats.Interfaces {
if name != "docker0" {
t.Errorf("Found unexpected network interface '%s'", name)
continue
}
found = true
if iface.Speed != 70000 {
t.Errorf("Incorrect interface speed, expected 70000, got %d", iface.Speed)
}
if iface.BytesIn != 4363732 {
t.Errorf("Incorrect interface rx_bytes, expected 4363732, got %d", iface.BytesIn)
}
if iface.BytesOut != 237634637 {
t.Errorf("Incorrect interface tx_bytes, expceted 237634637, got %d", iface.BytesOut)
}
}
if !found {
t.Error("Didn't find the expected 'docker0' network interface")
}
}
func BenchmarkStatsJson(b *testing.B) {
file, err := ioutil.ReadFile("stats_over_http.json")
if err != nil {
b.Fatal(err)
}
pl := &poller.HTTPPollCtx{HTTPHeader: http.Header{}}
ctx := interface{}(pl)
ctx.(*poller.HTTPPollCtx).HTTPHeader.Set("Content-Type", "text/json")
// Reset benchmark timer to not include reading the file
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _, err := statsOverHTTPParse("test", bytes.NewReader(file), ctx)
if err != nil {
b.Error(err)
}
}
}
func BenchmarkStatsCSV(b *testing.B) {
file, err := ioutil.ReadFile("stats_over_http.csv")
if err != nil {
b.Fatal(err)
}
pl := &poller.HTTPPollCtx{HTTPHeader: http.Header{}}
ctx := interface{}(pl)
ctx.(*poller.HTTPPollCtx).HTTPHeader.Set("Content-Type", "text/csv")
// Reset benchmark timer to not include reading the file
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _, err := statsOverHTTPParse("test", bytes.NewReader(file), ctx)
if err != nil {
b.Error(err)
}
}
}