Skip to content

Commit 064b1f2

Browse files
authored
Merge pull request #1 from pgomulka/transportversion
TransportVersion tests
2 parents 9689954 + 7e9690a commit 064b1f2

File tree

3 files changed

+173
-1
lines changed

3 files changed

+173
-1
lines changed

server/src/main/java/org/elasticsearch/TransportVersion.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616
import java.lang.reflect.Field;
1717
import java.util.HashMap;
1818
import java.util.Map;
19+
import java.util.NavigableSet;
1920
import java.util.Set;
21+
import java.util.TreeSet;
22+
import java.util.stream.Collectors;
2023

2124
/**
2225
* Represents the version of the wire protocol used to communicate between ES nodes.
@@ -153,6 +156,8 @@ public class TransportVersion implements Comparable<TransportVersion> {
153156

154157
private static final Map<Integer, TransportVersion> idToVersion;
155158

159+
private static final TreeSet<TransportVersion> declaredVersions;
160+
156161
static {
157162
Map<Integer, TransportVersion> builder = new HashMap<>();
158163
Map<String, TransportVersion> uniqueIds = new HashMap<>();
@@ -185,6 +190,7 @@ public class TransportVersion implements Comparable<TransportVersion> {
185190
}
186191
}
187192
idToVersion = Map.copyOf(builder);
193+
declaredVersions = idToVersion.values().stream().collect(Collectors.toCollection(() -> new TreeSet<>()));
188194
}
189195

190196
public static TransportVersion readVersion(StreamInput in) throws IOException {
@@ -218,7 +224,8 @@ public static TransportVersion max(TransportVersion version1, TransportVersion v
218224
return version1.id > version2.id ? version1 : version2;
219225
}
220226

221-
private final int id;
227+
// TODO for testing or a getter? should this be used?
228+
final int id;
222229
private final String uniqueId;
223230

224231
TransportVersion(int id, String uniqueId) {
@@ -247,6 +254,13 @@ public int compareTo(TransportVersion other) {
247254
return Integer.compare(this.id, other.id);
248255
}
249256

257+
/**
258+
* returns a sorted list of declared transport version constants
259+
*/
260+
public static NavigableSet<TransportVersion> getDeclaredVersions() {
261+
return declaredVersions;
262+
}
263+
250264
@Override
251265
public String toString() {
252266
return Integer.toString(id);
@@ -274,4 +288,5 @@ public boolean equals(Object o) {
274288
public int hashCode() {
275289
return id;
276290
}
291+
277292
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0 and the Server Side Public License, v 1; you may not use this file except
5+
* in compliance with, at your election, the Elastic License 2.0 or the Server
6+
* Side Public License, v 1.
7+
*/
8+
9+
package org.elasticsearch;
10+
11+
import org.elasticsearch.test.ESTestCase;
12+
import org.elasticsearch.test.TransportVersionUtils;
13+
14+
import java.util.Set;
15+
16+
import static org.hamcrest.Matchers.greaterThan;
17+
import static org.hamcrest.Matchers.is;
18+
import static org.hamcrest.Matchers.lessThan;
19+
import static org.hamcrest.Matchers.sameInstance;
20+
21+
public class TransportVersionTests extends ESTestCase {
22+
23+
public void testVersionComparison() throws Exception {
24+
TransportVersion V_7_2_0 = TransportVersion.V_7_2_0;
25+
TransportVersion V_8_0_0 = TransportVersion.V_8_0_0;
26+
assertThat(V_7_2_0.before(V_8_0_0), is(true));
27+
assertThat(V_7_2_0.before(V_7_2_0), is(false));
28+
assertThat(V_8_0_0.before(V_7_2_0), is(false));
29+
30+
assertThat(V_7_2_0.onOrBefore(V_8_0_0), is(true));
31+
assertThat(V_7_2_0.onOrBefore(V_7_2_0), is(true));
32+
assertThat(V_8_0_0.onOrBefore(V_7_2_0), is(false));
33+
34+
assertThat(V_7_2_0.after(V_8_0_0), is(false));
35+
assertThat(V_7_2_0.after(V_7_2_0), is(false));
36+
assertThat(V_8_0_0.after(V_7_2_0), is(true));
37+
38+
assertThat(V_7_2_0.onOrAfter(V_8_0_0), is(false));
39+
assertThat(V_7_2_0.onOrAfter(V_7_2_0), is(true));
40+
assertThat(V_8_0_0.onOrAfter(V_7_2_0), is(true));
41+
42+
assertThat(V_7_2_0, is(lessThan(V_8_0_0)));
43+
assertThat(V_7_2_0.compareTo(V_7_2_0), is(0));
44+
assertThat(V_8_0_0, is(greaterThan(V_7_2_0)));
45+
}
46+
47+
public void testMin() {
48+
assertEquals(
49+
TransportVersionUtils.getPreviousVersion(),
50+
TransportVersion.min(TransportVersion.CURRENT, TransportVersionUtils.getPreviousVersion())
51+
);
52+
assertEquals(
53+
TransportVersion.fromId(1_01_01_99),
54+
TransportVersion.min(TransportVersion.fromId(1_01_01_99), TransportVersion.CURRENT)
55+
);
56+
TransportVersion version = TransportVersionUtils.randomVersion();
57+
TransportVersion version1 = TransportVersionUtils.randomVersion();
58+
if (version.id <= version1.id) {
59+
assertEquals(version, TransportVersion.min(version1, version));
60+
} else {
61+
assertEquals(version1, TransportVersion.min(version1, version));
62+
}
63+
}
64+
65+
public void testMax() {
66+
assertEquals(TransportVersion.CURRENT, TransportVersion.max(TransportVersion.CURRENT, TransportVersionUtils.getPreviousVersion()));
67+
assertEquals(TransportVersion.CURRENT, TransportVersion.max(TransportVersion.fromId(1_01_01_99), TransportVersion.CURRENT));
68+
TransportVersion version = TransportVersionUtils.randomVersion();
69+
TransportVersion version1 = TransportVersionUtils.randomVersion();
70+
if (version.id >= version1.id) {
71+
assertEquals(version, TransportVersion.max(version1, version));
72+
} else {
73+
assertEquals(version1, TransportVersion.max(version1, version));
74+
}
75+
}
76+
77+
public void testVersionConstantPresent() {
78+
// TODO those versions are not cached at the moment, perhaps we should add them to idToVersion set too?
79+
Set<TransportVersion> ignore = Set.of(TransportVersion.ZERO, TransportVersion.CURRENT, TransportVersion.MINIMUM_COMPATIBLE);
80+
assertThat(TransportVersion.CURRENT, sameInstance(TransportVersion.fromId(TransportVersion.CURRENT.id)));
81+
final int iters = scaledRandomIntBetween(20, 100);
82+
for (int i = 0; i < iters; i++) {
83+
TransportVersion version = TransportVersionUtils.randomVersion(ignore);
84+
85+
assertThat(version, sameInstance(TransportVersion.fromId(version.id)));
86+
}
87+
}
88+
89+
public void testCURRENTIsLatest() {
90+
final int iters = scaledRandomIntBetween(100, 1000);
91+
for (int i = 0; i < iters; i++) {
92+
TransportVersion version = TransportVersionUtils.randomVersion();
93+
if (version != TransportVersion.CURRENT) {
94+
assertThat(
95+
"Version: " + version + " should be before: " + Version.CURRENT + " but wasn't",
96+
version.before(TransportVersion.CURRENT),
97+
is(true)
98+
);
99+
}
100+
}
101+
}
102+
103+
public void testToString() {
104+
assertEquals("5000099", TransportVersion.fromId(5_00_00_99).toString());
105+
assertEquals("2030099", TransportVersion.fromId(2_03_00_99).toString());
106+
assertEquals("1000099", TransportVersion.fromId(1_00_00_99).toString());
107+
assertEquals("2000099", TransportVersion.fromId(2_00_00_99).toString());
108+
assertEquals("5000099", TransportVersion.fromId(5_00_00_99).toString());
109+
}
110+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0 and the Server Side Public License, v 1; you may not use this file except
5+
* in compliance with, at your election, the Elastic License 2.0 or the Server
6+
* Side Public License, v 1.
7+
*/
8+
9+
package org.elasticsearch.test;
10+
11+
import org.elasticsearch.TransportVersion;
12+
13+
import java.util.NavigableSet;
14+
import java.util.Set;
15+
import java.util.stream.Collectors;
16+
17+
public class TransportVersionUtils {
18+
private static final NavigableSet<TransportVersion> ALL_VERSIONS;
19+
20+
static {
21+
ALL_VERSIONS = TransportVersion.getDeclaredVersions();
22+
}
23+
24+
/** Returns a random {@link TransportVersion} from all available versions. */
25+
public static TransportVersion randomVersion() {
26+
return ESTestCase.randomFrom(ALL_VERSIONS);
27+
}
28+
29+
/** Returns a random {@link TransportVersion} from all available versions without the ignore set */
30+
public static TransportVersion randomVersion(Set<TransportVersion> ignore) {
31+
return ESTestCase.randomFrom(ALL_VERSIONS.stream().filter(v -> ignore.contains(v) == false).collect(Collectors.toList()));
32+
}
33+
34+
public static TransportVersion getPreviousVersion() {
35+
TransportVersion version = getPreviousVersion(TransportVersion.CURRENT);
36+
assert version.before(TransportVersion.CURRENT);
37+
return version;
38+
}
39+
40+
public static TransportVersion getPreviousVersion(TransportVersion version) {
41+
TransportVersion prev = ALL_VERSIONS.lower(version);
42+
if (prev == null) {
43+
throw new IllegalArgumentException("couldn't find any released versions before [" + version + "]");
44+
}
45+
return prev;
46+
}
47+
}

0 commit comments

Comments
 (0)