/** * 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; 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.blob.CloudBlobClient; import com.microsoft.azure.storage.blob.CloudBlobContainer; import com.microsoft.azure.storage.blob.CloudBlobDirectory; import com.microsoft.azure.storage.blob.CloudBlockBlob; import com.microsoft.azure.storage.blob.CloudPageBlob; import com.microsoft.azure.storage.core.SR; import com.microsoft.azure.storage.queue.CloudQueue; import com.microsoft.azure.storage.queue.CloudQueueClient; import com.microsoft.azure.storage.table.CloudTable; import com.microsoft.azure.storage.table.CloudTableClient; import org.junit.Test; import org.junit.experimental.categories.Category; import java.net.URI; import java.net.URISyntaxException; import java.security.InvalidKeyException; import static org.junit.Assert.*; @Category({ DevFabricTests.class, DevStoreTests.class, CloudTests.class }) public class StorageUriTests { private static final String ACCOUNT_NAME = "account"; private static final String SECONDARY_SUFFIX = "-secondary"; private static final String ENDPOINT_SUFFIX = ".core.windows.net"; private static final String BLOB_SERVICE = ".blob"; private static final String QUEUE_SERVICE = ".queue"; private static final String TABLE_SERVICE = ".table"; @Test public void testStorageUriWithTwoUris() throws URISyntaxException { URI primaryClientUri = new URI("http://" + ACCOUNT_NAME + BLOB_SERVICE + ENDPOINT_SUFFIX); URI primaryContainerUri = new URI(primaryClientUri + "/container"); URI secondaryClientUri = new URI("http://" + ACCOUNT_NAME + SECONDARY_SUFFIX + BLOB_SERVICE + ENDPOINT_SUFFIX); URI dummyClientUri = new URI("http://" + ACCOUNT_NAME + "-dummy" + BLOB_SERVICE + ENDPOINT_SUFFIX); // no uri try { new StorageUri(null, null); fail(SR.STORAGE_URI_NOT_NULL); } catch (IllegalArgumentException ex) { assertEquals(SR.STORAGE_URI_NOT_NULL, ex.getMessage()); } // primary uri only StorageUri singleUri = new StorageUri(primaryClientUri); assertEquals(primaryClientUri, singleUri.getPrimaryUri()); assertNull(singleUri.getSecondaryUri()); StorageUri singleUri2 = new StorageUri(primaryClientUri); assertEquals(singleUri, singleUri2); StorageUri singleUri3 = new StorageUri(secondaryClientUri); assertFalse(singleUri.equals(singleUri3)); // secondary uri only StorageUri singleSecondaryUri = new StorageUri(null, secondaryClientUri); assertEquals(secondaryClientUri, singleSecondaryUri.getSecondaryUri()); assertNull(singleSecondaryUri.getPrimaryUri()); StorageUri singleSecondarUri2 = new StorageUri(null, secondaryClientUri); assertEquals(singleSecondaryUri, singleSecondarUri2); StorageUri singleSecondarUri3 = new StorageUri(null, primaryClientUri); assertFalse(singleSecondaryUri.equals(singleSecondarUri3)); // primary and secondary uri StorageUri multiUri = new StorageUri(primaryClientUri, secondaryClientUri); assertEquals(primaryClientUri, multiUri.getPrimaryUri()); assertEquals(secondaryClientUri, multiUri.getSecondaryUri()); assertFalse(multiUri.equals(singleUri)); StorageUri multiUri2 = new StorageUri(primaryClientUri, secondaryClientUri); assertEquals(multiUri, multiUri2); try { new StorageUri(primaryClientUri, primaryContainerUri); fail(SR.STORAGE_URI_MUST_MATCH); } catch (IllegalArgumentException ex) { assertEquals(SR.STORAGE_URI_MUST_MATCH, ex.getMessage()); } StorageUri multiUri3 = new StorageUri(primaryClientUri, dummyClientUri); assertFalse(multiUri.equals(multiUri3)); StorageUri multiUri4 = new StorageUri(dummyClientUri, secondaryClientUri); assertFalse(multiUri.equals(multiUri4)); StorageUri multiUri5 = new StorageUri(secondaryClientUri, primaryClientUri); assertFalse(multiUri.equals(multiUri5)); } @Test public void testDevelopmentStorageWithTwoUris() throws URISyntaxException { CloudStorageAccount account = CloudStorageAccount.getDevelopmentStorageAccount(); URI primaryClientURI = account.getBlobStorageUri().getPrimaryUri(); URI primaryContainerURI = new URI(primaryClientURI.toString() + "/container"); URI secondaryClientURI = account.getBlobStorageUri().getSecondaryUri(); StorageUri singleURI = new StorageUri(primaryClientURI); assertTrue(primaryClientURI.equals(singleURI.getPrimaryUri())); assertNull(singleURI.getSecondaryUri()); StorageUri singleURI2 = new StorageUri(primaryClientURI); assertTrue(singleURI.equals(singleURI2)); StorageUri singleURI3 = new StorageUri(secondaryClientURI); assertFalse(singleURI.equals(singleURI3)); StorageUri multiURI = new StorageUri(primaryClientURI, secondaryClientURI); assertTrue(primaryClientURI.equals(multiURI.getPrimaryUri())); assertTrue(secondaryClientURI.equals(multiURI.getSecondaryUri())); assertFalse(multiURI.equals(singleURI)); StorageUri multiURI2 = new StorageUri(primaryClientURI, secondaryClientURI); assertTrue(multiURI.equals(multiURI2)); try { new StorageUri(primaryClientURI, primaryContainerURI); fail("StorageUri constructor should fail if both URIs do not point to the same resource"); } catch (IllegalArgumentException e) { assertEquals(SR.STORAGE_URI_MUST_MATCH, e.getMessage()); } StorageUri multiURI3 = new StorageUri(secondaryClientURI, primaryClientURI); assertFalse(multiURI.equals(multiURI3)); } @Test public void testCloudStorageAccountWithStorageUri() throws URISyntaxException, InvalidKeyException { StorageUri blobEndpoint = new StorageUri(new URI("http://" + ACCOUNT_NAME + BLOB_SERVICE + ENDPOINT_SUFFIX), new URI("http://" + ACCOUNT_NAME + SECONDARY_SUFFIX + BLOB_SERVICE + ENDPOINT_SUFFIX)); StorageUri queueEndpoint = new StorageUri(new URI("http://" + ACCOUNT_NAME + QUEUE_SERVICE + ENDPOINT_SUFFIX), new URI("http://" + ACCOUNT_NAME + SECONDARY_SUFFIX + QUEUE_SERVICE + ENDPOINT_SUFFIX)); StorageUri tableEndpoint = new StorageUri(new URI("http://" + ACCOUNT_NAME + TABLE_SERVICE + ENDPOINT_SUFFIX), new URI("http://" + ACCOUNT_NAME + SECONDARY_SUFFIX + TABLE_SERVICE + ENDPOINT_SUFFIX)); CloudStorageAccount account = CloudStorageAccount.parse(String.format( "DefaultEndpointsProtocol=http;AccountName=%s;AccountKey=dummyKey", ACCOUNT_NAME)); assertEquals(blobEndpoint, account.getBlobStorageUri()); assertEquals(queueEndpoint, account.getQueueStorageUri()); assertEquals(tableEndpoint, account.getTableStorageUri()); assertEquals(blobEndpoint, account.createCloudBlobClient().getStorageUri()); assertEquals(queueEndpoint, account.createCloudQueueClient().getStorageUri()); assertEquals(tableEndpoint, account.createCloudTableClient().getStorageUri()); assertEquals(blobEndpoint.getPrimaryUri(), account.getBlobEndpoint()); assertEquals(queueEndpoint.getPrimaryUri(), account.getQueueEndpoint()); assertEquals(tableEndpoint.getPrimaryUri(), account.getTableEndpoint()); } @Test public void testBlobTypesWithStorageUri() throws StorageException, URISyntaxException { CloudBlobClient blobClient = TestHelper.createCloudBlobClient(); StorageUri endpoint = new StorageUri(new URI("http://" + ACCOUNT_NAME + BLOB_SERVICE + ENDPOINT_SUFFIX), new URI("http://" + ACCOUNT_NAME + SECONDARY_SUFFIX + BLOB_SERVICE + ENDPOINT_SUFFIX)); CloudBlobClient client = new CloudBlobClient(endpoint, blobClient.getCredentials()); assertEquals(endpoint, client.getStorageUri()); assertEquals(endpoint.getPrimaryUri(), client.getEndpoint()); StorageUri containerUri = new StorageUri(new URI(endpoint.getPrimaryUri() + "/container"), new URI( endpoint.getSecondaryUri() + "/container")); CloudBlobContainer container = client.getContainerReference("container"); assertEquals(containerUri, container.getStorageUri()); assertEquals(containerUri.getPrimaryUri(), container.getUri()); assertEquals(endpoint, container.getServiceClient().getStorageUri()); container = new CloudBlobContainer(containerUri, client.getCredentials()); assertEquals(containerUri, container.getStorageUri()); assertEquals(containerUri.getPrimaryUri(), container.getUri()); assertEquals(endpoint, container.getServiceClient().getStorageUri()); StorageUri directoryUri = new StorageUri(new URI(containerUri.getPrimaryUri() + "/directory/"), new URI( containerUri.getSecondaryUri() + "/directory/")); StorageUri subdirectoryUri = new StorageUri(new URI(directoryUri.getPrimaryUri() + "subdirectory/"), new URI( directoryUri.getSecondaryUri() + "subdirectory/")); CloudBlobDirectory directory = container.getDirectoryReference("directory"); assertEquals(directoryUri, directory.getStorageUri()); assertEquals(directoryUri.getPrimaryUri(), directory.getUri()); assertEquals("", directory.getParent().getPrefix()); assertEquals(containerUri, directory.getContainer().getStorageUri()); assertEquals(endpoint, directory.getServiceClient().getStorageUri()); CloudBlobDirectory subdirectory = directory.getDirectoryReference("subdirectory"); assertEquals(subdirectoryUri, subdirectory.getStorageUri()); assertEquals(subdirectoryUri.getPrimaryUri(), subdirectory.getUri()); assertEquals(directoryUri, subdirectory.getParent().getStorageUri()); assertEquals(containerUri, subdirectory.getContainer().getStorageUri()); assertEquals(endpoint, subdirectory.getServiceClient().getStorageUri()); StorageUri blobUri = new StorageUri(new URI(subdirectoryUri.getPrimaryUri() + "blob"), new URI( subdirectoryUri.getSecondaryUri() + "blob")); CloudBlockBlob blockBlob = subdirectory.getBlockBlobReference("blob"); assertEquals(blobUri, blockBlob.getStorageUri()); assertEquals(blobUri.getPrimaryUri(), blockBlob.getUri()); assertEquals(subdirectoryUri, blockBlob.getParent().getStorageUri()); assertEquals(containerUri, blockBlob.getContainer().getStorageUri()); assertEquals(endpoint, blockBlob.getServiceClient().getStorageUri()); blockBlob = new CloudBlockBlob(blobUri, client.getCredentials()); assertEquals(blobUri, blockBlob.getStorageUri()); assertEquals(blobUri.getPrimaryUri(), blockBlob.getUri()); assertEquals(subdirectoryUri, blockBlob.getParent().getStorageUri()); assertEquals(containerUri, blockBlob.getContainer().getStorageUri()); assertEquals(endpoint, blockBlob.getServiceClient().getStorageUri()); CloudPageBlob pageBlob = subdirectory.getPageBlobReference("blob"); assertEquals(blobUri, pageBlob.getStorageUri()); assertEquals(blobUri.getPrimaryUri(), pageBlob.getUri()); assertEquals(subdirectoryUri, pageBlob.getParent().getStorageUri()); assertEquals(containerUri, pageBlob.getContainer().getStorageUri()); assertEquals(endpoint, pageBlob.getServiceClient().getStorageUri()); pageBlob = new CloudPageBlob(blobUri, client.getCredentials()); assertEquals(blobUri, pageBlob.getStorageUri()); assertEquals(blobUri.getPrimaryUri(), pageBlob.getUri()); assertEquals(subdirectoryUri, pageBlob.getParent().getStorageUri()); assertEquals(containerUri, pageBlob.getContainer().getStorageUri()); assertEquals(endpoint, pageBlob.getServiceClient().getStorageUri()); } @Test public void testQueueTypesWithStorageUri() throws URISyntaxException, StorageException { CloudQueueClient queueClient = TestHelper.createCloudQueueClient(); StorageUri endpoint = new StorageUri(new URI("http://" + ACCOUNT_NAME + QUEUE_SERVICE + ENDPOINT_SUFFIX), new URI("http://" + ACCOUNT_NAME + SECONDARY_SUFFIX + QUEUE_SERVICE + ENDPOINT_SUFFIX)); CloudQueueClient client = new CloudQueueClient(endpoint, queueClient.getCredentials()); assertEquals(endpoint, client.getStorageUri()); assertEquals(endpoint.getPrimaryUri(), client.getEndpoint()); StorageUri queueUri = new StorageUri(new URI(endpoint.getPrimaryUri() + "/queue"), new URI( endpoint.getSecondaryUri() + "/queue")); CloudQueue queue = client.getQueueReference("queue"); assertEquals(queueUri, queue.getStorageUri()); assertEquals(queueUri.getPrimaryUri(), queue.getUri()); assertEquals(endpoint, queue.getServiceClient().getStorageUri()); queue = new CloudQueue(queueUri, client.getCredentials()); assertEquals(queueUri, queue.getStorageUri()); assertEquals(queueUri.getPrimaryUri(), queue.getUri()); assertEquals(endpoint, queue.getServiceClient().getStorageUri()); } @Test public void testTableTypesWithStorageUri() throws URISyntaxException, StorageException { CloudTableClient tableClient = TestHelper.createCloudTableClient(); StorageUri endpoint = new StorageUri(new URI("http://" + ACCOUNT_NAME + TABLE_SERVICE + ENDPOINT_SUFFIX), new URI("http://" + ACCOUNT_NAME + SECONDARY_SUFFIX + TABLE_SERVICE + ENDPOINT_SUFFIX)); CloudTableClient client = new CloudTableClient(endpoint, tableClient.getCredentials()); assertEquals(endpoint, client.getStorageUri()); assertEquals(endpoint.getPrimaryUri(), client.getEndpoint()); StorageUri tableUri = new StorageUri(new URI(endpoint.getPrimaryUri() + "/table"), new URI( endpoint.getSecondaryUri() + "/table")); CloudTable table = client.getTableReference("table"); assertEquals(tableUri, table.getStorageUri()); assertEquals(tableUri.getPrimaryUri(), table.getUri()); assertEquals(endpoint, table.getServiceClient().getStorageUri()); table = new CloudTable(tableUri, client.getCredentials()); assertEquals(tableUri, table.getStorageUri()); assertEquals(tableUri.getPrimaryUri(), table.getUri()); assertEquals(endpoint, table.getServiceClient().getStorageUri()); } }