protected bool GetStreamsDiff(Database db1, Database db2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory) { bool difference = false; IList<string> streams1List = db1.ExecuteStringQuery("SELECT `Name` FROM `_Streams`"); IList<string> streams2List = db2.ExecuteStringQuery("SELECT `Name` FROM `_Streams`"); string[] streams1 = new string[streams1List.Count]; string[] streams2 = new string[streams2List.Count]; streams1List.CopyTo(streams1, 0); streams2List.CopyTo(streams2, 0); IComparer caseInsComp = CaseInsensitiveComparer.Default; Array.Sort(streams1, caseInsComp); Array.Sort(streams2, caseInsComp); for (int i1 = 0, i2 = 0; i1 < streams1.Length || i2 < streams2.Length; ) { int comp; if (i1 == streams1.Length) { comp = 1; } else if (i2 == streams2.Length) { comp = -1; } else { comp = caseInsComp.Compare(streams1[i1], streams2[i2]); } if(comp < 0) { diffOutput.WriteLine("{0}< {1}", linePrefix, streams1[i1]); i1++; difference = true; } else if(comp > 0) { diffOutput.WriteLine("{0}> {1}", linePrefix, streams2[i2]); i2++; difference = true; } else { if(streams1[i1] != ("" + ((char)5) + "SummaryInformation")) { string tempFile1 = Path.GetTempFileName(); string tempFile2 = Path.GetTempFileName(); using (View view = db1.OpenView(String.Format("SELECT `Data` FROM `_Streams` WHERE `Name` = '{0}'", streams1[i1]))) { view.Execute(); using (Record rec = view.Fetch()) { rec.GetStream(1, tempFile1); } } using (View view = db2.OpenView(String.Format("SELECT `Data` FROM `_Streams` WHERE `Name` = '{0}'", streams2[i2]))) { view.Execute(); using (Record rec = view.Fetch()) { rec.GetStream(1, tempFile2); } } IDiffEngine diffEngine = diffFactory.GetDiffEngine(tempFile1, tempFile2, options); StringWriter sw = new StringWriter(); if(diffEngine.GetDiff(tempFile1, tempFile2, options, sw, linePrefix + " ", diffFactory)) { diffOutput.WriteLine("{0}{1}", linePrefix, streams1[i1]); diffOutput.Write(sw.ToString()); difference = true; } File.Delete(tempFile1); File.Delete(tempFile2); } i1++; i2++; } } return difference; }
public void InstallerTransactTwoProducts() { string dbFile1 = "InstallerTransactProduct1.msi"; string dbFile2 = "InstallerTransactProduct2.msi"; string productCode1; string productCode2; using (Database db1 = new Database(dbFile1, DatabaseOpenMode.CreateDirect)) { WindowsInstallerUtils.InitializeProductDatabase(db1); WindowsInstallerUtils.CreateTestProduct(db1); productCode1 = db1.ExecuteStringQuery("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductCode'")[0]; db1.Commit(); } using (Database db2 = new Database(dbFile2, DatabaseOpenMode.CreateDirect)) { WindowsInstallerUtils.InitializeProductDatabase(db2); WindowsInstallerUtils.CreateTestProduct(db2); productCode2 = db2.ExecuteStringQuery("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductCode'")[0]; db2.Commit(); } ProductInstallation installation1 = new ProductInstallation(productCode1); ProductInstallation installation2 = new ProductInstallation(productCode2); Assert.IsFalse(installation1.IsInstalled, "Checking that product 1 is not installed before starting."); Assert.IsFalse(installation2.IsInstalled, "Checking that product 2 is not installed before starting."); Installer.SetInternalUI(InstallUIOptions.Silent); ExternalUIHandler prevHandler = Installer.SetExternalUI(WindowsInstallerTest.ExternalUILogger, InstallLogModes.FatalExit | InstallLogModes.Error | InstallLogModes.Warning | InstallLogModes.User | InstallLogModes.Info | InstallLogModes.ResolveSource | InstallLogModes.OutOfDiskSpace | InstallLogModes.ActionStart | InstallLogModes.ActionData | InstallLogModes.CommonData | InstallLogModes.Progress | InstallLogModes.Initialize | InstallLogModes.Terminate | InstallLogModes.ShowDialog); Assert.IsNull(prevHandler, "Checking that returned previous UI handler is null."); Transaction transaction = new Transaction("TestInstallTransaction", TransactionAttributes.None); Exception caughtEx = null; try { Installer.InstallProduct(dbFile1, String.Empty); } catch (Exception ex) { caughtEx = ex; } Assert.IsNull(caughtEx, "Exception thrown while installing product 1: " + caughtEx); Console.WriteLine(); Console.WriteLine("==================================================================="); Console.WriteLine(); try { Installer.InstallProduct(dbFile2, String.Empty); } catch (Exception ex) { caughtEx = ex; } Assert.IsNull(caughtEx, "Exception thrown while installing product 2: " + caughtEx); transaction.Commit(); transaction.Close(); prevHandler = Installer.SetExternalUI(prevHandler, InstallLogModes.None); Assert.AreEqual<ExternalUIHandler>(WindowsInstallerTest.ExternalUILogger, prevHandler, "Checking that previously-set UI handler is returned."); Assert.IsTrue(installation1.IsInstalled, "Checking that product 1 is installed."); Assert.IsTrue(installation2.IsInstalled, "Checking that product 2 is installed."); Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); Console.WriteLine("==================================================================="); Console.WriteLine("==================================================================="); Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); ExternalUIRecordHandler prevRecHandler = Installer.SetExternalUI(WindowsInstallerTest.ExternalUIRecordLogger, InstallLogModes.FatalExit | InstallLogModes.Error | InstallLogModes.Warning | InstallLogModes.User | InstallLogModes.Info | InstallLogModes.ResolveSource | InstallLogModes.OutOfDiskSpace | InstallLogModes.ActionStart | InstallLogModes.ActionData | InstallLogModes.CommonData | InstallLogModes.Progress | InstallLogModes.Initialize | InstallLogModes.Terminate | InstallLogModes.ShowDialog); Assert.IsNull(prevRecHandler, "Checking that returned previous UI record handler is null."); transaction = new Transaction("TestUninstallTransaction", TransactionAttributes.None); try { Installer.InstallProduct(dbFile1, "REMOVE=All"); } catch (Exception ex) { caughtEx = ex; } Assert.IsNull(caughtEx, "Exception thrown while removing product 1: " + caughtEx); try { Installer.InstallProduct(dbFile2, "REMOVE=All"); } catch (Exception ex) { caughtEx = ex; } Assert.IsNull(caughtEx, "Exception thrown while removing product 2: " + caughtEx); transaction.Commit(); transaction.Close(); Assert.IsFalse(installation1.IsInstalled, "Checking that product 1 is not installed after removing."); Assert.IsFalse(installation2.IsInstalled, "Checking that product 2 is not installed after removing."); prevRecHandler = Installer.SetExternalUI(prevRecHandler, InstallLogModes.None); Assert.AreEqual<ExternalUIRecordHandler>(WindowsInstallerTest.ExternalUIRecordLogger, prevRecHandler, "Checking that previously-set UI record handler is returned."); }
// This test does not pass if run normally. // It only passes when a failure is injected into the EmbeddedUI launcher. ////[TestMethod] public void EmbeddedUIInitializeFails() { string dbFile = "EmbeddedUIInitializeFails.msi"; string productCode; string uiDir = Path.GetFullPath(EmbeddedExternalUI.EmbeddedUISampleBinDir); string uiFile = "Microsoft.Deployment.Samples.EmbeddedUI.dll"; // A number that will be used to check whether a type 19 CA runs. const string magicNumber = "3.14159265358979323846264338327950"; using (Database db = new Database(dbFile, DatabaseOpenMode.CreateDirect)) { WindowsInstallerUtils.InitializeProductDatabase(db); WindowsInstallerUtils.CreateTestProduct(db); const string failureActionName = "EmbeddedUIInitializeFails"; db.Execute("INSERT INTO `CustomAction` (`Action`, `Type`, `Source`, `Target`) " + "VALUES ('{0}', 19, '', 'Logging magic number: {1}')", failureActionName, magicNumber); // This type 19 CA (launch condition) is given a condition of 'UILevel = 3' so that it only runs if the // installation is running in BASIC UI mode, which is what we expect if the EmbeddedUI fails to initialize. db.Execute("INSERT INTO `InstallExecuteSequence` (`Action`, `Condition`, `Sequence`) " + "VALUES ('{0}', 'UILevel = 3', 1)", failureActionName); productCode = db.ExecuteStringQuery("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductCode'")[0]; using (Record uiRec = new Record(5)) { uiRec[1] = "TestEmbeddedUI"; uiRec[2] = Path.GetFileNameWithoutExtension(uiFile) + ".Wrapper.dll"; uiRec[3] = 1; uiRec[4] = (int)( EmbeddedExternalUI.TestLogModes | InstallLogModes.Progress | InstallLogModes.Initialize | InstallLogModes.Terminate | InstallLogModes.ShowDialog); uiRec.SetStream(5, Path.Combine(uiDir, uiFile)); db.Execute(db.Tables["MsiEmbeddedUI"].SqlInsertString, uiRec); } db.Commit(); } Installer.SetInternalUI(InstallUIOptions.Full); ProductInstallation installation = new ProductInstallation(productCode); Assert.IsFalse(installation.IsInstalled, "Checking that product is not installed before starting."); string logFile = "install.log"; Exception caughtEx = null; try { Installer.EnableLog(EmbeddedExternalUI.TestLogModes, logFile); Installer.InstallProduct(dbFile, String.Empty); } catch (Exception ex) { caughtEx = ex; } Assert.IsInstanceOfType(caughtEx, typeof(InstallerException), "Excpected InstallerException installing product; caught: " + caughtEx); Assert.IsFalse(installation.IsInstalled, "Checking that product is not installed."); string logText = File.ReadAllText(logFile); Assert.IsTrue(logText.Contains(magicNumber), "Checking that the type 19 custom action ran."); }
public void EmbeddedUISingleInstall() { string dbFile = "EmbeddedUISingleInstall.msi"; string productCode; string uiDir = Path.GetFullPath(EmbeddedExternalUI.EmbeddedUISampleBinDir); string uiFile = "Microsoft.Deployment.Samples.EmbeddedUI.dll"; using (Database db = new Database(dbFile, DatabaseOpenMode.CreateDirect)) { WindowsInstallerUtils.InitializeProductDatabase(db); WindowsInstallerUtils.CreateTestProduct(db); productCode = db.ExecuteStringQuery("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductCode'")[0]; using (Record uiRec = new Record(5)) { uiRec[1] = "TestEmbeddedUI"; uiRec[2] = Path.GetFileNameWithoutExtension(uiFile) + ".Wrapper.dll"; uiRec[3] = 1; uiRec[4] = (int) ( EmbeddedExternalUI.TestLogModes | InstallLogModes.Progress | InstallLogModes.Initialize | InstallLogModes.Terminate | InstallLogModes.ShowDialog); uiRec.SetStream(5, Path.Combine(uiDir, uiFile)); db.Execute(db.Tables["MsiEmbeddedUI"].SqlInsertString, uiRec); } db.Commit(); } Installer.SetInternalUI(InstallUIOptions.Full); ProductInstallation installation = new ProductInstallation(productCode); Assert.IsFalse(installation.IsInstalled, "Checking that product is not installed before starting."); Exception caughtEx = null; try { Installer.EnableLog(EmbeddedExternalUI.TestLogModes, "install.log"); Installer.InstallProduct(dbFile, String.Empty); } catch (Exception ex) { caughtEx = ex; } Assert.IsNull(caughtEx, "Exception thrown while installing product: " + caughtEx); Assert.IsTrue(installation.IsInstalled, "Checking that product is installed."); Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); Console.WriteLine("==================================================================="); Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); try { Installer.EnableLog(EmbeddedExternalUI.TestLogModes, "uninstall.log"); Installer.InstallProduct(dbFile, "REMOVE=All"); } catch (Exception ex) { caughtEx = ex; } Assert.IsNull(caughtEx, "Exception thrown while uninstalling product: " + caughtEx); }
public static ActionResult SampleCA1(Session session) { using (Record msgRec = new Record(0)) { msgRec[0] = "Hello from SampleCA1!" + "\r\nCLR version is v" + Environment.Version; session.Message(InstallMessage.Info, msgRec); session.Message(InstallMessage.User, msgRec); } session.Log("Testing summary info..."); SummaryInfo summInfo = session.Database.SummaryInfo; session.Log("MSI PackageCode = {0}", summInfo.RevisionNumber); session.Log("MSI ModifyDate = {0}", summInfo.LastSaveTime); string testProp = session["SampleCATest"]; session.Log("Simple property test: [SampleCATest]={0}.", testProp); session.Log("Testing subdirectory extraction..."); string testFilePath = "testsub\\SampleCAs.cs"; if (!File.Exists(testFilePath)) { session.Log("Subdirectory extraction failed. File not found: " + testFilePath); return ActionResult.Failure; } else { session.Log("Found file extracted in subdirectory."); } session.Log("Testing record stream extraction..."); string tempFile = null; try { tempFile = Path.GetTempFileName(); using (View binView = session.Database.OpenView( "SELECT `Binary`.`Data` FROM `Binary`, `CustomAction` " + "WHERE `CustomAction`.`Target` = 'SampleCA1' AND " + "`CustomAction`.`Source` = `Binary`.`Name`")) { binView.Execute(); using (Record binRec = binView.Fetch()) { binRec.GetStream(1, tempFile); } } session.Log("CA binary file size: {0}", new FileInfo(tempFile).Length); string binFileVersion = Installer.GetFileVersion(tempFile); session.Log("CA binary file version: {0}", binFileVersion); } finally { if (tempFile != null && File.Exists(tempFile)) { File.Delete(tempFile); } } session.Log("Testing record stream reading..."); using (View binView2 = session.Database.OpenView("SELECT `Data` FROM `Binary` WHERE `Name` = 'TestData'")) { binView2.Execute(); using (Record binRec2 = binView2.Fetch()) { Stream stream = binRec2.GetStream("Data"); string testData = new StreamReader(stream, System.Text.Encoding.UTF8).ReadToEnd(); session.Log("Test data: " + testData); } } session.Log("Listing components"); using (View compView = session.Database.OpenView( "SELECT `Component` FROM `Component`")) { compView.Execute(); foreach (Record compRec in compView) { using (compRec) { session.Log("\t{0}", compRec["Component"]); } } } session.Log("Testing the ability to access an external MSI database..."); string tempDbFile = Path.GetTempFileName(); using (Database tempDb = new Database(tempDbFile, DatabaseOpenMode.CreateDirect)) { // Just create an empty database. } using (Database tempDb2 = new Database(tempDbFile)) { // See if we can open and query the database. IList<string> tables = tempDb2.ExecuteStringQuery("SELECT `Name` FROM `_Tables`"); session.Log("Found " + tables.Count + " tables in the newly created database."); } File.Delete(tempDbFile); return ActionResult.Success; }
public void DeleteRecord() { string dbFile = "DeleteRecord.msi"; using (Database db = new Database(dbFile, DatabaseOpenMode.CreateDirect)) { WindowsInstallerUtils.InitializeProductDatabase(db); WindowsInstallerUtils.CreateTestProduct(db); string query = "SELECT `Property`, `Value` FROM `Property` WHERE `Property` = 'UpgradeCode'"; using (View view = db.OpenView(query)) { view.Execute(); Record rec = view.Fetch(); Console.WriteLine("Calling ToString() : " + rec); view.Delete(rec); } Assert.AreEqual(0, db.ExecuteStringQuery(query).Count); } }