k8s.io/kubernetes@v1.29.3/pkg/kubelet/winstats/perfcounters_test.go (about) 1 //go:build windows 2 // +build windows 3 4 /* 5 Copyright 2023 The Kubernetes Authors. 6 7 Licensed under the Apache License, Version 2.0 (the "License"); 8 you may not use this file except in compliance with the License. 9 You may obtain a copy of the License at 10 11 http://www.apache.org/licenses/LICENSE-2.0 12 13 Unless required by applicable law or agreed to in writing, software 14 distributed under the License is distributed on an "AS IS" BASIS, 15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 See the License for the specific language governing permissions and 17 limitations under the License. 18 */ 19 20 package winstats 21 22 import ( 23 "testing" 24 "time" 25 26 "k8s.io/apimachinery/pkg/util/wait" 27 ) 28 29 func TestPerfCounter(t *testing.T) { 30 testCases := map[string]struct { 31 counter string 32 skipCheck bool 33 expectErr bool 34 expectedErrMsg string 35 }{ 36 "CPU Query": { 37 counter: cpuQuery, 38 }, 39 "Memory Prvate Working Set Query": { 40 counter: memoryPrivWorkingSetQuery, 41 }, 42 "Memory Committed Bytes Query": { 43 counter: memoryCommittedBytesQuery, 44 }, 45 "Net Adapter Packets Received/sec Query": { 46 counter: packetsReceivedPerSecondQuery, 47 skipCheck: true, 48 }, 49 "Net Adapter Packets Sent/sec Query": { 50 counter: packetsSentPerSecondQuery, 51 skipCheck: true, 52 }, 53 "Net Adapter Bytes Received/sec Query": { 54 counter: bytesReceivedPerSecondQuery, 55 skipCheck: true, 56 }, 57 "Net Adapter Bytes Sent/sec Query": { 58 counter: bytesSentPerSecondQuery, 59 skipCheck: true, 60 }, 61 "Net Adapter Packets Received Discarded Query": { 62 counter: packetsReceivedDiscardedQuery, 63 skipCheck: true, 64 }, 65 "Net Adapter Packets Received Errors Query": { 66 counter: packetsReceivedErrorsQuery, 67 skipCheck: true, 68 }, 69 "Net Adapter Packets Outbound Discarded Query": { 70 counter: packetsOutboundDiscardedQuery, 71 skipCheck: true, 72 }, 73 "Net Adapter Packets Outbound Errors Query": { 74 counter: packetsOutboundErrorsQuery, 75 skipCheck: true, 76 }, 77 "Invalid Query": { 78 counter: "foo", 79 expectErr: true, 80 expectedErrMsg: "unable to add process counter: foo. Error code is c0000bc0", 81 }, 82 } 83 84 for name, tc := range testCases { 85 t.Run(name, func(t *testing.T) { 86 counter, err := newPerfCounter(tc.counter) 87 if tc.expectErr { 88 if err == nil || err.Error() != tc.expectedErrMsg { 89 t.Fatalf("expected error message `%s` but got `%v`", tc.expectedErrMsg, err) 90 } 91 return 92 } 93 94 // There are some counters that we can't expect to see any non-zero values, like the 95 // networking-related counters. 96 if tc.skipCheck { 97 return 98 } 99 100 // Wait until we get a non-zero perf counter data. 101 if pollErr := wait.Poll(100*time.Millisecond, 5*perfCounterUpdatePeriod, func() (bool, error) { 102 data, err := counter.getData() 103 if err != nil { 104 return false, err 105 } 106 107 if data != 0 { 108 return true, nil 109 } 110 111 return false, nil 112 }); pollErr != nil { 113 t.Fatalf("Encountered error: `%v'", pollErr) 114 return 115 } 116 117 // Check that we have at least one non-zero value in the data list. 118 if pollErr := wait.Poll(100*time.Millisecond, 5*perfCounterUpdatePeriod, func() (bool, error) { 119 dataList, err := counter.getDataList() 120 if err != nil { 121 return false, err 122 } 123 124 for _, value := range dataList { 125 if value != 0 { 126 return true, nil 127 } 128 } 129 130 return false, nil 131 }); pollErr != nil { 132 t.Fatalf("Encountered error: `%v'", pollErr) 133 } 134 }) 135 } 136 }