5 // Marek Sieradzki (marek.sieradzki@gmail.com)
7 // (C) 2005 Marek Sieradzki
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:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
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.
29 using Microsoft.Build.BuildEngine;
30 using Microsoft.Build.Framework;
31 using Microsoft.Build.Utilities;
32 using NUnit.Framework;
35 namespace MonoTests.Microsoft.Build.BuildEngine {
37 class CheckUnregisterLogger : Logger {
38 bool anything = false;
40 public override void Initialize (IEventSource eventSource)
42 eventSource.AnyEventRaised += delegate { anything = true; };
43 eventSource.BuildFinished += delegate { anything = true; };
44 eventSource.BuildStarted += delegate { anything = true; };
45 eventSource.CustomEventRaised += delegate { anything = true; };
46 eventSource.ErrorRaised += delegate { anything = true; };
47 eventSource.MessageRaised += delegate { anything = true; };
48 eventSource.ProjectFinished += delegate { anything = true; };
49 eventSource.ProjectStarted += delegate { anything = true; };
50 eventSource.StatusEventRaised += delegate { anything = true; };
51 eventSource.TargetFinished += delegate { anything = true; };
52 eventSource.TargetStarted += delegate { anything = true; };
53 eventSource.TaskFinished += delegate { anything = true; };
54 eventSource.TaskStarted += delegate { anything = true; };
55 eventSource.WarningRaised += delegate { anything = true; };
58 public bool Anything { get { return anything; } }
62 public class EngineTest {
67 static string GetPropValue (BuildPropertyGroup bpg, string name)
69 foreach (BuildProperty bp in bpg) {
70 if (bp.Name == name) {
80 secondProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
81 <PropertyGroup Condition=""'$(foo)' == 'hello'"">
84 <Target Name=""TargetA"">
85 <Message Text=""(TargetA) foo: $(foo) A: $(A) External: $(External)""/>
88 <Target Name=""TargetB"">
89 <Message Text=""(TargetB) foo: $(foo) A: $(A) External: $(External)""/>
96 public void TestCtor ()
98 engine = new Engine (Consts.BinPath);
101 // Before a project can be instantiated, Engine.BinPath must be set to the location on disk where MSBuild is installed.
102 // This is used to evaluate $(MSBuildBinPath).
104 [ExpectedException (typeof (InvalidOperationException))]
105 public void TestNewProject ()
107 engine = new Engine ();
109 engine.CreateNewProject ();
113 public void TestBinPath ()
115 engine = new Engine (Consts.BinPath);
117 Assert.AreEqual (Consts.BinPath, engine.BinPath, "A1");
121 public void TestBuildEnabled ()
123 engine = new Engine (Consts.BinPath);
125 Assert.AreEqual (true, engine.BuildEnabled, "A1");
129 public void TestOnlyLogCriticalEvents ()
131 engine = new Engine (Consts.BinPath);
133 Assert.AreEqual (false, engine.OnlyLogCriticalEvents, "A1");
137 public void TestGlobalProperties ()
139 engine = new Engine (Consts.BinPath);
142 Assert.IsNotNull (engine.GlobalProperties, "A1");
143 Assert.AreEqual (0, engine.GlobalProperties.Count, "A2");
144 Assert.AreEqual (String.Empty, engine.GlobalProperties.Condition, "A3");
145 Assert.IsFalse (engine.GlobalProperties.IsImported, "A4");
147 engine.GlobalProperties.SetProperty ("GlobalA", "value1");
148 Assert.AreEqual (1, engine.GlobalProperties.Count, "A5");
149 engine.GlobalProperties.SetProperty ("GlobalB", "value1");
150 Assert.AreEqual (2, engine.GlobalProperties.Count, "A6");
151 engine.GlobalProperties.SetProperty ("GlobalA", "value2");
152 Assert.AreEqual (2, engine.GlobalProperties.Count, "A7");
154 project = engine.CreateNewProject ();
155 Assert.AreEqual (2, project.GlobalProperties.Count, "A8");
156 project.GlobalProperties.SetProperty ("GlobalC", "value3");
157 Assert.AreEqual (3, project.GlobalProperties.Count, "A9");
158 Assert.AreEqual (2, engine.GlobalProperties.Count, "A10");
160 project.GlobalProperties.SetProperty ("GlobalA", "value3");
161 Assert.AreEqual ("value2", GetPropValue(engine.GlobalProperties, "GlobalA"), "A11");
162 engine.GlobalProperties.SetProperty ("GlobalB", "value3");
163 Assert.AreEqual ("value1", GetPropValue(project.GlobalProperties, "GlobalB"), "A12");
165 engine.GlobalProperties.SetProperty ("GlobalC", "value4");
166 engine.GlobalProperties.SetProperty ("GlobalD", "value5");
167 Assert.AreEqual (4, engine.GlobalProperties.Count, "A13");
168 Assert.AreEqual (3, project.GlobalProperties.Count, "A14");
170 project = new Project (engine);
171 Assert.AreEqual (4, project.GlobalProperties.Count, "A15");
175 public void TestGlobalEngine ()
177 engine = new Engine ();
178 Assert.IsFalse (engine == Engine.GlobalEngine, "1");
179 Assert.IsNotNull (Engine.GlobalEngine, "2");
180 engine = Engine.GlobalEngine;
181 Assert.AreSame (engine, Engine.GlobalEngine, "3");
185 [ExpectedException (typeof (ArgumentNullException))]
186 [Category ("NotDotNet")]
187 public void TestRegisterLogger ()
189 engine = new Engine (Consts.BinPath);
190 engine.RegisterLogger (null);
193 // The "Project" object specified does not belong to the correct "Engine" object.
195 [ExpectedException (typeof (InvalidOperationException))]
196 public void TestUnloadProject1 ()
198 Engine a = new Engine (Consts.BinPath);
199 Engine b = new Engine (Consts.BinPath);
201 Project p = a.CreateNewProject ();
207 [ExpectedException (typeof (ArgumentNullException))]
208 [Category ("NotDotNet")]
209 public void TestUnloadProject2 ()
211 Engine a = new Engine (Consts.BinPath);
213 a.UnloadProject (null);
216 // This project object has been unloaded from the MSBuild engine and is no longer valid.
218 [ExpectedException (typeof (InvalidOperationException))]
219 public void TestUnloadProject3 ()
221 Engine a = new Engine (Consts.BinPath);
222 Project p = a.CreateNewProject ();
229 [Category ("NotWorking")]
230 public void TestUnregisterAllLoggers ()
232 engine = new Engine (Consts.BinPath);
233 CheckUnregisterLogger cul = new CheckUnregisterLogger ();
234 engine.RegisterLogger (cul);
236 engine.UnregisterAllLoggers ();
238 Assert.IsFalse (cul.Anything, "A1");
242 public void TestBuildError1 ()
244 engine = new Engine (Consts.BinPath);
245 Project project = engine.CreateNewProject ();
247 Assert.IsFalse (project.Build (), "A1");
248 Assert.IsFalse (project.Build ((string)null), "A2");
249 Assert.IsFalse (project.Build ((string [])null), "A3");
250 Assert.IsFalse (project.Build (new string [0]), "A4");
251 Assert.IsFalse (project.Build (null, null), "A5");
252 Assert.IsFalse (project.Build (null, null, BuildSettings.None), "A6");
253 //FIXME: Add test for Build (null, non-null-target)
257 public void TestBuildProjectFile1 ()
259 engine = new Engine (Consts.BinPath);
260 Project project = engine.CreateNewProject ();
261 project.LoadXml (@"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
263 <Message Text='Target 1 called'/>
267 Assert.IsTrue (project.Build ((string)null), "A1");
268 Assert.IsTrue (project.Build ((string [])null), "A2");
269 Assert.IsTrue (project.Build (new string [0]), "A3");
270 Assert.IsTrue (project.Build (null, null), "A4");
271 Assert.IsTrue (project.Build (null, null, BuildSettings.None), "A5");
272 //FIXME: Add test for Build (null, non-null-target)
276 [ExpectedException (typeof (ArgumentException))]
277 public void TestBuildProject1 ()
279 engine = new Engine (Consts.BinPath);
280 engine.BuildProject (null);
284 public void TestBuildProject2 ()
286 engine = new Engine (Consts.BinPath);
287 Project project = engine.CreateNewProject ();
289 Assert.IsFalse (engine.BuildProject (project, (string)null), "#A1");
290 Assert.IsFalse (engine.BuildProject (project, (string [])null), "#A2");
291 Assert.IsFalse (engine.BuildProject (project, (string [])null, null), "#A3");
292 Assert.IsFalse (engine.BuildProject (project, (string [])null, null, BuildSettings.None), "#A4");
294 bool caught_exception = false;
296 //null string in targetNames [] param
297 engine.BuildProject (project, new string [] {null}, null);
299 caught_exception = true;
301 if (!caught_exception)
302 Assert.Fail ("Expected exception for Engine.BuildProject");
306 [ExpectedException (typeof (ArgumentException))]
307 public void TestBuildProjectNull1 ()
309 engine = new Engine (Consts.BinPath);
310 engine.BuildProject (null, "foo");
314 [ExpectedException (typeof (ArgumentException))]
315 public void TestBuildProjectNull2 ()
317 engine = new Engine (Consts.BinPath);
318 engine.BuildProject (null, (string)null);
321 // Tests to check global properties behavior
323 public void TestGlobalProperties1 ()
325 string mainProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
326 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild"" AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
327 <Target Name=""main"">
328 <MSBuild Projects=""first.proj"" Targets = ""1;2""/>
329 <Message Text=""second""/>
330 <MSBuild Projects=""first.proj"" Targets = ""1;2""/>
334 string firstProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
335 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild""
336 AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
337 <Target Name = ""1"">
338 <MSBuild Projects=""second.proj"" Properties=""foo=bar""/>
339 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo""/>
342 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
343 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
344 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo1"" />
345 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo"" />
350 CreateAndCheckGlobalPropertiesTest (mainProject, firstProject, secondProject,
353 "(TargetA) foo: bar A: External: ",
354 "(TargetB) foo: foofoo A: External: ",
355 "(TargetA) foo: A: External: ",
356 "(TargetB) foo: foofoo1 A: External: ",
361 public void TestGlobalProperties1a ()
363 Directory.CreateDirectory ("Test/resources/foo");
364 string mainProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
365 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild"" AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
366 <Target Name=""main"">
367 <MSBuild Projects=""first.proj"" Targets = ""1;2""/>
368 <Message Text=""second""/>
369 <MSBuild Projects=""first.proj"" Targets = ""1;2""/>
373 string firstProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
374 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild""
375 AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
376 <Target Name = ""1"">
377 <MSBuild Projects=""second.proj"" Properties=""foo=bar""/>
378 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo""/>
381 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
382 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
383 <MSBuild Projects=""second.proj"" Targets = ""TargetA"" Properties=""foo=bar""/>
384 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo"" />
385 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo1"" />
389 CreateAndCheckGlobalPropertiesTest (mainProject, firstProject, secondProject,
392 "(TargetA) foo: bar A: External: ",
393 "(TargetB) foo: foofoo A: External: ",
394 "(TargetA) foo: A: External: ",
395 "(TargetB) foo: foofoo1 A: External: ",
400 public void TestGlobalProperties1b ()
402 string mainProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
403 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild"" AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
404 <Target Name=""main"">
405 <MSBuild Projects=""first.proj"" Targets = ""1;2""/>
406 <Message Text=""second""/>
407 <MSBuild Projects=""first.proj"" Targets = ""1;2""/>
411 string firstProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
412 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild""
413 AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
414 <Target Name = ""1"">
415 <MSBuild Projects=""second.proj"" Properties=""foo=bar""/>
416 <MSBuild Projects=""second.proj""/>
417 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo""/>
420 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
421 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
422 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo1"" />
423 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo"" />
427 CreateAndCheckGlobalPropertiesTest (mainProject, firstProject, secondProject,
430 "(TargetA) foo: bar A: External: ",
431 "(TargetA) foo: A: External: ",
432 "(TargetB) foo: foofoo A: External: ",
433 "(TargetB) foo: foofoo1 A: External: ",
438 public void TestGlobalProperties2 ()
440 string mainProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
441 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild"" AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
442 <Target Name=""main"">
443 <MSBuild Projects=""first.proj"" Targets = ""1""/>
444 <MSBuild Projects=""first.proj"" Targets = ""2""/>
445 <Message Text=""second""/>
446 <MSBuild Projects=""first.proj"" Targets = ""1;2""/>
450 string firstProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
451 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild""
452 AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
453 <Target Name = ""1"">
454 <MSBuild Projects=""second.proj"" Properties=""foo=bar""/>
455 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo""/>
458 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
459 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
460 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo"" />
461 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo1"" />
466 CreateAndCheckGlobalPropertiesTest (mainProject, firstProject, secondProject,
469 "(TargetA) foo: bar A: External: ",
470 "(TargetB) foo: foofoo A: External: ",
471 "(TargetA) foo: A: External: ",
472 "(TargetB) foo: foofoo1 A: External: ",
477 public void TestGlobalProperties3 ()
479 string mainProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
480 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild"" AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
481 <Target Name=""main"">
482 <MSBuild Projects=""first.proj"" Targets = ""1""/>
483 <CallTarget Targets=""Call2""/>
484 <Message Text=""second""/>
485 <MSBuild Projects=""first.proj"" Targets = ""1;2""/>
487 <Target Name=""Call2"">
488 <MSBuild Projects=""first.proj"" Targets = ""2""/>
492 string firstProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
493 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild""
494 AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
495 <Target Name = ""1"">
496 <MSBuild Projects=""second.proj"" Properties=""foo=bar""/>
497 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo""/>
500 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
501 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
502 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo"" />
503 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo1"" />
508 CreateAndCheckGlobalPropertiesTest (mainProject, firstProject, secondProject,
511 "(TargetA) foo: bar A: External: ",
512 "(TargetB) foo: foofoo A: External: ",
513 "(TargetA) foo: A: External: ",
514 "(TargetB) foo: foofoo1 A: External: ",
518 //externally set global properties
520 public void TestGlobalProperties4 ()
522 string mainProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
523 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild"" AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
524 <Target Name=""main"">
525 <MSBuild Projects=""first.proj"" Targets = ""1""/>
526 <CallTarget Targets=""Call2""/>
527 <Message Text=""second""/>
528 <MSBuild Projects=""first.proj"" Targets = ""1;2""/>
530 <Target Name=""Call2"">
531 <MSBuild Projects=""first.proj"" Targets = ""2""/>
535 string firstProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
536 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild""
537 AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
538 <Target Name = ""1"">
539 <MSBuild Projects=""second.proj"" Properties=""foo=bar""/>
540 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo""/>
543 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
544 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
545 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo"" />
546 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo1"" />
551 BuildPropertyGroup globalprops = new BuildPropertyGroup ();
552 globalprops.SetProperty ("foo", "hello");
553 engine.GlobalProperties = globalprops;
555 CreateAndCheckGlobalPropertiesTest (mainProject, firstProject, secondProject,
556 globalprops, null, 10, 8, 15,
558 "(TargetA) foo: bar A: External: ",
559 "(TargetB) foo: foofoo A: External: ",
560 "(TargetA) foo: hello A: FooWasHello External: ",
561 "(TargetB) foo: foofoo1 A: External: ",
565 //externally set global properties, merge with explicit
567 public void TestGlobalProperties4a ()
569 string mainProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
570 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild"" AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
571 <Target Name=""main"">
572 <MSBuild Projects=""first.proj"" Targets = ""1""/>
573 <CallTarget Targets=""Call2""/>
574 <Message Text=""second""/>
575 <MSBuild Projects=""first.proj"" Targets = ""1;2""/>
577 <Target Name=""Call2"">
578 <MSBuild Projects=""first.proj"" Targets = ""2""/>
582 string firstProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
583 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild""
584 AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
585 <Target Name = ""1"">
586 <MSBuild Projects=""second.proj"" Properties=""foo=bar""/>
587 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo""/>
590 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
591 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
592 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo"" />
593 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo1"" />
598 BuildPropertyGroup globalprops = new BuildPropertyGroup ();
599 globalprops.SetProperty ("external", "ExternalValue");
601 CreateAndCheckGlobalPropertiesTest (mainProject, firstProject, secondProject,
605 "(TargetA) foo: bar A: External: ExternalValue",
606 "(TargetB) foo: foofoo A: External: ExternalValue",
607 "(TargetA) foo: A: External: ExternalValue",
608 "(TargetB) foo: foofoo1 A: External: ExternalValue",
612 //set global properties on _project_, merge with explicit
614 public void TestGlobalProperties4b ()
616 string mainProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
617 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild"" AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
618 <Target Name=""main"">
619 <MSBuild Projects=""first.proj"" Targets = ""1""/>
620 <CallTarget Targets=""Call2""/>
621 <Message Text=""second""/>
622 <MSBuild Projects=""first.proj"" Targets = ""1;2""/>
624 <Target Name=""Call2"">
625 <MSBuild Projects=""first.proj"" Targets = ""2""/>
629 string firstProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
630 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild""
631 AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
632 <Target Name = ""1"">
633 <MSBuild Projects=""second.proj"" Properties=""foo=bar""/>
634 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo""/>
637 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
638 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
639 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo"" />
640 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo1"" />
645 BuildPropertyGroup globalprops = new BuildPropertyGroup ();
646 globalprops.SetProperty ("external", "ExternalValue");
648 BuildPropertyGroup project_globalprops = new BuildPropertyGroup ();
649 project_globalprops.SetProperty ("external", "ProjExternalValue");
650 project_globalprops.SetProperty ("foo", "ProjFooValue");
652 CreateAndCheckGlobalPropertiesTest (mainProject, firstProject, secondProject,
653 globalprops, project_globalprops,
656 "(TargetA) foo: bar A: External: ProjExternalValue",
657 "(TargetB) foo: foofoo A: External: ProjExternalValue",
658 "(TargetA) foo: ProjFooValue A: External: ProjExternalValue",
659 "(TargetB) foo: foofoo1 A: External: ProjExternalValue",
663 //set global properties on _project_, and engine and explicit via msbuild
665 public void TestGlobalProperties4c ()
667 string mainProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
668 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild"" AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
669 <Target Name=""main"">
670 <MSBuild Projects=""first.proj"" Targets = ""1""/>
671 <CallTarget Targets=""Call2""/>
672 <Message Text=""second""/>
673 <MSBuild Projects=""first.proj"" Targets = ""1;2""/>
675 <Target Name=""Call2"">
676 <MSBuild Projects=""first.proj"" Targets = ""2""/>
680 string firstProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
681 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild""
682 AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
683 <Target Name = ""1"">
684 <MSBuild Projects=""second.proj"" Properties=""foo=bar""/>
685 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo""/>
688 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
689 <MSBuild Projects=""second.proj"" Targets = ""TargetA""/>
690 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo"" />
691 <MSBuild Projects=""second.proj"" Targets = ""TargetB"" Properties=""foo=foofoo1"" />
696 BuildPropertyGroup globalprops = new BuildPropertyGroup ();
697 globalprops.SetProperty ("foo", "EngineFooValue");
699 BuildPropertyGroup project_globalprops = new BuildPropertyGroup ();
700 project_globalprops.SetProperty ("foo", "ProjFooValue");
702 CreateAndCheckGlobalPropertiesTest (mainProject, firstProject, secondProject,
703 globalprops, project_globalprops,
706 "(TargetA) foo: bar A: External: ",
707 "(TargetB) foo: foofoo A: External: ",
708 "(TargetA) foo: ProjFooValue A: External: ",
709 "(TargetB) foo: foofoo1 A: External: ",
713 public void TestMSBuildOutputs ()
715 string mainProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
716 <UsingTask TaskName=""Microsoft.Build.Tasks.MSBuild""
717 AssemblyName=""Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"" />
720 <ProjectRef Include=""first.proj"">
722 <Unique>true</Unique>
724 <ProjectRef Include=""first.proj"">
725 <Prop3>value2</Prop3>
726 <Unique>false</Unique>
729 <ProjectRef Include=""second.proj"">
730 <Prop3>value3</Prop3>
731 <Unique>unique</Unique>
737 <MSBuild Projects=""@(ProjectRef)"" Targets=""GetData"">
738 <Output TaskParameter=""TargetOutputs"" ItemName=""F""/>
740 <Message Text=""@(F): F.Unique: %(F.Unique)""/>
741 <Message Text=""@(F): F.Prop1: %(F.Prop1)""/>
742 <Message Text=""@(F): F.Prop2: %(F.Prop2)""/>
743 <Message Text=""@(F): F.Prop3: %(F.Prop3)""/>
747 string firstProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
749 <A Include=""foofoo"">
752 <Prop3>foo value</Prop3>
755 <A Include=""barbar"">
756 <Prop1>bar_false</Prop1>
757 <Prop2>bar_false</Prop2>
758 <Prop3>bar value</Prop3>
763 <Target Name=""GetData"" Outputs=""@(AbcOutputs)"">
764 <CreateItem Include=""@(A)"">
765 <Output TaskParameter=""Include"" ItemName=""AbcOutputs""/>
770 string secondProject = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
772 <A Include=""from_second"">
775 <Prop3>new value</Prop3>
779 <Target Name=""GetData"" Outputs=""@(AbcOutputs)"">
780 <CreateItem Include=""@(A)"">
781 <Output TaskParameter=""Include"" ItemName=""AbcOutputs""/>
787 CreateAndCheckGlobalPropertiesTest (mainProject, firstProject, secondProject,
791 "foofoo;barbar;foofoo;barbar: F.Unique: true",
792 "from_second: F.Unique: unique",
793 "foofoo;foofoo;from_second: F.Prop1: false",
794 "barbar;barbar: F.Prop1: bar_false",
795 "foofoo;foofoo;from_second: F.Prop2: false",
796 "barbar;barbar: F.Prop2: bar_false",
797 "foofoo;foofoo: F.Prop3: foo value",
798 "barbar;barbar: F.Prop3: bar value",
799 "from_second: F.Prop3: new value",
803 // Helper Methods for TestGlobalProperties*
805 void CreateAndCheckGlobalPropertiesTest (string main, string first, string second,
806 int project_count, int target_count, int task_count, string [] messages)
808 CreateAndCheckGlobalPropertiesTest (main, first, second, null, null,
809 project_count, target_count, task_count, messages);
812 void CreateAndCheckGlobalPropertiesTest (string main, string first, string second,
813 BuildPropertyGroup engine_globals, BuildPropertyGroup project_globals,
814 int project_count, int target_count, int task_count, string [] messages)
816 WriteGlobalPropertiesProjects (main, first, second);
818 Engine engine = new Engine (Consts.BinPath);
819 if (engine_globals != null)
820 engine.GlobalProperties = engine_globals;
821 MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
822 new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
823 engine.RegisterLogger (logger);
825 Project project = engine.CreateNewProject ();
826 project.Load (Path.Combine ("Test", Path.Combine ("resources", "main.proj")));
827 if (project_globals != null)
828 project.GlobalProperties = project_globals;
830 bool result = project.Build ();
832 logger.DumpMessages ();
833 Assert.Fail ("Build failed");
836 CheckEventCounts (logger, project_count, target_count, task_count);
838 CheckLoggedMessages (logger, messages, "A1");
841 void CheckEventCounts (MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger,
842 int project, int target, int task)
845 Assert.AreEqual (project, logger.ProjectStarted, "#project started events");
846 Assert.AreEqual (project, logger.ProjectFinished, "#project finished events");
847 Assert.AreEqual (target, logger.TargetStarted, "#target started events");
848 Assert.AreEqual (target, logger.TargetFinished, "#target finished events");
849 Assert.AreEqual (task, logger.TaskStarted, "#task started events");
850 Assert.AreEqual (task, logger.TaskFinished, "#task finished events");
851 Assert.AreEqual (1, logger.BuildStarted, "#build started events");
852 Assert.AreEqual (1, logger.BuildFinished, "#build finished events");
853 } catch (AssertionException) {
854 logger.DumpMessages ();
859 void CheckLoggedMessages (MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger, string [] messages,
863 for (int i = 0; i < messages.Length; i++) {
864 logger.CheckLoggedMessageHead (messages [i], String.Format ("{0} #{1}", prefix, i));
867 logger.DumpMessages ();
871 Assert.AreEqual (0, logger.NormalMessageCount, "Number of remaining messages");
874 // helper methods for TestGlobalProperties*
875 void WriteGlobalPropertiesProjects (string mainProject, string firstProject, string secondProject)
877 using (StreamWriter sw = new StreamWriter (Path.Combine ("Test", Path.Combine ("resources", "main.proj")))) {
878 sw.Write (mainProject);
881 using (StreamWriter sw = new StreamWriter (Path.Combine ("Test", Path.Combine ("resources", "first.proj")))) {
882 sw.Write (firstProject);
885 using (StreamWriter sw = new StreamWriter (Path.Combine ("Test", Path.Combine ("resources", "second.proj")))) {
886 sw.Write (secondProject);