/** * 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.camel.component.jclouds; import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.transform.TransformerException; import javax.xml.transform.sax.SAXSource; import org.xml.sax.InputSource; import com.google.common.collect.Lists; import org.apache.camel.Exchange; import org.apache.camel.StreamCache; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.converter.stream.StreamCacheConverter; import org.apache.camel.impl.DefaultExchange; import org.apache.camel.test.junit4.CamelTestSupport; import org.jclouds.ContextBuilder; import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.BlobStoreContext; import org.junit.Test; public class JcloudsBlobStoreProducerTest extends CamelTestSupport { private static final String TEST_CONTAINER = "testContainer"; private static final String TEST_BLOB_IN_DIR = "/dir/testBlob"; private static final String MESSAGE = "<test>This is a test</test>"; BlobStoreContext blobStoreContext = ContextBuilder.newBuilder("transient").credentials("identity", "credential").build(BlobStoreContext.class); BlobStore blobStore = blobStoreContext.getBlobStore(); @Test public void testBlobStorePut() throws InterruptedException { MockEndpoint mockEndpoint = resolveMandatoryEndpoint("mock:results", MockEndpoint.class); mockEndpoint.expectedMessageCount(1); template.sendBody("direct:put", "Some message"); mockEndpoint.assertIsSatisfied(); } @Test public void testBlobStorePutAndGet() throws InterruptedException { String message = "Some message"; template.sendBody("direct:put-and-get", message); Object result = template.requestBodyAndHeader("direct:put-and-get", null, JcloudsConstants.OPERATION, JcloudsConstants.GET, String.class); assertEquals(message, result); } @Test public void testBlobStorePutWithStreamAndGet() throws InterruptedException, TransformerException { ByteArrayInputStream inputStream = new ByteArrayInputStream(MESSAGE.getBytes()); Exchange exchange = new DefaultExchange(context); StreamCache streamCache = StreamCacheConverter.convertToStreamCache(new SAXSource(new InputSource(inputStream)), exchange); template.sendBody("direct:put-and-get", streamCache); Object result = template.requestBodyAndHeader("direct:put-and-get", null, JcloudsConstants.OPERATION, JcloudsConstants.GET, String.class); assertEquals(MESSAGE, result); } @Test public void testBlobStorePutAndCount() throws InterruptedException { String message = "Some message"; template.sendBody("direct:put-and-count", message); Object result = template.requestBodyAndHeader("direct:put-and-count", null, JcloudsConstants.OPERATION, JcloudsConstants.COUNT_BLOBS, Long.class); assertEquals(new Long(1), result); } @Test public void testBlobStorePutAndRemove() throws InterruptedException { String message = "Some message"; template.sendBody("direct:put-and-remove", message); template.requestBodyAndHeader("direct:put-and-remove", null, JcloudsConstants.OPERATION, JcloudsConstants.REMOVE_BLOB); Object result = template.requestBodyAndHeader("direct:put-and-remove", null, JcloudsConstants.OPERATION, JcloudsConstants.COUNT_BLOBS, Long.class); assertEquals(new Long(0), result); } @Test public void testBlobStorePutAndClear() throws InterruptedException { String message = "Some message"; template.sendBody("direct:put-and-clear", message); Object result = template.requestBodyAndHeader("direct:put-and-count", null, JcloudsConstants.OPERATION, JcloudsConstants.COUNT_BLOBS, Long.class); assertEquals(new Long(1), result); template.requestBodyAndHeader("direct:put-and-clear", null, JcloudsConstants.OPERATION, JcloudsConstants.CLEAR_CONTAINER); result = template.requestBodyAndHeader("direct:put-and-count", null, JcloudsConstants.OPERATION, JcloudsConstants.COUNT_BLOBS, Long.class); assertEquals(new Long(0), result); } @Test public void testBlobStorePutAndDeleteContainer() throws InterruptedException { String message = "Some message"; template.sendBody("direct:put-and-delete-container", message); Object result = template.requestBodyAndHeader("direct:put-and-count", null, JcloudsConstants.OPERATION, JcloudsConstants.COUNT_BLOBS, Long.class); assertEquals(new Long(1), result); template.requestBodyAndHeader("direct:put-and-delete-container", null, JcloudsConstants.OPERATION, JcloudsConstants.DELETE_CONTAINER); } @Test public void testCheckContainerExists() throws InterruptedException { Object result = template.requestBodyAndHeader("direct:put-and-count", null, JcloudsConstants.OPERATION, JcloudsConstants.CONTAINER_EXISTS, Boolean.class); assertEquals(true, result); Map<String, Object> headers = new HashMap<String, Object>(); headers.put(JcloudsConstants.OPERATION, JcloudsConstants.CONTAINER_EXISTS); headers.put(JcloudsConstants.CONTAINER_NAME, "otherTest"); result = template.requestBodyAndHeaders("direct:container-exists", null, headers, Boolean.class); assertEquals(false, result); } @Test public void testRemoveBlobs() throws InterruptedException { template.sendBody("direct:put", "test message"); Object result = template.requestBodyAndHeader("direct:put-and-count", null, JcloudsConstants.OPERATION, JcloudsConstants.COUNT_BLOBS, Long.class); assertEquals(new Long(1), result); List blobsToRemove = new ArrayList<>(); blobsToRemove.add(TEST_BLOB_IN_DIR); Map<String, Object> headers = new HashMap<String, Object>(); headers.put(JcloudsConstants.OPERATION, JcloudsConstants.REMOVE_BLOBS); headers.put(JcloudsConstants.CONTAINER_NAME, TEST_CONTAINER); headers.put(JcloudsConstants.BLOB_NAME_LIST, blobsToRemove); template.sendBodyAndHeaders("direct:remove-blobs", null, headers); result = template.requestBodyAndHeader("direct:put-and-count", null, JcloudsConstants.OPERATION, JcloudsConstants.COUNT_BLOBS, Long.class); assertEquals(new Long(0), result); } @Override protected RouteBuilder createRouteBuilder() throws Exception { blobStore.createContainerInLocation(null, TEST_CONTAINER); ((JcloudsComponent) context.getComponent("jclouds")).setBlobStores(Lists.newArrayList(blobStore)); return new RouteBuilder() { public void configure() { from("direct:put") .setHeader(JcloudsConstants.BLOB_NAME, constant(TEST_BLOB_IN_DIR)) .setHeader(JcloudsConstants.CONTAINER_NAME, constant(TEST_CONTAINER)) .to("jclouds:blobstore:transient").to("mock:results"); from("direct:put-and-get") .setHeader(JcloudsConstants.BLOB_NAME, constant(TEST_BLOB_IN_DIR)) .setHeader(JcloudsConstants.CONTAINER_NAME, constant(TEST_CONTAINER)) .to("jclouds:blobstore:transient"); from("direct:put-and-count") .setHeader(JcloudsConstants.BLOB_NAME, constant(TEST_BLOB_IN_DIR)) .setHeader(JcloudsConstants.CONTAINER_NAME, constant(TEST_CONTAINER)) .to("jclouds:blobstore:transient"); from("direct:put-and-remove") .setHeader(JcloudsConstants.BLOB_NAME, constant(TEST_BLOB_IN_DIR)) .setHeader(JcloudsConstants.CONTAINER_NAME, constant(TEST_CONTAINER)) .to("jclouds:blobstore:transient"); from("direct:put-and-clear") .setHeader(JcloudsConstants.BLOB_NAME, constant(TEST_BLOB_IN_DIR)) .setHeader(JcloudsConstants.CONTAINER_NAME, constant(TEST_CONTAINER)) .to("jclouds:blobstore:transient"); from("direct:put-and-delete-container") .setHeader(JcloudsConstants.BLOB_NAME, constant(TEST_BLOB_IN_DIR)) .setHeader(JcloudsConstants.CONTAINER_NAME, constant(TEST_CONTAINER)) .to("jclouds:blobstore:transient"); from("direct:container-exists") .to("jclouds:blobstore:transient"); from("direct:remove-blobs") .to("jclouds:blobstore:transient"); } }; } }