2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2018, 2020 AT&T Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2024 Nordix Foundation.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.drools.pooling.message;
24 import static org.assertj.core.api.Assertions.assertThatCode;
25 import static org.junit.jupiter.api.Assertions.assertEquals;
26 import static org.junit.jupiter.api.Assertions.assertFalse;
27 import static org.junit.jupiter.api.Assertions.assertNotEquals;
28 import static org.junit.jupiter.api.Assertions.assertNotNull;
29 import static org.junit.jupiter.api.Assertions.assertNull;
30 import static org.junit.jupiter.api.Assertions.assertTrue;
31 import static org.junit.jupiter.api.Assertions.fail;
33 import java.util.Arrays;
34 import java.util.SortedSet;
35 import java.util.TreeSet;
36 import org.junit.jupiter.api.Test;
37 import org.onap.policy.drools.pooling.PoolingFeatureException;
39 class BucketAssignmentsTest {
42 void testBucketAssignments() {
43 assertThatCode(BucketAssignments::new).doesNotThrowAnyException();
47 void testBucketAssignmentsStringArray() {
48 String[] arr = {"abc", "def"};
49 BucketAssignments asgn = new BucketAssignments(arr);
51 assertNotNull(asgn.getHostArray());
52 assertEquals(Arrays.toString(arr), Arrays.toString(asgn.getHostArray()));
56 void testGetHostArray_testSetHostArray() {
58 String[] arr = {"abc", "def"};
59 BucketAssignments asgn = new BucketAssignments(arr);
61 assertNotNull(asgn.getHostArray());
62 assertEquals(Arrays.toString(arr), Arrays.toString(asgn.getHostArray()));
64 String[] arr2 = {"xyz"};
65 asgn.setHostArray(arr2);
67 assertNotNull(asgn.getHostArray());
68 assertEquals(Arrays.toString(arr2), Arrays.toString(asgn.getHostArray()));
72 void testGetLeader() {
74 BucketAssignments asgn = new BucketAssignments();
75 assertNull(asgn.getLeader());
77 // array is non-null, but empty
78 asgn.setHostArray(new String[0]);
79 assertNull(asgn.getLeader());
81 // all entries are null
82 asgn.setHostArray(new String[5]);
83 assertNull(asgn.getLeader());
85 // some entries are null
86 asgn.setHostArray(new String[] {null, "abc", null});
87 assertEquals("abc", asgn.getLeader());
90 asgn.setHostArray(new String[] {"abc"});
91 assertEquals("abc", asgn.getLeader());
94 asgn.setHostArray(new String[] {"Ahost", "Bhost", "Chost"});
95 assertEquals("Ahost", asgn.getLeader());
98 asgn.setHostArray(new String[] {"Xhost", "Bhost", "Chost"});
99 assertEquals("Bhost", asgn.getLeader());
102 asgn.setHostArray(new String[] {"Xhost", "Yhost", "Chost"});
103 assertEquals("Chost", asgn.getLeader());
106 asgn.setHostArray(new String[] {"Xhost", "Bhost", "Chost", "Bhost", "Xhost", "Chost"});
107 assertEquals("Bhost", asgn.getLeader());
111 void testHasAssignment() {
112 // host array is null
113 BucketAssignments asgn = new BucketAssignments();
114 assertFalse(asgn.hasAssignment("abc"));
116 // array is non-null, but empty
117 asgn.setHostArray(new String[0]);
118 assertFalse(asgn.hasAssignment("abc"));
120 // all entries are null
121 asgn.setHostArray(new String[5]);
122 assertFalse(asgn.hasAssignment("abc"));
124 // some entries are null
125 asgn.setHostArray(new String[] {null, "abc", null});
126 assertTrue(asgn.hasAssignment("abc"));
129 asgn.setHostArray(new String[] {"abc"});
130 assertTrue(asgn.hasAssignment("abc"));
132 // appears as first entry
133 asgn.setHostArray(new String[] {"abc", "Bhost", "Chost"});
134 assertTrue(asgn.hasAssignment("abc"));
137 asgn.setHostArray(new String[] {"Xhost", "abc", "Chost"});
138 assertTrue(asgn.hasAssignment("abc"));
141 asgn.setHostArray(new String[] {"Xhost", "Yhost", "abc"});
142 assertTrue(asgn.hasAssignment("abc"));
144 // appears repeatedly
145 asgn.setHostArray(new String[] {"Xhost", "Bhost", "Chost", "Bhost", "Xhost", "Chost"});
146 assertTrue(asgn.hasAssignment("Bhost"));
150 void testGetAllHosts() {
151 // host array is null
152 BucketAssignments asgn = new BucketAssignments();
153 assertEquals("[]", getSortedHosts(asgn).toString());
155 // array is non-null, but empty
156 asgn.setHostArray(new String[0]);
157 assertEquals("[]", getSortedHosts(asgn).toString());
159 // all entries are null
160 asgn.setHostArray(new String[5]);
161 assertEquals("[]", getSortedHosts(asgn).toString());
163 // some entries are null
164 asgn.setHostArray(new String[] {null, "abc", null});
165 assertEquals("[abc]", getSortedHosts(asgn).toString());
168 asgn.setHostArray(new String[] {"abc"});
169 assertEquals("[abc]", getSortedHosts(asgn).toString());
171 // multiple, repeated entries
172 asgn.setHostArray(new String[] {"def", "abc", "def", "ghi", "def", "def", "xyz"});
173 assertEquals("[abc, def, ghi, xyz]", getSortedHosts(asgn).toString());
177 * Gets the hosts, sorted, so that the order is predictable.
179 * @param asgn assignment whose hosts are to be retrieved
180 * @return a new, sorted set of hosts
182 private SortedSet<String> getSortedHosts(BucketAssignments asgn) {
183 return new TreeSet<>(asgn.getAllHosts());
187 void testGetAssignedHost() {
188 // host array is null
189 BucketAssignments asgn = new BucketAssignments();
190 assertNull(asgn.getAssignedHost(3));
192 // array is non-null, but empty
193 asgn.setHostArray(new String[0]);
194 assertNull(asgn.getAssignedHost(3));
196 // all entries are null
197 asgn.setHostArray(new String[5]);
198 assertNull(asgn.getAssignedHost(3));
200 // multiple, repeated entries
201 String[] arr = {"def", "abc", "def", "ghi", "def", "def", "xyz"};
202 asgn.setHostArray(arr);
205 * get assignments for consecutive integers, including negative numbers and
206 * numbers extending past the length of the array.
209 TreeSet<String> seen = new TreeSet<>();
210 for (int x = -1; x < arr.length + 2; ++x) {
211 seen.add(asgn.getAssignedHost(x));
214 TreeSet<String> expected = new TreeSet<>(Arrays.asList(arr));
215 assertEquals(expected, seen);
217 // try a much bigger number
218 assertNotNull(asgn.getAssignedHost(arr.length * 1000));
223 // host array is null
224 BucketAssignments asgn = new BucketAssignments();
225 assertEquals(0, asgn.size());
227 // array is non-null, but empty
228 asgn.setHostArray(new String[0]);
229 assertEquals(0, asgn.size());
231 // all entries are null
232 asgn.setHostArray(new String[5]);
233 assertEquals(5, asgn.size());
235 // multiple, repeated entries
236 String[] arr = {"def", "abc", "def", "ghi", "def", "def", "xyz"};
237 asgn.setHostArray(arr);
238 assertEquals(arr.length, asgn.size());
242 void testCheckValidity() throws Exception {
243 // host array is null
244 BucketAssignments asgn = new BucketAssignments();
245 expectException(asgn);
247 // array is non-null, but empty
248 asgn.setHostArray(new String[0]);
249 expectException(asgn);
252 asgn.setHostArray(new String[BucketAssignments.MAX_BUCKETS + 1]);
253 expectException(asgn);
255 // all entries are null
256 asgn.setHostArray(new String[5]);
257 expectException(asgn);
259 // null at the beginning
260 asgn.setHostArray(new String[] {null, "Bhost", "Chost"});
261 expectException(asgn);
263 // null in the middle
264 asgn.setHostArray(new String[] {"Ahost", null, "Chost"});
265 expectException(asgn);
268 asgn.setHostArray(new String[] {"Ahost", "Bhost", null});
269 expectException(asgn);
272 asgn.setHostArray(new String[] {"abc"});
273 asgn.checkValidity();
276 asgn.setHostArray(new String[] {"Ahost", "Bhost", "Chost"});
277 asgn.checkValidity();
281 void testHashCode() {
282 // with null assignments
283 BucketAssignments asgn = new BucketAssignments();
287 asgn = new BucketAssignments(new String[0]);
291 asgn = new BucketAssignments(new String[] {"abc", null, "def"});
295 asgn = new BucketAssignments(new String[] {"abc", null, "def"});
296 int code = asgn.hashCode();
298 asgn = new BucketAssignments(new String[] {"abc", null, "def"});
299 assertEquals(code, asgn.hashCode());
301 // slightly different values (i.e., changed "def" to "eef")
302 asgn = new BucketAssignments(new String[] {"abc", null, "eef"});
303 assertNotEquals(code, asgn.hashCode());
309 BucketAssignments asgn = new BucketAssignments();
310 assertNotEquals(null, asgn);
313 asgn = new BucketAssignments();
314 assertEquals(asgn, asgn);
316 // different class of object
317 asgn = new BucketAssignments();
318 assertNotEquals("not an assignment object", asgn);
320 assertNotEquals(asgn, new BucketAssignments(new String[] {"abc"}));
322 // with null assignments
323 asgn = new BucketAssignments();
324 assertEquals(asgn, new BucketAssignments());
327 asgn = new BucketAssignments(new String[0]);
328 assertEquals(asgn, asgn);
330 assertNotEquals(asgn, new BucketAssignments());
331 assertNotEquals(asgn, new BucketAssignments(new String[] {"abc"}));
334 String[] arr = {"abc", null, "def"};
335 asgn = new BucketAssignments(arr);
336 assertEquals(asgn, asgn);
337 assertEquals(asgn, new BucketAssignments(arr));
338 assertEquals(asgn, new BucketAssignments(new String[] {"abc", null, "def"}));
340 assertNotEquals(asgn, new BucketAssignments());
341 assertNotEquals(asgn, new BucketAssignments(new String[] {"abc", null, "XYZ"}));
343 assertNotEquals(asgn, new BucketAssignments());
347 * Expects an exception when checkValidity() is called.
349 * @param asgn assignments to be checked
351 private void expectException(BucketAssignments asgn) {
353 asgn.checkValidity();
354 fail("missing exception");
356 } catch (PoolingFeatureException expected) {