private void OnBlobTransferClientOnTransferCompleted(object sender, BlobTransferCompleteEventArgs args)
        {
            this.DeleteAccessPolicyAndLocator();

            if (args.Error != null && this.onError != null)
            {
                this.onError.Invoke(args.Error);
                return;
            }

            if (this.onCompleted != null)
            {
                this.onCompleted.Invoke(this.asset.Id);
            }
        }
        public async Task WhenBlobTransferCompleteEventIsRaisedThenAccessPolicyAndLocatorAreDeleted()
        {
            EventHandler<BlobTransferCompleteEventArgs> blobTransferCompletedHandler = null;
            var stubAsset = new StubIAsset { IdGet = () => "myId", NameGet = () => "test" };
            var stubAssetFile = new StubIAssetFile();
            var stubAccessPolicy = new StubIAccessPolicy();
            var stubLocator = new StubILocator() { AccessPolicyGet = () => stubAccessPolicy };
            bool accessPolicyDeleteCalled = false;
            bool locatorDeletedCalled = false;

            using (ShimsContext.Create())
            {
                var stubAssets = new StubAssetBaseCollection
                {
                    CreateAsyncStringAssetCreationOptionsCancellationToken =
                        (name, options, cancellationToken) => Task.FromResult((IAsset)stubAsset)
                };

                var stubAssetsFiles = new StubAssetFileBaseCollection
                {
                    CreateAsyncStringCancellationToken =
                        (path, cancellationToken) =>
                        Task.FromResult((IAssetFile)stubAssetFile)
                };

                stubAsset.AssetFilesGet = () => stubAssetsFiles;

                var accessPolicies = new ShimAccessPolicyBaseCollection
                {
                    CreateAsyncStringTimeSpanAccessPermissions
                        =
                        (name,
                         timesSpan,
                         accessPermissions) =>
                        Task.FromResult((IAccessPolicy)stubAccessPolicy)
                };

                stubAccessPolicy.Delete = () =>
                    {
                        accessPolicyDeleteCalled = true;
                    };

                var locators = new ShimLocatorBaseCollection
                {
                    CreateSasLocatorAsyncIAssetIAccessPolicy =
                        (asset, acccessPolicy) => Task.FromResult((ILocator)stubLocator),
                };

                stubLocator.Delete = () =>
                {
                    locatorDeletedCalled = true;
                };

                ShimPath.GetFileNameString = fileName => string.Empty;

                ShimBlobTransferClient.Constructor = client => { };

                stubAssetFile.UploadAsyncStringBlobTransferClientILocatorCancellationToken =
                    (filePath, blobTransferClient, locator, cancellationToken) => Task.Delay(0);

                var context = new ShimCloudMediaContext
                {
                    AssetsGet = () => stubAssets,
                    AccessPoliciesGet = () => accessPolicies,
                    LocatorsGet = () => locators,
                };

                Func<CloudMediaContext> createContext = () => context;

                ShimBlobTransferClient.AllInstances.TransferCompletedAddEventHandlerOfBlobTransferCompleteEventArgs = (client, handler) =>
                {
                    blobTransferCompletedHandler = handler;
                };

                var uploader = new AzureMediaServicesUploader("myVideo", @"C:\videos\myvideo.mp4", createContext);

                uploader.On();

                await uploader.Start();
            }

            var args = new BlobTransferCompleteEventArgs(null, true, null, @"C:\videos\myvideo.mp4", new Uri("http://myvideo"), BlobTransferType.Upload);

            blobTransferCompletedHandler.Invoke(null, args);

            Assert.IsTrue(locatorDeletedCalled);
            Assert.IsTrue(accessPolicyDeleteCalled);
        }