Index: E:/Source/OpenSource/ccnet-svn-trunk/project/core/tasks/DevenvTask.cs =================================================================== --- E:/Source/OpenSource/ccnet-svn-trunk/project/core/tasks/DevenvTask.cs (revision 3607) +++ E:/Source/OpenSource/ccnet-svn-trunk/project/core/tasks/DevenvTask.cs (working copy) @@ -22,6 +22,7 @@ private IRegistry registry; private ProcessExecutor executor; private string executable; + private string version; public DevenvTask() : this(new Registry(), new ProcessExecutor()) { } @@ -31,6 +32,29 @@ this.executor = executor; } + [ReflectorProperty("version", Required = false)] + public string Version + { + get { return version; } + + set + { + if (value != "9.0" && + value != "8.0" && + value != "7.1" && + value != "7.0" && + value != "VS2008" && + value != "VS2005" && + value != "VS2003" && + value != "VS2002") + { + throw new CruiseControlException("Invalid value for Version, expected one of 9.0, 8.0, 7.1, 7.0, VS2008, VS2005, VS2003 or VS2002"); + } + + version = value; + } + } + [ReflectorProperty("executable", Required=false)] public string Executable { @@ -51,20 +75,50 @@ /// The fully-qualified pathname of the executable. private string ReadDevenvExecutableFromRegistry() { - string registryValue; - registryValue = registry.GetLocalMachineSubKeyValue(VS2008_REGISTRY_PATH, VS_REGISTRY_KEY); - if (registryValue == null) - { - registryValue = registry.GetLocalMachineSubKeyValue(VS2005_REGISTRY_PATH, VS_REGISTRY_KEY); - } - if (registryValue == null) - { - registryValue = registry.GetLocalMachineSubKeyValue(VS2003_REGISTRY_PATH, VS_REGISTRY_KEY); - } - if (registryValue == null) + string registryValue = null; + + if (Version == null) { - registryValue = registry.GetExpectedLocalMachineSubKeyValue(VS2002_REGISTRY_PATH, VS_REGISTRY_KEY); + registryValue = registry.GetLocalMachineSubKeyValue(VS2008_REGISTRY_PATH, VS_REGISTRY_KEY); + + if (registryValue == null) + { + registryValue = registry.GetLocalMachineSubKeyValue(VS2005_REGISTRY_PATH, VS_REGISTRY_KEY); + } + + if (registryValue == null) + { + registryValue = registry.GetLocalMachineSubKeyValue(VS2003_REGISTRY_PATH, VS_REGISTRY_KEY); + } + + if (registryValue == null) + { + registryValue = registry.GetExpectedLocalMachineSubKeyValue(VS2002_REGISTRY_PATH, VS_REGISTRY_KEY); + } } + else + { + if (Version == "9.0" || Version == "VS2008") + { + registryValue = registry.GetExpectedLocalMachineSubKeyValue(VS2008_REGISTRY_PATH, VS_REGISTRY_KEY); + } + + if (Version == "8.0" || Version == "VS2005") + { + registryValue = registry.GetExpectedLocalMachineSubKeyValue(VS2005_REGISTRY_PATH, VS_REGISTRY_KEY); + } + + if (Version == null || Version == "7.1" || Version == "VS2003") + { + registryValue = registry.GetExpectedLocalMachineSubKeyValue(VS2003_REGISTRY_PATH, VS_REGISTRY_KEY); + } + + if (Version == null || Version == "7.0" || Version == "VS2002") + { + registryValue = registry.GetExpectedLocalMachineSubKeyValue(VS2002_REGISTRY_PATH, VS_REGISTRY_KEY); + } + } + return Path.Combine(registryValue, DEVENV_EXE); } Index: E:/Source/OpenSource/ccnet-svn-trunk/project/UnitTests/Core/Tasks/DevenvTaskTest.cs =================================================================== --- E:/Source/OpenSource/ccnet-svn-trunk/project/UnitTests/Core/Tasks/DevenvTaskTest.cs (revision 3607) +++ E:/Source/OpenSource/ccnet-svn-trunk/project/UnitTests/Core/Tasks/DevenvTaskTest.cs (working copy) @@ -14,6 +14,12 @@ public class DevenvTaskTest : ProcessExecutorTestFixtureBase { private const string DEVENV_PATH = @"C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.com"; + + private const string DEVENV_2008_PATH = @"C:\Program Files\Microsoft Visual Studio 9\Common7\IDE\"; + private const string DEVENV_2005_PATH = @"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\"; + private const string DEVENV_2003_PATH = @"C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\"; + private const string DEVENV_2002_PATH = @"C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\"; + private const string SOLUTION_FILE = @"D:\dev\ccnet\ccnet\project\ccnet.sln"; private const string CONFIGURATION = "Debug"; @@ -41,6 +47,7 @@ string xml = @" c:\vs.net\devenv.com + 9.0 mySolution.sln Debug 4 @@ -69,19 +76,58 @@ Assert.AreEqual(@"", task2.Project); } + [Test, ExpectedException(typeof (NetReflectorException))] + public void ShouldFailToLoadInvalidVersionFromConfiguration() + { + string xml = @""; + DevenvTask task2 = (DevenvTask)NetReflector.Read(xml); + } + [Test] public void DefaultVisualStudioShouldBe2008IfInstalled() { IMock mockRegistry2 = new DynamicMock(typeof(IRegistry)); DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance); - mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", @"C:\Program Files\Microsoft Visual Studio 9\Common7\IDE\", + mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", DEVENV_2008_PATH, DevenvTask.VS2008_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); - Assert.AreEqual(@"C:\Program Files\Microsoft Visual Studio 9\Common7\IDE\devenv.com", task2.Executable); + Assert.AreEqual(DEVENV_2008_PATH + "devenv.com", task2.Executable); mockRegistry2.Verify(); mockProcessExecutor.Verify(); } + [Test] + public void SelectVisualStudio2008ExplicitlyUsingVersionNumberWhenEverythingInstalled() + { + IMock mockRegistry2 = new DynamicMock(typeof(IRegistry)); + + DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance); + mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2008_PATH, + DevenvTask.VS2008_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); + + task2.Version = "9.0"; + + Assert.AreEqual(DEVENV_2008_PATH + "devenv.com", task2.Executable); + mockRegistry2.Verify(); + mockProcessExecutor.Verify(); + } + + [Test] + public void SelectVisualStudio2008ExplicitlyUsingVersionNameWhenEverythingInstalled() + { + IMock mockRegistry2 = new DynamicMock(typeof(IRegistry)); + + DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance); + mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2008_PATH, + DevenvTask.VS2008_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); + + task2.Version = "VS2008"; + + Assert.AreEqual(DEVENV_2008_PATH + "devenv.com", task2.Executable); + mockRegistry2.Verify(); + mockProcessExecutor.Verify(); + } + [Test] public void DefaultVisualStudioShouldBe2005IfNothingNewerInstalled() { @@ -89,13 +135,45 @@ DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance); mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", null, DevenvTask.VS2008_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); - mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", @"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\", + mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", DEVENV_2005_PATH, DevenvTask.VS2005_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); - Assert.AreEqual(@"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.com", task2.Executable); - mockRegistry2.Verify(); + Assert.AreEqual(DEVENV_2005_PATH + "devenv.com", task2.Executable); + mockRegistry2.Verify(); mockProcessExecutor.Verify(); } + [Test] + public void SelectVisualStudio2005ExplicitlyUsingVersionNumberWhenEverythingInstalled() + { + IMock mockRegistry2 = new DynamicMock(typeof(IRegistry)); + + DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance); + mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2005_PATH, + DevenvTask.VS2005_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); + + task2.Version = "8.0"; + + Assert.AreEqual(DEVENV_2005_PATH + "devenv.com", task2.Executable); + mockRegistry2.Verify(); + mockProcessExecutor.Verify(); + } + + [Test] + public void SelectVisualStudio2005ExplicitlyUsingVersionNameWhenEverythingInstalled() + { + IMock mockRegistry2 = new DynamicMock(typeof(IRegistry)); + + DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance); + mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2005_PATH, + DevenvTask.VS2005_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); + + task2.Version = "VS2005"; + + Assert.AreEqual(DEVENV_2005_PATH + "devenv.com", task2.Executable); + mockRegistry2.Verify(); + mockProcessExecutor.Verify(); + } + [Test] public void DefaultVisualStudioShouldBe2003IfNothingNewerInstalled() { @@ -104,14 +182,46 @@ DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance); mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", null, DevenvTask.VS2008_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", null, DevenvTask.VS2005_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); - mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", @"C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\", - DevenvTask.VS2003_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); - Assert.AreEqual(@"C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.com", task2.Executable); - mockRegistry2.Verify(); + mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", DEVENV_2003_PATH, + DevenvTask.VS2003_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); + Assert.AreEqual(DEVENV_2003_PATH + "devenv.com", task2.Executable); + mockRegistry2.Verify(); mockProcessExecutor.Verify(); } [Test] + public void SelectVisualStudio2003ExplicitlyUsingVersionNumberWhenEverythingInstalled() + { + IMock mockRegistry2 = new DynamicMock(typeof(IRegistry)); + + DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance); + mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2003_PATH, + DevenvTask.VS2003_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); + + task2.Version = "7.1"; + + Assert.AreEqual(DEVENV_2003_PATH + "devenv.com", task2.Executable); + mockRegistry2.Verify(); + mockProcessExecutor.Verify(); + } + + [Test] + public void SelectVisualStudio2003ExplicitlyUsingVersionNameWhenEverythingInstalled() + { + IMock mockRegistry2 = new DynamicMock(typeof(IRegistry)); + + DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance); + mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2003_PATH, + DevenvTask.VS2003_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); + + task2.Version = "VS2003"; + + Assert.AreEqual(DEVENV_2003_PATH + "devenv.com", task2.Executable); + mockRegistry2.Verify(); + mockProcessExecutor.Verify(); + } + + [Test] public void DefaultVisualStudioShouldBe2002IfNothingNewerInstalled() { IMock mockRegistry2 = new DynamicMock(typeof(IRegistry)); @@ -120,14 +230,47 @@ mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", null, DevenvTask.VS2008_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", null, DevenvTask.VS2005_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); mockRegistry2.ExpectAndReturn("GetLocalMachineSubKeyValue", null, DevenvTask.VS2003_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); - mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", @"C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\", - DevenvTask.VS2002_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); - Assert.AreEqual(@"C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\devenv.com", task2.Executable); - mockRegistry2.Verify(); + mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2002_PATH, + DevenvTask.VS2002_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); + + Assert.AreEqual(DEVENV_2002_PATH + "devenv.com", task2.Executable); + mockRegistry2.Verify(); mockProcessExecutor.Verify(); } [Test] + public void SelectVisualStudio2002ExplicitlyUsingVersionNumberWhenEverythingInstalled() + { + IMock mockRegistry2 = new DynamicMock(typeof(IRegistry)); + + DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance); + mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2002_PATH, + DevenvTask.VS2002_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); + + task2.Version = "7.0"; + + Assert.AreEqual(DEVENV_2002_PATH + "devenv.com", task2.Executable); + mockRegistry2.Verify(); + mockProcessExecutor.Verify(); + } + + [Test] + public void SelectVisualStudio2002ExplicitlyUsingVersionNameWhenEverythingInstalled() + { + IMock mockRegistry2 = new DynamicMock(typeof(IRegistry)); + + DevenvTask task2 = new DevenvTask((IRegistry)mockRegistry2.MockInstance, (ProcessExecutor)mockProcessExecutor.MockInstance); + mockRegistry2.ExpectAndReturn("GetExpectedLocalMachineSubKeyValue", DEVENV_2002_PATH, + DevenvTask.VS2002_REGISTRY_PATH, DevenvTask.VS_REGISTRY_KEY); + + task2.Version = "VS2002"; + + Assert.AreEqual(DEVENV_2002_PATH + "devenv.com", task2.Executable); + mockRegistry2.Verify(); + mockProcessExecutor.Verify(); + } + + [Test] public void VerifyDevenvProcessInfo() { CollectingConstraint constraint = new CollectingConstraint();