From 44a0d04b963163ad23149e6ce41d2f0011631885 Mon Sep 17 00:00:00 2001 From: RainbowMango Date: Thu, 12 Dec 2019 20:05:28 +0800 Subject: [PATCH] Add a unit test guarantees ClearState will fully clear a collector. --- .../component-base/metrics/collector.go | 1 + .../component-base/metrics/collector_test.go | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/staging/src/k8s.io/component-base/metrics/collector.go b/staging/src/k8s.io/component-base/metrics/collector.go index 1f7ecb3de49..090342e1623 100644 --- a/staging/src/k8s.io/component-base/metrics/collector.go +++ b/staging/src/k8s.io/component-base/metrics/collector.go @@ -175,6 +175,7 @@ func (bsc *BaseStableCollector) ClearState() { bsc.descriptors = nil bsc.registrable = nil bsc.hidden = nil + bsc.self = nil } // HiddenMetrics tells the list of hidden metrics with fqName. diff --git a/staging/src/k8s.io/component-base/metrics/collector_test.go b/staging/src/k8s.io/component-base/metrics/collector_test.go index 03f33067b04..6f7af42458a 100644 --- a/staging/src/k8s.io/component-base/metrics/collector_test.go +++ b/staging/src/k8s.io/component-base/metrics/collector_test.go @@ -18,6 +18,7 @@ package metrics import ( "fmt" + "reflect" "strings" "testing" @@ -134,3 +135,36 @@ func TestInvalidCustomCollector(t *testing.T) { }) } } + +// TestCustomCollectorClearState guarantees `ClearState()` will fully clear a collector. +// It is necessary because we may forget to clear some new-added fields in the future. +func TestCustomCollectorClearState(t *testing.T) { + var currentVersion = parseVersion(apimachineryversion.Info{ + Major: "1", + Minor: "17", + GitVersion: "v1.17.0-alpha-1.12345", + }) + + var ( + alphaDesc = NewDesc("metric_alpha", "alpha metric", []string{"name"}, nil, + ALPHA, "") + stableDesc = NewDesc("metric_stable", "stable metrics", []string{"name"}, nil, + STABLE, "") + deprecatedDesc = NewDesc("metric_deprecated", "stable deprecated metrics", []string{"name"}, nil, + STABLE, "1.17.0") + hiddenDesc = NewDesc("metric_hidden", "stable hidden metrics", []string{"name"}, nil, + STABLE, "1.16.0") + ) + + benchmarkA := newTestCustomCollector(alphaDesc, stableDesc, deprecatedDesc, hiddenDesc) + benchmarkB := newTestCustomCollector(alphaDesc, stableDesc, deprecatedDesc, hiddenDesc) + + if benchmarkA.Create(¤tVersion, benchmarkA) == false { + t.Fatal("collector should be created") + } + benchmarkA.ClearState() + + if !reflect.DeepEqual(*benchmarkA, *benchmarkB) { + t.Fatal("custom collector state hasn't be fully cleared") + } +}