blob: dbbd2ced3f42f7bf4389be357ce58e900f6c4bd8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.datacache;
import java.util.Calendar;
import java.util.Date;
import org.apache.openjpa.conf.OpenJPAConfiguration;
import org.apache.openjpa.datacache.ClearableScheduler;
import org.apache.openjpa.datacache.ConcurrentDataCache;
import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
public class TestClearableScheduler extends SingleEMFTestCase {
private static String getMinutesString() {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < 60; i++) {
if (i % 2 == 0)
buf.append(i).append(',');
}
return buf.toString();
}
@Override
public void setUp() {
setUp(
"openjpa.DataCache", "true(EvictionSchedule=+1)"
, "openjpa.QueryCache", "true"
,"openjpa.RemoteCommitProvider", "sjvm"
,CachedPerson.class, CLEAR_TABLES
);
}
public void testBasic() throws Exception {
OpenJPAEntityManagerSPI em = emf.createEntityManager();
OpenJPAConfiguration conf = ((OpenJPAEntityManagerSPI) em).getConfiguration();
ClearableScheduler scheduler = new ClearableScheduler(conf);
// Make the scheduler run every 1 minute
scheduler.setInterval(1);
DummyCache cache1 = new DummyCache();
DummyCache cache2 = new DummyCache();
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int currMin = cal.get(Calendar.MINUTE);
int plusOne = currMin+1;
int plusTwo = plusOne+1;
if(plusOne>=60){
plusOne-=60;
}
if(plusTwo>=60){
plusTwo-=60;
}
// Schedule eviction to happen the next two minutes
scheduler.scheduleEviction(cache2, plusOne+","+plusTwo+" * * * *");
// Schedule eviction to happen every mintue on cache 1
scheduler.scheduleEviction(cache1, ("+1"));
Thread.currentThread();
Thread.sleep(61000);
assertEquals(1,cache1.getClearCount());
assertEquals(1,cache2.getClearCount());
Thread.currentThread();
Thread.sleep(60000);
assertEquals(2,cache1.getClearCount());
assertEquals(2,cache2.getClearCount());
Thread.currentThread();
Thread.sleep(60000);
assertEquals(3,cache1.getClearCount());
assertEquals(2,cache2.getClearCount());
}
// Comment this test out while investigating OPENJPA-1692
// public void testMultithreadedInitialization() throws Exception {
// final OpenJPAConfiguration conf = emf.getConfiguration();
// final List<DataCacheManager> dcms = new Vector<DataCacheManager>();
// Runnable r = new Runnable(){
// public void run() {
// dcms.add(conf.getDataCacheManagerInstance());
// }
// };
// List<Thread> workers = new ArrayList<Thread>();
// for(int i = 0;i<20;i++){
// workers.add(new Thread(r));
// }
// for(Thread t : workers){
// t.start();
// }
// for(Thread t : workers){
// t.join();
// }
// DataCacheManager prev = dcms.get(0);
// for(DataCacheManager dcm : dcms){
// assertTrue(prev == dcm);
// prev = dcm;
// }
//
// }
/**
* Pass in 4 out of 5 tokens.
*/
// private void doTest(String valid, String invalid) throws Exception {
//
// OpenJPAEntityManagerFactory emf = (OpenJPAEntityManagerFactory) getEmf();
// OpenJPAConfiguration conf = ((OpenJPAEntityManagerFactorySPI)
// OpenJPAPersistence.cast(emf)).getConfiguration();
//
// DataCacheScheduler scheduler = new DataCacheScheduler(conf);
// scheduler.setInterval(1);
//
// Calendar cal = Calendar.getInstance();
// cal.setTime(new Date());
// String sched = ((cal.get(Calendar.MINUTE) + 1) % 60) + " ";
// DummyCache validCache = new DummyCache();
// scheduler.scheduleEviction(validCache, sched + valid);
// DummyCache invalidCache = new DummyCache();
// scheduler.scheduleEviction(invalidCache, sched + invalid);
// Thread thread = new Thread(scheduler);
// thread.setDaemon(true);
// thread.start();
// // test that it did not run yet...
// Thread.currentThread().sleep(70 * 1000); // 70 seconds
// scheduler.stop();
// // assertEquals(2, validCache.clearCount);
// assertTrue("Wrong invocation count: " + validCache.clearCount, validCache.clearCount == 1
// || validCache.clearCount == 2);
// assertEquals(0, invalidCache.clearCount);
// }
private class DummyCache extends ConcurrentDataCache {
private static final long serialVersionUID = 1L;
int clearCount = 0;
public synchronized int getClearCount(){
return clearCount;
}
@Override
public synchronized void clear() {
clearCount++;
}
}
}