package org.infinispan.server.test.task; import static java.util.Arrays.asList; import static org.infinispan.server.test.client.hotrod.security.HotRodSaslAuthTestBase.ADMIN_LOGIN; import static org.infinispan.server.test.client.hotrod.security.HotRodSaslAuthTestBase.ADMIN_PASSWD; import static org.infinispan.server.test.client.hotrod.security.HotRodSaslAuthTestBase.EXECUTOR_LOGIN; import static org.infinispan.server.test.client.hotrod.security.HotRodSaslAuthTestBase.EXECUTOR_PASSWORD; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; import java.util.Collections; import java.util.List; import org.infinispan.arquillian.core.InfinispanResource; import org.infinispan.arquillian.core.RemoteInfinispanServer; import org.infinispan.arquillian.core.RunningServer; import org.infinispan.arquillian.core.WithRunningServer; import org.infinispan.client.hotrod.RemoteCache; import org.infinispan.client.hotrod.RemoteCacheManager; import org.infinispan.client.hotrod.exceptions.HotRodClientException; import org.infinispan.server.test.category.Task; import org.infinispan.server.test.task.servertask.DistributedAuthServerTask; import org.infinispan.server.test.task.servertask.LocalAuthTestServerTask; import org.infinispan.server.test.util.security.SecurityConfigurationHelper; import org.infinispan.tasks.ServerTask; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.exporter.ZipExporter; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; /** * Tests in distributed mode the server task execution in case if authentication is required. * * @author amanukya */ @RunWith(Arquillian.class) @Category({Task.class}) @WithRunningServer({@RunningServer(name="hotrodAuthClustered"), @RunningServer(name = "hotrodAuthClustered-2")}) public class DistributedAuthServerTaskIT { @InfinispanResource("hotrodAuthClustered") RemoteInfinispanServer server1; @InfinispanResource("hotrodAuthClustered-2") RemoteInfinispanServer server2; @Rule public ExpectedException exceptionRule = ExpectedException.none(); @BeforeClass public static void before() throws Exception { String[] serverDirs = new String[]{System.getProperty("server1.dist"), System.getProperty("server2.dist")}; JavaArchive jar = ShrinkWrap.create(JavaArchive.class); jar.addClass(DistributedAuthServerTask.class); jar.addClass(LocalAuthTestServerTask.class); jar.addAsServiceProvider(ServerTask.class, DistributedAuthServerTask.class, LocalAuthTestServerTask.class); for (String serverDir : serverDirs) { File f = new File(serverDir, "/standalone/deployments/custom-distributed-task-with-auth.jar"); jar.as(ZipExporter.class).exportTo(f, true); } } @AfterClass public static void undeploy() { String serverDir = System.getProperty("server1.dist"); File jar = new File(serverDir, "/standalone/deployments/custom-distributed-task-with-auth.jar"); if (jar.exists()) jar.delete(); File f = new File(serverDir, "/standalone/deployments/custom-distributed-task-with-auth.jar.deployed"); if (f.exists()) f.delete(); } @Test @SuppressWarnings("unchecked") public void shouldRunLocalAuthTest() throws Exception { SecurityConfigurationHelper config = new SecurityConfigurationHelper("DIGEST-MD5"); config.forIspnServer(server1).withServerName("node0"); config.forCredentials(EXECUTOR_LOGIN, EXECUTOR_PASSWORD); RemoteCacheManager rcm = new RemoteCacheManager(config.build(), true); RemoteCache remoteCache = rcm.getCache(LocalAuthTestServerTask.CACHE_NAME); String result = (String) remoteCache.execute(LocalAuthTestServerTask.NAME, Collections.emptyMap()); assertEquals(LocalAuthTestServerTask.EXECUTED_VALUE, result); assertEquals(true, remoteCache.get(LocalAuthTestServerTask.KEY)); rcm.stop(); } @Test @SuppressWarnings("unchecked") public void shouldRunDistAuthTest() throws Exception { SecurityConfigurationHelper config = new SecurityConfigurationHelper("DIGEST-MD5"); config.forIspnServer(server1).withServerName("node0"); config.forCredentials(EXECUTOR_LOGIN, EXECUTOR_PASSWORD); RemoteCacheManager rcm = new RemoteCacheManager(config.build(), true); RemoteCache remoteCache = rcm.getCache(DistributedAuthServerTask.CACHE_NAME); List<String> result = (List<String>) remoteCache.execute(DistributedAuthServerTask.NAME, Collections.emptyMap()); assertEquals(2, result.size()); assertTrue("result list does not contain expected items.", result.containsAll(asList("node0", "node1"))); rcm.stop(); } @Test public void shouldThrowException() throws Exception { SecurityConfigurationHelper config = new SecurityConfigurationHelper("DIGEST-MD5"); config.forIspnServer(server1).withServerName("node0"); config.forCredentials(ADMIN_LOGIN, ADMIN_PASSWD); RemoteCacheManager rcm = new RemoteCacheManager(config.build(), true); RemoteCache remoteCache = rcm.getCache(DistributedAuthServerTask.CACHE_NAME); exceptionRule.expect(HotRodClientException.class); exceptionRule.expectMessage("lacks 'EXEC' permission"); remoteCache.execute(DistributedAuthServerTask.NAME, Collections.emptyMap()); rcm.stop(); } }