k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/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 // TODO: remove skip once the test flake for CPU Query has been fixed. 39 skipCheck: true, 40 }, 41 "Memory Prvate Working Set Query": { 42 counter: memoryPrivWorkingSetQuery, 43 }, 44 "Memory Committed Bytes Query": { 45 counter: memoryCommittedBytesQuery, 46 }, 47 "Net Adapter Packets Received/sec Query": { 48 counter: packetsReceivedPerSecondQuery, 49 skipCheck: true, 50 }, 51 "Net Adapter Packets Sent/sec Query": { 52 counter: packetsSentPerSecondQuery, 53 skipCheck: true, 54 }, 55 "Net Adapter Bytes Received/sec Query": { 56 counter: bytesReceivedPerSecondQuery, 57 skipCheck: true, 58 }, 59 "Net Adapter Bytes Sent/sec Query": { 60 counter: bytesSentPerSecondQuery, 61 skipCheck: true, 62 }, 63 "Net Adapter Packets Received Discarded Query": { 64 counter: packetsReceivedDiscardedQuery, 65 skipCheck: true, 66 }, 67 "Net Adapter Packets Received Errors Query": { 68 counter: packetsReceivedErrorsQuery, 69 skipCheck: true, 70 }, 71 "Net Adapter Packets Outbound Discarded Query": { 72 counter: packetsOutboundDiscardedQuery, 73 skipCheck: true, 74 }, 75 "Net Adapter Packets Outbound Errors Query": { 76 counter: packetsOutboundErrorsQuery, 77 skipCheck: true, 78 }, 79 "Invalid Query": { 80 counter: "foo", 81 expectErr: true, 82 expectedErrMsg: "unable to add process counter: foo. Error code is c0000bc0", 83 }, 84 } 85 86 for name, tc := range testCases { 87 t.Run(name, func(t *testing.T) { 88 counter, err := newPerfCounter(tc.counter) 89 if tc.expectErr { 90 if err == nil || err.Error() != tc.expectedErrMsg { 91 t.Fatalf("expected error message `%s` but got `%v`", tc.expectedErrMsg, err) 92 } 93 return 94 } 95 96 // There are some counters that we can't expect to see any non-zero values, like the 97 // networking-related counters. 98 if tc.skipCheck { 99 return 100 } 101 102 // Wait until we get a non-zero perf counter data. 103 if pollErr := wait.Poll(100*time.Millisecond, 5*perfCounterUpdatePeriod, func() (bool, error) { 104 data, err := counter.getData() 105 if err != nil { 106 return false, err 107 } 108 109 if data != 0 { 110 return true, nil 111 } 112 113 return false, nil 114 }); pollErr != nil { 115 t.Fatalf("Encountered error: `%v'", pollErr) 116 return 117 } 118 119 // Check that we have at least one non-zero value in the data list. 120 if pollErr := wait.Poll(100*time.Millisecond, 5*perfCounterUpdatePeriod, func() (bool, error) { 121 dataList, err := counter.getDataList() 122 if err != nil { 123 return false, err 124 } 125 126 for _, value := range dataList { 127 if value != 0 { 128 return true, nil 129 } 130 } 131 132 return false, nil 133 }); pollErr != nil { 134 t.Fatalf("Encountered error: `%v'", pollErr) 135 } 136 }) 137 } 138 }