| // 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 TestNewNFSdServerRPCStats(t *testing.T) { |
| tests := []struct { |
| name string |
| content string |
| stats *nfs.ServerRPCStats |
| invalid bool |
| }{ |
| { |
| name: "invalid file", |
| content: "invalid", |
| invalid: true, |
| }, { |
| name: "good file", |
| content: `rc 0 6 18622 |
| fh 0 0 0 0 0 |
| io 157286400 0 |
| th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 |
| ra 32 0 0 0 0 0 0 0 0 0 0 0 |
| net 18628 0 18628 6 |
| rpc 18628 0 0 0 0 |
| proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 |
| proc3 22 2 112 0 2719 111 0 0 0 0 0 0 0 0 0 0 0 27 216 0 2 1 0 |
| proc4 2 2 10853 |
| proc4ops 72 0 0 0 1098 2 0 0 0 0 8179 5896 0 0 0 0 5900 0 0 2 0 2 0 9609 0 2 150 1272 0 0 0 1236 0 0 0 0 3 3 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.ServerRPCStats{ |
| ReplyCache: nfs.ReplyCache{ |
| Hits: 0, |
| Misses: 6, |
| NoCache: 18622, |
| }, |
| FileHandles: nfs.FileHandles{ |
| Stale: 0, |
| TotalLookups: 0, |
| AnonLookups: 0, |
| DirNoCache: 0, |
| NoDirNoCache: 0, |
| }, |
| InputOutput: nfs.InputOutput{ |
| Read: 157286400, |
| Write: 0, |
| }, |
| Threads: nfs.Threads{ |
| Threads: 8, |
| FullCnt: 0, |
| }, |
| ReadAheadCache: nfs.ReadAheadCache{ |
| CacheSize: 32, |
| CacheHistogram: []uint64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, |
| NotFound: 0, |
| }, |
| Network: nfs.Network{ |
| NetCount: 18628, |
| UDPCount: 0, |
| TCPCount: 18628, |
| TCPConnect: 6, |
| }, |
| ServerRPC: nfs.ServerRPC{ |
| RPCCount: 18628, |
| BadCnt: 0, |
| BadFmt: 0, |
| BadAuth: 0, |
| BadcInt: 0, |
| }, |
| 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: 2, |
| GetAttr: 112, |
| SetAttr: 0, |
| Lookup: 2719, |
| Access: 111, |
| ReadLink: 0, |
| Read: 0, |
| Write: 0, |
| Create: 0, |
| MkDir: 0, |
| SymLink: 0, |
| MkNod: 0, |
| Remove: 0, |
| RmDir: 0, |
| Rename: 0, |
| Link: 0, |
| ReadDir: 27, |
| ReadDirPlus: 216, |
| FsStat: 0, |
| FsInfo: 2, |
| PathConf: 1, |
| Commit: 0, |
| }, |
| ServerV4Stats: nfs.ServerV4Stats{ |
| Null: 2, |
| Compound: 10853, |
| }, |
| V4Ops: nfs.V4Ops{ |
| Op0Unused: 0, |
| Op1Unused: 0, |
| Op2Future: 0, |
| Access: 1098, |
| Close: 2, |
| Commit: 0, |
| Create: 0, |
| DelegPurge: 0, |
| DelegReturn: 0, |
| GetAttr: 8179, |
| GetFH: 5896, |
| Link: 0, |
| Lock: 0, |
| Lockt: 0, |
| Locku: 0, |
| Lookup: 5900, |
| LookupRoot: 0, |
| Nverify: 0, |
| Open: 2, |
| OpenAttr: 0, |
| OpenConfirm: 2, |
| OpenDgrd: 0, |
| PutFH: 9609, |
| PutPubFH: 0, |
| PutRootFH: 2, |
| Read: 150, |
| ReadDir: 1272, |
| ReadLink: 0, |
| Remove: 0, |
| Rename: 0, |
| Renew: 1236, |
| RestoreFH: 0, |
| SaveFH: 0, |
| SecInfo: 0, |
| SetAttr: 0, |
| Verify: 3, |
| Write: 3, |
| RelLockOwner: 0, |
| }, |
| }, |
| }, |
| } |
| |
| for _, tt := range tests { |
| t.Run(tt.name, func(t *testing.T) { |
| stats, err := nfs.ParseServerRPCStats(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) |
| } |
| }) |
| } |
| } |