public void CancelAllJobsAndExit_Exits()
        {
            // arrange
            int taskStartCount = 0;

            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();

            // act
            A.CallTo(() => MockTaskPool.RunAllTasks(A <int> .Ignored, A <ITask[]> .Ignored))
            .Invokes(() =>
            {
                taskStartCount++;
                if (taskStartCount > 1)
                {
                    throw new Exception("Concurrent calls are not being trapped");
                }
                ViewModel.RequestExit();
                ViewModel.CancelAllJobsAndExit();
            });
            ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            A.CallTo(() => MockTaskPool.CancelAllTasks()).MustHaveHappened(1, Times.Exactly);
            Assert.AreEqual(1, ObservedResults.ExitCount, "exit count");
        }
        public void RequestExit_Prompts()
        {
            // arrange
            bool result         = true;
            int  taskStartCount = 0;

            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();

            // act
            A.CallTo(() => MockTaskPool.RunAllTasks(A <int> .Ignored, A <ITask[]> .Ignored))
            .Invokes(() =>
            {
                taskStartCount++;
                if (taskStartCount > 1)
                {
                    throw new Exception("Concurrent calls are not being trapped");
                }
                result = ViewModel.RequestExit();
            });
            ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            Assert.AreEqual(result, false, "result");
            Assert.AreEqual("dialog title", ObservedResults.LastExitPromptTitle, "exit prompt title");
            Assert.AreEqual("exit message", ObservedResults.LastExitPromptMessage, "exit prompt message");
            Assert.AreEqual("exit ok", ObservedResults.LastExitPromptOk, "exit prompt ok");
            Assert.AreEqual("exit cancel", ObservedResults.LastExitPromptCancel, "exit prompt cancel");
        }
        public void StatusUpdate_Exception()
        {
            // arrange
            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();
            var testException  = new Exception("TEST EXCEPTION");
            var syncItemMocker = SetupFireStatusEvent(EPISODE_1_ID, StatusUpdateLevel.Error, false, testException, "test exception");

            Fake.ClearRecordedCalls(MockStatusAndProgressMessageStore);
            Fake.ClearRecordedCalls(MockAnalyticsEngine);

            // act
            ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(testException)).MustHaveHappened(1, Times.Exactly);
            A.CallTo(() => MockStatusAndProgressMessageStore.StoreMessage(
                         A <Guid> .That.Matches(g => g.ToString() == EPISODE_1_ID.ToString()),
                         A <string> .That.Matches(s => s == "test exception")))
            .MustHaveHappened(1, Times.Exactly);
            A.CallTo(() => MockStatusAndProgressMessageStore.StoreMessage(
                         A <Guid> .That.Matches(g => g.ToString() == EPISODE_1_ID.ToString()),
                         A <string> .That.Matches(s => s == "System.Exception: TEST EXCEPTION")))
            .MustHaveHappened(1, Times.Exactly);
            Assert.AreEqual("test exception", ObservedResults.LastUpdateStatusMessage, "message");
            Assert.AreEqual(syncItemMocker.GetMockedSyncItem(), ObservedResults.LastUpdateStatusItem, "item");
            Assert.AreEqual(Status.Error, ObservedResults.LastUpdateStatus, "status");
            A.CallTo(MockAnalyticsEngine).MustNotHaveHappened();
        }
Example #4
0
        public void RefreshFilesystemInfo_Adds_DriveInfo_Sdcard_Paths()
        {
            // arrange
            SetupFileSystemStorageCardPaths();
            ViewModel.Initialise();

            // act
            ViewModel.RefreshFileSystemInfo();

            // assert
            // there are no errors
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();

            // file 1
            A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => "/storage/SDCARD1").MustHaveHappened(1, Times.Exactly);

            // file 2
            A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => "/storage/SDCARD2/anotherplace/").MustHaveHappened(1, Times.Exactly);

            // file 3
            A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => "/storage/SDCARD3").MustHaveHappened(1, Times.Exactly);

            // file 4
            A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => "/Android/data/").MustHaveHappened(1, Times.Exactly);

            // file 5
            A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => "/storage/emulated/0").MustHaveHappened(1, Times.Exactly);

            // all
            A.CallTo(() => MockDriveVolumeInfoView.GetView()).MustHaveHappened(5, Times.Exactly);
        }
        public void DownloadAllPodcastsWithoutNetworkCheck_HandlesMultipleCalls_Concurrent()
        {
            // arrange
            int taskStartCount = 0;

            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();
            A.CallTo(() => MockTaskPool.RunAllTasks(A <int> .Ignored, A <ITask[]> .Ignored))
            .Invokes(() =>
            {
                taskStartCount++;
                if (taskStartCount > 1)
                {
                    throw new Exception("Concurrent calls are not being trapped");
                }
                ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait();
            });

            // act
            ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            A.CallTo(() => MockLogger.Warning(A <ILogger.MessageGenerator> .Ignored)).MustHaveHappened(1, Times.Exactly);
            Assert.AreEqual(1, ObservedResults.StartDownloadingCount, "start count");
            Assert.AreEqual(1, ObservedResults.EndDownloadingCount, "end count");
            Assert.AreEqual(1, taskStartCount, "task start count");
        }
        public void GeneratePlaylist_CallsGenerate()
        {
            // arrange
            SetupMockControlFileFor1Podcast();
            ViewModel.Initialise();

            // act
            ViewModel.GeneratePlaylist();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            A.CallTo(() => MockPlaylistGenerator.GeneratePlaylist(MockControlFile, "/sdcard/sourceroot", true, A <EventHandler <StatusUpdateEventArgs> > .Ignored)).MustHaveHappened(1, Times.Exactly);
        }
