public void WhenBlobTransferProgressChangedEventIsRaisedThenProgressCallbackIsCalled()
        {
            const int Percentage         = 10;
            var       progressCalled     = false;
            var       providedPercentage = -1;
            EventHandler <BlobTransferProgressChangedEventArgs> blobTransferProgressHandler = null;
            var stubAsset = new StubIAsset {
                NameGet = () => "test"
            };
            var stubAssetFile    = new StubIAssetFile();
            var stubAccessPolicy = new StubIAccessPolicy();
            var stubLocator      = new StubILocator();

            using (ShimsContext.Create())
            {
                var stubAssets = new StubAssetBaseCollection
                {
                    CreateStringAssetCreationOptions =
                        (name, options) => stubAsset
                };

                var stubAssetsFiles = new StubAssetFileBaseCollection {
                    CreateString = path => stubAssetFile
                };

                stubAsset.AssetFilesGet = () => stubAssetsFiles;

                var accessPolicies = new ShimAccessPolicyBaseCollection
                {
                    CreateStringTimeSpanAccessPermissions
                        =
                            (name,
                             timesSpan,
                             accessPermissions) =>
                            stubAccessPolicy
                };

                var locators = new ShimLocatorBaseCollection
                {
                    CreateSasLocatorIAssetIAccessPolicy =
                        (asset, acccessPolicy) => stubLocator
                };

                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.TransferProgressChangedAddEventHandlerOfBlobTransferProgressChangedEventArgs = (client, handler) =>
                {
                    blobTransferProgressHandler = handler;
                };

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

                Action <int> onProgress = progressPercentage =>
                {
                    progressCalled     = true;
                    providedPercentage = progressPercentage;
                };

                uploader.On(progress: onProgress);

                uploader.Start();
            }

            var args = new BlobTransferProgressChangedEventArgs(0, 0, 0, Percentage, 0, new Uri("http://myvideo"), @"C:\videos\myvideo.mp4", null);

            blobTransferProgressHandler.Invoke(null, args);

            Assert.IsTrue(progressCalled);
            Assert.AreEqual(Percentage, providedPercentage);
        }
        public async Task WhenStartIsCalledThenUploadAsyncOnAssetFileIsCalled()
        {
            bool uploadAsyncCalled = false;

            var stubAsset = new StubIAsset {
                NameGet = () => "test"
            };
            var stubAssetFile    = new StubIAssetFile();
            var stubAccessPolicy = new StubIAccessPolicy();
            var stubLocator      = new StubILocator();

            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)
                };

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

                ShimPath.GetFileNameString = fileName => string.Empty;

                ShimBlobTransferClient.Constructor = client => { };

                stubAssetFile.UploadAsyncStringBlobTransferClientILocatorCancellationToken =
                    (filePath, blobTransferClient, locator, cancellationToken) =>
                {
                    uploadAsyncCalled = true;

                    return(Task.Delay(0));
                };

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

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

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

                await uploader.Start();
            }

            Assert.IsTrue(uploadAsyncCalled);
        }
        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);
        }
