...

Text file src/github.com/Azure/azure-sdk-for-go/eng/scripts/MgmtTestLib.ps1

Documentation: github.com/Azure/azure-sdk-for-go/eng/scripts

     1#Requires -Version 7.0
     2
     3$MOCK_SERVER_NAME = "mock-server"
     4$MOCK_SERVER_DIR = "mock-service-host"
     5$MOCK_SERVER_READY = "validator initialized"
     6$MOCK_SERVER_WAIT_TIME = 600
     7function Invoke-MgmtTestgen ()
     8{
     9    param (
    10        [string]$sdkDirectory = "",
    11        [switch]$clean,
    12        [switch]$vet,
    13        [switch]$generateExample,
    14        [switch]$generateMockTest,
    15        [switch]$skipBuild,
    16        [switch]$cleanGenerated,
    17        [switch]$format,
    18        [switch]$tidy,
    19        [string]$autorestPath = "",
    20        [string]$config = "autorest.md",
    21        [string]$autorestVersion = "3.8.2",
    22        [string]$goExtension = "@autorest/go@4.0.0-preview.41",
    23        [string]$testExtension = "@autorest/gotest@4.0.1",
    24        [string]$outputFolder
    25    )
    26    if ($clean)
    27    {
    28        Write-Host "##[command]Executing go clean -v ./... in " $sdkDirectory
    29        go clean -v ./...
    30        if ($LASTEXITCODE) { exit $LASTEXITCODE }
    31    }
    32
    33    if ($cleanGenerated)
    34    {
    35        Write-Host "##[command]Cleaning auto-generated files in" $sdkDirectory
    36        Remove-Item "ze_generated_*"
    37        Remove-Item "zt_generated_*"
    38    }
    39
    40    if ($generateExample -or $generateMockTest)
    41    {
    42        Write-Host "##[command]Executing autorest.gotest in " $sdkDirectory
    43
    44        if ($autorestPath -eq "") {
    45            $autorestPath = "./" + $config
    46        }
    47        
    48        
    49        if ($outputFolder -eq '')
    50        {
    51            $outputFolder = $sdkDirectory
    52        }
    53        $exampleFlag = "false"
    54        if ($generateExample)
    55        {
    56            $exampleFlag = "true"
    57        }
    58        $mockTestFlag = "true"
    59        if (-not $generateMockTest)
    60        {
    61            $mockTestFlag = "false"
    62        }
    63        Write-Host "autorest --version=$autorestVersion --use=$goExtension --use=$testExtension --go --track2 --output-folder=$outputFolder --clear-output-folder=false --go.clear-output-folder=false --generate-sdk=false --testmodeler.generate-mock-test=$mockTestFlag --testmodeler.generate-sdk-example=$exampleFlag $autorestPath"
    64        npx autorest --version=$autorestVersion --use=$goExtension --use=$testExtension --go --track2 --output-folder=$outputFolder --clear-output-folder=false --go.clear-output-folder=false --generate-sdk=false --testmodeler.generate-mock-test=$mockTestFlag --testmodeler.generate-sdk-example=$exampleFlag $autorestPath
    65        if ($LASTEXITCODE)
    66        {
    67            Write-Host "##[error]Error running autorest.gotest"
    68            exit $LASTEXITCODE
    69        }
    70    }
    71
    72    if ($format)
    73    {
    74        Write-Host "##[command]Executing gofmt -s -w . in " $sdkDirectory
    75        gofmt -s -w .
    76        if ($LASTEXITCODE) { exit $LASTEXITCODE }
    77    }
    78
    79    if ($tidy)
    80    {
    81        Write-Host "##[command]Executing go mod tidy in " $sdkDirectory
    82        go mod tidy
    83        if ($LASTEXITCODE) { exit $LASTEXITCODE }
    84    }
    85
    86    if (!$skipBuild)
    87    {
    88        Write-Host "##[command]Executing go build -x -v ./... in " $sdkDirectory
    89        go build -x -v ./...
    90        Write-Host "##[command]Build Complete!"
    91        if ($LASTEXITCODE) { exit $LASTEXITCODE }
    92    }
    93
    94    if ($vet)
    95    {
    96        Write-Host "##[command]Executing go vet ./... in " $sdkDirectory
    97        go vet ./...
    98    }
    99}
   100
   101. (Join-Path $PSScriptRoot .. common scripts common.ps1)
   102
   103function PrepareMockServer()
   104{
   105    # install mock server
   106    $folder = Join-Path $env:TEMP "$MOCK_SERVER_DIR"
   107    StopMockServer
   108    try
   109    {
   110        Remove-Item -Recurse -Force -Path $folder
   111    }
   112    catch
   113    {
   114        Write-Host "Mock service host folder: $folder not existed"
   115    }
   116    New-Item -ItemType Directory -Force -Path $folder
   117    Set-Location $folder
   118    npm install @azure-tools/mock-service-host
   119}
   120
   121function StartMockServer()
   122{
   123    param(
   124        [string]$specDir = "",
   125        [string]$rpSDKFolder,
   126        [string]$autorestConfigFile = "autorest.md"
   127    )
   128    $folder = Join-Path $env:TEMP  "$MOCK_SERVER_DIR"
   129    Set-Location $folder
   130
   131    # change .env file to use the specific swagger file
   132    $envFile = Join-Path $folder .env
   133    $swaggerInfo = GetSwaggerInfo -specDir $specDir -rpSDKFolder $rpSDKFolder -autorestConfigFile $autorestConfigFile
   134    New-Item -Path $envFile -ItemType File -Value '' -Force
   135
   136    $swaggerPath = $swaggerInfo.path
   137    $specName = $swaggerInfo.specName
   138    if ($swaggerInfo.isRepoUrl -eq $true) {
   139        Add-Content $envFile "specRetrievalGitUrl=$swaggerPath"
   140        if ([string]::IsNullOrEmpty($swaggerInfo.branch) -eq $false) {
   141            Add-Content $envFile "specRetrievalGitBranch=$($swaggerInfo.branch)"
   142        }
   143        if ([string]::IsNullOrEmpty($swaggerInfo.commitID) -eq $false) {
   144            Add-Content $envFile "specRetrievalGitCommitID=$($swaggerInfo.commitID)"
   145        }
   146        Add-Content $envFile "validationPathsPattern=specification/$specName/resource-manager/**/*.json"
   147    } else {
   148        Write-Host "start Mock Test from local swagger"
   149        Add-Content $envFile "specRetrievalMethod=filesystem
   150specRetrievalLocalRelativePath=$swaggerPath
   151validationPathsPattern=$swaggerPath/*/resource-manager/**/*.json"
   152    }
   153
   154    # start mock server and check status
   155    Start-Job -Name $MOCK_SERVER_NAME -ScriptBlock { node node_modules/@azure-tools/mock-service-host/dist/src/main.js 2>&1 }
   156    $output = Receive-Job $MOCK_SERVER_NAME
   157    Write-Host "Mock sever status: `n $("$output")"
   158    $time = 0
   159    try
   160    {
   161        while ("$output" -notmatch $MOCK_SERVER_READY)
   162        {
   163            if ($time -gt $MOCK_SERVER_WAIT_TIME)
   164            {
   165                Write-Host "##[error] mock server start timeout"
   166                StopMockServer
   167                exit 1
   168            }
   169            Write-Host "Server not ready, wait for annother 10 seconds"
   170            $time += 10
   171            Start-Sleep -Seconds 10
   172            $output = Receive-Job $MOCK_SERVER_NAME
   173            Write-Host "Mock sever status: `n $("$output")"
   174        }
   175    }
   176    catch
   177    {
   178        Write-Host "##[error]wait for mock server start:`n$_"
   179        exit 1
   180    }
   181}
   182
   183function StopMockServer()
   184{
   185    try
   186    {
   187        Stop-Job -Name $MOCK_SERVER_NAME
   188    }
   189    catch
   190    {
   191        Write-Host "##[error]can not stop mock server:`n$_"
   192    }
   193}
   194
   195function GetSwaggerInfo() {
   196    param(
   197        [string]$specDir = "",
   198        [string]$rpSDKFolder,
   199        [string]$autorestConfigFile = "autorest.md"
   200    )
   201
   202    if ([string]::IsNullOrEmpty($rpSDKFolder))
   203    {
   204        if ([string]::IsNullOrEmpty($specDir)) {
   205            $swaggerInfo = [PSCustomObject]@{
   206                isRepoUrl = $true
   207                path = "https://github.com/Azure/azure-rest-api-specs"
   208                specName = "*"
   209                org = "Azure"
   210                branch = "main"
   211                commitID = ""
   212            }
   213        } else {
   214            $swaggerInfo = [PSCustomObject]@{
   215                isRepoUrl = $false
   216                path = $specDir
   217                specName = "*"
   218                org = ""
   219                branch = ""
   220                commitID = ""
   221            }
   222        }
   223    } else {
   224        $file="$rpSDKFolder/$autorestConfigFile"
   225        $readmefile = (Select-String -Path $file -Pattern ".*readme.md" | ForEach-Object {$_.Matches.Value}) -replace "require *:|- ", ""
   226        if ([string]::IsNullOrEmpty($readmefile)) {
   227            Write-Host "Cannot get swagger info"
   228            exit 1
   229        }
   230        $readmefile = $readmefile -replace "\\", "/"
   231        
   232        $isRepoUrl = $false
   233        $path = ""
   234        $specName = ""
   235        $org = ""
   236        $branch = ""
   237        $commitID = ""
   238        $readmefile = $readmefile.Trim()
   239
   240        if ($readmefile.StartsWith("http")) {
   241            $isRepoUrl = $true
   242        }
   243        if ($isRepoUrl -eq $true) {
   244            $swaggerInfoRegex = ".*github.*.com\/(?<org>.*)\/azure-rest-api-specs\/blob\/(?<commitID>[0-9a-f]{40})\/specification\/(?<specName>.*)\/resource-manager\/readme.md"
   245            $rawSwaggerInfoRegex = ".*github.*.com\/(?<org>.*)\/azure-rest-api-specs\/(?<commitID>[0-9a-f]{40})\/specification\/(?<specName>.*)\/resource-manager\/readme.md"
   246            $swaggerNoCommitRegex = ".*github.*.com\/(?<org>.*)\/azure-rest-api-specs\/(blob\/)?(?<branch>.*)\/specification\/(?<specName>.*)\/resource-manager\/readme.md"
   247            try
   248            {
   249                if ($readmefile -match $swaggerInfoRegex)
   250                {
   251                    $org = $matches["org"]
   252                    $specName = $matches["specName"]
   253                    $commitID = $matches["commitID"]
   254                    $path = "https://github.com/$org/azure-rest-api-specs"
   255                } elseif ($readmefile -match $rawSwaggerInfoRegex)
   256                {
   257                    $org = $matches["org"]
   258                    $specName = $matches["specName"]
   259                    $commitID = $matches["commitID"]
   260                    $path = "https://github.com/$org/azure-rest-api-specs"
   261                }elseif ($readmefile -match $swaggerNoCommitRegex)
   262                {
   263                    $org = $matches["org"]
   264                    $specName = $matches["specName"]
   265                    $branch = $matches["branch"]
   266                    $path = "https://github.com/$org/azure-rest-api-specs"
   267                }
   268            }
   269            catch
   270            {
   271                Write-Error "Error parsing swagger info"
   272                Write-Error $_
   273            }
   274        } else {
   275            $paths = $readmefile.split("/");
   276            $len = $paths.count
   277            if ($len -gt 2) {
   278                $specName = $paths[$len - 3]
   279                $path = ($paths[0..($len - 4)]) -join "/"
   280            }
   281        }
   282        
   283        $swaggerInfo = [PSCustomObject]@{
   284            isRepoUrl = $isRepoUrl
   285            path = $path
   286            specName = $specName
   287            org = $org
   288            branch = $branch
   289            commitID = $commitID
   290        }
   291    }
   292
   293    return $swaggerInfo
   294}
   295
   296function TestAndGenerateReport($dir)
   297{
   298    Set-Location $dir
   299    # dependencies for go coverage report generation
   300    go install github.com/jstemmer/go-junit-report@v0.9.1
   301    go install github.com/axw/gocov/gocov@v1.1.0
   302    go install github.com/AlekSi/gocov-xml@v1.0.0
   303    go install github.com/matm/gocov-html@v0.0.0-20200509184451-71874e2e203b
   304
   305    # set azidentity env for mock test
   306    $Env:AZURE_TENANT_ID = "mock-test"
   307    $Env:AZURE_CLIENT_ID = "mock-test"
   308    $Env:AZURE_USERNAME = "mock-test"
   309    $Env:AZURE_PASSWORD = "mock-test"
   310
   311    # do test with corage report and convert to cobertura format
   312    Write-Host "go cmd: go test -v -coverprofile coverage.txt | Tee-Object -FilePath outfile.txt"
   313    go test -v -coverprofile coverage.txt -run TestMockTest | Tee-Object -FilePath outfile.txt
   314    Write-Host "report.xml: Get-Content outfile.txt | go-junit-report > report.xml"
   315    Get-Content outfile.txt | go-junit-report > report.xml
   316    Write-Host "coverage.json: gocov convert ./coverage.txt > ./coverage.json"
   317    gocov convert ./coverage.txt > ./coverage.json
   318    Write-Host "coverage.xml: Get-Content ./coverage.json | gocov-xml > ./coverage.xml"
   319    Get-Content ./coverage.json | gocov-xml > ./coverage.xml
   320    Write-Host "coverage.html: Get-Content ./coverage.json | gocov-html > ./coverage.html"
   321    Get-Content ./coverage.json | gocov-html > ./coverage.html
   322}
   323
   324function JudgeExitCode($errorMsg = "execution error")
   325{
   326    if (!$?)
   327    {
   328        Write-Host "##[error] $errorMsg"
   329        exit $LASTEXITCODE
   330    }
   331}
   332
   333function ExecuteSingleTest($sdk, $needRunMockServer=$true)
   334{
   335    Write-Host "Start mock server"
   336    if ($needRunMockServer -eq $true) {
   337        StartMockServer -rpSDKFolder $sdk.DirectoryPath
   338    }
   339    Write-Host "Execute mock test for $($sdk.Name)"
   340    TestAndGenerateReport $sdk.DirectoryPath
   341    Write-Host "Stop mock server"
   342    if ($needRunMockServer -eq $true) {
   343        StopMockServer
   344    }
   345}

View as plain text