do not try to load assembly with empty string specification. Add tests for import...
authorAtsushi Eno <atsushieno@gmail.com>
Tue, 28 Jan 2014 11:04:42 +0000 (20:04 +0900)
committerAtsushi Eno <atsushieno@gmail.com>
Thu, 20 Feb 2014 09:22:23 +0000 (18:22 +0900)
One of the tests fail because we actually fail to pick up imported UsingTasks.

mcs/class/Microsoft.Build/Makefile
mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildTaskDatabase.cs
mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs

index 931b9fc7e57482e278392af95aabd5ab397d55c8..279a8147c6f7b957644f162717232fd6c72527ef 100644 (file)
@@ -16,7 +16,8 @@ LIB_MCS_FLAGS = \
        /r:Microsoft.Build.Framework.dll        \
        /d:MICROSOFT_BUILD_DLL
        
-TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)
+TEST_MCS_FLAGS = $(LIB_MCS_FLAGS) \
+       /r:Microsoft.Build.Utilities.v4.0.dll
 
 EXTRA_DISTFILES = \
        Microsoft.Build.Internal/ExpressionParser.jay   \
index 0b7660b2d4528951a09c9ee272d30ea0c58ce7d9..5e50748b5c766ffa507df150a55201fda808ceb6 100644 (file)
@@ -107,7 +107,7 @@ namespace Microsoft.Build.Internal
                                var ta = assemblies.FirstOrDefault (a => a.AssemblyFile.Equals (ut.AssemblyFile, StringComparison.OrdinalIgnoreCase) || a.AssemblyName.Equals (ut.AssemblyName, StringComparison.OrdinalIgnoreCase));
                                if (ta == null) {
                                        ta = new TaskAssembly () { AssemblyName = ut.AssemblyName, AssemblyFile = ut.AssemblyFile };
-                                       ta.LoadedAssembly = ta.AssemblyName != null ? Assembly.Load (ta.AssemblyName) : Assembly.LoadFile (ta.AssemblyFile);
+                                       ta.LoadedAssembly = !string.IsNullOrEmpty (ta.AssemblyName) ? Assembly.Load (ta.AssemblyName) : Assembly.LoadFile (ta.AssemblyFile);
                                        assemblies.Add (ta);
                                }
                                var pg = ut.ParameterGroup == null ? null : ut.ParameterGroup.Parameters.Select (p => new TaskPropertyInfo (p.Name, Type.GetType (p.ParameterType), cond (p.Output), cond (p.Required)))
index 01ed253cf473e126ebd6d660f20ba7bbd2c11dd1..139a52b1108d6c3371d22b7c94e9c991b27c573d 100644 (file)
@@ -33,6 +33,9 @@ using Microsoft.Build.Construction;
 using Microsoft.Build.Execution;
 using NUnit.Framework;
 using Microsoft.Build.Evaluation;
+using Microsoft.Build.Utilities;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Logging;
 
 namespace MonoTests.Microsoft.Build.Execution
 {
@@ -143,6 +146,68 @@ namespace MonoTests.Microsoft.Build.Execution
                        var proj = new ProjectInstance (root);
                        Assert.AreEqual ("y", proj.GetPropertyValue ("X"), "#1");
                }
+               
+               [Test]
+               public void FirstUsingTaskTakesPrecedence1 ()
+               {
+                       FirstUsingTaskTakesPrecedenceCommon (false, false);
+               }
+               
+               [Test]
+               public void FirstUsingTaskTakesPrecedence2 ()
+               {
+                       FirstUsingTaskTakesPrecedenceCommon (true, true);
+               }
+               
+               public void FirstUsingTaskTakesPrecedenceCommon (bool importFirst, bool buildShouldSucceed)
+               {
+                       string thisAssembly = GetType ().Assembly.GetName ().Name;
+                       string filename = "Test/ProjectTargetInstanceTest.FirstUsingTaskTakesPrecedence.Import.proj";
+                       string imported_xml = string.Format (@"<Project DefaultTargets='Foo' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
+  <UsingTask TaskName='MonoTests.Microsoft.Build.Execution.MyTask' AssemblyFile='{0}.dll' />
+</Project>", thisAssembly);
+                       string usingTask =  string.Format ("<UsingTask TaskName='MonoTests.Microsoft.Build.Execution.SubNamespace.MyTask' AssemblyFile='{0}.dll' />", thisAssembly);
+                       string import = string.Format ("<Import Project='{0}' />", filename);
+                       string project_xml = string.Format (@"<Project DefaultTargets='Foo' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
+                       {0}
+                       {1}
+  <Target Name='Foo'>
+    <MyTask />
+  </Target>
+</Project>", 
+                               importFirst ? import : usingTask, importFirst ? usingTask : import);
+                       try {
+                               File.WriteAllText (filename, imported_xml);
+                               var xml = XmlReader.Create (new StringReader (project_xml));
+                               var root = ProjectRootElement.Create (xml);
+                               Assert.IsTrue (root.UsingTasks.All (u => !string.IsNullOrEmpty (u.AssemblyFile)), "#1");
+                               Assert.IsTrue (root.UsingTasks.All (u => string.IsNullOrEmpty (u.AssemblyName)), "#2");
+                               root.FullPath = "ProjectTargetInstanceTest.FirstUsingTaskTakesPrecedence.proj";
+                               var proj = new ProjectInstance (root);
+                               Assert.AreEqual (buildShouldSucceed, proj.Build (), "#3");
+                       } finally {
+                               File.Delete (filename);
+                       }
+               }
+       }
+       
+       namespace SubNamespace
+       {
+               public class MyTask : Task
+               {
+                       public override bool Execute ()
+                       {
+                               return false;
+                       }
+               }
+       }
+               
+       public class MyTask : Task
+       {
+               public override bool Execute ()
+               {
+                       return true;
+               }
        }
 }