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