/* * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0 * (the "License"). You may not use this work except in compliance with the License, which is * available at www.apache.org/licenses/LICENSE-2.0 * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied, as more fully set forth in the License. * * See the NOTICE file distributed with this work for information regarding copyright ownership. */ package alluxio.worker.block; import alluxio.Configuration; import alluxio.Constants; import alluxio.PropertyKey; import alluxio.rest.RestApiTest; import alluxio.rest.TestCase; import alluxio.wire.LockBlockResult; import alluxio.worker.block.io.BlockWriter; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.io.IOUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import java.io.FileInputStream; import java.net.HttpURLConnection; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; import javax.ws.rs.HttpMethod; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; /** * Test cases for {@link BlockWorkerClientRestServiceHandler}. */ public final class BlockWorkerClientRestApiTest extends RestApiTest { private static final long SESSION_ID = 1; private static final long BLOCK_ID = 2; private static final String TIER_ALIAS = "MEM"; private static final int INITIAL_BYTES = 5; private static final ByteBuffer BYTE_BUFFER = ByteBuffer.wrap("hello".getBytes()); private BlockWorker mBlockWorker; @Before public void before() throws Exception { mHostname = mResource.get().getHostname(); mPort = mResource.get().getWorkerProcess().getWebLocalPort(); mServicePrefix = BlockWorkerClientRestServiceHandler.SERVICE_PREFIX; mBlockWorker = mResource.get().getWorkerProcess().getWorker(BlockWorker.class); } @Test public void serviceName() throws Exception { new TestCase(mHostname, mPort, getEndpoint(BlockWorkerClientRestServiceHandler.SERVICE_NAME), NO_PARAMS, HttpMethod.GET, Constants.BLOCK_WORKER_CLIENT_SERVICE_NAME).run(); } @Test public void serviceVersion() throws Exception { new TestCase(mHostname, mPort, getEndpoint(BlockWorkerClientRestServiceHandler.SERVICE_VERSION), NO_PARAMS, HttpMethod.GET, Constants.BLOCK_WORKER_CLIENT_SERVICE_VERSION).run(); } @Test public void accessBlock() throws Exception { mBlockWorker.createBlock(SESSION_ID, BLOCK_ID, TIER_ALIAS, INITIAL_BYTES); mBlockWorker.commitBlock(SESSION_ID, BLOCK_ID); Map<String, String> params = new HashMap<>(); params.put("blockId", Long.toString(BLOCK_ID)); new TestCase(mHostname, mPort, getEndpoint(BlockWorkerClientRestServiceHandler.ACCESS_BLOCK), params, HttpMethod.POST, null).run(); } @Test public void cacheBlock() throws Exception { mBlockWorker.createBlock(SESSION_ID, BLOCK_ID, TIER_ALIAS, INITIAL_BYTES); mBlockWorker.commitBlock(SESSION_ID, BLOCK_ID); Map<String, String> params = new HashMap<>(); params.put("blockId", Long.toString(BLOCK_ID)); params.put("sessionId", Long.toString(SESSION_ID)); new TestCase(mHostname, mPort, getEndpoint(BlockWorkerClientRestServiceHandler.CACHE_BLOCK), params, HttpMethod.POST, null).run(); } @Test public void cancelBlock() throws Exception { mBlockWorker.createBlock(SESSION_ID, BLOCK_ID, TIER_ALIAS, INITIAL_BYTES); Map<String, String> params = new HashMap<>(); params.put("blockId", Long.toString(BLOCK_ID)); params.put("sessionId", Long.toString(SESSION_ID)); new TestCase(mHostname, mPort, getEndpoint(BlockWorkerClientRestServiceHandler.CANCEL_BLOCK), params, HttpMethod.POST, null).run(); } @Test public void lockBlock() throws Exception { mBlockWorker.createBlock(SESSION_ID, BLOCK_ID, TIER_ALIAS, INITIAL_BYTES); mBlockWorker.commitBlock(SESSION_ID, BLOCK_ID); Map<String, String> params = new HashMap<>(); params.put("blockId", Long.toString(BLOCK_ID)); params.put("sessionId", Long.toString(SESSION_ID)); String result = new TestCase(mHostname, mPort, getEndpoint(BlockWorkerClientRestServiceHandler.LOCK_BLOCK), params, HttpMethod.POST, null).call(); LockBlockResult lockBlockResult = new ObjectMapper().readValue(result, LockBlockResult.class); Assert.assertTrue( lockBlockResult.getBlockPath().contains(Configuration.get(PropertyKey.WORKER_DATA_FOLDER))); } @Test public void promoteBlock() throws Exception { mBlockWorker.createBlock(SESSION_ID, BLOCK_ID, TIER_ALIAS, INITIAL_BYTES); mBlockWorker.commitBlock(SESSION_ID, BLOCK_ID); Map<String, String> params = new HashMap<>(); params.put("blockId", Long.toString(BLOCK_ID)); new TestCase(mHostname, mPort, getEndpoint(BlockWorkerClientRestServiceHandler.PROMOTE_BLOCK), params, HttpMethod.POST, null).run(); } @Test public void readBlock() throws Exception { // Write a block and acquire a lock for it. mBlockWorker.createBlock(SESSION_ID, BLOCK_ID, TIER_ALIAS, INITIAL_BYTES); BlockWriter writer = mBlockWorker.getTempBlockWriterRemote(SESSION_ID, BLOCK_ID); writer.append(BYTE_BUFFER); writer.close(); mBlockWorker.commitBlock(SESSION_ID, BLOCK_ID); long lockId = mBlockWorker.lockBlock(SESSION_ID, BLOCK_ID); Map<String, String> params = new HashMap<>(); params.put("blockId", Long.toString(BLOCK_ID)); params.put("sessionId", Long.toString(SESSION_ID)); params.put("lockId", Long.toString(lockId)); params.put("offset", "0"); params.put("length", Long.toString(INITIAL_BYTES)); TestCase testCase = new TestCase(mHostname, mPort, getEndpoint(BlockWorkerClientRestServiceHandler.READ_BLOCK), params, HttpMethod.GET, BYTE_BUFFER); HttpURLConnection connection = (HttpURLConnection) testCase.createURL().openConnection(); connection.setRequestMethod(testCase.getMethod()); connection.connect(); Assert.assertEquals(testCase.getEndpoint(), Response.Status.OK.getStatusCode(), connection.getResponseCode()); Assert.assertEquals(new String(BYTE_BUFFER.array()), testCase.getResponse(connection)); } @Test public void requestBlockLocation() throws Exception { Map<String, String> params = new HashMap<>(); params.put("blockId", "1"); params.put("sessionId", "1"); params.put("initialBytes", "1"); String location = new TestCase(mHostname, mPort, getEndpoint(BlockWorkerClientRestServiceHandler.REQUEST_BLOCK_LOCATION), params, HttpMethod.POST, null).call(); Assert.assertTrue(location.contains(Configuration.get(PropertyKey.WORKER_DATA_FOLDER))); } @Test public void requestSpace() throws Exception { mBlockWorker.createBlock(SESSION_ID, BLOCK_ID, TIER_ALIAS, INITIAL_BYTES); Map<String, String> params = new HashMap<>(); params.put("blockId", Long.toString(BLOCK_ID)); params.put("sessionId", Long.toString(SESSION_ID)); params.put("requestBytes", "10"); new TestCase(mHostname, mPort, getEndpoint(BlockWorkerClientRestServiceHandler.REQUEST_SPACE), params, HttpMethod.POST, null).run(); } @Test public void unlockBlock() throws Exception { // Write a block and acquire a lock for it. mBlockWorker.createBlock(SESSION_ID, BLOCK_ID, TIER_ALIAS, INITIAL_BYTES); BlockWriter writer = mBlockWorker.getTempBlockWriterRemote(SESSION_ID, BLOCK_ID); writer.append(BYTE_BUFFER); writer.close(); mBlockWorker.commitBlock(SESSION_ID, BLOCK_ID); mBlockWorker.lockBlock(SESSION_ID, BLOCK_ID); Map<String, String> params = new HashMap<>(); params.put("blockId", Long.toString(BLOCK_ID)); params.put("sessionId", Long.toString(SESSION_ID)); new TestCase(mHostname, mPort, getEndpoint(BlockWorkerClientRestServiceHandler.UNLOCK_BLOCK), params, HttpMethod.POST, null).run(); } @Test public void writeBlock() throws Exception { Map<String, String> params = new HashMap<>(); params.put("blockId", Long.toString(BLOCK_ID)); params.put("sessionId", Long.toString(SESSION_ID)); params.put("offset", "0"); params.put("length", Long.toString(INITIAL_BYTES)); TestCase testCase = new TestCase(mHostname, mPort, getEndpoint(BlockWorkerClientRestServiceHandler.WRITE_BLOCK), params, HttpMethod.POST, null); HttpURLConnection connection = (HttpURLConnection) testCase.createURL().openConnection(); connection.setRequestProperty("Content-Type", MediaType.APPLICATION_OCTET_STREAM); connection.setRequestMethod(testCase.getMethod()); connection.setDoOutput(true); connection.connect(); connection.getOutputStream().write(BYTE_BUFFER.array()); Assert.assertEquals(testCase.getEndpoint(), Response.Status.OK.getStatusCode(), connection.getResponseCode()); Assert.assertEquals("", testCase.getResponse(connection)); // Verify that the right data was written. mBlockWorker.commitBlock(SESSION_ID, BLOCK_ID); long lockId = mBlockWorker.lockBlock(SESSION_ID, BLOCK_ID); String file = mBlockWorker.readBlock(SESSION_ID, BLOCK_ID, lockId); byte[] result = new byte[INITIAL_BYTES]; IOUtils.readFully(new FileInputStream(file), result); Assert.assertArrayEquals(BYTE_BUFFER.array(), result); } }