// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Xunit; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Globalization; using System.IO; using System.Linq; using System.Management.Automation; using System.Management.Automation.Host; using System.Management.Automation.Internal; using System.Management.Automation.Internal.Host; using System.Management.Automation.Provider; using System.Management.Automation.Runspaces; using Microsoft.PowerShell; using Microsoft.PowerShell.Commands; using System.Reflection; namespace PSTests.Parallel { public class FileSystemProviderTests: IDisposable { private string testPath; private string testContent; public FileSystemProviderTests() { testPath = Path.Combine(Path.GetTempPath(),"test"); testContent = "test content!"; if(File.Exists(testPath)) File.Delete(testPath); File.AppendAllText(testPath,testContent); } void IDisposable.Dispose() { File.Delete(testPath); } private ExecutionContext GetExecutionContext() { CultureInfo currentCulture = CultureInfo.CurrentCulture; PSHost hostInterface = new DefaultHost(currentCulture,currentCulture); InitialSessionState iss = InitialSessionState.CreateDefault2(); AutomationEngine engine = new AutomationEngine(hostInterface, iss); ExecutionContext executionContext = new ExecutionContext(engine, hostInterface, iss); return executionContext; } private ProviderInfo GetProvider() { ExecutionContext executionContext = GetExecutionContext(); SessionStateInternal sessionState = new SessionStateInternal(executionContext); SessionStateProviderEntry providerEntry = new SessionStateProviderEntry("FileSystem",typeof(FileSystemProvider), null); sessionState.AddSessionStateEntry(providerEntry); ProviderInfo matchingProvider = sessionState.ProviderList.ToList()[0]; return matchingProvider; } [Fact] public void TestCreateJunctionFails() { if(!Platform.IsWindows) { Assert.False(InternalSymbolicLinkLinkCodeMethods.CreateJunction("","")); } else { Assert.Throws(delegate { InternalSymbolicLinkLinkCodeMethods.CreateJunction("",""); }); } } [Fact] public void TestGetHelpMaml() { FileSystemProvider fileSystemProvider = new FileSystemProvider(); Assert.Equal(fileSystemProvider.GetHelpMaml(String.Empty,String.Empty),String.Empty); Assert.Equal(fileSystemProvider.GetHelpMaml("helpItemName",String.Empty),String.Empty); Assert.Equal(fileSystemProvider.GetHelpMaml(String.Empty,"path"),String.Empty); } [Fact] public void TestMode() { Assert.Equal(FileSystemProvider.Mode(null),String.Empty); FileSystemInfo directoryObject = null; FileSystemInfo fileObject = null; FileSystemInfo executableObject = null; if(!Platform.IsWindows) { directoryObject = new DirectoryInfo(@"/"); fileObject = new FileInfo(@"/etc/hosts"); executableObject = new FileInfo(@"/bin/echo"); } else { directoryObject = new DirectoryInfo(System.Environment.CurrentDirectory); fileObject = new FileInfo(System.Reflection.Assembly.GetEntryAssembly().Location); executableObject = new FileInfo(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); } Assert.Equal("d-----", FileSystemProvider.Mode(PSObject.AsPSObject(directoryObject)).Replace("r","-")); Assert.Equal("------", FileSystemProvider.Mode(PSObject.AsPSObject(fileObject)).Replace("r","-").Replace("a","-")); Assert.Equal("------", FileSystemProvider.Mode(PSObject.AsPSObject(executableObject)).Replace("r","-").Replace("a","-")); } [Fact] public void TestGetProperty() { FileSystemProvider fileSystemProvider = new FileSystemProvider(); ProviderInfo providerInfoToSet = GetProvider(); fileSystemProvider.SetProviderInformation(providerInfoToSet); fileSystemProvider.Context = new CmdletProviderContext(GetExecutionContext()); PSObject pso=new PSObject(); pso.AddOrSetProperty("IsReadOnly",false); fileSystemProvider.SetProperty(testPath, pso); fileSystemProvider.GetProperty(testPath, new Collection(){"IsReadOnly"}); FileInfo fileSystemObject1 = new FileInfo(testPath); PSObject psobject1=PSObject.AsPSObject(fileSystemObject1); foreach(PSPropertyInfo property in psobject1.Properties) { if(property.Name == "IsReadOnly") { Assert.False((bool)property.Value); } } } [Fact] public void TestSetProperty() { FileSystemProvider fileSystemProvider = new FileSystemProvider(); ProviderInfo providerInfoToSet = GetProvider(); fileSystemProvider.SetProviderInformation(providerInfoToSet); fileSystemProvider.Context = new CmdletProviderContext(GetExecutionContext()); fileSystemProvider.GetProperty(testPath, new Collection(){"Name"}); FileInfo fileSystemObject1 = new FileInfo(testPath); PSObject psobject1=PSObject.AsPSObject(fileSystemObject1); foreach(PSPropertyInfo property in psobject1.Properties) { if(property.Name == "Name") { Assert.Equal("test", property.Value); } } } [Fact] public void TestClearProperty() { FileSystemProvider fileSystemProvider = new FileSystemProvider(); ProviderInfo providerInfoToSet = GetProvider(); fileSystemProvider.SetProviderInformation(providerInfoToSet); fileSystemProvider.Context = new CmdletProviderContext(GetExecutionContext()); fileSystemProvider.ClearProperty(testPath, new Collection(){"Attributes"}); } [Fact] public void TestGetContentReader() { FileSystemProvider fileSystemProvider = new FileSystemProvider(); ProviderInfo providerInfoToSet = GetProvider(); fileSystemProvider.SetProviderInformation(providerInfoToSet); fileSystemProvider.Context = new CmdletProviderContext(GetExecutionContext()); IContentReader contentReader = fileSystemProvider.GetContentReader(testPath); Assert.Equal(contentReader.Read(1)[0],testContent); contentReader.Close(); } [Fact] public void TestGetContentWriter() { FileSystemProvider fileSystemProvider = new FileSystemProvider(); ProviderInfo providerInfoToSet = GetProvider(); fileSystemProvider.SetProviderInformation(providerInfoToSet); fileSystemProvider.Context = new CmdletProviderContext(GetExecutionContext()); IContentWriter contentWriter = fileSystemProvider.GetContentWriter(testPath); contentWriter.Write(new List(){"contentWriterTestContent"}); contentWriter.Close(); Assert.Equal(File.ReadAllText(testPath), testContent+@"contentWriterTestContent"+ System.Environment.NewLine); } [Fact] public void TestClearContent() { FileSystemProvider fileSystemProvider = new FileSystemProvider(); ProviderInfo providerInfoToSet = GetProvider(); fileSystemProvider.SetProviderInformation(providerInfoToSet); fileSystemProvider.Context = new CmdletProviderContext(GetExecutionContext()); fileSystemProvider.ClearContent(testPath); Assert.Empty(File.ReadAllText(testPath)); } } }