Example #7
0
        public void LoadControlFile_LoadsFile()
        {
            // arrange
            Android.Net.Uri uri     = Android.Net.Uri.Parse("content://com.android.externalstorage.documents/document/primary%3APodcastUtilities%2FDerekPodcastsSmall2.xml");
            var             control = SetupRealControlFile(uri);

            ViewModel.Initialise();

            // act
            ViewModel.LoadContolFile(uri);

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            A.CallTo(() => MockApplicationControlFileProvider.ReplaceApplicationConfiguration(control)).MustHaveHappened(1, Times.Exactly);
        }
        public void RequestExit_DoesNotPrompts()
        {
            // arrange
            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();

            // act
            var result = ViewModel.RequestExit();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            Assert.AreEqual(result, true, "result");
        }
        public async Task DownloadAllPodcastsWithoutNetworkCheck_StartsAndStops()
        {
            // arrange
            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();

            // act
            await ViewModel.DownloadAllPodcastsWithoutNetworkCheck().ConfigureAwait(false);

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            Assert.AreEqual(1, ObservedResults.StartDownloadingCount, "start count");
            Assert.AreEqual(1, ObservedResults.EndDownloadingCount, "end count");
        }
        public async Task DownloadAllPodcastsWithoutNetworkCheck_SetsMaxDownloads()
        {
            // arrange
            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();

            // act
            await ViewModel.DownloadAllPodcastsWithoutNetworkCheck().ConfigureAwait(false);

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            A.CallTo(() => MockNetworkHelper.SetNetworkConnectionLimit(MAX_DOWNLOADS)).MustHaveHappened(1, Times.Exactly);
            A.CallTo(() => MockTaskPool.RunAllTasks(MAX_DOWNLOADS, A <ITask[]> .Ignored)).MustHaveHappened(1, Times.Exactly);
        }
        public void GeneratePlaylist_HandlesErrors()
        {
            // arrange
            SetupMockControlFileFor1Podcast();
            ViewModel.Initialise();
            var testException = new Exception();

            A.CallTo(() => MockPlaylistGenerator.GeneratePlaylist(A <IReadOnlyControlFile> .Ignored, A <string> .Ignored, A <bool> .Ignored, A <EventHandler <StatusUpdateEventArgs> > .Ignored)).Throws(testException);

            // act
            ViewModel.GeneratePlaylist();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(testException)).MustHaveHappened(1, Times.Exactly);
            Assert.AreEqual("Mocked playlist error", ObservedResults.LastToastMessage);
        }
        public void CancelAllJobsAndExit_CancelsJobs()
        {
            // arrange
            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();
            ViewModel.RequestExit();

            // act
            ViewModel.CancelAllJobsAndExit();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            A.CallTo(() => MockTaskPool.CancelAllTasks()).MustHaveHappened(1, Times.Exactly);
            Assert.AreEqual("cancelling", ObservedResults.LastDisplayMessage);
        }
Example #13
0
        public void LoadControlFile_HandlesErrors()
        {
            // arrange
            Android.Net.Uri uri     = Android.Net.Uri.Parse("content://com.android.externalstorage.documents/document/primary%3APodcastUtilities%2FDerekPodcastsSmall2.xml");
            var             control = SetupRealControlFile(uri);

            ViewModel.Initialise();
            var testException = new Exception();

            A.CallTo(() => MockApplicationControlFileFactory.CreateControlFile(A <XmlDocument> .Ignored)).Throws(testException);

            // act
            ViewModel.LoadContolFile(uri);

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(testException)).MustHaveHappened(1, Times.Exactly);
            Assert.AreEqual("Mocked control file error", ObservedResults.LastToastMessage);
        }
        public void ProgressUpdate_ChecksFreeSpace()
        {
            // arrange
            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();

            SetupFireProgressEvent(EPISODE_1_ID, 9);

            // act
            ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            A.CallTo(() => MockFileSystemHelper.GetAvailableFileSystemSizeInBytes(A <string> .Ignored)).MustHaveHappened(1, Times.Exactly);
            A.CallTo(() => MockTaskPool.CancelAllTasks()).MustNotHaveHappened();
        }
