diff --git a/src/Orchard.Tests/Orchard.Framework.Tests.csproj b/src/Orchard.Tests/Orchard.Framework.Tests.csproj
index 80f4694e4..d37fa44fe 100644
--- a/src/Orchard.Tests/Orchard.Framework.Tests.csproj
+++ b/src/Orchard.Tests/Orchard.Framework.Tests.csproj
@@ -209,6 +209,7 @@
+
diff --git a/src/Orchard.Tests/Stubs/StubFileSystem.cs b/src/Orchard.Tests/Stubs/StubFileSystem.cs
index 332cef01a..7234b24e0 100644
--- a/src/Orchard.Tests/Stubs/StubFileSystem.cs
+++ b/src/Orchard.Tests/Stubs/StubFileSystem.cs
@@ -22,6 +22,18 @@ namespace Orchard.Tests.Stubs {
public IList Entries { get; private set; }
+ public IEnumerable Files {
+ get {
+ return Entries.OfType();
+ }
+ }
+
+ public IEnumerable Directories {
+ get {
+ return Entries.OfType();
+ }
+ }
+
public Entry GetEntry(string name) {
if (string.IsNullOrEmpty(name))
throw new ArgumentException();
diff --git a/src/Orchard.Tests/Stubs/StubVirtualPathProvider.cs b/src/Orchard.Tests/Stubs/StubVirtualPathProvider.cs
new file mode 100644
index 000000000..89a70f94e
--- /dev/null
+++ b/src/Orchard.Tests/Stubs/StubVirtualPathProvider.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using Orchard.FileSystems.VirtualPath;
+using Orchard.Services;
+
+namespace Orchard.Tests.Stubs {
+ public class StubVirtualPathProvider : IVirtualPathProvider {
+ private readonly StubFileSystem _fileSystem;
+
+ public StubVirtualPathProvider(StubFileSystem fileSystem) {
+ _fileSystem = fileSystem;
+ }
+
+ public StubFileSystem FileSystem {
+ get { return _fileSystem; }
+ }
+
+ private string ToFileSystemPath(string path) {
+ if (path.StartsWith("~/"))
+ return path.Substring(2);
+ if (path.StartsWith("/"))
+ return path.Substring(1);
+ return path;
+ }
+
+ public string Combine(params string[] paths) {
+ return Path.Combine(paths).Replace(Path.DirectorySeparatorChar, '/');
+ }
+
+ public string MapPath(string virtualPath) {
+ throw new NotImplementedException("Mapping to a physical file is not supported in Unit Test with this stub.");
+ }
+
+ public bool FileExists(string virtualPath) {
+ return _fileSystem.GetFileEntry(ToFileSystemPath(virtualPath)) != null;
+ }
+
+ public Stream OpenFile(string virtualPath) {
+ return _fileSystem.OpenFile(ToFileSystemPath(virtualPath));
+ }
+
+ public StreamWriter CreateText(string virtualPath) {
+ return new StreamWriter(_fileSystem.CreateFile(ToFileSystemPath(virtualPath)));
+ }
+
+ public Stream CreateFile(string virtualPath) {
+ return _fileSystem.CreateFile(ToFileSystemPath(virtualPath));
+ }
+
+ public DateTime GetFileLastWriteTimeUtc(string virtualPath) {
+ return _fileSystem.GetFileEntry(ToFileSystemPath(virtualPath)).LastWriteTimeUtc;
+ }
+
+ public bool DirectoryExists(string virtualPath) {
+ return _fileSystem.GetDirectoryEntry(ToFileSystemPath(virtualPath)) != null;
+ }
+
+ public void CreateDirectory(string virtualPath) {
+ _fileSystem.CreateDirectoryEntry(ToFileSystemPath(virtualPath));
+ }
+
+ public string GetDirectoryName(string virtualPath) {
+ return Path.GetDirectoryName(virtualPath);
+ }
+
+ public IEnumerable ListFiles(string path) {
+ return _fileSystem.GetDirectoryEntry(ToFileSystemPath(path))
+ .Files
+ .Select(f => Combine(path, f.Name));
+ }
+
+ public IEnumerable ListDirectories(string path) {
+ return _fileSystem.GetDirectoryEntry(ToFileSystemPath(path))
+ .Directories
+ .Select(f => Combine(path, f.Name));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs b/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs
index bf4c1d4f7..0af81fad4 100644
--- a/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs
+++ b/src/Orchard/Environment/Extensions/Loaders/DynamicExtensionLoader.cs
@@ -107,7 +107,7 @@ namespace Orchard.Environment.Extensions.Loaders {
return new ExtensionProbeEntry {
Descriptor = descriptor,
- LastModificationTimeUtc = File.GetLastWriteTimeUtc(_virtualPathProvider.MapPath(projectPath)),
+ LastModificationTimeUtc = _virtualPathProvider.GetFileLastWriteTimeUtc(projectPath),
Loader = this,
VirtualPath = projectPath
};
diff --git a/src/Orchard/FileSystems/VirtualPath/DefaultVirtualPathProvider.cs b/src/Orchard/FileSystems/VirtualPath/DefaultVirtualPathProvider.cs
index 0883058ea..3313a4ff0 100644
--- a/src/Orchard/FileSystems/VirtualPath/DefaultVirtualPathProvider.cs
+++ b/src/Orchard/FileSystems/VirtualPath/DefaultVirtualPathProvider.cs
@@ -30,6 +30,10 @@ namespace Orchard.FileSystems.VirtualPath {
return File.CreateText(MapPath(virtualPath));
}
+ public Stream CreateFile(string virtualPath) {
+ return File.Create(MapPath(virtualPath));
+ }
+
public DateTime GetFileLastWriteTimeUtc(string virtualPath) {
return File.GetLastWriteTimeUtc(MapPath(virtualPath));
}
diff --git a/src/Orchard/FileSystems/VirtualPath/IVirtualPathProvider.cs b/src/Orchard/FileSystems/VirtualPath/IVirtualPathProvider.cs
index 2fa00229f..6b012cd75 100644
--- a/src/Orchard/FileSystems/VirtualPath/IVirtualPathProvider.cs
+++ b/src/Orchard/FileSystems/VirtualPath/IVirtualPathProvider.cs
@@ -11,6 +11,7 @@ namespace Orchard.FileSystems.VirtualPath {
bool FileExists(string virtualPath);
Stream OpenFile(string virtualPath);
StreamWriter CreateText(string virtualPath);
+ Stream CreateFile(string virtualPath);
DateTime GetFileLastWriteTimeUtc(string virtualPath);
bool DirectoryExists(string virtualPath);