<############################################################################################ # File: Pester.Commands.Cmdlets.ArchiveTests.ps1 # Commands.Cmdlets.ArchiveTests suite contains Tests that are # used for validating Microsoft.PowerShell.Archive module. ############################################################################################> $script:TestSourceRoot = $PSScriptRoot Describe "Test suite for Microsoft.PowerShell.Archive module" -Tags "BVT" { BeforeAll { New-Item $TestDrive\SourceDir -Type Directory | Out-Null New-Item $TestDrive\SourceDir\ChildDir-1 -Type Directory | Out-Null New-Item $TestDrive\SourceDir\ChildDir-2 -Type Directory | Out-Null New-Item $TestDrive\SourceDir\ChildEmptyDir -Type Directory | Out-Null $content = "Some Data" $content | Out-File -FilePath $TestDrive\SourceDir\Sample-1.txt $content | Out-File -FilePath $TestDrive\SourceDir\Sample-2.txt $content | Out-File -FilePath $TestDrive\SourceDir\ChildDir-1\Sample-3.txt $content | Out-File -FilePath $TestDrive\SourceDir\ChildDir-1\Sample-4.txt $content | Out-File -FilePath $TestDrive\SourceDir\ChildDir-2\Sample-5.txt $content | Out-File -FilePath $TestDrive\SourceDir\ChildDir-2\Sample-6.txt "Some Text" > $TestDrive\Sample.unzip "Some Text" > $TestDrive\Sample.cab $preCreatedArchivePath = Join-Path $script:TestSourceRoot "SamplePreCreatedArchive.archive" Copy-Item $preCreatedArchivePath $TestDrive\SamplePreCreatedArchive.zip -Force } function Add-CompressionAssemblies { Add-Type -AssemblyName System.IO.Compression if ($psedition -eq "Core") { Add-Type -AssemblyName System.IO.Compression.ZipFile } else { Add-Type -AssemblyName System.IO.Compression.FileSystem } } function CompressArchivePathParameterSetValidator { param ( [string[]] $path, [string] $destinationPath, [string] $compressionLevel = "Optimal" ) try { Compress-Archive -Path $path -DestinationPath $destinationPath -CompressionLevel $compressionLevel trow "ValidateNotNullOrEmpty attribute is missing on one of parameters belonging to Path parameterset." } catch { $_.FullyQualifiedErrorId | Should Be "ParameterArgumentValidationError,Compress-Archive" } } function CompressArchiveLiteralPathParameterSetValidator { param ( [string[]] $literalPath, [string] $destinationPath, [string] $compressionLevel = "Optimal" ) try { Compress-Archive -LiteralPath $literalPath -DestinationPath $destinationPath -CompressionLevel $compressionLevel throw "ValidateNotNullOrEmpty attribute is missing on one of parameters belonging to LiteralPath parameterset." } catch { $_.FullyQualifiedErrorId | Should Be "ParameterArgumentValidationError,Compress-Archive" } } function CompressArchiveInValidPathValidator { param ( [string[]] $path, [string] $destinationPath, [string] $invalidPath, [string] $expectedFullyQualifiedErrorId ) try { Compress-Archive -Path $path -DestinationPath $destinationPath throw "Failed to validate that an invalid Path $invalidPath was supplied as input to Compress-Archive cmdlet." } catch { $_.FullyQualifiedErrorId | Should Be $expectedFullyQualifiedErrorId } } function CompressArchiveInValidArchiveFileExtensionValidator { param ( [string[]] $path, [string] $destinationPath, [string] $invalidArchiveFileExtension ) try { Compress-Archive -Path $path -DestinationPath $destinationPath throw "Failed to validate that an invalid archive file format $invalidArchiveFileExtension was supplied as input to Compress-Archive cmdlet." } catch { $_.FullyQualifiedErrorId | Should Be "NotSupportedArchiveFileExtension,Compress-Archive" } } function Validate-ArchiveEntryCount { param ( [string] $path, [int] $expectedEntryCount ) Add-CompressionAssemblies try { $archiveFileStreamArgs = @($path, [System.IO.FileMode]::Open) $archiveFileStream = New-Object -TypeName System.IO.FileStream -ArgumentList $archiveFileStreamArgs $zipArchiveArgs = @($archiveFileStream, [System.IO.Compression.ZipArchiveMode]::Read, $false) $zipArchive = New-Object -TypeName System.IO.Compression.ZipArchive -ArgumentList $zipArchiveArgs $actualEntryCount = $zipArchive.Entries.Count $actualEntryCount | Should Be $expectedEntryCount } finally { if ($null -ne $zipArchive) { $zipArchive.Dispose()} if ($null -ne $archiveFileStream) { $archiveFileStream.Dispose() } } } function ArchiveFileEntryContentValidator { param ( [string] $path, [string] $entryFileName, [string] $expectedEntryFileContent ) Add-CompressionAssemblies try { $destFile = "$TestDrive\ExpandedFile"+([System.Guid]::NewGuid().ToString())+".txt" $archiveFileStreamArgs = @($path, [System.IO.FileMode]::Open) $archiveFileStream = New-Object -TypeName System.IO.FileStream -ArgumentList $archiveFileStreamArgs $zipArchiveArgs = @($archiveFileStream, [System.IO.Compression.ZipArchiveMode]::Read, $false) $zipArchive = New-Object -TypeName System.IO.Compression.ZipArchive -ArgumentList $zipArchiveArgs $entryToBeUpdated = $zipArchive.Entries | ? {$_.FullName -eq $entryFileName} if($entryToBeUpdated -ne $null) { $srcStream = $entryToBeUpdated.Open() $destStream = New-Object "System.IO.FileStream" -ArgumentList( $destFile, [System.IO.FileMode]::Create ) $srcStream.CopyTo( $destStream ) $destStream.Dispose() $srcStream.Dispose() Get-Content $destFile | Should Be $expectedEntryFileContent } else { throw "Failed to find the file $entryFileName in the archive file $path" } } finally { if ($zipArchive) { $zipArchive.Dispose() } if ($archiveFileStream) { $archiveFileStream.Dispose() } } } function ExpandArchiveInvalidParameterValidator { param ( [boolean] $isLiteralPathParameterSet, [string[]] $path, [string] $destinationPath, [string] $expectedFullyQualifiedErrorId ) try { if($isLiteralPathParameterSet) { Expand-Archive -LiteralPath $literalPath -DestinationPath $destinationPath } else { Expand-Archive -Path $path -DestinationPath $destinationPath } throw "Expand-Archive did NOT throw expected error" } catch { $_.FullyQualifiedErrorId | Should Be $expectedFullyQualifiedErrorId } } Context "Compress-Archive - Parameter validation test cases" { It "Validate errors from Compress-Archive with NULL & EMPTY values for Path, LiteralPath, DestinationPath, CompressionLevel parameters" { $sourcePath = "$TestDrive\SourceDir" $destinationPath = "$TestDrive\SampleSingleFile.zip" CompressArchivePathParameterSetValidator $null $destinationPath CompressArchivePathParameterSetValidator $sourcePath $null CompressArchivePathParameterSetValidator $null $null CompressArchivePathParameterSetValidator "" $destinationPath CompressArchivePathParameterSetValidator $sourcePath "" CompressArchivePathParameterSetValidator "" "" CompressArchivePathParameterSetValidator $null $null "NoCompression" CompressArchiveLiteralPathParameterSetValidator $null $destinationPath CompressArchiveLiteralPathParameterSetValidator $sourcePath $null CompressArchiveLiteralPathParameterSetValidator $null $null CompressArchiveLiteralPathParameterSetValidator "" $destinationPath CompressArchiveLiteralPathParameterSetValidator $sourcePath "" CompressArchiveLiteralPathParameterSetValidator "" "" CompressArchiveLiteralPathParameterSetValidator $null $null "NoCompression" CompressArchiveLiteralPathParameterSetValidator $sourcePath $destinationPath $null CompressArchiveLiteralPathParameterSetValidator $sourcePath $destinationPath "" } It "Validate errors from Compress-Archive when invalid path (non-existing path / non-filesystem path) is supplied for Path or LiteralPath parameters" { CompressArchiveInValidPathValidator "$TestDrive\InvalidPath" $TestDrive "$TestDrive\InvalidPath" "ArchiveCmdletPathNotFound,Compress-Archive" CompressArchiveInValidPathValidator "HKLM:\SOFTWARE" $TestDrive "HKLM:\SOFTWARE" "PathNotFound,Compress-Archive" CompressArchiveInValidPathValidator "$TestDrive" "$TestDrive\NonExistingDirectory\sample.zip" "$TestDrive\NonExistingDirectory\sample.zip" "ArchiveCmdletPathNotFound,Compress-Archive" $path = @("$TestDrive", "$TestDrive\InvalidPath") CompressArchiveInValidPathValidator $path $TestDrive "$TestDrive\InvalidPath" "ArchiveCmdletPathNotFound,Compress-Archive" $path = @("$TestDrive", "HKLM:\SOFTWARE") CompressArchiveInValidPathValidator $path $TestDrive "HKLM:\SOFTWARE" "PathNotFound,Compress-Archive" $invalidUnZipFileFormat = "$TestDrive\Sample.unzip" CompressArchiveInValidArchiveFileExtensionValidator $TestDrive "$invalidUnZipFileFormat" ".unzip" $invalidcabZipFileFormat = "$TestDrive\Sample.cab" CompressArchiveInValidArchiveFileExtensionValidator $TestDrive "$invalidcabZipFileFormat" ".cab" } It "Validate error from Compress-Archive when archive file already exists and -Update parameter is not specified" { $sourcePath = "$TestDrive\SourceDir" $destinationPath = "$TestDrive\ValidateErrorWhenUpdateNotSpecified.zip" try { "Some Data" > $destinationPath Compress-Archive -Path $sourcePath -DestinationPath $destinationPath throw "Failed to validate that an archive file format $destinationPath already exists and -Update switch parameter is not specified while running Compress-Archive command." } catch { $_.FullyQualifiedErrorId | Should Be "ArchiveFileExists,Compress-Archive" } } It "Validate error from Compress-Archive when duplicate paths are supplied as input to Path parameter" { $sourcePath = @( "$TestDrive\SourceDir\Sample-1.txt", "$TestDrive\SourceDir\Sample-1.txt") $destinationPath = "$TestDrive\DuplicatePaths.zip" try { Compress-Archive -Path $sourcePath -DestinationPath $destinationPath throw "Failed to detect that duplicate Path $sourcePath is supplied as input to Path parameter." } catch { $_.FullyQualifiedErrorId | Should Be "DuplicatePathFound,Compress-Archive" } } It "Validate error from Compress-Archive when duplicate paths are supplied as input to LiteralPath parameter" { $sourcePath = @( "$TestDrive\SourceDir\Sample-1.txt", "$TestDrive\SourceDir\Sample-1.txt") $destinationPath = "$TestDrive\DuplicatePaths.zip" try { Compress-Archive -LiteralPath $sourcePath -DestinationPath $destinationPath throw "Failed to detect that duplicate Path $sourcePath is supplied as input to LiteralPath parameter." } catch { $_.FullyQualifiedErrorId | Should Be "DuplicatePathFound,Compress-Archive" } } } Context "Compress-Archive - functional test cases" { It "Validate that a single file can be compressed using Compress-Archive cmdlet" { $sourcePath = "$TestDrive\SourceDir\ChildDir-1\Sample-3.txt" $destinationPath = "$TestDrive\SampleSingleFile.zip" Compress-Archive -Path $sourcePath -DestinationPath $destinationPath $destinationPath | Should Exist } # This test requires a fix in PS5 to support reading paths with square bracket It "Validate that Compress-Archive cmdlet can accept LiteralPath parameter with Special Characters" -skip:($PSVersionTable.psversion -lt "5.0") { $sourcePath = "$TestDrive\SourceDir\ChildDir-1\Sample[]File.txt" "Some Random Content" | Out-File -LiteralPath $sourcePath $destinationPath = "$TestDrive\SampleSingleFileWithSpecialCharacters.zip" try { Compress-Archive -LiteralPath $sourcePath -DestinationPath $destinationPath $destinationPath | Should Exist } finally { Remove-Item -LiteralPath $sourcePath -Force } } It "Validate that Compress-Archive cmdlet errors out when DestinationPath resolves to multiple locations" { New-Item $TestDrive\SampleDir\Child-1 -Type Directory -Force | Out-Null New-Item $TestDrive\SampleDir\Child-2 -Type Directory -Force | Out-Null New-Item $TestDrive\SampleDir\Test.txt -Type File -Force | Out-Null $destinationPath = "$TestDrive\SampleDir\Child-*\SampleChidArchive.zip" $sourcePath = "$TestDrive\SampleDir\Test.txt" try { Compress-Archive -Path $sourcePath -DestinationPath $destinationPath throw "Failed to detect that destination $destinationPath can resolve to multiple paths" } catch { $_.FullyQualifiedErrorId | Should Be "InvalidArchiveFilePath,Compress-Archive" } finally { Remove-Item -LiteralPath $TestDrive\SampleDir -Force -Recurse } } It "Validate that Compress-Archive cmdlet works when DestinationPath has wild card pattern and resolves to a single valid path" { New-Item $TestDrive\SampleDir\Child-1 -Type Directory -Force | Out-Null New-Item $TestDrive\SampleDir\Test.txt -Type File -Force | Out-Null $destinationPath = "$TestDrive\SampleDir\Child-*\SampleChidArchive.zip" $sourcePath = "$TestDrive\SampleDir\Test.txt" try { Compress-Archive -Path $sourcePath -DestinationPath $destinationPath $destinationPath | Should Exist } finally { Remove-Item -LiteralPath $TestDrive\SampleDir -Force -Recurse } } # This test requires a fix in PS5 to support reading paths with square bracket It "Validate that Compress-Archive cmdlet can accept LiteralPath parameter for a directory with Special Characters in the directory name" -skip:($PSVersionTable.psversion -lt "5.0") { $sourcePath = "$TestDrive\Source[]Dir\ChildDir[]-1" New-Item $sourcePath -Type Directory | Out-Null "Some Random Content" | Out-File -LiteralPath "$sourcePath\Sample[]File.txt" $destinationPath = "$TestDrive\SampleDirWithSpecialCharacters.zip" try { Compress-Archive -LiteralPath $sourcePath -DestinationPath $destinationPath $destinationPath | Should Exist } finally { Remove-Item -LiteralPath $sourcePath -Force -Recurse } } It "Validate that Compress-Archive cmdlet can accept DestinationPath parameter with Special Characters" { $sourcePath = "$TestDrive\SourceDir\ChildDir-1\Sample-3.txt" $destinationPath = "$TestDrive\Sample[]SingleFile.zip" try { Compress-Archive -Path $sourcePath -DestinationPath $destinationPath Test-Path -LiteralPath $destinationPath | Should Be $true } finally { Remove-Item -LiteralPath $destinationPath -Force } } It "Validate that Source Path can be at SystemDrive location" { $sourcePath = "$env:SystemDrive\SourceDir" $destinationPath = "$TestDrive\SampleFromSystemDrive.zip" New-Item $sourcePath -Type Directory | Out-Null "Some Data" | Out-File -FilePath $sourcePath\SampleSourceFileForArchive.txt try { Compress-Archive -Path $sourcePath -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $true } finally { del "$sourcePath" -Force -Recurse -ErrorAction SilentlyContinue } } It "Validate that multiple files can be compressed using Compress-Archive cmdlet" { $sourcePath = @( "$TestDrive\SourceDir\ChildDir-1\Sample-3.txt", "$TestDrive\SourceDir\ChildDir-1\Sample-4.txt", "$TestDrive\SourceDir\ChildDir-2\Sample-5.txt", "$TestDrive\SourceDir\ChildDir-2\Sample-6.txt") $destinationPath = "$TestDrive\SampleMultipleFiles.zip" Compress-Archive -Path $sourcePath -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $true } It "Validate that multiple files and directories can be compressed using Compress-Archive cmdlet" { $sourcePath = @( "$TestDrive\SourceDir\Sample-1.txt", "$TestDrive\SourceDir\Sample-2.txt", "$TestDrive\SourceDir\ChildDir-1", "$TestDrive\SourceDir\ChildDir-2") $destinationPath = "$TestDrive\SampleMultipleFilesAndDirs.zip" Compress-Archive -Path $sourcePath -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $true } It "Validate that a single directory can be compressed using Compress-Archive cmdlet" { $sourcePath = @("$TestDrive\SourceDir\ChildDir-1") $destinationPath = "$TestDrive\SampleSingleDir.zip" Compress-Archive -Path $sourcePath -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $true } It "Validate that a single directory with multiple files and subdirectories can be compressed using Compress-Archive cmdlet" { $sourcePath = @("$TestDrive\SourceDir") $destinationPath = "$TestDrive\SampleSubTree.zip" Compress-Archive -Path $sourcePath -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $true } It "Validate that a single directory & multiple files can be compressed using Compress-Archive cmdlet" { $sourcePath = @( "$TestDrive\SourceDir\ChildDir-1", "$TestDrive\SourceDir\Sample-1.txt", "$TestDrive\SourceDir\Sample-2.txt") $destinationPath = "$TestDrive\SampleMultipleFilesAndSingleDir.zip" Compress-Archive -Path $sourcePath -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $true } It "Validate that if .zip extension is not supplied as input to DestinationPath parameter, then .zip extension is appended" { $sourcePath = @("$TestDrive\SourceDir") $destinationPath = "$TestDrive\SampleNoExtension.zip" $destinationWithoutExtensionPath = "$TestDrive\SampleNoExtension" Compress-Archive -Path $sourcePath -DestinationPath $destinationWithoutExtensionPath Test-Path $destinationPath | Should Be $true } It "Validate that relative path can be specified as Path parameter of Compress-Archive cmdlet" { $sourcePath = ".\SourceDir" $destinationPath = "RelativePathForPathParameter.zip" try { Push-Location $TestDrive Compress-Archive -Path $sourcePath -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $true } finally { Pop-Location } } It "Validate that relative path can be specified as LiteralPath parameter of Compress-Archive cmdlet" { $sourcePath = ".\SourceDir" $destinationPath = "RelativePathForLiteralPathParameter.zip" try { Push-Location $TestDrive Compress-Archive -LiteralPath $sourcePath -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $true } finally { Pop-Location } } It "Validate that relative path can be specified as DestinationPath parameter of Compress-Archive cmdlet" { $sourcePath = "$TestDrive\SourceDir" $destinationPath = ".\RelativePathForDestinationPathParameter.zip" try { Push-Location $TestDrive Compress-Archive -Path $sourcePath -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $true } finally { Pop-Location } } It "Validate that -Update parameter makes Compress-Archive to not throw an error if archive file already exists" { $sourcePath = @("$TestDrive\SourceDir") $destinationPath = "$TestDrive\SampleUpdateTest.zip" Compress-Archive -Path $sourcePath -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $true Compress-Archive -Path $sourcePath -DestinationPath $destinationPath -Update Test-Path $destinationPath | Should Be $true } It "Validate -Update parameter by adding a new file to an existing archive file" { $sourcePath = @("$TestDrive\SourceDir\ChildDir-1") $destinationPath = "$TestDrive\SampleUpdateAdd1File.zip" Compress-Archive -Path $sourcePath -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $true New-Item $TestDrive\SourceDir\ChildDir-1\Sample-AddedNewFile.txt -Type File | Out-Null Compress-Archive -Path $sourcePath -DestinationPath $destinationPath -Update Test-Path $destinationPath | Should Be $true Validate-ArchiveEntryCount -path $destinationPath -expectedEntryCount 3 } It "Validate that all CompressionLevel values can be used with Compress-Archive cmdlet" { $sourcePath = "$TestDrive\SourceDir\Sample-1.txt" $destinationPath = "$TestDrive\FastestCompressionLevel.zip" Compress-Archive -Path $sourcePath -DestinationPath $destinationPath -CompressionLevel Fastest Test-Path $destinationPath | Should Be $true $destinationPath = "$TestDrive\OptimalCompressionLevel.zip" Compress-Archive -Path $sourcePath -DestinationPath $destinationPath -CompressionLevel Optimal Test-Path $destinationPath | Should Be $true $destinationPath = "$TestDrive\NoCompressionCompressionLevel.zip" Compress-Archive -Path $sourcePath -DestinationPath $destinationPath -CompressionLevel NoCompression Test-Path $destinationPath | Should Be $true } It "Validate that -Update parameter is modifying a file that already exists in the archive file" { $filePath = "$TestDrive\SourceDir\ChildDir-1\Sample-3.txt" $initialContent = "Initial Content" $modifiedContent = "Modified Content" $initialContent | Set-Content $filePath $sourcePath = "$TestDrive\SourceDir" $destinationPath = "$TestDrive\UpdatingModifiedFile.zip" Compress-Archive -Path $sourcePath -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $True $modifiedContent | Set-Content $filePath Compress-Archive -Path $sourcePath -DestinationPath $destinationPath -Update Test-Path $destinationPath | Should Be $True ArchiveFileEntryContentValidator "$destinationPath" "SourceDir\ChildDir-1\Sample-3.txt" $modifiedContent } It "Validate Compress-Archive cmdlet in pipleline scenario" { $destinationPath = "$TestDrive\CompressArchiveFromPipeline.zip" # Piping a single file path to Compress-Archive dir -Path $TestDrive\SourceDir\Sample-1.txt | Compress-Archive -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $True # Piping a string directory path to Compress-Archive "$TestDrive\SourceDir\ChildDir-2" | Compress-Archive -DestinationPath $destinationPath -Update Test-Path $destinationPath | Should Be $True # Piping the output of Get-ChildItem to Compress-Archive dir "$TestDrive\SourceDir" -Recurse | Compress-Archive -DestinationPath $destinationPath -Update Test-Path $destinationPath | Should Be $True } It "Validate that Compress-Archive works on ReadOnly files" { $sourcePath = "$TestDrive\ReadOnlyFile.txt" $destinationPath = "$TestDrive\TestForReadOnlyFile.zip" "Some Content" | Out-File -FilePath $sourcePath $createdItem = Get-Item $sourcePath $createdItem.Attributes = 'ReadOnly' Compress-Archive -Path $sourcePath -DestinationPath $destinationPath Test-Path $destinationPath | Should Be $true } It "Validate that Compress-Archive generates Verbose messages" { $sourcePath = "$TestDrive\SourceDir" $destinationPath = "$TestDrive\Compress-Archive generates VerboseMessages.zip" try { $ps=[PowerShell]::Create() $ps.Streams.Error.Clear() $ps.Streams.Verbose.Clear() $script = "Import-Module Microsoft.PowerShell.Archive; Compress-Archive -Path $sourcePath -DestinationPath `"$destinationPath`" -CompressionLevel Fastest -Verbose" $ps.AddScript($script) $ps.Invoke() $ps.Streams.Verbose.Count -gt 0 | Should Be $True $ps.Streams.Error.Count | Should Be 0 } finally { $ps.Dispose() } } } Context "Expand-Archive - Parameter validation test cases" { It "Validate non existing archive -Path trows expected error message" { $sourcePath = "$TestDrive\SourceDir" $destinationPath = "$TestDrive\ExpandedArchive" try { Expand-Archive -Path $sourcePath -DestinationPath $destinationPath throw "Expand-Archive succeeded for non existing archive path" } catch { $_.FullyQualifiedErrorId | Should Be "PathNotFound,Expand-Archive" } } It "Validate errors from Expand-Archive with NULL & EMPTY values for Path, LiteralPath, DestinationPath parameters" { ExpandArchiveInvalidParameterValidator $false $null "$TestDrive\SourceDir" "ParameterArgumentValidationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $false $null $null "ParameterArgumentValidationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $false "$TestDrive\SourceDir" $null "ParameterArgumentTransformationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $false "" "$TestDrive\SourceDir" "ParameterArgumentTransformationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $false "$TestDrive\SourceDir" "" "ParameterArgumentTransformationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $false "" "" "ParameterArgumentTransformationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $true $null "$TestDrive\SourceDir" "ParameterArgumentValidationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $true $null $null "ParameterArgumentValidationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $true "$TestDrive\SourceDir" $null "ParameterArgumentValidationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $true "" "$TestDrive\SourceDir" "ParameterArgumentValidationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $true "$TestDrive\SourceDir" "" "ParameterArgumentValidationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $true "" "" "ParameterArgumentValidationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $true $null "$TestDrive\SourceDir" "ParameterArgumentValidationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $true $null $null "ParameterArgumentValidationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $true "$TestDrive\SourceDir" $null "ParameterArgumentValidationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $true "" "$TestDrive\SourceDir" "ParameterArgumentValidationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $true "$TestDrive\SourceDir" "" "ParameterArgumentValidationError,Expand-Archive" ExpandArchiveInvalidParameterValidator $true "" "" "ParameterArgumentValidationError,Expand-Archive" } It "Validate errors from Expand-Archive when invalid path (non-existing path / non-filesystem path) is supplied for Path or LiteralPath parameters" { try { Expand-Archive -Path "$TestDrive\NonExistingArchive" -DestinationPath "$TestDrive\SourceDir"; throw "Expand-Archive did NOT throw expected error" } catch { $_.FullyQualifiedErrorId | Should Be "ArchiveCmdletPathNotFound,Expand-Archive" } try { Expand-Archive -Path "HKLM:\SOFTWARE" -DestinationPath "$TestDrive\SourceDir"; throw "Expand-Archive did NOT throw expected error" } catch { $_.FullyQualifiedErrorId | Should Be "PathNotFound,Expand-Archive" } try { Expand-Archive -LiteralPath "$TestDrive\NonExistingArchive" -DestinationPath "$TestDrive\SourceDir"; throw "Expand-Archive did NOT throw expected error" } catch { $_.FullyQualifiedErrorId | Should Be "ArchiveCmdletPathNotFound,Expand-Archive" } try { Expand-Archive -LiteralPath "HKLM:\SOFTWARE" -DestinationPath "$TestDrive\SourceDir"; throw "Expand-Archive did NOT throw expected error" } catch { $_.FullyQualifiedErrorId | Should Be "PathNotFound,Expand-Archive" } } It "Validate error from Expand-Archive when invalid path (non-existing path / non-filesystem path) is supplied for DestinationPath parameter" { $sourcePath = "$TestDrive\SamplePreCreatedArchive.zip" $destinationPath = "HKLM:\SOFTWARE" try { Expand-Archive -Path $sourcePath -DestinationPath $destinationPath; throw "Expand-Archive did NOT throw expected error" } catch { $_.FullyQualifiedErrorId | Should Be "InvalidDirectoryPath,Expand-Archive" } } } Context "Expand-Archive - functional test cases" { It "Validate basic Expand-Archive scenario" { $sourcePath = "$TestDrive\SamplePreCreatedArchive.zip" $content = "Some Data" $destinationPath = "$TestDrive\DestDirForBasicExpand" $files = @("Sample-1.txt", "Sample-2.txt") # The files in "$TestDrive\SamplePreCreatedArchive.zip" are precreated. $fileCreationTimeStamp = Get-Date -Year 2014 -Month 6 -Day 13 -Hour 15 -Minute 50 -Second 20 -Millisecond 0 Expand-Archive -Path $sourcePath -DestinationPath $destinationPath foreach($currentFile in $files) { $expandedFile = Join-Path $destinationPath -ChildPath $currentFile Test-Path $expandedFile | Should Be $True # We are validating to make sure that time stamps are preserved in the # compressed archive are reflected back when the file is expanded. (dir $expandedFile).LastWriteTime.CompareTo($fileCreationTimeStamp) | Should Be 0 Get-Content $expandedFile | Should Be $content } } It "Validate that Expand-Archive cmdlet errors out when DestinationPath resolves to multiple locations" { New-Item $TestDrive\SampleDir\Child-1 -Type Directory -Force | Out-Null New-Item $TestDrive\SampleDir\Child-2 -Type Directory -Force | Out-Null $destinationPath = "$TestDrive\SampleDir\Child-*" $sourcePath = "$TestDrive\SamplePreCreatedArchive.zip" try { Expand-Archive -Path $sourcePath -DestinationPath $destinationPath throw "Failed to detect that destination $destinationPath can resolve to multiple paths" } catch { $_.FullyQualifiedErrorId | Should Be "InvalidDestinationPath,Expand-Archive" } finally { Remove-Item -LiteralPath $TestDrive\SampleDir -Force -Recurse } } It "Validate that Expand-Archive cmdlet works when DestinationPath resolves has wild card pattern and resolves to a single valid path" { New-Item $TestDrive\SampleDir\Child-1 -Type Directory -Force | Out-Null $destinationPath = "$TestDrive\SampleDir\Child-*" $sourcePath = "$TestDrive\SamplePreCreatedArchive.zip" try { Expand-Archive -Path $sourcePath -DestinationPath $destinationPath $expandedFiles = Get-ChildItem $destinationPath -Recurse $expandedFiles.Length | Should BeGreaterThan 1 } finally { Remove-Item -LiteralPath $TestDrive\SampleDir -Force -Recurse } } It "Validate Expand-Archive scenario where DestinationPath has Special Characters" { $sourcePath = "$TestDrive\SamplePreCreatedArchive.zip" $content = "Some Data" $destinationPath = "$TestDrive\DestDir[]Expand" $files = @("Sample-1.txt", "Sample-2.txt") # The files in "$TestDrive\SamplePreCreatedArchive.zip" are precreated. $fileCreationTimeStamp = Get-Date -Year 2014 -Month 6 -Day 13 -Hour 15 -Minute 50 -Second 20 -Millisecond 0 Expand-Archive -Path $sourcePath -DestinationPath $destinationPath foreach($currentFile in $files) { $expandedFile = Join-Path $destinationPath -ChildPath $currentFile Test-Path -LiteralPath $expandedFile | Should Be $True # We are validating to make sure that time stamps are preserved in the # compressed archive are reflected back when the file is expanded. (dir -LiteralPath $expandedFile).LastWriteTime.CompareTo($fileCreationTimeStamp) | Should Be 0 Get-Content -LiteralPath $expandedFile | Should Be $content } } It "Invoke Expand-Archive with relative path in Path parameter and -Force parameter" { $sourcePath = ".\SamplePreCreatedArchive.zip" $destinationPath = "$TestDrive\SomeOtherNonExistingDir\Path" try { Push-Location $TestDrive Expand-Archive -Path $sourcePath -DestinationPath $destinationPath -Force $expandedFiles = Get-ChildItem $destinationPath -Recurse $expandedFiles.Length | Should Be 2 } finally { Pop-Location } } It "Invoke Expand-Archive with relative path in LiteralPath parameter and -Force parameter" { $sourcePath = ".\SamplePreCreatedArchive.zip" $destinationPath = "$TestDrive\SomeOtherNonExistingDir\LiteralPath" try { Push-Location $TestDrive Expand-Archive -LiteralPath $sourcePath -DestinationPath $destinationPath -Force $expandedFiles = Get-ChildItem $destinationPath -Recurse $expandedFiles.Length | Should Be 2 } finally { Pop-Location } } It "Invoke Expand-Archive with non-existing relative directory in DestinationPath parameter and -Force parameter" { $sourcePath = "$TestDrive\SamplePreCreatedArchive.zip" $destinationPath = ".\SomeOtherNonExistingDir\DestinationPath" try { Push-Location $TestDrive Expand-Archive -Path $sourcePath -DestinationPath $destinationPath -Force $expandedFiles = Get-ChildItem $destinationPath -Recurse $expandedFiles.Length | Should Be 2 } finally { Pop-Location } } It "Invoke Expand-Archive with unsupported archive format" { $sourcePath = "$TestDrive\Sample.cab" $destinationPath = "$TestDrive\UnsupportedArchiveFormatDir" try { Expand-Archive -Path $sourcePath -DestinationPath $destinationPath -Force throw "Failed to detect unsupported archive format at $sourcePath" } catch { $_.FullyQualifiedErrorId | Should Be "NotSupportedArchiveFileExtension,Expand-Archive" } } It "Invoke Expand-Archive with archive file containing multiple files, directories with subdirectories and empty directories" { $sourcePath = "$TestDrive\SourceDir" $archivePath = "$TestDrive\FileAndDirTreeForExpand.zip" $destinationPath = "$TestDrive\FileAndDirTree" $sourceList = dir $sourcePath -Name Add-CompressionAssemblies [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcePath, $archivePath) Expand-Archive -Path $archivePath -DestinationPath $destinationPath $extractedList = dir $destinationPath -Name Compare-Object -ReferenceObject $extractedList -DifferenceObject $sourceList -PassThru | Should Be $null } It "Validate Expand-Archive cmdlet in pipleline scenario" { $sourcePath = "$TestDrive\SamplePreCreated*.zip" $destinationPath = "$TestDrive\PipeToExpandArchive" $content = "Some Data" $files = @("Sample-1.txt", "Sample-2.txt") dir $sourcePath | Expand-Archive -DestinationPath $destinationPath foreach($currentFile in $files) { $expandedFile = Join-Path $destinationPath -ChildPath $currentFile Test-Path $expandedFile | Should Be $True Get-Content $expandedFile | Should Be $content } } It "Validate that Expand-Archive generates Verbose messages" { $sourcePath = "$TestDrive\SamplePreCreatedArchive.zip" $destinationPath = "$TestDrive\VerboseMessagesInExpandArchive" try { $ps=[PowerShell]::Create() $ps.Streams.Error.Clear() $ps.Streams.Verbose.Clear() $script = "Import-Module Microsoft.PowerShell.Archive; Expand-Archive -Path $sourcePath -DestinationPath $destinationPath -Verbose" $ps.AddScript($script) $ps.Invoke() $ps.Streams.Verbose.Count -gt 0 | Should Be $True $ps.Streams.Error.Count | Should Be 0 } finally { $ps.Dispose() } } It "Validate that without -Force parameter Expand-Archive generates non-terminating errors without overwriting existing files" { $sourcePath = "$TestDrive\SamplePreCreatedArchive.zip" $destinationPath = "$TestDrive\NoForceParameterExpandArchive" try { $ps=[PowerShell]::Create() $ps.Streams.Error.Clear() $ps.Streams.Verbose.Clear() $script = "Import-Module Microsoft.PowerShell.Archive; Expand-Archive -Path $sourcePath -DestinationPath $destinationPath; Expand-Archive -Path $sourcePath -DestinationPath $destinationPath" $ps.AddScript($script) $ps.Invoke() $ps.Streams.Error.Count -gt 0 | Should Be $True } finally { $ps.Dispose() } } It "Validate that without DestinationPath parameter Expand-Archive cmdlet succeeds in expanding the archive" { $sourcePath = "$TestDrive\SamplePreCreatedArchive.zip" $archivePath = "$TestDrive\NoDestinationPathParameter.zip" $destinationPath = "$TestDrive\NoDestinationPathParameter" copy $sourcePath $archivePath -Force try { Push-Location $TestDrive Expand-Archive -Path $archivePath (dir $destinationPath).Count | Should Be 2 } finally { Pop-Location } } It "Validate that without DestinationPath parameter Expand-Archive cmdlet succeeds in expanding the archive when destination directory exists" { $sourcePath = "$TestDrive\SamplePreCreatedArchive.zip" $archivePath = "$TestDrive\NoDestinationPathParameterDirExists.zip" $destinationPath = "$TestDrive\NoDestinationPathParameterDirExists" copy $sourcePath $archivePath -Force New-Item -Path $destinationPath -ItemType Directory | Out-Null try { Push-Location $TestDrive Expand-Archive -Path $archivePath (dir $destinationPath).Count | Should Be 2 } finally { Pop-Location } } } }