blob: 72b1bb05c550db66c1f17ae23476ccf50f2e53b7 [file]
// Copyright The Prometheus Authors
// Licensed 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.
package bcachefs
import (
"os"
"path/filepath"
"testing"
)
func TestParseHumanReadableBytes(t *testing.T) {
tests := []struct {
in string
want uint64
}{
{"542k", 555008},
{"322M", 337641472},
{"1.5G", 1610612736},
{"112k", 114688},
{"405", 405},
}
for _, tt := range tests {
got, err := parseHumanReadableBytes(tt.in)
if err != nil {
t.Fatalf("parseHumanReadableBytes(%q) error: %v", tt.in, err)
}
if got != tt.want {
t.Fatalf("parseHumanReadableBytes(%q) = %d, want %d", tt.in, got, tt.want)
}
}
}
func TestFSBcachefsStats(t *testing.T) {
uuid := "deadbeef-1234-5678-9012-abcdefabcdef"
fs, err := NewFS("testdata/fixtures/sys")
if err != nil {
t.Fatalf("NewFS error: %v", err)
}
stats, err := fs.Stats()
if err != nil {
t.Fatalf("Stats error: %v", err)
}
if len(stats) != 1 {
t.Fatalf("expected 1 filesystem, got %d", len(stats))
}
got := stats[0]
if got.UUID != uuid {
t.Fatalf("unexpected uuid: %q", got.UUID)
}
if got.BtreeCacheSizeBytes != 1610612736 {
t.Fatalf("unexpected btree cache size: %d", got.BtreeCacheSizeBytes)
}
if got.Compression["lz4"].CompressedBytes == 0 {
t.Fatalf("missing compression stats for lz4")
}
if got.Errors["btree_node_read_err"].Count != 5 {
t.Fatalf("unexpected error count: %d", got.Errors["btree_node_read_err"].Count)
}
if got.Counters["btree_node_read"].SinceFilesystemCreation != 67890 {
t.Fatalf("unexpected counter value: %d", got.Counters["btree_node_read"].SinceFilesystemCreation)
}
if got.BtreeWrites["initial"].Count != 19088 {
t.Fatalf("unexpected btree write count: %d", got.BtreeWrites["initial"].Count)
}
dev := got.Devices["1"]
if dev == nil {
t.Fatalf("missing device stats")
}
if dev.Buckets != 4096 {
t.Fatalf("unexpected nbuckets: %d", dev.Buckets)
}
if dev.IOErrors["read"] != 197346 {
t.Fatalf("unexpected io_errors read: %d", dev.IOErrors["read"])
}
if dev.IODone["read"]["btree"] != 4411097088 {
t.Fatalf("unexpected io_done read btree: %d", dev.IODone["read"]["btree"])
}
}
func TestParseCounterFileHumanReadable(t *testing.T) {
dir := t.TempDir()
path := filepath.Join(dir, "counter")
if err := os.WriteFile(path, []byte("since mount: 2.05G\nsince filesystem creation: 1.5T\n"), 0o644); err != nil {
t.Fatalf("write counter file: %v", err)
}
got, err := parseCounterFile(path)
if err != nil {
t.Fatalf("parseCounterFile error: %v", err)
}
wantMount, err := parseHumanReadableBytes("2.05G")
if err != nil {
t.Fatalf("parseHumanReadableBytes mount error: %v", err)
}
wantCreation, err := parseHumanReadableBytes("1.5T")
if err != nil {
t.Fatalf("parseHumanReadableBytes creation error: %v", err)
}
if got.SinceMount != wantMount {
t.Fatalf("since mount = %d, want %d", got.SinceMount, wantMount)
}
if got.SinceFilesystemCreation != wantCreation {
t.Fatalf("since filesystem creation = %d, want %d", got.SinceFilesystemCreation, wantCreation)
}
}