diff --git a/tests/xharness/BCLTestImportTargetFactory.cs b/tests/xharness/BCLTestImportTargetFactory.cs index 441d2ce4d6ea..e937c594d1e9 100644 --- a/tests/xharness/BCLTestImportTargetFactory.cs +++ b/tests/xharness/BCLTestImportTargetFactory.cs @@ -287,8 +287,8 @@ public BCLTestImportTargetFactory (string outputDirectory, string monoRootPath) /// has its own details. /// The dir where the projects will be saved. /// - public Task GenerateTestProjectsAsync (IEnumerable<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> projects, Platform platform) - => TemplatedProject.GenerateTestProjectsAsync (projects, platform); + public GeneratedProjects GenerateTestProjects (IEnumerable<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> projects, Platform platform) + => TemplatedProject.GenerateTestProjects (projects, platform); List<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> GetProjectDefinitions (ProjectsDefinitions definitions, Platform platform) { @@ -318,35 +318,34 @@ public Task GenerateTestProjectsAsync (IEnumerable<(string Na return testProjects; } - async Task Platforms, string Failure, double TimeoutMultiplier)>> GenerateAlliOSTestProjectsAsync () + List<(string Name, string Path, bool XUnit, string ExtraArgs, List Platforms, string Failure, double TimeoutMultiplier, Task GenerationCompleted)> GenerateAlliOSTestProjects () { - var projectPaths = new List<(string Name, string Path, bool XUnit, string ExtraArgs, List Platforms, string Failure, double TimeoutMultiplier)> (); - var projects = new Dictionary Platforms, string Failure, double TimeoutMultiplier)> (); + var projectPaths = new List<(string Name, string Path, bool XUnit, string ExtraArgs, List Platforms, string Failure, double TimeoutMultiplier, Task GenerationCompleted)> (); + var projects = new Dictionary Platforms, string Failure, double TimeoutMultiplier, Task GenerationCompleted)> (); foreach (var platform in new [] { Platform.iOS, Platform.TvOS, Platform.WatchOS }) { - var generated = await GenerateTestProjectsAsync (GetProjectDefinitions (commoniOSTestProjects, platform), platform); + var generated = GenerateTestProjects (GetProjectDefinitions (commoniOSTestProjects, platform), platform); foreach (var tp in generated) { if (!projects.ContainsKey (tp.Name)) { - projects [tp.Name] = (tp.Path, tp.XUnit, tp.ExtraArgs, new List { platform }, tp.Failure, tp.TimeoutMultiplier); + projects [tp.Name] = (tp.Path, tp.XUnit, tp.ExtraArgs, new List { platform }, tp.Failure, tp.TimeoutMultiplier, tp.GenerationCompleted); } else { var project = projects [tp.Name]; project.Platforms.Add (platform); project.TimeoutMultiplier += (tp.TimeoutMultiplier - 1); + project.GenerationCompleted = Task.WhenAll (project.GenerationCompleted, tp.GenerationCompleted); } } } // foreach platform // return the grouped projects - foreach (var name in projects.Keys) { - projectPaths.Add ((name, projects [name].Path, projects [name].XUnit, projects [name].ExtraArgs, projects [name].Platforms, projects [name].Failure, projects [name].TimeoutMultiplier)); + foreach (var kvp in projects) { + var name = kvp.Key; + var proj = kvp.Value; + projectPaths.Add ((kvp.Key, proj.Path, proj.XUnit, proj.ExtraArgs, proj.Platforms, proj.Failure, proj.TimeoutMultiplier, proj.GenerationCompleted)); } return projectPaths; } - public List<(string Name, string Path, bool XUnit, string ExtraArgs, List Platforms, string Failure, double TimeoutMultiplier)> GenerateAlliOSTestProjects () => GenerateAlliOSTestProjectsAsync ().Result; - - public Task GenerateAllMacTestProjectsAsync (Platform platform) => GenerateTestProjectsAsync (GetProjectDefinitions (macTestProjects, platform), platform); - - public GeneratedProjects GenerateAllMacTestProjects (Platform platform) => GenerateAllMacTestProjectsAsync (platform).Result; + public GeneratedProjects GenerateAllMacTestProjects (Platform platform) => GenerateTestProjects (GetProjectDefinitions (macTestProjects, platform), platform); // Map from the projects understood from the test importer to those that AppRunner and friends understand: public List GetiOSBclTargets () @@ -356,7 +355,7 @@ public List GetiOSBclTargets () foreach (var tp in GenerateAlliOSTestProjects ()) { var prefix = tp.XUnit ? "xUnit" : "NUnit"; var finalName = tp.Name.StartsWith ("mscorlib", StringComparison.Ordinal) ? tp.Name : $"[{prefix}] Mono {tp.Name}"; // mscorlib is our special test - result.Add (new iOSTestProject (tp.Path) { + var proj = new iOSTestProject (tp.Path) { Name = finalName, SkipiOSVariation = !tp.Platforms.Contains (Platform.iOS), SkiptvOSVariation = !tp.Platforms.Contains (Platform.TvOS), @@ -366,7 +365,12 @@ public List GetiOSBclTargets () RestoreNugetsInProject = true, MTouchExtraArgs = tp.ExtraArgs, TimeoutMultiplier = tp.TimeoutMultiplier, - }); + }; + proj.Dependency = async () => { + await tp.GenerationCompleted; + proj.FailureMessage = tp.Failure; + }; + result.Add (proj); } return result; } @@ -382,14 +386,19 @@ public List GetMacBclTargets (MacFlavors flavor) foreach (var tp in GenerateAllMacTestProjects (platform)) { var prefix = tp.XUnit ? "xUnit" : "NUnit"; var finalName = tp.Name.StartsWith ("mscorlib", StringComparison.Ordinal) ? tp.Name : $"[{prefix}] Mono {tp.Name}"; // mscorlib is our special test - result.Add (new MacTestProject (tp.Path, targetFrameworkFlavor: flavor) { + var proj = new MacTestProject (tp.Path, targetFrameworkFlavor: flavor) { Name = finalName, Platform = "AnyCPU", IsExecutableProject = true, FailureMessage = tp.Failure, RestoreNugetsInProject = true, MTouchExtraArgs = tp.ExtraArgs, - }); + }; + proj.Dependency = async () => { + await tp.GenerationCompleted; + proj.FailureMessage = tp.Failure; + }; + result.Add (proj); } return result; } diff --git a/tests/xharness/Microsoft.DotNet.XHarness.iOS.Shared/TestImporter/Templates/ITemplatedProject.cs b/tests/xharness/Microsoft.DotNet.XHarness.iOS.Shared/TestImporter/Templates/ITemplatedProject.cs index b0f874f446c5..5b930005c408 100644 --- a/tests/xharness/Microsoft.DotNet.XHarness.iOS.Shared/TestImporter/Templates/ITemplatedProject.cs +++ b/tests/xharness/Microsoft.DotNet.XHarness.iOS.Shared/TestImporter/Templates/ITemplatedProject.cs @@ -4,8 +4,17 @@ namespace Microsoft.DotNet.XHarness.iOS.Shared.TestImporter.Templates { + public class GeneratedProject { + public string Name; + public string Path; + public bool XUnit; + public string ExtraArgs; + public string Failure; + public double TimeoutMultiplier; + public Task GenerationCompleted; + } // less typing - public class GeneratedProjects : List<(string Name, string Path, bool XUnit, string ExtraArgs, string Failure, double TimeoutMultiplier)> { + public class GeneratedProjects : List { } // interface that represent a project that is created from a template. @@ -28,6 +37,6 @@ public interface ITemplatedProject { /// has its own details. /// The dir where the projects will be saved. /// - Task GenerateTestProjectsAsync (IEnumerable<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> projects, Platform platform); + GeneratedProjects GenerateTestProjects (IEnumerable<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> projects, Platform platform); } } diff --git a/tests/xharness/Microsoft.DotNet.XHarness.iOS.Shared/TestImporter/Templates/Managed/XamariniOSTemplate.cs b/tests/xharness/Microsoft.DotNet.XHarness.iOS.Shared/TestImporter/Templates/Managed/XamariniOSTemplate.cs index 8835d6294763..8afe595c2402 100644 --- a/tests/xharness/Microsoft.DotNet.XHarness.iOS.Shared/TestImporter/Templates/Managed/XamariniOSTemplate.cs +++ b/tests/xharness/Microsoft.DotNet.XHarness.iOS.Shared/TestImporter/Templates/Managed/XamariniOSTemplate.cs @@ -379,28 +379,28 @@ string GenerateIncludeFilesNode (string projectName, (string FailureMessage, Lis return contentFiles.ToString (); } - public async Task GenerateTestProjectsAsync (IEnumerable<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> projects, Platform platform) + public GeneratedProjects GenerateTestProjects (IEnumerable<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> projects, Platform platform) { // generate the template c# code before we create the diff projects GenerateSource (Path.Combine (OutputDirectoryPath, "templates")); var result = new GeneratedProjects (); switch (platform) { case Platform.WatchOS: - result = await GenerateWatchOSTestProjectsAsync (projects); + result = GenerateWatchOSTestProjects (projects); break; case Platform.iOS: case Platform.TvOS: - result = await GenerateiOSTestProjectsAsync (projects, platform); + result = GenerateiOSTestProjects (projects, platform); break; case Platform.MacOSFull: case Platform.MacOSModern: - result = await GenerateMacTestProjectsAsync (projects, platform); + result = GenerateMacTestProjects (projects, platform); break; } return result; } - #region Watch Porjects generation + #region Watch Projects generation string GenerateWatchProject (string projectName, string template, string infoPlistPath) { @@ -447,7 +447,7 @@ string GenerateWatchExtension (string projectName, string template, string infoP } // internal implementations that generate each of the diff projects - async Task GenerateWatchOSTestProjectsAsync (IEnumerable<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> projects) + GeneratedProjects GenerateWatchOSTestProjects (IEnumerable<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> projects) { var projectPaths = new GeneratedProjects (); foreach (var def in projects) { @@ -462,65 +462,74 @@ async Task GenerateWatchOSTestProjectsAsync (IEnumerable<(str if (!projectDefinition.Validate ()) throw new InvalidOperationException ("xUnit and NUnit assemblies cannot be mixed in a test project."); + var gp = new GeneratedProject (); var generatedCodeDir = Path.Combine (GeneratedCodePathRoot, projectDefinition.Name, "watch"); if (!Directory.Exists (generatedCodeDir)) { Directory.CreateDirectory (generatedCodeDir); } var registerTypePath = Path.Combine (generatedCodeDir, "RegisterType.cs"); - string failure = null; - string rootProjectPath = GetProjectPath (projectDefinition.Name, Platform.WatchOS); ; - try { - // create the plist for each of the apps - var projectData = new Dictionary (); - foreach (var appType in new [] { WatchAppType.Extension, WatchAppType.App }) { - (string plist, string project) data; - var plist = InfoPlistGenerator.GenerateCode (GetPlistTemplate (appType), projectDefinition.Name); - data.plist = GetPListPath (generatedCodeDir, appType); - using (var file = new StreamWriter (data.plist, false)) { // false is do not append - await file.WriteAsync (plist); + gp.Name = projectDefinition.Name; + gp.Path = GetProjectPath (projectDefinition.Name, Platform.WatchOS); + gp.XUnit = projectDefinition.IsXUnit; + gp.ExtraArgs = projectDefinition.ExtraArgs; + gp.TimeoutMultiplier = def.TimeoutMultiplier; + var task = Task.Run (async () => { + try { + // create the plist for each of the apps + var projectData = new Dictionary (); + foreach (var appType in new [] { WatchAppType.Extension, WatchAppType.App }) { + (string plist, string project) data; + var plist = InfoPlistGenerator.GenerateCode (GetPlistTemplate (appType), projectDefinition.Name); + data.plist = GetPListPath (generatedCodeDir, appType); + using (var file = new StreamWriter (data.plist, false)) { // false is do not append + await file.WriteAsync (plist); + } + + string generatedProject; + switch (appType) { + case WatchAppType.App: + generatedProject = GenerateWatchApp (projectDefinition.Name, GetProjectTemplate (appType), data.plist); + break; + default: + var info = projectDefinition.GetAssemblyInclusionInformation (Platform.WatchOS); + generatedProject = GenerateWatchExtension (projectDefinition.Name, GetProjectTemplate (appType), data.plist, registerTypePath, info); + gp.Failure ??= info.FailureMessage; + break; + } + data.project = GetProjectPath (projectDefinition.Name, appType); + using (var file = new StreamWriter (data.project, false)) { // false is do not append + await file.WriteAsync (generatedProject); + } + + projectData [appType] = data; + } // foreach app type + + var rootPlist = InfoPlistGenerator.GenerateCode (GetPlistTemplate (Platform.WatchOS), projectDefinition.Name); + var infoPlistPath = GetPListPath (generatedCodeDir, Platform.WatchOS); + using (var file = new StreamWriter (infoPlistPath, false)) { // false is do not append + await file.WriteAsync (rootPlist); } - string generatedProject; - switch (appType) { - case WatchAppType.App: - generatedProject = GenerateWatchApp (projectDefinition.Name, GetProjectTemplate (appType), data.plist); - break; - default: - var info = projectDefinition.GetAssemblyInclusionInformation (Platform.WatchOS); - generatedProject = GenerateWatchExtension (projectDefinition.Name, GetProjectTemplate (appType), data.plist, registerTypePath, info); - failure ??= info.FailureMessage; - break; + using (var file = new StreamWriter (gp.Path, false)) { // false is do not append + var template = GetProjectTemplate (Platform.WatchOS); + var generatedRootProject = GenerateWatchProject (def.Name, template, infoPlistPath); + await file.WriteAsync (generatedRootProject); } - data.project = GetProjectPath (projectDefinition.Name, appType); - using (var file = new StreamWriter (data.project, false)) { // false is do not append - await file.WriteAsync (generatedProject); + var typesPerAssembly = projectDefinition.GetTypeForAssemblies (AssemblyLocator.GetAssembliesRootLocation (Platform.iOS), Platform.WatchOS); + var registerCode = RegisterTypeGenerator.GenerateCode (typesPerAssembly, projectDefinition.IsXUnit, GetRegisterTypeTemplate ()); + using (var file = new StreamWriter (registerTypePath, false)) { // false is do not append + await file.WriteAsync (registerCode); } - projectData [appType] = data; - } // foreach app type - - var rootPlist = InfoPlistGenerator.GenerateCode (GetPlistTemplate (Platform.WatchOS), projectDefinition.Name); - var infoPlistPath = GetPListPath (generatedCodeDir, Platform.WatchOS); - using (var file = new StreamWriter (infoPlistPath, false)) { // false is do not append - await file.WriteAsync (rootPlist); - } - using (var file = new StreamWriter (rootProjectPath, false)) { // false is do not append - var template = GetProjectTemplate (Platform.WatchOS); - var generatedRootProject = GenerateWatchProject (def.Name, template, infoPlistPath); - await file.WriteAsync (generatedRootProject); - } - var typesPerAssembly = projectDefinition.GetTypeForAssemblies (AssemblyLocator.GetAssembliesRootLocation (Platform.iOS), Platform.WatchOS); - var registerCode = RegisterTypeGenerator.GenerateCode (typesPerAssembly, projectDefinition.IsXUnit, GetRegisterTypeTemplate ()); - using (var file = new StreamWriter (registerTypePath, false)) { // false is do not append - await file.WriteAsync (registerCode); + gp.Failure ??= typesPerAssembly.FailureMessage; + } catch (Exception e) { + gp.Failure = e.Message; } + }); + gp.GenerationCompleted = task; - failure ??= typesPerAssembly.FailureMessage; - } catch (Exception e) { - failure = e.Message; - } // we have the 3 projects we depend on, we need the root one, the one that will be used by harness - projectPaths.Add ((projectDefinition.Name, rootProjectPath, projectDefinition.IsXUnit, projectDefinition.ExtraArgs, failure, def.TimeoutMultiplier)); + projectPaths.Add (gp); } // foreach project return projectPaths; @@ -568,7 +577,7 @@ string Generate (string projectName, string registerPath, (string FailureMessage return result; } - async Task GenerateiOSTestProjectsAsync (IEnumerable<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> projects, Platform platform) + GeneratedProjects GenerateiOSTestProjects (IEnumerable<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> projects, Platform platform) { if (platform == Platform.WatchOS) throw new ArgumentException (nameof (platform)); @@ -592,32 +601,39 @@ async Task GenerateiOSTestProjectsAsync (IEnumerable<(string var registerTypePath = Path.Combine (generatedCodeDir, "RegisterType.cs"); string projectPath = GetProjectPath (projectDefinition.Name, platform); - string failure = null; - try { - var plist = InfoPlistGenerator.GenerateCode (GetPlistTemplate (platform), projectDefinition.Name); - var infoPlistPath = GetPListPath (generatedCodeDir, platform); - using (var file = new StreamWriter (infoPlistPath, false)) { // false is do not append - await file.WriteAsync (plist); - } + var gp = new GeneratedProject (); + gp.Name = projectDefinition.Name; + gp.Path = projectPath; + gp.XUnit = projectDefinition.IsXUnit; + gp.ExtraArgs = projectDefinition.ExtraArgs; + gp.TimeoutMultiplier = def.TimeoutMultiplier; + gp.GenerationCompleted = Task.Run (async () => { + try { + var plist = InfoPlistGenerator.GenerateCode (GetPlistTemplate (platform), projectDefinition.Name); + var infoPlistPath = GetPListPath (generatedCodeDir, platform); + using (var file = new StreamWriter (infoPlistPath, false)) { // false is do not append + await file.WriteAsync (plist); + } - var info = projectDefinition.GetAssemblyInclusionInformation (platform); - var generatedProject = Generate (projectDefinition.Name, registerTypePath, info, GetProjectTemplate (platform), infoPlistPath, platform); - using (var file = new StreamWriter (projectPath, false)) { // false is do not append - await file.WriteAsync (generatedProject); - } - var typesPerAssembly = projectDefinition.GetTypeForAssemblies (AssemblyLocator.GetAssembliesRootLocation (platform), platform); - var registerCode = RegisterTypeGenerator.GenerateCode (typesPerAssembly, projectDefinition.IsXUnit, GetRegisterTypeTemplate ()); + var info = projectDefinition.GetAssemblyInclusionInformation (platform); + var generatedProject = Generate (projectDefinition.Name, registerTypePath, info, GetProjectTemplate (platform), infoPlistPath, platform); + using (var file = new StreamWriter (projectPath, false)) { // false is do not append + await file.WriteAsync (generatedProject); + } + var typesPerAssembly = projectDefinition.GetTypeForAssemblies (AssemblyLocator.GetAssembliesRootLocation (platform), platform); + var registerCode = RegisterTypeGenerator.GenerateCode (typesPerAssembly, projectDefinition.IsXUnit, GetRegisterTypeTemplate ()); - using (var file = new StreamWriter (registerTypePath, false)) { // false is do not append - await file.WriteAsync (registerCode); - } + using (var file = new StreamWriter (registerTypePath, false)) { // false is do not append + await file.WriteAsync (registerCode); + } - failure = failure ?? info.FailureMessage; - failure = failure ?? typesPerAssembly.FailureMessage; - } catch (Exception e) { - failure = e.Message; - } - projectPaths.Add ((projectDefinition.Name, projectPath, projectDefinition.IsXUnit, projectDefinition.ExtraArgs, failure, def.TimeoutMultiplier)); + gp.Failure ??= info.FailureMessage; + gp.Failure ??= typesPerAssembly.FailureMessage; + } catch (Exception e) { + gp.Failure = e.Message; + } + }); + projectPaths.Add (gp); } // foreach project return projectPaths; @@ -667,7 +683,7 @@ string GenerateMac (string projectName, string registerPath, (string FailureMess return result; } - async Task GenerateMacTestProjectsAsync (IEnumerable<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> projects, Platform platform) + GeneratedProjects GenerateMacTestProjects (IEnumerable<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> projects, Platform platform) { var projectPaths = new GeneratedProjects (); foreach (var def in projects) { @@ -684,32 +700,40 @@ async Task GenerateMacTestProjectsAsync (IEnumerable<(string Directory.CreateDirectory (generatedCodeDir); var registerTypePath = Path.Combine (generatedCodeDir, "RegisterType-mac.cs"); - var typesPerAssembly = projectDefinition.GetTypeForAssemblies (AssemblyLocator.GetAssembliesRootLocation (platform), platform); - var registerCode = RegisterTypeGenerator.GenerateCode (typesPerAssembly, projectDefinition.IsXUnit, GetRegisterTypeTemplate ()); - - using (var file = new StreamWriter (registerTypePath, false)) { // false is do not append - await file.WriteAsync (registerCode); - } var projectPath = GetProjectPath (projectDefinition.Name, platform); - string failure = null; - try { - var plist = InfoPlistGenerator.GenerateCode (GetPlistTemplate (platform), projectDefinition.Name); - var infoPlistPath = GetPListPath (generatedCodeDir, platform); - using (var file = new StreamWriter (infoPlistPath, false)) { // false is do not append - await file.WriteAsync (plist); - } + var gp = new GeneratedProject (); + gp.Name = projectDefinition.Name; + gp.Path = projectPath; + gp.XUnit = projectDefinition.IsXUnit; + gp.ExtraArgs = projectDefinition.ExtraArgs; + gp.TimeoutMultiplier = def.TimeoutMultiplier; + gp.GenerationCompleted = Task.Run (async () => { + try { + var typesPerAssembly = projectDefinition.GetTypeForAssemblies (AssemblyLocator.GetAssembliesRootLocation (platform), platform); + var registerCode = RegisterTypeGenerator.GenerateCode (typesPerAssembly, projectDefinition.IsXUnit, GetRegisterTypeTemplate ()); + + using (var file = new StreamWriter (registerTypePath, false)) { // false is do not append + await file.WriteAsync (registerCode); + } - var info = projectDefinition.GetAssemblyInclusionInformation (platform); - var generatedProject = GenerateMac (projectDefinition.Name, registerTypePath, info, GetProjectTemplate (platform), infoPlistPath, platform); - using (var file = new StreamWriter (projectPath, false)) { // false is do not append - await file.WriteAsync (generatedProject); + var plist = InfoPlistGenerator.GenerateCode (GetPlistTemplate (platform), projectDefinition.Name); + var infoPlistPath = GetPListPath (generatedCodeDir, platform); + using (var file = new StreamWriter (infoPlistPath, false)) { // false is do not append + await file.WriteAsync (plist); + } + + var info = projectDefinition.GetAssemblyInclusionInformation (platform); + var generatedProject = GenerateMac (projectDefinition.Name, registerTypePath, info, GetProjectTemplate (platform), infoPlistPath, platform); + using (var file = new StreamWriter (projectPath, false)) { // false is do not append + await file.WriteAsync (generatedProject); + } + gp.Failure ??= info.FailureMessage; + gp.Failure ??= typesPerAssembly.FailureMessage; + } catch (Exception e) { + gp.Failure = e.Message; } - failure = failure ?? info.FailureMessage; - failure = failure ?? typesPerAssembly.FailureMessage; - } catch (Exception e) { - failure = e.Message; - } - projectPaths.Add ((projectDefinition.Name, projectPath, projectDefinition.IsXUnit, projectDefinition.ExtraArgs, failure, def.TimeoutMultiplier)); + }); + projectPaths.Add (gp); } return projectPaths; diff --git a/tests/xharness/Xharness.Tests/Tests/BCLTestImportTargetFactoryTest.cs b/tests/xharness/Xharness.Tests/Tests/BCLTestImportTargetFactoryTest.cs index 23bd0adb526f..e598e0023edf 100644 --- a/tests/xharness/Xharness.Tests/Tests/BCLTestImportTargetFactoryTest.cs +++ b/tests/xharness/Xharness.Tests/Tests/BCLTestImportTargetFactoryTest.cs @@ -82,22 +82,22 @@ public void MacMonoSDKPathSetterTest () } [Test] - public async Task GenerateTestProjectsAsyncTest () + public void GenerateTestProjectsAsyncTest () { var projects = new GeneratedProjects () { - ( Name: "First project", Path: "", XUnit: false, ExtraArgs: "", Failure: "", TimeoutMultiplier: 1), - ( Name: "Second project", Path: "", XUnit: true, ExtraArgs: "", Failure: "", TimeoutMultiplier: 1), + new GeneratedProject { Name = "First project", Path = "", XUnit = false, ExtraArgs = "", Failure = "", TimeoutMultiplier = 1, GenerationCompleted = Task.CompletedTask, }, + new GeneratedProject { Name = "Second project", Path = "", XUnit = true, ExtraArgs = "", Failure = "", TimeoutMultiplier = 1, GenerationCompleted = Task.CompletedTask, }, }; var infos = new List<(string Name, string [] Assemblies, string ExtraArgs, double TimeoutMultiplier)> { ( Name: "First project", Assemblies: new string [] { }, ExtraArgs: "", TimeoutMultiplier: 1), ( Name: "Second project", Assemblies: new string [] { }, ExtraArgs: "", TimeoutMultiplier: 1), }; - template.Setup (t => t.GenerateTestProjectsAsync (It.IsAny> (), It.IsAny ())).Returns (() => { - return Task.FromResult (projects); + template.Setup (t => t.GenerateTestProjects (It.IsAny> (), It.IsAny ())).Returns (() => { + return projects; }); - var result = await generator.GenerateTestProjectsAsync (infos, Platform.iOS); + var result = generator.GenerateTestProjects (infos, Platform.iOS); Assert.AreEqual (projects.Count, result.Count); - template.Verify (t => t.GenerateTestProjectsAsync (It.IsAny> (), It.IsAny ())); + template.Verify (t => t.GenerateTestProjects (It.IsAny> (), It.IsAny ())); } } }