Example #4
0
        public async Task WhenStartIsCalledThenAJobIsSubmitted()
        {
            const string Configuration   = "H264 Broadband 720p";
            const string OutputAssetName = "Output Asset";
            const string JobName         = "My Job";
            IAsset       inputAsset      = new StubIAsset {
                NameGet = () => "Input Asset"
            };
            var mediaProcessor = new StubIMediaProcessor
            {
                NameGet    = () => "Windows Azure Media Encoder",
                VersionGet = () => "2.0.0"
            };

            string          jobName                        = null;
            IMediaProcessor taskMediaProcessor             = null;
            string          taskConfiguration              = null;
            IAsset          taskInputAsset                 = null;
            string          taskOutputAssetName            = null;
            bool            jobSubmitted                   = false;
            bool            getExecutionProgressTaskCalled = false;

            using (ShimsContext.Create())
            {
                var outputAsset = new StubIAsset();

                var task = new StubITask();

                var tasks = new ShimTaskCollection
                {
                    AddNewStringIMediaProcessorStringTaskOptions =
                        (taskName, processor, configuration, taskOptions) =>
                    {
                        taskMediaProcessor = processor;
                        taskConfiguration  = configuration;

                        task.NameGet = () => taskName;

                        return(task);
                    }
                };

                var inputAssets = new ShimInputAssetCollection <IAsset> {
                    AddT0 = asset => taskInputAsset = asset
                };
                var outputAssets = new ShimOutputAssetCollection
                {
                    AddNewStringAssetCreationOptions =
                        (outputAssetName, assetCreationOptions) =>
                    {
                        taskOutputAssetName = outputAssetName;
                        outputAsset.NameGet =
                            () => outputAssetName;
                        return(outputAsset);
                    }
                };

                task.InputAssetsGet  = () => inputAssets;
                task.OutputAssetsGet = () => outputAssets;

                var job = new StubIJob
                {
                    TasksGet    = () => tasks,
                    SubmitAsync = () =>
                    {
                        jobSubmitted = true;
                        return(Task.Delay(0));
                    },
                    GetExecutionProgressTaskCancellationToken = token =>
                    {
                        getExecutionProgressTaskCalled = true;

                        return(Task.Delay(0));
                    }
                };

                var jobs       = new List <IJob>();
                var collection = new ShimJobBaseCollection
                {
                    CreateString = name =>
                    {
                        jobName     = name;
                        job.NameGet = () => name;
                        return(job);
                    }
                };

                collection.Bind(jobs.AsQueryable());

                var mediaProcessors = new List <IMediaProcessor> {
                    mediaProcessor
                };
                var mediaProcessorsCollection = new ShimMediaProcessorBaseCollection();
                mediaProcessorsCollection.Bind(mediaProcessors.AsQueryable());

                var context = new ShimCloudMediaContext
                {
                    JobsGet            = () => collection,
                    MediaProcessorsGet = () => mediaProcessorsCollection
                };

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

                var encoder = new AzureMediaServicesEncoder(
                    JobName, inputAsset, Configuration, OutputAssetName, createContext);

                await encoder.Start();
            }

            Assert.AreEqual(JobName, jobName);
            Assert.AreEqual(Configuration, taskConfiguration);
            Assert.AreEqual(mediaProcessor, taskMediaProcessor);
            Assert.AreEqual(inputAsset, taskInputAsset);
            Assert.AreEqual(OutputAssetName, taskOutputAssetName);
            Assert.IsTrue(jobSubmitted);
            Assert.IsTrue(getExecutionProgressTaskCalled);
        }
