private void RunUpgrade()
        {
            var strategy = UserUpgradeStrategy.Create();

            if (strategy == null)
            {
                return;
            }

            if (strategy.TotalSteps < 5 || null == (_dialogView = CreateDialog()))
            {
                strategy.Run();
                return;
            }

            var task = new BackgroundTask(
                delegate(IBackgroundTaskContext context)
            {
                strategy.ProgressChanged += (sender, e) => context.ReportProgress(new BackgroundTaskProgress(strategy.CurrentStep - 1, strategy.TotalSteps, String.Empty));
                strategy.Run();
                context.Complete();
            }, false, strategy);

            task.ProgressUpdated += (sender, e) => _dialogView.SetProgressPercent(e.Progress.Percent);
            task.Terminated      += (sender, e) => _dialogView.Close(strategy.FailedCount > 0 ? SR.MessageUserUpgradeFailures : null);
            task.Run();

            _dialogView.RunModal(SR.TitleUpdatingPreferences, SR.MessageUpdatingPreferences);
            task.Dispose();
        }
        public void TestUnsupportedEvidence()
        {
            const string previousInstallDir = @"C:\Program Files\ACME Laboratories\ExperimentalRats";
            const string appDataPath        = @"C:\Documents and Settings\Snowball\LocalSettings\AppData\ACME Laboratories\Acme.Laboratories.Exper_Url_abcdefghijklmnopqrstuvwxyz012345\3.0.0.0\user.config";

            var evidence  = new Evidence();
            var altFolder = UserUpgradeStrategy.GetAlternateAppSettingsFolder(previousInstallDir, evidence, appDataPath);

            Assert.IsNullOrEmpty(altFolder, "app domain without url in evidence is unusual, and we don't have any data points to back up any implementation, so we don't implement it!");
        }
        public void TestAltFolderOnSlashesNoPreviousInstallDirectory()
        {
            const string appDataPath     = @"C:\Documents and Settings\Snowball\LocalSettings\AppData\ACME Laboratories\Acme.Laboratories.Exper_Url_2vbxhp2udm4o5dcwujyvygdqgjfgjfvn\3.0.0.0\user.config";
            const string assemblyName    = "Acme.Laboratories.Experimental.Rat.TheBrain";
            const string assemblyVersion = "2.1.0.1";
            const string assemblyUrl     = @"file:///C:\Program Files\ACME Laboratories\ExperimentalRats\TheBrain.exe";

            var evidence  = CreateAppDomainEvidence(assemblyName, assemblyVersion, assemblyUrl, false);
            var altFolder = UserUpgradeStrategy.GetAlternateAppSettingsFolder(null, evidence, appDataPath);

            Assert.AreEqual("Acme.Laboratories.Exper_Url_kgyle1vbltt4mwwk4hgjgr1z52ofp1u0", altFolder, "getting the old path (with forward slashes) if the current path is based on backslashes");
        }
        public void TestSameAsCurrentFolderNoPreviousInstallDirectory()
        {
            const string appDataPath     = @"C:\Documents and Settings\Snowball\LocalSettings\AppData\ACME Laboratories\Acme.Laboratories.Exper_Url_kgyle1vbltt4mwwk4hgjgr1z52ofp1u0\3.0.0.0\user.config";
            const string assemblyName    = "Acme.Laboratories.Experimental.Rat.TheBrain";
            const string assemblyVersion = "2.1.0.1";
            const string assemblyUrl     = @"file:///C:/Program Files/ACME Laboratories/ExperimentalRats/TheBrain.exe";

            var evidence  = CreateAppDomainEvidence(assemblyName, assemblyVersion, assemblyUrl, false);
            var altFolder = UserUpgradeStrategy.GetAlternateAppSettingsFolder(null, evidence, appDataPath);

            Assert.IsNullOrEmpty(altFolder, "should return null when alt path is exactly the same as current path");
        }
        public void TestPathCaseInsensitive2()
        {
            const string appDataPath     = @"C:\Documents and Settings\Snowball\LocalSettings\AppData\ACME Laboratories\Acme.Laboratories.Exper_Url_abcdefghijklmnopqrstuvwxyz012345\3.0.0.0\user.config";
            const string assemblyName    = "Acme.Laboratories.Experimental.Rat.TheBrain";
            const string assemblyVersion = "2.1.0.1";
            const string assemblyUrl     = @"FILE:///c:/program Files/ACME Laboratories/ExperimentalRats/thebrain.EXE";

            var evidence  = CreateAppDomainEvidence(assemblyName, assemblyVersion, assemblyUrl, false);
            var altFolder = UserUpgradeStrategy.GetAlternateAppSettingsFolder(null, evidence, appDataPath);

            Assert.AreEqual("Acme.Laboratories.Exper_Url_kgyle1vbltt4mwwk4hgjgr1z52ofp1u0", altFolder, "assembly url should be case insensitive");
        }
        public void TestStrongNameEvidence()
        {
            const string previousInstallDir = @"C:\Program Files\ACME Laboratories\ExperimentalRats";
            const string appDataPath        = @"C:\Documents and Settings\Snowball\LocalSettings\AppData\ACME Laboratories\Acme.Laboratories.Exper_Url_abcdefghijklmnopqrstuvwxyz012345\3.0.0.0\user.config";
            const string assemblyName       = "Acme.Laboratories.Experimental.Rat.TheBrain";
            const string assemblyVersion    = "2.1.0.1";
            const string assemblyUrl        = @"file:///C:/Program Files/ACME Laboratories/ExperimentalRats/TheBrain.exe";

            var evidence  = CreateAppDomainEvidence(assemblyName, assemblyVersion, assemblyUrl, true);
            var altFolder = UserUpgradeStrategy.GetAlternateAppSettingsFolder(previousInstallDir, evidence, appDataPath);

            Assert.IsNullOrEmpty(altFolder, "strong named entry assembly should not have an alt folder");
        }
        public void TestInstallFolderChanged3()
        {
            const string previousInstallDir = @"C:\Program Files\ACME Labs\Rats\";             // note the different slashes, trailing slash and capitalization
            const string appDataPath        = @"C:\Documents and Settings\Snowball\LocalSettings\AppData\ACME Laboratories\Acme.Laboratories.Exper_Url_kgyle1vbltt4mwwk4hgjgr1z52ofp1u0\3.0.0.0\user.config";
            const string assemblyName       = "Acme.Laboratories.Experimental.Rat.TheBrain";
            const string assemblyVersion    = "2.1.0.1";
            const string assemblyUrl        = @"file:///C:/program Files/ACME Laboratories/ExperimentalRats/TheBrain.exe";

            var evidence  = CreateAppDomainEvidence(assemblyName, assemblyVersion, assemblyUrl, false);
            var altFolder = UserUpgradeStrategy.GetAlternateAppSettingsFolder(previousInstallDir, evidence, appDataPath);

            Assert.AreEqual("Acme.Laboratories.Exper_Url_gyj1vfoawarsonr4ssufrpzggih1qwle", altFolder, "should find correct former install directory");
        }
        public void TestDistinctAltFolder()
        {
            const string previousInstallDir = @"C:\Program Files\ACME Laboratories\ExperimentalRats";
            const string appDataPath        = @"C:\Documents and Settings\Snowball\LocalSettings\AppData\ACME Laboratories\Acme.Laboratories.Exper_Url_abcdefghijklmnopqrstuvwxyz012345\3.0.0.0\user.config";
            const string assemblyName       = "Acme.Laboratories.Experimental.Rat.TheBrain";
            const string assemblyVersion    = "2.1.0.1";
            const string assemblyUrl        = @"file:///C:/Program Files/ACME Laboratories/ExperimentalRats/TheBrain.exe";

            var evidence  = CreateAppDomainEvidence(assemblyName, assemblyVersion, assemblyUrl, false);
            var altFolder = UserUpgradeStrategy.GetAlternateAppSettingsFolder(previousInstallDir, evidence, appDataPath);

            Assert.AreEqual("Acme.Laboratories.Exper_Url_kgyle1vbltt4mwwk4hgjgr1z52ofp1u0", altFolder, "getting the old path when the current path is based on some unknown (in this case, dummy) hashing");
        }
        public void TestRandomEvidenceHashes()
        {
            var rng  = new PseudoRandom(0x262E5635);
            var data = new byte[512];

            using (var sha1 = new SHA1CryptoServiceProvider())
                using (var ms = new MemoryStream())
                {
                    var bf = new BinaryFormatter();
                    for (var n = 0; n < 10000; ++n)
                    {
                        rng.NextBytes(data);
                        var evidenceInfo = Convert.ToBase64String(data);

                        ms.SetLength(0);
                        bf.Serialize(ms, evidenceInfo);
                        var expectedHash = ToBase32(sha1.ComputeHash(ms.ToArray()));
                        var actualHash   = UserUpgradeStrategy.ComputeEvidenceHash(evidenceInfo);

                        Assert.AreEqual(expectedHash, actualHash, "n = {0}", n);
                    }
                }
        }
 public void TestKnownEvidenceHashes()
 {
     Assert.AreEqual("bxushgmob2kgr2bbhnkomw10ycdtxyd1", UserUpgradeStrategy.ComputeEvidenceHash(@"file:///c:/program files/clearcanvas/clearcanvas workstation/clearcanvas.desktop.executable.exe".ToUpperInvariant()));
     Assert.AreEqual("h4r1xj22u5jcc205qirm1uq5sdyih1a5", UserUpgradeStrategy.ComputeEvidenceHash(@"file:///c:\Program Files\ClearCanvas\ClearCanvas Workstation\ClearCanvas.Desktop.Executable.exe".ToUpperInvariant()));
 }