1 package org.jmage.cache;
2
3 import junit.framework.TestCase;
4 import org.apache.log4j.Logger;
5
6 import java.lang.reflect.Array;
7 import java.util.Properties;
8
9 /***
10 * DiskCacheTests
11 */
12 public class DiskCacheTests extends TestCase {
13
14 protected CacheManager cacheManager = CacheManagerImpl.getCacheManager();
15 protected static Logger log = Logger.getLogger(DiskCacheTests.class.getName());
16
17 public class ThreadedCacheClient implements Runnable {
18 protected Logger log = Logger.getLogger(DiskCacheTests.ThreadedCacheClient.class.getName());
19 protected Class cacheType;
20 protected Object key;
21 protected Object value;
22
23 public ThreadedCacheClient(Class cacheType, Object key, Object value) {
24 this.cacheType = cacheType;
25 this.key = key;
26 this.value = value;
27 }
28
29 public void run() {
30 for (int i = 0; i < 5; i++) {
31 try {
32 Cache cache = cacheManager.getCacheFor(cacheType);
33 Object value = cache.pageOut(key);
34 assertEquals(value, this.value);
35 Thread.sleep((long) Math.random() * 1000l);
36 } catch (Exception e) {
37 fail("unable to retrieve String cache");
38 }
39 }
40 }
41 }
42
43 public void testDiskCache() throws CacheException {
44 Properties cacheProperties = new Properties();
45 cacheProperties.setProperty("cachesize", "5");
46 cacheProperties.setProperty("cachetype", CacheManagerImpl.DISK);
47
48 Cache diskCache = cacheManager.createCacheFor(Long.class, cacheProperties);
49 diskCache.pageIn("one", "1");
50 diskCache.pageIn("two", "2");
51 diskCache.pageIn("three", "3");
52 diskCache.pageIn("four", "4");
53 diskCache.pageIn("five", "5");
54 diskCache.pageIn("six", "6");
55
56 assertEquals("2", diskCache.pageOut("two"));
57 assertEquals("3", diskCache.pageOut("three"));
58 assertEquals("4", diskCache.pageOut("four"));
59 assertEquals("5", diskCache.pageOut("five"));
60 assertEquals("6", diskCache.pageOut("six"));
61
62 try {
63 String nil = (String) diskCache.pageOut("one");
64 fail("fetching nonexisting value from cache should have barfed");
65 } catch (CacheException e) {
66
67 }
68
69 cacheManager.destroyCacheFor(Long.class);
70 }
71
72 public void testNoParamCacheFails() throws CacheException {
73 try {
74 Properties cacheProperties = new Properties();
75 cacheManager.createCacheFor(Object.class, cacheProperties);
76 fail("cache with no properties should have barfed");
77 } catch (AssertionError a) {
78 assertTrue(a.getMessage().indexOf("unable to create cache for type:") > -1);
79 }
80 }
81
82 public void testDiskCacheWithCacheDir() throws CacheException {
83 Properties cacheProperties = new Properties();
84 cacheProperties.setProperty("cachesize", "5");
85 cacheProperties.setProperty("cachetype", CacheManagerImpl.DISK);
86 cacheProperties.setProperty("cachedir", System.getProperty("java.io.tmpdir"));
87
88 assertNotNull(cacheManager.createCacheFor(Integer.class, cacheProperties));
89 }
90
91 public void testDiskCacheFailsWithFalseCacheDir() throws CacheException {
92 try {
93 Properties cacheProperties = new Properties();
94 cacheProperties.setProperty("cachesize", "5");
95 cacheProperties.setProperty("cachetype", CacheManagerImpl.DISK);
96 cacheProperties.setProperty("cachedir", " %^( alkdjfkadjfaskdjfkasdjfkllajdsflkjakslsfjklasdjkfajsk" +
97 "adlksjfakldsjfaklsjfklaljajfkalsdjfajdsflkajsdlkfjasklfjaksjfkalsjdfklasjkfa" +
98 "asdlkfjasdkljfaklsjfklasjfklasjfklasjfklasjflkasjfklasjfklasjfjasklfjaskljf" +
99 "adslkfjadkslfjkkdsjfkadsljfdklasjfkadjsklfjaslkjdfasdkfjakdsjfdlkasjfklkjka" +
100 "adsklfjasdklfjaksldjfkasjfkasjfklasjfklasjfkalsjfkldsjfklajskldjfasdkjf" +
101 "asdlkfjakldjfakljfklajfkldsjfkalsdjfdkasjfkdasjfkalsjdkfjasdkjfaksjfkaldsjfasdj" +
102 "asldkfjalskdfjaklsdjfklasdjflkasdjflkasdjflkasjflkadsjfkalsjfskdljflkasjdjfklasddk" +
103 "asldkfjalksdfjaklsdjlkjfalsjflkasjdlkfjalksjdfkalsjdfkajsdfkljaskdfasjdkfas" +
104 "asdlksfjalksdjfalskdfasjfalskdjflkasjdflasdfkjjasjfaljsdlkjflaksdjkljfklasjfdkaldfj" +
105 "alksdjfakldjfklajflkdjflkajsdklfjaklsjfkalsjfkasjdfkasdjfaklsdjfaklsjfkaflsdkfj" +
106 "akldsfjalksdfjaklsdjfalskjfdkljfalksjflkdjfalksjdfkjasdklfjaksdfjasdkfljaklsjdfkdj" +
107 "alkdsjfalksjdflksjflkasjfklasdjfajsdlkjfkasjdaklfjasklfjalsdkfjaslkdfjasdfjalsfjd" +
108 "alkdsjflaskjflaksjflksdjflaksjfalksdjflaksdjfalskjdfkljaslkdfkasfjaslkjfaklsdjjfk" +
109 "aklsdfjalsdkjfklasdjfklasdfjlkajfklsdjfalksjfalksjfdddalksjflkasjdlkfj#*&*&(*#$()*Q&)");
110
111 cacheManager.createCacheFor(Double.class, cacheProperties);
112 fail("illegal directory should have barfed");
113 } catch (AssertionError a) {
114 assertTrue(a.getMessage().indexOf("not a valid cache dir") > -1);
115 }
116 }
117
118 public void testMultiThreadedClients() throws CacheException, InterruptedException {
119 Properties cacheProperties = new Properties();
120 cacheProperties.setProperty("cachesize", "5");
121 cacheProperties.setProperty("cachetype", CacheManagerImpl.MEMORY);
122
123 Cache memoryCache = cacheManager.createCacheFor(Array.class, cacheProperties);
124 memoryCache.pageIn("one", "1");
125 memoryCache.pageIn("two", "2");
126 memoryCache.pageIn("three", "3");
127
128 ThreadedCacheClient client1 = new ThreadedCacheClient(Array.class, "two", "2");
129 Thread t1 = new Thread(client1);
130 t1.setName("thread1");
131 t1.join();
132 t1.run();
133 ThreadedCacheClient client2 = new ThreadedCacheClient(Array.class, "two", "2");
134 Thread t2 = new Thread(client2);
135 t2.setName("thread2");
136 t2.join();
137 t2.run();
138 ThreadedCacheClient client3 = new ThreadedCacheClient(Array.class, "two", "2");
139 Thread t3 = new Thread(client3);
140 t3.setName("thread3");
141 t3.join();
142 t3.run();
143 ThreadedCacheClient client4 = new ThreadedCacheClient(Array.class, "two", "2");
144 Thread t4 = new Thread(client4);
145 t4.setName("thread4");
146 t4.join();
147 t4.run();
148 ThreadedCacheClient client5 = new ThreadedCacheClient(Array.class, "two", "2");
149 Thread t5 = new Thread(client5);
150 t5.setName("thread5");
151 t5.join();
152 t5.run();
153 }
154 }