1   /*
2    * $Id: TextFileStoreTestCase.java 12058 2008-06-16 12:02:56Z rossmason $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  package org.mule.util.store;
11  
12  import org.mule.tck.AbstractMuleTestCase;
13  import org.mule.tck.testmodels.fruit.Apple;
14  import org.mule.tck.testmodels.fruit.Banana;
15  import org.mule.tck.testmodels.fruit.Kiwi;
16  import org.mule.util.FileUtils;
17  
18  import java.io.File;
19  
20  public class TextFileStoreTestCase extends AbstractMuleTestCase
21  {
22      public static final String DIR = ".mule/temp";
23      TextFileObjectStore store;
24  
25      //@Override
26      protected void doSetUp() throws Exception
27      {
28          super.doSetUp();
29          FileUtils.deleteTree(new File(DIR));
30  
31      }
32  
33      //@Override
34      protected void doTearDown() throws Exception
35      {
36          if (store != null)
37          {
38              store.dispose();
39          }
40          FileUtils.deleteTree(new File(DIR));
41          super.doTearDown();
42  
43      }
44  
45      public void testTimedExpiry() throws Exception
46      {
47          // entryTTL=3 and expiryInterval=1 will cause background expiry
48          store = new TextFileObjectStore();
49          store.setDirectory(DIR);
50          store.setMuleContext(muleContext);
51          store.setName("timed");
52          store.setMaxEntries(3);
53          store.setEntryTTL(3000);
54          store.setExpirationInterval(1000);
55          store.initialise();
56  
57          // store entries in quick succession
58          assertTrue(store.storeObject("1", "1"));
59          assertTrue(store.storeObject("2", "2"));
60          assertTrue(store.storeObject("3", "3"));
61  
62          // they should still be alive at this point
63          assertTrue(store.containsObject("1"));
64          assertTrue(store.containsObject("2"));
65          assertTrue(store.containsObject("3"));
66  
67          // wait until the entry TTL has been exceeded
68          Thread.sleep(4000);
69  
70          // make sure all values are gone
71          assertFalse(store.containsObject("1"));
72          assertFalse(store.containsObject("2"));
73          assertFalse(store.containsObject("3"));
74  
75      }
76  
77      public void testTimedExpiryWithRestart() throws Exception
78      {
79          // entryTTL=3 and expiryInterval=1 will cause background expiry
80          store = new TextFileObjectStore();
81          store.setDirectory(DIR);
82          store.setMuleContext(muleContext);
83          store.setName("timed");
84          store.setMaxEntries(3);
85          store.setEntryTTL(3000);
86          store.setExpirationInterval(1000);
87          store.initialise();
88  
89          // store entries in quick succession
90          assertTrue(store.storeObject("1", "1"));
91          assertTrue(store.storeObject("2", "2"));
92          assertTrue(store.storeObject("3", "3"));
93  
94          // they should still be alive at this point
95          assertTrue(store.containsObject("1"));
96          assertTrue(store.containsObject("2"));
97          assertTrue(store.containsObject("3"));
98  
99          store.dispose();
100 
101         store = new TextFileObjectStore();
102         store.setDirectory(DIR);
103         store.setMuleContext(muleContext);
104         store.setName("timed");
105         store.setMaxEntries(3);
106         store.setEntryTTL(3000);
107         store.setExpirationInterval(1000);
108         store.initialise();
109 
110         assertTrue(store.containsObject("1"));
111         assertTrue(store.containsObject("2"));
112         assertTrue(store.containsObject("3"));
113 
114         // wait until the entry TTL has been exceeded
115         Thread.sleep(4000);
116 
117         // make sure all values are gone
118         assertFalse(store.containsObject("1"));
119         assertFalse(store.containsObject("2"));
120         assertFalse(store.containsObject("3"));
121 
122         store.dispose();
123 
124         store = new TextFileObjectStore();
125         store.setDirectory(DIR);
126         store.setMuleContext(muleContext);
127         store.setName("timed");
128         store.setMaxEntries(3);
129         store.setEntryTTL(3000);
130         store.setExpirationInterval(1000);
131         store.initialise();
132 
133 // make sure all values are gone
134         assertFalse(store.containsObject("1"));
135         assertFalse(store.containsObject("2"));
136         assertFalse(store.containsObject("3"));
137 
138 
139     }
140 
141     public void testTimedExpiryWithObjects() throws Exception
142     {
143         // entryTTL=3 and expiryInterval=1 will cause background expiry
144         store = new TextFileObjectStore();
145         store.setDirectory(DIR);
146         store.setMuleContext(muleContext);
147         store.setName("timed");
148         store.setMaxEntries(3);
149         store.setEntryTTL(3000);
150         store.setExpirationInterval(1000);
151         store.initialise();
152 
153         // store entries in quick succession
154         try
155         {
156             assertTrue(store.storeObject("1", new Apple()));
157             fail("should not be abe to store objects");
158         }
159         catch (Exception e)
160         {
161             //expected
162         }
163     }
164 
165     public void testMaxSize() throws Exception
166     {
167         // entryTTL=-1 means we will have to expire manually
168         store = new TextFileObjectStore();
169         store.setDirectory(DIR);
170         store.setMuleContext(muleContext);
171         store.setName("bounded");
172         store.setMaxEntries(3);
173         store.setEntryTTL(-1);
174         store.setExpirationInterval(1000);
175         store.initialise();
176 
177 
178         assertTrue(store.storeObject("1", "1"));
179         assertTrue(store.storeObject("2", "2"));
180         assertTrue(store.storeObject("3", "3"));
181 
182         assertTrue(store.containsObject("1"));
183         assertTrue(store.containsObject("2"));
184         assertTrue(store.containsObject("3"));
185 
186         // sleep a bit to make sure that entries are not expired, even though the expiry
187         // thread is running every second
188         Thread.sleep(3000);
189         assertTrue(store.containsObject("1"));
190         assertTrue(store.containsObject("2"));
191         assertTrue(store.containsObject("3"));
192 
193         // exceed threshold
194         assertTrue(store.storeObject("4", "4"));
195 
196         // the oldest entry should still be there
197         assertTrue(store.containsObject("1"));
198 
199         // expire manually
200         store.expire();
201         assertFalse(store.containsObject("1"));
202         assertTrue(store.containsObject("2"));
203         assertTrue(store.containsObject("3"));
204         assertTrue(store.containsObject("4"));
205 
206         // exceed some more
207         assertTrue(store.storeObject("5", "5"));
208         store.expire();
209         assertFalse(store.containsObject("2"));
210         assertTrue(store.containsObject("3"));
211         assertTrue(store.containsObject("4"));
212         assertTrue(store.containsObject("5"));
213 
214         // and multiple times
215         assertTrue(store.storeObject("6", "6"));
216         assertTrue(store.storeObject("7", "7"));
217         assertTrue(store.storeObject("8", "8"));
218         assertTrue(store.storeObject("9", "9"));
219 
220         store.expire();
221         assertTrue(store.containsObject("7"));
222         assertTrue(store.containsObject("8"));
223         assertTrue(store.containsObject("9"));
224         assertFalse(store.containsObject("3"));
225         assertFalse(store.containsObject("4"));
226         assertFalse(store.containsObject("5"));
227         assertFalse(store.containsObject("6"));
228     }
229 
230 }