1   package org.jmage.cache;
2   
3   import junit.framework.TestCase;
4   import org.apache.log4j.Logger;
5   
6   import java.util.List;
7   import java.util.Properties;
8   import java.util.Random;
9   
10  /***
11   * MemoryCacheTests
12   */
13  public class MemoryCacheTests extends TestCase {
14  
15      protected CacheManager cacheManager = CacheManagerImpl.getCacheManager();
16  
17      public class ThreadedCacheClient implements Runnable {
18          protected Logger log = Logger.getLogger(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 testMemoryCache() throws CacheException {
44          Properties cacheProperties = new Properties();
45          cacheProperties.setProperty("cachesize", "5");
46          cacheProperties.setProperty("cachetype", CacheManagerImpl.MEMORY);
47  
48          Cache memoryCache = cacheManager.createCacheFor(String.class, cacheProperties);
49          memoryCache.pageIn("one", "1");
50          memoryCache.pageIn("two", "2");
51          memoryCache.pageIn("three", "3");
52          memoryCache.pageIn("four", "4");
53          memoryCache.pageIn("five", "5");
54          memoryCache.pageIn("six", "6");
55  
56          assertEquals("2", memoryCache.pageOut("two"));
57          assertEquals("3", memoryCache.pageOut("three"));
58          assertEquals("4", memoryCache.pageOut("four"));
59          assertEquals("5", memoryCache.pageOut("five"));
60          assertEquals("6", memoryCache.pageOut("six"));
61  
62          try {
63              String nil = (String) memoryCache.pageOut("one");
64              fail("fetching nonexisting value from cache should have barfed");
65          } catch (CacheException e) {
66  
67          }
68  
69          cacheManager.destroyCacheFor(String.class);
70      }
71  
72      public void testNoParamCacheFails() throws CacheException {
73          try {
74              Properties cacheProperties = new Properties();
75              cacheManager.createCacheFor(StringBuffer.class, cacheProperties);
76              fail("cache with no properties should have barfed");
77          } catch (AssertionError a) {
78          }
79      }
80  
81      public void testMemoryCacheMultipleClients() throws CacheException {
82          Properties cacheProperties = new Properties();
83          cacheProperties.setProperty("cachesize", "5");
84          cacheProperties.setProperty("cachetype", CacheManagerImpl.MEMORY);
85  
86          Cache memoryCache = cacheManager.createCacheFor(Math.class, cacheProperties);
87          memoryCache.pageIn("one", "1");
88  
89          Cache mathCache = cacheManager.getCacheFor(Math.class);
90          assertEquals("1", mathCache.pageOut("one"));
91      }
92  
93      public void testMemoryCacheFailsWrongReference() throws CacheException {
94          Properties cacheProperties = new Properties();
95          cacheProperties.setProperty("cachesize", "5");
96          cacheProperties.setProperty("cachetype", CacheManagerImpl.MEMORY);
97  
98          Cache memoryCache = cacheManager.createCacheFor(Random.class, cacheProperties);
99          memoryCache.pageIn("one", "1");
100 
101         try {
102             cacheManager.getCacheFor(List.class);
103             fail("wrong reference for memory cache should have barfed");
104         } catch (Exception e) {
105             assertTrue(e.getMessage().indexOf("unable to find a cache for this factory type") > -1);
106         }
107     }
108 
109     public void testMultiThreadedClients() throws CacheException, InterruptedException {
110         Properties cacheProperties = new Properties();
111         cacheProperties.setProperty("cachesize", "5");
112         cacheProperties.setProperty("cachetype", CacheManagerImpl.MEMORY);
113 
114         Cache memoryCache = cacheManager.createCacheFor(Thread.class, cacheProperties);
115         memoryCache.pageIn("one", "1");
116         memoryCache.pageIn("two", "2");
117         memoryCache.pageIn("three", "3");
118 
119         ThreadedCacheClient client1 = new ThreadedCacheClient(Thread.class, "two", "2");
120         Thread t1 = new Thread(client1);
121         t1.setName("thread1");
122         t1.join();
123         t1.run();
124         ThreadedCacheClient client2 = new ThreadedCacheClient(Thread.class, "two", "2");
125         Thread t2 = new Thread(client2);
126         t2.setName("thread2");
127         t2.join();
128         t2.run();
129         ThreadedCacheClient client3 = new ThreadedCacheClient(Thread.class, "two", "2");
130         Thread t3 = new Thread(client3);
131         t3.setName("thread3");
132         t3.join();
133         t3.run();
134         ThreadedCacheClient client4 = new ThreadedCacheClient(Thread.class, "two", "2");
135         Thread t4 = new Thread(client4);
136         t4.setName("thread4");
137         t4.join();
138         t4.run();
139         ThreadedCacheClient client5 = new ThreadedCacheClient(Thread.class, "two", "2");
140         Thread t5 = new Thread(client5);
141         t5.setName("thread5");
142         t5.join();
143         t5.run();
144     }
145 }