Example #15
0
        public void RefreshFilesystemInfo_Handles_Errors()
        {
            // arrange
            SetupFileSystem();
            ViewModel.Initialise();
            var testException = new Exception();

            A.CallTo(MockFileSystemHelper).Throws(testException);

            // act
            ViewModel.RefreshFileSystemInfo();

            // assert
            // writes the error to the logs
            A.CallTo(() => MockLogger.LogException(A <ILogger.MessageGenerator> .Ignored, testException)).MustHaveHappened(1, Times.Exactly);
            // writes the error to crshlytics
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustHaveHappened(1, Times.Exactly);
        }
        public void DownloadAllPodcastsWithoutNetworkCheck_HandlesMultipleCalls_Sequential()
        {
            // arrange
            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();

            // act
            ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait();
            ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            A.CallTo(() => MockLogger.Warning(A <ILogger.MessageGenerator> .Ignored)).MustNotHaveHappened();
            A.CallTo(() => MockTaskPool.RunAllTasks(A <int> .Ignored, A <ITask[]> .Ignored)).MustHaveHappened(2, Times.Exactly);
            Assert.AreEqual(2, ObservedResults.StartDownloadingCount, "start count");
            Assert.AreEqual(2, ObservedResults.EndDownloadingCount, "end count");
        }
        public void GeneratePlaylist_StatusUpdates()
        {
            // arrange
            SetupMockControlFileFor1Podcast();
            ViewModel.Initialise();
            A.CallTo(() => MockPlaylistGenerator.GeneratePlaylist(MockControlFile, "/sdcard/sourceroot", true, A <EventHandler <StatusUpdateEventArgs> > .Ignored))
            .Invokes((IReadOnlyControlFile control, string root, bool copy, EventHandler <StatusUpdateEventArgs> statusUpdateHandler) =>
            {
                statusUpdateHandler?.Invoke(this, new StatusUpdateEventArgs(StatusUpdateLevel.Status, "status message", true, null));
            });


            // act
            ViewModel.GeneratePlaylist();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            Assert.AreEqual("status message", ObservedResults.LastToastMessage);
        }
