package com.microsoft.azure.storage.blob;
import com.microsoft.azure.storage.ResultContinuation;
import com.microsoft.azure.storage.ResultSegment;
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.core.PathUtility;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.Iterator;
import static org.junit.Assert.*;
@Category({ DevFabricTests.class, DevStoreTests.class, CloudTests.class })
public class CloudBlobDirectoryTests {
private static final String[] delimiters = { "$", ":", "@", "-", "%", "/", "|", "//", "%%", " " };
@Test
public void testGetDirectoryAbsoluteUriAppended() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testGetDirectoryAbsoluteUriAppended(delimiters[i], createContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testGetDirectoryAbsoluteUriAppended(String delimiter, CloudBlobContainer container)
throws URISyntaxException {
CloudBlobDirectory dir = container.getDirectoryReference(container.getUri().toString());
assertEquals(PathUtility.appendPathToSingleUri(container.getUri(), container.getUri().toString() + delimiter),
dir.getUri());
dir = container.getDirectoryReference(container.getUri().toString() + "/" + "TopDir1" + delimiter);
assertEquals(
PathUtility.appendPathToSingleUri(container.getUri(), container.getUri().toString() + "/" + "TopDir1"
+ delimiter), dir.getUri());
}
@Test
public void testFlatListingWithContainer() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testFlatListingWithContainer(delimiters[i], createAndPopulateContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testFlatListingWithContainer(String delimiter, CloudBlobContainer container)
throws URISyntaxException, StorageException {
// check output of list blobs with TopDir1 and hierarchical
Iterable<ListBlobItem> list1 = container.listBlobs("TopDir1" + delimiter, false,
EnumSet.noneOf(BlobListingDetails.class), null, null);
Iterator<ListBlobItem> iter = list1.iterator();
ArrayList<ListBlobItem> simpleList1 = new ArrayList<ListBlobItem>();
while (iter.hasNext()) {
simpleList1.add(iter.next());
}
assertEquals(3, simpleList1.size());
ListBlobItem get11 = simpleList1.get(0);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "Blob1", null, null), get11.getUri());
ListBlobItem get12 = simpleList1.get(1);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter, null, null), get12.getUri());
ListBlobItem get13 = simpleList1.get(2);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir2" + delimiter, null, null), get13.getUri());
// check output of list blobs with TopDir1 + delimiter + MidDir1
Iterable<ListBlobItem> list2 = container.listBlobs("TopDir1" + delimiter + "MidDir1", true,
EnumSet.noneOf(BlobListingDetails.class), null, null);
iter = list2.iterator();
ArrayList<ListBlobItem> simpleList2 = new ArrayList<ListBlobItem>();
while (iter.hasNext()) {
simpleList2.add(iter.next());
}
assertEquals(2, simpleList2.size());
ListBlobItem get21 = simpleList2.get(0);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter + "EndDir1" + delimiter + "EndBlob1", null,
null), get21.getUri());
ListBlobItem get22 = simpleList2.get(1);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter + "EndDir2" + delimiter + "EndBlob2", null,
null), get22.getUri());
// check output of list blobs with TopDir1 + delimiter + MidDir1 + delimiter
Iterable<ListBlobItem> list3 = container.listBlobs("TopDir1" + delimiter + "MidDir1" + delimiter, false,
EnumSet.noneOf(BlobListingDetails.class), null, null);
iter = list3.iterator();
ArrayList<ListBlobItem> simpleList3 = new ArrayList<ListBlobItem>();
while (iter.hasNext()) {
simpleList3.add(iter.next());
}
assertEquals(2, simpleList3.size());
ListBlobItem get31 = simpleList3.get(0);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter + "EndDir1" + delimiter, null, null),
get31.getUri());
ListBlobItem get32 = simpleList3.get(1);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter + "EndDir2" + delimiter, null, null),
get32.getUri());
// check output of list blobs by listing using midDir
CloudBlobDirectory midDir2 = (CloudBlobDirectory) get13;
Iterable<ListBlobItem> list4 = midDir2.listBlobs(null, true, EnumSet.noneOf(BlobListingDetails.class), null,
null);
iter = list4.iterator();
ArrayList<ListBlobItem> simpleList4 = new ArrayList<ListBlobItem>();
while (iter.hasNext()) {
simpleList4.add(iter.next());
}
assertEquals(2, simpleList4.size());
ListBlobItem get41 = simpleList4.get(0);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir2" + delimiter + "EndDir1" + delimiter + "EndBlob1", null,
null), get41.getUri());
ListBlobItem get42 = simpleList4.get(1);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir2" + delimiter + "EndDir2" + delimiter + "EndBlob2", null,
null), get42.getUri());
}
@Test
public void testListingWithDirectory() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testListingWithDirectory(delimiters[i], createAndPopulateContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testListingWithDirectory(String delimiter, CloudBlobContainer container) throws URISyntaxException,
StorageException {
// check output of list blobs with TopDir1 with prefix
CloudBlobDirectory directory = container.getDirectoryReference("TopDir1" + delimiter + "MidDir1" + delimiter);
Iterable<ListBlobItem> results = directory.listBlobs();
ArrayList<ListBlobItem> list1 = new ArrayList<ListBlobItem>();
Iterator<ListBlobItem> iter = results.iterator();
while (iter.hasNext()) {
list1.add(iter.next());
}
assertEquals(2, list1.size());
ListBlobItem get21 = list1.get(0);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter + "EndDir1" + delimiter, null, null),
get21.getUri());
ListBlobItem get22 = list1.get(1);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter + "EndDir2" + delimiter, null, null),
get22.getUri());
}
@Test
public void testListingWithDirectorySegmented() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testListingWithDirectorySegmented(delimiters[i], createAndPopulateContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testListingWithDirectorySegmented(String delimiter, CloudBlobContainer container)
throws URISyntaxException, StorageException {
ResultContinuation token = null;
CloudBlobDirectory directory = container.getDirectoryReference("TopDir1");
ArrayList<ListBlobItem> list1 = new ArrayList<ListBlobItem>();
do {
ResultSegment<ListBlobItem> result1 = directory.listBlobsSegmented("Mid");
token = result1.getContinuationToken();
list1.addAll(result1.getResults());
} while (token != null);
assertEquals(2, list1.size());
ListBlobItem get21 = list1.get(0);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter, null, null), get21.getUri());
ListBlobItem get22 = list1.get(1);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir2" + delimiter, null, null), get22.getUri());
}
@Test
public void testPrefixListingWithDirectory() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testPrefixListingWithDirectory(delimiters[i], createAndPopulateContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testPrefixListingWithDirectory(String delimiter, CloudBlobContainer container)
throws URISyntaxException, StorageException {
// check output of list blobs with TopDir1 with prefix
CloudBlobDirectory directory = container.getDirectoryReference("TopDir1");
Iterable<ListBlobItem> results = directory.listBlobs("Mid");
ArrayList<ListBlobItem> list1 = new ArrayList<ListBlobItem>();
Iterator<ListBlobItem> iter = results.iterator();
while (iter.hasNext()) {
list1.add(iter.next());
}
assertEquals(2, list1.size());
ListBlobItem get12 = list1.get(0);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter, null, null), get12.getUri());
ListBlobItem get13 = list1.get(1);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir2" + delimiter, null, null), get13.getUri());
}
@Test
public void testPrefixListingWithDirectorySegmented() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testPrefixListingWithDirectorySegmented(delimiters[i], createAndPopulateContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testPrefixListingWithDirectorySegmented(String delimiter, CloudBlobContainer container)
throws URISyntaxException, StorageException {
ResultContinuation token = null;
CloudBlobDirectory directory = container.getDirectoryReference("TopDir1");
ArrayList<ListBlobItem> list1 = new ArrayList<ListBlobItem>();
do {
ResultSegment<ListBlobItem> result1 = directory.listBlobsSegmented("Mid");
token = result1.getContinuationToken();
list1.addAll(result1.getResults());
} while (token != null);
assertEquals(2, list1.size());
ListBlobItem get12 = list1.get(0);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter, null, null), get12.getUri());
ListBlobItem get13 = list1.get(1);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir2" + delimiter, null, null), get13.getUri());
}
@Test
public void testFlatListingWithDirectory() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testFlatListingWithDirectory(delimiters[i], createAndPopulateContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testFlatListingWithDirectory(String delimiter, CloudBlobContainer container)
throws URISyntaxException, StorageException {
// check output of list blobs with TopDir1 and flat listing
CloudBlobDirectory directory = container.getDirectoryReference("TopDir1");
Iterable<ListBlobItem> results = directory.listBlobs(null, false, EnumSet.noneOf(BlobListingDetails.class),
null, null);
ArrayList<ListBlobItem> list1 = new ArrayList<ListBlobItem>();
Iterator<ListBlobItem> iter = results.iterator();
while (iter.hasNext()) {
list1.add(iter.next());
}
assertEquals(3, list1.size());
ListBlobItem get11 = list1.get(0);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "Blob1", null, null), get11.getUri());
ListBlobItem get12 = list1.get(1);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter, null, null), get12.getUri());
ListBlobItem get13 = list1.get(2);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir2" + delimiter, null, null), get13.getUri());
CloudBlobDirectory midDir2 = (CloudBlobDirectory) get13;
// check output of list blobs with TopDir1 + delimiter + MidDir1 and hierarchical listing
results = midDir2.listBlobs(null, true, EnumSet.noneOf(BlobListingDetails.class), null, null);
ArrayList<ListBlobItem> list2 = new ArrayList<ListBlobItem>();
iter = results.iterator();
while (iter.hasNext()) {
list2.add(iter.next());
}
assertEquals(2, list2.size());
ListBlobItem get21 = list2.get(0);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir2" + delimiter + "EndDir1" + delimiter + "EndBlob1", null,
null), get21.getUri());
ListBlobItem get22 = list2.get(1);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir2" + delimiter + "EndDir2" + delimiter + "EndBlob2", null,
null), get22.getUri());
}
@Test
public void testFlatListingWithDirectorySegmented() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testFlatListingWithDirectorySegmented(delimiters[i], createAndPopulateContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testFlatListingWithDirectorySegmented(String delimiter, CloudBlobContainer container)
throws URISyntaxException, StorageException {
// check output of list blobs with TopDir1 and flat listing
ResultContinuation token = null;
CloudBlobDirectory directory = container.getDirectoryReference("TopDir1");
ArrayList<ListBlobItem> list1 = new ArrayList<ListBlobItem>();
do {
ResultSegment<ListBlobItem> result1 = directory.listBlobsSegmented(null, false,
EnumSet.noneOf(BlobListingDetails.class), null, token, null, null);
token = result1.getContinuationToken();
list1.addAll(result1.getResults());
} while (token != null);
assertEquals(3, list1.size());
ListBlobItem get11 = list1.get(0);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "Blob1", null, null), get11.getUri());
ListBlobItem get12 = list1.get(1);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter, null, null), get12.getUri());
ListBlobItem get13 = list1.get(2);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir2" + delimiter, null, null), get13.getUri());
CloudBlobDirectory midDir2 = (CloudBlobDirectory) get13;
// check output of list blobs with TopDir1 + delimiter + MidDir1
ArrayList<ListBlobItem> list2 = new ArrayList<ListBlobItem>();
do {
ResultSegment<ListBlobItem> result1 = midDir2.listBlobsSegmented(null, true,
EnumSet.noneOf(BlobListingDetails.class), null, token, null, null);
token = result1.getContinuationToken();
list2.addAll(result1.getResults());
} while (token != null);
assertEquals(2, list2.size());
ListBlobItem get21 = list2.get(0);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir2" + delimiter + "EndDir1" + delimiter + "EndBlob1", null,
null), get21.getUri());
ListBlobItem get22 = list2.get(1);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir2" + delimiter + "EndDir2" + delimiter + "EndBlob2", null,
null), get22.getUri());
}
@Test
public void testGetParent() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testGetParent(delimiters[i], createContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testGetParent(String delimiter, CloudBlobContainer container) throws URISyntaxException,
StorageException {
CloudPageBlob blob = container.getPageBlobReference("Dir1" + delimiter + "Blob1");
blob.create(0);
try {
assertTrue(blob.exists());
assertEquals(blob.getName(), "Dir1" + delimiter + "Blob1");
CloudBlobDirectory parent = blob.getParent();
assertEquals("Dir1" + delimiter, parent.getPrefix());
}
finally {
blob.deleteIfExists();
}
}
@Test
public void testGetReferences() throws URISyntaxException, StorageException, IOException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testGetReferences(delimiters[i], createContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testGetReferences(String delimiter, CloudBlobContainer container) throws URISyntaxException,
StorageException, IOException {
CloudBlobDirectory dir1 = container.getDirectoryReference("Dir1");
// get references to blobs, block blobs and directories from the directory and create them
CloudPageBlob pageBlob = dir1.getPageBlobReference("PageBlob");
pageBlob.create(0);
assertTrue(pageBlob.exists());
assertEquals(dir1.getContainer().getName(), pageBlob.getContainer().getName());
assertEquals(dir1.getServiceClient().getEndpoint().toString(), pageBlob.getServiceClient().getEndpoint()
.toString());
assertEquals("Dir1" + delimiter + "PageBlob", pageBlob.getName());
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/Dir1" + delimiter + "PageBlob", null, null), pageBlob.getUri());
CloudBlobDirectory pageParent = pageBlob.getParent();
assertEquals("Dir1" + delimiter, pageParent.getPrefix());
CloudBlockBlob blockBlob = dir1.getBlockBlobReference("BlockBlob");
blockBlob.upload(BlobTestHelper.getRandomDataStream(128), 128);
assertTrue(blockBlob.exists());
assertEquals(dir1.getContainer().getName(), pageBlob.getContainer().getName());
assertEquals(dir1.getServiceClient().getEndpoint().toString(), blockBlob.getServiceClient().getEndpoint()
.toString());
assertEquals("Dir1" + delimiter + "BlockBlob", blockBlob.getName());
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/Dir1" + delimiter + "BlockBlob", null, null), blockBlob.getUri());
CloudBlobDirectory blockParent = blockBlob.getParent();
assertEquals("Dir1" + delimiter, blockParent.getPrefix());
CloudBlobDirectory subDirectory = dir1.getDirectoryReference("SubDirectory");
assertEquals(dir1.getContainer().getName(), subDirectory.getContainer().getName());
assertEquals(dir1.getServiceClient().getEndpoint().toString(), subDirectory.getServiceClient().getEndpoint()
.toString());
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/Dir1" + delimiter + "SubDirectory" + delimiter, null, null), subDirectory.getUri());
CloudBlobDirectory subDirectoryParent = subDirectory.getParent();
assertEquals("Dir1" + delimiter, subDirectoryParent.getPrefix());
// create snapshots for page and block blobs and then get references to them using the directory
CloudPageBlob pageSnapshot = (CloudPageBlob) pageBlob.createSnapshot();
CloudPageBlob pageSnapshotDir1 = dir1.getPageBlobReference("PageBlob", pageSnapshot.getSnapshotID());
assertEquals(pageSnapshot.getName(), pageSnapshotDir1.getName());
assertEquals(dir1.getContainer().getName(), pageSnapshotDir1.getContainer().getName());
assertEquals(dir1.getServiceClient().getEndpoint().toString(), pageSnapshotDir1.getServiceClient()
.getEndpoint().toString());
assertEquals(pageSnapshot.getUri().toString(), pageSnapshotDir1.getUri().toString());
assertEquals(pageSnapshot.getParent().getPrefix(), pageSnapshotDir1.getParent().getPrefix());
CloudBlockBlob blockSnapshot = (CloudBlockBlob) blockBlob.createSnapshot();
CloudBlockBlob blockSnapshotDir1 = dir1.getBlockBlobReference("BlockBlob", blockSnapshot.getSnapshotID());
assertEquals(blockSnapshot.getName(), blockSnapshotDir1.getName());
assertEquals(dir1.getContainer().getName(), blockSnapshotDir1.getContainer().getName());
assertEquals(dir1.getServiceClient().getEndpoint().toString(), blockSnapshotDir1.getServiceClient()
.getEndpoint().toString());
assertEquals(blockSnapshot.getUri().toString(), blockSnapshotDir1.getUri().toString());
assertEquals(blockSnapshot.getParent().getPrefix(), blockSnapshotDir1.getParent().getPrefix());
}
@Test
public void testGetSubdirectoryAndTraverseBackToParent() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testGetSubdirectoryAndTraverseBackToParent(delimiters[i], createContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testGetSubdirectoryAndTraverseBackToParent(String delimiter, CloudBlobContainer container)
throws URISyntaxException, StorageException {
CloudBlobDirectory directory = container.getDirectoryReference("TopDir1" + delimiter);
CloudBlobDirectory subDirectory = directory.getDirectoryReference("MidDir1" + delimiter);
CloudBlobDirectory parent = subDirectory.getParent();
assertEquals(parent.getPrefix(), directory.getPrefix());
assertEquals(parent.getUri(), directory.getUri());
}
@Test
public void testGetParentOnRoot() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testGetParentOnRoot(delimiters[i], createAndPopulateContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testGetParentOnRoot(String delimiter, CloudBlobContainer container) throws URISyntaxException,
StorageException {
// get container as parent
CloudBlobDirectory topDir = container.getDirectoryReference("TopDir1" + delimiter);
CloudBlobDirectory root = topDir.getParent();
assertEquals("", root.getPrefix());
assertEquals(container.getUri().toString(), root.getUri().toString());
// make sure the parent of the container dir is null
CloudBlobDirectory empty = root.getParent();
assertNull(empty);
// from container, get directory reference to container
root = container.getDirectoryReference("");
assertEquals("", root.getPrefix());
assertEquals(container.getUri().toString(), root.getUri().toString());
Iterable<ListBlobItem> results = root.listBlobs();
ArrayList<ListBlobItem> list1 = new ArrayList<ListBlobItem>();
Iterator<ListBlobItem> iter = results.iterator();
while (iter.hasNext()) {
list1.add(iter.next());
}
assertEquals(2, list1.size());
// make sure the parent of the container dir is null
empty = root.getParent();
assertNull(empty);
}
@Test
public void testHierarchicalTraversal() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testHierarchicalTraversal(delimiters[i], createContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testHierarchicalTraversal(String delimiter, CloudBlobContainer container) throws StorageException,
URISyntaxException {
// Traverse hierarchically starting with length 1
CloudBlobDirectory directory1 = container.getDirectoryReference("Dir1" + delimiter);
CloudBlobDirectory subdir1 = directory1.getDirectoryReference("Dir2");
CloudBlobDirectory parent1 = subdir1.getParent();
assertEquals(parent1.getPrefix(), directory1.getPrefix());
CloudBlobDirectory subdir2 = subdir1.getDirectoryReference("Dir3");
CloudBlobDirectory parent2 = subdir2.getParent();
assertEquals(parent2.getPrefix(), subdir1.getPrefix());
CloudBlobDirectory subdir3 = subdir2.getDirectoryReference("Dir4");
CloudBlobDirectory parent3 = subdir3.getParent();
assertEquals(parent3.getPrefix(), subdir2.getPrefix());
CloudBlobDirectory subdir4 = subdir3.getDirectoryReference("Dir5");
CloudBlobDirectory parent4 = subdir4.getParent();
assertEquals(parent4.getPrefix(), subdir3.getPrefix());
}
@Test
public void testParentValidate() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testParentValidate(delimiters[i], createContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testParentValidate(String delimiter, CloudBlobContainer container) throws StorageException,
URISyntaxException {
CloudBlockBlob blob = container.getBlockBlobReference("TopDir1" + delimiter + "MidDir1" + delimiter + "EndDir1"
+ delimiter + "EndBlob1");
CloudBlobDirectory directory = blob.getParent();
assertEquals("TopDir1" + delimiter + "MidDir1" + delimiter + "EndDir1" + delimiter, directory.getPrefix());
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter + "EndDir1" + delimiter, null, null),
directory.getUri());
}
public void testValidateInRootContainer() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
testValidateInRootContainer(delimiters[i]);
}
}
private void testValidateInRootContainer(String delimiter) throws URISyntaxException, StorageException {
CloudBlobClient client = BlobTestHelper.createCloudBlobClient();
client.setDirectoryDelimiter(delimiter);
CloudBlobContainer container = client.getContainerReference("$root");
CloudPageBlob pageBlob = container.getPageBlobReference("Dir1" + delimiter + "Blob1");
if (delimiter.equals("/")) {
try {
pageBlob.create(0);
pageBlob.deleteIfExists();
fail("Try to create a CloudBlobDirectory/blob which has a slash in its name in the root container");
}
catch (StorageException e) {
assertEquals("InvalidUri", e.getErrorCode());
assertTrue(e.getExtendedErrorInformation().getErrorMessage()
.startsWith("The requested URI does not represent any resource on the server."));
}
}
else {
CloudPageBlob blob = container.getPageBlobReference("TopDir1" + delimiter + "MidDir1" + delimiter
+ "EndDir1" + delimiter + "EndBlob1");
CloudBlobDirectory directory = blob.getParent();
assertEquals("TopDir1" + delimiter + "MidDir1" + delimiter + "EndDir1" + delimiter, directory.getPrefix());
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter + "EndDir1" + delimiter, null, null),
directory.getUri());
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter + "EndDir1" + delimiter + "EndBlob1",
null, null), blob.getUri());
CloudBlobDirectory directory1 = container.getDirectoryReference("TopDir1" + delimiter);
CloudBlobDirectory root = directory1.getParent();
assertEquals("", root.getPrefix());
assertEquals(container.getUri(), root.getUri());
CloudBlobDirectory subdir1 = directory1.getDirectoryReference("MidDir" + delimiter);
CloudBlobDirectory parent1 = subdir1.getParent();
assertEquals(directory1.getPrefix(), parent1.getPrefix());
assertEquals(directory1.getUri(), parent1.getUri());
CloudBlobDirectory subdir2 = subdir1.getDirectoryReference("EndDir" + delimiter);
CloudBlobDirectory parent2 = subdir2.getParent();
assertEquals(subdir1.getPrefix(), parent2.getPrefix());
assertEquals(subdir1.getUri(), parent2.getUri());
}
}
@Test
public void testDelimitersInARow() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testDelimitersInARow(delimiters[i], createContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testDelimitersInARow(String delimiter, CloudBlobContainer container) throws URISyntaxException,
StorageException {
CloudPageBlob blob = container.getPageBlobReference(delimiter + delimiter + delimiter + "Blob1");
// Traverse from leaf to root
CloudBlobDirectory directory1 = blob.getParent();
assertEquals(delimiter + delimiter + delimiter, directory1.getPrefix());
CloudBlobDirectory directory2 = directory1.getParent();
assertEquals(delimiter + delimiter, directory2.getPrefix());
CloudBlobDirectory directory3 = directory2.getParent();
assertEquals(delimiter, directory3.getPrefix());
// Traverse from root to leaf
CloudBlobDirectory directory4 = container.getDirectoryReference(delimiter);
CloudBlobDirectory directory5 = directory4.getDirectoryReference(delimiter);
assertEquals(delimiter + delimiter, directory5.getPrefix());
CloudBlobDirectory directory6 = directory5.getDirectoryReference(delimiter);
assertEquals(delimiter + delimiter + delimiter, directory6.getPrefix());
CloudPageBlob blob2 = directory6.getPageBlobReference("Blob1");
assertEquals(delimiter + delimiter + delimiter + "Blob1", blob2.getName());
assertEquals(blob.getUri(), blob2.getUri());
}
@Test
public void testMultipleDelimiters() throws URISyntaxException, StorageException {
for (int i = 0; i < delimiters.length; i++) {
CloudBlobContainer container = null;
try {
container = createContainer(delimiters[i]);
testMultipleDelimiters(delimiters[i], createContainer(delimiters[i]));
}
finally {
container.deleteIfExists();
}
}
}
private void testMultipleDelimiters(String delimiter, CloudBlobContainer container) throws StorageException,
URISyntaxException {
populateContainer(container, delimiter);
populateContainer(container, "*");
populateContainer(container, "#");
Iterable<ListBlobItem> list1 = container.listBlobs("TopDir1" + delimiter, false,
EnumSet.noneOf(BlobListingDetails.class), null, null);
Iterator<ListBlobItem> iter = list1.iterator();
ArrayList<ListBlobItem> simpleList1 = new ArrayList<ListBlobItem>();
while (iter.hasNext()) {
simpleList1.add(iter.next());
}
assertEquals(3, simpleList1.size());
ListBlobItem get11 = simpleList1.get(0);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "Blob1", null, null), get11.getUri());
ListBlobItem get12 = simpleList1.get(1);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir1" + delimiter, null, null), get12.getUri());
ListBlobItem get13 = simpleList1.get(2);
assertEquals(new URI(container.getUri().getScheme(), container.getUri().getAuthority(), container.getUri()
.getPath() + "/TopDir1" + delimiter + "MidDir2" + delimiter, null, null), get13.getUri());
CloudBlobDirectory directory = container.getDirectoryReference("TopDir1" + delimiter);
CloudBlobDirectory subDirectory = directory.getDirectoryReference("MidDir1" + delimiter);
CloudBlobDirectory parent = subDirectory.getParent();
assertEquals(parent.getPrefix(), directory.getPrefix());
assertEquals(parent.getUri(), directory.getUri());
}
private static CloudBlobContainer createAndPopulateContainer(String delimiter) throws URISyntaxException,
StorageException {
CloudBlobContainer container = createContainer(delimiter);
populateContainer(container, delimiter);
return container;
}
private static void populateContainer(CloudBlobContainer container, String delimiter) throws URISyntaxException,
StorageException {
for (int i = 1; i < 3; i++) {
for (int j = 1; j < 3; j++) {
for (int k = 1; k < 3; k++) {
String directory = "TopDir" + i + delimiter + "MidDir" + j + delimiter + "EndDir" + k + delimiter
+ "EndBlob" + k;
CloudPageBlob blob1 = container.getPageBlobReference(directory);
blob1.create(0);
}
}
CloudPageBlob blob2 = container.getPageBlobReference("TopDir" + i + delimiter + "Blob" + i);
blob2.create(0);
}
}
private static CloudBlobContainer createContainer(String delimiter) throws URISyntaxException, StorageException {
CloudBlobClient client = BlobTestHelper.createCloudBlobClient();
client.setDirectoryDelimiter(delimiter);
String name = BlobTestHelper.generateRandomContainerName();
CloudBlobContainer container = client.getContainerReference(name);
container.create();
return container;
}
}