From fea57c7632df04d2961aaa6349f56e91c2a5a23b Mon Sep 17 00:00:00 2001 From: sriv Date: Mon, 21 Mar 2016 14:19:02 +0530 Subject: [PATCH] scan gauge_additional_libs, some refactoring, fixes #58 --- ...ScannerTests.cs => AssemblyLoaderTests.cs} | 27 ++-- Runner.UnitTests/AssemblyLocaterTests.cs | 137 ++++++++++++++++++ .../Gauge.CSharp.Runner.UnitTests.csproj | 6 +- Runner.UnitTests/HookRegistryTests.cs | 4 +- .../{AssemblyScanner.cs => AssemblyLoader.cs} | 15 +- Runner/AssemblyLocater.cs | 80 ++++++++++ Runner/DefaultScreenGrabber.cs | 17 +++ Runner/Gauge.CSharp.Runner.csproj | 16 +- Runner/HookRegistry.cs | 6 +- ...IAssemblyScanner.cs => IAssemblyLoader.cs} | 4 +- Runner/IAssemblyLocater.cs | 26 ++++ Runner/Sandbox.cs | 24 +-- Runner/{ => Wrappers}/AssemblyWrapper.cs | 2 +- Runner/Wrappers/DirectoryWrapper.cs | 35 +++++ Runner/{ => Wrappers}/FileWrapper.cs | 2 +- Runner/{ => Wrappers}/IAssemblyWrapper.cs | 2 +- Runner/Wrappers/IDirectoryWrapper.cs | 28 ++++ Runner/{ => Wrappers}/IFileWrapper.cs | 2 +- 18 files changed, 387 insertions(+), 46 deletions(-) rename Runner.UnitTests/{AssemblyScannerTests.cs => AssemblyLoaderTests.cs} (74%) create mode 100644 Runner.UnitTests/AssemblyLocaterTests.cs rename Runner/{AssemblyScanner.cs => AssemblyLoader.cs} (90%) create mode 100644 Runner/AssemblyLocater.cs rename Runner/{IAssemblyScanner.cs => IAssemblyLoader.cs} (86%) create mode 100644 Runner/IAssemblyLocater.cs rename Runner/{ => Wrappers}/AssemblyWrapper.cs (96%) create mode 100644 Runner/Wrappers/DirectoryWrapper.cs rename Runner/{ => Wrappers}/FileWrapper.cs (95%) rename Runner/{ => Wrappers}/IAssemblyWrapper.cs (95%) create mode 100644 Runner/Wrappers/IDirectoryWrapper.cs rename Runner/{ => Wrappers}/IFileWrapper.cs (95%) diff --git a/Runner.UnitTests/AssemblyScannerTests.cs b/Runner.UnitTests/AssemblyLoaderTests.cs similarity index 74% rename from Runner.UnitTests/AssemblyScannerTests.cs rename to Runner.UnitTests/AssemblyLoaderTests.cs index 1d3d903..a56893b 100644 --- a/Runner.UnitTests/AssemblyScannerTests.cs +++ b/Runner.UnitTests/AssemblyLoaderTests.cs @@ -19,22 +19,23 @@ using System.IO; using System.Reflection; using Gauge.CSharp.Lib.Attribute; +using Gauge.CSharp.Runner.Wrappers; using Moq; using NUnit.Framework; namespace Gauge.CSharp.Runner.UnitTests { [TestFixture] - public class AssemblyScannerTests + public class AssemblyLoaderTests { public class TestAssembly : Assembly { } [Step("Foo text")] public void DummyStepMethod() { } - private Mock mockAssembly; + private Mock _mockAssembly; private MethodInfo _stepMethod; - private AssemblyScanner _assemblyScanner; + private AssemblyLoader _assemblyLoader; private Mock _mockAssemblyWrapper; [SetUp] @@ -48,15 +49,15 @@ public void Setup() _mockAssemblyWrapper = new Mock(); var fileWrapper = new Mock(); _stepMethod = thisType.GetMethod("DummyStepMethod"); - mockAssembly = new Mock(); - mockAssembly.Setup(assembly => assembly.GetTypes()).Returns(new[] { thisType }); - mockAssembly.Setup(assembly => assembly.GetType(thisType.FullName)).Returns(thisType); - mockAssembly.Setup(assembly => assembly.GetReferencedAssemblies()).Returns(new[] { new AssemblyName("Gauge.CSharp.Lib") }); + _mockAssembly = new Mock(); + _mockAssembly.Setup(assembly => assembly.GetTypes()).Returns(new[] { thisType }); + _mockAssembly.Setup(assembly => assembly.GetType(thisType.FullName)).Returns(thisType); + _mockAssembly.Setup(assembly => assembly.GetReferencedAssemblies()).Returns(new[] { new AssemblyName("Gauge.CSharp.Lib") }); fileWrapper.Setup(wrapper => wrapper.Exists(libPath)).Returns(true); _mockAssemblyWrapper.Setup(wrapper => wrapper.LoadFrom(libPath)).Returns(typeof(Step).Assembly).Verifiable(); - _mockAssemblyWrapper.Setup(wrapper => wrapper.ReflectionOnlyLoadFrom(assemblyLocation)).Returns(mockAssembly.Object); - _mockAssemblyWrapper.Setup(wrapper => wrapper.LoadFrom(assemblyLocation)).Returns(mockAssembly.Object); - _assemblyScanner = new AssemblyScanner(_mockAssemblyWrapper.Object, fileWrapper.Object, new[] { assemblyLocation }); + _mockAssemblyWrapper.Setup(wrapper => wrapper.ReflectionOnlyLoadFrom(assemblyLocation)).Returns(_mockAssembly.Object); + _mockAssemblyWrapper.Setup(wrapper => wrapper.LoadFrom(assemblyLocation)).Returns(_mockAssembly.Object); + _assemblyLoader = new AssemblyLoader(_mockAssemblyWrapper.Object, fileWrapper.Object, new[] { assemblyLocation }); } [TearDown] @@ -73,7 +74,7 @@ public void ShouldThrowExceptionWhenLibAssemblyNotFound() var mockAssemblyWrapper = new Mock(); var fileWrapper = new Mock(); - Assert.Throws(() => new AssemblyScanner(mockAssemblyWrapper.Object, fileWrapper.Object, new[] { tmpLocation })); + Assert.Throws(() => new AssemblyLoader(mockAssemblyWrapper.Object, fileWrapper.Object, new[] { tmpLocation })); } [Test] @@ -85,13 +86,13 @@ public void ShouldGetTargetAssembly() [Test] public void ShouldGetAssemblyReferencingGaugeLib() { - Assert.Contains(mockAssembly.Object, _assemblyScanner.AssembliesReferencingGaugeLib); + Assert.Contains(_mockAssembly.Object, _assemblyLoader.AssembliesReferencingGaugeLib); } [Test] public void ShouldGetMethodsForGaugeAttribute() { - Assert.Contains(_stepMethod, _assemblyScanner.GetMethods(typeof(Step))); + Assert.Contains(_stepMethod, _assemblyLoader.GetMethods(typeof(Step))); } } } diff --git a/Runner.UnitTests/AssemblyLocaterTests.cs b/Runner.UnitTests/AssemblyLocaterTests.cs new file mode 100644 index 0000000..5cbc55e --- /dev/null +++ b/Runner.UnitTests/AssemblyLocaterTests.cs @@ -0,0 +1,137 @@ +// Copyright 2015 ThoughtWorks, Inc. +// +// This file is part of Gauge-CSharp. +// +// Gauge-CSharp is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Gauge-CSharp is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Gauge-CSharp. If not, see . + +using System; +using System.IO; +using System.Linq; +using Gauge.CSharp.Core; +using Gauge.CSharp.Runner.Wrappers; +using Moq; +using NUnit.Framework; + +namespace Gauge.CSharp.Runner.UnitTests +{ + [TestFixture] + internal class AssemblyLocaterTests + { + private readonly Mock _mockDirectoryWrapper = new Mock(); + private readonly Mock _mockFileWrapper = new Mock(); + + [SetUp] + public void Setup() + { + Environment.SetEnvironmentVariable("GAUGE_PROJECT_ROOT", Directory.GetCurrentDirectory()); + } + + [TearDown] + public void TearDown() + { + Environment.SetEnvironmentVariable("GAUGE_ADDITIONAL_LIBS", null); + Environment.SetEnvironmentVariable("GAUGE_PROJECT_ROOT", null); + } + + [Test] + public void ShouldGetAssembliesFromGaugeBin() + { + var expectedAssemblies = new[] {"fooAssemblyLocation", "barAssemblyLocation"}; + _mockDirectoryWrapper.Setup(wrapper => wrapper.EnumerateFiles(Utils.GetGaugeBinDir(), "*.dll", SearchOption.TopDirectoryOnly)) + .Returns(expectedAssemblies); + var assemblyLocater = new AssemblyLocater(_mockDirectoryWrapper.Object, _mockFileWrapper.Object); + + var assemblies = assemblyLocater.GetAllAssemblies(); + + Assert.AreEqual(expectedAssemblies, assemblies); + } + + [Test] + public void ShouldGetAssembliesFromGaugeAdditionalLibsEnvVar() + { + Environment.SetEnvironmentVariable("GAUGE_ADDITIONAL_LIBS", "foo/"); + var expectedAssemblies = new[] { "fooAssemblyLocation", "barAssemblyLocation" }; + _mockDirectoryWrapper.Setup(wrapper => wrapper.Exists(Path.GetFullPath("foo/"))).Returns(true); + _mockDirectoryWrapper.Setup(wrapper => wrapper.EnumerateFiles(Utils.GetGaugeBinDir(), "*.dll", SearchOption.TopDirectoryOnly)) + .Returns(Enumerable.Empty()); + _mockDirectoryWrapper.Setup(wrapper => wrapper.EnumerateFiles(Path.GetFullPath("foo/"), "*.dll", SearchOption.TopDirectoryOnly)) + .Returns(expectedAssemblies); + + var assemblyLocater = new AssemblyLocater(_mockDirectoryWrapper.Object, _mockFileWrapper.Object); + + var assemblies = assemblyLocater.GetAllAssemblies(); + Assert.AreEqual(expectedAssemblies, assemblies); + } + + [Test] + public void ShouldAddAssembliyFromGaugeAdditionalLibFile() + { + Environment.SetEnvironmentVariable("GAUGE_ADDITIONAL_LIBS", "foo.dll"); + var expectedAssemblies = new[] { Path.GetFullPath("foo.dll") }; + _mockDirectoryWrapper.Setup(wrapper => wrapper.EnumerateFiles(Utils.GetGaugeBinDir(), "*.dll", SearchOption.TopDirectoryOnly)) + .Returns(Enumerable.Empty()); + _mockFileWrapper.Setup(wrapper => wrapper.Exists(Path.GetFullPath("foo.dll"))).Returns(true); + var assemblyLocater = new AssemblyLocater(_mockDirectoryWrapper.Object, _mockFileWrapper.Object); + + var assemblies = assemblyLocater.GetAllAssemblies(); + Assert.AreEqual(expectedAssemblies, assemblies); + } + + [Test] + public void ShouldAddAssembliesFromMultipleLocations() + { + Environment.SetEnvironmentVariable("GAUGE_ADDITIONAL_LIBS", "foo.dll, foo/"); + var expectedAssemblies = new[] { Path.GetFullPath("foo.dll"), "fooAssemblyLocation", "barAssemblyLocation" }; + _mockDirectoryWrapper.Setup(wrapper => wrapper.Exists(Path.GetFullPath("foo/"))).Returns(true); + _mockDirectoryWrapper.Setup(wrapper => wrapper.EnumerateFiles(Utils.GetGaugeBinDir(), "*.dll", SearchOption.TopDirectoryOnly)) + .Returns(Enumerable.Empty()); + _mockDirectoryWrapper.Setup(wrapper => wrapper.EnumerateFiles(Path.GetFullPath("foo/"), "*.dll", SearchOption.TopDirectoryOnly)) + .Returns(new []{"fooAssemblyLocation", "barAssemblyLocation"}); + _mockFileWrapper.Setup(wrapper => wrapper.Exists(Path.GetFullPath("foo.dll"))).Returns(true); + var assemblyLocater = new AssemblyLocater(_mockDirectoryWrapper.Object, _mockFileWrapper.Object); + + var assemblies = assemblyLocater.GetAllAssemblies(); + + Assert.AreEqual(expectedAssemblies, assemblies); + } + + [Test] + public void ShoulNotdAddAssembliesFromInvalidDirectory() + { + Environment.SetEnvironmentVariable("GAUGE_ADDITIONAL_LIBS", "foo/"); + _mockDirectoryWrapper.Setup(wrapper => wrapper.Exists(Path.GetFullPath("foo/"))).Returns(false); + _mockDirectoryWrapper.Setup(wrapper => wrapper.EnumerateFiles(Utils.GetGaugeBinDir(), "*.dll", SearchOption.TopDirectoryOnly)) + .Returns(Enumerable.Empty()); + + var assemblyLocater = new AssemblyLocater(_mockDirectoryWrapper.Object, _mockFileWrapper.Object); + + var assemblies = assemblyLocater.GetAllAssemblies(); + Assert.IsEmpty(assemblies); + } + + [Test] + public void ShouldNotAddAssembliesFromInvalidFile() + { + Environment.SetEnvironmentVariable("GAUGE_ADDITIONAL_LIBS", "foo.dll"); + _mockFileWrapper.Setup(wrapper => wrapper.Exists(Path.GetFullPath("foo.dll"))).Returns(false); + _mockDirectoryWrapper.Setup(wrapper => wrapper.EnumerateFiles(Utils.GetGaugeBinDir(), "*.dll", SearchOption.TopDirectoryOnly)) + .Returns(Enumerable.Empty()); + + var assemblyLocater = new AssemblyLocater(_mockDirectoryWrapper.Object, _mockFileWrapper.Object); + + var assemblies = assemblyLocater.GetAllAssemblies(); + Assert.IsEmpty(assemblies); + } + } +} diff --git a/Runner.UnitTests/Gauge.CSharp.Runner.UnitTests.csproj b/Runner.UnitTests/Gauge.CSharp.Runner.UnitTests.csproj index 3c38784..7740dc0 100644 --- a/Runner.UnitTests/Gauge.CSharp.Runner.UnitTests.csproj +++ b/Runner.UnitTests/Gauge.CSharp.Runner.UnitTests.csproj @@ -75,7 +75,8 @@ - + + @@ -117,6 +118,9 @@ Gauge.CSharp.Runner + + +