package org.infinispan.server.test.query; import static org.infinispan.server.test.util.ITestUtils.SERVER1_MGMT_PORT; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FAILED; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FAILURE_DESCRIPTION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESULT; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUCCESS; import static org.junit.Assert.assertEquals; import org.infinispan.arquillian.core.InfinispanResource; import org.infinispan.arquillian.core.RemoteInfinispanServer; import org.infinispan.client.hotrod.RemoteCache; import org.infinispan.client.hotrod.RemoteCacheManager; import org.infinispan.client.hotrod.configuration.ConfigurationBuilder; import org.infinispan.client.hotrod.marshall.ProtoStreamMarshaller; import org.infinispan.query.remote.client.ProtobufMetadataManagerConstants; import org.infinispan.server.test.category.Queries; import org.infinispan.server.test.util.RemoteCacheManagerFactory; import org.jboss.arquillian.junit.Arquillian; import org.jboss.as.clustering.infinispan.subsystem.InfinispanExtension; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.client.ModelControllerClient; import org.jboss.as.controller.descriptions.ModelDescriptionConstants; import org.jboss.dmr.ModelNode; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; /** * Exercise all DMR ops exposed for ProtobufMetadataManager. * * @author anistor@redhat.com */ @Category(Queries.class) @RunWith(Arquillian.class) public class ProtobufMetadataManagerDMROperationsIT { private static final String containerName = "clustered"; @InfinispanResource("remote-query-1") protected RemoteInfinispanServer server; private ModelControllerClient controller; @Before public void setUp() throws Exception { controller = ModelControllerClient.Factory.create( server.getHotrodEndpoint().getInetAddress().getHostName(), SERVER1_MGMT_PORT); } @After public void tearDown() throws Exception { try { if (controller != null) { controller.close(); } } finally { RemoteCacheManagerFactory rcmFactory = new RemoteCacheManagerFactory(); ConfigurationBuilder clientBuilder = new ConfigurationBuilder(); clientBuilder.addServer() .host(server.getHotrodEndpoint().getInetAddress().getHostName()) .port(server.getHotrodEndpoint().getPort()) .marshaller(new ProtoStreamMarshaller()); RemoteCacheManager remoteCacheManager = rcmFactory.createManager(clientBuilder); RemoteCache<String, String> metadataCache = remoteCacheManager.getCache(ProtobufMetadataManagerConstants.PROTOBUF_METADATA_CACHE_NAME); // remove all files that were potentially left behind by this test metadataCache.remove("test1.proto"); metadataCache.remove("test1.proto.errors"); metadataCache.remove("test2.proto"); metadataCache.remove("test2.proto.errors"); metadataCache.remove("test3.proto"); metadataCache.remove("test3.proto.errors"); rcmFactory.stopManagers(); } } @Test public void testOperations() throws Exception { // get all schema names ModelNode op = getOperation("get-proto-schema-names"); ModelNode result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); // unregister all schemas op = getOperation("unregister-proto-schemas"); op.get("file-names").set(result.get(RESULT).asList()); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); // ensure there are no schemas op = getOperation("get-proto-schema-names"); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); assertEquals("[]", result.get(RESULT).asString()); // ensure there are no errors op = getOperation("get-proto-schemas-with-errors"); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); assertEquals("[]", result.get(RESULT).asString()); // register a valid schema file op = getOperation("register-proto-schemas"); op.get("file-names").set(new ModelNode().add("test1.proto")); op.get("file-contents").set(new ModelNode().add("package test;")); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); // ensure the schema is defined op = getOperation("get-proto-schema-names"); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); assertEquals("[\"test1.proto\"]", result.get(RESULT).asString()); // ensure there are no errors op = getOperation("get-proto-schemas-with-errors"); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); assertEquals("[]", result.get(RESULT).asString()); // check the contents of test1.proto op = getOperation("get-proto-schema"); op.get("file-name").set("test1.proto"); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); assertEquals("package test;", result.get(RESULT).asString()); // register a valid schema file by uploading it from classpath op = getOperation("upload-proto-schemas"); op.get("file-names").set(new ModelNode().add("test2.proto")); ModelNode urlList = new ModelNode().add(getClass().getResource("/sample_bank_account/bank.proto").toString()); op.get("file-urls").set(urlList); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); // ensure the schema is defined op = getOperation("get-proto-schema-names"); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); assertEquals("[\"test1.proto\",\"test2.proto\"]", result.get(RESULT).asString()); // ensure there are no errors op = getOperation("get-proto-schemas-with-errors"); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); assertEquals("[]", result.get(RESULT).asString()); // register an invalid schema file op = getOperation("register-proto-schemas"); op.get("file-names").set(new ModelNode().add("test3.proto")); op.get("file-contents").set(new ModelNode().add("kabooom")); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); // ensure the schema is defined op = getOperation("get-proto-schema-names"); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); assertEquals("[\"test1.proto\",\"test2.proto\",\"test3.proto\"]", result.get(RESULT).asString()); // check the contents of test3.proto op = getOperation("get-proto-schema"); op.get("file-name").set("test3.proto"); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); assertEquals("kabooom", result.get(RESULT).asString()); // ensure test3.proto has errors op = getOperation("get-proto-schemas-with-errors"); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); assertEquals("[\"test3.proto\"]", result.get(RESULT).asString()); // check there are errors in test3.proto op = getOperation("get-proto-schema-errors"); op.get("file-name").set("test3.proto"); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); assertEquals("java.lang.IllegalStateException: Syntax error in test3.proto at 1:8: unexpected label: kabooom", result.get(RESULT).asString()); // unregister test3.proto op = getOperation("unregister-proto-schemas"); op.get("file-names").set(new ModelNode().add("test3.proto")); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); // retrieving test3.proto should result in an error op = getOperation("get-proto-schema"); op.get("file-name").set("test3.proto"); result = controller.execute(op); assertEquals(FAILED, result.get(OUTCOME).asString()); assertEquals("DGISPN0118: Failed to invoke operation: File does not exist : test3.proto", result.get(FAILURE_DESCRIPTION).asString()); // retrieving test3.proto errors should result in an error op = getOperation("get-proto-schema-errors"); op.get("file-name").set("test3.proto"); result = controller.execute(op); assertEquals(FAILED, result.get(OUTCOME).asString()); assertEquals("DGISPN0118: Failed to invoke operation: File does not exist : test3.proto", result.get(FAILURE_DESCRIPTION).asString()); // ensure there are no errors globally op = getOperation("get-proto-schemas-with-errors"); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); assertEquals("[]", result.get(RESULT).asString()); // unregister test1.proto and test2.proto op = getOperation("unregister-proto-schemas"); op.get("file-names").set(new ModelNode().add("test1.proto").add("test2.proto")); result = controller.execute(op); assertEquals(SUCCESS, result.get(OUTCOME).asString()); } private ModelNode getOperation(String operationName) { PathAddress address = PathAddress.pathAddress( PathElement.pathElement(ModelDescriptionConstants.SUBSYSTEM, InfinispanExtension.SUBSYSTEM_NAME)) .append("cache-container", containerName); ModelNode op = new ModelNode(); op.get(OP).set(operationName); op.get(OP_ADDR).set(address.toModelNode()); return op; } }