UNPKG

azure-storage

Version:

Microsoft Azure Storage Client Library for Node.js

943 lines (782 loc) 38.2 kB
// // Copyright (c) Microsoft and contributors. All rights reserved. // // 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. // var assert = require('assert'); var guid = require('node-uuid'); // Lib includes var testutil = require('../../framework/util'); var SR = testutil.libRequire('common/util/sr'); var TestSuite = require('../../framework/test-suite'); var azure = testutil.libRequire('azure-storage'); var Constants = azure.Constants; var BlobUtilities = azure.BlobUtilities; var HttpConstants = Constants.HttpConstants; var containerNamesPrefix = 'cont-'; var blobNamesPrefix = 'blob-'; var suite = new TestSuite('blobservice-container-tests'); var timeout = (suite.isRecording || !suite.isMocked) ? 30000 : 10; var blobService; var containerName; var blobs = []; describe('BlobContainer', function () { before(function (done) { if (suite.isMocked) { testutil.POLL_REQUEST_INTERVAL = 0; } suite.setupSuite(function () { blobService = azure.createBlobService().withFilter(new azure.ExponentialRetryPolicyFilter()); done(); }); }); after(function (done) { suite.teardownSuite(done); }); beforeEach(function (done) { containerName = suite.getName(containerNamesPrefix); suite.setupTest(function () { blobService.createContainerIfNotExists(containerName, function (createError, container) { assert.equal(createError, null); assert.notEqual(container, null); done(); }); }); }); afterEach(function (done) { blobService.deleteContainerIfExists(containerName, function (deleteError) { assert.equal(deleteError, null); suite.teardownTest(done); }); }); describe('doesContainerExist', function () { it('should work', function (done) { containerName = suite.getName(containerNamesPrefix); assert.doesNotThrow(function () { blobService.doesContainerExist('$root', function () { }); }); assert.doesNotThrow(function () { blobService.doesContainerExist('$logs', function () { }); }); blobService.doesContainerExist(containerName, function (existsError, exists) { assert.equal(existsError, null); assert.strictEqual(exists, false); blobService.createContainer(containerName, function (createError, container1, createContainerResponse) { assert.equal(createError, null); assert.notEqual(container1, null); assert.equal(createContainerResponse.statusCode, HttpConstants.HttpResponseCodes.Created); blobService.doesContainerExist(containerName, function (existsError, exists) { assert.equal(existsError, null); assert.strictEqual(exists, true); done(); }); }); }); }); }); describe('createContainer', function () { it('should detect incorrect container names', function (done) { assert.throws(function () { blobService.createContainer(null, function () { }); }, /Required argument container for function createContainer is not defined/); assert.throws(function () { blobService.createContainer('$root1', function () { }); }, /Container name format is incorrect./); assert.throws(function () { blobService.createContainer('$root$logs', function () { }); }, /Container name format is incorrect./); assert.throws(function () { blobService.createContainer('', function () { }); }, /Required argument container for function createContainer is not defined/); assert.throws(function () { blobService.createContainer('as', function () { }); }, /Container name must be between 3 and 63 characters long./); assert.throws(function () { blobService.createContainer('a--s', function () { }); }, /Container name format is incorrect./); assert.throws(function () { blobService.createContainer('cont-', function () { }); }, /Container name format is incorrect./); assert.throws(function () { blobService.createContainer('conTain', function () { }); }, /Container name format is incorrect./); done(); }); it('should work', function (done) { var containerName = suite.getName(containerNamesPrefix); blobService.createContainer(containerName, function (createError, container1, createContainerResponse) { assert.equal(createError, null); assert.notEqual(container1, null); if (container1) { assert.notEqual(container1.name, null); assert.notEqual(container1.etag, null); assert.notEqual(container1.lastModified, null); } assert.equal(createContainerResponse.statusCode, HttpConstants.HttpResponseCodes.Created); // creating again will result in a duplicate error blobService.createContainer(containerName, function (createError2, container2) { assert.equal(createError2.code, Constants.BlobErrorCodeStrings.CONTAINER_ALREADY_EXISTS); assert.equal(container2, null); blobService.deleteContainer(containerName, function (deleteError) { assert.equal(deleteError, null); done(); }); }); }); }); it('should work when the headers are set to string type', function (done) { var containerName = suite.getName(containerNamesPrefix); blobService.createContainer(containerName, function (createError, container1, createContainerResponse) { assert.equal(createError, null); assert.notEqual(container1, null); if (container1) { assert.notEqual(container1.name, null); assert.notEqual(container1.etag, null); assert.notEqual(container1.lastModified, null); } assert.equal(createContainerResponse.statusCode, HttpConstants.HttpResponseCodes.Created); var callback = function(webresource) { for (var headerName in webresource.headers) { webresource.headers[headerName] = webresource.headers[headerName].toString(); } }; blobService.on('sendingRequestEvent', callback); // creating again will result in a duplicate error blobService.createContainer(containerName, function (createError2, container2) { assert.equal(createError2.code, Constants.BlobErrorCodeStrings.CONTAINER_ALREADY_EXISTS); assert.equal(container2, null); blobService.removeAllListeners('sendingRequestEvent'); blobService.deleteContainer(containerName, function (deleteError) { assert.equal(deleteError, null); done(); }); }); }); }); }); describe('createContainerIfNotExists', function() { it('should create a container if not exists', function (done) { var containerName = suite.getName(containerNamesPrefix); blobService.createContainerIfNotExists(containerName, function (createError, created) { assert.equal(createError, null); assert.equal(created, true); blobService.doesContainerExist(containerName, function (existsError, exists) { assert.equal(existsError, null); assert.equal(exists, true); blobService.createContainerIfNotExists(containerName, function (createError2, created2) { assert.equal(createError2, null); assert.equal(created2, false); blobService.deleteContainer(containerName, function (deleteError) { assert.equal(deleteError, null); blobService.createContainerIfNotExists(containerName, function (createError3) { assert.notEqual(createError3, null); assert.equal(createError3.code, 'ContainerBeingDeleted'); done(); }); }); }); }); }); }); it('should throw if called without a callback', function (done) { assert.throws(function () { blobService.createContainerIfNotExists('name'); }, Error ); done(); }); }); describe('deleteContainerIfExists', function() { it('should delete a container if exists', function (done) { var containerName = suite.getName(containerNamesPrefix); blobService.doesContainerExist(containerName, function(existsError, exists){ assert.equal(existsError, null); assert.strictEqual(exists, false); blobService.deleteContainerIfExists(containerName, function (deleteError, deleted) { assert.equal(deleteError, null); assert.strictEqual(deleted, false); blobService.createContainer(containerName, function (createError, container1, createContainerResponse) { assert.equal(createError, null); assert.notEqual(container1, null); if (container1) { assert.notEqual(container1.name, null); assert.notEqual(container1.etag, null); assert.notEqual(container1.lastModified, null); } assert.equal(createContainerResponse.statusCode, HttpConstants.HttpResponseCodes.Created); // delete if exists should succeed blobService.deleteContainerIfExists(containerName, function (deleteError2, deleted2) { assert.equal(deleteError2, null); assert.strictEqual(deleted2, true); blobService.doesContainerExist(containerName, function(existsError, exists){ assert.equal(existsError, null); assert.strictEqual(exists, false); done(); }); }); }); }); }); }); it('should throw if called without a callback', function (done) { assert.throws(function () { blobService.deleteContainerIfExists('name'); }, Error ); done(); }); }); describe('getContainerProperties', function () { it('should work', function (done) { var metadata = { 'Color': 'Blue' }; blobService.setContainerMetadata(containerName, metadata, function (setMetadataError, setMetadataResult, setMetadataResponse) { assert.equal(setMetadataError, null); assert.ok(setMetadataResponse.isSuccessful); blobService.getContainerProperties(containerName, function (getError, container2, getResponse) { assert.equal(getError, null); assert.notEqual(container2, null); if (container2) { assert.equal('unlocked', container2.leaseStatus); assert.equal('available', container2.leaseState); assert.equal(null, container2.leaseDuration); assert.notEqual(null, container2.requestId); assert.strictEqual(container2.metadata.color, metadata.Color); } assert.notEqual(getResponse, null); assert.equal(getResponse.isSuccessful, true); blobService.deleteContainer(containerName, function (deleteError) { assert.equal(deleteError, null); done(); }); }); }); }); }); describe('setContainerMetadata', function () { it('should work', function (done) { var metadata = { 'Class': 'Test' }; blobService.setContainerMetadata(containerName, metadata, function (setMetadataError, setMetadataResult, setMetadataResponse) { assert.equal(setMetadataError, null); assert.ok(setMetadataResponse.isSuccessful); blobService.getContainerMetadata(containerName, function (getMetadataError, containerMetadata, getMetadataResponse) { assert.equal(getMetadataError, null); assert.notEqual(containerMetadata, null); assert.notEqual(containerMetadata.metadata, null); if (containerMetadata.metadata) { assert.equal(containerMetadata.metadata.class, 'Test'); } assert.ok(getMetadataResponse.isSuccessful); blobService.deleteContainer(containerName, function (deleteError) { assert.equal(deleteError, null); done(); }); }); }); }); it('should merge the metadata', function (done) { var metadata = { color: 'blue', Color: 'Orange', COLOR: 'Red' }; blobService.setContainerMetadata(containerName, metadata, function (setMetadataError, setMetadataResult, setMetadataResponse) { assert.equal(setMetadataError, null); assert.ok(setMetadataResponse.isSuccessful); blobService.getContainerMetadata(containerName, function (getMetadataError, containerMetadata, getMetadataResponse) { assert.equal(getMetadataError, null); assert.notEqual(containerMetadata, null); assert.notEqual(containerMetadata.metadata, null); if (containerMetadata.metadata) { assert.equal(containerMetadata.metadata.color, 'blue,Orange,Red'); } assert.ok(getMetadataResponse.isSuccessful); blobService.deleteContainer(containerName, function (deleteError) { assert.equal(deleteError, null); done(); }); }); }); }); it('should work with a lease', function (done) { blobService.acquireLease(containerName, null, function (leaseError, lease, leaseResponse) { assert.equal(leaseError, null); assert.notEqual(lease, null); assert.ok(lease.id); assert.notEqual(lease.etag, null); assert.notEqual(lease.lastModified, null); assert.notEqual(leaseResponse, null); assert.ok(leaseResponse.isSuccessful); var metadata = { 'class': 'test' }; var options = { 'leaseId' : lease.id}; blobService.setContainerMetadata(containerName, metadata, options, function (setMetadataError, setMetadataResult, setMetadataResponse) { assert.equal(setMetadataError, null); assert.notEqual(setMetadataResult.etag, null); assert.ok(setMetadataResponse.isSuccessful); blobService.getContainerMetadata(containerName, options, function (getMetadataError, containerMetadata, getMetadataResponse) { assert.equal(getMetadataError, null); assert.notEqual(containerMetadata, null); assert.notEqual(containerMetadata.metadata, null); if (containerMetadata.metadata) { assert.equal(containerMetadata.metadata['class'], 'test'); } assert.ok(getMetadataResponse.isSuccessful); blobService.breakLease(containerName, null, {leaseBreakPeriod: 0}, function(leaseError){ assert.equal(leaseError, null); blobService.deleteContainer(containerName, function (deleteError) { assert.equal(deleteError, null); done(); }); }); }); }); }); }); }); describe('setContainerMetadataThrows', function () { it('should work', function (done) { function setContainerMetadata(containerName, metadata) { blobService.setContainerMetadata(containerName, metadata, function(){}); } assert.throws( function() { setContainerMetadata(containerName, {'' : 'value1'}); }, function (err) {return (err instanceof Error) && err.message === SR.METADATA_KEY_INVALID}); assert.throws( function() { setContainerMetadata(containerName, {' ' : 'value1'}); }, function (err) {return (err instanceof Error) && err.message === SR.METADATA_KEY_INVALID}); assert.throws( function() { setContainerMetadata(containerName, {'\n\t' : 'value1'}); }, function (err) {return (err instanceof Error) && err.message === SR.METADATA_KEY_INVALID}); assert.throws( function() { setContainerMetadata(containerName, {'key1' : null}); }, function (err) {return (err instanceof Error) && err.message === SR.METADATA_VALUE_INVALID}); assert.throws( function() { setContainerMetadata(containerName, {'key1' : ''}); }, function (err) {return (err instanceof Error) && err.message === SR.METADATA_VALUE_INVALID}); assert.throws( function() { setContainerMetadata(containerName, {'key1' : '\n\t'}); }, function (err) {return (err instanceof Error) && err.message === SR.METADATA_VALUE_INVALID}); assert.throws( function() { setContainerMetadata(containerName, {'key1' : ' '}); }, function (err) {return (err instanceof Error) && err.message === SR.METADATA_VALUE_INVALID}); // test that empty headers can be got. var callback = function(webresource) { webresource.headers['x-ms-meta-key1'] = ''; }; blobService.on('sendingRequestEvent', callback); blobService.setContainerMetadata(containerName, {}, function(setMetadataError) { assert.equal(setMetadataError, null); blobService.getContainerProperties(containerName, function(getContainerPropsError, properties) { assert.equal(getContainerPropsError, null); assert.equal(properties.metadata['key1'], ''); done(); }); }); }); }); describe('getContainerAcl', function () { it('should work', function (done) { blobService.getContainerAcl(containerName, function (containerAclError, containerBlob, containerAclResponse) { assert.equal(containerAclError, null); assert.notEqual(containerBlob, null); if (containerBlob) { assert.equal(containerBlob.publicAccessLevel, BlobUtilities.BlobContainerPublicAccessType.OFF); } assert.equal(containerAclResponse.isSuccessful, true); blobService.deleteContainer(containerName, function (deleteError) { assert.equal(deleteError, null); done(); }); }); }); }); describe('setContainerAcl', function () { it('should work', function (done) { var blobServiceAnonymous = azure.createBlobServiceAnonymous(blobService.host.primaryHost) .withFilter(new azure.ExponentialRetryPolicyFilter()); var blobName = suite.getName(blobNamesPrefix); var blobText = 'Hello World!'; blobService.createBlockBlobFromText(containerName, blobName, blobText, function (err) { assert.equal(err, null); var options = {publicAccessLevel: BlobUtilities.BlobContainerPublicAccessType.BLOB}; blobService.setContainerAcl(containerName, null, options, function (setAclError, setAclContainer1, setResponse1) { assert.equal(setAclError, null); assert.notEqual(setAclContainer1, null); assert.ok(setResponse1.isSuccessful); setTimeout(function () { blobService.getContainerAcl(containerName, function (getAclError, getAclContainer1, getResponse1) { assert.equal(getAclError, null); assert.notEqual(getAclContainer1, null); assert.equal(getAclContainer1.publicAccessLevel, BlobUtilities.BlobContainerPublicAccessType.BLOB); assert.ok(getResponse1.isSuccessful); blobServiceAnonymous.getBlobToText(containerName, blobName, function(createBlobError, blobTextResponse, blockBlob, getBlobResponse) { assert.equal(setAclError, null); assert.notEqual(blockBlob, null); assert.ok(getBlobResponse.isSuccessful); assert.equal(blobTextResponse, blobText); options.publicAccessLevel = BlobUtilities.BlobContainerPublicAccessType.CONTAINER; blobService.setContainerAcl(containerName, null, options, function (setAclError2, setAclContainer2, setResponse2) { assert.equal(setAclError2, null); assert.notEqual(setAclContainer2, null); assert.ok(setResponse2.isSuccessful); setTimeout(function () { blobService.getContainerAcl(containerName, function (getAclError2, getAclContainer2, getResponse3) { assert.equal(getAclError2, null); assert.notEqual(getAclContainer2, null); assert.equal(getAclContainer2.publicAccessLevel, BlobUtilities.BlobContainerPublicAccessType.CONTAINER); assert.ok(getResponse3.isSuccessful); blobServiceAnonymous.getBlobToText(containerName, blobName, function(createBlobError2, blobTextResponse2, blockBlob2, getBlobResponse2) { assert.equal(setAclError2, null); assert.notEqual(blockBlob2, null); assert.ok(getBlobResponse2.isSuccessful); assert.equal(blobTextResponse2, blobText); blobService.deleteBlobIfExists(containerName, blobName, function(error) { assert.equal(error, null); done(); }); }); }); }, timeout); }); }); }); }, timeout); }); }); }); it('should work with policies', function (done) { var readWriteStartDate = new Date(Date.UTC(2012, 10, 10)); var readWriteExpiryDate = new Date(readWriteStartDate); readWriteExpiryDate.setMinutes(readWriteStartDate.getMinutes() + 10); readWriteExpiryDate.setMilliseconds(999); var readWriteSharedAccessPolicy = { Id: 'readwrite', AccessPolicy: { Start: readWriteStartDate, Expiry: readWriteExpiryDate, Permissions: 'rw' } }; var readSharedAccessPolicy = { Id: 'read', AccessPolicy: { Expiry: readWriteStartDate, Permissions: 'r' } }; var options = { publicAccessLevel: BlobUtilities.BlobContainerPublicAccessType.BLOB }; var signedIdentifiers = [readWriteSharedAccessPolicy, readSharedAccessPolicy]; blobService.setContainerAcl(containerName, signedIdentifiers, options, function (setAclError, setAclContainer1, setResponse1) { assert.equal(setAclError, null); assert.notEqual(setAclContainer1, null); assert.ok(setResponse1.isSuccessful); setTimeout(function () { blobService.getContainerAcl(containerName, function (getAclError, getAclContainer1, getResponse1) { assert.equal(getAclError, null); assert.notEqual(getAclContainer1, null); assert.equal(getAclContainer1.publicAccessLevel, BlobUtilities.BlobContainerPublicAccessType.BLOB); assert.equal(getAclContainer1.signedIdentifiers[0].AccessPolicy.Expiry.getTime(), readWriteExpiryDate.getTime()); assert.ok(getResponse1.isSuccessful); options.publicAccessLevel = BlobUtilities.BlobContainerPublicAccessType.CONTAINER; blobService.setContainerAcl(containerName, null, options, function (setAclError2, setAclContainer2, setResponse2) { assert.equal(setAclError2, null); assert.notEqual(setAclContainer2, null); assert.ok(setResponse2.isSuccessful); setTimeout(function () { blobService.getContainerAcl(containerName, function (getAclError2, getAclContainer2, getResponse3) { assert.equal(getAclError2, null); assert.notEqual(getAclContainer2, null); assert.equal(getAclContainer2.publicAccessLevel, BlobUtilities.BlobContainerPublicAccessType.CONTAINER); assert.ok(getResponse3.isSuccessful); done(); }); }, timeout); }); }); }, timeout); }); }); it('should work with signed identifiers', function (done) { var signedIdentifiers = [ { Id: 'id1', AccessPolicy: { Start: '2009-10-10T00:00:00.123Z', Expiry: '2009-10-11T00:00:00.456Z', Permissions: 'r' } }, { Id: 'id2', AccessPolicy: { Start: '2009-11-10T00:00:00.006Z', Expiry: '2009-11-11T00:00:00.4Z', Permissions: 'w' } }]; var options = {publicAccessLevel: BlobUtilities.BlobContainerPublicAccessType.OFF}; blobService.setContainerAcl(containerName, signedIdentifiers, options, function (setAclError, setAclContainer, setAclResponse) { assert.equal(setAclError, null); assert.notEqual(setAclContainer, null); assert.ok(setAclResponse.isSuccessful); setTimeout(function () { blobService.getContainerAcl(containerName, function (getAclError, containerAcl, getAclResponse) { assert.equal(getAclError, null); assert.notEqual(containerAcl, null); assert.notEqual(getAclResponse, null); if (getAclResponse) { assert.equal(getAclResponse.isSuccessful, true); } var entries = 0; containerAcl.signedIdentifiers.forEach(function (identifier) { if (identifier.Id === 'id1') { assert.equal(identifier.AccessPolicy.Start.getTime(), new Date('2009-10-10T00:00:00.123Z').getTime()); assert.equal(identifier.AccessPolicy.Expiry.getTime(), new Date('2009-10-11T00:00:00.456Z').getTime()); assert.equal(identifier.AccessPolicy.Permissions, 'r'); entries += 1; } else if (identifier.Id === 'id2') { assert.equal(identifier.AccessPolicy.Start.getTime(), new Date('2009-11-10T00:00:00.006Z').getTime()); assert.equal(identifier.AccessPolicy.Start.getMilliseconds(), 6); assert.equal(identifier.AccessPolicy.Expiry.getTime(), new Date('2009-11-11T00:00:00.4Z').getTime()); assert.equal(identifier.AccessPolicy.Expiry.getMilliseconds(), 400); assert.equal(identifier.AccessPolicy.Permissions, 'w'); entries += 2; } }); assert.equal(entries, 3); done(); }); }, timeout); }); }); }); describe('listBlobs', function () { it('should work', function (done) { var blobName1 = suite.getName(blobNamesPrefix); var blobName2 = suite.getName(blobNamesPrefix); var blobText1 = 'hello1'; var blobText2 = 'hello2'; blobs.length = 0; var listBlobsWithoutPrefix = function (options, token, callback) { blobService.listBlobsSegmented(containerName, token, options, function(error, result) { assert.equal(error, null); blobs.push.apply(blobs, result.entries); var token = result.continuationToken; if(token) { listBlobsWithoutPrefix(options, token, callback); } else { callback(); } }); }; listBlobsWithoutPrefix(null, null, function() { assert.equal(blobs.length, 0); blobService.createBlockBlobFromText(containerName, blobName1, blobText1, function (blobErr1) { assert.equal(blobErr1, null); // Test listing 1 blob listBlobsWithoutPrefix(null, null, function() { assert.equal(blobs.length, 1); assert.equal(blobs[0].name, blobName1); blobService.createBlockBlobFromText(containerName, blobName2, blobText2, function (blobErr2) { assert.equal(blobErr2, null); blobs.length = 0; // Test listing multiple blobs listBlobsWithoutPrefix(null, null, function() { assert.equal(blobs.length, 2); var entries = 0; blobs.forEach(function (blob) { if (blob.name === blobName1) { entries += 1; } else if (blob.name === blobName2) { entries += 2; } }); assert.equal(entries, 3); blobService.createBlobSnapshot(containerName, blobName1, function (snapErr) { assert.equal(snapErr, null); blobs.length = 0; // Test listing without requesting snapshots listBlobsWithoutPrefix(null, null, function() { assert.equal(blobs.length, 2); var options = { include: BlobUtilities.BlobListingDetails.SNAPSHOTS, maxResults: 2 }; blobs.length = 0; // Test listing including snapshots listBlobsWithoutPrefix(options, null, function() { assert.equal(blobs.length, 3); blobService.deleteContainer(containerName, function (deleteError) { assert.equal(deleteError, null); done(); }); }); }); }); }); }); }); }); }); }); it('should work with prefix', function(done) { var blobName1 = suite.getName(blobNamesPrefix); var blobName2 = suite.getName(blobNamesPrefix); var blobText1 = 'hello1'; var blobText2 = 'hello2'; blobs.length = 0; listBlobs(null, null, null, function() { assert.equal(blobs.length, 0); blobService.createBlockBlobFromText(containerName, blobName1, blobText1, function (blobErr1) { assert.equal(blobErr1, null); // Test listing 1 blob listBlobs(null, null, null, function() { assert.equal(blobs.length, 1); assert.equal(blobs[0].name, blobName1); blobService.createBlockBlobFromText(containerName, blobName2, blobText2, function (blobErr2) { assert.equal(blobErr2, null); blobs.length = 0; // Test listing multiple blobs with prefix listBlobs(blobName1, null, null, function() { assert.equal(blobs.length, 1); blobService.createBlobSnapshot(containerName, blobName1, function (snapErr) { assert.equal(snapErr, null); blobs.length = 0; // Test listing without requesting snapshots listBlobs(null, null, null, function() { assert.equal(blobs.length, 2); var options = { include: BlobUtilities.BlobListingDetails.SNAPSHOTS }; blobs.length = 0; // Test listing with prefix and including snapshots listBlobs(blobName1, options, null, function() { assert.equal(blobs.length, 2); blobService.deleteContainer(containerName, function (deleteError) { assert.equal(deleteError, null); done(); }); }); }); }); }); }); }); }); }); }); }); describe('listBlobDirectories', function () { it('should list blob directories', function (done) { var blobPrefix1 = suite.getName(blobNamesPrefix) + '/'; var blobPrefix2 = blobPrefix1 + suite.getName(blobNamesPrefix) + '/'; var blobName1 = blobPrefix1 + suite.getName(blobNamesPrefix); var blobName2 = blobPrefix2 + suite.getName(blobNamesPrefix); var blobText1 = 'hello1'; var blobText2 = 'hello2'; blobs.length = 0; listBlobDirectoriesWithoutPrefix(null, null, function() { assert.equal(blobs.length, 0); blobService.createBlockBlobFromText(containerName, blobName1, blobText1, function (blobErr1) { assert.equal(blobErr1, null); listBlobDirectoriesWithoutPrefix(null, null, function() { assert.equal(blobs.length, 1); assert.equal(blobs[0].name, blobPrefix1); blobService.createBlockBlobFromText(containerName, blobName2, blobText2, function (blobErr2) { assert.equal(blobErr2, null); blobs.length = 0; listBlobDirectoriesWithoutPrefix(null, null, function() { assert.equal(blobs.length, 1); var prefix = blobs[0].name; blobs.length = 0; listBlobDirectoriesWithPrefix(prefix, null, null, function() { assert.equal(blobs.length, 1); assert.equal(blobs[0].name, blobPrefix2); prefix = blobs[0].name; blobs.length = 0; listBlobs(prefix, null, null, function (blobErr) { assert.equal(blobErr, null); assert.equal(blobs.length, 1); assert.equal(blobs[0].name, blobName2); done(); }) }); }); }); }); }); }); }); it('should list blob directories with prefix', function (done) { var blobPrefix1 = suite.getName(blobNamesPrefix) + '/'; var blobPrefix2 = blobPrefix1 + suite.getName(blobNamesPrefix) + '/'; var blobPrefix3 = blobPrefix1 + suite.getName(blobNamesPrefix) + '/'; var blobName1 = blobPrefix1 + suite.getName(blobNamesPrefix); var blobName2 = blobPrefix2 + suite.getName(blobNamesPrefix); var blobName3 = blobPrefix3 + suite.getName(blobNamesPrefix); var blobText1 = 'hello1'; var blobText2 = 'hello2'; var blobText3 = 'hello3'; blobs.length = 0; var prefix = blobPrefix1.slice(0, -1); listBlobDirectoriesWithPrefix(prefix, null, null, function() { assert.equal(blobs.length, 0); blobService.createBlockBlobFromText(containerName, blobName1, blobText1, function (blobErr1) { assert.equal(blobErr1, null); listBlobDirectoriesWithPrefix(prefix, null, null, function() { assert.equal(blobs.length, 1); assert.equal(blobs[0].name, blobPrefix1); blobService.createBlockBlobFromText(containerName, blobName2, blobText2, function (blobErr2) { assert.equal(blobErr2, null); blobService.createBlockBlobFromText(containerName, blobName3, blobText3, function (blobErr3) { assert.equal(blobErr3, null); blobs.length = 0; listBlobDirectoriesWithPrefix(blobPrefix1, null, null, function() { assert.equal(blobs.length, 2); var prefix = blobs[1].name.slice(0, -1); blobs.length = 0; listBlobDirectoriesWithPrefix(prefix, null, null, function() { assert.equal(blobs.length, 1); assert.equal(blobs[0].name, blobPrefix3); prefix = blobs[0].name; blobs.length = 0; listBlobs(prefix, null, null, function (blobErr) { assert.equal(blobErr, null); assert.equal(blobs.length, 1); assert.equal(blobs[0].name, blobName3); done(); }); }); }); }); }); }); }); }); }); }); }); function listBlobs (prefix, options, token, callback) { blobService.listBlobsSegmentedWithPrefix(containerName, prefix, token, options, function(error, result) { assert.equal(error, null); blobs.push.apply(blobs, result.entries); var token = result.continuationToken; if(token) { listBlobs(prefix, options, token, callback); } else { callback(); } }); } function listBlobDirectoriesWithPrefix(prefix, options, token, callback) { blobService.listBlobDirectoriesSegmentedWithPrefix(containerName, prefix, token, options, function(error, result) { assert.equal(error, null); blobs.push.apply(blobs, result.entries); var token = result.continuationToken; if(token) { listBlobDirectoriesWithPrefix(prefix, options, token, callback); } else { callback(); } }); } function listBlobDirectoriesWithoutPrefix(options, token, callback) { blobService.listBlobDirectoriesSegmented(containerName, token, options, function(error, result) { assert.equal(error, null); blobs.push.apply(blobs, result.entries); var token = result.continuationToken; if(token) { listBlobDirectoriesWithoutPrefix(options, token, callback); } else { callback(); } }); }