github.com/xgoffin/jenkins-library@v1.154.0/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  }`