minor fix for bug 9520:
[mono.git] / mcs / class / Microsoft.Build.Engine / Test / Microsoft.Build.BuildEngine / UsingTaskTest.cs
1 //
2 // UsingTaskTest.cs
3 //
4 // Author:
5 //   Marek Sieradzki (marek.sieradzki@gmail.com)
6 //
7 // (C) 2006 Marek Sieradzki
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28 using System;
29 using System.Collections;
30 using Microsoft.Build.BuildEngine;
31 using Microsoft.Build.Framework;
32 using Microsoft.Build.Utilities;
33 using NUnit.Framework;
34
35 namespace MonoTests.Microsoft.Build.BuildEngine {
36         [TestFixture]
37         public class UsingTaskTest {
38                 
39                 Engine          engine;
40                 Project         project;
41                 
42                 [Test]
43                 public void TestAssemblyFile1 ()
44                 {
45                         string documentString = @"
46                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
47                                         <UsingTask
48                                                 AssemblyFile='Test/resources/TestTasks.dll'
49                                                 TaskName='SimpleTask'
50                                                 Condition='true'
51                                         />
52                                 </Project>
53                         ";
54
55                         engine = new Engine (Consts.BinPath);
56                         project = engine.CreateNewProject ();
57                         project.LoadXml (documentString);
58                         
59                         IEnumerator en = project.UsingTasks.GetEnumerator ();
60                         en.MoveNext ();
61                         
62                         UsingTask ut = (UsingTask) en.Current;
63                         
64                         Assert.AreEqual ("Test/resources/TestTasks.dll", ut.AssemblyFile, "A1");
65                         Assert.IsNull (ut.AssemblyName, "A2");
66                         Assert.AreEqual ("true", ut.Condition, "A3");
67                         Assert.AreEqual (false, ut.IsImported, "A4");
68                         Assert.AreEqual ("SimpleTask", ut.TaskName, "A5");
69                 }
70
71                 [Test]
72                 public void TestAssemblyFile2 ()
73                 {
74                         string documentString = @"
75                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
76                                         <UsingTask
77                                                 AssemblyFile='Test/resources/TestTasks.dll'
78                                                 TaskName='SimpleTask'
79                                         />
80                                 </Project>
81                         ";
82
83                         engine = new Engine (Consts.BinPath);
84                         project = engine.CreateNewProject ();
85                         project.LoadXml (documentString);
86                         
87                         IEnumerator en = project.UsingTasks.GetEnumerator ();
88                         en.MoveNext ();
89                         
90                         UsingTask ut = (UsingTask) en.Current;
91                         
92                         Assert.AreEqual ("Test/resources/TestTasks.dll", ut.AssemblyFile, "A1");
93                         Assert.IsNull (ut.AssemblyName, "A2");
94                         Assert.AreEqual (null, ut.Condition, "A3");
95                         Assert.AreEqual (false, ut.IsImported, "A4");
96                         Assert.AreEqual ("SimpleTask", ut.TaskName, "A5");
97                 }
98
99                 [Test]
100                 // NOTE: quite hacky test, it works because MSBuild doesn't check type of task at loading
101                 public void TestAssemblyName ()
102                 {
103                         string documentString = @"
104                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
105                                         <UsingTask
106                                                 AssemblyName='System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
107                                                 TaskName='System.Uri'
108                                                 Condition='true'
109                                         />
110                                 </Project>
111                         ";
112
113                         engine = new Engine (Consts.BinPath);
114                         project = engine.CreateNewProject ();
115                         project.LoadXml (documentString);
116                         
117                         IEnumerator en = project.UsingTasks.GetEnumerator ();
118                         en.MoveNext ();
119                         
120                         UsingTask ut = (UsingTask) en.Current;
121                         
122                         Assert.AreEqual ("System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", ut.AssemblyName, "A1");
123                         Assert.IsNull (ut.AssemblyFile, "A2");
124                         Assert.AreEqual ("true", ut.Condition, "A3");
125                         Assert.AreEqual (false, ut.IsImported, "A4");
126                         Assert.AreEqual ("System.Uri", ut.TaskName, "A5");
127                 }
128                 
129                 [Test]
130                 [ExpectedException (typeof (InvalidProjectFileException))]
131                 public void TestTaskName ()
132                 {
133                         string documentString = @"
134                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
135                                         <UsingTask
136                                                 AssemblyFile='Test/resources/TestTasks.dll'
137                                         />
138                                 </Project>
139                         ";
140
141                         engine = new Engine (Consts.BinPath);
142                         project = engine.CreateNewProject ();
143                         project.LoadXml (documentString);
144                 }
145
146                 [Test]
147                 [ExpectedException (typeof (InvalidProjectFileException))]
148                 public void TestAssemblyNameOrAssemblyFile1 ()
149                 {
150                         string documentString = @"
151                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
152                                         <UsingTask
153                                                 TaskName='SimpleTask'
154                                         />
155                                 </Project>
156                         ";
157
158                         engine = new Engine (Consts.BinPath);
159                         project = engine.CreateNewProject ();
160                         project.LoadXml (documentString);
161                 }
162
163                 [Test]
164                 public void TestAssemblyNameOrAssemblyFileConditionFalse ()
165                 {
166                         string documentString = @"
167                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
168                                         <UsingTask
169                                                 TaskName='SimpleTask'
170                                                 Condition='false'
171                                         />
172                                 </Project>
173                         ";
174
175                         engine = new Engine (Consts.BinPath);
176                         project = engine.CreateNewProject ();
177                         try {
178                                 project.LoadXml (documentString);
179                         } catch (InvalidProjectFileException) {
180                                 return;
181                         }
182                         Assert.Fail ("Project load should've failed");
183                 }
184
185                 [Test]
186                 [ExpectedException (typeof (InvalidProjectFileException))]
187                 public void TestAssemblyNameOrAssemblyFile2 ()
188                 {
189                         string documentString = @"
190                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
191                                         <UsingTask
192                                                 TaskName='SimpleTask'
193                                                 AssemblyFile='A'
194                                                 AssemblyName='B'
195                                         />
196                                 </Project>
197                         ";
198
199                         engine = new Engine (Consts.BinPath);
200                         project = engine.CreateNewProject ();
201                         project.LoadXml (documentString);
202                 }
203
204                 [Test]
205                 public void TestDuplicate1 ()
206                 {
207                         string documentString = @"
208                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
209                                         <UsingTask
210                                                 AssemblyFile='Test/resources/TestTasks.dll'
211                                                 TaskName='TrueTestTask'
212                                         />
213                                         <UsingTask
214                                                 AssemblyFile='Test/resources/TestTasks.dll'
215                                                 TaskName='TrueTestTask'
216                                         />
217
218                                         <Target Name='1'>
219                                                 <TrueTestTask/>
220                                         </Target>
221                                 </Project>
222                         ";
223
224                         engine = new Engine (Consts.BinPath);
225                         project = engine.CreateNewProject ();
226                         MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
227                                 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
228                         engine.RegisterLogger (logger);
229
230                         project.LoadXml (documentString);
231
232                         if (!project.Build ("1")) {
233                                 logger.DumpMessages ();
234                                 Assert.Fail ("Build failed");
235                         }
236
237                         Assert.AreEqual (2, project.UsingTasks.Count, "A0");
238
239                         foreach (UsingTask ut in project.UsingTasks) {
240                                 Assert.AreEqual ("Test/resources/TestTasks.dll", ut.AssemblyFile, "A1");
241                                 Assert.IsNull (ut.AssemblyName, "A2");
242                                 Assert.AreEqual (null, ut.Condition, "A3");
243                                 Assert.AreEqual (false, ut.IsImported, "A4");
244                                 Assert.AreEqual ("TrueTestTask", ut.TaskName, "A5");
245                         }
246                 }
247
248
249                 [Test]
250                 public void TestLazyLoad1 ()
251                 {
252                         string documentString = @"
253                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
254                                         <UsingTask
255                                                 AssemblyFile='NonExistantAssembly.dll'
256                                                 TaskName='SimpleTask'
257                                         />
258                                         <Target Name='1'>
259                                                 <Message Text='hello'/>
260                                         </Target>
261                                         <Target Name='2'>
262                                                 <SimpleTask Foo='bar'/>
263                                         </Target>
264                                 </Project>
265                         ";
266
267                         engine = new Engine (Consts.BinPath);
268                         project = engine.CreateNewProject ();
269                         MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
270                                 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
271                         engine.RegisterLogger (logger);
272
273                         project.LoadXml (documentString);
274
275                         if (!project.Build ("1")) {
276                                 logger.DumpMessages ();
277                                 Assert.Fail ("Build failed");
278                         }
279
280                         if (project.Build ("2"))
281                                 Assert.Fail ("Build should've failed, as a task from a nonexistant assembly is referenced");
282
283
284                         IEnumerator en = project.UsingTasks.GetEnumerator ();
285                         en.MoveNext ();
286
287                         UsingTask ut = (UsingTask) en.Current;
288
289                         Assert.AreEqual ("NonExistantAssembly.dll", ut.AssemblyFile, "A1");
290                         Assert.IsNull (ut.AssemblyName, "A2");
291                         Assert.AreEqual (null, ut.Condition, "A3");
292                         Assert.AreEqual (false, ut.IsImported, "A4");
293                         Assert.AreEqual ("SimpleTask", ut.TaskName, "A5");
294                 }
295
296                 [Test]
297                 public void TestLazyLoad2 ()
298                 {
299                         string documentString = @"
300                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
301                                         <UsingTask
302                                                 AssemblyFile='Test/resources/TestTasks.dll'
303                                                 TaskName='Another.SameTask'
304                                         />
305                                         <UsingTask
306                                                 AssemblyFile='Test/resources/TestTasks.dll'
307                                                 TaskName='Other.SameTask'
308                                         />
309
310                                         <Target Name='1'>
311                                                 <Other.SameTask>
312                                                         <Output TaskParameter='OutputString' ItemName='I0'/>
313                                                 </Other.SameTask>
314                                                 <Another.SameTask>
315                                                         <Output TaskParameter='OutputString' ItemName='I1'/>
316                                                 </Another.SameTask>
317                                                 <Message Text='I0: @(I0) I1: @(I1)'/>
318                                         </Target>
319                                 </Project>
320                         ";
321
322                         engine = new Engine (Consts.BinPath);
323                         project = engine.CreateNewProject ();
324                         MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
325                                 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
326                         engine.RegisterLogger (logger);
327
328                         project.LoadXml (documentString);
329
330                         if (!project.Build ("1")) {
331                                 logger.DumpMessages ();
332                                 Assert.Fail ("Build failed");
333                         }
334
335                         logger.CheckLoggedMessageHead ("I0: Other.SameTask I1: Another.SameTask", "A1");
336                 }
337
338                 [Test]
339                 public void TestLazyLoad3 ()
340                 {
341                         string documentString = @"
342                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
343                                         <UsingTask
344                                                 AssemblyFile='Test/resources/TestTasks.dll'
345                                                 TaskName='Another.SameTask'
346                                                 Condition='false'
347                                         />
348
349                                         <Target Name='1'>
350                                                 <Another.SameTask />
351                                         </Target>
352                                 </Project>
353                         ";
354
355                         engine = new Engine (Consts.BinPath);
356                         project = engine.CreateNewProject ();
357                         MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
358                                 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
359                         engine.RegisterLogger (logger);
360
361                         project.LoadXml (documentString);
362
363                         IEnumerator en = project.UsingTasks.GetEnumerator ();
364                         en.MoveNext ();
365
366                         UsingTask ut = (UsingTask) en.Current;
367
368                         Assert.AreEqual ("Test/resources/TestTasks.dll", ut.AssemblyFile, "A1");
369                         Assert.IsNull (ut.AssemblyName, "A2");
370                         Assert.AreEqual ("false", ut.Condition, "A3");
371                         Assert.AreEqual (false, ut.IsImported, "A4");
372                         Assert.AreEqual ("Another.SameTask", ut.TaskName, "A5");
373
374                         if (project.Build ("1")) {
375                                 logger.DumpMessages ();
376                                 Assert.Fail ("Build should've failed");
377                         }
378                 }
379
380         }
381 }