File: System\Windows\TestUtilities\VbFileCleanupTestBase.vb
Web Access
Project: src\src\Microsoft.VisualBasic.Forms\tests\UnitTests\Microsoft.VisualBasic.Forms.Tests.vbproj (Microsoft.VisualBasic.Forms.Tests)
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
 
Imports System.IO
Imports System.Runtime.CompilerServices
 
Namespace Microsoft.VisualBasic.Forms.Tests
 
    Public MustInherit Class VbFileCleanupTestBase
        Implements IDisposable
 
        Private Shared ReadOnly s_baseTempPath As String = Path.Combine(Path.GetTempPath, "DownLoadTest9d9e3a8-7a46-4333-a0eb-4faf76994801")
 
        Friend ReadOnly _testDirectories As New HashSet(Of String)
 
        Protected Overrides Sub Finalize()
            Dispose(disposing:=False)
        End Sub
 
        ' The base path is system temp directory / a guaranteed unique directory based on a GUID / a temp directory based on TestName
        Friend Shared ReadOnly Property BaseTempPath As String
            Get
                Return s_baseTempPath
            End Get
        End Property
 
        Protected Overridable Sub Dispose(disposing As Boolean)
            Try
                For Each testDirectoryName As String In _testDirectories
                    If Directory.Exists(testDirectoryName) Then
                        Directory.Delete(testDirectoryName, recursive:=True)
                    End If
                Next
            Catch
            End Try
        End Sub
 
        ''' <summary>
        '''  Creates or returns a directory based on the name of the function that
        '''  call it. The base directory is described above.
        '''  Even if directory exists this call will success and just return it.
        ''' </summary>
        ''' <param name="memberName"></param>
        ''' <param name="lineNumber">If >1 use line number as part of name.</param>
        ''' <returns>The name of a directory that is safe to write to and is verified to exist.</returns>
        Friend Function CreateTempDirectory(<CallerMemberName> Optional memberName As String = Nothing, Optional lineNumber As Integer = -1) As String
            Dim folder As String
            If lineNumber > 0 Then
                folder = Path.Combine(BaseTempPath, $"{memberName}{lineNumber}")
            Else
                folder = Path.Combine(BaseTempPath, memberName)
            End If
 
            If _testDirectories.Add(folder) Then
                Directory.CreateDirectory(folder)
            End If
 
            Return folder
        End Function
 
        ''' <summary>
        '''  If size >= 0 then create the file with size length.
        ''' </summary>
        ''' <param name="sourceDirectoryName">Full path to working directory.</param>
        ''' <param name="filename"></param>
        ''' <param name="size">Size in bytes of the file to be created.</param>
        ''' <returns>
        '''  The full path and file name of the created file.
        '''  If size = -1 no file is create but the full path is returned.
        ''' </returns>
        Friend Function CreateTempFile(sourceDirectoryName As String, Optional filename As String = "Testing.Txt", Optional size As Integer = -1) As String
            Dim filenameWithPath As String = Path.Combine(sourceDirectoryName, filename)
 
            If size >= 0 Then
                Using destinationStream As FileStream = File.Create(filenameWithPath)
                    destinationStream.Write(New Byte(size - 1) {})
                    destinationStream.Flush()
                    destinationStream.Close()
                End Using
            End If
            Return filenameWithPath
        End Function
 
        Friend Shared Function DirectoryIsAccessible(directoryPath As String) As Boolean
            If String.IsNullOrWhiteSpace(directoryPath) Then
                Return False
            End If
 
            Try
                Dim info As New DirectoryInfo(directoryPath)
                If Not info.Exists Then
                    Return False
                End If
                Dim path As String = IO.Path.Combine(directoryPath, GetUniqueFileName())
                Using stream As FileStream = File.Create(path)
                    stream.Close()
                End Using
                File.Delete(path)
            Catch s As Security.SecurityException
                Return False
            Catch
                Return False
            End Try
            Return True
        End Function
 
        Friend Sub Dispose() Implements IDisposable.Dispose
            Dispose(disposing:=True)
            GC.SuppressFinalize(Me)
        End Sub
 
        Friend Function GetUniqueFileNameWithPath(testDirectory As String) As String
            Return Path.Combine(testDirectory, GetUniqueFileName())
        End Function
 
    End Class
End Namespace