public void Should_NotEnterDonwloadingState_When_NoUpdatesAvailable()
        {
            var session = new UpdateSessionFake(true);

            var update1 = new UpdateFake("update1", true);

            update1.IsInstalled  = true;
            update1.IsDownloaded = false;
            var update2 = new UpdateFake("update2", true);

            update2.IsDownloaded = true;


            using (WuApiController wu = new WuApiController(session, UpdateCollectionFactory, SystemInfo))
            {
                try
                {
                    wu.BeginDownloadUpdates(); // nerver searched for updates, no updates should be available
                    Assert.Fail("exception expected");
                }
                catch (InvalidStateTransitionException) { }

                session.SearcherMock.FakeSearchResult = CommonMocks.GetSearchResult(ToUpdateCollection(update1, update2));
                wu.BeginSearchUpdates();
                WaitForStateChange(wu, WuStateId.SearchCompleted);

                try
                {
                    wu.BeginDownloadUpdates(); // available updates are already installed or downloaded
                    Assert.Fail("exception expected");
                }
                catch (InvalidStateTransitionException) { }
            }
        }
        public void Should_EnterDownloadFailedState_When_DownloadFailed()
        {
            var session = new UpdateSessionFake(true);

            session.SearcherMock.FakeSearchResult = CommonMocks.GetSearchResult(ToUpdateCollection(new UpdateFake("update1", true)));

            List <IDownloadResult> results = new List <IDownloadResult>();

            results.Add(CommonMocks.GetDownloadResult(OperationResultCode.orcFailed));
            results.Add(CommonMocks.GetDownloadResult(OperationResultCode.orcAborted));
            results.Add(CommonMocks.GetDownloadResult(OperationResultCode.orcNotStarted));

            foreach (var result in results)
            {
                session.DownloaderMock.FakeDownloadResult = result;
                using (WuApiController wu = new WuApiController(session, UpdateCollectionFactory, SystemInfo))
                {
                    wu.AutoAcceptEulas = true;
                    wu.BeginSearchUpdates();
                    WaitForStateChange(wu, WuStateId.SearchCompleted);
                    wu.BeginDownloadUpdates();
                    WaitForStateChange(wu, WuStateId.DownloadFailed);
                }
            }
        }
        public void Should_AcceptEulas_When_BeginDownloadingAndAutoAcceptEnabled()
        {
            var session = new UpdateSessionFake(true);

            var update1 = new UpdateFake("update1", true);

            update1.EulaAccepted = false;
            var update2 = new UpdateFake("update2", true);

            update2.EulaAccepted = true;
            session.SearcherMock.FakeSearchResult = CommonMocks.GetSearchResult(ToUpdateCollection(update1, update2));

            using (WuApiController wu = new WuApiController(session, UpdateCollectionFactory, SystemInfo))
            {
                wu.AutoAcceptEulas = true;
                wu.BeginSearchUpdates();
                WaitForStateChange(wu, WuStateId.SearchCompleted);
                wu.BeginDownloadUpdates();
                WaitForStateChange(wu, WuStateId.DownloadCompleted);
                Assert.IsTrue(update1.EulaAccepted);
                Assert.IsTrue(update2.EulaAccepted);
                Assert.AreEqual(wu.GetAvailableUpdates().Count, 2);
                Assert.IsTrue(wu.GetAvailableUpdates().All(u => u.IsDownloaded && u.EulaAccepted));
            }
        }
        public void Should_NotDownloadInstalledUpdates_When_DownloadUpdates()
        {
            var session = new UpdateSessionFake(true);

            var update1 = new UpdateFake("update1", true);

            update1.IsInstalled  = false;
            update1.IsDownloaded = false;
            var update2 = new UpdateFake("update2", true);

            update2.IsInstalled  = false;
            update2.IsDownloaded = false;
            session.SearcherMock.FakeSearchResult = CommonMocks.GetSearchResult(ToUpdateCollection(update1, update2));

            using (WuApiController wu = new WuApiController(session, UpdateCollectionFactory, SystemInfo))
            {
                wu.AutoAcceptEulas = true;
                wu.BeginSearchUpdates();
                WaitForStateChange(wu, WuStateId.SearchCompleted);
                update1.IsInstalled = true;
                wu.BeginDownloadUpdates();
                WaitForStateChange(wu, WuStateId.DownloadCompleted);
                Assert.AreEqual(wu.GetAvailableUpdates().Count, 2);
                Assert.IsNotNull(wu.GetAvailableUpdates().SingleOrDefault(u => u.ID.Equals("update1") && !u.IsDownloaded && u.IsInstalled));
                Assert.IsNotNull(wu.GetAvailableUpdates().SingleOrDefault(u => u.ID.Equals("update2") && u.IsDownloaded && !u.IsInstalled));
            }
        }
        public void Should_NotAcceptEula_When_UpdateIsNotSelected()
        {
            UpdateSessionFake session = new UpdateSessionFake(true);

            var update1 = new UpdateFake("update1", false);
            var update2 = new UpdateFake("update2", false);

            session.SearcherMock.FakeSearchResult = CommonMocks.GetSearchResult(ToUpdateCollection(update1, update2));
            update1.EulaAccepted = false;
            update2.EulaAccepted = false;

            using (WuApiController wu = new WuApiController(session, UpdateCollectionFactory, SystemInfo))
            {
                wu.AutoAcceptEulas   = true;
                wu.AutoSelectUpdates = false;

                wu.BeginSearchUpdates();
                WaitForStateChange(wu, WuStateId.SearchCompleted);
                wu.SelectUpdate(update2.Identity.UpdateID);
                wu.BeginDownloadUpdates();
                WaitForStateChange(wu, WuStateId.DownloadCompleted);

                var updates = wu.GetAvailableUpdates();

                Assert.IsFalse(updates.Single(u => u.ID.Equals("update1")).SelectedForInstallation);
                Assert.IsFalse(updates.Single(u => u.ID.Equals("update1")).EulaAccepted);
                Assert.IsTrue(updates.Single(u => u.ID.Equals("update2")).EulaAccepted);
                Assert.IsTrue(updates.Single(u => u.ID.Equals("update2")).SelectedForInstallation);
            }
        }
        public void Should_ThrowException_When_TimeoutValueIsToHigh()
        {
            UpdateSessionFake session = new UpdateSessionFake(true);

            session.SearcherMock.FakeSearchResult = CommonMocks.GetSearchResult(ToUpdateCollection(new UpdateFake("update1", true)));

            int max        = int.MaxValue / 1000;
            int outOfRange = max + 1;

            using (WuApiController wu = new WuApiController(session, UpdateCollectionFactory, SystemInfo))
            {
                wu.AutoAcceptEulas = true;

                try
                {
                    wu.BeginSearchUpdates(outOfRange);
                    Assert.Fail("exception expected");
                }
                catch (ArgumentOutOfRangeException) { }
                wu.BeginSearchUpdates(max);
                WaitForStateChange(wu, WuStateId.SearchCompleted);

                try
                {
                    wu.BeginDownloadUpdates(outOfRange);
                    Assert.Fail("exception expected");
                }
                catch (ArgumentOutOfRangeException) { }
                wu.BeginDownloadUpdates(max);
                WaitForStateChange(wu, WuStateId.DownloadCompleted);

                try
                {
                    wu.BeginInstallUpdates(outOfRange);
                    Assert.Fail("exception expected");
                }
                catch (ArgumentOutOfRangeException) { }
                wu.BeginInstallUpdates(max);
                WaitForStateChange(wu, WuStateId.InstallCompleted);
            }
        }
        public void Should_EnterDownloadCompletedState_When_DownloadCompleted()
        {
            var session = new UpdateSessionFake(true);

            session.SearcherMock.FakeSearchResult = CommonMocks.GetSearchResult(ToUpdateCollection(new UpdateFake("update1", true)));

            using (WuApiController wu = new WuApiController(session, UpdateCollectionFactory, SystemInfo))
            {
                wu.AutoAcceptEulas = true;
                wu.BeginSearchUpdates();
                WaitForStateChange(wu, WuStateId.SearchCompleted);
                wu.BeginDownloadUpdates();
                WaitForStateChange(wu, WuStateId.DownloadCompleted);
            }
        }
        public void Should_EnterDownloadFailedState_When_AbortDownload()
        {
            var session = new UpdateSessionFake(true);

            session.SearcherMock.FakeSearchResult     = CommonMocks.GetSearchResult(ToUpdateCollection(new UpdateFake("update1", true)));
            session.DownloaderMock.FakeDownloadTimeMs = 10000;

            using (WuApiController wu = new WuApiController(session, UpdateCollectionFactory, SystemInfo))
            {
                wu.AutoAcceptEulas = true;
                wu.BeginSearchUpdates();
                WaitForStateChange(wu, WuStateId.SearchCompleted);
                wu.BeginDownloadUpdates();
                Assert.AreEqual(WuStateId.DownloadFailed, wu.AbortDownloadUpdates());
                Assert.AreEqual(WuStateId.DownloadFailed, wu.GetWuStatus().StateId);
            }
        }
        public void Should_NotEnterDownloadingState_When_NotEnoughFreeSpaceAvailable()
        {
            var system    = MoqFactory.Create <ISystemInfo>(MockBehavior.Loose);
            int freespace = 100;

            system.Setup(s => s.GetFreeSpace()).Returns(freespace);
            system.Setup(s => s.GetFQDN()).Returns("fqdn");
            system.Setup(s => s.GetOperatingSystemName()).Returns("osname");
            system.Setup(s => s.GetWuServer()).Returns("update server");
            system.Setup(s => s.GetTargetGroup()).Returns("target group");

            UpdateFake update = new UpdateFake("update1");

            update.IsMandatory     = true;
            update.EulaAccepted    = true;
            update.MaxDownloadSize = freespace;
            UpdateFake update2 = new UpdateFake("update2");

            update2.IsMandatory              = true;
            update2.EulaAccepted             = true;
            update2.RecommendedHardDiskSpace = 10;

            IUpdateCollection updateCollection = ToUpdateCollection(update, update2);

            var session = new UpdateSessionFake(true);

            session.SearcherMock.FakeSearchResult = CommonMocks.GetSearchResult(updateCollection);

            WuApiController wu = new WuApiController(session, UpdateCollectionFactory, system.Object);

            wu.BeginSearchUpdates();
            WaitForStateChange(wu, WuStateId.SearchCompleted);

            try
            {
                wu.BeginDownloadUpdates();
                Assert.Fail("exception expected");
            }
            catch (InvalidStateTransitionException e)
            {
                Assert.IsTrue(e.Message.Contains("free space"));
                Assert.IsTrue(wu.GetWuStatus().Equals(WuStateId.SearchCompleted));
            }
        }
        public void Should_EnterDownloadFailedState_When_DownloadTimeRunsOut()
        {
            UpdateFake        update           = new UpdateFake("update1", true);
            IUpdateCollection updateCollection = ToUpdateCollection(update);

            var session = new UpdateSessionFake(true);

            session.SearcherMock.FakeSearchResult     = CommonMocks.GetSearchResult(updateCollection);
            session.DownloaderMock.FakeDownloadTimeMs = 10000;

            using (WuApiController wu = new WuApiController(session, UpdateCollectionFactory, SystemInfo))
            {
                wu.AutoAcceptEulas = true;
                wu.BeginSearchUpdates();
                WaitForStateChange(wu, WuStateId.SearchCompleted);
                wu.BeginDownloadUpdates(1);
                WaitForStateChange(wu, WuStateId.DownloadFailed, 2000);
                Assert.IsTrue(wu.GetWuStatus().Description.Contains("Timeout"));
            }
        }
        public void Should_FireProgressChangedEvent_When_ProgressHasChanged()
        {
            var session = new UpdateSessionFake(true);

            var u1 = new UpdateFake("1", true);
            var u2 = new UpdateFake("2", true);

            List <Action> asserts = new List <Action>(); // assert in others threads will not be caught

            session.SearcherMock.FakeSearchResult     = CommonMocks.GetSearchResult(ToUpdateCollection(u1, u2));
            session.DownloaderMock.FakeDownloadTimeMs = 101;

            using (WuApiController wu = new WuApiController(session, UpdateCollectionFactory, SystemInfo))
            {
                wu.AutoAcceptEulas = true;
                wu.BeginSearchUpdates();
                WaitForStateChange(wu, WuStateId.SearchCompleted);
                wu.BeginDownloadUpdates();

                wu.OnProgressChanged += (sender, args) =>
                {
                    if (args.Progress.CurrentUpdate.ID == u1.Identity.UpdateID)
                    {
                        asserts.Add(() => { Assert.AreEqual(args.Progress.CurrentIndex, 0); });
                        asserts.Add(() => { Assert.AreEqual(args.Progress.Count, 2); });
                    }
                    else if (args.Progress.CurrentUpdate.ID == u2.Identity.UpdateID)
                    {
                        asserts.Add(() => { Assert.AreEqual(args.Progress.CurrentIndex, 1); });
                        asserts.Add(() => { Assert.AreEqual(args.Progress.Count, 2); });
                    }
                    else
                    {
                        asserts.Add(() => { Assert.Fail("unkown update"); });
                    }
                };
                WaitForStateChange(wu, WuStateId.DownloadCompleted);
                asserts.ForEach(a => a()); // fire asserts
            }
        }
        public void Should_FireAsyncOperationCompletedEvent_When_AsyncOperationCompleted()
        {
            var session = new UpdateSessionFake(true);

            session.SearcherMock.FakeSearchResult = CommonMocks.GetSearchResult(ToUpdateCollection(new UpdateFake("u", true)));
            using (WuApiController wu = new WuApiController(session, UpdateCollectionFactory, SystemInfo))
            {
                wu.AutoAcceptEulas = true;

                ManualResetEvent eventSignal = new ManualResetEvent(false);
                AsyncOperation   result      = AsyncOperation.Installing;
                wu.OnAsyncOperationCompleted += (sender, args) => { result = args.Operation; eventSignal.Set(); };

                eventSignal.Reset();
                wu.BeginSearchUpdates();
                if (!eventSignal.WaitOne(1000))
                {
                    Assert.Fail("expected event not fired");
                }
                Assert.AreEqual(AsyncOperation.Searching, result);

                eventSignal.Reset();
                wu.BeginDownloadUpdates();
                if (!eventSignal.WaitOne(1000))
                {
                    Assert.Fail("expected event not fired");
                }
                Assert.AreEqual(AsyncOperation.Downloading, result);

                eventSignal.Reset();
                wu.BeginInstallUpdates();
                if (!eventSignal.WaitOne(1000))
                {
                    Assert.Fail("expected event not fired");
                }
                Assert.AreEqual(AsyncOperation.Installing, result);
            }
        }