Example #18
0
        public void PurgeAllItems_HandlesException()
        {
            // arrange
            SetupMockControlFileFor2Podcasts();
            var dir = SetupMockPurgerWithRealItems();

            ViewModel.Initialise();
            ViewModel.FindItemsToDelete();
            var testException = new Exception("TEST EXCEPTION");

            A.CallTo(MockFileUtilities).Throws(testException);

            // act
            ViewModel.PurgeAllItems();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(testException)).MustHaveHappened(1, Times.Exactly);
            Assert.AreEqual("Error file.ext", ObservedResults.LastDisplayMessage);
        }
        public void ProgressUpdate_UpdatesProgress_Not_At_11()
        {
            // arrange
            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();
            var syncItemMocker = SetupFireProgressEvent(EPISODE_1_ID, 11);

            Fake.ClearRecordedCalls(MockStatusAndProgressMessageStore);

            // act
            ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            A.CallTo(MockStatusAndProgressMessageStore).MustNotHaveHappened();
            Assert.AreEqual(0, ObservedResults.LastUpdatePercentage, "percentage");
            Assert.IsNull(ObservedResults.LastUpdatePercentageItem, "item");
        }
        public async Task DownloadAllPodcastsWithoutNetworkCheck_HandlesException()
        {
            // arrange
            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();
            var testException = new Exception("TEST EXCEPTION");

            A.CallTo(() => MockTaskPool.RunAllTasks(A <int> .Ignored, A <ITask[]> .Ignored)).Throws(testException);

            // act
            await ViewModel.DownloadAllPodcastsWithoutNetworkCheck().ConfigureAwait(false);

            // assert
            Assert.AreEqual(1, ObservedResults.StartDownloadingCount, "start count");
            Assert.AreEqual(1, ObservedResults.EndDownloadingCount, "end count");
            A.CallTo(() => MockCrashReporter.LogNonFatalException(testException)).MustHaveHappened(1, Times.Exactly);
            A.CallTo(() => MockLogger.LogException(A <ILogger.MessageGenerator> .Ignored, testException)).MustHaveHappened(1, Times.Exactly);
            Assert.AreEqual("TEST EXCEPTION", ObservedResults.LastDisplayMessage);
        }
        public void StatusUpdate_StatusMessageVerboseDoesNotDisplay()
        {
            // arrange
            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();
            var syncItemMocker = SetupFireStatusEvent(EPISODE_1_ID, StatusUpdateLevel.Verbose, false, null, "test verbose");

            Fake.ClearRecordedCalls(MockStatusAndProgressMessageStore);
            Fake.ClearRecordedCalls(MockAnalyticsEngine);

            // act
            ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            Assert.IsNull(ObservedResults.LastUpdateStatusMessage, "message");
            Assert.IsNull(ObservedResults.LastUpdateStatusItem, "item");
            Assert.AreEqual(Status.OK, ObservedResults.LastUpdateStatus, "status");
            A.CallTo(MockStatusAndProgressMessageStore).MustNotHaveHappened();
            A.CallTo(MockAnalyticsEngine).MustNotHaveHappened();
        }
        public void ProgressUpdate_UpdatesProgress_At_10()
        {
            // arrange
            SetupMockControlFileFor2Podcasts();
            SetupEpisodesFor2Podcasts();
            ViewModel.Initialise();
            ViewModel.FindEpisodesToDownload();
            var syncItemMocker = SetupFireProgressEvent(EPISODE_1_ID, 10);

            Fake.ClearRecordedCalls(MockStatusAndProgressMessageStore);

            // act
            ViewModel.DownloadAllPodcastsWithoutNetworkCheck().Wait();

            // assert
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();
            A.CallTo(() => MockStatusAndProgressMessageStore.StoreMessage(
                         A <Guid> .That.Matches(g => g.ToString() == EPISODE_1_ID.ToString()),
                         A <string> .That.Matches(s => s == "EpisodeTitle (10 bytes of 100 bytes) 10%")))
            .MustHaveHappened(1, Times.Exactly);
            Assert.AreEqual(10, ObservedResults.LastUpdatePercentage, "percentage");
            Assert.AreEqual(syncItemMocker.GetMockedSyncItem(), ObservedResults.LastUpdatePercentageItem, "item");
        }
Example #23
0
        public void RefreshFilesystemInfo_Adds_DriveInfo_Before_An_Error()
        {
            // arrange
            SetupFileSystem();
            ViewModel.Initialise();
            // throw processing the second item
            var testException = new Exception();

            A.CallTo(() => MockFileSystemHelper.GetAvailableFileSystemSizeInBytes(PATH2)).Throws(testException);

            // act
            ViewModel.RefreshFileSystemInfo();

            // assert
            // writes the error to the logs
            A.CallTo(() => MockLogger.LogException(A <ILogger.MessageGenerator> .Ignored, testException)).MustHaveHappened(1, Times.Exactly);
            // writes the error to crshlytics
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustHaveHappened(1, Times.Exactly);

            // file 1
            A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => PATH1).MustHaveHappened(1, Times.Exactly);
            A.CallTo(() => MockDriveVolumeInfoView.SetSpace(100, 200, "100", "MB", "200", "MB")).MustHaveHappened(1, Times.Exactly);
            A.CallTo(() => MockDriveVolumeInfoView.GetView()).MustHaveHappened(1, Times.Exactly);
        }
Example #24
0
        public void RefreshFilesystemInfo_Adds_DriveInfo()
        {
            // arrange
            SetupFileSystem();
            ViewModel.Initialise();

            // act
            ViewModel.RefreshFileSystemInfo();

            // assert
            // there are no errors
            A.CallTo(() => MockCrashReporter.LogNonFatalException(A <Exception> .Ignored)).MustNotHaveHappened();

            // file 1
            A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => PATH1).MustHaveHappened(1, Times.Exactly);
            A.CallTo(() => MockDriveVolumeInfoView.SetSpace(100, 200, "100", "MB", "200", "MB")).MustHaveHappened(1, Times.Exactly);

            // file 2
            A.CallToSet(() => MockDriveVolumeInfoView.Title).To(() => PATH2).MustHaveHappened(1, Times.Exactly);
            A.CallTo(() => MockDriveVolumeInfoView.SetSpace(2000, 4000, "1.95", "GB", "3.91", "GB")).MustHaveHappened(1, Times.Exactly);

            // both
            A.CallTo(() => MockDriveVolumeInfoView.GetView()).MustHaveHappened(2, Times.Exactly);
        }