Index: test/edu/ucsb/nceas/metacat/dataone/MNodeReplicationTest.java
===================================================================
--- test/edu/ucsb/nceas/metacat/dataone/MNodeReplicationTest.java	(nonexistent)
+++ test/edu/ucsb/nceas/metacat/dataone/MNodeReplicationTest.java	(revision 10260)
@@ -0,0 +1,230 @@
+/**
+ *  '$RCSfile$'
+ *  Copyright: 2010 Regents of the University of California and the
+ *              National Center for Ecological Analysis and Synthesis
+ *  Purpose: To test the Access Controls in metacat by JUnit
+ *
+ *   '$Author:$'
+ *     '$Date:$'
+ * '$Revision:$'
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+package edu.ucsb.nceas.metacat.dataone;
+
+
+
+
+import edu.ucsb.nceas.MCTestCase;
+import edu.ucsb.nceas.metacat.dataone.CNodeService;
+import edu.ucsb.nceas.metacat.dataone.MNodeService;
+import edu.ucsb.nceas.metacat.properties.PropertyService;
+import edu.ucsb.nceas.metacat.properties.SkinPropertyService;
+import edu.ucsb.nceas.metacat.service.ServiceService;
+import edu.ucsb.nceas.utilities.IOUtil;
+import gov.loc.repository.bagit.Bag;
+import gov.loc.repository.bagit.BagFactory;
+import gov.loc.repository.bagit.BagFile;
+import gov.loc.repository.bagit.Manifest;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.dataone.client.v2.MNode;
+import org.dataone.client.v2.itk.D1Client;
+import org.dataone.client.v2.formats.ObjectFormatCache;
+import org.dataone.exceptions.MarshallingException;
+import org.dataone.configuration.Settings;
+import org.dataone.ore.ResourceMapFactory;
+import org.dataone.service.util.Constants;
+import org.dataone.service.util.TypeMarshaller;
+import org.dataone.service.exceptions.IdentifierNotUnique;
+import org.dataone.service.exceptions.InsufficientResources;
+import org.dataone.service.exceptions.InvalidRequest;
+import org.dataone.service.exceptions.InvalidSystemMetadata;
+import org.dataone.service.exceptions.InvalidToken;
+import org.dataone.service.exceptions.NotAuthorized;
+import org.dataone.service.exceptions.NotFound;
+import org.dataone.service.exceptions.NotImplemented;
+import org.dataone.service.exceptions.ServiceFailure;
+import org.dataone.service.exceptions.SynchronizationFailed;
+import org.dataone.service.exceptions.UnsupportedType;
+import org.dataone.service.types.v1.AccessPolicy;
+import org.dataone.service.types.v1.AccessRule;
+import org.dataone.service.types.v1.Checksum;
+import org.dataone.service.types.v1.DescribeResponse;
+import org.dataone.service.types.v1.Event;
+import org.dataone.service.types.v1.ObjectFormatIdentifier;
+import org.dataone.service.types.v1.Identifier;
+import org.dataone.service.types.v2.Log;
+import org.dataone.service.types.v2.Node;
+import org.dataone.service.types.v2.OptionList;
+import org.dataone.service.types.v1.NodeReference;
+import org.dataone.service.types.v1.ObjectFormatIdentifier;
+import org.dataone.service.types.v1.ObjectList;
+import org.dataone.service.types.v1.Permission;
+import org.dataone.service.types.v1.Person;
+import org.dataone.service.types.v1.ReplicationPolicy;
+import org.dataone.service.types.v1.Session;
+import org.dataone.service.types.v1.Subject;
+import org.dataone.service.types.v1.SubjectInfo;
+import org.dataone.service.types.v1.util.ChecksumUtil;
+import org.dataone.service.types.v2.SystemMetadata;
+import org.dspace.foresite.ResourceMap;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ *This really is a integration test. It should be run in a configured DataONE environment. 
+ *It will upload a metadata object to a MN with the replication perference of the running node (the local host). 
+ *Couple minutes later, it will check if the running node has the replica.
+ * 
+ * @author Jing Tao
+ *
+ */
+public class MNodeReplicationTest extends D1NodeServiceTest {
+    public static final String replicationSourceFile = "./test/eml-sample.xml";
+    protected static String sourceMNodeId = null;
+    protected static int waitTime = 0;
+
+  /**
+   * Set up the test fixtures
+   * 
+   * @throws Exception
+   */
+  @Before
+  public void setUp() throws Exception {
+     sourceMNodeId = PropertyService.getProperty("test.dataone.replication.sourceNodeId");
+     System.out.println("The sourceNodeId is ++++++++++++++++++ "+sourceMNodeId);
+     waitTime = (new Integer(PropertyService.getProperty("test.dataone.replication.waitingTime"))).intValue();
+     System.out.println("The waiting time is ++++++++++++++++++ "+waitTime+ " seconds");
+     System.out.println("The cn base url is "+Settings.getConfiguration().getString("D1Client.CN_URL"));
+  }
+
+  /**
+   * Remove the test fixtures
+   */
+  @After
+  public void tearDown() {
+  }
+  
+  /**
+   * Build the test suite
+   * @return
+   */
+  public static Test suite() {
+    
+    TestSuite suite = new TestSuite();
+    suite.addTest(new MNodeReplicationTest("initialize"));
+    suite.addTest(new MNodeReplicationTest("testReplicate"));
+    return suite;
+    
+  }
+  
+  /**
+   * Constructor for the tests
+   * 
+   * @param name - the name of the test
+   */
+  public MNodeReplicationTest(String name) {
+    super(name);
+    
+  }
+
+  /**
+   * Initial blank test
+   */
+  public void initialize() {
+    assertTrue(1 == 1);
+    
+  }
+  
+  /**
+   *
+   * 
+   */
+  public void testReplicate() {
+      printTestHeader("testReplicate");
+      try {
+          
+        //insert an object to the source node
+        Session session = null;
+        Identifier guid = new Identifier();
+        guid.setValue("testReplicate." + System.currentTimeMillis());
+        InputStream object = new FileInputStream(new File(replicationSourceFile));
+        Subject subject = MNodeService.getInstance(request).getCapabilities().getSubject(0);
+        SystemMetadata sysmeta = createSystemMetadata(guid, subject, object);
+        ObjectFormatIdentifier formatId = new ObjectFormatIdentifier();
+        formatId.setValue("eml://ecoinformatics.org/eml-2.0.1");
+        sysmeta.setFormatId(formatId);
+        //create a replication policy
+        Node localNode = MNodeService.getInstance(request).getCapabilities();
+        if(!localNode.isReplicate()) {
+            throw new Exception("The local node "+localNode.getIdentifier().getValue()+" is configured to not to accept replicas!");
+        }
+        ReplicationPolicy rePolicy = new ReplicationPolicy();
+        rePolicy.setReplicationAllowed(true);
+        rePolicy.setNumberReplicas(new Integer(3));
+        rePolicy.addPreferredMemberNode(localNode.getIdentifier());
+        sysmeta.setReplicationPolicy(rePolicy);
+        
+        NodeReference sourceNode = new NodeReference();
+        sourceNode.setValue(sourceMNodeId);
+        MNode sourceMN = D1Client.getMN(sourceNode);
+        Node source = sourceMN.getCapabilities();
+        if(!source.isSynchronize()) {
+            throw new Exception("The source node "+source.getIdentifier().getValue()+" is configured to not to be synchronized to the cn!");
+        }
+        object = new FileInputStream(new File(replicationSourceFile));
+        sysmeta.setAuthoritativeMemberNode(sourceNode);
+        System.out.println("------------------------before creating the object into the source node "+sourceMNodeId+" with id "+guid.getValue());
+        sourceMN.create(session, guid, object, sysmeta);
+        System.out.println("scucessfully created the object into the source node "+sourceMNodeId+" with id "+guid.getValue());
+        Thread.sleep(waitTime);
+        MNode local = D1Client.getMN(localNode.getIdentifier());
+        SystemMetadata sys = local.getSystemMetadata(session, guid);
+        System.out.println("--------------The pid from the replica on the localhost is  "+sys.getIdentifier().getValue());
+        assertTrue(sys.getIdentifier().equals(guid));
+      } catch (Exception e) {
+        e.printStackTrace();
+        System.out.println("Failed to test the replicate method : " + e.getMessage());
+        fail("Failed to test the replicate method : " + e.getMessage());
+      }
+  }
+ 
+}
