From: <res...@us...> - 2010-09-21 18:45:47
|
Revision: 3606 http://bigdata.svn.sourceforge.net/bigdata/?rev=3606&view=rev Author: resendes Date: 2010-09-21 18:45:41 +0000 (Tue, 21 Sep 2010) Log Message: ----------- Test coverage for BootStateUtil Modified Paths: -------------- branches/bbb_cleanup/bigdata-core/src/main/java/com/bigdata/util/BootStateUtil.java branches/bbb_cleanup/bigdata-core/src/test/java/com/bigdata/util/TestAll.java Added Paths: ----------- branches/bbb_cleanup/bigdata-core/src/test/java/com/bigdata/util/TestBootStateUtil.java Modified: branches/bbb_cleanup/bigdata-core/src/main/java/com/bigdata/util/BootStateUtil.java =================================================================== --- branches/bbb_cleanup/bigdata-core/src/main/java/com/bigdata/util/BootStateUtil.java 2010-09-21 16:47:18 UTC (rev 3605) +++ branches/bbb_cleanup/bigdata-core/src/main/java/com/bigdata/util/BootStateUtil.java 2010-09-21 18:45:41 UTC (rev 3606) @@ -45,7 +45,6 @@ import com.sun.jini.config.Config; import net.jini.config.Configuration; import net.jini.config.ConfigurationException; -import net.jini.config.NoSuchEntryException; import net.jini.core.lookup.ServiceID; /** @@ -80,7 +79,7 @@ private File persistenceDir = null; private UUID proxyId = null; private ServiceID serviceId = null; - private String stateKey = null; + private String stateKey = null; //TODO -- not used? public BootStateUtil(final Configuration config, final String componentName, @@ -128,22 +127,6 @@ recoverBootState(defaultServiceId); } - - public BootStateUtil(File persistenceDir, - Class entityImplType, - ServiceID defaultServiceId) - throws IOException, ClassNotFoundException - { - if(entityImplType == null) { - throw new NullPointerException("entityImplType null"); - } - this.entityImplType = entityImplType; - this.logger = Logger.getLogger(this.getClass()); - this.persistenceDir = persistenceDir; - - recoverBootState(defaultServiceId); - } - /** * Returns the entity's unique <i>proxy id</i> that is generated/recoverd * as part of the boot state maintained by this class. @@ -161,44 +144,6 @@ return serviceId; } - /** - * Returns the <code>String</code> representing the path of the - * directory in which the entity's <i>boot state</i> is located. - * If the value returned is <code>null</code>, then the entity - * was configured to run in <i>transient</i> mode. - */ - public String getPersistenceDirectory() { - return (persistenceDir != null) ? persistenceDir.toString() : null; - } - - /** - * Returns the <code>true</code> if the entity was configured to - * run in <i>persistent</i> mode; <code>false</code> otherwise. - */ - public boolean isPersistent() { - return (persistenceDir != null); - } - - /** - * If the entity is currently configured to run in <i>persistent</i> - * mode, returns the name-based key under which an entity's (non-boot) - * state was persisted during previous runs of the entity. If the - * entity is currently configured to run in <i>transient</i> mode, - * a non-<code>null</code>, randomly-generated key value is returned. - */ - public String getStateKey() { - return stateKey; - } - - /** - * Returns the <code>Class</code> type of the entity whose boot state - * is associated with the current instance of this utility. - */ - public Class getType() { - return entityImplType; - } - - /* Performs the actual retrieval of the entity's boot state. This * method is called only once, in this utility's constructor. * It recovers the entity's boot state from local persistence storage, @@ -338,6 +283,7 @@ /** * @see java.io.ObjectInputStream#resolveClass */ + @Override protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { @@ -354,7 +300,7 @@ * An interface is specified here to support evolution of new * versions of BootState. */ - interface BootState { + private interface BootState { Class getType(); UUID getProxyId(); String getKey(); Modified: branches/bbb_cleanup/bigdata-core/src/test/java/com/bigdata/util/TestAll.java =================================================================== --- branches/bbb_cleanup/bigdata-core/src/test/java/com/bigdata/util/TestAll.java 2010-09-21 16:47:18 UTC (rev 3605) +++ branches/bbb_cleanup/bigdata-core/src/test/java/com/bigdata/util/TestAll.java 2010-09-21 18:45:41 UTC (rev 3606) @@ -76,7 +76,7 @@ suite.addTestSuite(TestByteBufferBitVector.class); suite.addTestSuite( TestCSVReader.class ); - + suite.addTestSuite( TestBootStateUtil.class ); return suite; } Added: branches/bbb_cleanup/bigdata-core/src/test/java/com/bigdata/util/TestBootStateUtil.java =================================================================== --- branches/bbb_cleanup/bigdata-core/src/test/java/com/bigdata/util/TestBootStateUtil.java (rev 0) +++ branches/bbb_cleanup/bigdata-core/src/test/java/com/bigdata/util/TestBootStateUtil.java 2010-09-21 18:45:41 UTC (rev 3606) @@ -0,0 +1,354 @@ +package com.bigdata.util; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.io.StreamCorruptedException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +import net.jini.config.Configuration; +import net.jini.config.ConfigurationFile; +import net.jini.config.EmptyConfiguration; +import net.jini.config.ConfigurationException; +import net.jini.config.NoSuchEntryException; +import net.jini.core.lookup.ServiceID; + +import org.apache.log4j.Logger; + +import junit.framework.TestCase; +import junit.framework.TestCase2; + +public class TestBootStateUtil extends TestCase2 { + + public TestBootStateUtil(String name) { + super(name); + } + + public void testBootStateUtilNullConsArgs() throws SecurityException, NoSuchMethodException { + Configuration dummyConfiguration = EmptyConfiguration.INSTANCE; + String dummyString = "dummy"; + Class<? extends TestBootStateUtil> dummyClass = this.getClass(); + Logger dummyLogger = Logger.getLogger(dummyClass); + + // Command lines with a null in first three args are invalid + Object [][] badCommandLines = { + {null, null, null, null}, + {null, null, null, dummyLogger}, + {null, null, dummyClass, null}, + {null, null, dummyClass, dummyLogger}, + {null, dummyString, null, null}, + {null, dummyString, null, dummyLogger}, + {null, dummyString, dummyClass, null}, + {null, dummyString, dummyClass, dummyLogger}, + {dummyConfiguration, null, null, null}, + {dummyConfiguration, null, null, dummyLogger}, + {dummyConfiguration, null, dummyClass, null}, + {dummyConfiguration, null, dummyClass, dummyLogger}, + {dummyConfiguration, dummyString, null, null}, + {dummyConfiguration, dummyString, null, dummyLogger}, + }; + + Constructor cons = + BootStateUtil.class.getConstructor(Configuration.class, + String.class, Class.class, Logger.class); + for (int i=0; i < badCommandLines.length; i++) { + try { + cons.newInstance(badCommandLines[i]); + fail("Successfully called constructor with null arg: " + + Arrays.asList(badCommandLines[i])); + } catch (IllegalArgumentException e) { + fail("unexpected exception: " + e.toString()); + } catch (InstantiationException e) { + fail("unexpected exception: " + e.toString()); + } catch (IllegalAccessException e) { + fail("unexpected exception: " + e.toString()); + } catch (InvocationTargetException e) { + if (! (e.getCause() instanceof NullPointerException)){ + fail("unexpected exception: " + e.getCause().toString()); + } + //Otherwise ignore -- expected + } + } + } + + public void testBootStateUtilGoodConsArgs() throws SecurityException, NoSuchMethodException { + Configuration dummyConfiguration = EmptyConfiguration.INSTANCE; + String dummyString = "dummy"; + Class<? extends TestBootStateUtil> dummyClass = this.getClass(); + Logger dummyLogger = Logger.getLogger(dummyClass); + + // Command lines with a non-null in first three args are valid + Object [][] goodCommandLines = { + {dummyConfiguration, dummyString, dummyClass, null}, + {dummyConfiguration, dummyString, dummyClass, dummyLogger}, + }; + + testGoodConsArgs(goodCommandLines); + } + + public void testBootStateUtilNoEntries() + throws SecurityException, NoSuchMethodException, IOException, + ConfigurationException, ClassNotFoundException + { + Class<? extends TestBootStateUtil> dummyClass = this.getClass(); + String className = dummyClass.getName(); + ConfigurationBuilder builder = new ConfigurationBuilder(); + Configuration dummyConfiguration = builder.buildConfiguration(); + Logger dummyLogger = Logger.getLogger(className); + + BootStateUtil bsu = + new BootStateUtil(dummyConfiguration, className, dummyClass, null); + + assertTrue(bsu.getProxyId() != null); + assertTrue(bsu.getServiceId() != null); + + } + + public void testBootStateUtilNonExistentPersistenceDir() + throws SecurityException, NoSuchMethodException, IOException, ConfigurationException + { + Class<? extends TestBootStateUtil> dummyClass = this.getClass(); + String className = dummyClass.getName(); + File persistenceDir = File.createTempFile(className, ".tmp"); + persistenceDir.delete(); + ConfigurationBuilder builder = new ConfigurationBuilder(); + builder.setComponentName(className); + builder.setPersistenceDir(persistenceDir); + Configuration dummyConfiguration = builder.buildConfiguration(); + Logger dummyLogger = Logger.getLogger(className); + + // Command lines with a non-null in first three args are valid + Object [][] goodCommandLines = { + {dummyConfiguration, className, dummyClass, null}, + {dummyConfiguration, className, dummyClass, dummyLogger}, + }; + testGoodConsArgs(goodCommandLines); + + assertTrue(persistenceDir.exists()); + persistenceDir.delete(); + } + + public void testBootStateUtilExistentPersistenceDir() + throws SecurityException, NoSuchMethodException, IOException, ConfigurationException + { + Class<? extends TestBootStateUtil> dummyClass = this.getClass(); + String className = dummyClass.getName(); + File persistenceDir = File.createTempFile(className, ".tmp"); + persistenceDir.delete(); + assertTrue(persistenceDir.mkdirs()); + persistenceDir.deleteOnExit(); + ConfigurationBuilder builder = new ConfigurationBuilder(); + builder.setComponentName(className); + builder.setPersistenceDir(persistenceDir); + Configuration dummyConfiguration = builder.buildConfiguration(); + Logger dummyLogger = Logger.getLogger(className); + + // Command lines with a non-null in first three args are valid + Object [][] goodCommandLines = { + {dummyConfiguration, className, dummyClass, null}, + {dummyConfiguration, className, dummyClass, dummyLogger}, + }; + testGoodConsArgs(goodCommandLines); + persistenceDir.delete(); + } + + public void testBootStateUtilWithEmptyBootState() + throws SecurityException, NoSuchMethodException, IOException, + ConfigurationException, ClassNotFoundException + { + Class<? extends TestBootStateUtil> dummyClass = this.getClass(); + String className = dummyClass.getName(); + File persistenceDir = File.createTempFile(className, ".tmp"); + persistenceDir.delete(); + assertTrue(persistenceDir.mkdirs()); + persistenceDir.deleteOnExit(); + ConfigurationBuilder builder = new ConfigurationBuilder(); + builder.setComponentName(className); + builder.setPersistenceDir(persistenceDir); + File bootStateFile = new File(persistenceDir, "boot.state"); + bootStateFile.createNewFile(); + Configuration dummyConfiguration = builder.buildConfiguration(); + + try { + BootStateUtil bsu = + new BootStateUtil(dummyConfiguration, className, dummyClass, null); + fail("Created boot state instance with emtpy state information file"); + } catch (IOException e) { + //ignore -- expected + } + + } + + public void testBootStateUtilWithInvalidBootState() + throws SecurityException, NoSuchMethodException, IOException, + ConfigurationException, ClassNotFoundException + { + //Create boot state dir/file with default information + Class<? extends TestBootStateUtil> dummyClass = this.getClass(); + String className = dummyClass.getName(); + File persistenceDir = File.createTempFile(className, ".tmp"); + persistenceDir.delete(); + assertTrue(persistenceDir.mkdirs()); + persistenceDir.deleteOnExit(); + ConfigurationBuilder builder = new ConfigurationBuilder(); + builder.setComponentName(className); + builder.setPersistenceDir(persistenceDir); + Configuration dummyConfiguration = builder.buildConfiguration(); + new BootStateUtil(dummyConfiguration, className, dummyClass, null); + // Mangle boot state file by writing junk into the beginning of the file + File bootStateFile = new File(persistenceDir, "boot.state"); + RandomAccessFile raf = new RandomAccessFile(bootStateFile, "rws"); + raf.seek(0); + raf.writeUTF("Bogus data"); + raf.close(); + + //Try to recover from bogus data + try { + new BootStateUtil(dummyConfiguration, className, dummyClass, null); + } catch (StreamCorruptedException e) { + //ignore -- expected + } + } + + public void testBootStateUtilConsWithDefaultServiceId() + throws SecurityException, NoSuchMethodException, IOException, + ConfigurationException, ClassNotFoundException + { + Class<? extends TestBootStateUtil> dummyClass = this.getClass(); + String className = dummyClass.getName(); + File persistenceDir = File.createTempFile(className, ".tmp"); + persistenceDir.delete(); + ConfigurationBuilder builder = new ConfigurationBuilder(); + builder.setComponentName(className); + ServiceID defaultServiceId = new ServiceID(1L, 2L); + builder.setDefaultServiceId(defaultServiceId); + Configuration dummyConfiguration = builder.buildConfiguration(); + Logger dummyLogger = Logger.getLogger(className); + + BootStateUtil bsu = + new BootStateUtil(dummyConfiguration, className, dummyClass, null); + assertTrue(bsu.getServiceId().equals(defaultServiceId)); + UUID defaultProxyID = + new UUID( + defaultServiceId.getMostSignificantBits(), + defaultServiceId.getLeastSignificantBits()); + assertTrue(bsu.getProxyId().equals(defaultProxyID)); + } + + public void testBootStateUtilDefaultServiceId() + throws SecurityException, NoSuchMethodException, IOException, + ConfigurationException, ClassNotFoundException + { + Class<? extends TestBootStateUtil> dummyClass = this.getClass(); + String className = dummyClass.getName(); + File persistenceDir = File.createTempFile(className, ".tmp"); + persistenceDir.delete(); + ConfigurationBuilder builder = new ConfigurationBuilder(); + builder.setComponentName(className); + ServiceID defaultServiceID = new ServiceID(1L, 1L); + builder.setDefaultServiceId(defaultServiceID); + Configuration dummyConfiguration = builder.buildConfiguration(); + + BootStateUtil bsu = + new BootStateUtil(dummyConfiguration, className, dummyClass, null); + assertTrue(bsu.getServiceId().equals(defaultServiceID)); + UUID proxyID = bsu.getProxyId(); + assertTrue(proxyID.getLeastSignificantBits() == defaultServiceID.getLeastSignificantBits()); + assertTrue(proxyID.getMostSignificantBits() == defaultServiceID.getMostSignificantBits()); + } + + public void testBootStateUtilBadPersistenceDir() + throws SecurityException, NoSuchMethodException, IOException, ConfigurationException, ClassNotFoundException + { + Class<? extends TestBootStateUtil> dummyClass = this.getClass(); + String className = dummyClass.getName(); + //create temp file -- should fail dir creation, below + File persistenceDir = File.createTempFile(className, ".tmp"); + ConfigurationBuilder builder = new ConfigurationBuilder(); + builder.setComponentName(className); + builder.setPersistenceDir(persistenceDir); + Configuration dummyConfiguration = builder.buildConfiguration(); + + try { + new BootStateUtil(dummyConfiguration, className, dummyClass, null); + fail("Created BootStateUtil with bad dir file: " + + persistenceDir.getAbsolutePath()); + } catch (IOException e) { + //ignore -- expected + } + } + + + private static void testGoodConsArgs(Object[][] goodCommandLines) + throws SecurityException, NoSuchMethodException + { + Constructor<BootStateUtil> cons = + BootStateUtil.class.getConstructor(Configuration.class, + String.class, Class.class, Logger.class); + for (int i=0; i < goodCommandLines.length; i++) { + try { + cons.newInstance(goodCommandLines[i]); + } catch (IllegalArgumentException e) { + fail("unexpected exception: " + e.toString()); + } catch (InstantiationException e) { + fail("unexpected exception: " + e.toString()); + } catch (IllegalAccessException e) { + fail("unexpected exception: " + e.toString()); + } catch (InvocationTargetException e) { + fail("unexpected exception: " + e.getCause().toString()); + } + } + } + + private static class ConfigurationBuilder { + private String componentName = null; + private File persistenceDir = null; + private ServiceID defaultServiceId = null; + + ConfigurationBuilder() { + + } + + void setComponentName(String componentName) { + this.componentName = componentName; + } + + void setPersistenceDir(File persistenceDirFile) { + this.persistenceDir = persistenceDirFile; + } + + void setDefaultServiceId(ServiceID defaultServiceId) { + this.defaultServiceId = defaultServiceId; + } + + Configuration buildConfiguration() throws ConfigurationException { + List<String> args = new ArrayList<String>(); + args.add("-"); + if(persistenceDir != null) { + args.add( + componentName + ".persistenceDirectory=" + + "\"" + persistenceDir.getAbsolutePath().replace("\\", "\\\\") + + "\""); + } + if (defaultServiceId != null){ + args.add( + componentName + ".defaultServiceId=" + + "new net.jini.core.lookup.ServiceID(" + + defaultServiceId.getMostSignificantBits() + + ", " + + defaultServiceId.getLeastSignificantBits() + + ")"); + } + ConfigurationFile dummyConfiguration = + new ConfigurationFile(args.toArray(new String[0])); + return dummyConfiguration; + + } + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |