1 package org.apache.commons.jcs3.engine.control.event;
2
3 import org.apache.commons.jcs3.JCS;
4 import org.apache.commons.jcs3.access.CacheAccess;
5 import org.apache.commons.jcs3.engine.ElementAttributes;
6 import org.apache.commons.jcs3.engine.behavior.IElementAttributes;
7 import org.apache.commons.jcs3.engine.control.event.behavior.IElementEvent;
8 import org.apache.commons.jcs3.engine.control.event.behavior.IElementEventHandler;
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 import junit.framework.TestCase;
30
31
32
33
34 public class SimpleEventHandlingUnitTest
35 extends TestCase
36 {
37
38 private static final int items = 2000;
39
40
41 private MyEventHandler meh;
42
43
44
45
46 @Override
47 public void setUp()
48 {
49 JCS.setConfigFilename( "/TestSimpleEventHandling.ccf" );
50 this.meh = new MyEventHandler();
51 }
52
53
54
55
56
57
58 public void testSpoolEvent()
59 throws Exception
60 {
61 final CacheAccess<String, String> jcs = JCS.getInstance( "WithDisk" );
62
63 final IElementAttributes attributes = jcs.getDefaultElementAttributes();
64 attributes.addElementEventHandler( meh );
65 jcs.setDefaultElementAttributes( attributes );
66
67
68
69 for ( int i = 0; i < items; i++ )
70 {
71 jcs.put( i + ":key", "data" + i );
72 }
73
74 Thread.sleep( items / 20 );
75
76
77
78 assertTrue( "The number of ELEMENT_EVENT_SPOOLED_DISK_AVAILABLE events [" + meh.getSpoolCount()
79 + "] does not equal the number expected [" + items + "]", meh.getSpoolCount() >= items );
80 }
81
82
83
84
85
86
87 public void testSpoolNoDiskEvent()
88 throws Exception
89 {
90 final CacheAccess<String, String> jcs = JCS.getInstance( "NoDisk" );
91
92
93 final IElementAttributes attributes = jcs.getDefaultElementAttributes();
94 attributes.addElementEventHandler( meh );
95 jcs.setDefaultElementAttributes( attributes );
96
97
98 for ( int i = 0; i < items; i++ )
99 {
100 jcs.put( i + ":key", "data" + i );
101 }
102
103
104 Thread.sleep( items / 20 );
105
106
107 assertTrue( "The number of ELEMENT_EVENT_SPOOLED_DISK_NOT_AVAILABLE events [" + meh.getSpoolNoDiskCount()
108 + "] does not equal the number expected.", meh.getSpoolNoDiskCount() >= items );
109
110 }
111
112
113
114
115
116 public void testSpoolNotAllowedEvent()
117 throws Exception
118 {
119 final CacheAccess<String, String> jcs = JCS.getInstance( "DiskButNotAllowed" );
120
121 final IElementAttributes attributes = jcs.getDefaultElementAttributes();
122 attributes.addElementEventHandler( meh );
123 jcs.setDefaultElementAttributes( attributes );
124
125
126 for ( int i = 0; i < items; i++ )
127 {
128 jcs.put( i + ":key", "data" + i );
129 }
130
131
132 Thread.sleep( items / 20 );
133
134
135 assertTrue( "The number of ELEMENT_EVENT_SPOOLED_NOT_ALLOWED events [" + meh.getSpoolNotAllowedCount()
136 + "] does not equal the number expected.", meh.getSpoolNotAllowedCount() >= items );
137
138 }
139
140
141
142
143
144 public void testSpoolNotAllowedEventOnItem()
145 throws Exception
146 {
147 final CacheAccess<String, String> jcs = JCS.getInstance( "DiskButNotAllowed" );
148
149
150
151
152
153
154 for ( int i = 0; i < items; i++ )
155 {
156 final IElementAttributes attributes = jcs.getDefaultElementAttributes();
157 attributes.addElementEventHandler( meh );
158 jcs.put( i + ":key", "data" + i, attributes );
159 }
160
161
162 Thread.sleep( items / 20 );
163
164
165 assertTrue( "The number of ELEMENT_EVENT_SPOOLED_NOT_ALLOWED events [" + meh.getSpoolNotAllowedCount()
166 + "] does not equal the number expected.", meh.getSpoolNotAllowedCount() >= items );
167
168 }
169
170
171
172
173
174 public void testExceededMaxlifeOnrequestEvent()
175 throws Exception
176 {
177 final CacheAccess<String, String> jcs = JCS.getInstance( "Maxlife" );
178
179 final IElementAttributes attributes = jcs.getDefaultElementAttributes();
180 attributes.addElementEventHandler( meh );
181 jcs.setDefaultElementAttributes( attributes );
182
183
184 for ( int i = 0; i < 200; i++ )
185 {
186 jcs.put( i + ":key", "data" + i);
187 }
188
189
190 Thread.sleep(attributes.getMaxLife() * 1000 + 100);
191
192 for ( int i = 0; i < 200; i++ )
193 {
194 final String value = jcs.get( i + ":key");
195 assertNull("Item should be null for key " + i + ":key, but is " + value, value);
196 }
197
198
199 Thread.sleep( 100 );
200
201
202 assertTrue( "The number of ELEMENT_EVENT_EXCEEDED_MAXLIFE_ONREQUEST events [" + meh.getExceededMaxlifeCount()
203 + "] does not equal the number expected.", meh.getExceededMaxlifeCount() >= 200 );
204 }
205
206
207
208
209
210 public void testExceededIdletimeOnrequestEvent()
211 throws Exception
212 {
213 final CacheAccess<String, String> jcs = JCS.getInstance( "Idletime" );
214
215 final IElementAttributes attributes = jcs.getDefaultElementAttributes();
216 attributes.addElementEventHandler( meh );
217 jcs.setDefaultElementAttributes( attributes );
218
219
220 for ( int i = 0; i < 200; i++ )
221 {
222 jcs.put( i + ":key", "data" + i);
223 }
224
225
226 for ( int i = 0; i < 200; i++ )
227 {
228 final String value = jcs.get( i + ":key");
229 assertNotNull("Item should not be null for key " + i + ":key", value);
230 }
231
232
233 Thread.sleep(attributes.getIdleTime() * 1000 + 100);
234
235 for ( int i = 0; i < 200; i++ )
236 {
237 final String value = jcs.get( i + ":key");
238 assertNull("Item should be null for key " + i + ":key, but is " + value, value);
239 }
240
241
242 Thread.sleep( 100 );
243
244
245 assertTrue( "The number of ELEMENT_EVENT_EXCEEDED_IDLETIME_ONREQUEST events [" + meh.getExceededIdletimeCount()
246 + "] does not equal the number expected.", meh.getExceededIdletimeCount() >= 200 );
247 }
248
249
250
251
252
253 public void testElementAttributesCreationTime()
254 throws Exception
255 {
256 final ElementAttributes elem1 = new ElementAttributes();
257 final long ctime1 = elem1.getCreateTime();
258
259 Thread.sleep(10);
260
261 final IElementAttributes elem2 = elem1.clone();
262 final long ctime2 = elem2.getCreateTime();
263
264 assertFalse("Creation times should be different", ctime1 == ctime2);
265 }
266
267
268
269
270 public static class MyEventHandler
271 implements IElementEventHandler
272 {
273
274 private int spoolCount;
275
276
277 private int spoolNotAllowedCount;
278
279
280 private int spoolNoDiskCount;
281
282
283 private int exceededMaxlifeCount;
284
285
286 private int exceededIdletimeCount;
287
288
289
290
291 @Override
292 public synchronized <T> void handleElementEvent( final IElementEvent<T> event )
293 {
294
295
296
297 switch (event.getElementEvent())
298 {
299 case SPOOLED_DISK_AVAILABLE:
300
301
302 spoolCount++;
303 break;
304
305 case SPOOLED_NOT_ALLOWED:
306 spoolNotAllowedCount++;
307 break;
308
309 case SPOOLED_DISK_NOT_AVAILABLE:
310 spoolNoDiskCount++;
311 break;
312
313 case EXCEEDED_MAXLIFE_ONREQUEST:
314 exceededMaxlifeCount++;
315 break;
316
317 case EXCEEDED_IDLETIME_ONREQUEST:
318 exceededIdletimeCount++;
319 break;
320
321 case EXCEEDED_IDLETIME_BACKGROUND:
322 break;
323
324 case EXCEEDED_MAXLIFE_BACKGROUND:
325 break;
326 }
327 }
328
329
330
331
332 protected int getSpoolCount()
333 {
334 return spoolCount;
335 }
336
337
338
339
340 protected int getSpoolNotAllowedCount()
341 {
342 return spoolNotAllowedCount;
343 }
344
345
346
347
348 protected int getSpoolNoDiskCount()
349 {
350 return spoolNoDiskCount;
351 }
352
353
354
355
356 protected int getExceededMaxlifeCount()
357 {
358 return exceededMaxlifeCount;
359 }
360
361
362
363
364 protected int getExceededIdletimeCount()
365 {
366 return exceededIdletimeCount;
367 }
368 }
369
370 }