Repository navigation
Expand file tree
/
Copy pathstatsfile_test.go
More file actions
129 lines (106 loc) · 3.18 KB
/
Copy pathstatsfile_test.go
File metadata and controls
129 lines (106 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package main
import (
"encoding/json"
"os"
"os/user"
"path/filepath"
"strings"
"testing"
"time"
"github.com/prometheus/procfs"
"github.com/stretchr/testify/require"
)
func TestStatFile(t *testing.T) {
name := statFile()
if !strings.HasPrefix(name, "mackerel-plugin-linux-netdev-") {
t.Fatalf("unexpected filename prefix: %s", name)
}
curUser, err := user.Current()
if err == nil && curUser != nil {
if got, want := name, "mackerel-plugin-linux-netdev-"+curUser.Uid; got != want {
t.Fatalf("unexpected filename, got=%s want=%s", got, want)
}
}
}
func TestWriteStatsAndReadStats(t *testing.T) {
dir := t.TempDir()
filename := "stats.json"
metrics := map[string]procfs.NetDevLine{
"eth0": {
Name: "eth0",
TxErrors: 3,
RxErrors: 2,
TxDropped: 1,
RxDropped: 4,
TxPackets: 100,
RxPackets: 200,
},
}
if err := writeStats(dir, filename, metrics, time.Now().Add(-5*time.Second)); err != nil {
t.Fatalf("writeStats failed: %v", err)
}
timeDiff, gotMetrics, err := readStats(dir, filename)
if err != nil {
t.Fatalf("readStats failed: %v", err)
}
if timeDiff < 0 || timeDiff > tooOldDuration {
t.Fatalf("unexpected timeDiff: %v", timeDiff)
}
got, ok := gotMetrics["eth0"]
if !ok {
t.Fatalf("missing interface eth0")
}
if got.TxErrors != metrics["eth0"].TxErrors ||
got.RxErrors != metrics["eth0"].RxErrors ||
got.TxDropped != metrics["eth0"].TxDropped ||
got.RxDropped != metrics["eth0"].RxDropped ||
got.TxPackets != metrics["eth0"].TxPackets ||
got.RxPackets != metrics["eth0"].RxPackets {
t.Fatalf("decoded metrics do not match written metrics")
}
}
func TestReadStatsInvalidJSON(t *testing.T) {
dir := t.TempDir()
filename := "stats.json"
if err := os.WriteFile(filepath.Join(dir, filename), []byte("{invalid"), 0o600); err != nil {
t.Fatalf("failed to create invalid json file: %v", err)
}
if _, _, err := readStats(dir, filename); err == nil {
t.Fatalf("expected readStats to fail with invalid JSON")
}
}
func writeJSONToFile(dir, filename string, data any) error {
file, err := os.Create(filepath.Join(dir, filename))
if err != nil {
return err
}
defer file.Close()
encoder := json.NewEncoder(file)
return encoder.Encode(data)
}
func TestReadStatsZeroTime(t *testing.T) {
dir := t.TempDir()
filename := "stats.json"
st := stats{
Interfaces: map[string]procfs.NetDevLine{},
Time: 0,
}
err := writeJSONToFile(dir, filename, st)
require.NoError(t, err, "failed to write stats with zero time")
_, _, err = readStats(dir, filename)
require.Error(t, err, "expected readStats to fail with zero time")
require.Contains(t, err.Error(), "failed to get previous time", "unexpected error message")
}
func TestReadStatsTooLongDuration(t *testing.T) {
dir := t.TempDir()
filename := "stats.json"
st := stats{
Interfaces: map[string]procfs.NetDevLine{},
Time: time.Now().Unix() - int64(tooOldDuration) - 10,
}
err := writeJSONToFile(dir, filename, st)
require.NoError(t, err, "failed to write stats with zero time")
_, _, err = readStats(dir, filename)
require.Error(t, err, "expected readStats to fail for too old stats")
require.Contains(t, err.Error(), "too long duration", "unexpected error message")
}