...
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