FileDocCategorySizeDatePackage
TestStorageImplementation.javaAPI DocApache Lucene 2.1.012838Wed Feb 14 10:46:02 GMT 2007org.apache.lucene.gdata.storage.lucenestorage

TestStorageImplementation.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.lucenestorage;

import java.util.concurrent.atomic.AtomicBoolean;

import junit.framework.TestCase;

import org.apache.lucene.gdata.data.ServerBaseEntry;
import org.apache.lucene.gdata.server.registry.ComponentType;
import org.apache.lucene.gdata.server.registry.GDataServerRegistry;
import org.apache.lucene.gdata.server.registry.ProvidedService;
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.ProvidedServiceStub;
import org.apache.lucene.gdata.utils.Visitor;

import com.google.gdata.data.DateTime;

public class TestStorageImplementation extends TestCase {
    private static GDataServerRegistry reg = null;

    private Storage storage;

    public static boolean fail = false;

    protected void setUp() throws Exception {

        if (reg == null) {
            reg = GDataServerRegistry.getRegistry();
            if(reg.lookup(StorageController.class,ComponentType.STORAGECONTROLLER)!= null);
                reg.destroy();
            reg.registerComponent(StorageCoreControllerStub.class,null);

        }
        this.storage = reg.lookup(StorageController.class,
                ComponentType.STORAGECONTROLLER).getStorage();
    }

