|
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.
|