| // 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. |
| |
| using System; |
| using System.IO; |
| using System.Linq; |
| using Microsoft.WindowsAzure.Storage; |
| using Microsoft.WindowsAzure.Storage.Blob; |
| using NSubstitute; |
| using Org.Apache.REEF.IO.FileSystem; |
| using Org.Apache.REEF.IO.FileSystem.AzureBlob; |
| using Org.Apache.REEF.Tang.Implementations.Tang; |
| using Xunit; |
| |
| namespace Org.Apache.REEF.IO.Tests |
| { |
| /// <summary> |
| /// Test class for unit testing the AzureBlockBlobFileSystem. |
| /// Some methods are currently not unit tested due to the complexity of "faking out" |
| /// the methods. They are instead tested E2E in TestAzureBlockBlobFileSystemE2E |
| /// </summary> |
| public sealed class TestAzureBlockBlobFileSystem |
| { |
| private static readonly Uri FakeUri = new Uri("http://storageacct.blob.core.windows.net/container/file"); |
| private TestContext testContext; |
| |
| private static Uri BaseUri |
| { |
| get { return new Uri(FakeUri.GetLeftPart(UriPartial.Authority)); } |
| } |
| |
| public TestAzureBlockBlobFileSystem() |
| { |
| this.testContext = new TestContext(); |
| } |
| |
| [Fact] |
| public void TestCreate() |
| { |
| Stream stream = testContext.GetAzureFileSystem().Create(FakeUri); |
| testContext.TestCloudBlockBlob.Received(1).Create(); |
| Assert.Equal(testContext.TestCreateStream, stream); |
| } |
| |
| [Fact] |
| public void TestOpen() |
| { |
| Stream stream = testContext.GetAzureFileSystem().Open(FakeUri); |
| testContext.TestCloudBlockBlob.Received(1).Open(); |
| Assert.Equal(testContext.TestOpenStream, stream); |
| } |
| |
| [Fact] |
| public void TestDelete() |
| { |
| testContext.GetAzureFileSystem().Delete(FakeUri); |
| testContext.TestCloudBlockBlob.Received(1).Delete(); |
| } |
| |
| [Fact] |
| public void TestExists() |
| { |
| testContext.GetAzureFileSystem().Exists(FakeUri); |
| testContext.TestCloudBlockBlob.Received(1).Exists(); |
| } |
| |
| [Fact] |
| public void TestCopyToLocal() |
| { |
| testContext.GetAzureFileSystem().CopyToLocal(FakeUri, "local"); |
| testContext.TestCloudBlockBlob.Received(1).DownloadToFile("local", FileMode.CreateNew); |
| } |
| |
| [Fact] |
| public void TestCopyFromLocal() |
| { |
| testContext.GetAzureFileSystem().CopyFromLocal("local", FakeUri); |
| testContext.TestCloudBlockBlob.Received(1).UploadFromFile("local", FileMode.Open); |
| } |
| |
| [Fact] |
| public void TestCreateDirectory() |
| { |
| var testContext = new TestContext(); |
| testContext.GetAzureFileSystem().CreateDirectory(FakeUri); |
| testContext.TestCloudBlobClient.DidNotReceiveWithAnyArgs(); |
| } |
| |
| [Fact] |
| public void TestDeleteDirectoryFails() |
| { |
| Assert.Throws<StorageException>(() => new TestContext().GetAzureFileSystem().DeleteDirectory(new Uri(FakeUri.GetLeftPart(UriPartial.Authority)))); |
| } |
| |
| [Fact] |
| public void TestDeleteDirectoryAtContainer() |
| { |
| var testContext = new TestContext(); |
| testContext.GetAzureFileSystem().DeleteDirectory(new Uri("http://test.com/test")); |
| testContext.TestCloudBlobClient.Received(1).GetContainerReference("test"); |
| testContext.TestCloudBlobContainer.Received(1).DeleteIfExists(); |
| } |
| |
| [Fact] |
| public void TestDeleteDirectoryRecursive() |
| { |
| testContext.TestCloudBlobDirectory.ListBlobs(true).ReturnsForAnyArgs(Enumerable.Repeat(testContext.TestCloudBlob, 5)); |
| testContext.GetAzureFileSystem().DeleteDirectory(new Uri("http://test.com/container/directory/directory")); |
| testContext.TestCloudBlobClient.Received(1).GetContainerReference("container"); |
| testContext.TestCloudBlobContainer.Received(1).GetDirectoryReference("directory"); |
| testContext.TestCloudBlobDirectory.Received(1).GetDirectoryReference("directory"); |
| testContext.TestCloudBlobDirectory.Received(1).ListBlobs(true); |
| testContext.TestCloudBlob.Received(5).DeleteIfExistsAsync(); |
| } |
| |
| [Fact] |
| public void TestCreateUriForAbsolutePathInvalid() |
| { |
| Assert.Throws<ArgumentException>(() => testContext.GetAzureFileSystem().CreateUriForPath("http://www.invalidstorageaccount.com/container/folder1/file1.txt")); |
| } |
| |
| [Fact] |
| public void TestCreateUriForAbsolutePath() |
| { |
| Uri uri = new Uri("http://storageacct.blob.core.windows.net/container/folder1/folder2/file.txt"); |
| Uri resultUri = testContext.GetAzureFileSystem().CreateUriForPath(uri.AbsoluteUri); |
| Assert.Equal<Uri>(uri, resultUri); |
| } |
| |
| [Fact] |
| public void TestCreateUriForRelativePathValid() |
| { |
| string relativePath = "container/folder1/folder2/file.txt"; |
| Uri expectedUri = new Uri(BaseUri, relativePath); |
| Uri resultUri = testContext.GetAzureFileSystem().CreateUriForPath(relativePath); |
| Assert.Equal<Uri>(expectedUri, resultUri); |
| } |
| |
| [Fact] |
| public void TestCreateUriForRelativePathWithContainerNameTooSmall() |
| { |
| // Container name must be atleast 3 characters. |
| string relativePath = "c1/folder1/folder2/file.txt"; |
| Uri expectedUri = new Uri(BaseUri, relativePath); |
| Assert.Throws<ArgumentException>(() => testContext.GetAzureFileSystem().CreateUriForPath(relativePath)); |
| } |
| |
| [Fact] |
| public void TestCreateUriForRelativePathWithInvalidContainerName() |
| { |
| // Container name cannot contain a colon character. |
| string relativePath = "c:/folder1/folder2/file.txt"; |
| Assert.Throws<ArgumentException>(() => testContext.GetAzureFileSystem().CreateUriForPath(relativePath)); |
| } |
| |
| private sealed class TestContext |
| { |
| public readonly ICloudBlobClient TestCloudBlobClient = Substitute.For<ICloudBlobClient>(); |
| public readonly ICloudBlob TestCloudBlob = Substitute.For<ICloudBlob>(); |
| public readonly ICloudBlockBlob TestCloudBlockBlob = Substitute.For<ICloudBlockBlob>(); |
| public readonly ICloudBlobContainer TestCloudBlobContainer = Substitute.For<ICloudBlobContainer>(); |
| public readonly ICloudBlobDirectory TestCloudBlobDirectory = Substitute.For<ICloudBlobDirectory>(); |
| public readonly Stream TestOpenStream = Substitute.For<Stream>(); |
| public readonly Stream TestCreateStream = Substitute.For<Stream>(); |
| |
| public IFileSystem GetAzureFileSystem() |
| { |
| var conf = AzureBlobFileSystemConfiguration.ConfigurationModule |
| .Set(AzureBlobFileSystemConfiguration.AccountName, "accountName") |
| .Set(AzureBlobFileSystemConfiguration.AccountKey, "accountKey") |
| .Build(); |
| |
| var injector = TangFactory.GetTang().NewInjector(conf); |
| injector.BindVolatileInstance(TestCloudBlobClient); |
| var fs = injector.GetInstance<AzureBlobFileSystem>(); |
| TestCloudBlobClient.BaseUri.ReturnsForAnyArgs(BaseUri); |
| TestCloudBlockBlob.Open().Returns(TestOpenStream); |
| TestCloudBlockBlob.Create().Returns(TestCreateStream); |
| TestCloudBlockBlob.Blob.ReturnsForAnyArgs(new CloudBlockBlob(FakeUri)); |
| TestCloudBlobClient.GetBlockBlobReference(FakeUri).ReturnsForAnyArgs(TestCloudBlockBlob); |
| TestCloudBlobClient.GetContainerReference("container").ReturnsForAnyArgs(TestCloudBlobContainer); |
| TestCloudBlobContainer.GetDirectoryReference("directory").ReturnsForAnyArgs(TestCloudBlobDirectory); |
| TestCloudBlobDirectory.GetDirectoryReference("directory").ReturnsForAnyArgs(TestCloudBlobDirectory); |
| return fs; |
| } |
| } |
| } |
| } |