Skip to content

Commit

Permalink
Updated assembly resolver to filter out script dll
Browse files Browse the repository at this point in the history
  • Loading branch information
dschenkelman committed Aug 15, 2013
1 parent 11794db commit 38983e6
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 10 deletions.
2 changes: 1 addition & 1 deletion src/ScriptCs.Contracts/IAssemblyResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ namespace ScriptCs.Contracts
{
public interface IAssemblyResolver
{
IEnumerable<string> GetAssemblyPaths(string path);
IEnumerable<string> GetAssemblyPaths(string path, string scriptName);
}
}
10 changes: 6 additions & 4 deletions src/ScriptCs.Core/AssemblyResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,31 +32,33 @@ public AssemblyResolver(
_assemblyUtility = assemblyUtility;
}

public IEnumerable<string> GetAssemblyPaths(string path)
public IEnumerable<string> GetAssemblyPaths(string path, string scriptName)
{
Guard.AgainstNullArgument("path", path);

List<string> assemblies;
if (_assemblyPathCache.TryGetValue(path, out assemblies)) return assemblies;

var packageAssemblies = GetPackageAssemblies(path);
var binAssemblies = GetBinAssemblies(path);
var binAssemblies = GetBinAssemblies(path, scriptName);

assemblies = packageAssemblies.Union(binAssemblies).ToList();
_assemblyPathCache.Add(path, assemblies);

return assemblies;
}

private IEnumerable<string> GetBinAssemblies(string path)
private IEnumerable<string> GetBinAssemblies(string path, string scriptName)
{
var binFolder = Path.Combine(path, Constants.BinFolder);
if (!_fileSystem.DirectoryExists(binFolder))
return Enumerable.Empty<string>();

var dllName = scriptName.Replace(Path.GetExtension(scriptName), ".dll");

var assemblies = _fileSystem.EnumerateFiles(binFolder, "*.dll")
.Union(_fileSystem.EnumerateFiles(binFolder, "*.exe"))
.Where(_assemblyUtility.IsManagedAssembly)
.Where(f => _assemblyUtility.IsManagedAssembly(f) && !dllName.Equals(Path.GetFileName(f)))
.ToList();

foreach (var assembly in assemblies)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ protected override Assembly LoadAssembly(byte[] exeBytes, byte[] pdbBytes)

var dllName = FileName.Replace(Path.GetExtension(FileName), ".dll");
var dllPath = Path.Combine(this.BaseDirectory, dllName);

_fileSystem.WriteAllBytes(dllPath, exeBytes);

_logger.DebugFormat("Loading assembly {0}.", dllPath);
Expand Down
2 changes: 1 addition & 1 deletion src/ScriptCs/Command/ExecuteReplCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public CommandResult Execute()
var repl = new Repl(_scriptArgs, _fileSystem, _scriptEngine, _logger, _console, _filePreProcessor);

var workingDirectory = _fileSystem.CurrentDirectory;
var assemblies = _assemblyResolver.GetAssemblyPaths(workingDirectory);
var assemblies = _assemblyResolver.GetAssemblyPaths(workingDirectory, string.Empty);
var scriptPacks = _scriptPackResolver.GetPacks();

repl.Initialize(assemblies, scriptPacks);
Expand Down
2 changes: 1 addition & 1 deletion src/ScriptCs/Command/ExecuteScriptCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public CommandResult Execute()
var workingDirectory = _fileSystem.GetWorkingDirectory(_script);
if (workingDirectory != null)
{
assemblyPaths = _assemblyResolver.GetAssemblyPaths(workingDirectory);
assemblyPaths = _assemblyResolver.GetAssemblyPaths(workingDirectory, _script);
}
_scriptExecutor.Initialize(assemblyPaths, _scriptPackResolver.GetPacks());
var result = _scriptExecutor.Execute(_script, ScriptArgs);
Expand Down
29 changes: 26 additions & 3 deletions test/ScriptCs.Core.Tests/AssemblyResolverTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public void ShouldReturnAssembliesFromPackagesFolder()

var resolver = new AssemblyResolver(fileSystem.Object, packageAssemblyResolver.Object, Mock.Of<IAssemblyUtility>(), Mock.Of<ILog>());

var assemblies = resolver.GetAssemblyPaths(WorkingDirectory).ToList();
var assemblies = resolver.GetAssemblyPaths(WorkingDirectory, "script.csx").ToList();

assemblies.Count.ShouldEqual(1);
assemblies[0].ShouldEqual(assemblyFile);
Expand All @@ -57,7 +57,7 @@ public void ShouldReturnAssembliesFromBinFolder()

var resolver = new AssemblyResolver(fileSystem.Object, Mock.Of<IPackageAssemblyResolver>(), assemblyUtility.Object, Mock.Of<ILog>());

var assemblies = resolver.GetAssemblyPaths(WorkingDirectory).ToList();
var assemblies = resolver.GetAssemblyPaths(WorkingDirectory, "script.csx").ToList();

assemblies.Count.ShouldEqual(1);
assemblies[0].ShouldEqual(assemblyFile);
Expand All @@ -82,11 +82,34 @@ public void ShouldNotReturnNonManagedAssemblies()

var resolver = new AssemblyResolver(fileSystem.Object, Mock.Of<IPackageAssemblyResolver>(), assemblyUtility.Object, Mock.Of<ILog>());

var assemblies = resolver.GetAssemblyPaths(WorkingDirectory).ToList();
var assemblies = resolver.GetAssemblyPaths(WorkingDirectory, "script.csx").ToList();

assemblies.Count.ShouldEqual(1);
assemblies[0].ShouldEqual(managed);
}

[Fact]
public void ShouldNotReturnScriptDll()
{
const string WorkingDirectory = @"C:\";

var binFolder = Path.Combine(WorkingDirectory, "bin");
var scriptDll = Path.Combine(binFolder, "script.dll");

var fileSystem = new Mock<IFileSystem>();
fileSystem.Setup(x => x.DirectoryExists(binFolder)).Returns(true);
fileSystem.Setup(x => x.EnumerateFiles(binFolder, It.IsAny<string>(), SearchOption.AllDirectories))
.Returns(new[] { scriptDll });

var assemblyUtility = new Mock<IAssemblyUtility>();
assemblyUtility.Setup(x => x.IsManagedAssembly(scriptDll)).Returns(true);

var resolver = new AssemblyResolver(fileSystem.Object, Mock.Of<IPackageAssemblyResolver>(), assemblyUtility.Object, Mock.Of<ILog>());

var assemblies = resolver.GetAssemblyPaths(WorkingDirectory, "script.csx").ToList();

assemblies.Count.ShouldEqual(0);
}
}
}
}

0 comments on commit 38983e6

Please sign in to comment.