...

Source file src/k8s.io/component-base/metrics/desc_test.go

Documentation: k8s.io/component-base/metrics

     1  /*
     2  Copyright 2019 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package metrics
    18  
    19  import (
    20  	"reflect"
    21  	"strings"
    22  	"testing"
    23  
    24  	"k8s.io/apimachinery/pkg/version"
    25  )
    26  
    27  func TestDescCreate(t *testing.T) {
    28  	currentVersion := parseVersion(version.Info{
    29  		Major:      "1",
    30  		Minor:      "17",
    31  		GitVersion: "v1.17.0-alpha-1.12345",
    32  	})
    33  
    34  	var tests = []struct {
    35  		name              string
    36  		fqName            string
    37  		help              string
    38  		stabilityLevel    StabilityLevel
    39  		deprecatedVersion string
    40  
    41  		shouldCreate          bool
    42  		expectedAnnotatedHelp string
    43  	}{
    44  		{
    45  			name:                  "alpha descriptor should be created",
    46  			fqName:                "normal_alpha_descriptor",
    47  			help:                  "this is an alpha descriptor",
    48  			stabilityLevel:        ALPHA,
    49  			deprecatedVersion:     "",
    50  			shouldCreate:          true,
    51  			expectedAnnotatedHelp: "[ALPHA] this is an alpha descriptor",
    52  		},
    53  		{
    54  			name:                  "stable descriptor should be created",
    55  			fqName:                "normal_stable_descriptor",
    56  			help:                  "this is a stable descriptor",
    57  			stabilityLevel:        STABLE,
    58  			deprecatedVersion:     "",
    59  			shouldCreate:          true,
    60  			expectedAnnotatedHelp: "[STABLE] this is a stable descriptor",
    61  		},
    62  		{
    63  			name:                  "deprecated descriptor should be created",
    64  			fqName:                "deprecated_stable_descriptor",
    65  			help:                  "this is a deprecated descriptor",
    66  			stabilityLevel:        STABLE,
    67  			deprecatedVersion:     "1.17.0",
    68  			shouldCreate:          true,
    69  			expectedAnnotatedHelp: "[STABLE] (Deprecated since 1.17.0) this is a deprecated descriptor",
    70  		},
    71  		{
    72  			name:                  "hidden descriptor should not be created",
    73  			fqName:                "hidden_stable_descriptor",
    74  			help:                  "this is a hidden descriptor",
    75  			stabilityLevel:        STABLE,
    76  			deprecatedVersion:     "1.16.0",
    77  			shouldCreate:          false,
    78  			expectedAnnotatedHelp: "this is a hidden descriptor", // hidden descriptor shall not be annotated.
    79  		},
    80  	}
    81  
    82  	for _, test := range tests {
    83  		tc := test
    84  		t.Run(tc.name, func(t *testing.T) {
    85  			desc := NewDesc(tc.fqName, tc.help, nil, nil, tc.stabilityLevel, tc.deprecatedVersion)
    86  
    87  			if desc.IsCreated() {
    88  				t.Fatal("Descriptor should not be created by default.")
    89  			}
    90  
    91  			desc.create(&currentVersion)
    92  			desc.create(&currentVersion) // we can safely create a descriptor over and over again.
    93  
    94  			if desc.IsCreated() != tc.shouldCreate {
    95  				t.Fatalf("expected create state: %v, but got: %v", tc.shouldCreate, desc.IsCreated())
    96  			}
    97  
    98  			if !strings.Contains(desc.String(), tc.expectedAnnotatedHelp) {
    99  				t.Fatalf("expected annotated help: %s, but not in descriptor: %s", tc.expectedAnnotatedHelp, desc.String())
   100  			}
   101  		})
   102  	}
   103  }
   104  
   105  func TestDescClearState(t *testing.T) {
   106  	currentVersion := parseVersion(version.Info{
   107  		Major:      "1",
   108  		Minor:      "17",
   109  		GitVersion: "v1.17.0-alpha-1.12345",
   110  	})
   111  
   112  	var tests = []struct {
   113  		name              string
   114  		fqName            string
   115  		help              string
   116  		stabilityLevel    StabilityLevel
   117  		deprecatedVersion string
   118  	}{
   119  		{
   120  			name:              "alpha descriptor",
   121  			fqName:            "normal_alpha_descriptor",
   122  			help:              "this is an alpha descriptor",
   123  			stabilityLevel:    ALPHA,
   124  			deprecatedVersion: "",
   125  		},
   126  		{
   127  			name:              "stable descriptor",
   128  			fqName:            "normal_stable_descriptor",
   129  			help:              "this is a stable descriptor",
   130  			stabilityLevel:    STABLE,
   131  			deprecatedVersion: "",
   132  		},
   133  		{
   134  			name:              "deprecated descriptor",
   135  			fqName:            "deprecated_stable_descriptor",
   136  			help:              "this is a deprecated descriptor",
   137  			stabilityLevel:    STABLE,
   138  			deprecatedVersion: "1.17.0",
   139  		},
   140  		{
   141  			name:              "hidden descriptor",
   142  			fqName:            "hidden_stable_descriptor",
   143  			help:              "this is a hidden descriptor",
   144  			stabilityLevel:    STABLE,
   145  			deprecatedVersion: "1.16.0",
   146  		},
   147  	}
   148  
   149  	for _, test := range tests {
   150  		tc := test
   151  		t.Run(tc.name, func(t *testing.T) {
   152  			descA := NewDesc(tc.fqName, tc.help, nil, nil, tc.stabilityLevel, tc.deprecatedVersion)
   153  			descB := NewDesc(tc.fqName, tc.help, nil, nil, tc.stabilityLevel, tc.deprecatedVersion)
   154  
   155  			descA.create(&currentVersion)
   156  			descA.ClearState()
   157  
   158  			// create
   159  			//nolint:govet // it's okay to compare sync.RWMutex, it's empty
   160  			if !reflect.DeepEqual(*descA, *descB) {
   161  				t.Fatal("descriptor state hasn't be cleaned up")
   162  			}
   163  		})
   164  	}
   165  }
   166  

View as plain text