    protected void tearDown() throws Exception {
        this.storage.close();
        fail = false;
    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.storeEntry(ServerBaseEntry)'
     */
    public void testStoreEntry() {

        try {
            this.storage.storeEntry(null);
            fail("entry is null");
        } catch (StorageException e) {
            //
        }
        ServerBaseEntry entry = new ServerBaseEntry();
        entry.setServiceConfig(new ProvidedServiceStub());

        try {
            this.storage.storeEntry(entry);
            fail("feed is null");
        } catch (StorageException e) {
            //
        }

        entry.setFeedId("someID");
        try {
            this.storage.storeEntry(entry);

        } catch (StorageException e1) {
            fail("unexpected exception");

        }
        entry.setServiceConfig(null);
        try {
            this.storage.storeEntry(entry);
            fail("no service config");
        } catch (StorageException e) {

        }
        entry.setVersion(5);
        try {
            this.storage.storeEntry(entry);
            fail("version is greater than 1");
        } catch (StorageException e) {

        }

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.deleteEntry(ServerBaseEntry)'
     */
    public void testDeleteEntry() throws InterruptedException {
        try {
            this.storage.storeEntry(null);
            fail("entry is null");
        } catch (StorageException e) {
            //
        }
        ServerBaseEntry entry = new ServerBaseEntry();
        entry.setServiceConfig(new ProvidedServiceStub());
        entry.setId("someID");
        entry.setFeedId("someID");
        try {
            this.storage.storeEntry(entry);

        } catch (StorageException e) {
            fail("unexpected exception");
            //
        }
        entry.setFeedId(null);
        try {
            this.storage.deleteEntry(entry);
            fail("feed is null");
        } catch (StorageException e) {
            //
        }

        entry.setFeedId("someID");
        try {
            this.storage.deleteEntry(entry);

        } catch (StorageException e1) {
            e1.printStackTrace();
            fail("unexpected exception");

        }
        entry.setFeedId("someID");
        
        try {
            this.storage.deleteEntry(entry);

        } catch (StorageException e1) {
            e1.printStackTrace();
            fail("unexpected exception");

        }
        
        
        
        Object monitor = new Object();
        AtomicBoolean reached = new AtomicBoolean(false);

        MultiThreadEntryStub concuEntry = new MultiThreadEntryStub();
        concuEntry.setId(System.currentTimeMillis() + "");
        ProvidedService conf = new ProvidedServiceStub();
        
        concuEntry.setServiceConfig(conf);
        concuEntry.setUpdated(DateTime.now());
        concuEntry.setFeedId("feed");
        this.storage.storeEntry(concuEntry);
        storage.close();
        concuEntry.acceptGetVersionVisitor(getMonitorVisitor(monitor,reached));


        Thread t1 = getDelThread(storage, concuEntry, false);

        Thread t2 = getDelThread(storage, 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");
       
       
    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.updateEntry(ServerBaseEntry)'
     */
    public void testUpdateEntry() throws InterruptedException {
        Object monitor = new Object();
        AtomicBoolean reached = new AtomicBoolean(false);

        MultiThreadEntryStub concuEntry = new MultiThreadEntryStub();
        concuEntry.setId(System.currentTimeMillis() + "");
        ProvidedService conf = new ProvidedServiceStub();
        
        concuEntry.setServiceConfig(conf);
        concuEntry.setUpdated(DateTime.now());
        concuEntry.setFeedId("feed");
        this.storage.storeEntry(concuEntry);
        storage.close();
        concuEntry.acceptGetEntryVisitor(getMonitorVisitor(monitor,reached));


        Thread t1 = getUpdThread(storage, concuEntry, false);

        Thread t2 = getUpdThread(storage, 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");

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.getFeed(ServerBaseFeed)'
     */
    public void testGetFeed() {

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.getEntry(ServerBaseEntry)'
     */
    public void testGetEntry() {

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.close()'
     */
    public void testClose() {

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.storeAccount(GDataAccount)'
     */
    public void testStoreAccount() {

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.updateAccount(GDataAccount)'
     */
    public void testUpdateAccount() {

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.deleteAccount(String)'
     */
    public void testDeleteAccount() {

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.storeFeed(ServerBaseFeed,
     * String)'
     */
    public void testStoreFeed() {

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.deleteFeed(String)'
     */
    public void testDeleteFeed() {

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.updateFeed(ServerBaseFeed,
     * String)'
     */
    public void testUpdateFeed() {

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.getServiceForFeed(String)'
     */
    public void testGetServiceForFeed() {

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.getAccount(String)'
     */
    public void testGetAccount() {

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.getAccountNameForFeedId(String)'
     */
    public void testGetAccountNameForFeedId() {

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.getEntryLastModified(String,
     * String)'
     */
    public void testGetEntryLastModified() {

    }

    /*
     * Test method for
     * 'org.apache.lucene.gdata.storage.lucenestorage.StorageImplementation.getFeedLastModified(String)'
     */
    public void testGetFeedLastModified() {

    }
    static class Runner implements Runnable {
        Storage s;

        StorageController c;

        ServerBaseEntry e;

        boolean expConf;

        StorageOperation op;

        public Runner(Storage s, ServerBaseEntry e,
                boolean expectConflict, StorageOperation op) {
            this.s = s;
            this.e = e;
            this.expConf = expectConflict;
            this.op = op;
        }

        public void run() {
           
            try {
                if (this.op == StorageOperation.DELETE)
                    this.s.deleteEntry(e);
                if (this.op == StorageOperation.UPDATE)
                    this.s.updateEntry(e);
                if (expConf)
                    fail = true;
            } catch (ModificationConflictException ex) {
                if (!expConf)
                    fail = true;
                ex.printStackTrace();

            } catch (StorageException ex) {
                ex.printStackTrace();
                fail = true;
            }

        }
    }
    
    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(Storage s, ServerBaseEntry e,
            boolean conflictExpected) {
        Thread t1 = new Thread(new Runner(s, e, conflictExpected,
                StorageOperation.DELETE));
        t1.setPriority(Thread.MAX_PRIORITY);
        return t1;
    }

    private Thread getUpdThread(Storage s, ServerBaseEntry e,
            boolean conflictExpected) {
        Thread t1 = new Thread(new Runner(s, e, conflictExpected,
                StorageOperation.UPDATE));
        t1.setPriority(Thread.MAX_PRIORITY);
        return t1;
    }

}