Tests/TestHelpers/MSFT_ServiceResource.TestHelper.psm1

<#
    .SYNOPSIS
        Creates a service binary file.
 
    .PARAMETER ServiceName
        The name of the service to create the binary file for.
 
    .PARAMETER ServiceCodePath
        The path to the code for the service to create the binary file for.
 
    .PARAMETER ServiceDisplayName
        The display name of the service to create the binary file for.
 
    .PARAMETER ServiceDescription
        The description of the service to create the binary file for.
 
    .PARAMETER ServiceDependsOn
        Dependencies of the service to create the binary file for.
 
    .PARAMETER ServiceExecutablePath
        The path to write the service executable to.
#>

function New-ServiceBinary
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [String]
        $ServiceName,

        [Parameter(Mandatory = $true)]
        [String]
        $ServiceCodePath,

        [Parameter(Mandatory = $true)]
        [String]
        $ServiceDisplayName,

        [Parameter(Mandatory = $true)]
        [String]
        $ServiceDescription,

        [Parameter(Mandatory = $true)]
        [String]
        $ServiceDependsOn,

        [Parameter(Mandatory = $true)]
        [String]
        $ServiceExecutablePath
    )

    if (Get-Service $ServiceName -ErrorAction Ignore)
    {
        Stop-Service $ServiceName -ErrorAction SilentlyContinue
        Remove-TestService -ServiceName $ServiceName -ServiceExecutablePath $ServiceExecutablePath
    }

    $fileText = Get-Content $ServiceCodePath -Raw
    $fileText = $fileText.Replace('TestServiceReplacementName', $ServiceName)
    $fileText = $fileText.Replace('TestServiceReplacementDisplayName', $ServiceDisplayName)
    $fileText = $fileText.Replace('TestServiceReplacementDescription', $ServiceDescription)
    $fileText = $fileText.Replace('TestServiceReplacementDependsOn', $ServiceDependsOn)
    Add-Type $fileText `
                -OutputAssembly $ServiceExecutablePath `
                -OutputType WindowsApplication `
                -ReferencedAssemblies @('System.ServiceProcess', 'System.Configuration.Install')
}

<#
    .SYNOPSIS
    Retrieves the path to the install utility.
#>

function Get-InstallUtilPath
{
    [CmdletBinding()]
    param ()

    if ($env:Processor_Architecture -ieq 'amd64')
    {
        $frameworkName = 'Framework64'
    }
    else
    {
        $frameworkName = 'Framework'
    }

    return Join-Path -Path (Resolve-Path "$env:WinDir\Microsoft.Net\$frameworkName\v4*") `
                     -ChildPath 'installUtil.exe'
}

<#
    .SYNOPSIS
    Removes a service.
 
    .PARAMETER ServiceName
    The name of the service to remove.
 
    .PARAMETER ServiceExecutablePath
    The path to the executable of the service to remove.
#>

function Remove-TestService
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [String]
        $ServiceName,

        [Parameter(Mandatory = $true)]
        [String]
        $ServiceExecutablePath
    )

    if (Get-Service -Name $ServiceName -ErrorAction SilentlyContinue)
    {
        $installUtility = Get-InstallUtilPath
        & $installUtility /u $ServiceExecutablePath
    }

    Remove-Item $ServiceExecutablePath -Force -ErrorAction SilentlyContinue
    Remove-Item *.InstallLog -Force -ErrorAction SilentlyContinue
    Remove-Item $ServiceName -Force -Recurse -ErrorAction SilentlyContinue
}

function Get-InvalidArgumentRecord
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $ErrorId,

        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $ErrorMessage
    )

    $exception = New-Object -TypeName System.InvalidOperationException `
                            -ArgumentList $ErrorMessage
    $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidOperation
    $errorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord `
                              -ArgumentList $exception, $ErrorId, $errorCategory, $null
    return $errorRecord
}

Export-ModuleMember -Function `
    New-ServiceBinary, `
    New-TestService, `
    Remove-TestService, `
    Get-InvalidArgumentRecord