package org.infinispan.server.test.client.rest; import static org.infinispan.server.test.client.rest.RESTHelper.KEY_A; import static org.infinispan.server.test.client.rest.RESTHelper.KEY_B; import static org.infinispan.server.test.util.ITestUtils.Condition; import static org.infinispan.server.test.util.ITestUtils.eventually; import static org.infinispan.server.test.util.ITestUtils.isReplicatedMode; import static org.junit.Assert.assertTrue; import java.net.URI; import java.util.List; import org.apache.http.HttpStatus; import org.infinispan.arquillian.core.RemoteInfinispanServer; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * Tests for the REST client putAsync header. * * @author mgencur */ public abstract class AbstractRESTAsyncIT { protected abstract int getRestPort1(); protected abstract int getRestPort2(); protected abstract List<RemoteInfinispanServer> getServers(); RESTHelper rest; @Before public void setUp() throws Exception { rest = new RESTHelper(); if (isReplicatedMode()) { rest.addServer(getServers().get(0).getRESTEndpoint().getInetAddress().getHostName(), getRestPort1(), getServers().get(0).getRESTEndpoint().getContextPath()); rest.addServer(getServers().get(1).getRESTEndpoint().getInetAddress().getHostName(), getRestPort2(), getServers().get(1).getRESTEndpoint().getContextPath()); } else { rest.addServer(getServers().get(0).getRESTEndpoint().getInetAddress().getHostName(), getServers().get(0).getRESTEndpoint().getContextPath()); rest.addServer(getServers().get(1).getRESTEndpoint().getInetAddress().getHostName(), getServers().get(1).getRESTEndpoint().getContextPath()); } rest.delete(rest.fullPathKey(KEY_A)); rest.head(rest.fullPathKey(KEY_A), HttpStatus.SC_NOT_FOUND); } @After public void tearDown() throws Exception { rest.delete(rest.fullPathKey(null)); rest.clearServers(); } @Test public void testPutOperation() throws Exception { URI fullPathKey = rest.fullPathKey(KEY_A); int NUM_OPERATIONS = 1000; String initialXML = "<hey>ho</hey>"; StringBuilder initial = new StringBuilder(initialXML); for (int i = 0; i < 200; i++) { initial.append("expanding"); } initialXML = initial.toString(); long t1 = System.currentTimeMillis(); for (int i = 0; i < NUM_OPERATIONS; i++) { rest.put(fullPathKey, initialXML, "application/octet-stream", HttpStatus.SC_OK, "performAsync", "false"); } long putSyncTime = System.currentTimeMillis() - t1; rest.delete(fullPathKey); t1 = System.currentTimeMillis(); for (int i = 0; i < NUM_OPERATIONS; i++) { rest.put(fullPathKey, initialXML, "application/octet-stream", HttpStatus.SC_OK, "performAsync", "true"); } long putAsyncTime = System.currentTimeMillis() - t1; assertTrue("PUT : async- " + putAsyncTime + ", sync- " + putSyncTime, putAsyncTime < putSyncTime); rest.get(fullPathKey, initialXML, HttpStatus.SC_OK, true, "performAsync", "true"); } @Test public void testDeleteOperation() throws Exception { int NUM_OPERATIONS = 15; int SIZE = 900; byte[] bytes = new byte[SIZE]; for (int i = 0; i < SIZE; i++) { bytes[i] = (byte) (i % 10); } for (int i = 0; i < NUM_OPERATIONS; i++) { rest.put(rest.fullPathKey(String.valueOf(i)), bytes, "application/octet-stream", HttpStatus.SC_OK, "performAsync", "false"); } for (int i = 0; i < NUM_OPERATIONS; i++) { rest.delete(rest.fullPathKey(String.valueOf(i)), HttpStatus.SC_OK, "performAsync", "true"); } for (int i = 0; i < NUM_OPERATIONS; i++) { final int iter = i; // inner class can access only final variables... // since the delete is async, the get can execute before the delete finishes (delete needs communication between nodes) eventually(new Condition() { @Override public boolean isSatisfied() throws Exception { return rest.getWithoutAssert(rest.fullPathKey(String.valueOf(iter)), null, HttpStatus.SC_NOT_FOUND, true, "performAsync", "true"); } }, 5000, 10); } rest.put(rest.fullPathKey(KEY_A), KEY_A, "application/octet-stream"); rest.put(rest.fullPathKey(KEY_B), KEY_B, "application/octet-stream"); rest.delete(rest.fullPathKey(null), HttpStatus.SC_OK, "performAsync", "true"); eventually(new Condition() { @Override public boolean isSatisfied() throws Exception { return rest.getWithoutAssert(rest.fullPathKey(KEY_A), null, HttpStatus.SC_NOT_FOUND, true) && rest.getWithoutAssert(rest.fullPathKey(KEY_B), null, HttpStatus.SC_NOT_FOUND, true); } }, 5000, 10); } }