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