/** * Copyright Microsoft Corporation * * Licensed 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 com.microsoft.azure.storage.blob; import java.io.IOException; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Iterator; import java.util.UUID; import org.junit.Test; import org.junit.experimental.categories.Category; import com.microsoft.azure.storage.Constants; import com.microsoft.azure.storage.core.SR; import com.microsoft.azure.storage.LocationMode; import com.microsoft.azure.storage.OperationContext; import com.microsoft.azure.storage.ResultContinuation; import com.microsoft.azure.storage.ResultSegment; import com.microsoft.azure.storage.SendingRequestEvent; import com.microsoft.azure.storage.StorageEvent; import com.microsoft.azure.storage.StorageException; import com.microsoft.azure.storage.TestRunners.CloudTests; import com.microsoft.azure.storage.TestRunners.DevFabricTests; import com.microsoft.azure.storage.TestRunners.DevStoreTests; import com.microsoft.azure.storage.TestRunners; import static org.junit.Assert.*; /** * Blob Client Tests */ public class CloudBlobClientTests { /** * * @throws StorageException * @throws URISyntaxException */ @Test @Category({ DevFabricTests.class, DevStoreTests.class, CloudTests.class }) public void testListContainers() throws StorageException, URISyntaxException { CloudBlobClient bClient = BlobTestHelper.createCloudBlobClient(); ArrayList<String> containerList = new ArrayList<String>(); String prefix = UUID.randomUUID().toString(); for (int i = 0; i < 30; i++) { containerList.add(prefix + i); bClient.getContainerReference(prefix + i).create(); } int count = 0; for (final CloudBlobContainer container : bClient.listContainers(prefix)) { assertEquals(CloudBlobContainer.class, container.getClass()); count++; } assertEquals(30, count); ResultContinuation token = null; do { ResultSegment<CloudBlobContainer> segment = bClient.listContainersSegmented(prefix, ContainerListingDetails.ALL, 15, token, null, null); for (final CloudBlobContainer container : segment.getResults()) { container.downloadAttributes(); assertEquals(CloudBlobContainer.class, container.getClass()); containerList.remove(container.getName()); } token = segment.getContinuationToken(); } while (token != null); assertEquals(0, containerList.size()); } /** * Try to list the containers to ensure maxResults validation is working. * * @throws StorageException * @throws URISyntaxException */ @Test @Category({ DevFabricTests.class, DevStoreTests.class, CloudTests.class }) public void testListContainersMaxResultsValidation() throws StorageException, URISyntaxException { CloudBlobClient bClient = BlobTestHelper.createCloudBlobClient(); String prefix = UUID.randomUUID().toString(); // Validation should cause each of these to fail. for(int i = 0; i >= -2; i--) { try { bClient.listContainersSegmented( prefix, ContainerListingDetails.ALL, i, null, null, null); fail(); } catch (IllegalArgumentException e) { assertTrue(String.format(SR.PARAMETER_SHOULD_BE_GREATER_OR_EQUAL, "maxResults", 1) .equals(e.getMessage())); } } assertNotNull(bClient.listContainersSegmented("thereshouldntbeanycontainersswiththisprefix")); } /** * Fetch result segments and ensure pageSize is null when unspecified and will cap at 5000. * * @throws StorageException * @throws URISyntaxException */ @Test @Category({ DevFabricTests.class, DevStoreTests.class, CloudTests.class }) public void testListContainersResultSegment() throws StorageException, URISyntaxException { CloudBlobClient bClient = BlobTestHelper.createCloudBlobClient(); ResultSegment<CloudBlobContainer> segment1 = bClient.listContainersSegmented(); assertNotNull(segment1); assertNull(segment1.getPageSize()); ResultSegment<CloudBlobContainer> segment2 = bClient.listContainersSegmented(null, ContainerListingDetails.ALL, 9001, null, null, null); assertNotNull(segment2); assertNotNull(segment2.getPageSize()); assertEquals(5000, segment2.getPageSize().intValue()); } /** * List containers and fetch attributes with public access * * @throws StorageException * @throws URISyntaxException */ @Test @Category({ DevFabricTests.class, DevStoreTests.class, CloudTests.class }) public void testCreateContainerWithPublicAccess() throws StorageException, URISyntaxException { CloudBlobClient bClient = BlobTestHelper.createCloudBlobClient(); BlobContainerPublicAccessType[] accessTypes = { BlobContainerPublicAccessType.CONTAINER, BlobContainerPublicAccessType.OFF, BlobContainerPublicAccessType.BLOB }; for(BlobContainerPublicAccessType accessType : accessTypes) { String name = UUID.randomUUID().toString(); CloudBlobContainer container = bClient.getContainerReference(name); assertNull(container.properties.getPublicAccess()); container.create(accessType, null, null); assertEquals(accessType, container.properties.getPublicAccess()); CloudBlobContainer containerRef = bClient.getContainerReference(name); assertNull(containerRef.properties.getPublicAccess()); BlobContainerPermissions permissions = containerRef.downloadPermissions(); assertEquals(accessType, containerRef.properties.getPublicAccess()); assertEquals(accessType, permissions.getPublicAccess()); CloudBlobContainer containerRef2 = bClient.getContainerReference(name); assertEquals(null, containerRef2.properties.getPublicAccess()); containerRef2.exists(); assertEquals(accessType, containerRef2.properties.getPublicAccess()); String name2 = UUID.randomUUID().toString(); CloudBlobContainer container2 = bClient.getContainerReference(name2); assertNull(container2.properties.getPublicAccess()); container2.create(); assertEquals(BlobContainerPublicAccessType.OFF, container2.properties.getPublicAccess()); BlobContainerPermissions permissions2 = new BlobContainerPermissions(); permissions2.setPublicAccess(accessType); container2.uploadPermissions(permissions); assertEquals(accessType, container2.properties.getPublicAccess()); CloudBlobContainer containerRef3 = bClient.getContainerReference(name); containerRef3.downloadAttributes(); assertEquals(accessType, containerRef3.properties.getPublicAccess()); String name3 = UUID.randomUUID().toString(); CloudBlobContainer container3 = bClient.getContainerReference(name3); container3.create(null, null, null); assertEquals(BlobContainerPublicAccessType.OFF, container3.properties.getPublicAccess()); container.delete(); container2.delete(); container3.delete(); } } /** * List containers and fetch attributes with public access * * @throws StorageException * @throws URISyntaxException */ @Test @Category({ DevFabricTests.class, DevStoreTests.class, CloudTests.class }) public void testListContainersAndFetchAttributesWithPublicAccess() throws StorageException, URISyntaxException { CloudBlobClient bClient = BlobTestHelper.createCloudBlobClient(); String name = UUID.randomUUID().toString(); CloudBlobContainer container = bClient.getContainerReference(name); container.create(); BlobContainerPublicAccessType[] accessTypes = {BlobContainerPublicAccessType.BLOB, BlobContainerPublicAccessType.CONTAINER, BlobContainerPublicAccessType.OFF}; BlobContainerPermissions permissions = new BlobContainerPermissions(); for (BlobContainerPublicAccessType accessType : accessTypes) { permissions.setPublicAccess(accessType); container.uploadPermissions(permissions); assertEquals(accessType, container.properties.getPublicAccess()); CloudBlobContainer container2 = bClient.getContainerReference(name); assertNull(container2.properties.getPublicAccess()); container2.downloadAttributes(); assertEquals(accessType, container2.properties.getPublicAccess()); CloudBlobContainer container3 = bClient.getContainerReference(name); assertNull(container3.properties.getPublicAccess()); assertEquals(accessType, container3.downloadPermissions().getPublicAccess()); Iterator<CloudBlobContainer> results = bClient.listContainers(name, ContainerListingDetails.NONE, null, null).iterator(); assertTrue(results.hasNext()); assertEquals(accessType, results.next().properties.getPublicAccess()); assertFalse(results.hasNext()); } container.delete(); } @Test @Category({ CloudTests.class }) public void testGetServiceStats() throws StorageException { CloudBlobClient bClient = BlobTestHelper.createCloudBlobClient(); bClient.getDefaultRequestOptions().setLocationMode(LocationMode.SECONDARY_ONLY); BlobTestHelper.verifyServiceStats(bClient.getServiceStats()); } @Test @Category({ DevFabricTests.class, DevStoreTests.class, CloudTests.class }) public void testSingleBlobPutThresholdInBytes() throws URISyntaxException, StorageException, IOException { CloudBlobClient bClient = BlobTestHelper.createCloudBlobClient(); try { bClient.getDefaultRequestOptions().setSingleBlobPutThresholdInBytes( BlobConstants.MAX_SINGLE_UPLOAD_BLOB_SIZE_IN_BYTES + 1); fail("Cannot set upload blob threshold above 256 MB"); } catch (IllegalArgumentException e) { assertEquals( "The argument is out of range. Argument name: singleBlobPutThresholdInBytes, Value passed: 268435457.", e.getMessage()); } try { bClient.getDefaultRequestOptions().setSingleBlobPutThresholdInBytes(Constants.MB - 1); fail("Cannot set upload blob threshold below 1 MB"); } catch (IllegalArgumentException e) { assertEquals( "The argument is out of range. Argument name: singleBlobPutThresholdInBytes, Value passed: 1048575.", e.getMessage()); } int maxSize = 2 * Constants.MB; bClient.getDefaultRequestOptions().setSingleBlobPutThresholdInBytes(maxSize); final ArrayList<Boolean> callList = new ArrayList<Boolean>(); OperationContext sendingRequestEventContext = new OperationContext(); sendingRequestEventContext.getSendingRequestEventHandler().addListener(new StorageEvent<SendingRequestEvent>() { @Override public void eventOccurred(SendingRequestEvent eventArg) { assertEquals(eventArg.getRequestResult(), eventArg.getOpContext().getLastResult()); callList.add(true); } }); assertEquals(0, callList.size()); CloudBlobContainer container = null; try { container = bClient.getContainerReference(BlobTestHelper.generateRandomContainerName()); container.createIfNotExists(); CloudBlockBlob blob = container.getBlockBlobReference(BlobTestHelper .generateRandomBlobNameWithPrefix("uploadThreshold")); // this should make a single call as it is less than the max blob.upload(BlobTestHelper.getRandomDataStream(maxSize - 1), maxSize - 1, null, null, sendingRequestEventContext); assertEquals(1, callList.size()); // this should make one call as it is equal to the max blob.upload(BlobTestHelper.getRandomDataStream(maxSize), maxSize, null, null, sendingRequestEventContext); assertEquals(2, callList.size()); // this should make two calls as it is greater than the max blob.upload(BlobTestHelper.getRandomDataStream(maxSize + 1), maxSize + 1, null, null, sendingRequestEventContext); assertEquals(4, callList.size()); } finally { container.deleteIfExists(); } } }