|
From: <ble...@us...> - 2010-09-14 17:41:54
|
Revision: 3546
http://bigdata.svn.sourceforge.net/bigdata/?rev=3546&view=rev
Author: blevine218
Date: 2010-09-14 17:41:47 +0000 (Tue, 14 Sep 2010)
Log Message:
-----------
re-commit files. Looks like Eclipse got confused by a copy and paste operation.
Added Paths:
-----------
branches/maven_scaleout/bigdata-integ/src/test/java/com/bigdata/service/jini/AbstractServerTestCase.java
branches/maven_scaleout/bigdata-integ/src/test/java/com/bigdata/service/jini/TestBigdataClient.java
branches/maven_scaleout/bigdata-integ/src/test/java/com/bigdata/service/jini/TestBigdataClientRemote.java
Added: branches/maven_scaleout/bigdata-integ/src/test/java/com/bigdata/service/jini/AbstractServerTestCase.java
===================================================================
--- branches/maven_scaleout/bigdata-integ/src/test/java/com/bigdata/service/jini/AbstractServerTestCase.java (rev 0)
+++ branches/maven_scaleout/bigdata-integ/src/test/java/com/bigdata/service/jini/AbstractServerTestCase.java 2010-09-14 17:41:47 UTC (rev 3546)
@@ -0,0 +1,275 @@
+/**
+
+Copyright (C) SYSTAP, LLC 2006-2007. All rights reserved.
+
+Contact:
+ SYSTAP, LLC
+ 4501 Tower Road
+ Greensboro, NC 27410
+ lic...@bi...
+
+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; version 2 of the License.
+
+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
+*/
+/*
+ * Created on Apr 22, 2007
+ */
+
+package com.bigdata.service.jini;
+
+import java.io.IOException;
+
+import junit.framework.AssertionFailedError;
+
+import net.jini.core.discovery.LookupLocator;
+import net.jini.core.lookup.ServiceID;
+import net.jini.core.lookup.ServiceRegistrar;
+import net.jini.core.lookup.ServiceTemplate;
+
+import com.bigdata.journal.ITx;
+import com.bigdata.mdi.IResourceMetadata;
+import com.bigdata.mdi.LocalPartitionMetadata;
+import com.bigdata.mdi.PartitionLocator;
+import com.bigdata.service.DataService;
+import com.bigdata.service.IDataService;
+import com.bigdata.service.MetadataService;
+import com.bigdata.test.util.Assert;
+import com.sun.jini.tool.ClassServer;
+import com.bigdata.util.config.NicUtil;
+
+/**
+ * Abstract base class for tests of remote services.
+ * <p>
+ * Note: jini MUST be running. You can get the jini starter kit and install it
+ * to get jini running.
+ * </p>
+ * <p>
+ * Note: You MUST specify a security policy that is sufficiently lax.
+ * </p>
+ * <p>
+ * Note: You MUST specify the codebase for downloadable code.
+ * </p>
+ * <p>
+ * Note: The <code>bigdata</code> JAR must be current in order for the client
+ * and the service to agree on interface definitions, etc. You can use
+ * <code>build.xml</code> in the root of this module to update that JAR.
+ * </p>
+ * <p>
+ * Note: A {@link ClassServer} will be started on port 8081 by default. If that
+ * port is in use then you MUST specify another port.
+ * </p>
+ *
+ * The following system properties will do the trick unless you have something
+ * running on port 8081.
+ *
+ * <pre>
+ * -Djava.security.policy=policy.all -Djava.rmi.server.codebase=http://localhost:8081
+ * </pre>
+ *
+ * To use another port, try:
+ *
+ * <pre>
+ * -Djava.security.policy=policy.all -Dbigdata.test.port=8082 -Djava.rmi.server.codebase=http://localhost:8082
+ * </pre>
+ *
+ * You can enable NIO using:
+ * <pre>
+ * -Dcom.sun.jini.jeri.tcp.useNIO=true
+ * </pre>
+ *
+ * @author <a href="mailto:tho...@us...">Bryan Thompson</a>
+ * @version $Id$
+ */
+public abstract class AbstractServerTestCase {
+
+ /**
+ * Equal to {@link ITx#UNISOLATED}.
+ */
+ protected final long UNISOLATED = ITx.UNISOLATED;
+
+ /**
+ *
+ */
+ public AbstractServerTestCase() {
+ }
+
+ /**
+ * Return the {@link ServiceID} of a server that we started ourselves. The
+ * method waits until the {@link ServiceID} becomes available on
+ * {@link AbstractServer#getServiceID()}.
+ *
+ * @exception AssertionFailedError
+ * If the {@link ServiceID} can not be found after a timeout.
+ *
+ * @exception InterruptedException
+ * if the thread is interrupted while it is waiting to retry.
+ */
+ static public ServiceID getServiceID(final AbstractServer server) throws AssertionFailedError, InterruptedException {
+
+ ServiceID serviceID = null;
+
+ for(int i=0; i<10 && serviceID == null; i++) {
+
+ /*
+ * Note: This can be null since the serviceID is not assigned
+ * synchronously by the registrar.
+ */
+
+ serviceID = server.getServiceID();
+
+ if(serviceID == null) {
+
+ /*
+ * We wait a bit and retry until we have it or timeout.
+ */
+ Thread.sleep(200);
+ }
+ }
+
+ Assert.assertNotNull("serviceID",serviceID);
+
+ /*
+ * Verify that we have discovered the _correct_ service. This is a
+ * potential problem when starting a stopping services for the test
+ * suite.
+ */
+ Assert.assertEquals("serviceID", server.getServiceID(), serviceID);
+
+ return serviceID;
+ }
+
+ /**
+ * Lookup a {@link DataService} by its {@link ServiceID} using unicast
+ * discovery on localhost.
+ *
+ * @param serviceID
+ * The {@link ServiceID}.
+ *
+ * @return The service.
+ *
+ * @todo Modify to return the service item?
+ *
+ * @todo Modify to not be specific to {@link DataService} vs
+ * {@link MetadataService} (we need a common base interface for both
+ * that carries most of the functionality but allows us to make
+ * distinctions easily during discovery).
+ */
+ public IDataService lookupDataService(ServiceID serviceID)
+ throws IOException, ClassNotFoundException, InterruptedException {
+
+ /*
+ * Lookup the discover service (unicast on localhost).
+ */
+
+ // get the hostname.
+ String hostname = NicUtil.getIpAddress("default.nic", "default", true);
+
+ // Find the service registrar (unicast protocol).
+ final int timeout = 4*1000; // seconds.
+ LookupLocator lookupLocator = new LookupLocator("jini://"+hostname);
+ ServiceRegistrar serviceRegistrar = lookupLocator.getRegistrar( timeout );
+
+ /*
+ * Prepare a template for lookup search.
+ *
+ * Note: The client needs a local copy of the interface in order to be
+ * able to invoke methods on the service without using reflection. The
+ * implementation class will be downloaded from the codebase identified
+ * by the server.
+ */
+ ServiceTemplate template = new ServiceTemplate(//
+ /*
+ * use this to request the service by its serviceID.
+ */
+ serviceID,
+ /*
+ * Use this to filter services by an interface that they expose.
+ */
+// new Class[] { IDataService.class },
+ null,
+ /*
+ * use this to filter for services by Entry attributes.
+ */
+ null);
+
+ /*
+ * Lookup a service. This can fail if the service registrar has not
+ * finished processing the service registration. If it does, you can
+ * generally just retry the test and it will succeed. However this
+ * points out that the client may need to wait and retry a few times if
+ * you are starting everything up at once (or just register for
+ * notification events for the service if it is not found and enter a
+ * wait state).
+ */
+
+ IDataService service = null;
+
+ for (int i = 0; i < 10 && service == null; i++) {
+
+ service = (IDataService) serviceRegistrar.lookup(template /* , maxMatches */);
+
+ if (service == null) {
+ System.err.println("Service not found: sleeping...");
+ Thread.sleep(200);
+ }
+ }
+
+ if (service != null) {
+ System.err.println("Service found.");
+ }
+
+ return service;
+ }
+
+ /**
+ * Compares two representations of the {@link PartitionLocator}
+ * without the left- and right-separator keys that bound the index
+ * partition.
+ *
+ * @param expected
+ * @param actual
+ */
+ protected void assertEquals(PartitionLocator expected, PartitionLocator actual) {
+ Assert.assertEquals("partitionId", expected.getPartitionId(), actual.getPartitionId());
+ Assert.assertEquals("dataServiceUUID", expected.getDataServiceUUID(), actual.getDataServiceUUID());
+ }
+
+ /**
+ * Compares two representations of the {@link LocalPartitionMetadata} for an
+ * index partition including the optional resource descriptions.
+ *
+ * @param expected
+ * @param actual
+ */
+ protected void assertEquals(LocalPartitionMetadata expected, LocalPartitionMetadata actual) {
+
+ Assert.assertEquals("partitionId",expected.getPartitionId(), actual.getPartitionId());
+ Assert.assertEquals("leftSeparatorKey", expected.getLeftSeparatorKey(), ((LocalPartitionMetadata) actual).getLeftSeparatorKey());
+ Assert.assertEquals("rightSeparatorKey", expected.getRightSeparatorKey(), ((LocalPartitionMetadata) actual).getRightSeparatorKey());
+
+ final IResourceMetadata[] expectedResources = expected.getResources();
+ final IResourceMetadata[] actualResources = actual.getResources();
+
+ Assert.assertEquals("#resources",expectedResources.length,actualResources.length);
+
+ for(int i=0;i<expected.getResources().length; i++) {
+
+ // verify by components so that it is obvious what is wrong.
+ Assert.assertEquals("filename[" + i + "]", expectedResources[i].getFile(), actualResources[i].getFile());
+ Assert.assertEquals("UUID[" + i + "]", expectedResources[i].getUUID(), actualResources[i].getUUID());
+
+ // verify by equals.
+ Assert.assertTrue("resourceMetadata",expectedResources[i].equals(actualResources[i]));
+ }
+ }
+}
Added: branches/maven_scaleout/bigdata-integ/src/test/java/com/bigdata/service/jini/TestBigdataClient.java
===================================================================
--- branches/maven_scaleout/bigdata-integ/src/test/java/com/bigdata/service/jini/TestBigdataClient.java (rev 0)
+++ branches/maven_scaleout/bigdata-integ/src/test/java/com/bigdata/service/jini/TestBigdataClient.java 2010-09-14 17:41:47 UTC (rev 3546)
@@ -0,0 +1,209 @@
+/**
+
+Copyright (C) SYSTAP, LLC 2006-2007. All rights reserved.
+
+Contact:
+ SYSTAP, LLC
+ 4501 Tower Road
+ Greensboro, NC 27410
+ lic...@bi...
+
+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; version 2 of the License.
+
+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
+*/
+/*
+ * Created on Apr 23, 2007
+ */
+
+package com.bigdata.service.jini;
+
+import java.io.Serializable;
+import java.util.Random;
+import java.util.UUID;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.bigdata.btree.IIndex;
+import com.bigdata.btree.ITuple;
+import com.bigdata.btree.ITupleIterator;
+import com.bigdata.btree.IndexMetadata;
+
+import com.bigdata.btree.proc.BatchInsert.BatchInsertConstructor;
+import com.bigdata.journal.ITx;
+import com.bigdata.service.DataService;
+import com.bigdata.service.IBigdataFederation;
+import com.bigdata.service.IDataService;
+import com.bigdata.service.jini.util.JiniServicesHelper;
+import com.bigdata.test.util.Assert;
+import com.bigdata.test.util.Util;
+
+/**
+ * Test suite for the {@link JiniClient}.
+ * <p>
+ * Note: The core test suite has already verified the basic semantics of the
+ * {@link IDataService} interface and partitioned indices so all we have to
+ * focus on here is the jini integration and verifying that the serialization
+ * imposed by RMI goes off without a hitch (e.g., that everything implements
+ * {@link Serializable} and that those {@link Serializable} implementations can
+ * correctly round trip the data).
+ *
+ * @author <a href="mailto:tho...@us...">Bryan Thompson</a>
+ * @version $Id$
+ */
+public class TestBigdataClient extends AbstractServerTestCase {
+
+ protected boolean serviceImplRemote;
+
+ public TestBigdataClient() {
+ this.serviceImplRemote = false;
+ }
+
+ protected TestBigdataClient(boolean serviceImplRemote) {
+ this.serviceImplRemote = serviceImplRemote;
+ }
+
+ /**
+ * Starts a {@link DataServer} ({@link #dataServer1}) and then a
+ * {@link MetadataServer} ({@link #metadataServer0}). Each runs in its own
+ * thread.
+ */
+ @Before
+ public void setUp() throws Exception {
+ helper = new JiniServicesHelper(serviceImplRemote);
+ helper.start();
+ }
+
+ protected JiniServicesHelper helper = null;
+
+ /**
+ * Destroy the test services.
+ */
+ @After
+ public void tearDown() throws Exception {
+ if (helper != null) {
+ helper.destroy();
+ }
+ }
+
+ /**
+ * Test ability to registers a scale-out index on one of the
+ * {@link DataService}s.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void test_registerIndex1() throws Exception {
+
+ final IBigdataFederation<?> fed = helper.client.connect();
+ final String name = "testIndex";
+ final IndexMetadata metadata = new IndexMetadata(name, UUID.randomUUID());
+
+ metadata.setDeleteMarkers(true);
+ fed.registerIndex(metadata);
+
+ final IIndex ndx = fed.getIndex(name, ITx.UNISOLATED);
+
+ Assert.assertEquals("indexUUID", metadata.getIndexUUID(), ndx.getIndexMetadata().getIndexUUID());
+
+ doBasicIndexTests(ndx);
+ }
+
+ /**
+ * Test ability to registers a scale-out index on both of the
+ * {@link DataService}s.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void test_registerIndex2() throws Exception {
+
+ final IBigdataFederation<?> fed = helper.client.connect();
+ final String name = "testIndex";
+ final IndexMetadata metadata = new IndexMetadata(name,UUID.randomUUID());
+
+ metadata.setDeleteMarkers(true);
+
+ final UUID indexUUID = fed.registerIndex( metadata, //
+ // separator keys.
+ new byte[][] {
+ new byte[]{},
+ Util.asSortKey(500)
+ },//
+ // data service assignments.
+ new UUID[] { //
+ helper.getDataService0().getServiceUUID(),//
+ helper.getDataService1().getServiceUUID() //
+ });
+
+ final IIndex ndx = fed.getIndex(name, ITx.UNISOLATED);
+
+ Assert.assertEquals("indexUUID", indexUUID, ndx.getIndexMetadata().getIndexUUID());
+
+ // verify partition 0 on dataService0
+ Assert.assertNotNull(helper.getDataService0().getIndexMetadata(DataService.getIndexPartitionName(name, 0), ITx.UNISOLATED));
+
+ // verify partition 1 on dataService1
+ Assert.assertNotNull(helper.getDataService1().getIndexMetadata(DataService.getIndexPartitionName(name, 1), ITx.UNISOLATED));
+
+ doBasicIndexTests(ndx);
+ }
+
+ /**
+ * Test helper reads and writes some data on the index in order to verify
+ * that these operations can be performed without serialization errors
+ * arising from the RPC calls.
+ *
+ * @param ndx
+ */
+ protected void doBasicIndexTests(final IIndex ndx) {
+
+ final int limit = 1000;
+
+ final byte[][] keys = new byte[limit][];
+ final byte[][] vals = new byte[limit][];
+
+ final Random r = new Random();
+
+ for (int i = 0; i < limit; i++) {
+ keys[i] = Util.asSortKey(i);
+ final byte[] val = new byte[10];
+ r.nextBytes(val);
+ vals[i] = val;
+ }
+
+ // batch insert.
+ ndx.submit(0/* fromIndex */, limit/* toIndex */, keys, vals, BatchInsertConstructor.RETURN_NO_VALUES, null);
+
+ // verify #of index entries.
+ Assert.assertEquals(limit, ndx.rangeCount(null, null));
+
+ // verify data.
+ {
+
+ final ITupleIterator<?> itr = ndx.rangeIterator(null, null);
+
+ int i = 0;
+
+ while (itr.hasNext()) {
+ final ITuple<?> tuple = itr.next();
+ Assert.assertEquals(keys[i], tuple.getKey());
+ Assert.assertEquals(vals[i], tuple.getValue());
+ i++;
+ }
+
+ Assert.assertEquals(limit, i);
+ }
+ }
+}
Added: branches/maven_scaleout/bigdata-integ/src/test/java/com/bigdata/service/jini/TestBigdataClientRemote.java
===================================================================
--- branches/maven_scaleout/bigdata-integ/src/test/java/com/bigdata/service/jini/TestBigdataClientRemote.java (rev 0)
+++ branches/maven_scaleout/bigdata-integ/src/test/java/com/bigdata/service/jini/TestBigdataClientRemote.java 2010-09-14 17:41:47 UTC (rev 3546)
@@ -0,0 +1,35 @@
+/**
+
+Copyright (C) SYSTAP, LLC 2006-2007. All rights reserved.
+
+Contact:
+ SYSTAP, LLC
+ 4501 Tower Road
+ Greensboro, NC 27410
+ lic...@bi...
+
+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; version 2 of the License.
+
+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 com.bigdata.service.jini;
+
+/**
+ * Test suite for the {@link JiniClient} using the purely remote
+ * service implementations.
+ */
+public class TestBigdataClientRemote extends TestBigdataClient {
+ public TestBigdataClientRemote() {
+ super(true);
+ }
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|