committed by
GitHub
12 changed files with 276 additions and 16 deletions
@ -0,0 +1,41 @@ |
|||
/** |
|||
* Copyright © 2016-2026 The Thingsboard Authors |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0
|
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
package org.thingsboard.server.edge; |
|||
|
|||
import org.junit.Assert; |
|||
import org.junit.Test; |
|||
import org.thingsboard.edge.rpc.EdgeVersionComparator; |
|||
import org.thingsboard.server.gen.edge.v1.EdgeVersion; |
|||
|
|||
public class EdgeLatestVersionTest { |
|||
|
|||
@Test |
|||
public void edgeLatestVersionIsSynchronizedTest() { |
|||
EdgeVersion currentHighestEdgeVersion = EdgeVersionComparator.getNewestEdgeVersion(); |
|||
|
|||
String projectVersion = EdgeLatestVersionTest.class.getPackage().getImplementationVersion(); |
|||
if (projectVersion == null || projectVersion.isBlank()) { |
|||
projectVersion = System.getProperty("project.version", "UNKNOWN"); |
|||
} |
|||
|
|||
String projectVersionDigits = projectVersion.replaceAll("\\D", ""); |
|||
String currentHighestEdgeVersionDigits = currentHighestEdgeVersion.name().replaceAll("\\D", ""); |
|||
|
|||
String msg = "EdgeVersion enum in edge.proto is out of sync. Please add respective " + projectVersionDigits + " to EdgeVersion"; |
|||
Assert.assertEquals(msg, projectVersionDigits, currentHighestEdgeVersionDigits); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,86 @@ |
|||
/** |
|||
* Copyright © 2016-2026 The Thingsboard Authors |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0
|
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
package org.thingsboard.edge.rpc; |
|||
|
|||
import org.thingsboard.server.gen.edge.v1.EdgeVersion; |
|||
|
|||
import java.util.Comparator; |
|||
|
|||
public class EdgeVersionComparator implements Comparator<EdgeVersion> { |
|||
|
|||
public static final EdgeVersionComparator INSTANCE = new EdgeVersionComparator(); |
|||
|
|||
@Override |
|||
public int compare(EdgeVersion v1, EdgeVersion v2) { |
|||
if (v1 == v2) { |
|||
return 0; |
|||
} |
|||
// UNRECOGNIZED is less than any other version
|
|||
if (v1 == EdgeVersion.UNRECOGNIZED) { |
|||
return -1; |
|||
} |
|||
if (v2 == EdgeVersion.UNRECOGNIZED) { |
|||
return 1; |
|||
} |
|||
// V_LATEST is treated as the newest version
|
|||
if (v1 == EdgeVersion.V_LATEST) { |
|||
v1 = getNewestEdgeVersion(); |
|||
} |
|||
if (v2 == EdgeVersion.V_LATEST) { |
|||
v2 = getNewestEdgeVersion(); |
|||
} |
|||
return compareVersionParts(parseVersionParts(v1), parseVersionParts(v2)); |
|||
} |
|||
|
|||
public static EdgeVersion getNewestEdgeVersion() { |
|||
EdgeVersion newest = null; |
|||
for (EdgeVersion v : EdgeVersion.values()) { |
|||
if (v == EdgeVersion.V_LATEST || v == EdgeVersion.UNRECOGNIZED) { |
|||
continue; |
|||
} |
|||
if (newest == null || INSTANCE.compare(v, newest) > 0) { |
|||
newest = v; |
|||
} |
|||
} |
|||
return newest; |
|||
} |
|||
|
|||
private static int[] parseVersionParts(EdgeVersion version) { |
|||
String name = version.name(); |
|||
if (name.startsWith("V_")) { |
|||
name = name.substring(2); |
|||
} |
|||
String[] parts = name.split("_"); |
|||
int[] result = new int[parts.length]; |
|||
for (int i = 0; i < parts.length; i++) { |
|||
result[i] = Integer.parseInt(parts[i]); |
|||
} |
|||
return result; |
|||
} |
|||
|
|||
private static int compareVersionParts(int[] a, int[] b) { |
|||
int maxLen = Math.max(a.length, b.length); |
|||
for (int i = 0; i < maxLen; i++) { |
|||
int partA = i < a.length ? a[i] : 0; |
|||
int partB = i < b.length ? b[i] : 0; |
|||
if (partA != partB) { |
|||
return Integer.compare(partA, partB); |
|||
} |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,102 @@ |
|||
/** |
|||
* Copyright © 2016-2026 The Thingsboard Authors |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0
|
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
package org.thingsboard.edge.rpc; |
|||
|
|||
import org.junit.jupiter.api.Test; |
|||
import org.thingsboard.server.gen.edge.v1.EdgeVersion; |
|||
|
|||
import static org.assertj.core.api.Assertions.assertThat; |
|||
|
|||
class EdgeVersionComparatorTest { |
|||
|
|||
@Test |
|||
void compare_sameVersion_returnsZero() { |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_3_3_0, EdgeVersion.V_3_3_0)).isEqualTo(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_4_0_0, EdgeVersion.V_4_0_0)).isEqualTo(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_4_2_1_2, EdgeVersion.V_4_2_1_2)).isEqualTo(0); |
|||
} |
|||
|
|||
@Test |
|||
void compare_majorVersionDifference_returnsCorrectOrder() { |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_3_3_0, EdgeVersion.V_4_0_0)).isLessThan(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_4_0_0, EdgeVersion.V_3_3_0)).isGreaterThan(0); |
|||
} |
|||
|
|||
@Test |
|||
void compare_minorVersionDifference_returnsCorrectOrder() { |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_3_3_0, EdgeVersion.V_3_6_0)).isLessThan(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_3_6_0, EdgeVersion.V_3_3_0)).isGreaterThan(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_4_0_0, EdgeVersion.V_4_1_0)).isLessThan(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_4_1_0, EdgeVersion.V_4_0_0)).isGreaterThan(0); |
|||
} |
|||
|
|||
@Test |
|||
void compare_patchVersionDifference_returnsCorrectOrder() { |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_3_6_0, EdgeVersion.V_3_6_1)).isLessThan(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_3_6_1, EdgeVersion.V_3_6_0)).isGreaterThan(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_3_6_1, EdgeVersion.V_3_6_2)).isLessThan(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_3_6_2, EdgeVersion.V_3_6_4)).isLessThan(0); |
|||
} |
|||
|
|||
@Test |
|||
void compare_fourPartVersion_returnsCorrectOrder() { |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_4_2_0, EdgeVersion.V_4_2_1_2)).isLessThan(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_4_2_1_2, EdgeVersion.V_4_2_0)).isGreaterThan(0); |
|||
} |
|||
|
|||
@Test |
|||
void compare_threePartVsFourPart_treatsImplicitZero() { |
|||
// V_4_2_0 should be less than V_4_2_1_2 (4.2.0.0 < 4.2.1.2)
|
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_4_2_0, EdgeVersion.V_4_2_1_2)).isLessThan(0); |
|||
} |
|||
|
|||
@Test |
|||
void getNewestEdgeVersion_excludesLatestAndUnrecognized() { |
|||
EdgeVersion newest = EdgeVersionComparator.getNewestEdgeVersion(); |
|||
assertThat(newest).isNotNull(); |
|||
assertThat(newest).isNotEqualTo(EdgeVersion.V_LATEST); |
|||
assertThat(newest).isNotEqualTo(EdgeVersion.UNRECOGNIZED); |
|||
} |
|||
|
|||
@Test |
|||
void compare_vLatest_treatedAsNewestVersion() { |
|||
EdgeVersion newest = EdgeVersionComparator.getNewestEdgeVersion(); |
|||
// V_LATEST equals the newest version
|
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_LATEST, newest)).isEqualTo(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(newest, EdgeVersion.V_LATEST)).isEqualTo(0); |
|||
// V_LATEST is greater than older versions
|
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_LATEST, EdgeVersion.V_3_3_0)).isGreaterThan(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_3_3_0, EdgeVersion.V_LATEST)).isLessThan(0); |
|||
} |
|||
|
|||
@Test |
|||
void compare_vLatest_withItself_returnsZero() { |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_LATEST, EdgeVersion.V_LATEST)).isEqualTo(0); |
|||
} |
|||
|
|||
@Test |
|||
void compare_unrecognized_isLessThanAnyVersion() { |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.UNRECOGNIZED, EdgeVersion.V_3_3_0)).isLessThan(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.UNRECOGNIZED, EdgeVersion.V_LATEST)).isLessThan(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_3_3_0, EdgeVersion.UNRECOGNIZED)).isGreaterThan(0); |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.V_LATEST, EdgeVersion.UNRECOGNIZED)).isGreaterThan(0); |
|||
} |
|||
|
|||
@Test |
|||
void compare_unrecognized_withItself_returnsZero() { |
|||
assertThat(EdgeVersionComparator.INSTANCE.compare(EdgeVersion.UNRECOGNIZED, EdgeVersion.UNRECOGNIZED)).isEqualTo(0); |
|||
} |
|||
} |
|||
Loading…
Reference in new issue