You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sh...@apache.org on 2016/11/01 02:38:05 UTC
[46/50] [abbrv] ignite git commit: IGNITE-3041: Implement config
variations test for IgniteServices
IGNITE-3041: Implement config variations test for IgniteServices
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6e1d45e8
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6e1d45e8
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6e1d45e8
Branch: refs/heads/ignite-2788
Commit: 6e1d45e83b91b9dda78c5f6ac6ed4f2726aba787
Parents: 2699235
Author: sboikov <sb...@gridgain.com>
Authored: Fri Apr 29 12:21:02 2016 +0300
Committer: shtykh_roman <rs...@yahoo.com>
Committed: Fri May 13 16:11:16 2016 +0900
----------------------------------------------------------------------
...gniteServiceConfigVariationsFullApiTest.java | 350 +++++++++++++++++++
.../configvariations/VariationsTestsConfig.java | 2 +-
.../IgniteConfigVariationsAbstractTest.java | 72 +++-
...ServiceConfigVariationsFullApiTestSuite.java | 92 +++++
4 files changed, 507 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/6e1d45e8/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceConfigVariationsFullApiTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceConfigVariationsFullApiTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceConfigVariationsFullApiTest.java
new file mode 100644
index 0000000..4e6d1e6
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/IgniteServiceConfigVariationsFullApiTest.java
@@ -0,0 +1,350 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.service;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Serializable;
+import java.util.concurrent.ThreadLocalRandom;
+import javax.cache.configuration.Factory;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteServices;
+import org.apache.ignite.binary.BinaryObjectException;
+import org.apache.ignite.binary.BinaryReader;
+import org.apache.ignite.binary.BinaryWriter;
+import org.apache.ignite.binary.Binarylizable;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.services.Service;
+import org.apache.ignite.services.ServiceConfiguration;
+import org.apache.ignite.services.ServiceContext;
+import org.apache.ignite.testframework.configvariations.Parameters;
+import org.apache.ignite.testframework.junits.IgniteConfigVariationsAbstractTest;
+
+/**
+ * Full API services test.
+ */
+public class IgniteServiceConfigVariationsFullApiTest extends IgniteConfigVariationsAbstractTest {
+ /** Test service name. */
+ private static final String SERVICE_NAME = "testService";
+
+ /** Test service name. */
+ private static final String CACHE_NAME = "testCache";
+
+ /** */
+ protected static final int CLIENT_NODE_IDX_2 = 4;
+
+ /** Test object id counter. */
+ private static int cntr;
+
+ /** Callable factories. */
+ @SuppressWarnings("unchecked")
+ private static final Factory[] serviceFactories = new Factory[] {
+ Parameters.factory(TestServiceImpl.class),
+ Parameters.factory(TestServiceImplExternalizable.class),
+ Parameters.factory(TestServiceImplBinarylizable.class)
+ };
+
+ /** {@inheritDoc} */
+ @Override protected boolean expectedClient(String testGridName) {
+ int i = testsCfg.gridCount();
+
+ if (i < 5)
+ return super.expectedClient(testGridName);
+
+ // Use two client nodes if grid index 5 or greater.
+ return getTestGridName(CLIENT_NODE_IDX).equals(testGridName)
+ || getTestGridName(CLIENT_NODE_IDX_2).equals(testGridName);
+ }
+
+ /**
+ * Test node singleton deployment
+ *
+ * @throws Exception If failed.
+ */
+ public void testNodeSingletonDeploy() throws Exception {
+ runInAllDataModes(new ServiceTestRunnable(true, new DeployClosure() {
+ @Override public void run(IgniteServices services, String svcName, TestService svc) {
+ services.deployNodeSingleton(svcName, (Service)svc);
+ }
+ }));
+ }
+
+ /**
+ * Test cluster singleton deployment
+ *
+ * @throws Exception If failed.
+ */
+ public void testClusterSingletonDeploy() throws Exception {
+ runInAllDataModes(new ServiceTestRunnable(false, new DeployClosure() {
+ @Override public void run(IgniteServices services, String svcName, TestService svc) {
+ services.deployClusterSingleton(svcName, (Service)svc);
+ }
+ }));
+ }
+
+ /**
+ * Test key affinity deployment
+ *
+ * @throws Exception If failed.
+ */
+ public void testKeyAffinityDeploy() throws Exception {
+ runInAllDataModes(new ServiceTestRunnable(false, new DeployClosure() {
+ @Override public void run(IgniteServices services, String svcName, TestService svc) {
+ IgniteCache<Object, Object> cache = grid(testedNodeIdx).getOrCreateCache(CACHE_NAME);
+
+ services.deployKeyAffinitySingleton(svcName, (Service)svc, cache.getName(), "1");
+ }
+ }));
+ }
+
+ /**
+ * Tests multiple deployment
+ *
+ * @throws Exception If failed.
+ */
+ public void testMultipleDeploy() throws Exception {
+ runInAllDataModes(new ServiceTestRunnable(true, new DeployClosure() {
+ @Override public void run(IgniteServices services, String svcName, TestService svc) {
+ services.deployMultiple(svcName, (Service)svc, 0, 1);
+ }
+ }));
+ }
+
+ /**
+ * Tests deployment.
+ *
+ * @throws Exception If failed.
+ */
+ public void testDeploy() throws Exception {
+ runInAllDataModes(new ServiceTestRunnable(false, new DeployClosure() {
+ @Override public void run(IgniteServices services, String svcName, TestService svc) {
+ services.deployClusterSingleton(svcName, (Service)svc);
+
+ ServiceConfiguration cfg = new ServiceConfiguration();
+
+ cfg.setName(svcName);
+
+ cfg.setService((Service)svc);
+
+ cfg.setTotalCount(1);
+
+ cfg.setMaxPerNodeCount(1);
+
+ cfg.setNodeFilter(services.clusterGroup().predicate());
+
+ services.deploy(cfg);
+ }
+ }));
+ }
+
+ /**
+ * Service test closure
+ */
+ private class ServiceTestRunnable implements TestRunnable {
+ /** Sticky. */
+ private final boolean sticky;
+
+ /** Deploy closure */
+ private final DeployClosure deployC;
+
+ /**
+ * Default constructor.
+ *
+ * @param sticky Sticky flag.
+ * @param deployC Closure.
+ */
+ public ServiceTestRunnable(boolean sticky, DeployClosure deployC) {
+ this.sticky = sticky;
+
+ this.deployC = deployC;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void run() throws Exception {
+ for (Factory factory : serviceFactories)
+ testService((TestService)factory.create(), sticky, deployC);
+ }
+ }
+
+ /**
+ *
+ */
+ interface DeployClosure {
+ /**
+ * @param services Services.
+ * @param svcName Service name.
+ * @param svc Service.
+ */
+ void run(IgniteServices services, String svcName, TestService svc);
+ }
+
+ /**
+ * Tests deployment and contract.
+ *
+ * @param svc Service.
+ * @param sticky Sticky.
+ * @param deployC Closure.
+ * @throws Exception If failed.
+ */
+ protected void testService(TestService svc, boolean sticky, DeployClosure deployC) throws Exception {
+ IgniteEx ignite = testedGrid();
+
+ IgniteServices services = ignite.services();
+
+ Object expected = value(++cntr);
+
+ // Put value for testing Service instance serialization.
+ svc.setValue(expected);
+
+ deployC.run(services, SERVICE_NAME, svc);
+
+ // Expect correct value from local instance.
+ assertEquals(expected, svc.getValue());
+
+ // Use stickiness to make sure data will be fetched from the same instance.
+ TestService proxy = services.serviceProxy(SERVICE_NAME, TestService.class, sticky);
+
+ // Expect that correct value is returned from deployed instance.
+ assertEquals(expected, proxy.getValue());
+
+ expected = value(++cntr);
+
+ // Change value.
+ proxy.setValue(expected);
+
+ // Expect correct value after being read back.
+ int r = 1000;
+
+ while(r-- > 0)
+ assertEquals(expected, proxy.getValue());
+
+ assertEquals("Expected 1 deployed service", 1, services.serviceDescriptors().size());
+
+ // Randomize stop method invocation
+ boolean tmp = ThreadLocalRandom.current().nextBoolean();
+
+ if (tmp)
+ services.cancelAll();
+ else
+ services.cancel(SERVICE_NAME);
+ }
+
+ /**
+ * Test service
+ */
+ public interface TestService {
+ /**
+ * @param o argument to set.
+ */
+ void setValue(Object o);
+
+ /**
+ * @return Argument
+ * @throws Exception If failed.
+ */
+ Object getValue() throws Exception;
+ }
+
+ /**
+ * Implementation for {@link TestService}
+ */
+ public static class TestServiceImpl implements Service, TestService, Serializable {
+ /** Test value. */
+ protected Object val;
+
+ /**
+ * Default constructor.
+ */
+ public TestServiceImpl() {
+ // No-op.
+ }
+
+ /** {@inheritDoc} */
+ @Override public Object getValue() throws Exception {
+ return val;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void cancel(ServiceContext ctx) {
+ // No-op
+ }
+
+ /** {@inheritDoc} */
+ @Override public void init(ServiceContext ctx) throws Exception {
+ // No-op
+ }
+
+ /** {@inheritDoc} */
+ @Override public void execute(ServiceContext ctx) throws Exception {
+ // No-op
+ }
+
+ /** {@inheritDoc} */
+ public void setValue(Object val) {
+ this.val = val;
+ }
+ }
+
+ /**
+ * Echo service, externalizable object
+ */
+ @SuppressWarnings({"PublicInnerClass"})
+ public static class TestServiceImplExternalizable extends TestServiceImpl implements Externalizable {
+ /**
+ * Default constructor.
+ */
+ public TestServiceImplExternalizable() {
+ // No-op.
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ val = in.readObject();
+ }
+ }
+
+ /**
+ * Echo service, binarylizable object
+ */
+ @SuppressWarnings({"PublicInnerClass"})
+ public static class TestServiceImplBinarylizable extends TestServiceImpl implements Binarylizable {
+ /**
+ * Default constructor.
+ */
+ public TestServiceImplBinarylizable() {
+ // No-op.
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeBinary(BinaryWriter writer) throws BinaryObjectException {
+ writer.writeObject("arg", val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readBinary(BinaryReader reader) throws BinaryObjectException {
+ val = reader.readObject("arg");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/6e1d45e8/modules/core/src/test/java/org/apache/ignite/testframework/configvariations/VariationsTestsConfig.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/configvariations/VariationsTestsConfig.java b/modules/core/src/test/java/org/apache/ignite/testframework/configvariations/VariationsTestsConfig.java
index 7bcfc7f..929b0c8 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/configvariations/VariationsTestsConfig.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/configvariations/VariationsTestsConfig.java
@@ -70,7 +70,7 @@ public class VariationsTestsConfig {
* @param factory Factory.
* @param desc Config description.
* @param stopNodes Stope nodes.
- * @param gridCnt Grdi count.
+ * @param gridCnt Grid count.
*/
public VariationsTestsConfig(
ConfigFactory factory,
http://git-wip-us.apache.org/repos/asf/ignite/blob/6e1d45e8/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteConfigVariationsAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteConfigVariationsAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteConfigVariationsAbstractTest.java
index 258eba8..3b8c046 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteConfigVariationsAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteConfigVariationsAbstractTest.java
@@ -27,6 +27,10 @@ import java.io.ObjectOutputStream;
import java.io.Serializable;
import org.apache.commons.io.FileUtils;
import org.apache.ignite.Ignition;
+import org.apache.ignite.binary.BinaryObjectException;
+import org.apache.ignite.binary.BinaryReader;
+import org.apache.ignite.binary.BinaryWriter;
+import org.apache.ignite.binary.Binarylizable;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.IgniteEx;
import org.apache.ignite.internal.util.typedef.internal.U;
@@ -200,12 +204,12 @@ public abstract class IgniteConfigVariationsAbstractTest extends GridCommonAbstr
for (int i = 0; i < DataMode.values().length; i++) {
dataMode = DataMode.values()[i];
- if ((getConfiguration().getMarshaller() instanceof JdkMarshaller)
- && (dataMode == DataMode.PLANE_OBJECT)) {
- info("Skip test for JdkMarshaller & PLANE_OBJECT data mode");
+ if (!isCompatible()) {
+ info("Skipping test in data mode: " + dataMode);
+
continue;
}
-
+
info("Running test in data mode: " + dataMode);
if (i != 0)
@@ -250,6 +254,8 @@ public abstract class IgniteConfigVariationsAbstractTest extends GridCommonAbstr
return new ExternalizableObject(keyId);
case PLANE_OBJECT:
return new TestObject(keyId);
+ case BINARILIZABLE:
+ return new BinarylizableObject(keyId);
default:
throw new IllegalArgumentException("mode: " + mode);
}
@@ -279,6 +285,8 @@ public abstract class IgniteConfigVariationsAbstractTest extends GridCommonAbstr
return new ExternalizableObject(idx);
case PLANE_OBJECT:
return new TestObject(idx);
+ case BINARILIZABLE:
+ return new BinarylizableObject(idx);
default:
throw new IllegalArgumentException("mode: " + mode);
}
@@ -395,7 +403,7 @@ public abstract class IgniteConfigVariationsAbstractTest extends GridCommonAbstr
/**
* Default constructor.
*/
- public ExternalizableObject() {
+ ExternalizableObject() {
super(-1);
}
@@ -422,6 +430,37 @@ public abstract class IgniteConfigVariationsAbstractTest extends GridCommonAbstr
}
/**
+ *
+ */
+ public static class BinarylizableObject extends TestObject implements Binarylizable {
+ /**
+ * Default constructor.
+ */
+ public BinarylizableObject() {
+ super(-1);
+ }
+
+ /**
+ * @param val Value.
+ */
+ public BinarylizableObject(int val) {
+ super(val);
+ }
+
+ @Override public void writeBinary(BinaryWriter writer) throws BinaryObjectException {
+ writer.writeInt("val", val);
+ writer.writeString("strVal", strVal);
+ writer.writeEnum("enumVal", enumVal);
+ }
+
+ @Override public void readBinary(BinaryReader reader) throws BinaryObjectException {
+ val = reader.readInt("val");
+ strVal = reader.readString("strVal");
+ enumVal = reader.readEnum("enumVal");
+ }
+ }
+
+ /**
* Data mode.
*/
public enum DataMode {
@@ -432,7 +471,10 @@ public abstract class IgniteConfigVariationsAbstractTest extends GridCommonAbstr
EXTERNALIZABLE,
/** Objects without Serializable and Externalizable. */
- PLANE_OBJECT
+ PLANE_OBJECT,
+
+ /** Binarylizable objects. Compatible only with binary marshaller */
+ BINARILIZABLE
}
/**
@@ -452,10 +494,24 @@ public abstract class IgniteConfigVariationsAbstractTest extends GridCommonAbstr
/**
*
*/
- public static interface TestRunnable {
+ public interface TestRunnable {
/**
* @throws Exception If failed.
*/
- public void run() throws Exception;
+ void run() throws Exception;
+ }
+
+ /**
+ * Check test compatibility with current data mode
+ * @return true if incompatible
+ * @throws Exception
+ */
+ protected boolean isCompatible() throws Exception {
+ switch (dataMode) {
+ case BINARILIZABLE:
+ case PLANE_OBJECT:
+ return !(getConfiguration().getMarshaller() instanceof JdkMarshaller);
+ }
+ return false;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/6e1d45e8/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteServiceConfigVariationsFullApiTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteServiceConfigVariationsFullApiTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteServiceConfigVariationsFullApiTestSuite.java
new file mode 100644
index 0000000..328ae8d
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteServiceConfigVariationsFullApiTestSuite.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.testsuites;
+
+import junit.framework.TestSuite;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
+import org.apache.ignite.internal.processors.service.IgniteServiceConfigVariationsFullApiTest;
+import org.apache.ignite.marshaller.jdk.JdkMarshaller;
+import org.apache.ignite.testframework.configvariations.ConfigParameter;
+import org.apache.ignite.testframework.configvariations.ConfigVariations;
+import org.apache.ignite.testframework.configvariations.ConfigVariationsTestSuiteBuilder;
+import org.apache.ignite.testframework.configvariations.Parameters;
+
+/**
+ * Full API service test suit.
+ */
+public class IgniteServiceConfigVariationsFullApiTestSuite extends TestSuite {
+ /** */
+ @SuppressWarnings("unchecked")
+ private static final ConfigParameter<IgniteConfiguration>[][] PARAMS = new ConfigParameter[][] {
+ Parameters.objectParameters("setMarshaller",
+ Parameters.factory(JdkMarshaller.class),
+ Parameters.factory(BinaryMarshaller.class),
+ ConfigVariations.optimizedMarshallerFactory()
+ ),
+
+ Parameters.booleanParameters("setPeerClassLoadingEnabled")
+ };
+
+ /**
+ * @return Compute API test suite.
+ * @throws Exception If failed.
+ */
+ public static TestSuite suite() throws Exception {
+ TestSuite suite = new TestSuite("Service Deployment New Full API Test Suite");
+
+ suite.addTest(new ConfigVariationsTestSuiteBuilder(
+ "Single server",
+ IgniteServiceConfigVariationsFullApiTest.class)
+ .igniteParams(PARAMS)
+ .gridsCount(1)
+ .build());
+
+ // Tests run on server (node#0) & client(node#1).
+ suite.addTest(new ConfigVariationsTestSuiteBuilder(
+ "1 server, 1 client",
+ IgniteServiceConfigVariationsFullApiTest.class)
+ .igniteParams(PARAMS)
+ .gridsCount(2)
+ .testedNodesCount(2)
+ .withClients()
+ .build());
+
+ // Tests run on servers (node#0,node#2,node#3) & client(node#1).
+ suite.addTest(new ConfigVariationsTestSuiteBuilder(
+ "3 servers, 1 client",
+ IgniteServiceConfigVariationsFullApiTest.class)
+ .igniteParams(PARAMS)
+ .gridsCount(4)
+ .testedNodesCount(2)
+ .withClients()
+ .build());
+
+ // Tests run on servers (node#0,node#2,node#3) & client(node#1,node#4).
+ suite.addTest(new ConfigVariationsTestSuiteBuilder(
+ "3 servers, 2 clients",
+ IgniteServiceConfigVariationsFullApiTest.class)
+ .igniteParams(PARAMS)
+ .gridsCount(5)
+ .testedNodesCount(2)
+ .withClients()
+ .build());
+
+ return suite;
+ }
+}
\ No newline at end of file