📄 testdb4ostorage.java
字号:
/** * Copyright 2004 The Apache Software Foundation * * Licensed 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.lucene.gdata.storage.db4o;import java.io.File;import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicBoolean;import junit.framework.TestCase;import org.apache.lucene.gdata.data.GDataAccount;import org.apache.lucene.gdata.data.ServerBaseEntry;import org.apache.lucene.gdata.data.ServerBaseFeed;import org.apache.lucene.gdata.server.registry.ProvidedServiceConfig;import org.apache.lucene.gdata.storage.ModificationConflictException;import org.apache.lucene.gdata.storage.Storage;import org.apache.lucene.gdata.storage.StorageController;import org.apache.lucene.gdata.storage.StorageException;import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper.StorageOperation;import org.apache.lucene.gdata.utils.MultiThreadEntryStub;import org.apache.lucene.gdata.utils.Visitor;import com.db4o.ObjectContainer;import com.db4o.ObjectSet;import com.db4o.query.Query;import com.google.gdata.data.BaseEntry;import com.google.gdata.data.BaseFeed;import com.google.gdata.data.DateTime;import com.google.gdata.data.PlainTextConstruct;public class TestDb4oStorage extends TestCase { private static final String FEEDID = "myFeed"; private static final String ACCOUNTNAME = "myAccount"; private static final String SERVICENAME = "myService"; DB4oController controller; static volatile boolean fail = false; protected void setUp() throws Exception { this.controller = new DB4oController(); this.controller.setContainerPoolSize(2); this.controller.setFilePath("test.yap"); this.controller.setRunAsServer(true); this.controller.setPassword(""); this.controller.setUser(""); this.controller.setUseWeakReferences(true); this.controller.setPort(0); this.controller.initialize(); this.controller.visiteInitialize(); clearDB(); } protected void tearDown() throws Exception { clearDB(); fail = false; this.controller.getStorage().close(); this.controller.visiteDestroy(); this.controller.destroy(); File dbFile = new File("test.yap"); assertTrue(dbFile.delete()); } private void clearDB() { ObjectContainer container = this.controller.releaseContainer(); ObjectSet set = container.get(new Object()); for (Object object : set) { container.delete(object); } container.ext().purge(); container.close(); } ObjectContainer getContainer() { return this.controller.releaseContainer(); } /* * Test method for * 'org.apache.lucene.gdata.storage.db4o.DB4oStorage.storeEntry(ServerBaseEntry)' */ @SuppressWarnings("unchecked") public void testStoreEntry() throws StorageException { Storage storage = this.controller.getStorage(); try { ServerBaseEntry e = createServerBaseEntry(); storage.storeEntry(e); fail("excption exp. for feed for the entry"); } catch (StorageException e) { // } try { storage.storeEntry(null); fail("entry is null"); } catch (StorageException e) { // } ServerBaseEntry exEntry = new ServerBaseEntry(); exEntry.setFeedId("some"); try { storage.storeEntry(exEntry); fail("entry id is null"); } catch (StorageException e) { // } exEntry.setId("someID"); exEntry.setFeedId(null); try { storage.storeEntry(exEntry); fail("feed id is null"); } catch (StorageException e) { // } storeServerBaseFeed(); ServerBaseEntry e = createServerBaseEntry(); storage.storeEntry(e); ServerBaseEntry e1 = createServerBaseEntry(); storage.storeEntry(e1); storage = this.controller.getStorage(); Query query = getContainer().query(); query.constrain(BaseEntry.class); query.descend("id").constrain(e.getId()); ObjectSet resultSet = query.execute(); assertEquals(1, resultSet.size()); BaseEntry storedEntry = (BaseEntry) resultSet.next(); assertEquals("1", storedEntry.getVersionId()); ServerBaseFeed bFeed = new ServerBaseFeed(); bFeed.setItemsPerPage(25); bFeed.setId(FEEDID); bFeed.setStartIndex(1); bFeed.setServiceType(SERVICENAME); BaseFeed<BaseFeed, BaseEntry> feed = storage.getFeed(bFeed); assertEquals(2, feed.getEntries().size()); assertEquals(e.getId(), feed.getEntries().get(1).getId()); // last post // -> // previously // created assertEquals(e1.getId(), feed.getEntries().get(0).getId()); // first pos // -> last // created assertEquals(feed.getUpdated(), feed.getEntries().get(0).getUpdated()); } /* * Test method for * 'org.apache.lucene.gdata.storage.db4o.DB4oStorage.deleteEntry(ServerBaseEntry)' */ public void testDeleteEntry() throws StorageException, InterruptedException { ObjectContainer container = getContainer(); storeServerBaseFeed(); Storage storage = this.controller.getStorage(); try { storage.deleteEntry(null); fail("entry is null"); } catch (StorageException e) { // } ServerBaseEntry exEntry = new ServerBaseEntry(); exEntry.setFeedId("some"); try { storage.deleteEntry(exEntry); fail("entry id is null"); } catch (StorageException e) { // } exEntry.setId("someID"); exEntry.setFeedId(null); try { storage.storeEntry(exEntry); fail("feed id is null"); } catch (StorageException e) { // } ServerBaseEntry e = createServerBaseEntry(); storage.storeEntry(e); ServerBaseEntry e1 = createServerBaseEntry(); storage.storeEntry(e1); storage.deleteEntry(e); container.close(); container = getContainer(); Query query = container.query(); query.constrain(BaseEntry.class); query.descend("id").constrain(e.getId()); ObjectSet resultSet = query.execute(); assertEquals(0, resultSet.size()); // #### test version matching ServerBaseEntry eVersion = createServerBaseEntry(); storage.storeEntry(eVersion); eVersion.setVersion(33); try { storage.deleteEntry(eVersion); fail("version does not match"); } catch (Exception ex) { // TODO: handle exception } try { storage.deleteEntry(null); fail("entry id is null"); } catch (Exception ex) { // TODO: handle exception } storage = this.controller.getStorage(); storage.deleteEntry(e1); container.close(); container = getContainer(); query = container.query(); query.constrain(BaseEntry.class); query.descend("id").constrain(e1.getId()); resultSet = query.execute(); assertEquals(0, resultSet.size()); // ############ test concurrency // ############ test concurrency Object monitor = new Object(); AtomicBoolean reached = new AtomicBoolean(false); MultiThreadEntryStub concuEntry = new MultiThreadEntryStub(); concuEntry.setId(System.currentTimeMillis() + ""); ProvidedServiceConfig conf = new ProvidedServiceConfig(); conf.setName(SERVICENAME); concuEntry.setServiceConfig(conf); concuEntry.setUpdated(DateTime.now()); concuEntry.setFeedId(FEEDID); storage = this.controller.getStorage(); storage.storeEntry(concuEntry); storage.close(); concuEntry.acceptGetVersionVisitor(getMonitorVisitor(monitor, reached)); Thread t1 = getDelThread(controller, concuEntry, false); Thread t2 = getDelThread(controller, concuEntry, true); t1.start(); /* * Wait active -- not nice but works fine here wait until thread parked */ while (true) { synchronized (monitor) { if (reached.get()) break; monitor.wait(10); } } t2.start(); t2.join(800); /* * Wait active -- not nice but works fine here wake up the waiting * thread */ while (true) { synchronized (monitor) { if (!reached.get()) break; monitor.notifyAll(); } } t1.join(300); if (fail) fail("thread failed -- see stacktrace"); container.close(); } private Visitor getMonitorVisitor(final Object monitor, final AtomicBoolean reached) { /* * The executing thread stops at a defined position while holding the * semaphore inside the storageImpl */ return new Visitor() { public void execute(Object[] o) { synchronized (monitor) { try { reached.set(true); monitor.wait(); reached.set(false); } catch (InterruptedException e) { // } } } }; } private Thread getDelThread(StorageController c, ServerBaseEntry e, boolean conflictExpected) { Thread t1 = new Thread(new Runner(c, e, conflictExpected, StorageOperation.DELETE)); t1.setPriority(Thread.MAX_PRIORITY); return t1; } private Thread getUpdThread(StorageController c, ServerBaseEntry e, boolean conflictExpected) { Thread t1 = new Thread(new Runner(c, e, conflictExpected, StorageOperation.UPDATE)); t1.setPriority(Thread.MAX_PRIORITY); return t1; } /* * Test method for * 'org.apache.lucene.gdata.storage.db4o.DB4oStorage.updateEntry(ServerBaseEntry)' */ public void testUpdateEntry() throws StorageException, InterruptedException { storeServerBaseFeed(); Storage storage = this.controller.getStorage(); ServerBaseEntry exEntry = new ServerBaseEntry();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -