...

Source file src/k8s.io/kubernetes/pkg/kubelet/winstats/perfcounters_test.go

Documentation: k8s.io/kubernetes/pkg/kubelet/winstats

     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  }
   137  

View as plain text