2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2018, 2020 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.drools.pooling.message;
23 import static org.assertj.core.api.Assertions.assertThatCode;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertFalse;
26 import static org.junit.Assert.assertNotEquals;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertNull;
29 import static org.junit.Assert.assertTrue;
30 import static org.junit.Assert.fail;
32 import java.util.Arrays;
33 import java.util.SortedSet;
34 import java.util.TreeSet;
35 import org.junit.Test;
36 import org.onap.policy.drools.pooling.PoolingFeatureException;
38 public class BucketAssignmentsTest {
41 public void testBucketAssignments() {
42 assertThatCode(() -> new BucketAssignments()).doesNotThrowAnyException();
46 public void testBucketAssignmentsStringArray() {
47 String[] arr = {"abc", "def"};
48 BucketAssignments asgn = new BucketAssignments(arr);
50 assertNotNull(asgn.getHostArray());
51 assertEquals(arr.toString(), asgn.getHostArray().toString());
55 public void testGetHostArray_testSetHostArray() {
57 String[] arr = {"abc", "def"};
58 BucketAssignments asgn = new BucketAssignments(arr);
60 assertNotNull(asgn.getHostArray());
61 assertEquals(arr.toString(), asgn.getHostArray().toString());
63 String[] arr2 = {"xyz"};
64 asgn.setHostArray(arr2);
66 assertNotNull(asgn.getHostArray());
67 assertEquals(arr2.toString(), asgn.getHostArray().toString());
71 public void testGetLeader() {
73 BucketAssignments asgn = new BucketAssignments();
74 assertNull(asgn.getLeader());
76 // array is non-null, but empty
77 asgn.setHostArray(new String[0]);
78 assertNull(asgn.getLeader());
80 // all entries are null
81 asgn.setHostArray(new String[5]);
82 assertNull(asgn.getLeader());
84 // some entries are null
85 asgn.setHostArray(new String[] {null, "abc", null});
86 assertEquals("abc", asgn.getLeader());
89 asgn.setHostArray(new String[] {"abc"});
90 assertEquals("abc", asgn.getLeader());
93 asgn.setHostArray(new String[] {"Ahost", "Bhost", "Chost"});
94 assertEquals("Ahost", asgn.getLeader());
97 asgn.setHostArray(new String[] {"Xhost", "Bhost", "Chost"});
98 assertEquals("Bhost", asgn.getLeader());
101 asgn.setHostArray(new String[] {"Xhost", "Yhost", "Chost"});
102 assertEquals("Chost", asgn.getLeader());
105 asgn.setHostArray(new String[] {"Xhost", "Bhost", "Chost", "Bhost", "Xhost", "Chost"});
106 assertEquals("Bhost", asgn.getLeader());
110 public void testHasAssignment() {
111 // host array is null
112 BucketAssignments asgn = new BucketAssignments();
113 assertFalse(asgn.hasAssignment("abc"));
115 // array is non-null, but empty
116 asgn.setHostArray(new String[0]);
117 assertFalse(asgn.hasAssignment("abc"));
119 // all entries are null
120 asgn.setHostArray(new String[5]);
121 assertFalse(asgn.hasAssignment("abc"));
123 // some entries are null
124 asgn.setHostArray(new String[] {null, "abc", null});
125 assertTrue(asgn.hasAssignment("abc"));
128 asgn.setHostArray(new String[] {"abc"});
129 assertTrue(asgn.hasAssignment("abc"));
131 // appears as first entry
132 asgn.setHostArray(new String[] {"abc", "Bhost", "Chost"});
133 assertTrue(asgn.hasAssignment("abc"));
136 asgn.setHostArray(new String[] {"Xhost", "abc", "Chost"});
137 assertTrue(asgn.hasAssignment("abc"));
140 asgn.setHostArray(new String[] {"Xhost", "Yhost", "abc"});
141 assertTrue(asgn.hasAssignment("abc"));
143 // appears repeatedly
144 asgn.setHostArray(new String[] {"Xhost", "Bhost", "Chost", "Bhost", "Xhost", "Chost"});
145 assertTrue(asgn.hasAssignment("Bhost"));
149 public void testGetAllHosts() {
150 // host array is null
151 BucketAssignments asgn = new BucketAssignments();
152 assertEquals("[]", getSortedHosts(asgn).toString());
154 // array is non-null, but empty
155 asgn.setHostArray(new String[0]);
156 assertEquals("[]", getSortedHosts(asgn).toString());
158 // all entries are null
159 asgn.setHostArray(new String[5]);
160 assertEquals("[]", getSortedHosts(asgn).toString());
162 // some entries are null
163 asgn.setHostArray(new String[] {null, "abc", null});
164 assertEquals("[abc]", getSortedHosts(asgn).toString());
167 asgn.setHostArray(new String[] {"abc"});
168 assertEquals("[abc]", getSortedHosts(asgn).toString());
170 // multiple, repeated entries
171 asgn.setHostArray(new String[] {"def", "abc", "def", "ghi", "def", "def", "xyz"});
172 assertEquals("[abc, def, ghi, xyz]", getSortedHosts(asgn).toString());
176 * Gets the hosts, sorted, so that the order is predictable.
178 * @param asgn assignment whose hosts are to be retrieved
179 * @return a new, sorted set of hosts
181 private SortedSet<String> getSortedHosts(BucketAssignments asgn) {
182 return new TreeSet<>(asgn.getAllHosts());
186 public void testGetAssignedHost() {
187 // host array is null
188 BucketAssignments asgn = new BucketAssignments();
189 assertNull(asgn.getAssignedHost(3));
191 // array is non-null, but empty
192 asgn.setHostArray(new String[0]);
193 assertNull(asgn.getAssignedHost(3));
195 // all entries are null
196 asgn.setHostArray(new String[5]);
197 assertNull(asgn.getAssignedHost(3));
199 // multiple, repeated entries
200 String[] arr = {"def", "abc", "def", "ghi", "def", "def", "xyz"};
201 asgn.setHostArray(arr);
204 * get assignments for consecutive integers, including negative numbers and
205 * numbers extending past the length of the array.
208 TreeSet<String> seen = new TreeSet<>();
209 for (int x = -1; x < arr.length + 2; ++x) {
210 seen.add(asgn.getAssignedHost(x));
213 TreeSet<String> expected = new TreeSet<>(Arrays.asList(arr));
214 assertEquals(expected, seen);
216 // try a much bigger number
217 assertNotNull(asgn.getAssignedHost(arr.length * 1000));
221 public void testSize() {
222 // host array is null
223 BucketAssignments asgn = new BucketAssignments();
224 assertEquals(0, asgn.size());
226 // array is non-null, but empty
227 asgn.setHostArray(new String[0]);
228 assertEquals(0, asgn.size());
230 // all entries are null
231 asgn.setHostArray(new String[5]);
232 assertEquals(5, asgn.size());
234 // multiple, repeated entries
235 String[] arr = {"def", "abc", "def", "ghi", "def", "def", "xyz"};
236 asgn.setHostArray(arr);
237 assertEquals(arr.length, asgn.size());
241 public void testCheckValidity() throws Exception {
242 // host array is null
243 BucketAssignments asgn = new BucketAssignments();
244 expectException(asgn);
246 // array is non-null, but empty
247 asgn.setHostArray(new String[0]);
248 expectException(asgn);
251 asgn.setHostArray(new String[BucketAssignments.MAX_BUCKETS + 1]);
252 expectException(asgn);
254 // all entries are null
255 asgn.setHostArray(new String[5]);
256 expectException(asgn);
258 // null at the beginning
259 asgn.setHostArray(new String[] {null, "Bhost", "Chost"});
260 expectException(asgn);
262 // null in the middle
263 asgn.setHostArray(new String[] {"Ahost", null, "Chost"});
264 expectException(asgn);
267 asgn.setHostArray(new String[] {"Ahost", "Bhost", null});
268 expectException(asgn);
271 asgn.setHostArray(new String[] {"abc"});
272 asgn.checkValidity();
275 asgn.setHostArray(new String[] {"Ahost", "Bhost", "Chost"});
276 asgn.checkValidity();
280 public void testHashCode() {
281 // with null assignments
282 BucketAssignments asgn = new BucketAssignments();
286 asgn = new BucketAssignments(new String[0]);
290 asgn = new BucketAssignments(new String[] {"abc", null, "def"});
294 asgn = new BucketAssignments(new String[] {"abc", null, "def"});
295 int code = asgn.hashCode();
297 asgn = new BucketAssignments(new String[] {"abc", null, "def"});
298 assertEquals(code, asgn.hashCode());
300 // slightly different values (i.e., changed "def" to "eef")
301 asgn = new BucketAssignments(new String[] {"abc", null, "eef"});
302 assertNotEquals(code, asgn.hashCode());
306 public void testEquals() {
308 BucketAssignments asgn = new BucketAssignments();
309 assertNotEquals(asgn, null);
312 asgn = new BucketAssignments();
313 assertEquals(asgn, asgn);
315 // different class of object
316 asgn = new BucketAssignments();
317 assertNotEquals(asgn, "not an assignment object");
319 assertNotEquals(asgn, new BucketAssignments(new String[] {"abc"}));
321 // with null assignments
322 asgn = new BucketAssignments();
323 assertEquals(asgn, new BucketAssignments());
326 asgn = new BucketAssignments(new String[0]);
327 assertEquals(asgn, asgn);
329 assertNotEquals(asgn, new BucketAssignments());
330 assertNotEquals(asgn, new BucketAssignments(new String[] {"abc"}));
333 String[] arr = {"abc", null, "def"};
334 asgn = new BucketAssignments(arr);
335 assertEquals(asgn, asgn);
336 assertEquals(asgn, new BucketAssignments(arr));
337 assertEquals(asgn, new BucketAssignments(new String[] {"abc", null, "def"}));
339 assertNotEquals(asgn, new BucketAssignments());
340 assertNotEquals(asgn, new BucketAssignments(new String[] {"abc", null, "XYZ"}));
342 assertNotEquals(asgn, new BucketAssignments());
346 * Expects an exception when checkValidity() is called.
348 * @param asgn assignments to be checked
350 private void expectException(BucketAssignments asgn) {
352 asgn.checkValidity();
353 fail("missing exception");
355 } catch (PoolingFeatureException expected) {