2016-07-23 17:38:31 +00:00
|
|
|
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
|
|
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
|
|
|
|
|
|
using FluentAssertions;
|
|
|
|
using Xunit;
|
|
|
|
using Microsoft.DotNet.Cli.Compiler.Common;
|
|
|
|
using Microsoft.DotNet.ProjectModel.Compilation;
|
|
|
|
using System.IO;
|
|
|
|
using System;
|
|
|
|
using System.Linq;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
namespace Microsoft.DotNet.Cli.Compiler.Common.Tests
|
|
|
|
{
|
|
|
|
public class GivenThatICopyLibraryAssets
|
|
|
|
{
|
|
|
|
[Fact]
|
|
|
|
public void LibraryAsset_CopyTo_Clears_Readonly()
|
|
|
|
{
|
|
|
|
var libraryAsset = GetMockLibraryAsset(nameof(LibraryAsset_CopyTo_Clears_Readonly));
|
|
|
|
MakeFileReadonly(libraryAsset.ResolvedPath);
|
|
|
|
|
|
|
|
IEnumerable<LibraryAsset> assets = new LibraryAsset[] { libraryAsset };
|
|
|
|
|
|
|
|
var outputDirectory = Path.Combine(AppContext.BaseDirectory,$"{nameof(LibraryAsset_CopyTo_Clears_Readonly)}_out");
|
|
|
|
assets.CopyTo(outputDirectory);
|
|
|
|
|
|
|
|
var copiedFile = Directory.EnumerateFiles(outputDirectory, Path.GetFileName(libraryAsset.RelativePath)).First();
|
|
|
|
IsFileReadonly(copiedFile).Should().BeFalse();
|
|
|
|
}
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
public void LibraryAsset_StructuredCopyTo_Clears_Readonly()
|
|
|
|
{
|
|
|
|
var libraryAsset = GetMockLibraryAsset(nameof(LibraryAsset_StructuredCopyTo_Clears_Readonly));
|
|
|
|
MakeFileReadonly(libraryAsset.ResolvedPath);
|
|
|
|
|
|
|
|
IEnumerable<LibraryAsset> assets = new LibraryAsset[] { libraryAsset };
|
|
|
|
|
|
|
|
var intermediateDirectory = Path.Combine(AppContext.BaseDirectory,$"{nameof(LibraryAsset_StructuredCopyTo_Clears_Readonly)}_obj");
|
|
|
|
var outputDirectory = Path.Combine(AppContext.BaseDirectory,$"{nameof(LibraryAsset_StructuredCopyTo_Clears_Readonly)}_out");
|
|
|
|
assets.StructuredCopyTo(outputDirectory, intermediateDirectory);
|
|
|
|
|
|
|
|
var copiedFile = Directory.EnumerateFiles(outputDirectory, Path.GetFileName(libraryAsset.RelativePath)).First();
|
|
|
|
IsFileReadonly(copiedFile).Should().BeFalse();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void MakeFileReadonly(string file)
|
|
|
|
{
|
|
|
|
File.SetAttributes(file, File.GetAttributes(file) | FileAttributes.ReadOnly);
|
|
|
|
}
|
|
|
|
|
|
|
|
private bool IsFileReadonly(string file)
|
|
|
|
{
|
|
|
|
return (File.GetAttributes(file) & FileAttributes.ReadOnly) == FileAttributes.ReadOnly;
|
|
|
|
}
|
|
|
|
|
|
|
|
private LibraryAsset GetMockLibraryAsset(string mockedLibraryAssetName)
|
|
|
|
{
|
|
|
|
var mockedLibraryAssetFileName = $"{mockedLibraryAssetName}.dll";
|
|
|
|
|
|
|
|
var fakeFile = Path.Combine(AppContext.BaseDirectory, mockedLibraryAssetFileName);
|
2016-08-08 20:44:44 +00:00
|
|
|
|
|
|
|
if (File.Exists(fakeFile))
|
|
|
|
{
|
|
|
|
File.SetAttributes(fakeFile, FileAttributes.Normal);
|
|
|
|
File.Delete(fakeFile);
|
|
|
|
}
|
|
|
|
|
2016-07-23 17:38:31 +00:00
|
|
|
File.WriteAllText(fakeFile, mockedLibraryAssetName);
|
|
|
|
|
|
|
|
return new LibraryAsset(mockedLibraryAssetName, mockedLibraryAssetFileName, fakeFile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|