Skip to content

Commit affbeb8

Browse files
committed
chore: clean up tests
1 parent 43f111b commit affbeb8

File tree

4 files changed

+133
-128
lines changed

4 files changed

+133
-128
lines changed

janitor/api/v1alpha1/gpureset_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type GPUSelector struct {
3232
// PCIBusIDs is a list of GPU PCI bus IDs.
3333
// Format: "domain:bus:device.function" (e.g., "0000:01:00.0").
3434
// +optional
35+
//nolint:lll // kubebuilder validation pattern
3536
// +kubebuilder:validation:items:Pattern="^[0-9a-fA-F]{4}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}\\.[0-9a-fA-F]{1}$"
3637
PCIBusIDs []string `json:"pciBusIDs,omitempty"`
3738
}

janitor/api/v1alpha1/rebootnode_types_test.go

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -222,18 +222,45 @@ func TestRebootNode_SetCompletionTime(t *testing.T) {
222222
}
223223

224224
func TestRebootNode_StatusFields(t *testing.T) {
225-
t.Run("retry count and consecutive failures", func(t *testing.T) {
225+
t.Run("status fields are initialized to zero values", func(t *testing.T) {
226226
rn := &RebootNode{}
227227

228-
// Initial values
228+
// Verify default zero values for status fields
229229
assert.Equal(t, int32(0), rn.Status.RetryCount)
230230
assert.Equal(t, int32(0), rn.Status.ConsecutiveFailures)
231+
assert.Nil(t, rn.Status.StartTime)
232+
assert.Nil(t, rn.Status.CompletionTime)
233+
assert.Empty(t, rn.Status.Conditions)
234+
})
235+
236+
t.Run("status fields can be set and retrieved independently", func(t *testing.T) {
237+
rn := &RebootNode{}
238+
239+
// Set start time
240+
rn.SetStartTime()
241+
require.NotNil(t, rn.Status.StartTime)
231242

232-
// Modify values
233-
rn.Status.RetryCount = 5
234-
rn.Status.ConsecutiveFailures = 3
243+
// Increment retry count
244+
rn.Status.RetryCount++
245+
assert.Equal(t, int32(1), rn.Status.RetryCount)
246+
247+
// Increment consecutive failures
248+
rn.Status.ConsecutiveFailures++
249+
assert.Equal(t, int32(1), rn.Status.ConsecutiveFailures)
250+
251+
// Set conditions
252+
rn.SetInitialConditions()
253+
assert.NotEmpty(t, rn.Status.Conditions)
254+
255+
// Set completion time
256+
rn.SetCompletionTime()
257+
require.NotNil(t, rn.Status.CompletionTime)
235258

236-
assert.Equal(t, int32(5), rn.Status.RetryCount)
237-
assert.Equal(t, int32(3), rn.Status.ConsecutiveFailures)
259+
// Verify all fields are set correctly
260+
assert.Equal(t, int32(1), rn.Status.RetryCount)
261+
assert.Equal(t, int32(1), rn.Status.ConsecutiveFailures)
262+
assert.NotNil(t, rn.Status.StartTime)
263+
assert.NotNil(t, rn.Status.CompletionTime)
264+
assert.Len(t, rn.Status.Conditions, 2) // SignalSent and NodeReady
238265
})
239266
}

janitor/pkg/config/config_test.go

Lines changed: 48 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -199,46 +199,54 @@ global:
199199
assert.Equal(t, metav1.LabelSelectorOpExists, config.RebootNode.NodeExclusions[1].MatchExpressions[0].Operator)
200200
}
201201

202-
func TestConfig_Structures(t *testing.T) {
203-
// Test that all config structures can be instantiated
204-
config := &Config{
205-
Global: GlobalConfig{
206-
Timeout: 10 * time.Minute,
207-
ManualMode: true,
208-
Nodes: NodeConfig{
209-
Exclusions: []metav1.LabelSelector{
210-
{
211-
MatchLabels: map[string]string{"test": "value"},
212-
},
213-
},
202+
func TestConfig_ZeroValues(t *testing.T) {
203+
t.Run("zero value config has expected defaults", func(t *testing.T) {
204+
config := &Config{}
205+
206+
// Global config zero values
207+
assert.Equal(t, time.Duration(0), config.Global.Timeout)
208+
assert.False(t, config.Global.ManualMode)
209+
assert.Empty(t, config.Global.Nodes.Exclusions)
210+
211+
// RebootNode config zero values
212+
assert.False(t, config.RebootNode.Enabled)
213+
assert.False(t, config.RebootNode.ManualMode)
214+
assert.Equal(t, time.Duration(0), config.RebootNode.Timeout)
215+
assert.Empty(t, config.RebootNode.NodeExclusions)
216+
217+
// TerminateNode config zero values
218+
assert.False(t, config.TerminateNode.Enabled)
219+
assert.False(t, config.TerminateNode.ManualMode)
220+
assert.Equal(t, time.Duration(0), config.TerminateNode.Timeout)
221+
assert.Empty(t, config.TerminateNode.NodeExclusions)
222+
})
223+
224+
t.Run("controller configs are independent", func(t *testing.T) {
225+
config := &Config{
226+
RebootNode: RebootNodeControllerConfig{
227+
Enabled: true,
228+
ManualMode: false,
229+
Timeout: 5 * time.Minute,
214230
},
215-
},
216-
RebootNode: RebootNodeControllerConfig{
217-
Enabled: true,
218-
ManualMode: false,
219-
Timeout: 5 * time.Minute,
220-
NodeExclusions: []metav1.LabelSelector{
221-
{
222-
MatchLabels: map[string]string{"test": "value"},
223-
},
231+
TerminateNode: TerminateNodeControllerConfig{
232+
Enabled: false,
233+
ManualMode: true,
234+
Timeout: 10 * time.Minute,
224235
},
225-
},
226-
TerminateNode: TerminateNodeControllerConfig{
227-
Enabled: false,
228-
ManualMode: true,
229-
Timeout: 3 * time.Minute,
230-
NodeExclusions: []metav1.LabelSelector{
231-
{
232-
MatchLabels: map[string]string{"test": "value"},
233-
},
234-
},
235-
},
236-
}
237-
238-
// Verify basic structure
239-
assert.NotNil(t, config)
240-
assert.Equal(t, 10*time.Minute, config.Global.Timeout)
241-
assert.True(t, config.Global.ManualMode)
242-
assert.True(t, config.RebootNode.Enabled)
243-
assert.False(t, config.TerminateNode.Enabled)
236+
}
237+
238+
// Verify each controller can have different settings
239+
assert.True(t, config.RebootNode.Enabled)
240+
assert.False(t, config.RebootNode.ManualMode)
241+
assert.Equal(t, 5*time.Minute, config.RebootNode.Timeout)
242+
243+
assert.False(t, config.TerminateNode.Enabled)
244+
assert.True(t, config.TerminateNode.ManualMode)
245+
assert.Equal(t, 10*time.Minute, config.TerminateNode.Timeout)
246+
247+
// Modifying one doesn't affect the other
248+
config.RebootNode.Timeout = 15 * time.Minute
249+
assert.Equal(t, 15*time.Minute, config.RebootNode.Timeout)
250+
assert.Equal(t, 10*time.Minute, config.TerminateNode.Timeout)
251+
})
244252
}

janitor/pkg/metrics/metrics_test.go

Lines changed: 50 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@ import (
1818
"testing"
1919
"time"
2020

21-
"github.com/prometheus/client_golang/prometheus"
22-
dto "github.com/prometheus/client_model/go"
2321
"github.com/stretchr/testify/assert"
24-
"github.com/stretchr/testify/require"
2522
)
2623

2724
func TestNewActionMetrics(t *testing.T) {
@@ -134,90 +131,62 @@ func TestMetricsConstants(t *testing.T) {
134131
}
135132

136133
func TestActionMetrics_CounterIncrement(t *testing.T) {
137-
// Create a test registry to verify metrics behavior
138-
testRegistry := prometheus.NewRegistry()
139-
140-
// Create new counter for testing
141-
testCounter := prometheus.NewCounterVec(
142-
prometheus.CounterOpts{
143-
Name: "test_janitor_actions_count",
144-
Help: "Test counter for janitor actions",
145-
},
146-
[]string{"action_type", "status", "node"},
147-
)
148-
149-
testRegistry.MustRegister(testCounter)
150-
151-
// Increment the counter multiple times
152-
testCounter.With(prometheus.Labels{
153-
"action_type": ActionTypeReboot,
154-
"status": StatusStarted,
155-
"node": "test-node",
156-
}).Inc()
157-
158-
testCounter.With(prometheus.Labels{
159-
"action_type": ActionTypeReboot,
160-
"status": StatusStarted,
161-
"node": "test-node",
162-
}).Inc()
163-
164-
// Gather metrics
165-
metricFamilies, err := testRegistry.Gather()
166-
require.NoError(t, err)
167-
require.Len(t, metricFamilies, 1)
168-
169-
// Verify the counter was incremented
170-
metricFamily := metricFamilies[0]
171-
assert.Equal(t, "test_janitor_actions_count", *metricFamily.Name)
172-
require.Len(t, metricFamily.Metric, 1)
173-
174-
// Check that the counter value is 2
175-
counter := metricFamily.Metric[0]
176-
assert.Equal(t, float64(2), *counter.Counter.Value)
177-
}
178-
179-
func TestActionMetrics_HistogramObservation(t *testing.T) {
180-
// Create a test registry to verify histogram behavior
181-
testRegistry := prometheus.NewRegistry()
182-
183-
// Create new histogram for testing
184-
testHistogram := prometheus.NewHistogramVec(
185-
prometheus.HistogramOpts{
186-
Name: "test_janitor_action_mttr_seconds",
187-
Help: "Test histogram for janitor action MTTR",
188-
Buckets: prometheus.ExponentialBuckets(10, 2, 5),
189-
},
190-
[]string{"action_type"},
191-
)
192-
193-
testRegistry.MustRegister(testHistogram)
134+
t.Run("IncActionCount increments counter", func(t *testing.T) {
135+
// Create metrics instance
136+
m := &ActionMetrics{}
137+
138+
// Call the actual business logic
139+
m.IncActionCount(ActionTypeReboot, StatusStarted, "test-node-1")
140+
m.IncActionCount(ActionTypeReboot, StatusSucceeded, "test-node-1")
141+
m.IncActionCount(ActionTypeTerminate, StatusStarted, "test-node-2")
142+
143+
// Note: We can't easily verify the exact counter values without accessing
144+
// the internal prometheus registry, but we can verify the method executes
145+
// without panic or error. This test verifies the method signature and basic
146+
// functionality.
147+
})
194148

195-
// Record some observations
196-
testHistogram.With(prometheus.Labels{
197-
"action_type": ActionTypeReboot,
198-
}).Observe(30.0) // 30 seconds
149+
t.Run("global IncActionCount function works", func(t *testing.T) {
150+
// Test the convenience function that uses GlobalMetrics
151+
IncActionCount(ActionTypeReboot, StatusStarted, "global-test-node")
152+
IncActionCount(ActionTypeReboot, StatusSucceeded, "global-test-node")
153+
IncActionCount(ActionTypeReboot, StatusFailed, "global-test-node")
199154

200-
testHistogram.With(prometheus.Labels{
201-
"action_type": ActionTypeReboot,
202-
}).Observe(120.0) // 2 minutes
155+
// Verify different action types
156+
IncActionCount(ActionTypeTerminate, StatusStarted, "global-test-node-2")
157+
})
158+
}
203159

204-
// Gather metrics
205-
metricFamilies, err := testRegistry.Gather()
206-
require.NoError(t, err)
207-
require.Len(t, metricFamilies, 1)
160+
func TestActionMetrics_HistogramObservation(t *testing.T) {
161+
t.Run("RecordActionMTTR records duration", func(t *testing.T) {
162+
// Create metrics instance
163+
m := &ActionMetrics{}
164+
165+
// Call the actual business logic with various durations
166+
m.RecordActionMTTR(ActionTypeReboot, 30*time.Second)
167+
m.RecordActionMTTR(ActionTypeReboot, 2*time.Minute)
168+
m.RecordActionMTTR(ActionTypeReboot, 5*time.Minute)
169+
170+
// Record different action types
171+
m.RecordActionMTTR(ActionTypeTerminate, 10*time.Minute)
172+
173+
// Note: We can't easily verify the exact histogram values without accessing
174+
// the internal prometheus registry, but we can verify the method executes
175+
// without panic or error. This test verifies the method signature and basic
176+
// functionality.
177+
})
208178

209-
// Verify the histogram was updated
210-
metricFamily := metricFamilies[0]
211-
assert.Equal(t, "test_janitor_action_mttr_seconds", *metricFamily.Name)
212-
assert.Equal(t, dto.MetricType_HISTOGRAM, *metricFamily.Type)
213-
require.Len(t, metricFamily.Metric, 1)
179+
t.Run("global RecordActionMTTR function works", func(t *testing.T) {
180+
// Test the convenience function that uses GlobalMetrics
181+
RecordActionMTTR(ActionTypeReboot, 45*time.Second)
182+
RecordActionMTTR(ActionTypeTerminate, 3*time.Minute)
214183

215-
// Check histogram sample count
216-
histogram := metricFamily.Metric[0].Histogram
217-
assert.Equal(t, uint64(2), *histogram.SampleCount)
184+
// Test with very short duration
185+
RecordActionMTTR(ActionTypeReboot, 5*time.Second)
218186

219-
// Check sum of observations (30 + 120 = 150)
220-
assert.Equal(t, float64(150), *histogram.SampleSum)
187+
// Test with longer duration
188+
RecordActionMTTR(ActionTypeTerminate, 15*time.Minute)
189+
})
221190
}
222191

223192
func TestGlobalMetrics_Initialization(t *testing.T) {

0 commit comments

Comments
 (0)