From 674fe6ecb8743aba5a51d2254b1ea317d712c41b Mon Sep 17 00:00:00 2001 From: Andre Rodrigues Date: Fri, 15 Apr 2011 16:44:12 -0700 Subject: [PATCH] #17745: Decoding Nuget paths. --HG-- branch : 1.x --- .../Orchard.Tests.Modules.csproj | 7 +- .../Services/FileBasedProjectSystemTests.cs | 103 ++++++++++++++++++ .../Packaging/Services/Hello.World.csproj.txt | 30 +---- .../Packaging/Services/HelloDriver.cs.txt | 9 -- .../Services/FileBaseProjectSystem.cs | 28 ++--- 5 files changed, 114 insertions(+), 63 deletions(-) create mode 100644 src/Orchard.Tests.Modules/Packaging/Services/FileBasedProjectSystemTests.cs delete mode 100644 src/Orchard.Tests.Modules/Packaging/Services/HelloDriver.cs.txt diff --git a/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj b/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj index dfacdb755..2caea26f6 100644 --- a/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj +++ b/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj @@ -149,6 +149,7 @@ + @@ -162,7 +163,6 @@ - @@ -296,12 +296,7 @@ - - - - - diff --git a/src/Orchard.Tests.Modules/Packaging/Services/FileBasedProjectSystemTests.cs b/src/Orchard.Tests.Modules/Packaging/Services/FileBasedProjectSystemTests.cs new file mode 100644 index 000000000..902d45dde --- /dev/null +++ b/src/Orchard.Tests.Modules/Packaging/Services/FileBasedProjectSystemTests.cs @@ -0,0 +1,103 @@ +using System.IO; +using Autofac; +using Moq; +using NuGet; +using NUnit.Framework; +using Orchard.Caching; +using Orchard.Environment; +using Orchard.Environment.Extensions; +using Orchard.Environment.Extensions.Models; +using Orchard.FileSystems.VirtualPath; +using Orchard.FileSystems.WebSite; +using Orchard.Packaging.Services; +using Orchard.Tests.Stubs; +using Orchard.UI.Notify; +using IPackageBuilder = Orchard.Packaging.Services.IPackageBuilder; +using PackageBuilder = Orchard.Packaging.Services.PackageBuilder; + +namespace Orchard.Tests.Modules.Packaging.Services { + [TestFixture] + public class FileBasedProjectSystemTests : ContainerTestBase { + private const string PackageIdentifier = "Hello.World"; + + private readonly string _basePath = Path.Combine(Path.GetTempPath(), "PackageInstallerTests"); + + private Mock _mockedVirtualPathProvider; + + protected override void Register(ContainerBuilder builder) { + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterInstance(new Mock().Object); + builder.RegisterType().As(); + + _mockedVirtualPathProvider = new Mock(); + builder.RegisterInstance(_mockedVirtualPathProvider.Object).As(); + builder.RegisterType().As(); + builder.RegisterType().As() + .As().InstancePerLifetimeScope(); + } + + [SetUp] + public override void Init() { + base.Init(); + + if (Directory.Exists(_basePath)) { + Directory.Delete(_basePath, true); + } + + Directory.CreateDirectory(_basePath); + } + + [TestFixtureTearDown] + public void Clean() { + if (Directory.Exists(_basePath)) { + Directory.Delete(_basePath, true); + } + } + + private Stream BuildHelloWorld(IPackageBuilder packageBuilder) { + // add some content because NuGet requires it + var folder = _container.Resolve(); + using (var sourceStream = GetType().Assembly.GetManifestResourceStream(GetType(), "Hello.World.csproj.txt")) { + folder.AddFile("~/Modules/Hello.World/Hello.World.csproj", new StreamReader(sourceStream).ReadToEnd()); + } + + return packageBuilder.BuildPackage(new ExtensionDescriptor { + ExtensionType = DefaultExtensionTypes.Module, + Id = PackageIdentifier, + Version = "1.0", + Description = "a", + Author = "b" + }); + } + + [Test] + public void ValidPathsTest() { + IPackageBuilder packageBuilder = _container.Resolve(); + Stream stream = BuildHelloWorld(packageBuilder); + + string filename = Path.Combine(_basePath, "package.nupkg"); + using (var fileStream = File.Create(filename)) { + stream.CopyTo(fileStream); + } + + ZipPackage zipPackage = new ZipPackage(filename); + IPackageInstaller packageInstaller = _container.Resolve(); + + _mockedVirtualPathProvider.Setup(v => v.MapPath(It.IsAny())) + .Returns(path => Path.Combine(_basePath, path.Replace("~\\", ""))); + + _mockedVirtualPathProvider.Setup(v => v.Combine(It.IsAny())) + .Returns(Path.Combine); + + PackageInfo packageInfo = packageInstaller.Install(zipPackage, _basePath, _basePath); + Assert.That(packageInfo, Is.Not.Null); + Assert.That(Directory.Exists(Path.Combine(_basePath, "Modules/Hello.World"))); + Assert.That(File.Exists(Path.Combine(_basePath, "Modules/Hello.World/Hello.World.csproj"))); + Assert.That(!File.Exists(Path.Combine(_basePath, "Modules/Hello.World/Service%References/SomeReference.cs"))); + Assert.That(File.Exists(Path.Combine(_basePath, "Modules/Hello.World/Service References/SomeReference.cs"))); + } + } +} diff --git a/src/Orchard.Tests.Modules/Packaging/Services/Hello.World.csproj.txt b/src/Orchard.Tests.Modules/Packaging/Services/Hello.World.csproj.txt index 94b77eec2..ef5172a59 100644 --- a/src/Orchard.Tests.Modules/Packaging/Services/Hello.World.csproj.txt +++ b/src/Orchard.Tests.Modules/Packaging/Services/Hello.World.csproj.txt @@ -70,37 +70,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/src/Orchard.Tests.Modules/Packaging/Services/HelloDriver.cs.txt b/src/Orchard.Tests.Modules/Packaging/Services/HelloDriver.cs.txt deleted file mode 100644 index a376f809f..000000000 --- a/src/Orchard.Tests.Modules/Packaging/Services/HelloDriver.cs.txt +++ /dev/null @@ -1,9 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Orchard.Tests.Modules.Packaging { - class HelloDriver { - } -} diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Services/FileBaseProjectSystem.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Services/FileBaseProjectSystem.cs index d9f711d5f..35ef0693d 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Services/FileBaseProjectSystem.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Services/FileBaseProjectSystem.cs @@ -47,7 +47,7 @@ namespace Orchard.Packaging.Services { } public string GetFullPath(string path) { - return Path.Combine(Root, path); + return Path.Combine(Root, Uri.UnescapeDataString(path)); } protected virtual string GetReferencePath(string name) { @@ -55,12 +55,12 @@ namespace Orchard.Packaging.Services { } public void AddFile(string path, Stream stream) { - EnsureDirectory(Path.GetDirectoryName(path)); + string fullPath = GetFullPath(path); + EnsureDirectory(Path.GetDirectoryName(fullPath)); - using (Stream outputStream = File.Create(GetFullPath(path))) { + using (Stream outputStream = File.Create(fullPath)) { stream.CopyTo(outputStream); } - } public void DeleteFile(string path) { @@ -88,9 +88,7 @@ namespace Orchard.Packaging.Services { path = GetFullPath(path); Directory.Delete(path, recursive); } - catch (DirectoryNotFoundException) { - - } + catch (DirectoryNotFoundException) {} } public void AddReference(string referencePath, Stream stream) { @@ -125,12 +123,8 @@ namespace Orchard.Packaging.Services { return Directory.EnumerateFiles(path, filter) .Select(MakeRelativePath); } - catch (UnauthorizedAccessException) { - - } - catch (DirectoryNotFoundException) { - - } + catch (UnauthorizedAccessException) {} + catch (DirectoryNotFoundException) {} return Enumerable.Empty(); } @@ -144,12 +138,8 @@ namespace Orchard.Packaging.Services { return Directory.EnumerateDirectories(path) .Select(MakeRelativePath); } - catch (UnauthorizedAccessException) { - - } - catch (DirectoryNotFoundException) { - - } + catch (UnauthorizedAccessException) {} + catch (DirectoryNotFoundException) {} return Enumerable.Empty(); }