From 35af51f9683f5ef8cec66baca7b89aa1e1cbc44e Mon Sep 17 00:00:00 2001
From: coulbeck <coulbeck@localhost>
Date: Fri, 11 May 2007 23:27:30 +0000
Subject: [PATCH] Issue 1532: Remove ConfigEntry from Backend API. (DS-1532)

---
 opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestVerifyJob.java | 1332 ++++++++++++++++++++++++++++-----------------------------
 1 files changed, 662 insertions(+), 670 deletions(-)

diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestVerifyJob.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestVerifyJob.java
index 58940c0..a8b36d3 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestVerifyJob.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestVerifyJob.java
@@ -26,7 +26,6 @@
  */
 package org.opends.server.backends.jeb;
 
-import org.opends.server.config.ConfigEntry;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.TestCaseUtils;
 import org.opends.server.types.*;
@@ -50,696 +49,689 @@
 
 public class TestVerifyJob extends JebTestCase
 {
-	private  String cfgDN=
-		"ds-cfg-backend-id=verifyRoot,cn=Backends,cn=config";
-	//Root suffix for verify backend
-	private static String suffix="dc=verify,dc=jeb";
-	private static  String vBranch="ou=verify tests," + suffix;
-	private  String beID="verifyRoot";
-	private  String numUsersLine="define numusers= #numEntries#";
-	//Attribute type in stat entry containing error count
-	private  String errorCount="verify-error-count";
-	private  DN configDN;
-	private  DN[] baseDNs;
-	private ConfigEntry configEntry;
-	private BackendImpl be;
-	private RootContainer rContainer;
-	private EntryContainer eContainer;
-	private DN2ID dn2id;
-	private ID2Entry id2entry;
-	private Index id2child;
-	private Index id2subtree;
-	private Transaction txn;
-	
-	//Some DNs needed mostly for DN2ID tests
-	private  String junkDN="cn=junk," + vBranch;
-	private  String junkDN1="cn=junk1," + vBranch;
-	private  String junkDN2="cn=junk2," + vBranch;
-	private  String junkDN3="cn=junk3," + vBranch;
-	//This DN has no parent
-	private  String noParentDN="cn=junk1,cn=junk22," + vBranch;
-	//Parent child combo for id2child/subtree type tests
-	private  String pDN="cn=junk222," + vBranch;
-	private  String cDN="cn=junk4,cn=junk222," + vBranch;
-	//Bad DN
-	private  String badDN="this is a bad DN";
-	//This index file should not exist
-	private  String badIndexName="badIndexName";
-	
-    @DataProvider(name = "indexes")
-    public Object[][] indexes() {
-        return new Object[][] {
-            { "telephoneNumber"},
-            {"givenName"},
-            { "id2subtree"},
-            {"id2children"},
-            {"dn2id"}
-        };
-    }
-    
-    private static String[] template = new String[] {
-        "define suffix="+suffix,
-        "define maildomain=example.com",
-        "define numusers= #numEntries#",
-        "",
-        "branch: [suffix]",
-        "",
-        "branch: " + vBranch,
-        "subordinateTemplate: person:[numusers]",
-        "",
-        "template: person",
-        "rdnAttr: uid",
-        "objectClass: top",
-        "objectClass: person",
-        "objectClass: organizationalPerson",
-        "objectClass: inetOrgPerson",
-        "givenName: ABOVE LIMIT",
-        "sn: <last>",
-        "cn: {givenName} {sn}",
-        "initials: {givenName:1}<random:chars:" +
-             "ABCDEFGHIJKLMNOPQRSTUVWXYZ:1>{sn:1}",
-        "employeeNumber: <sequential:0>",
-        "uid: user.{employeeNumber}",
-        "mail: {uid}@[maildomain]",
-        "userPassword: password",
-        "telephoneNumber: <random:telephone>",
-        "homePhone: <random:telephone>",
-        "pager: <random:telephone>",
-        "mobile: <random:telephone>",
-        "street: <random:numeric:5> <file:streets> Street",
-        "l: <file:cities>",
-        "st: <file:states>",
-        "postalCode: <random:numeric:5>",
-        "postalAddress: {cn}${street}${l}, {st}  {postalCode}",
-        "description: This is the description for {cn}.",
-        ""};
+  //Root suffix for verify backend
+  private static String suffix="dc=verify,dc=jeb";
+  private static  String vBranch="ou=verify tests," + suffix;
+  private  String beID="verifyRoot";
+  private  String numUsersLine="define numusers= #numEntries#";
+  //Attribute type in stat entry containing error count
+  private  String errorCount="verify-error-count";
+  private  DN[] baseDNs;
+  private BackendImpl be;
+  private EntryContainer eContainer;
+  private DN2ID dn2id;
+  private ID2Entry id2entry;
+  private Index id2child;
+  private Index id2subtree;
+  private Transaction txn;
 
-    @BeforeClass
-    public void setup() throws Exception {
-      TestCaseUtils.startServer();
-      configDN = DN.decode(cfgDN);
-      baseDNs = new DN[] {
-              DN.decode(suffix)
-      };
-      configEntry = DirectoryServer.getConfigEntry(configDN);
-    }
-    
-    @AfterClass
-    public void cleanUp() throws Exception {
-    	TestCaseUtils.clearJEBackend(false, beID, suffix);
-    }
-    
-    /**
-     * Performs a ncomplete verify against a backend using the
-     * entries loaded in the setup initializer.
-     * 
-     * @throws Exception if error count is not equal to 0.
-     */
+  //Some DNs needed mostly for DN2ID tests
+  private  String junkDN="cn=junk," + vBranch;
+  private  String junkDN1="cn=junk1," + vBranch;
+  private  String junkDN2="cn=junk2," + vBranch;
+  private  String junkDN3="cn=junk3," + vBranch;
+  //This DN has no parent
+  private  String noParentDN="cn=junk1,cn=junk22," + vBranch;
+  //Parent child combo for id2child/subtree type tests
+  private  String pDN="cn=junk222," + vBranch;
+  private  String cDN="cn=junk4,cn=junk222," + vBranch;
+  //Bad DN
+  private  String badDN="this is a bad DN";
+  //This index file should not exist
+  private  String badIndexName="badIndexName";
 
-    @Test()
-    public void testCompleteVerifyJob()  throws Exception {
-    	cleanAndLoad(9);
-    	VerifyConfig verifyConfig = new VerifyConfig();
-    	verifyConfig.setBaseDN(baseDNs[0]);
-    	Entry statEntry=bldStatEntry("");
-    	be=(BackendImpl) DirectoryServer.getBackend(beID);
-    	be.verifyBackend(verifyConfig, configEntry, baseDNs, statEntry);
-    	assertEquals(getStatEntryCount(statEntry, errorCount), 0);
-    }
+  @DataProvider(name = "indexes")
+  public Object[][] indexes() {
+    return new Object[][] {
+         { "telephoneNumber"},
+         {"givenName"},
+         { "id2subtree"},
+         {"id2children"},
+         {"dn2id"}
+    };
+  }
 
-    /**
-     * Adds more than "entry limit" number of entries and runs clean
-     * verify against two indexes.
-     * 
-     * @throws Exception if error count is not equal to 0.
-     */
-    @Test()
-    public void testEntryLimitVerifyJob()  throws Exception {
-    	cleanAndLoad(25);
-    	VerifyConfig verifyConfig = new VerifyConfig();
-    	verifyConfig.setBaseDN(baseDNs[0]);
-    	verifyConfig.addCleanIndex("telephoneNumber");
-    	verifyConfig.addCleanIndex("givenName");
-    	Entry statEntry=bldStatEntry("");
-    	be=(BackendImpl) DirectoryServer.getBackend(beID);
-    	be.verifyBackend(verifyConfig, configEntry, baseDNs, statEntry);
-    	assertEquals(getStatEntryCount(statEntry, errorCount), 0);
-    }
+  private static String[] template = new String[] {
+       "define suffix="+suffix,
+       "define maildomain=example.com",
+       "define numusers= #numEntries#",
+       "",
+       "branch: [suffix]",
+       "",
+       "branch: " + vBranch,
+       "subordinateTemplate: person:[numusers]",
+       "",
+       "template: person",
+       "rdnAttr: uid",
+       "objectClass: top",
+       "objectClass: person",
+       "objectClass: organizationalPerson",
+       "objectClass: inetOrgPerson",
+       "givenName: ABOVE LIMIT",
+       "sn: <last>",
+       "cn: {givenName} {sn}",
+       "initials: {givenName:1}<random:chars:" +
+            "ABCDEFGHIJKLMNOPQRSTUVWXYZ:1>{sn:1}",
+       "employeeNumber: <sequential:0>",
+       "uid: user.{employeeNumber}",
+       "mail: {uid}@[maildomain]",
+       "userPassword: password",
+       "telephoneNumber: <random:telephone>",
+       "homePhone: <random:telephone>",
+       "pager: <random:telephone>",
+       "mobile: <random:telephone>",
+       "street: <random:numeric:5> <file:streets> Street",
+       "l: <file:cities>",
+       "st: <file:states>",
+       "postalCode: <random:numeric:5>",
+       "postalAddress: {cn}${street}${l}, {st}  {postalCode}",
+       "description: This is the description for {cn}.",
+       ""};
 
-    /**
-     * Runs clean verify jobs against a set of indexes (defined in
-     * indexes array).
-     * @param index An element of the indexes array.
-     * @throws Exception if the error count is not equal to 0.
-     */
-    
-    @Test(dataProvider = "indexes")
-    public void testCleanVerifyJob(String index)  throws Exception {
-    	cleanAndLoad(9);
-    	VerifyConfig verifyConfig = new VerifyConfig();
-    	verifyConfig.setBaseDN(baseDNs[0]);
-    	verifyConfig.addCleanIndex(index);
-    	Entry statEntry=bldStatEntry("");
-    	be=(BackendImpl) DirectoryServer.getBackend(beID);
-    	be.verifyBackend(verifyConfig, configEntry, baseDNs, statEntry);
-    	assertEquals(getStatEntryCount(statEntry, errorCount), 0);
-    }
-    
-    /*
+  @BeforeClass
+  public void setup() throws Exception {
+    TestCaseUtils.startServer();
+    baseDNs = new DN[] {
+         DN.decode(suffix)
+    };
+  }
+
+  @AfterClass
+  public void cleanUp() throws Exception {
+    TestCaseUtils.clearJEBackend(false, beID, suffix);
+  }
+
+  /**
+   * Performs a ncomplete verify against a backend using the
+   * entries loaded in the setup initializer.
+   *
+   * @throws Exception if error count is not equal to 0.
+   */
+
+  @Test()
+  public void testCompleteVerifyJob()  throws Exception {
+    cleanAndLoad(9);
+    VerifyConfig verifyConfig = new VerifyConfig();
+    verifyConfig.setBaseDN(baseDNs[0]);
+    Entry statEntry=bldStatEntry("");
+    be=(BackendImpl) DirectoryServer.getBackend(beID);
+    be.verifyBackend(verifyConfig, statEntry);
+    assertEquals(getStatEntryCount(statEntry, errorCount), 0);
+  }
+
+  /**
+   * Adds more than "entry limit" number of entries and runs clean
+   * verify against two indexes.
+   *
+   * @throws Exception if error count is not equal to 0.
+   */
+  @Test()
+  public void testEntryLimitVerifyJob()  throws Exception {
+    cleanAndLoad(25);
+    VerifyConfig verifyConfig = new VerifyConfig();
+    verifyConfig.setBaseDN(baseDNs[0]);
+    verifyConfig.addCleanIndex("telephoneNumber");
+    verifyConfig.addCleanIndex("givenName");
+    Entry statEntry=bldStatEntry("");
+    be=(BackendImpl) DirectoryServer.getBackend(beID);
+    be.verifyBackend(verifyConfig, statEntry);
+    assertEquals(getStatEntryCount(statEntry, errorCount), 0);
+  }
+
+  /**
+   * Runs clean verify jobs against a set of indexes (defined in
+   * indexes array).
+   * @param index An element of the indexes array.
+   * @throws Exception if the error count is not equal to 0.
+   */
+
+  @Test(dataProvider = "indexes")
+  public void testCleanVerifyJob(String index)  throws Exception {
+    cleanAndLoad(9);
+    VerifyConfig verifyConfig = new VerifyConfig();
+    verifyConfig.setBaseDN(baseDNs[0]);
+    verifyConfig.addCleanIndex(index);
+    Entry statEntry=bldStatEntry("");
+    be=(BackendImpl) DirectoryServer.getBackend(beID);
+    be.verifyBackend(verifyConfig, statEntry);
+    assertEquals(getStatEntryCount(statEntry, errorCount), 0);
+  }
+
+  /*
      * Begin Clean index tests. These are tests that cursor through an index
      * file and validate it's keys and idlists against the id2entry database entries.
      * The complete index tests go the other way. They cursor the id2entry database
      * and validate each entry against the various index files.
      */
 
-    /**
-     * Runs clean verify against the dn2id index after adding
-     * various errors in that index file.
-     * 
-     * @throws Exception if the error count is not equal to 5.
-     */
-    @Test()
-    public void testCleanDN2ID() throws Exception {
-    	preTest(3);
-    	//Add a junk DN and non-existent entry id to DN2ID index
-    	DN testDN=DN.decode(junkDN);
-    	EntryID id=new EntryID(45);      
-    	assertTrue(dn2id.insert(txn, testDN, id));
-    	//Make two DN keys point at same entry.
-    	testDN=DN.decode(junkDN1);
-    	id=new EntryID(3);
-    	assertTrue(dn2id.insert(txn, testDN, id));
-    	//Add badDN key with bad entry id
-    	DatabaseEntry key= 
-    		new DatabaseEntry(StaticUtils.getBytes(badDN));
-    	DatabaseEntry data = 
-    		new EntryID(37).getDatabaseEntry();  
-    	assertTrue(dn2id.putRaw(txn, key, data));
-    	//Add DN key with malformed entryID
-    	key=new DatabaseEntry(StaticUtils.getBytes(junkDN2));
-    	data= new DatabaseEntry(new byte[3]);
-    	assertTrue(dn2id.putRaw(txn, key, data));
-    	//Try to break JebFormat version
-    	addID2EntryReturnKey(junkDN3, 20, true);
-    	id=new EntryID(20);
-    	assertTrue(dn2id.insert(txn, DN.decode(junkDN3), id));
-    	performBECleanVerify("dn2id", 5); 
-    }
+  /**
+   * Runs clean verify against the dn2id index after adding
+   * various errors in that index file.
+   *
+   * @throws Exception if the error count is not equal to 5.
+   */
+  @Test()
+  public void testCleanDN2ID() throws Exception {
+    preTest(3);
+    //Add a junk DN and non-existent entry id to DN2ID index
+    DN testDN=DN.decode(junkDN);
+    EntryID id=new EntryID(45);
+    assertTrue(dn2id.insert(txn, testDN, id));
+    //Make two DN keys point at same entry.
+    testDN=DN.decode(junkDN1);
+    id=new EntryID(3);
+    assertTrue(dn2id.insert(txn, testDN, id));
+    //Add badDN key with bad entry id
+    DatabaseEntry key=
+         new DatabaseEntry(StaticUtils.getBytes(badDN));
+    DatabaseEntry data =
+         new EntryID(37).getDatabaseEntry();
+    assertTrue(dn2id.putRaw(txn, key, data));
+    //Add DN key with malformed entryID
+    key=new DatabaseEntry(StaticUtils.getBytes(junkDN2));
+    data= new DatabaseEntry(new byte[3]);
+    assertTrue(dn2id.putRaw(txn, key, data));
+    //Try to break JebFormat version
+    addID2EntryReturnKey(junkDN3, 20, true);
+    id=new EntryID(20);
+    assertTrue(dn2id.insert(txn, DN.decode(junkDN3), id));
+    performBECleanVerify("dn2id", 5);
+  }
 
-    /**
-     * Runs clean verify against the id2children index after adding
-     * various errors in that index file.
-     * 
-     * @throws Exception if the error count is not equal to 6.
-     */
-    @Test() public void testCleanID2Children() throws Exception {
-    	preTest(3);
-    	//Add malformed key
-    	byte[] shortBytes = new byte[3];
-    	DatabaseEntry key= new DatabaseEntry(shortBytes);
-    	EntryIDSet idSet=new EntryIDSet();
-    	id2child.writeKey(txn, key, idSet);
-    	//Try to break JebFormat version of key entry
-    	key=addID2EntryReturnKey(junkDN, 4, true);
-    	idSet=new EntryIDSet(new byte[16], new byte[16]);
-    	id2child.writeKey(txn, key, idSet);
-    	//put invalid key -- no EntryID matches
-    	key= new EntryID(45).getDatabaseEntry();
-    	id2child.writeKey(txn, key, idSet);
-    	//invalid ids in id list
-    	key=addID2EntryReturnKey(junkDN1, 5, false);
-    	byte[] idBytes=new byte[24];
-    	//doesn't exist
-    	idBytes[3] = (byte)0xff;
-    	//not a child
-    	idBytes[15] = (byte)1;
-    	//bad jeb format
-    	idBytes[23] = (byte) 0x04;
-    	idSet=new EntryIDSet(null, idBytes);
-    	id2child.writeKey(txn, key, idSet);
-    	performBECleanVerify("id2children", 6);
-    }
+  /**
+   * Runs clean verify against the id2children index after adding
+   * various errors in that index file.
+   *
+   * @throws Exception if the error count is not equal to 6.
+   */
+  @Test() public void testCleanID2Children() throws Exception {
+    preTest(3);
+    //Add malformed key
+    byte[] shortBytes = new byte[3];
+    DatabaseEntry key= new DatabaseEntry(shortBytes);
+    EntryIDSet idSet=new EntryIDSet();
+    id2child.writeKey(txn, key, idSet);
+    //Try to break JebFormat version of key entry
+    key=addID2EntryReturnKey(junkDN, 4, true);
+    idSet=new EntryIDSet(new byte[16], new byte[16]);
+    id2child.writeKey(txn, key, idSet);
+    //put invalid key -- no EntryID matches
+    key= new EntryID(45).getDatabaseEntry();
+    id2child.writeKey(txn, key, idSet);
+    //invalid ids in id list
+    key=addID2EntryReturnKey(junkDN1, 5, false);
+    byte[] idBytes=new byte[24];
+    //doesn't exist
+    idBytes[3] = (byte)0xff;
+    //not a child
+    idBytes[15] = (byte)1;
+    //bad jeb format
+    idBytes[23] = (byte) 0x04;
+    idSet=new EntryIDSet(null, idBytes);
+    id2child.writeKey(txn, key, idSet);
+    performBECleanVerify("id2children", 6);
+  }
 
-    /**
-     * Runs clean verify against the id2subtree index after adding
-     * various errors in that index file.
-     * 
-     * @throws Exception if the error count is not equal to 7.
-     */
-    @Test() public void testCleanID2Subtree() throws Exception {
-    	preTest(4);
-    	//break key
-    	byte[] shortBytes = new byte[3];
-    	DatabaseEntry key= new DatabaseEntry(shortBytes);
-    	EntryIDSet idSet=new EntryIDSet();
-    	id2subtree.writeKey(txn, key, idSet);
-    	//put invalid ids into entry 3 idlist
-    	key= new EntryID(3).getDatabaseEntry();
-    	byte[] idBytes=new byte[16];
-    	//invalid id
-    	idBytes[3] = (byte)0xff;
-    	//non-subordinate
-    	idBytes[15] = (byte)1;
-    	idSet=new EntryIDSet(null, idBytes);
-    	id2subtree.writeKey(txn, key, idSet);	
-    	//Try to break JebFormat version of key entry
-    	key=addID2EntryReturnKey(junkDN, 4, true);   	
-    	idBytes[3]=(byte) 0x04;
-    	idBytes[15]=(byte)0x00;
-    	EntryIDSet idSet1=new EntryIDSet(null, idBytes);
-    	id2subtree.writeKey(txn, key, idSet1);
-    	//put invalid key -- no EntryID matches
-    	key= new EntryID(45).getDatabaseEntry();
-    	idSet=new EntryIDSet(null, idBytes);
-    	id2subtree.writeKey(txn, key, idSet);
-    	performBECleanVerify("id2subtree", 7);
-    }
+  /**
+   * Runs clean verify against the id2subtree index after adding
+   * various errors in that index file.
+   *
+   * @throws Exception if the error count is not equal to 7.
+   */
+  @Test() public void testCleanID2Subtree() throws Exception {
+    preTest(4);
+    //break key
+    byte[] shortBytes = new byte[3];
+    DatabaseEntry key= new DatabaseEntry(shortBytes);
+    EntryIDSet idSet=new EntryIDSet();
+    id2subtree.writeKey(txn, key, idSet);
+    //put invalid ids into entry 3 idlist
+    key= new EntryID(3).getDatabaseEntry();
+    byte[] idBytes=new byte[16];
+    //invalid id
+    idBytes[3] = (byte)0xff;
+    //non-subordinate
+    idBytes[15] = (byte)1;
+    idSet=new EntryIDSet(null, idBytes);
+    id2subtree.writeKey(txn, key, idSet);
+    //Try to break JebFormat version of key entry
+    key=addID2EntryReturnKey(junkDN, 4, true);
+    idBytes[3]=(byte) 0x04;
+    idBytes[15]=(byte)0x00;
+    EntryIDSet idSet1=new EntryIDSet(null, idBytes);
+    id2subtree.writeKey(txn, key, idSet1);
+    //put invalid key -- no EntryID matches
+    key= new EntryID(45).getDatabaseEntry();
+    idSet=new EntryIDSet(null, idBytes);
+    id2subtree.writeKey(txn, key, idSet);
+    performBECleanVerify("id2subtree", 7);
+  }
 
-    /**
-     * Runs clean verify against the telephoneNumber.equality index 
-     * after adding various errors in that index file.
-     * 
-     * @throws Exception if the error count is not equal to 4.
-     */
-    @Test() public void testCleanAttrIndex() throws Exception {
-    	String phoneType="telephoneNumber";
-    	preTest(3);  	
-    	//Need to open a second database against this index
-    	//so we can manipulate it. We can't get the index DB handle
-    	//any other way.
-    	DatabaseConfig config = new DatabaseConfig();
-        config.setAllowCreate(true);
-        config.setTransactional(true);
-        Database db=
-        	eContainer.openDatabase(config, phoneType + ".equality");
-		//Add entry with bad JEB format Version
-		addID2EntryReturnKey(junkDN, 4, true);
-    	//Add phone number with various bad id list entryIDs
-    	byte[] subBytes = StaticUtils.getBytes("0009999999");
-    	DatabaseEntry key= new DatabaseEntry(subBytes);
-       	byte[] dataBytes=new byte[32];
-       	//put duplicate ids in list
-    	dataBytes[7] = (byte)1;
-    	dataBytes[15] = (byte)1;
-    	//put id that doesn't exist
-    	dataBytes[23] = (byte)0xff;
-    	//point to bad entry added above
-    	dataBytes[31] = (byte) 0x04;
-    	DatabaseEntry data= new DatabaseEntry(dataBytes);
-    	OperationStatus status = EntryContainer.put(db, txn, key, data);
-		assertTrue(status == OperationStatus.SUCCESS);	
-       	//really 5 errors, but duplicate reference doesn't increment error
-    	//count for some reason
-    	performBECleanVerify(phoneType, 4);
-    }
-   
-    /*
+  /**
+   * Runs clean verify against the telephoneNumber.equality index
+   * after adding various errors in that index file.
+   *
+   * @throws Exception if the error count is not equal to 4.
+   */
+  @Test() public void testCleanAttrIndex() throws Exception {
+    String phoneType="telephoneNumber";
+    preTest(3);
+    //Need to open a second database against this index
+    //so we can manipulate it. We can't get the index DB handle
+    //any other way.
+    DatabaseConfig config = new DatabaseConfig();
+    config.setAllowCreate(true);
+    config.setTransactional(true);
+    Database db=
+         eContainer.openDatabase(config, phoneType + ".equality");
+    //Add entry with bad JEB format Version
+    addID2EntryReturnKey(junkDN, 4, true);
+    //Add phone number with various bad id list entryIDs
+    byte[] subBytes = StaticUtils.getBytes("0009999999");
+    DatabaseEntry key= new DatabaseEntry(subBytes);
+    byte[] dataBytes=new byte[32];
+    //put duplicate ids in list
+    dataBytes[7] = (byte)1;
+    dataBytes[15] = (byte)1;
+    //put id that doesn't exist
+    dataBytes[23] = (byte)0xff;
+    //point to bad entry added above
+    dataBytes[31] = (byte) 0x04;
+    DatabaseEntry data= new DatabaseEntry(dataBytes);
+    OperationStatus status = EntryContainer.put(db, txn, key, data);
+    assertTrue(status == OperationStatus.SUCCESS);
+    //really 5 errors, but duplicate reference doesn't increment error
+    //count for some reason
+    performBECleanVerify(phoneType, 4);
+  }
+
+  /*
      * Begin complete verify index tests. As described above, these are
-     * tests that cursor through the id2entry database and validate 
+     * tests that cursor through the id2entry database and validate
      * each entry against the various index files.
-     * 
-     */
-    
-    /**
-     * Runs complete verify against the telephoneNumber index 
-     * after adding various errors in the id2entry file.
-     * 
-     * @throws Exception if the error count is not equal to 3.
-     */
-    @Test() public void testVerifyID2Entry() throws Exception {
-    	preTest(3);    	
-    	//Add entry with short id
-       	byte[] shortBytes = new byte[3];
-    	DatabaseEntry key= new DatabaseEntry(shortBytes);
-    	Entry testEntry=bldStatEntry(junkDN);
-    	byte []entryBytes = 
-    		JebFormat.entryToDatabase(testEntry, new DataConfig());
-    	DatabaseEntry data= new DatabaseEntry(entryBytes);
-    	assertTrue(id2entry.putRaw(txn, key, data));
- 
-    	//add entry with ramdom bytes
-       	DatabaseEntry key1= new EntryID(4).getDatabaseEntry();
-    	byte []eBytes = new byte[459];
-    	for(int i=0;i<459;i++) {
-    		eBytes[i]=(byte) (i*2);
-    	}
-    	//set version correctly
-    	eBytes[0]=0x01;
-    	DatabaseEntry data1= new DatabaseEntry(eBytes);
-    	assertTrue(id2entry.putRaw(txn, key1, data1));
-    	performBECompleteVerify("telephoneNumber", 3);
-    }
-
-    /**
      *
-     * Runs complete verify against the dn2id index 
-     * after adding various errors in the dn2id file.
-     * 
-     * @throws Exception if the error count is not equal to 3.
      */
-    @Test() public void testVerifyDN2ID() throws Exception {
-    	preTest(9);
-    	//add entry but no corresponding dn2id key
-    	addID2EntryReturnKey(junkDN, 10, false);  	
-    	//entry has dn2id key but its entryID -- don't need key
-    	addID2EntryReturnKey(junkDN1, 11, false);
-    	//insert key with bad entry id (45 instead of 10)
-    	DN testDN=DN.decode(junkDN1);
-    	EntryID id=new EntryID(45);      
-    	assertTrue(dn2id.insert(txn, testDN, id));    	
-       	//entry has no parent in dn2id
-    	addID2EntryReturnKey(noParentDN, 12, false);
-    	//add the key/id
-    	testDN=DN.decode(noParentDN);
-    	id=new EntryID(12);      
-    	assertTrue(dn2id.insert(txn, testDN, id));
-    	performBECompleteVerify("dn2id", 3);
-    }
-    
-    /**
-     * 
-     * Runs complete verify against the id2children index 
-     * after adding various errors in the id2children file.
-     * 
-     * @throws Exception if the error count is not equal to 3.
-     */
-    @Test() public void testVerifyID2Children() throws Exception {
-    	preTest(9);
-    	//Add dn with no parent
-    	DatabaseEntry key=addID2EntryReturnKey(noParentDN, 10, false);
-    	byte[] idBytes=new byte[16];
-    	idBytes[7]=(byte) 0x0A;
-    	EntryIDSet idSet=new EntryIDSet(null, idBytes);	
-    	id2child.writeKey(txn, key, idSet);
-    	//Add child entry - don't worry about key
-    	addID2EntryReturnKey(cDN, 11, false);
-    	//Add its parent entry -- need the key
-       	DatabaseEntry keyp=addID2EntryReturnKey(pDN, 12, false);
-    	//add parent key/IDSet with bad IDset id
-    	byte[] idBytesp=new byte[16];
-    	idBytesp[7]=(byte) 0xFF;
-    	EntryIDSet idSetp=new EntryIDSet(null, idBytesp);
-    	id2child.writeKey(txn, keyp, idSetp);
-    	performBECompleteVerify("id2children", 3);
-    }
-    
-    /**
-     * 
-     * Runs complete verify against the id2children index 
-     * after adding various errors in the id2children file.
-     * This is a second test because the key needed to have 
-     * null idlist. This test is really just for coverage and
-     * should have a 0 error count.
-     * 
-     * @throws Exception if the error count is not equal to 0.
-     */
-    @Test() public void testVerifyID2Children1() throws Exception {
-    	preTest(2);
-    	//Add child entry - don't worry about key
-    	addID2EntryReturnKey(pDN, 10, false);
-    	//add parent key/IDSet with null keyset
-    	EntryIDSet idSetp=new EntryIDSet();   	
-    	DatabaseEntry key= new EntryID(2).getDatabaseEntry();
-    	id2child.writeKey(txn, key, idSetp);
-    	performBECompleteVerify("id2children", 0);
-    }
-  
-    /**
-     * 
-     * Runs complete verify against the id2subtree index 
-     * after adding various errors in the id2subtree file.
-     * 
-     * @throws Exception if the error count is not equal to 3.
-     */
-    @Test
-    public void testVerifyID2Subtree() throws Exception {
-    	preTest(2);
-    	//Add entry with no parent
-    	addID2EntryReturnKey(noParentDN, 3, false);
-    	performBECompleteVerify("id2subtree", 3);
-    }
-  
-    /**
-     * 
-     * Runs complete verify against the id2subtree index 
-     * after adding various errors in the id2subtree file.
-     * This is a second test because the key needed to have 
-     * null idlist. 
-     * 
-     * @throws Exception if the error count is not equal to 1.
-     */
-    @Test
-    public void testVerifyID2Subtree1() throws Exception {
-    	preTest(2);
-       	//Add child entry - don't worry about key
-    	addID2EntryReturnKey(pDN, 3, false);
-    	//add parent key/IDSet with null keyset
-    	EntryIDSet idSet=new EntryIDSet();   	
-    	DatabaseEntry key= new EntryID(2).getDatabaseEntry();
-    	id2subtree.writeKey(txn, key, idSet);
-    	performBECompleteVerify("id2subtree", 1);
-    }
 
-    /**
-     * Runs complete verify against the mail indexes
-     * (equality, presence, substring, ordering)
-     * after adding various errors to each of these index files.
-     * @throws Exception if the error count is not equal to 6.
-     */
-    @Test() public void testVerifyAttribute() throws Exception {
-    	String mailType="mail";
-    	preTest(4);  	
-    	//Need to open a second databases against this index
-    	//so we can manipulate it. 
-    	DatabaseConfig config = new DatabaseConfig();
-        config.setAllowCreate(true);
-        config.setTransactional(true);
-        //Get db handles to each index.
-        Database dbEq=
-        	eContainer.openDatabase(config, mailType + ".equality");
-        Database dbPres=
-        	eContainer.openDatabase(config, mailType + ".presence");
-        Database dbSub=
-        	eContainer.openDatabase(config, mailType + ".substring");
-        Database dbOr=
-        	eContainer.openDatabase(config, mailType + ".ordering");
-        //Add invalid idlist ids to both equality and ordering indexes.  
-    	DatabaseEntry key= 
-    		new DatabaseEntry(StaticUtils.getBytes("user.0@example.com"));
-       	byte[] dataBytes=new byte[16];
-       	//put duplicate ids in list
-    	dataBytes[7] = (byte)0xff;
-    	dataBytes[15] = (byte)0xfe;
-    	DatabaseEntry data= new DatabaseEntry(dataBytes);
-       	OperationStatus status = EntryContainer.put(dbEq, txn, key, data);
-		assertTrue(status == OperationStatus.SUCCESS);	
-	   	status = EntryContainer.put(dbOr, txn, key, data);
-		assertTrue(status == OperationStatus.SUCCESS);
-	    //Add null idlist to both equality and ordering indexes.  
-    	key = 
-    		new DatabaseEntry(StaticUtils.getBytes("user.1@example.com"));
-    	data= new DatabaseEntry(new EntryIDSet().toDatabase());  	
-    	status = EntryContainer.put(dbEq, txn, key, data);
-		assertTrue(status == OperationStatus.SUCCESS);	
-	   	status = EntryContainer.put(dbOr, txn, key, data);
-		assertTrue(status == OperationStatus.SUCCESS);
-		//Add invalid idlist ids to presence index.		
-    	 key = 
-    		new DatabaseEntry(StaticUtils.getBytes("+"));
-    	data = new DatabaseEntry(dataBytes);
-       	status = EntryContainer.put(dbPres, txn, key, data);
-		assertTrue(status == OperationStatus.SUCCESS);	
-	    //Add invalid idlist ids to substring index.
-		key = 
-			new DatabaseEntry(StaticUtils.getBytes("@examp"));
-		data = new DatabaseEntry(dataBytes);
-		status = EntryContainer.put(dbSub, txn, key, data);
-		assertTrue(status == OperationStatus.SUCCESS);	
-		performBECompleteVerify(mailType, 6);
-    }
+  /**
+   * Runs complete verify against the telephoneNumber index
+   * after adding various errors in the id2entry file.
+   *
+   * @throws Exception if the error count is not equal to 3.
+   */
+  @Test() public void testVerifyID2Entry() throws Exception {
+    preTest(3);
+    //Add entry with short id
+    byte[] shortBytes = new byte[3];
+    DatabaseEntry key= new DatabaseEntry(shortBytes);
+    Entry testEntry=bldStatEntry(junkDN);
+    byte []entryBytes =
+         JebFormat.entryToDatabase(testEntry, new DataConfig());
+    DatabaseEntry data= new DatabaseEntry(entryBytes);
+    assertTrue(id2entry.putRaw(txn, key, data));
 
-    /* Various tests not either clean or complete */
-    
-  
-    /**
-     * Try to verify a non-indexed attribute.
-     * @throws Exception if error count is not equal to 0.
-     */
-    @Test(expectedExceptions=Exception.class)
-    public void testVerifyNotIndexed()  throws Exception {
-    	cleanAndLoad(2);
-    	VerifyConfig verifyConfig = new VerifyConfig();
-    	verifyConfig.setBaseDN(baseDNs[0]);
-    	verifyConfig.addCleanIndex("userPassword");
-    	Entry statEntry=bldStatEntry("");
-    	be=(BackendImpl) DirectoryServer.getBackend(beID);
-    	be.verifyBackend(verifyConfig, configEntry, baseDNs, statEntry);
-    	assertEquals(getStatEntryCount(statEntry, errorCount), 0);
+    //add entry with ramdom bytes
+    DatabaseEntry key1= new EntryID(4).getDatabaseEntry();
+    byte []eBytes = new byte[459];
+    for(int i=0;i<459;i++) {
+      eBytes[i]=(byte) (i*2);
     }
-    
-    /**
-     * Try to verify an nonexistent attribute.
-     * @throws Exception if verify backend fails.
-     */
-    @Test(expectedExceptions=Exception.class)
-    public void testInvalidIndex()  throws Exception {
-    	cleanAndLoad(2);
-    	VerifyConfig verifyConfig = new VerifyConfig();
-    	verifyConfig.setBaseDN(baseDNs[0]);
-    	verifyConfig.addCleanIndex(badIndexName);
-    	Entry statEntry=bldStatEntry("");
-    	be=(BackendImpl) DirectoryServer.getBackend(beID);
-    	be.verifyBackend(verifyConfig, configEntry, baseDNs, statEntry);
-    }
-  
-    /* end tests */
-    
-    /**
-     * Adds an entry to the id2entry database with a dn and id passed into the
-     * method. Optional flag to set the Jeb version byte for those types of tests.
-     * @param dn the dn string to put in the entry.
-     * @param id to use as the id2entry key,
-     * @param trashFormat true if first byte should be changed to invalid value.
-     * @return Database entry key of the entry.
-     * @throws Exception if the entry is not added to the id2entry database.
-     */
-    private DatabaseEntry addID2EntryReturnKey(String dn, long id, boolean trashFormat) 
-    throws Exception {
-    	DatabaseEntry key= new EntryID(id).getDatabaseEntry();
-    	Entry testEntry=bldStatEntry(dn);
-    	byte []entryBytes = 
-    		JebFormat.entryToDatabase(testEntry, new DataConfig());
-    	if(trashFormat)
-    		entryBytes[0] = 0x67;
-    	DatabaseEntry data= new DatabaseEntry(entryBytes);
-    	assertTrue(id2entry.putRaw(txn, key, data));
-    	return key;
-    }
-    
-    /**
-     * Wrapper to do a clean verify.
-     * @param indexToDo index file to run verify against.
-     * @param expectedErrors number of errors expected for this test.
-     * @throws Exception if the verify fails.
-     */
-    private void performBECleanVerify(String indexToDo, 
-    		int expectedErrors) throws Exception {
-    	performBEVerify(indexToDo, expectedErrors, true);
-    }
-    
-    /**
-     * Wrapper to do a complete verify.
-     * @param indexToDo index file to run verify against.
-     * @param expectedErrors number of errors expected for this test.
-     * @throws Exception if the verify fails.
-     */
-    private void performBECompleteVerify(String indexToDo, 
-    		int expectedErrors) throws Exception {
-    	performBEVerify(indexToDo, expectedErrors, false);
-    }
-    
-    /**
-     * Performs either a clean or complete verify depending on
-     * flag passed in.
-     * 
-     * @param indexToDo index file to run verify against.
-     * @param expectedErrors number of errors expected for this test.
-     * @param clean do clean verify if true.
-     * @throws Exception if the verify fails.
-     */
-    private void performBEVerify(String indexToDo, 
-    		int expectedErrors, boolean clean) throws Exception {
-      	EntryContainer.transactionCommit(txn);
-    	VerifyConfig verifyConfig = new VerifyConfig();
-    	verifyConfig.setBaseDN(baseDNs[0]);
-    	if(!clean)
-    		verifyConfig.addCompleteIndex(indexToDo);
-    	else
-    		verifyConfig.addCleanIndex(indexToDo);
-    	Entry statEntry=bldStatEntry("");
-    	be.verifyBackend(verifyConfig, configEntry, baseDNs, statEntry);     
-    	assertEquals(getStatEntryCount(statEntry, errorCount), expectedErrors);
-    }
-    
-    
-    /**
-     * Does a pretest setup. Creates some number of entries, gets
-     * backend, rootcontainer, entryContainer objects, as well as 
-     * various index objects.
-     * Also starts a transaction.
-     * @param numEntries number of entries to add to the verify backend.
-     * @throws Exception if entries cannot be loaded.
-     */
-    private void preTest(int numEntries) throws Exception {
-    	cleanAndLoad(numEntries);
-    	be=(BackendImpl) DirectoryServer.getBackend(beID);
-    	rContainer= be.getRootContainer();
-    	eContainer= rContainer.getEntryContainer(DN.decode(suffix));
-    	id2child=eContainer.getID2Children();
-    	id2entry=eContainer.getID2Entry();
-    	id2subtree=eContainer.getID2Subtree();
-    	dn2id=eContainer.getDN2ID();
-    	txn = eContainer.beginTransaction();
-    }
-    
-    /**
-     * Cleans verify backend and loads some number of entries.
-     * @param numEntries number of entries to load into the backend.
-     * @throws Exception if the entries are not loaded or created.
-     */
-    private void cleanAndLoad(int numEntries) throws Exception {
-    	TestCaseUtils.clearJEBackend(false, beID, suffix);
-    	template[2]=numUsersLine;
-    	template[2]=
-    		template[2].replaceAll("#numEntries#", String.valueOf(numEntries));
-    	createLoadEntries(template, numEntries);
-    }
+    //set version correctly
+    eBytes[0]=0x01;
+    DatabaseEntry data1= new DatabaseEntry(eBytes);
+    assertTrue(id2entry.putRaw(txn, key1, data1));
+    performBECompleteVerify("telephoneNumber", 3);
+  }
 
-    /**
-     * Gets information from the stat entry and returns that value as a Long.
-     * @param e entry to search.
-     * @param type attribute type
-     * @return Long
-     * @throws NumberFormatException if the attribute value cannot be parsed.
-     */
-    private long getStatEntryCount(Entry e, String type) 
-    throws NumberFormatException {
-    	AttributeType attrType =
-    		DirectoryServer.getAttributeType(type);
-    	if (attrType == null)
-    		attrType = DirectoryServer.getDefaultAttributeType(type);
-    	List<Attribute> attrList = e.getAttribute(attrType, null);
-    	LinkedHashSet<AttributeValue> values =
-    		attrList.get(0).getValues();
-    	AttributeValue v = values.iterator().next();
-    	long retVal = Long.parseLong(v.getStringValue());
-    	return (retVal);
-    }
+  /**
+   *
+   * Runs complete verify against the dn2id index
+   * after adding various errors in the dn2id file.
+   *
+   * @throws Exception if the error count is not equal to 3.
+   */
+  @Test() public void testVerifyDN2ID() throws Exception {
+    preTest(9);
+    //add entry but no corresponding dn2id key
+    addID2EntryReturnKey(junkDN, 10, false);
+    //entry has dn2id key but its entryID -- don't need key
+    addID2EntryReturnKey(junkDN1, 11, false);
+    //insert key with bad entry id (45 instead of 10)
+    DN testDN=DN.decode(junkDN1);
+    EntryID id=new EntryID(45);
+    assertTrue(dn2id.insert(txn, testDN, id));
+    //entry has no parent in dn2id
+    addID2EntryReturnKey(noParentDN, 12, false);
+    //add the key/id
+    testDN=DN.decode(noParentDN);
+    id=new EntryID(12);
+    assertTrue(dn2id.insert(txn, testDN, id));
+    performBECompleteVerify("dn2id", 3);
+  }
 
-    /**
-     * Builds an entry suitable for using in the verify job to gather statistics about
-     * the verify.
-     * @param dn to put into the entry.
-     * @return a suitable entry.
-     * @throws DirectoryException if the cannot be created.
-     */
-    private Entry bldStatEntry(String dn) throws DirectoryException {
-    	DN entryDN = DN.decode(dn);
-    	HashMap<ObjectClass, String> ocs = new HashMap<ObjectClass, String>(2);
-    	ObjectClass topOC = DirectoryServer.getObjectClass(OC_TOP);
-    	if (topOC == null) {
-    		topOC = DirectoryServer.getDefaultObjectClass(OC_TOP);
-    	}
-    	ocs.put(topOC, OC_TOP);
-    	ObjectClass extensibleObjectOC = DirectoryServer
-    	.getObjectClass(OC_EXTENSIBLE_OBJECT);
-    	if (extensibleObjectOC == null) {
-    		extensibleObjectOC = DirectoryServer
-    		.getDefaultObjectClass(OC_EXTENSIBLE_OBJECT);
-    	}
-    	ocs.put(extensibleObjectOC, OC_EXTENSIBLE_OBJECT);
-    	return new Entry(entryDN, ocs,
-    			new LinkedHashMap<AttributeType, List<Attribute>>(0),
-    			new HashMap<AttributeType, List<Attribute>>(0));
+  /**
+   *
+   * Runs complete verify against the id2children index
+   * after adding various errors in the id2children file.
+   *
+   * @throws Exception if the error count is not equal to 3.
+   */
+  @Test() public void testVerifyID2Children() throws Exception {
+    preTest(9);
+    //Add dn with no parent
+    DatabaseEntry key=addID2EntryReturnKey(noParentDN, 10, false);
+    byte[] idBytes=new byte[16];
+    idBytes[7]=(byte) 0x0A;
+    EntryIDSet idSet=new EntryIDSet(null, idBytes);
+    id2child.writeKey(txn, key, idSet);
+    //Add child entry - don't worry about key
+    addID2EntryReturnKey(cDN, 11, false);
+    //Add its parent entry -- need the key
+    DatabaseEntry keyp=addID2EntryReturnKey(pDN, 12, false);
+    //add parent key/IDSet with bad IDset id
+    byte[] idBytesp=new byte[16];
+    idBytesp[7]=(byte) 0xFF;
+    EntryIDSet idSetp=new EntryIDSet(null, idBytesp);
+    id2child.writeKey(txn, keyp, idSetp);
+    performBECompleteVerify("id2children", 3);
+  }
+
+  /**
+   *
+   * Runs complete verify against the id2children index
+   * after adding various errors in the id2children file.
+   * This is a second test because the key needed to have
+   * null idlist. This test is really just for coverage and
+   * should have a 0 error count.
+   *
+   * @throws Exception if the error count is not equal to 0.
+   */
+  @Test() public void testVerifyID2Children1() throws Exception {
+    preTest(2);
+    //Add child entry - don't worry about key
+    addID2EntryReturnKey(pDN, 10, false);
+    //add parent key/IDSet with null keyset
+    EntryIDSet idSetp=new EntryIDSet();
+    DatabaseEntry key= new EntryID(2).getDatabaseEntry();
+    id2child.writeKey(txn, key, idSetp);
+    performBECompleteVerify("id2children", 0);
+  }
+
+  /**
+   *
+   * Runs complete verify against the id2subtree index
+   * after adding various errors in the id2subtree file.
+   *
+   * @throws Exception if the error count is not equal to 3.
+   */
+  @Test
+  public void testVerifyID2Subtree() throws Exception {
+    preTest(2);
+    //Add entry with no parent
+    addID2EntryReturnKey(noParentDN, 3, false);
+    performBECompleteVerify("id2subtree", 3);
+  }
+
+  /**
+   *
+   * Runs complete verify against the id2subtree index
+   * after adding various errors in the id2subtree file.
+   * This is a second test because the key needed to have
+   * null idlist.
+   *
+   * @throws Exception if the error count is not equal to 1.
+   */
+  @Test
+  public void testVerifyID2Subtree1() throws Exception {
+    preTest(2);
+    //Add child entry - don't worry about key
+    addID2EntryReturnKey(pDN, 3, false);
+    //add parent key/IDSet with null keyset
+    EntryIDSet idSet=new EntryIDSet();
+    DatabaseEntry key= new EntryID(2).getDatabaseEntry();
+    id2subtree.writeKey(txn, key, idSet);
+    performBECompleteVerify("id2subtree", 1);
+  }
+
+  /**
+   * Runs complete verify against the mail indexes
+   * (equality, presence, substring, ordering)
+   * after adding various errors to each of these index files.
+   * @throws Exception if the error count is not equal to 6.
+   */
+  @Test() public void testVerifyAttribute() throws Exception {
+    String mailType="mail";
+    preTest(4);
+    //Need to open a second databases against this index
+    //so we can manipulate it.
+    DatabaseConfig config = new DatabaseConfig();
+    config.setAllowCreate(true);
+    config.setTransactional(true);
+    //Get db handles to each index.
+    Database dbEq=
+         eContainer.openDatabase(config, mailType + ".equality");
+    Database dbPres=
+         eContainer.openDatabase(config, mailType + ".presence");
+    Database dbSub=
+         eContainer.openDatabase(config, mailType + ".substring");
+    Database dbOr=
+         eContainer.openDatabase(config, mailType + ".ordering");
+    //Add invalid idlist ids to both equality and ordering indexes.
+    DatabaseEntry key=
+         new DatabaseEntry(StaticUtils.getBytes("user.0@example.com"));
+    byte[] dataBytes=new byte[16];
+    //put duplicate ids in list
+    dataBytes[7] = (byte)0xff;
+    dataBytes[15] = (byte)0xfe;
+    DatabaseEntry data= new DatabaseEntry(dataBytes);
+    OperationStatus status = EntryContainer.put(dbEq, txn, key, data);
+    assertTrue(status == OperationStatus.SUCCESS);
+    status = EntryContainer.put(dbOr, txn, key, data);
+    assertTrue(status == OperationStatus.SUCCESS);
+    //Add null idlist to both equality and ordering indexes.
+    key =
+         new DatabaseEntry(StaticUtils.getBytes("user.1@example.com"));
+    data= new DatabaseEntry(new EntryIDSet().toDatabase());
+    status = EntryContainer.put(dbEq, txn, key, data);
+    assertTrue(status == OperationStatus.SUCCESS);
+    status = EntryContainer.put(dbOr, txn, key, data);
+    assertTrue(status == OperationStatus.SUCCESS);
+    //Add invalid idlist ids to presence index.
+    key =
+         new DatabaseEntry(StaticUtils.getBytes("+"));
+    data = new DatabaseEntry(dataBytes);
+    status = EntryContainer.put(dbPres, txn, key, data);
+    assertTrue(status == OperationStatus.SUCCESS);
+    //Add invalid idlist ids to substring index.
+    key =
+         new DatabaseEntry(StaticUtils.getBytes("@examp"));
+    data = new DatabaseEntry(dataBytes);
+    status = EntryContainer.put(dbSub, txn, key, data);
+    assertTrue(status == OperationStatus.SUCCESS);
+    performBECompleteVerify(mailType, 6);
+  }
+
+  /* Various tests not either clean or complete */
+
+
+  /**
+   * Try to verify a non-indexed attribute.
+   * @throws Exception if error count is not equal to 0.
+   */
+  @Test(expectedExceptions=Exception.class)
+  public void testVerifyNotIndexed()  throws Exception {
+    cleanAndLoad(2);
+    VerifyConfig verifyConfig = new VerifyConfig();
+    verifyConfig.setBaseDN(baseDNs[0]);
+    verifyConfig.addCleanIndex("userPassword");
+    Entry statEntry=bldStatEntry("");
+    be=(BackendImpl) DirectoryServer.getBackend(beID);
+    be.verifyBackend(verifyConfig, statEntry);
+    assertEquals(getStatEntryCount(statEntry, errorCount), 0);
+  }
+
+  /**
+   * Try to verify an nonexistent attribute.
+   * @throws Exception if verify backend fails.
+   */
+  @Test(expectedExceptions=Exception.class)
+  public void testInvalidIndex()  throws Exception {
+    cleanAndLoad(2);
+    VerifyConfig verifyConfig = new VerifyConfig();
+    verifyConfig.setBaseDN(baseDNs[0]);
+    verifyConfig.addCleanIndex(badIndexName);
+    Entry statEntry=bldStatEntry("");
+    be=(BackendImpl) DirectoryServer.getBackend(beID);
+    be.verifyBackend(verifyConfig, statEntry);
+  }
+
+  /* end tests */
+
+  /**
+   * Adds an entry to the id2entry database with a dn and id passed into the
+   * method. Optional flag to set the Jeb version byte for those types of tests.
+   * @param dn the dn string to put in the entry.
+   * @param id to use as the id2entry key,
+   * @param trashFormat true if first byte should be changed to invalid value.
+   * @return Database entry key of the entry.
+   * @throws Exception if the entry is not added to the id2entry database.
+   */
+  private DatabaseEntry addID2EntryReturnKey(String dn, long id, boolean trashFormat)
+       throws Exception {
+    DatabaseEntry key= new EntryID(id).getDatabaseEntry();
+    Entry testEntry=bldStatEntry(dn);
+    byte []entryBytes =
+         JebFormat.entryToDatabase(testEntry, new DataConfig());
+    if(trashFormat)
+      entryBytes[0] = 0x67;
+    DatabaseEntry data= new DatabaseEntry(entryBytes);
+    assertTrue(id2entry.putRaw(txn, key, data));
+    return key;
+  }
+
+  /**
+   * Wrapper to do a clean verify.
+   * @param indexToDo index file to run verify against.
+   * @param expectedErrors number of errors expected for this test.
+   * @throws Exception if the verify fails.
+   */
+  private void performBECleanVerify(String indexToDo,
+                                    int expectedErrors) throws Exception {
+    performBEVerify(indexToDo, expectedErrors, true);
+  }
+
+  /**
+   * Wrapper to do a complete verify.
+   * @param indexToDo index file to run verify against.
+   * @param expectedErrors number of errors expected for this test.
+   * @throws Exception if the verify fails.
+   */
+  private void performBECompleteVerify(String indexToDo,
+                                       int expectedErrors) throws Exception {
+    performBEVerify(indexToDo, expectedErrors, false);
+  }
+
+  /**
+   * Performs either a clean or complete verify depending on
+   * flag passed in.
+   *
+   * @param indexToDo index file to run verify against.
+   * @param expectedErrors number of errors expected for this test.
+   * @param clean do clean verify if true.
+   * @throws Exception if the verify fails.
+   */
+  private void performBEVerify(String indexToDo,
+                               int expectedErrors, boolean clean) throws Exception {
+    EntryContainer.transactionCommit(txn);
+    VerifyConfig verifyConfig = new VerifyConfig();
+    verifyConfig.setBaseDN(baseDNs[0]);
+    if(!clean)
+      verifyConfig.addCompleteIndex(indexToDo);
+    else
+      verifyConfig.addCleanIndex(indexToDo);
+    Entry statEntry=bldStatEntry("");
+    be.verifyBackend(verifyConfig, statEntry);
+    assertEquals(getStatEntryCount(statEntry, errorCount), expectedErrors);
+  }
+
+
+  /**
+   * Does a pretest setup. Creates some number of entries, gets
+   * backend, rootcontainer, entryContainer objects, as well as
+   * various index objects.
+   * Also starts a transaction.
+   * @param numEntries number of entries to add to the verify backend.
+   * @throws Exception if entries cannot be loaded.
+   */
+  private void preTest(int numEntries) throws Exception {
+    cleanAndLoad(numEntries);
+    be=(BackendImpl) DirectoryServer.getBackend(beID);
+    RootContainer rContainer = be.getRootContainer();
+    eContainer= rContainer.getEntryContainer(DN.decode(suffix));
+    id2child=eContainer.getID2Children();
+    id2entry=eContainer.getID2Entry();
+    id2subtree=eContainer.getID2Subtree();
+    dn2id=eContainer.getDN2ID();
+    txn = eContainer.beginTransaction();
+  }
+
+  /**
+   * Cleans verify backend and loads some number of entries.
+   * @param numEntries number of entries to load into the backend.
+   * @throws Exception if the entries are not loaded or created.
+   */
+  private void cleanAndLoad(int numEntries) throws Exception {
+    TestCaseUtils.clearJEBackend(false, beID, suffix);
+    template[2]=numUsersLine;
+    template[2]=
+         template[2].replaceAll("#numEntries#", String.valueOf(numEntries));
+    createLoadEntries(template, numEntries);
+  }
+
+  /**
+   * Gets information from the stat entry and returns that value as a Long.
+   * @param e entry to search.
+   * @param type attribute type
+   * @return Long
+   * @throws NumberFormatException if the attribute value cannot be parsed.
+   */
+  private long getStatEntryCount(Entry e, String type)
+       throws NumberFormatException {
+    AttributeType attrType =
+         DirectoryServer.getAttributeType(type);
+    if (attrType == null)
+      attrType = DirectoryServer.getDefaultAttributeType(type);
+    List<Attribute> attrList = e.getAttribute(attrType, null);
+    LinkedHashSet<AttributeValue> values =
+         attrList.get(0).getValues();
+    AttributeValue v = values.iterator().next();
+    long retVal = Long.parseLong(v.getStringValue());
+    return (retVal);
+  }
+
+  /**
+   * Builds an entry suitable for using in the verify job to gather statistics about
+   * the verify.
+   * @param dn to put into the entry.
+   * @return a suitable entry.
+   * @throws DirectoryException if the cannot be created.
+   */
+  private Entry bldStatEntry(String dn) throws DirectoryException {
+    DN entryDN = DN.decode(dn);
+    HashMap<ObjectClass, String> ocs = new HashMap<ObjectClass, String>(2);
+    ObjectClass topOC = DirectoryServer.getObjectClass(OC_TOP);
+    if (topOC == null) {
+      topOC = DirectoryServer.getDefaultObjectClass(OC_TOP);
     }
+    ocs.put(topOC, OC_TOP);
+    ObjectClass extensibleObjectOC = DirectoryServer
+         .getObjectClass(OC_EXTENSIBLE_OBJECT);
+    if (extensibleObjectOC == null) {
+      extensibleObjectOC = DirectoryServer
+           .getDefaultObjectClass(OC_EXTENSIBLE_OBJECT);
+    }
+    ocs.put(extensibleObjectOC, OC_EXTENSIBLE_OBJECT);
+    return new Entry(entryDN, ocs,
+                     new LinkedHashMap<AttributeType, List<Attribute>>(0),
+                     new HashMap<AttributeType, List<Attribute>>(0));
+  }
 }

--
Gitblit v1.10.0