Example #5
0
        public async Task WhenStateChangedEventIsRaisedAndJobIsProcessingThenErrorCallbackIsCalled()
        {
            const string Configuration   = "H264 Broadband 720p";
            const string OutputAssetName = "Output Asset";
            const string JobName         = "My Job";
            const string JobId           = "My Id";

            const string TaskId           = "My Task Id";
            const string TaskErrorCode    = "My Task Error Code";
            const string TaskErrorMessage = "My Task Error Message";

            IAsset inputAsset = new StubIAsset {
                NameGet = () => "Input Asset"
            };
            var mediaProcessor = new StubIMediaProcessor
            {
                NameGet    = () => "Windows Azure Media Encoder",
                VersionGet = () => "2.0.0"
            };

            string errorMesage = null;
            bool   errorCalled = false;

            using (ShimsContext.Create())
            {
                var outputAsset = new StubIAsset();

                var task = new StubITask
                {
                    IdGet           = () => TaskId,
                    ErrorDetailsGet =
                        () =>
                        new ReadOnlyCollection <ErrorDetail>(
                            new List <ErrorDetail>
                    {
                        new StubErrorDetail
                        {
                            Code    = TaskErrorCode,
                            Message = TaskErrorMessage,
                        }
                    })
                };

                var tasks = new ShimTaskCollection
                {
                    AddNewStringIMediaProcessorStringTaskOptions =
                        (taskName, processor, configuration, taskOptions) =>
                    {
                        task.NameGet = () => taskName;

                        return(task);
                    }
                };

                tasks.Bind(new List <ITask> {
                    task
                }.AsQueryable());

                var inputAssets = new ShimInputAssetCollection <IAsset> {
                    AddT0 = asset => { }
                };
                var outputAssets = new ShimOutputAssetCollection
                {
                    AddNewStringAssetCreationOptions =
                        (outputAssetName, assetCreationOptions) =>
                    {
                        outputAsset.NameGet =
                            () => outputAssetName;
                        return(outputAsset);
                    }
                };

                task.InputAssetsGet  = () => inputAssets;
                task.OutputAssetsGet = () => outputAssets;

                var job = new StubIJob
                {
                    TasksGet    = () => tasks,
                    SubmitAsync = () => Task.Delay(0),
                    GetExecutionProgressTaskCancellationToken = token => Task.Delay(0)
                };

                var jobs       = new List <IJob>();
                var collection = new ShimJobBaseCollection
                {
                    CreateString = name =>
                    {
                        job.NameGet = () => name;
                        job.IdGet   = () => JobId;
                        return(job);
                    }
                };

                collection.Bind(jobs.AsQueryable());

                var mediaProcessors = new List <IMediaProcessor> {
                    mediaProcessor
                };
                var mediaProcessorsCollection = new ShimMediaProcessorBaseCollection();
                mediaProcessorsCollection.Bind(mediaProcessors.AsQueryable());

                var context = new ShimCloudMediaContext
                {
                    JobsGet            = () => collection,
                    MediaProcessorsGet = () => mediaProcessorsCollection
                };

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

                var encoder = new AzureMediaServicesEncoder(
                    JobName, inputAsset, Configuration, OutputAssetName, createContext);

                Action <string> onError = message =>
                {
                    errorCalled = true;
                    errorMesage = message;
                };

                encoder.On(error: onError);

                await encoder.Start();

                job.StateChangedEvent.Invoke(job, new StubJobStateChangedEventArgs(JobState.Processing, JobState.Error));

                Assert.IsTrue(errorCalled);
                StringAssert.Contains(errorMesage, TaskId);
                StringAssert.Contains(errorMesage, TaskErrorCode);
                StringAssert.Contains(errorMesage, TaskErrorMessage);
            }
        }
        public void WhenBlobTransferProgressChangedEventIsRaisedThenProgressCallbackIsCalled()
        {
            const int Percentage = 10;
            var progressCalled = false;
            var providedPercentage = -1;
            EventHandler<BlobTransferProgressChangedEventArgs> blobTransferProgressHandler = null;
            var stubAsset = new StubIAsset { NameGet = () => "test" };
            var stubAssetFile = new StubIAssetFile();
            var stubAccessPolicy = new StubIAccessPolicy();
            var stubLocator = new StubILocator();

            using (ShimsContext.Create())
            {
                var stubAssets = new StubAssetBaseCollection
                {
                    CreateStringAssetCreationOptions =
                        (name, options) => stubAsset
                };

                var stubAssetsFiles = new StubAssetFileBaseCollection { CreateString = path => stubAssetFile };

                stubAsset.AssetFilesGet = () => stubAssetsFiles;

                var accessPolicies = new ShimAccessPolicyBaseCollection
                {
                    CreateStringTimeSpanAccessPermissions
                        =
                        (name,
                         timesSpan,
                         accessPermissions) =>
                        stubAccessPolicy
                };

                var locators = new ShimLocatorBaseCollection
                {
                    CreateSasLocatorIAssetIAccessPolicy =
                        (asset, acccessPolicy) => stubLocator
                };

                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.TransferProgressChangedAddEventHandlerOfBlobTransferProgressChangedEventArgs = (client, handler) =>
                {
                    blobTransferProgressHandler = handler;
                };

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

                Action<int> onProgress = progressPercentage =>
                {
                    progressCalled = true;
                    providedPercentage = progressPercentage;
                };

                uploader.On(progress: onProgress);

                uploader.Start();
            }

            var args = new BlobTransferProgressChangedEventArgs(0, 0, 0, Percentage, 0, new Uri("http://myvideo"), @"C:\videos\myvideo.mp4", null);

            blobTransferProgressHandler.Invoke(null, args);

            Assert.IsTrue(progressCalled);
            Assert.AreEqual(Percentage, providedPercentage);
        }
        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);
        }
        public async Task WhenStartIsCalledThenUploadAsyncOnAssetFileIsCalled()
        {
            bool uploadAsyncCalled = false;

            var stubAsset = new StubIAsset { NameGet = () => "test" };
            var stubAssetFile = new StubIAssetFile();
            var stubAccessPolicy = new StubIAccessPolicy();
            var stubLocator = new StubILocator();

            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)
                                                 };

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

                ShimPath.GetFileNameString = fileName => string.Empty;

                ShimBlobTransferClient.Constructor = client => { };

                stubAssetFile.UploadAsyncStringBlobTransferClientILocatorCancellationToken =
                    (filePath, blobTransferClient, locator, cancellationToken) =>
                        {
                            uploadAsyncCalled = true;

                            return Task.Delay(0);
                        };

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

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

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

                await uploader.Start();
            }

            Assert.IsTrue(uploadAsyncCalled);
        }
        public async Task WhenStateChangedEventIsRaisedAndJobIsProcessingThenErrorCallbackIsCalled()
        {
            const string Configuration = "H264 Broadband 720p";
            const string OutputAssetName = "Output Asset";
            const string JobName = "My Job";
            const string JobId = "My Id";

            const string TaskId = "My Task Id";
            const string TaskErrorCode = "My Task Error Code";
            const string TaskErrorMessage = "My Task Error Message";

            IAsset inputAsset = new StubIAsset { NameGet = () => "Input Asset" };
            var mediaProcessor = new StubIMediaProcessor
            {
                NameGet = () => "Windows Azure Media Encoder",
                VersionGet = () => "2.0.0"
            };

            string errorMesage = null;
            bool errorCalled = false;

            using (ShimsContext.Create())
            {
                var outputAsset = new StubIAsset();

                var task = new StubITask
                               {
                                   IdGet = () => TaskId,
                                   ErrorDetailsGet =
                                       () =>
                                       new ReadOnlyCollection<ErrorDetail>(
                                           new List<ErrorDetail>
                                               {
                                                   new StubErrorDetail
                                                       {
                                                           Code = TaskErrorCode,
                                                           Message = TaskErrorMessage,
                                                       }
                                               })
                               };

                var tasks = new ShimTaskCollection
                {
                    AddNewStringIMediaProcessorStringTaskOptions =
                        (taskName, processor, configuration, taskOptions) =>
                        {
                            task.NameGet = () => taskName;

                            return task;
                        }
                };

                tasks.Bind(new List<ITask> { task }.AsQueryable());

                var inputAssets = new ShimInputAssetCollection<IAsset> { AddT0 = asset => { } };
                var outputAssets = new ShimOutputAssetCollection
                {
                    AddNewStringAssetCreationOptions =
                        (outputAssetName, assetCreationOptions) =>
                        {
                            outputAsset.NameGet =
                                () => outputAssetName;
                            return outputAsset;
                        }
                };

                task.InputAssetsGet = () => inputAssets;
                task.OutputAssetsGet = () => outputAssets;

                var job = new StubIJob
                {
                    TasksGet = () => tasks,
                    SubmitAsync = () => Task.Delay(0),
                    GetExecutionProgressTaskCancellationToken = token => Task.Delay(0)
                };

                var jobs = new List<IJob>();
                var collection = new ShimJobBaseCollection
                {
                    CreateString = name =>
                    {
                        job.NameGet = () => name;
                        job.IdGet = () => JobId;
                        return job;
                    }
                };

                collection.Bind(jobs.AsQueryable());

                var mediaProcessors = new List<IMediaProcessor> { mediaProcessor };
                var mediaProcessorsCollection = new ShimMediaProcessorBaseCollection();
                mediaProcessorsCollection.Bind(mediaProcessors.AsQueryable());

                var context = new ShimCloudMediaContext
                {
                    JobsGet = () => collection,
                    MediaProcessorsGet = () => mediaProcessorsCollection
                };

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

                var encoder = new AzureMediaServicesEncoder(
                    JobName, inputAsset, Configuration, OutputAssetName, createContext);

                Action<string> onError = message =>
                {
                    errorCalled = true;
                    errorMesage = message;
                };

                encoder.On(error: onError);

                await encoder.Start();

                job.StateChangedEvent.Invoke(job, new StubJobStateChangedEventArgs(JobState.Processing, JobState.Error));

                Assert.IsTrue(errorCalled);
                StringAssert.Contains(errorMesage, TaskId);
                StringAssert.Contains(errorMesage, TaskErrorCode);
                StringAssert.Contains(errorMesage, TaskErrorMessage);
            }
        }
        public async Task WhenStartIsCalledThenAJobIsSubmitted()
        {
            const string Configuration = "H264 Broadband 720p";
            const string OutputAssetName = "Output Asset";
            const string JobName = "My Job";
            IAsset inputAsset = new StubIAsset { NameGet = () => "Input Asset" };
            var mediaProcessor = new StubIMediaProcessor
                                     {
                                         NameGet = () => "Windows Azure Media Encoder",
                                         VersionGet = () => "2.0.0"
                                     };

            string jobName = null;
            IMediaProcessor taskMediaProcessor = null;
            string taskConfiguration = null;
            IAsset taskInputAsset = null;
            string taskOutputAssetName = null;
            bool jobSubmitted = false;
            bool getExecutionProgressTaskCalled = false;

            using (ShimsContext.Create())
            {
                var outputAsset = new StubIAsset();

                var task = new StubITask();

                var tasks = new ShimTaskCollection
                                {
                                    AddNewStringIMediaProcessorStringTaskOptions =
                                        (taskName, processor, configuration, taskOptions) =>
                                            {
                                                taskMediaProcessor = processor;
                                                taskConfiguration = configuration;

                                                task.NameGet = () => taskName;

                                                return task;
                                            }
                                };

                var inputAssets = new ShimInputAssetCollection<IAsset> { AddT0 = asset => taskInputAsset = asset };
                var outputAssets = new ShimOutputAssetCollection
                                       {
                                           AddNewStringAssetCreationOptions =
                                               (outputAssetName, assetCreationOptions) =>
                                                   {
                                                       taskOutputAssetName = outputAssetName;
                                                       outputAsset.NameGet =
                                                           () => outputAssetName;
                                                       return outputAsset;
                                                   }
                                       };

                task.InputAssetsGet = () => inputAssets;
                task.OutputAssetsGet = () => outputAssets;

                var job = new StubIJob
                              {
                                  TasksGet = () => tasks,
                                  SubmitAsync = () =>
                                      {
                                          jobSubmitted = true;
                                          return Task.Delay(0);
                                      },
                                  GetExecutionProgressTaskCancellationToken = token =>
                                      {
                                          getExecutionProgressTaskCalled = true;

                                          return Task.Delay(0);
                                      }
                              };

                var jobs = new List<IJob>();
                var collection = new ShimJobBaseCollection
                                     {
                                         CreateString = name =>
                                             {
                                                 jobName = name;
                                                 job.NameGet = () => name;
                                                 return job;
                                             }
                                     };

                collection.Bind(jobs.AsQueryable());

                var mediaProcessors = new List<IMediaProcessor> { mediaProcessor };
                var mediaProcessorsCollection = new ShimMediaProcessorBaseCollection();
                mediaProcessorsCollection.Bind(mediaProcessors.AsQueryable());

                var context = new ShimCloudMediaContext
                                  {
                                      JobsGet = () => collection,
                                      MediaProcessorsGet = () => mediaProcessorsCollection
                                  };

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

                var encoder = new AzureMediaServicesEncoder(
                    JobName, inputAsset, Configuration, OutputAssetName, createContext);

                await encoder.Start();
            }

            Assert.AreEqual(JobName, jobName);
            Assert.AreEqual(Configuration, taskConfiguration);
            Assert.AreEqual(mediaProcessor, taskMediaProcessor);
            Assert.AreEqual(inputAsset, taskInputAsset);
            Assert.AreEqual(OutputAssetName, taskOutputAssetName);
            Assert.IsTrue(jobSubmitted);
            Assert.IsTrue(getExecutionProgressTaskCalled);
        }