/// <summary> /// Creates a new CreateClientFilesTask instance to use to generate code /// </summary> /// <param name="relativeTestDir"></param> /// <param name="includeClientOutputAssembly">if <c>true</c> include clients own output assembly in analysis</param> /// <returns>A new task instance that can be invoked to do code gen</returns> public static CreateClientFilesTask CreateClientFilesTaskInstance_CopyClientProjectToOutput(string serverProjectPath, string clientProjectPath, bool includeClientOutputAssembly) { CreateClientFilesTask task = new CreateClientFilesTask(); MockBuildEngine mockBuildEngine = new MockBuildEngine(); task.BuildEngine = mockBuildEngine; task.Language = "C#"; task.ServerProjectPath = serverProjectPath; task.ServerAssemblies = new TaskItem[] { new TaskItem(CodeGenHelper.ServerClassLibOutputAssembly(task.ServerProjectPath)) }; task.ServerReferenceAssemblies = MsBuildHelper.AsTaskItems(CodeGenHelper.ServerClassLibReferences(task.ServerProjectPath)).ToArray(); task.ClientFrameworkPath = CodeGenHelper.GetRuntimeDirectory(); // Generate the code to our deployment directory string tempFolder = CodeGenHelper.GenerateTempFolder(); task.OutputPath = Path.Combine(tempFolder, "FileWrites"); task.GeneratedCodePath = Path.Combine(tempFolder, "Generated_Code"); string clientProjectFileName = Path.GetFileName(clientProjectPath); string clientProjectDestPath = Path.Combine(tempFolder, clientProjectFileName); File.Copy(clientProjectPath, clientProjectDestPath); task.ClientProjectPath = clientProjectDestPath; task.ClientReferenceAssemblies = MsBuildHelper.AsTaskItems(CodeGenHelper.ClientClassLibReferences(clientProjectPath, includeClientOutputAssembly)).ToArray(); task.ClientSourceFiles = MsBuildHelper.AsTaskItems(CodeGenHelper.ClientClassLibSourceFiles(clientProjectPath)).ToArray(); return(task); }
/// <summary> /// Deletes all the files and folders created by the given CreteClientFilesTask /// </summary> /// <param name="task"></param> public static void DeleteTempFolder(CreateClientFilesTask task) { if (task != null) { string tempFolder = Path.GetDirectoryName(task.OutputPath); DeleteTempFolder(tempFolder); } }
public void SharedTypes_CodeGen_Errors_On_Existing_Generated_Entity() { CreateClientFilesTask task = null; try { task = CodeGenHelper.CreateClientFilesTaskInstance("STT", /*includeClientOutputAssembly*/ true); var mockBuildEngine = (MockBuildEngine)task.BuildEngine; bool success = task.Execute(); Assert.IsFalse(success, "Expected build to fail"); string entityMsg = string.Format(CultureInfo.CurrentCulture, Resource.ClientCodeGen_EntityTypesCannotBeShared_Reference, "ServerClassLib.TestEntity"); TestHelper.AssertContainsErrors(mockBuildEngine.ConsoleLogger, entityMsg); } finally { CodeGenHelper.DeleteTempFolder(task); } }
public void SharedTypes_CodeGen_Skips_Shared_Types_And_Properties() { CreateClientFilesTask task = null; var expectedOutputFiles = new[] { "ServerClassLib.g.cs", // generated "TestEntity.shared.cs", // via server project "ServerClassLib2.shared.cs" // via P2P }; try { task = CodeGenHelper.CreateClientFilesTaskInstance("STT", /*includeClientOutputAssembly*/ false); MockBuildEngine mockBuildEngine = task.BuildEngine as MockBuildEngine; // Work Item 199139: // We're stripping ServerClassLib2 from the reference assemblies since we cannot depend on Visual Studio // to reliably produce a full set of dependencies. This will force the assembly resolution code to // search for ServerClassLib2 during codegen. // Note: Our assembly resolution code is only exercised when running against an installed product. When // we're running locally, resolution occurs without error. task.ServerReferenceAssemblies = task.ServerReferenceAssemblies.Where(item => !item.ItemSpec.Contains("ServerClassLib2")).ToArray(); bool success = task.Execute(); if (!success) { Assert.Fail("CreateClientFilesTask failed:\r\n" + mockBuildEngine.ConsoleLogger.Errors); } ITaskItem[] outputFiles = task.OutputFiles.ToArray(); Assert.AreEqual(expectedOutputFiles.Length, outputFiles.Length); string generatedFile = CodeGenHelper.GetOutputFile(outputFiles, expectedOutputFiles[0]); string generatedCode = string.Empty; using (StreamReader t1 = new StreamReader(generatedFile)) { generatedCode = t1.ReadToEnd(); } ConsoleLogger logger = new ConsoleLogger(); logger.LogMessage(generatedCode); CodeGenHelper.AssertGenerated(generatedCode, "public sealed partial class TestEntity : Entity"); CodeGenHelper.AssertGenerated(generatedCode, "public string TheKey"); CodeGenHelper.AssertGenerated(generatedCode, "public int TheValue"); // This property is in shared code (via link) and should not have been generated CodeGenHelper.AssertNotGenerated(generatedCode, "public int ServerAndClientValue"); // The automatic property in shared code should have been generated because // the PDB would lack any info to know it was shared strictly at the source level CodeGenHelper.AssertGenerated(generatedCode, "public string AutomaticProperty"); // The server-only IsValid method should have emitted a comment warning it is not shared CodeGenHelper.AssertGenerated(generatedCode, "// [CustomValidationAttribute(typeof(ServerClassLib.TestValidatorServer), \"IsValid\")]"); // The TestDomainSharedService already had a matching TestDomainSharedContext DomainContext // pre-built into the client project. Verify we did *NOT* regenerate a 2nd copy // TODO: Do it // CodeGenHelper.AssertNotGenerated(generatedCode, "TestDomainShared"); // CodeGenHelper.AssertNotGenerated(generatedCode, "TestEntity2"); // Test that we get an informational message about skipping this shared domain context // TODO: Do it // string msg = string.Format(CultureInfo.CurrentCulture, Resource.Shared_DomainContext_Skipped, "TestDomainSharedService"); // TestHelper.AssertContainsMessages(mockBuildEngine.ConsoleLogger, msg); // This property is in shared code in a p2p referenced assembly and should not have been generated CodeGenHelper.AssertNotGenerated(generatedCode, "public int SharedProperty_CL2"); } finally { CodeGenHelper.DeleteTempFolder(task); } }
public void CleanClientFiles_Deletes_Generated_Files() { CreateClientFilesTask task = null; MockBuildEngine mockBuildEngine; try { // ==================================================== // Test setup -- generate code by calling Create task // ==================================================== task = CodeGenHelper.CreateClientFilesTaskInstance("CLRCF1", /*includeClientOutputAssembly*/ false); bool success = task.Execute(); if (!success) { mockBuildEngine = task.BuildEngine as MockBuildEngine; Assert.Fail("CreateClientFilesTask failed:\r\n" + mockBuildEngine.ConsoleLogger.Errors); } string generatedCodeOutputFolder = task.GeneratedCodePath; Assert.IsTrue(Directory.Exists(generatedCodeOutputFolder), "Expected task to have created " + generatedCodeOutputFolder); string[] files = Directory.GetFiles(generatedCodeOutputFolder); Assert.AreEqual(2, files.Length, "Code gen should have generated 3 code files"); string generatedFile = Path.Combine(generatedCodeOutputFolder, "ServerClassLib.g.cs"); Assert.IsTrue(File.Exists(generatedFile), "Expected task to have generated " + generatedFile); string copiedFile = Path.Combine(generatedCodeOutputFolder, "TestEntity.shared.cs"); Assert.IsTrue(File.Exists(copiedFile), "Expected task to have copied " + copiedFile); string outputFolder = task.OutputPath; Assert.IsTrue(Directory.Exists(outputFolder), "Expected task to have created " + outputFolder); files = Directory.GetFiles(outputFolder); string generatedFiles = string.Empty; foreach (string file in files) { generatedFiles += (file + Environment.NewLine); } Assert.AreEqual(5, files.Length, "Code gen should have generated this many ancillary files but instead saw:" + Environment.NewLine + generatedFiles); string fileList = Path.Combine(outputFolder, "ClientClassLib.SimpleEntityFiles.txt"); Assert.IsTrue(File.Exists(fileList), "Expected code gen to have created " + fileList + " but saw:" + Environment.NewLine + generatedFiles); string refList = Path.Combine(outputFolder, "ClientClassLib.SimpleEntityClientRefs.txt"); Assert.IsTrue(File.Exists(refList), "Expected code gen to have created " + refList + " but saw:" + Environment.NewLine + generatedFiles); refList = Path.Combine(outputFolder, "ClientClassLib.SimpleEntityServerRefs.txt"); Assert.IsTrue(File.Exists(refList), "Expected code gen to have created " + refList + " but saw:" + Environment.NewLine + generatedFiles); string sourceFileList = Path.Combine(outputFolder, "ClientClassLib.SimpleEntitySourceFiles.txt"); Assert.IsTrue(File.Exists(sourceFileList), "Expected code gen to have created " + sourceFileList + " but saw:" + Environment.NewLine + generatedFiles); string riaLinkList = Path.Combine(outputFolder, "ClientClassLib.SimpleEntityLinks.txt"); Assert.IsTrue(File.Exists(riaLinkList), "Expected code gen to have created " + riaLinkList + " but saw:" + Environment.NewLine + generatedFiles); // ========================================== // Main body of test -- the Clean // ========================================== // Step 1: instantiate Clean task instance and execute it, giving it same info as the Create task CleanClientFilesTask cleanTask = new CleanClientFilesTask(); mockBuildEngine = new MockBuildEngine(); cleanTask.BuildEngine = mockBuildEngine; cleanTask.OutputPath = task.OutputPath; cleanTask.GeneratedCodePath = task.GeneratedCodePath; cleanTask.ClientProjectPath = task.ClientProjectPath; success = cleanTask.Execute(); Assert.IsTrue(success, "Clean task returned false"); // No errors or warnings allowed TestHelper.AssertNoErrorsOrWarnings(mockBuildEngine.ConsoleLogger); // Step 2: validate files created above are gone // TODO, 244509: we no longer remove empty folder // Assert.IsFalse(Directory.Exists(generatedCodeOutputFolder), "Expected clean to have deleted " + generatedCodeOutputFolder); Assert.IsFalse(File.Exists(fileList), "Expected clean to have deleted " + fileList); Assert.IsFalse(File.Exists(refList), "Expected clean to have deleted " + refList); Assert.IsFalse(File.Exists(sourceFileList), "Expected clean to have deleted " + sourceFileList); Assert.IsFalse(File.Exists(riaLinkList), "Expected clean to have deleted " + riaLinkList); // Step 3: verify redundant clean does no harm and succeeds success = cleanTask.Execute(); Assert.IsTrue(success, "Clean task returned false"); } finally { CodeGenHelper.DeleteTempFolder(task); } }