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  }