using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.BL; using Tango.BL.Entities; using Tango.Core; using Tango.Core.DB; using Tango.Core.IO; using Tango.SQLExaminer; namespace Tango.UnitTesting.SQLExaminer { [TestClass] [TestCategory("SQL Examiner")] public class SQLExaminer_TST { private Tango.Core.DataSource GetSource(String catalog = "Tango") { return new Tango.Core.DataSource() { Type = DataSourceType.SQLServer, Address = "localhost\\SQLEXPRESS", Catalog = catalog, IntegratedSecurity = true, }; } private Tango.Core.DataSource GetTarget(String catalog = "Test") { return new Tango.Core.DataSource() { Type = DataSourceType.SQLServer, Address = "localhost\\SQLEXPRESS", Catalog = catalog, IntegratedSecurity = true, }; } [TestMethod] public void Generate_Schema_Synchronization_Script() { ExaminerConfigurationBuilder builder = new ExaminerConfigurationBuilder(ExaminerConfigurationType.Schema); var temp_folder = Helper.GetTempFolderPath(); builder. SetSource(GetSource()). SetTarget(GetTarget()). SetBackupFile(Path.Combine(temp_folder, "db.bak")). SetReportFile(Path.Combine(temp_folder, "report.xml")); var config = builder.Build(); String config_path = Path.Combine(temp_folder, "schema.xml"); config.ToFile(config_path); Helper.ShowInExplorer(config_path); } [TestMethod] public void Generate_Provisioning_Synchronization_Script() { ExaminerConfigurationBuilder builder = new ExaminerConfigurationBuilder(ExaminerConfigurationType.ProvisionMachine); var temp_folder = Helper.GetTempFolderPath(); builder. SetSource(GetSource()). SetTarget(GetTarget()). SetReportFile(Path.Combine(temp_folder, "report.xml")). SetMachineSerialNumber("1111"); var config = builder.Build(); String config_path = Path.Combine(temp_folder, "provision.xml"); config.ToFile(config_path); Helper.ShowInExplorer(config_path); } [TestMethod] public void Generate_Data_Overriding_Script() { ExaminerConfigurationBuilder builder = new ExaminerConfigurationBuilder(ExaminerConfigurationType.OverrideData); var temp_folder = Helper.GetTempFolderPath(); builder. SetSource(GetSource()). SetTarget(GetTarget()). SetReportFile(Path.Combine(temp_folder, "report.xml")); var config = builder.Build(); String config_path = Path.Combine(temp_folder, "data.xml"); config.ToFile(config_path); Helper.ShowInExplorer(config_path); } [TestMethod] public void LoadReport() { ExaminerDataReport report = ExaminerDataReport.FromFile("C:\\DATA\\report_data.xml"); } [TestMethod] public void Synchronize_Schema() { SqlConnection connection = new SqlConnection("Server=localhost\\SQLEXPRESS;Integrated security=SSPI"); ExaminerConfigurationBuilder builder = new ExaminerConfigurationBuilder(ExaminerConfigurationType.Schema); var temp_folder = Helper.GetTempFolderPath(); builder. SetSource(GetSource()). SetTarget(GetTarget()). SetReportFile("C:\\Data\\Report.xml"); var config = builder.Build(); String config_path = Path.Combine(temp_folder, "schema.xml"); config.ToFile(config_path); ExaminerProcess process = new ExaminerProcess(config_path, ExaminerProcessType.Schema); var result = process.Execute().Result; Assert.AreEqual(result.ExitCode, ExaminerProcessExitCode.Success); } [TestMethod] public void Override_Data() { ExaminerConfigurationBuilder builder = new ExaminerConfigurationBuilder(ExaminerConfigurationType.OverrideData); var temp_folder = Helper.GetTempFolderPath(); builder. SetSource(GetSource()). SetTarget(GetTarget()). SetReportFile("C:\\DATA\\report_data.xml"); var config = builder.Build(); String config_path = Path.Combine(temp_folder, "data.xml"); config.ToFile(config_path); ExaminerProcess process = new ExaminerProcess(config_path, ExaminerProcessType.Data); process.Progress += (x, msg) => { Debug.WriteLine(msg); }; var result = process.Execute().Result; Assert.AreEqual(result.ExitCode, ExaminerProcessExitCode.Success); } [TestMethod] public void Provision_Machine() { ExaminerConfigurationBuilder builder = new ExaminerConfigurationBuilder(ExaminerConfigurationType.ProvisionMachine); var temp_folder = Helper.GetTempFolderPath(); builder. SetSource(GetSource()). SetTarget(GetTarget()). SetMachineSerialNumber("1111"); var config = builder.Build(); String config_path = Path.Combine(temp_folder, "provision.xml"); config.ToFile(config_path); ExaminerProcess process = new ExaminerProcess(config_path, ExaminerProcessType.Data); process.Progress += (x, msg) => { Debug.WriteLine(msg); }; var result = process.Execute().Result; Assert.AreEqual(result.ExitCode, ExaminerProcessExitCode.Success); } [TestMethod] public void Perform_Full_DataBase_Cycle() { String temp_folder = Helper.GetTempFolderPath(); String report_file = Path.Combine(temp_folder, "report.xml"); String config_file = Path.Combine(temp_folder, "config.xml"); String machine_serial_number = "1111"; String tango_db = "Tango"; String source_db = "Source_DB_Test"; String target_db = "Target_DB_Test"; DbManager db = DbManager.FromAddress("localhost\\SQLEXPRESS"); Assert.IsTrue(db.Exists("Tango"), "Database Tango does not exists."); if (db.Exists(source_db)) { db.Delete(source_db); } if (db.Exists(target_db)) { db.Delete(target_db); } Assert.IsFalse(db.Exists(source_db), source_db + " exists."); Assert.IsFalse(db.Exists(target_db), target_db + " exists."); //Clone Tango DB to SourceDB db.CloneDB( "Tango", Path.Combine(temp_folder, "Tango.bak"), source_db, Path.Combine(temp_folder, "Source_DB_Test.mdf"), Path.Combine(temp_folder, "Source_DB_Test.ldf")); //Create target database db.Create(target_db); //Create schema configuration ExaminerConfigurationBuilder builder = new ExaminerConfigurationBuilder(ExaminerConfigurationType.Schema); builder. SetSource(GetSource(source_db)). SetTarget(GetTarget(target_db)). Synchronize(). SetReportFile(report_file); //Synchronize Source schema with Target schema ExaminerProcessResult result = new ExaminerProcess(builder.Build(), ExaminerProcessType.Schema).Execute().Result; var schema_report = ExaminerSchemaReport.FromFile(report_file); //Synchronization was successful Assert.AreEqual(result.ExitCode, ExaminerProcessExitCode.Success); //Should have differences Assert.IsTrue(schema_report.HasDifferences); //Create override data configuration builder = new ExaminerConfigurationBuilder(ExaminerConfigurationType.OverrideData); builder. SetSource(GetSource(source_db)). SetTarget(GetTarget(target_db)). Synchronize(). SetReportFile(report_file); result = new ExaminerProcess(builder.Build(), ExaminerProcessType.Data).Execute().Result; //Synchronization was successful Assert.AreEqual(result.ExitCode, ExaminerProcessExitCode.Success); var data_report = ExaminerDataReport.FromFile(report_file); //Should have differences Assert.IsTrue(data_report.HasDifferences); //Provision Target builder = new ExaminerConfigurationBuilder(ExaminerConfigurationType.ProvisionMachine); builder. SetSource(GetSource(source_db)). SetTarget(GetTarget(target_db)). SetMachineSerialNumber(machine_serial_number). Synchronize(). SetReportFile(report_file); result = new ExaminerProcess(builder.Build(), ExaminerProcessType.Data).Execute().Result; //Synchronization was successful Assert.AreEqual(result.ExitCode, ExaminerProcessExitCode.Success); data_report = ExaminerDataReport.FromFile(report_file); //Should have differences Assert.IsTrue(data_report.HasDifferences); //Check if machine exists in target String job_guid = String.Empty; using (var context = ObservablesContext.CreateDefault("localhost\\SQLEXPRESS", target_db, DataSourceType.SQLServer)) { context.Configuration.LazyLoadingEnabled = false; Assert.IsTrue(context.Machines.Count() == 1); Assert.IsTrue(context.Machines.Any(x => x.SerialNumber == machine_serial_number)); //Add new job to the target Job job = new Job(); job.Name = "Test Job"; job.Machine = context.Machines.First(); job.Rml = context.Rmls.First(); job.ColorSpace = context.ColorSpaces.First(); job.CreationDate = DateTime.UtcNow; job.Description = "Description"; job.SpoolType = context.SpoolTypes.First(); job.User = context.Users.First(); job.WindingMethod = context.WindingMethods.First(); job.AddSolidSegment(); job.AddGradientSegment(); context.Jobs.Add(job); context.SaveChanges(); job_guid = job.Guid; Assert.IsTrue(context.BrushStops.Count() == 3); } //Update new job from target to source builder = new ExaminerConfigurationBuilder(ExaminerConfigurationType.UpdateTwineDB); builder. SetSource(GetTarget(target_db)). SetTarget(GetSource(source_db)). Synchronize(). SetReportFile(report_file); result = new ExaminerProcess(builder.Build(), ExaminerProcessType.Data).Execute().Result; //Synchronization was successful Assert.AreEqual(result.ExitCode, ExaminerProcessExitCode.Success); data_report = ExaminerDataReport.FromFile(report_file); //Should have differences Assert.IsTrue(data_report.HasDifferences); //Check the new job exists on source.. using (var context = ObservablesContext.CreateDefault("localhost\\SQLEXPRESS", source_db, DataSourceType.SQLServer)) { Assert.IsTrue(context.Jobs.Any(x => x.Guid == job_guid)); } //Now change configuration in source and push to machine using (var context = ObservablesContext.CreateDefault("localhost\\SQLEXPRESS", source_db, DataSourceType.SQLServer)) { var machine = context.Machines.SingleOrDefault(x => x.SerialNumber == machine_serial_number); context.SaveChanges(); } //Update the machine from source builder = new ExaminerConfigurationBuilder(ExaminerConfigurationType.UpdateMachine); builder. SetSource(GetSource(source_db)). SetTarget(GetTarget(target_db)). SetMachineSerialNumber(machine_serial_number). Synchronize(). SetReportFile(report_file); result = new ExaminerProcess(builder.Build(), ExaminerProcessType.Data).Execute().Result; //Synchronization was successful Assert.AreEqual(result.ExitCode, ExaminerProcessExitCode.Success); data_report = ExaminerDataReport.FromFile(report_file); //Should have differences Assert.IsTrue(data_report.HasDifferences); //Check no difference after update builder.NoSynchronize(); result = new ExaminerProcess(builder.Build(), ExaminerProcessType.Data).Execute().Result; //Synchronization was successful Assert.AreEqual(result.ExitCode, ExaminerProcessExitCode.Success); data_report = ExaminerDataReport.FromFile(report_file); //Should have no differences! Assert.IsFalse(data_report.HasDifferences); } [TestMethod] public void Perform_Machine_Update_From_Backup() { String tempDbName = "Tango_TUP"; var source_db = GetSource("Tango"); var target_db = GetSource(tempDbName); DbManager dbManager = DbManager.FromDataSource(source_db); //Create the backup for the tup file. dbManager.Create(tempDbName); var configuration = GetFullConfiguration(); ExaminerSequenceConfigurationRunner runner = new ExaminerSequenceConfigurationRunner( configuration, Tango.SQLExaminer.Helper.SQL_EXAMINER_CONFIG_FOLDER, source_db, target_db, "1111"); runner.Run().GetAwaiter().GetResult(); String backupFile = "C:\\DB_Backups\\Tango_TEMP.bak"; dbManager.Backup(tempDbName, backupFile); dbManager.SetOffline(tempDbName); dbManager.SetOnline(tempDbName); dbManager.Delete(tempDbName); //Now restore as different name dbManager.RestoreAsNew(tempDbName, backupFile, "C:\\DB_Backups"); } private ExaminerSequenceConfiguration GetFullConfiguration() { ExaminerSequenceConfiguration configuration = new ExaminerSequenceConfiguration(); configuration.Items.Add(new ExaminerSequenceItem() { Type = ExaminerSequenceItemType.Schema, Direction = ExaminerSequenceItemDirection.SourceToTarget, FileName = ExaminerConfigurationType.Schema.GetFileName(), Index = 0, Name = "Updating Schema", }); configuration.Items.Add(new ExaminerSequenceItem() { Type = ExaminerSequenceItemType.Data, Direction = ExaminerSequenceItemDirection.SourceToTarget, FileName = ExaminerConfigurationType.OverrideData.GetFileName(), Index = 1, Name = "Updating Collections", }); configuration.Items.Add(new ExaminerSequenceItem() { Type = ExaminerSequenceItemType.Data, Direction = ExaminerSequenceItemDirection.SourceToTarget, FileName = ExaminerConfigurationType.ProvisionMachine.GetFileName(), Index = 2, Name = "Configuring Machine", RequiresSerialNumber = true, }); return configuration; } } }