blob: 8ebcfd16ecd5bc18c14f855945d7343eda93c74b [file] [log] [blame]
// Copyright 2018 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 nfs_test
import (
"reflect"
"strings"
"testing"
"github.com/prometheus/procfs/nfs"
)
func TestNewNFSClientRPCStats(t *testing.T) {
tests := []struct {
name string
content string
stats *nfs.ClientRPCStats
invalid bool
}{
{
name: "invalid file",
content: "invalid",
invalid: true,
}, {
name: "good old kernel version file",
content: `net 70 70 69 45
rpc 1218785755 374636 1218815394
proc2 18 16 57 74 52 71 73 45 86 0 52 83 61 17 53 50 23 70 82
proc3 22 0 1061909262 48906 4077635 117661341 5 29391916 2570425 2993289 590 0 0 7815 15 1130 0 3983 92385 13332 2 1 23729
proc4 48 98 51 54 83 85 23 24 1 28 73 68 83 12 84 39 68 59 58 88 29 74 69 96 21 84 15 53 86 54 66 56 97 36 49 32 85 81 11 58 32 67 13 28 35 90 1 26 1337
`,
stats: &nfs.ClientRPCStats{
Network: nfs.Network{
NetCount: 70,
UDPCount: 70,
TCPCount: 69,
TCPConnect: 45,
},
ClientRPC: nfs.ClientRPC{
RPCCount: 1218785755,
Retransmissions: 374636,
AuthRefreshes: 1218815394,
},
V2Stats: nfs.V2Stats{
Null: 16,
GetAttr: 57,
SetAttr: 74,
Root: 52,
Lookup: 71,
ReadLink: 73,
Read: 45,
WrCache: 86,
Write: 0,
Create: 52,
Remove: 83,
Rename: 61,
Link: 17,
SymLink: 53,
MkDir: 50,
RmDir: 23,
ReadDir: 70,
FsStat: 82,
},
V3Stats: nfs.V3Stats{
Null: 0,
GetAttr: 1061909262,
SetAttr: 48906,
Lookup: 4077635,
Access: 117661341,
ReadLink: 5,
Read: 29391916,
Write: 2570425,
Create: 2993289,
MkDir: 590,
SymLink: 0,
MkNod: 0,
Remove: 7815,
RmDir: 15,
Rename: 1130,
Link: 0,
ReadDir: 3983,
ReadDirPlus: 92385,
FsStat: 13332,
FsInfo: 2,
PathConf: 1,
Commit: 23729},
ClientV4Stats: nfs.ClientV4Stats{
Null: 98,
Read: 51,
Write: 54,
Commit: 83,
Open: 85,
OpenConfirm: 23,
OpenNoattr: 24,
OpenDowngrade: 1,
Close: 28,
Setattr: 73,
FsInfo: 68,
Renew: 83,
SetClientID: 12,
SetClientIDConfirm: 84,
Lock: 39,
Lockt: 68,
Locku: 59,
Access: 58,
Getattr: 88,
Lookup: 29,
LookupRoot: 74,
Remove: 69,
Rename: 96,
Link: 21,
Symlink: 84,
Create: 15,
Pathconf: 53,
StatFs: 86,
ReadLink: 54,
ReadDir: 66,
ServerCaps: 56,
DelegReturn: 97,
GetACL: 36,
SetACL: 49,
FsLocations: 32,
ReleaseLockowner: 85,
Secinfo: 81,
FsidPresent: 11,
ExchangeID: 58,
CreateSession: 32,
DestroySession: 67,
Sequence: 13,
GetLeaseTime: 28,
ReclaimComplete: 35,
LayoutGet: 90,
GetDeviceInfo: 1,
LayoutCommit: 26,
LayoutReturn: 1337,
SecinfoNoName: 0,
TestStateID: 0,
FreeStateID: 0,
GetDeviceList: 0,
BindConnToSession: 0,
DestroyClientID: 0,
Seek: 0,
Allocate: 0,
DeAllocate: 0,
LayoutStats: 0,
Clone: 0,
},
},
}, {
name: "good file",
content: `net 18628 0 18628 6
rpc 4329785 0 4338291
proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2
proc3 22 1 4084749 29200 94754 32580 186 47747 7981 8639 0 6356 0 6962 0 7958 0 0 241 4 4 2 39
proc4 61 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
`,
stats: &nfs.ClientRPCStats{
Network: nfs.Network{
NetCount: 18628,
UDPCount: 0,
TCPCount: 18628,
TCPConnect: 6,
},
ClientRPC: nfs.ClientRPC{
RPCCount: 4329785,
Retransmissions: 0,
AuthRefreshes: 4338291,
},
V2Stats: nfs.V2Stats{
Null: 2,
GetAttr: 69,
SetAttr: 0,
Root: 0,
Lookup: 4410,
ReadLink: 0,
Read: 0,
WrCache: 0,
Write: 0,
Create: 0,
Remove: 0,
Rename: 0,
Link: 0,
SymLink: 0,
MkDir: 0,
RmDir: 0,
ReadDir: 99,
FsStat: 2,
},
V3Stats: nfs.V3Stats{
Null: 1,
GetAttr: 4084749,
SetAttr: 29200,
Lookup: 94754,
Access: 32580,
ReadLink: 186,
Read: 47747,
Write: 7981,
Create: 8639,
MkDir: 0,
SymLink: 6356,
MkNod: 0,
Remove: 6962,
RmDir: 0,
Rename: 7958,
Link: 0,
ReadDir: 0,
ReadDirPlus: 241,
FsStat: 4,
FsInfo: 4,
PathConf: 2,
Commit: 39,
},
ClientV4Stats: nfs.ClientV4Stats{
Null: 1,
Read: 0,
Write: 0,
Commit: 0,
Open: 0,
OpenConfirm: 0,
OpenNoattr: 0,
OpenDowngrade: 0,
Close: 0,
Setattr: 0,
FsInfo: 0,
Renew: 0,
SetClientID: 1,
SetClientIDConfirm: 1,
Lock: 0,
Lockt: 0,
Locku: 0,
Access: 0,
Getattr: 0,
Lookup: 0,
LookupRoot: 0,
Remove: 2,
Rename: 0,
Link: 0,
Symlink: 0,
Create: 0,
Pathconf: 0,
StatFs: 0,
ReadLink: 0,
ReadDir: 0,
ServerCaps: 0,
DelegReturn: 0,
GetACL: 0,
SetACL: 0,
FsLocations: 0,
ReleaseLockowner: 0,
Secinfo: 0,
FsidPresent: 0,
ExchangeID: 0,
CreateSession: 0,
DestroySession: 0,
Sequence: 0,
GetLeaseTime: 0,
ReclaimComplete: 0,
LayoutGet: 0,
GetDeviceInfo: 0,
LayoutCommit: 0,
LayoutReturn: 0,
SecinfoNoName: 0,
TestStateID: 0,
FreeStateID: 0,
GetDeviceList: 0,
BindConnToSession: 0,
DestroyClientID: 0,
Seek: 0,
Allocate: 0,
DeAllocate: 0,
LayoutStats: 0,
Clone: 0,
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
stats, err := nfs.ParseClientRPCStats(strings.NewReader(tt.content))
if tt.invalid && err == nil {
t.Fatal("expected an error, but none occurred")
}
if !tt.invalid && err != nil {
t.Fatalf("unexpected error: %v", err)
}
if want, have := tt.stats, stats; !reflect.DeepEqual(want, have) {
t.Fatalf("unexpected NFS stats:\nwant:\n%v\nhave:\n%v", want, have)
}
})
}
}