2020import org .slf4j .Logger ;
2121import org .slf4j .LoggerFactory ;
2222
23- import static io .javaoperatorsdk .operator .api .reconciler .ReconcileUtils .compareResourceVersions ;
23+ import io .fabric8 .kubernetes .api .model .HasMetadata ;
24+ import io .fabric8 .kubernetes .api .model .ObjectMetaBuilder ;
25+ import io .fabric8 .kubernetes .api .model .PodBuilder ;
26+
2427import static org .assertj .core .api .Assertions .assertThat ;
2528import static org .junit .jupiter .api .Assertions .*;
2629
@@ -29,30 +32,110 @@ class ReconcileUtilsTest {
2932 private static final Logger log = LoggerFactory .getLogger (ReconcileUtilsTest .class );
3033
3134 @ Test
32- public void compareResourceVersionsTest () {
33- assertThat (compareResourceVersions ("11" , "22" )).isNegative ();
34- assertThat (compareResourceVersions ("22" , "11" )).isPositive ();
35- assertThat (compareResourceVersions ("1" , "1" )).isZero ();
36- assertThat (compareResourceVersions ("11" , "11" )).isZero ();
37- assertThat (compareResourceVersions ("123" , "2" )).isPositive ();
38- assertThat (compareResourceVersions ("3" , "211" )).isNegative ();
35+ public void validateAndCompareResourceVersionsTest () {
36+ assertThat (ReconcileUtils . validateAndCompareResourceVersions ("11" , "22" )).isNegative ();
37+ assertThat (ReconcileUtils . validateAndCompareResourceVersions ("22" , "11" )).isPositive ();
38+ assertThat (ReconcileUtils . validateAndCompareResourceVersions ("1" , "1" )).isZero ();
39+ assertThat (ReconcileUtils . validateAndCompareResourceVersions ("11" , "11" )).isZero ();
40+ assertThat (ReconcileUtils . validateAndCompareResourceVersions ("123" , "2" )).isPositive ();
41+ assertThat (ReconcileUtils . validateAndCompareResourceVersions ("3" , "211" )).isNegative ();
3942
4043 assertThrows (
41- NonComparableResourceVersionException .class , () -> compareResourceVersions ("aa" , "22" ));
44+ NonComparableResourceVersionException .class ,
45+ () -> ReconcileUtils .validateAndCompareResourceVersions ("aa" , "22" ));
4246 assertThrows (
43- NonComparableResourceVersionException .class , () -> compareResourceVersions ("11" , "ba" ));
47+ NonComparableResourceVersionException .class ,
48+ () -> ReconcileUtils .validateAndCompareResourceVersions ("11" , "ba" ));
4449 assertThrows (
45- NonComparableResourceVersionException .class , () -> compareResourceVersions ("" , "22" ));
50+ NonComparableResourceVersionException .class ,
51+ () -> ReconcileUtils .validateAndCompareResourceVersions ("" , "22" ));
4652 assertThrows (
47- NonComparableResourceVersionException .class , () -> compareResourceVersions ("11" , "" ));
53+ NonComparableResourceVersionException .class ,
54+ () -> ReconcileUtils .validateAndCompareResourceVersions ("11" , "" ));
4855 assertThrows (
49- NonComparableResourceVersionException .class , () -> compareResourceVersions ("01" , "123" ));
56+ NonComparableResourceVersionException .class ,
57+ () -> ReconcileUtils .validateAndCompareResourceVersions ("01" , "123" ));
5058 assertThrows (
51- NonComparableResourceVersionException .class , () -> compareResourceVersions ("123" , "01" ));
59+ NonComparableResourceVersionException .class ,
60+ () -> ReconcileUtils .validateAndCompareResourceVersions ("123" , "01" ));
5261 assertThrows (
53- NonComparableResourceVersionException .class , () -> compareResourceVersions ("3213" , "123a" ));
62+ NonComparableResourceVersionException .class ,
63+ () -> ReconcileUtils .validateAndCompareResourceVersions ("3213" , "123a" ));
5464 assertThrows (
55- NonComparableResourceVersionException .class , () -> compareResourceVersions ("321" , "123a" ));
65+ NonComparableResourceVersionException .class ,
66+ () -> ReconcileUtils .validateAndCompareResourceVersions ("321" , "123a" ));
67+ }
68+
69+ @ Test
70+ public void compareResourceVersionsWithStrings () {
71+ // Test equal versions
72+ assertThat (ReconcileUtils .compareResourceVersions ("1" , "1" )).isZero ();
73+ assertThat (ReconcileUtils .compareResourceVersions ("123" , "123" )).isZero ();
74+
75+ // Test different lengths - shorter version is less than longer version
76+ assertThat (ReconcileUtils .compareResourceVersions ("1" , "12" )).isNegative ();
77+ assertThat (ReconcileUtils .compareResourceVersions ("12" , "1" )).isPositive ();
78+ assertThat (ReconcileUtils .compareResourceVersions ("99" , "100" )).isNegative ();
79+ assertThat (ReconcileUtils .compareResourceVersions ("100" , "99" )).isPositive ();
80+ assertThat (ReconcileUtils .compareResourceVersions ("9" , "100" )).isNegative ();
81+ assertThat (ReconcileUtils .compareResourceVersions ("100" , "9" )).isPositive ();
82+
83+ // Test same length - lexicographic comparison
84+ assertThat (ReconcileUtils .compareResourceVersions ("1" , "2" )).isNegative ();
85+ assertThat (ReconcileUtils .compareResourceVersions ("2" , "1" )).isPositive ();
86+ assertThat (ReconcileUtils .compareResourceVersions ("11" , "12" )).isNegative ();
87+ assertThat (ReconcileUtils .compareResourceVersions ("12" , "11" )).isPositive ();
88+ assertThat (ReconcileUtils .compareResourceVersions ("99" , "100" )).isNegative ();
89+ assertThat (ReconcileUtils .compareResourceVersions ("100" , "99" )).isPositive ();
90+ assertThat (ReconcileUtils .compareResourceVersions ("123" , "124" )).isNegative ();
91+ assertThat (ReconcileUtils .compareResourceVersions ("124" , "123" )).isPositive ();
92+
93+ // Test with non-numeric strings (algorithm should still work character-wise)
94+ assertThat (ReconcileUtils .compareResourceVersions ("a" , "b" )).isNegative ();
95+ assertThat (ReconcileUtils .compareResourceVersions ("b" , "a" )).isPositive ();
96+ assertThat (ReconcileUtils .compareResourceVersions ("abc" , "abd" )).isNegative ();
97+ assertThat (ReconcileUtils .compareResourceVersions ("abd" , "abc" )).isPositive ();
98+
99+ // Test edge cases with larger numbers
100+ assertThat (ReconcileUtils .compareResourceVersions ("1234567890" , "1234567891" )).isNegative ();
101+ assertThat (ReconcileUtils .compareResourceVersions ("1234567891" , "1234567890" )).isPositive ();
102+ }
103+
104+ @ Test
105+ public void compareResourceVersionsWithHasMetadata () {
106+ // Test equal versions
107+ HasMetadata resource1 = createResourceWithVersion ("123" );
108+ HasMetadata resource2 = createResourceWithVersion ("123" );
109+ assertThat (ReconcileUtils .compareResourceVersions (resource1 , resource2 )).isZero ();
110+
111+ // Test different lengths
112+ resource1 = createResourceWithVersion ("1" );
113+ resource2 = createResourceWithVersion ("12" );
114+ assertThat (ReconcileUtils .compareResourceVersions (resource1 , resource2 )).isNegative ();
115+ assertThat (ReconcileUtils .compareResourceVersions (resource2 , resource1 )).isPositive ();
116+
117+ // Test same length, different values
118+ resource1 = createResourceWithVersion ("100" );
119+ resource2 = createResourceWithVersion ("200" );
120+ assertThat (ReconcileUtils .compareResourceVersions (resource1 , resource2 )).isNegative ();
121+ assertThat (ReconcileUtils .compareResourceVersions (resource2 , resource1 )).isPositive ();
122+
123+ // Test realistic Kubernetes resource versions
124+ resource1 = createResourceWithVersion ("12345" );
125+ resource2 = createResourceWithVersion ("12346" );
126+ assertThat (ReconcileUtils .compareResourceVersions (resource1 , resource2 )).isNegative ();
127+ assertThat (ReconcileUtils .compareResourceVersions (resource2 , resource1 )).isPositive ();
128+ }
129+
130+ private HasMetadata createResourceWithVersion (String resourceVersion ) {
131+ return new PodBuilder ()
132+ .withMetadata (
133+ new ObjectMetaBuilder ()
134+ .withName ("test-pod" )
135+ .withNamespace ("default" )
136+ .withResourceVersion (resourceVersion )
137+ .build ())
138+ .build ();
56139 }
57140
58141 // naive performance test that compares the work case scenario for the parsing and non-parsing
@@ -63,7 +146,7 @@ public void compareResourcePerformanceTest() {
63146 var execNum = 30000000 ;
64147 var startTime = System .currentTimeMillis ();
65148 for (int i = 0 ; i < execNum ; i ++) {
66- var res = compareResourceVersions ("123456788" , "123456789" );
149+ var res = ReconcileUtils . compareResourceVersions ("123456788" , "123456789" );
67150 }
68151 var dur1 = System .currentTimeMillis () - startTime ;
69152 log .info ("Duration without parsing: {}" , dur1 );
0 commit comments