| // 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) |
| } |
| }) |
| } |
| } |