github.com/SAP/jenkins-library@v1.362.0/cmd/abapAddonAssemblyKitReserveNextPackages_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package cmd 5 6 import ( 7 "encoding/json" 8 "testing" 9 "time" 10 11 "github.com/SAP/jenkins-library/pkg/abap/aakaas" 12 abapbuild "github.com/SAP/jenkins-library/pkg/abap/build" 13 "github.com/SAP/jenkins-library/pkg/abaputils" 14 "github.com/pkg/errors" 15 "github.com/stretchr/testify/assert" 16 ) 17 18 func arrangeConfig(addonDescriptor abaputils.AddonDescriptor) abapAddonAssemblyKitReserveNextPackagesOptions { 19 var config abapAddonAssemblyKitReserveNextPackagesOptions 20 config.Username = "dummy" 21 config.Password = "dummy" 22 adoDesc, _ := json.Marshal(addonDescriptor) 23 config.AddonDescriptor = string(adoDesc) 24 return config 25 } 26 27 func TestReserveNextPackagesStep(t *testing.T) { 28 var cpe abapAddonAssemblyKitReserveNextPackagesCommonPipelineEnvironment 29 bundle := aakaas.NewAakBundleMock() 30 utils := bundle.GetUtils() 31 t.Run("step success tag", func(t *testing.T) { 32 config := arrangeConfig(abaputils.AddonDescriptor{ 33 Repositories: []abaputils.Repository{ 34 { 35 Name: "/DRNMSPC/COMP01", 36 VersionYAML: "1.0.0.", 37 Tag: "myTestTagv1.0", 38 }, 39 { 40 Name: "/DRNMSPC/COMP02", 41 VersionYAML: "1.0.0.", 42 Tag: "myTestTagv1.0", 43 }, 44 }, 45 }) 46 bodyList := []string{responseReserveNextPackageReleased, responseReserveNextPackagePlanned, responseReserveNextPackagePostReleased, "myToken", responseReserveNextPackagePostPlanned, "myToken"} 47 bundle.SetBodyList(bodyList) 48 err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, &utils, &cpe) 49 assert.NoError(t, err, "Did not expect error") 50 var addonDescriptorFinal abaputils.AddonDescriptor 51 err = json.Unmarshal([]byte(cpe.abap.addonDescriptor), &addonDescriptorFinal) 52 assert.NoError(t, err) 53 assert.Equal(t, "P", addonDescriptorFinal.Repositories[0].Status) 54 assert.Equal(t, "R", addonDescriptorFinal.Repositories[1].Status) 55 }) 56 57 t.Run("step success", func(t *testing.T) { 58 config := arrangeConfig(abaputils.AddonDescriptor{ 59 Repositories: []abaputils.Repository{ 60 { 61 Name: "/DRNMSPC/COMP01", 62 VersionYAML: "1.0.0.", 63 CommitID: "hugo", 64 }, 65 { 66 Name: "/DRNMSPC/COMP02", 67 VersionYAML: "1.0.0.", 68 CommitID: "something40charslongxxxxxxxxxxxxxxxxxxxx", 69 }, 70 }, 71 }) 72 bodyList := []string{responseReserveNextPackageReleased, responseReserveNextPackagePlanned, responseReserveNextPackagePostReleased, "myToken", responseReserveNextPackagePostPlanned, "myToken"} 73 bundle.SetBodyList(bodyList) 74 err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, &utils, &cpe) 75 assert.NoError(t, err, "Did not expect error") 76 var addonDescriptorFinal abaputils.AddonDescriptor 77 err = json.Unmarshal([]byte(cpe.abap.addonDescriptor), &addonDescriptorFinal) 78 assert.NoError(t, err) 79 assert.Equal(t, "P", addonDescriptorFinal.Repositories[0].Status) 80 assert.Equal(t, "R", addonDescriptorFinal.Repositories[1].Status) 81 }) 82 t.Run("step error - invalid input", func(t *testing.T) { 83 config := arrangeConfig(abaputils.AddonDescriptor{ 84 Repositories: []abaputils.Repository{ 85 { 86 Name: "/DRNMSPC/COMP01", 87 }, 88 }, 89 }) 90 err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, &utils, &cpe) 91 assert.Error(t, err, "Did expect error") 92 }) 93 t.Run("step error - timeout", func(t *testing.T) { 94 config := arrangeConfig(abaputils.AddonDescriptor{ 95 Repositories: []abaputils.Repository{ 96 { 97 Name: "/DRNMSPC/COMP01", 98 VersionYAML: "1.0.0.", 99 }, 100 }, 101 }) 102 bodyList := []string{responseReserveNextPackageCreationTriggered, responseReserveNextPackagePostPlanned, "myToken"} 103 bundle.SetBodyList(bodyList) 104 bundle.SetMaxRuntime(time.Duration(1 * time.Microsecond)) 105 err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, &utils, &cpe) 106 assert.Error(t, err, "Did expect error") 107 }) 108 } 109 110 // ********************* Test init ******************* 111 func TestInitPackage(t *testing.T) { 112 t.Run("test init", func(t *testing.T) { 113 conn := new(abapbuild.Connector) 114 conn.Client = &abaputils.ClientMock{} 115 repo := abaputils.Repository{ 116 Name: "/DRNMSPC/COMP01", 117 VersionYAML: "1.0.0", 118 } 119 var p aakaas.Package 120 p.InitPackage(repo, *conn) 121 assert.Equal(t, "/DRNMSPC/COMP01", p.ComponentName) 122 assert.Equal(t, "1.0.0", p.VersionYAML) 123 }) 124 } 125 126 // ********************* Test copyFieldsToRepositories ******************* 127 func TestCopyFieldsToRepositoriesPackage(t *testing.T) { 128 pckgWR := []aakaas.PackageWithRepository{ 129 { 130 Package: aakaas.Package{ 131 ComponentName: "/DRNMSPC/COMP01", 132 VersionYAML: "1.0.0", 133 PackageName: "SAPK-001AAINDRNMSPC", 134 Type: "AOI", 135 Namespace: "/DRNMSPC/", 136 }, 137 Repo: abaputils.Repository{ 138 Name: "/DRNMSPC/COMP01", 139 VersionYAML: "1.0.0", 140 }, 141 }, 142 } 143 144 t.Run("test copyFieldsToRepositories Planned success w/o predecessorcommitID", func(t *testing.T) { 145 pckgWR[0].Package.Status = aakaas.PackageStatusPlanned 146 pckgWR[0].Package.PredecessorCommitID = "" 147 pckgWR[0].Repo.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx" 148 pckgWR[0].Package.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx" 149 repos, err := checkAndCopyFieldsToRepositories(pckgWR) 150 assert.Equal(t, "SAPK-001AAINDRNMSPC", repos[0].PackageName) 151 assert.Equal(t, "AOI", repos[0].PackageType) 152 assert.Equal(t, string(aakaas.PackageStatusPlanned), repos[0].Status) 153 assert.Equal(t, "/DRNMSPC/", repos[0].Namespace) 154 assert.NoError(t, err) 155 }) 156 157 t.Run("test copyFieldsToRepositories Planned success with predecessorcommitID", func(t *testing.T) { 158 pckgWR[0].Package.Status = aakaas.PackageStatusPlanned 159 pckgWR[0].Package.PredecessorCommitID = "something40charslongPREDECESSORyyyyyyyyy" 160 pckgWR[0].Repo.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx" 161 pckgWR[0].Package.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx" 162 _, err := checkAndCopyFieldsToRepositories(pckgWR) 163 assert.NoError(t, err) 164 }) 165 166 t.Run("test copyFieldsToRepositories Planned success with predecessorcommitI short AAKaaS", func(t *testing.T) { 167 pckgWR[0].Package.Status = aakaas.PackageStatusPlanned 168 pckgWR[0].Package.PredecessorCommitID = "predecessor" 169 pckgWR[0].Repo.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx" 170 pckgWR[0].Package.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx" 171 _, err := checkAndCopyFieldsToRepositories(pckgWR) 172 assert.NoError(t, err) 173 }) 174 175 t.Run("test copyFieldsToRepositories Planned success with predecessorcommitID short addon.yml", func(t *testing.T) { 176 pckgWR[0].Package.Status = aakaas.PackageStatusPlanned 177 pckgWR[0].Package.PredecessorCommitID = "predecessor" 178 pckgWR[0].Repo.CommitID = "successor" 179 pckgWR[0].Package.CommitID = "successorANDsomemore" 180 _, err := checkAndCopyFieldsToRepositories(pckgWR) 181 assert.NoError(t, err) 182 }) 183 184 t.Run("test copyFieldsToRepositories Planned error with predecessorcommitID same as commitID", func(t *testing.T) { 185 pckgWR[0].Package.Status = aakaas.PackageStatusPlanned 186 pckgWR[0].Repo.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx" 187 pckgWR[0].Package.PredecessorCommitID = pckgWR[0].Repo.CommitID 188 pckgWR[0].Package.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx" 189 _, err := checkAndCopyFieldsToRepositories(pckgWR) 190 assert.Error(t, err) 191 }) 192 193 t.Run("test copyFieldsToRepositories Released success", func(t *testing.T) { 194 pckgWR[0].Package.Status = aakaas.PackageStatusReleased 195 pckgWR[0].Package.PredecessorCommitID = "" //released packages do not have this attribute 196 pckgWR[0].Repo.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx" 197 pckgWR[0].Package.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx" 198 _, err := checkAndCopyFieldsToRepositories(pckgWR) 199 assert.NoError(t, err) 200 }) 201 202 t.Run("test copyFieldsToRepositories Released error, different commitIDs", func(t *testing.T) { 203 pckgWR[0].Package.Status = aakaas.PackageStatusReleased 204 pckgWR[0].Package.PredecessorCommitID = "" //released packages do not have this attribute 205 pckgWR[0].Repo.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx" 206 pckgWR[0].Package.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxO" 207 _, err := checkAndCopyFieldsToRepositories(pckgWR) 208 assert.Error(t, err) 209 }) 210 } 211 212 // ********************* Test reserveNext ******************* 213 func TestReserveNextPackage(t *testing.T) { 214 t.Run("test reserveNext - success", func(t *testing.T) { 215 client := abaputils.ClientMock{ 216 Body: responseReserveNextPackagePostPlanned, 217 } 218 p := testPackageSetup("/DRNMSPC/COMP01", "1.0.0", client) 219 220 err := p.ReserveNext() 221 assert.NoError(t, err) 222 assert.Equal(t, "SAPK-001AAINDRNMSPC", p.PackageName) 223 assert.Equal(t, "AOI", p.Type) 224 assert.Equal(t, aakaas.PackageStatusPlanned, p.Status) 225 }) 226 t.Run("test reserveNext - missing versionYAML", func(t *testing.T) { 227 client := abaputils.ClientMock{} 228 p := testPackageSetup("/DRNMSPC/COMP01", "", client) 229 err := p.ReserveNext() 230 assert.Error(t, err) 231 assert.Equal(t, "", p.PackageName) 232 assert.Equal(t, "", p.Type) 233 assert.Equal(t, aakaas.PackageStatus(""), p.Status) 234 }) 235 t.Run("test reserveNext - error from call", func(t *testing.T) { 236 client := abaputils.ClientMock{ 237 Body: "ErrorBody", 238 Error: errors.New("Failure during reserve next"), 239 } 240 p := testPackageSetup("/DRNMSPC/COMP01", "1.0.0", client) 241 err := p.ReserveNext() 242 assert.Error(t, err) 243 assert.Equal(t, "", p.PackageName) 244 assert.Equal(t, "", p.Type) 245 assert.Equal(t, aakaas.PackageStatus(""), p.Status) 246 }) 247 } 248 249 // ********************* Test reservePackages ******************* 250 251 func TestReservePackages(t *testing.T) { 252 t.Run("test reservePackages - success", func(t *testing.T) { 253 client := abaputils.ClientMock{ 254 Body: responseReserveNextPackagePostPlanned, 255 } 256 repositories, conn := testRepositoriesSetup("/DRNMSPC/COMP01", "1.0.0", client) 257 repos, err := reservePackages(repositories, conn) 258 assert.NoError(t, err) 259 assert.Equal(t, "/DRNMSPC/COMP01", repos[0].Package.ComponentName) 260 assert.Equal(t, "1.0.0", repos[0].Package.VersionYAML) 261 assert.Equal(t, aakaas.PackageStatusPlanned, repos[0].Package.Status) 262 }) 263 t.Run("test reservePackages - error from call", func(t *testing.T) { 264 client := abaputils.ClientMock{ 265 Body: "ErrorBody", 266 Error: errors.New("Failure during reserve next"), 267 } 268 repositories, conn := testRepositoriesSetup("/DRNMSPC/COMP01", "1.0.0", client) 269 _, err := reservePackages(repositories, conn) 270 assert.Error(t, err) 271 }) 272 } 273 274 // ********************* Test pollReserveNextPackages ******************* 275 276 func TestPollReserveNextPackages(t *testing.T) { 277 bundle := aakaas.NewAakBundleMock() 278 utils := bundle.GetUtils() 279 t.Run("test pollReserveNextPackages - testing loop", func(t *testing.T) { 280 bodyList := []string{responseReserveNextPackagePlanned, responseReserveNextPackageCreationTriggered} 281 bundle.SetBodyList(bodyList) 282 pckgWR := testPollPackagesSetup(&utils) 283 err := pollReserveNextPackages(pckgWR, &utils) 284 assert.NoError(t, err) 285 assert.Equal(t, aakaas.PackageStatusPlanned, pckgWR[0].Package.Status) 286 assert.Equal(t, "/DRNMSPC/", pckgWR[0].Package.Namespace) 287 }) 288 t.Run("test pollReserveNextPackages - status locked", func(t *testing.T) { 289 bundle.SetBody(responseReserveNextPackageLocked) 290 pckgWR := testPollPackagesSetup(&utils) 291 err := pollReserveNextPackages(pckgWR, &utils) 292 assert.Error(t, err) 293 assert.Equal(t, aakaas.PackageStatusLocked, pckgWR[0].Package.Status) 294 }) 295 t.Run("test pollReserveNextPackages - status released", func(t *testing.T) { 296 bundle.SetBody(responseReserveNextPackageReleased) 297 pckgWR := testPollPackagesSetup(&utils) 298 err := pollReserveNextPackages(pckgWR, &utils) 299 assert.NoError(t, err) 300 assert.Equal(t, aakaas.PackageStatusReleased, pckgWR[0].Package.Status) 301 }) 302 t.Run("test pollReserveNextPackages - unknow status", func(t *testing.T) { 303 bundle.SetBody(responseReserveNextPackageUnknownState) 304 pckgWR := testPollPackagesSetup(&utils) 305 err := pollReserveNextPackages(pckgWR, &utils) 306 assert.Error(t, err) 307 assert.Equal(t, aakaas.PackageStatus("X"), pckgWR[0].Package.Status) 308 }) 309 t.Run("test pollReserveNextPackages - timeout", func(t *testing.T) { 310 bundle.SetBody(responseReserveNextPackageUnknownState) 311 bundle.SetError("Failure during reserve next") 312 bundle.SetMaxRuntime(time.Duration(1 * time.Microsecond)) 313 pckgWR := testPollPackagesSetup(&utils) 314 err := pollReserveNextPackages(pckgWR, &utils) 315 assert.Error(t, err) 316 }) 317 } 318 319 // ********************* Setup functions ******************* 320 321 func testPollPackagesSetup(utils *aakaas.AakUtils) []aakaas.PackageWithRepository { 322 conn := new(abapbuild.Connector) 323 conn.Client = *utils 324 conn.Header = make(map[string][]string) 325 pckgWR := []aakaas.PackageWithRepository{ 326 { 327 Package: aakaas.Package{ 328 Connector: *conn, 329 ComponentName: "/DRNMSPC/COMP01", 330 VersionYAML: "1.0.0", 331 PackageName: "SAPK-001AAINDRNMSPC", 332 Type: "AOI", 333 }, 334 Repo: abaputils.Repository{}, 335 }, 336 } 337 return pckgWR 338 } 339 340 func testRepositoriesSetup(componentName string, versionYAML string, client abaputils.ClientMock) ([]abaputils.Repository, abapbuild.Connector) { 341 conn := new(abapbuild.Connector) 342 conn.Client = &client 343 conn.Header = make(map[string][]string) 344 repositories := []abaputils.Repository{ 345 { 346 Name: componentName, 347 VersionYAML: versionYAML, 348 }, 349 } 350 return repositories, *conn 351 } 352 353 func testPackageSetup(componentName string, versionYAML string, client abaputils.ClientMock) aakaas.Package { 354 conn := new(abapbuild.Connector) 355 conn.Client = &client 356 conn.Header = make(map[string][]string) 357 p := aakaas.Package{ 358 Connector: *conn, 359 ComponentName: componentName, 360 VersionYAML: versionYAML, 361 } 362 return p 363 } 364 365 // ********************* Testdata ******************* 366 367 var responseReserveNextPackagePostPlanned = `{ 368 "d": { 369 "DeterminePackageForScv": { 370 "__metadata": { 371 "type": "SSDA.AAS_ODATA_PACKAGE_SRV.PackageExtended" 372 }, 373 "Name": "SAPK-001AAINDRNMSPC", 374 "Type": "AOI", 375 "ScName": "/DRNMSPC/COMP01", 376 "ScVersion": "0001", 377 "SpLevel": "0000", 378 "PatchLevel": "0000", 379 "Predecessor": "", 380 "PredecessorCommitId": "", 381 "Status": "P" 382 } 383 } 384 }` 385 386 var responseReserveNextPackagePostReleased = `{ 387 "d": { 388 "DeterminePackageForScv": { 389 "__metadata": { 390 "type": "SSDA.AAS_ODATA_PACKAGE_SRV.PackageExtended" 391 }, 392 "Name": "SAPK-001AAINDRNMSPC", 393 "Type": "AOI", 394 "ScName": "/DRNMSPC/COMP02", 395 "ScVersion": "0001", 396 "SpLevel": "0000", 397 "PatchLevel": "0000", 398 "Predecessor": "", 399 "PredecessorCommitId": "", 400 "CommitId": "something40charslongxxxxxxxxxxxxxxxxxxxx", 401 "Status": "R" 402 } 403 } 404 }` 405 406 var responseReserveNextPackageCreationTriggered = `{ 407 "d": { 408 "__metadata": { 409 "id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')", 410 "uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')", 411 "type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage" 412 }, 413 "Name": "SAPK-001AAINDRNMSPC", 414 "Type": "AOI", 415 "Component": "/DRNMSPC/COMP01", 416 "Release": "0001", 417 "Level": "0000", 418 "Status": "C", 419 "Operation": "", 420 "Namespace": "/DRNMSPC/", 421 "Vendorid": "0000203069" 422 } 423 }` 424 425 var responseReserveNextPackageLocked = `{ 426 "d": { 427 "__metadata": { 428 "id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')", 429 "uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')", 430 "type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage" 431 }, 432 "Name": "SAPK-001AAINDRNMSPC", 433 "Type": "AOI", 434 "Component": "/DRNMSPC/COMP01", 435 "Release": "0001", 436 "Level": "0000", 437 "Status": "L", 438 "Operation": "", 439 "Namespace": "/DRNMSPC/", 440 "Vendorid": "0000203069" 441 } 442 }` 443 444 var responseReserveNextPackagePlanned = `{ 445 "d": { 446 "__metadata": { 447 "id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')", 448 "uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')", 449 "type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage" 450 }, 451 "Name": "SAPK-001AAINDRNMSPC", 452 "Type": "AOI", 453 "Component": "/DRNMSPC/COMP01", 454 "Release": "0001", 455 "Level": "0000", 456 "Status": "P", 457 "Operation": "", 458 "Namespace": "/DRNMSPC/", 459 "Vendorid": "0000203069" 460 } 461 }` 462 463 var responseReserveNextPackageReleased = `{ 464 "d": { 465 "__metadata": { 466 "id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')", 467 "uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')", 468 "type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage" 469 }, 470 "Name": "SAPK-001AAINDRNMSPC", 471 "Type": "AOI", 472 "Component": "/DRNMSPC/COMP01", 473 "Release": "0001", 474 "Level": "0000", 475 "Status": "R", 476 "Operation": "", 477 "Namespace": "/DRNMSPC/", 478 "Vendorid": "0000203069" 479 } 480 }` 481 482 var responseReserveNextPackageUnknownState = `{ 483 "d": { 484 "__metadata": { 485 "id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')", 486 "uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')", 487 "type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage" 488 }, 489 "Name": "SAPK-001AAINDRNMSPC", 490 "Type": "AOI", 491 "Component": "/DRNMSPC/COMP01", 492 "Release": "0001", 493 "Level": "0000", 494 "Status": "X", 495 "Operation": "", 496 "Namespace": "/DRNMSPC/", 497 "Vendorid": "0000203069" 498 } 499 }`