blob: e8dbeb6dc452af445d814dee2e76c2da896788df [file] [log] [blame]
Brian Stanke81fe2382016-03-03 15:54:32 -05001/*
2 * Copyright 2016 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.store.service;
18
19import com.google.common.collect.Lists;
20import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.junit.TestTools;
24
25import java.util.HashSet;
26import java.util.List;
27import java.util.Set;
28
29import static org.junit.Assert.*;
30
31/**
32 * Junit test class for TestDistributedSet.
33 */
34public class DistributedSetTest {
35
36 protected InternalSetListener listener = new InternalSetListener();
37 private static final String SETNAME = "set1";
38 private TestDistributedSet<String> set1;
39 private Set<String> set2;
40
41 /**
42 * Test setup before each test.
43 */
44 @Before
45 public void setup() {
46 set1 = new TestDistributedSet<>(SETNAME);
47 set2 = new HashSet<>();
48
49 set1.addListener(listener);
50 }
51
52 /**
53 * Test cleanup after each test.
54 */
55 @After
56 public void teardown() {
57 set1.removeListener(listener);
58 }
59
60 /**
61 * Basic tests against TestDistributedSet.
62 */
63 @Test
64 public void basicTests() {
65 set1.add("item1");
66 assertEquals("The set name should match.", SETNAME, set1.name());
Brian Stanke0e5c94e2016-03-08 11:20:04 -050067 assertEquals("The set primitive type should match.", DistributedPrimitive.Type.SET, set1.primitiveType());
Brian Stanke81fe2382016-03-03 15:54:32 -050068
69 set1.add("item2");
70 set1.add("item3");
71 assertTrue("set1 should contain 3 items", set1.asDistributedSet().size() == 3);
72 set1.remove("item1");
73 set1.remove("item2");
74 set1.remove("item3");
75 assertTrue("set1 should be empty.", set1.asDistributedSet(0).isEmpty());
76 validateEvents(SetEvent.Type.ADD, SetEvent.Type.ADD, SetEvent.Type.ADD,
77 SetEvent.Type.REMOVE, SetEvent.Type.REMOVE, SetEvent.Type.REMOVE);
78 }
79
80 /**
81 * TestDistributedSet clear method test.
82 */
83 @Test
84 public void testClear() {
85 set1.add("item1");
86 set1.add("item2");
87 set1.add("item3");
88 set1.clear();
89 assertTrue("set1 should be empty.", set1.asDistributedSet().isEmpty());
90 validateEvents(SetEvent.Type.ADD, SetEvent.Type.ADD, SetEvent.Type.ADD,
91 SetEvent.Type.REMOVE, SetEvent.Type.REMOVE, SetEvent.Type.REMOVE);
92 }
93
94 /**
95 * TestDistributedSet addAll method test.
96 */
97 @Test
98 public void testAddAll() {
99 set2.add("item1");
100 set2.add("item2");
101 set2.add("item3");
102 set1.addAll(set2);
103 assertTrue("set1 should contain 3 items.", set1.asDistributedSet().size() == set2.size());
104 validateEvents(SetEvent.Type.ADD, SetEvent.Type.ADD, SetEvent.Type.ADD);
105 }
106
107 /**
108 * TestDistributedSet removeAll method test.
109 */
110 @Test
111 public void testRemoveAll() {
112 set1.add("item1");
113 set1.add("item2");
114 set1.add("item3");
115 set2.add("item1");
116 set1.removeAll(set2);
117 assertTrue("set1 should contain 2 items.", set1.asDistributedSet().size() == 2);
118 validateEvents(SetEvent.Type.ADD, SetEvent.Type.ADD, SetEvent.Type.ADD,
119 SetEvent.Type.REMOVE);
120 }
121
122 /**
123 * TestDistributedSet retainAll method test.
124 */
125 @Test
126 public void testRetainAll() {
127 set1.add("item1");
128 set1.add("item2");
129 set1.add("item3");
130 set2.add("item4");
131 set1.retainAll(set2);
132 assertTrue("set1 should be empty.", set1.asDistributedSet().isEmpty());
133 validateEvents(SetEvent.Type.ADD, SetEvent.Type.ADD, SetEvent.Type.ADD,
134 SetEvent.Type.REMOVE, SetEvent.Type.REMOVE, SetEvent.Type.REMOVE);
135
136 set1.add("item1");
137 set1.add("item2");
138 set1.add("item3");
139 set2.add("item1");
140 set1.retainAll(set2);
141 assertTrue("set1 size should be 1.", set1.asDistributedSet().size() == 1);
142 validateEvents(SetEvent.Type.ADD, SetEvent.Type.ADD, SetEvent.Type.ADD,
143 SetEvent.Type.REMOVE, SetEvent.Type.REMOVE);
144
145 }
146
147 /**
148 * TestDistributedSet contains method test.
149 */
150 @Test
151 public void testContains() {
152 set1.add("item1");
153 set1.add("item2");
154 set1.add("item3");
155 assertTrue("set1 should contain item3.", set1.asDistributedSet().contains("item3"));
156 }
157
158 /**
159 * TestDistributedSet containsAll method test.
160 */
161 @Test
162 public void testContainsAll() {
163 set1.add("item1");
164 set1.add("item2");
165 set1.add("item3");
166 set2.add("item2");
167 set2.add("item3");
168 assertTrue("set1 should contain all of set2.", set1.asDistributedSet().containsAll(set2));
169 }
170
171 /**
172 * TestDistributedSet getAsImmutableSet method test.
173 */
174 @Test
175 public void testGetAsImmutableSet() {
176 set1.add("item1");
177 set1.add("item2");
178 set1.add("item3");
179 try {
180 assertEquals("set1 size should be 3.", set1.getAsImmutableSet().get().size(),
181 set1.asDistributedSet().size());
182 } catch (Exception e) {
183 fail("Expected exception. " + e.getMessage());
184 }
185 }
186
187 /**
188 * Method to validate that actual versus expected set events were
189 * received correctly.
190 *
191 * @param types expected set events.
192 */
193 private void validateEvents(Enum... types) {
194 TestTools.assertAfter(100, () -> {
195 int i = 0;
196 assertEquals("wrong events received", types.length, listener.events.size());
197 for (SetEvent event : listener.events) {
198 assertEquals("incorrect event type", types[i], event.type());
199 i++;
200 }
201 listener.events.clear();
202 });
203 }
204
205 /**
206 * Listener class to test set events.
207 */
208 private class InternalSetListener implements SetEventListener<String> {
209 protected List<SetEvent> events = Lists.newArrayList();
210
211 @Override
212 public void event(SetEvent event) {
213 events.add(event);
214 }
215 }
216}