private void InitialiseUpdateChecker() { var updateCfg = ConfigManager.Config.Application.UpdateChecking; if (!updateCfg.CheckForUpdates) { return; } IUpdateSource updateSource; switch (updateCfg.UpdateSource) { case UpdateSource.GitHub: updateSource = new GitHubUpdateSource(); break; case UpdateSource.Chocolatey: updateSource = new ChocolateyUpdateSource(); break; case UpdateSource.Dummy: updateSource = new DummyUpdateSource { Versions = new List <ProgramVersion> { new ProgramVersion { VersionNumber = new SemanticVersion(10, 0, 0), Important = true, }, new ProgramVersion { VersionNumber = SemanticVersion.Parse("v11.0-pre1", ParseMode.Lenient), IsPrerelease = true, }, } }; break; default: throw new ArgumentOutOfRangeException(null, "Invalid update provider."); } var versionString = Version.Split('-').First(); updateChecker = new UpdateChecker(updateSource, SemanticVersion.Parse(versionString, ParseMode.Lenient), updateCfg.AllowPrereleases, updateCfg.CheckIntervalTimeSpan, updateCfg.InitialDelayTimeSpan); updateChecker.UpdateAvailable += (sender, args) => { notificationService.HandleUpdateAvailable(args); }; updateChecker.Start(); }
public void UpdateChecker_RaisesAfterSpecifiedTime() { const int checkBeforeMs = 800; const int raiseAfterMs = 1000; const int checkAgainMs = 400; const int checkAttempts = 10; var source = new DummyUpdateSource { Versions = new List <ProgramVersion> { new ProgramVersion { VersionNumber = new SemanticVersion(1, 0, 1) } } }; var checker = new UpdateChecker(source, new SemanticVersion(1, 0, 0), false, TimeSpan.FromMilliseconds(raiseAfterMs)); var raised = false; checker.UpdateAvailable += (sender, args) => { raised = true; }; checker.Start(); // Validate that the event is not raised before the time specified in raiseAfterMs has expired. Thread.Sleep(checkBeforeMs); Assert.False(raised, "Notification was raised before update interval expired"); // Validate that the event has been raised now. Thread.Sleep(checkAgainMs); for (int i = 0; i < checkAttempts && !raised; i++) { Thread.Sleep(checkAgainMs); } Assert.True(raised, "Notification was not raised"); }
/// <summary> /// Checks whether supplying a given update version against a given base version raises an update-available event. /// </summary> private bool RaisesEvent(SemanticVersion currentVersion, SemanticVersion updateVersion) { var source = new DummyUpdateSource { Versions = new List <ProgramVersion> { new ProgramVersion { VersionNumber = updateVersion } } }; var checker = new UpdateChecker(source, currentVersion, false, TimeSpan.FromMilliseconds(1)); var raised = false; checker.UpdateAvailable += (sender, args) => { raised = true; checker.Dispose(); }; checker.Start(); // Wait a while to see if the event is raised. for (var i = 0; i < 20; i++) { Thread.Sleep(50); if (raised) { return(true); } } return(raised); }
public void UpdateChecker_UpdatesPreReleases() { var current = SemanticVersion.Parse("2.0.0-pre2", ParseMode.Lenient); var sourceWithNewPrerelease = new DummyUpdateSource { Versions = new List <ProgramVersion> { new ProgramVersion { VersionNumber = SemanticVersion.Parse("2.0.0-pre2"), IsPrerelease = true }, new ProgramVersion { VersionNumber = SemanticVersion.Parse("2.0.0-pre3"), IsPrerelease = true }, // Versions may be specified in any order new ProgramVersion { VersionNumber = SemanticVersion.Parse("2.0.0-pre1"), IsPrerelease = true } } }; using (var checker = new UpdateChecker(sourceWithNewPrerelease, current, true, TimeSpan.FromMilliseconds(1))) { AssertUpdateCheck(checker, (sender, args) => { Assert.Equal(args.Version.VersionNumber, SemanticVersion.Parse("2.0.0-pre3", ParseMode.Lenient)); }); } // Ensure we get back the final release, even if it's specified as a pre-release. var sourceWithFinalRelease = new DummyUpdateSource { Versions = new List <ProgramVersion> { new ProgramVersion { VersionNumber = SemanticVersion.Parse("2.0.0-pre3"), IsPrerelease = true }, new ProgramVersion { VersionNumber = SemanticVersion.Parse("2.0.0-pre2"), IsPrerelease = true }, new ProgramVersion { VersionNumber = SemanticVersion.Parse("2.0.0-pre1"), IsPrerelease = true }, new ProgramVersion { VersionNumber = SemanticVersion.Parse("2.0.0-pre4"), IsPrerelease = true }, new ProgramVersion { VersionNumber = SemanticVersion.Parse("2.0.0"), IsPrerelease = true } } }; using (var checker = new UpdateChecker(sourceWithFinalRelease, current, true, TimeSpan.FromMilliseconds(1))) { AssertUpdateCheck(checker, (sender, args) => { Assert.Equal(args.Version.VersionNumber, SemanticVersion.Parse("2.0.0", ParseMode.Lenient)); }); } }
public void UpdateChecker_ProvidesCorrectReleaseType() { var sourceWithNewerPrerelease = new DummyUpdateSource { Versions = new List <ProgramVersion> { new ProgramVersion { VersionNumber = new SemanticVersion(3, 0, 0), IsPrerelease = true }, new ProgramVersion { VersionNumber = new SemanticVersion(2, 0, 0), } } }; var sourceWithOlderPrerelease = new DummyUpdateSource { Versions = new List <ProgramVersion> { new ProgramVersion { VersionNumber = new SemanticVersion(3, 0, 0), }, new ProgramVersion { VersionNumber = new SemanticVersion(2, 0, 0), IsPrerelease = true }, new ProgramVersion { VersionNumber = new SemanticVersion(1, 0, 0) } } }; // An update checker that may not return prereleases should return the latest non-prerelease version. using (var checker = new UpdateChecker(sourceWithNewerPrerelease, new SemanticVersion(1, 0, 0), false, TimeSpan.FromMilliseconds(1))) { AssertUpdateCheck(checker, (sender, args) => { Assert.False(args.Version.IsPrerelease); Assert.Equal(args.Version.VersionNumber, new SemanticVersion(2, 0, 0)); }); } // An update checker that may return prereleases should return a prerelease if it's the latest version. using (var checker = new UpdateChecker(sourceWithNewerPrerelease, new SemanticVersion(1, 0, 0), true, TimeSpan.FromMilliseconds(1))) { AssertUpdateCheck(checker, (sender, args) => { Assert.True(args.Version.IsPrerelease); Assert.Equal(args.Version.VersionNumber, new SemanticVersion(3, 0, 0)); }); } // An update checker that may return prereleases should not return a prerelease if there's a newer general release. using (var checker = new UpdateChecker(sourceWithOlderPrerelease, new SemanticVersion(1, 0, 0), true, TimeSpan.FromMilliseconds(1))) { AssertUpdateCheck(checker, (sender, args) => { Assert.False(args.Version.IsPrerelease); Assert.Equal(args.Version.VersionNumber, new SemanticVersion(3, 0, 0)); }); } }