github.com/xgoffin/jenkins-library@v1.154.0/cmd/abapEnvironmentBuild_test.go (about)

     1  package cmd
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  	"time"
     7  
     8  	abapbuild "github.com/SAP/jenkins-library/pkg/abap/build"
     9  	"github.com/SAP/jenkins-library/pkg/abaputils"
    10  	"github.com/SAP/jenkins-library/pkg/mock"
    11  	"github.com/SAP/jenkins-library/pkg/piperutils"
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  type abapEnvironmentBuildMockUtils struct {
    16  	*mock.ExecMockRunner
    17  	*abapbuild.MockClient
    18  }
    19  
    20  func newAbapEnvironmentBuildTestsUtils() abapEnvironmentBuildUtils {
    21  	mC := abapbuild.GetBuildMockClientToRun2Times()
    22  	utils := abapEnvironmentBuildMockUtils{
    23  		ExecMockRunner: &mock.ExecMockRunner{},
    24  		MockClient:     &mC,
    25  	}
    26  	return &utils
    27  }
    28  
    29  func (mB abapEnvironmentBuildMockUtils) PersistReportsAndLinks(stepName, workspace string, reports, links []piperutils.Path) {
    30  }
    31  func (mB abapEnvironmentBuildMockUtils) GetAbapCommunicationArrangementInfo(options abaputils.AbapEnvironmentOptions, oDataURL string) (abaputils.ConnectionDetailsHTTP, error) {
    32  	var cd abaputils.ConnectionDetailsHTTP
    33  	cd.URL = "/sap/opu/odata/BUILD/CORE_SRV"
    34  	return cd, nil
    35  }
    36  
    37  func (mB abapEnvironmentBuildMockUtils) publish() {
    38  }
    39  
    40  func (mB abapEnvironmentBuildMockUtils) GetPollIntervall() time.Duration {
    41  	return 1 * time.Microsecond
    42  }
    43  
    44  func (mB abapEnvironmentBuildMockUtils) getMaxRuntime() time.Duration {
    45  	return 1 * time.Second
    46  }
    47  func (mB abapEnvironmentBuildMockUtils) getPollingInterval() time.Duration {
    48  	return 1 * time.Microsecond
    49  }
    50  
    51  func TestRunAbapEnvironmentBuild(t *testing.T) {
    52  	t.Parallel()
    53  	t.Run("happy path", func(t *testing.T) {
    54  		t.Parallel()
    55  		// init
    56  		cpe := abapEnvironmentBuildCommonPipelineEnvironment{}
    57  		config := abapEnvironmentBuildOptions{}
    58  		config.AddonDescriptor = addonDescriptor
    59  		config.Values = `[{"value_id":"PACKAGES","value":"/BUILD/AUNIT_DUMMY_TESTS"},{"value_id":"MyId1","value":"Value1"}]`
    60  		config.DownloadAllResultFiles = true
    61  		config.PublishAllDownloadedResultFiles = true
    62  		utils := newAbapEnvironmentBuildTestsUtils()
    63  		// test
    64  		err := runAbapEnvironmentBuild(&config, nil, &utils, &cpe)
    65  		// assert
    66  		finalValues := `[{"value_id":"PHASE","value":"AUNIT"},{"value_id":"PACKAGES","value":"/BUILD/AUNIT_DUMMY_TESTS"},{"value_id":"MyId1","value":"AunitValue1"},{"value_id":"MyId2","value":"AunitValue2"},{"value_id":"BUILD_FRAMEWORK_MODE","value":"P"}]`
    67  		assert.NoError(t, err)
    68  		assert.Equal(t, finalValues, cpe.abap.buildValues)
    69  	})
    70  
    71  	t.Run("happy path, download only one", func(t *testing.T) {
    72  		t.Parallel()
    73  		// init
    74  		cpe := abapEnvironmentBuildCommonPipelineEnvironment{}
    75  		config := abapEnvironmentBuildOptions{}
    76  		config.AddonDescriptor = addonDescriptor
    77  		config.Values = `[{"value_id":"PACKAGES","value":"/BUILD/AUNIT_DUMMY_TESTS"},{"value_id":"MyId1","value":"Value1"}]`
    78  		config.DownloadResultFilenames = []string{"SAR_XML"}
    79  		config.PublishResultFilenames = []string{"SAR_XML"}
    80  		utils := newAbapEnvironmentBuildTestsUtils()
    81  		// test
    82  		err := runAbapEnvironmentBuild(&config, nil, &utils, &cpe)
    83  		// assert
    84  		assert.NoError(t, err)
    85  	})
    86  
    87  	t.Run("happy path, use AddonDescriptor", func(t *testing.T) {
    88  		t.Parallel()
    89  		// init
    90  		expectedValueList := []abapbuild.Value{}
    91  		recordedValueList := []abapbuild.Value{}
    92  		cpe := abapEnvironmentBuildCommonPipelineEnvironment{}
    93  		config := abapEnvironmentBuildOptions{}
    94  		config.AddonDescriptor = addonDescriptor
    95  		config.Values = `[{"value_id":"PACKAGES","value":"/BUILD/AUNIT_DUMMY_TESTS"}]`
    96  		//config.ConditionOnAddonDescriptor = `[{"field":"PackageType","operator":"!=","value":"AOI"}]`
    97  		//The mock client returns MyId1 & and MyId2 therefore we rename it to these values so that we can remove it from the output
    98  		config.UseFieldsOfAddonDescriptor = `[{"use":"Name","renameTo":"MyId1"},{"use":"Status","renameTo":"MyId2"}]`
    99  		utils := newAbapEnvironmentBuildTestsUtils()
   100  		// test
   101  		err := runAbapEnvironmentBuild(&config, nil, &utils, &cpe)
   102  		// assert
   103  		finalValues := `[{"value_id":"PACKAGES","value":"/BUILD/AUNIT_DUMMY_TESTS"},{"value_id":"BUILD_FRAMEWORK_MODE","value":"P"}]`
   104  		json.Unmarshal([]byte(finalValues), expectedValueList)
   105  		json.Unmarshal([]byte(cpe.abap.buildValues), recordedValueList)
   106  		assert.NoError(t, err)
   107  		assert.ElementsMatch(t, expectedValueList, recordedValueList)
   108  	})
   109  
   110  	t.Run("error path, try to publish file, which was not downloaded", func(t *testing.T) {
   111  		t.Parallel()
   112  		// init
   113  		cpe := abapEnvironmentBuildCommonPipelineEnvironment{}
   114  		config := abapEnvironmentBuildOptions{}
   115  		config.AddonDescriptor = addonDescriptor
   116  		config.Values = `[{"value_id":"PACKAGES","value":"/BUILD/AUNIT_DUMMY_TESTS"},{"value_id":"MyId1","value":"Value1"}]`
   117  		config.DownloadResultFilenames = []string{"DELIVERY_LOGS.ZIP"}
   118  		config.PublishResultFilenames = []string{"SAR_XML"}
   119  		utils := newAbapEnvironmentBuildTestsUtils()
   120  		// test
   121  		err := runAbapEnvironmentBuild(&config, nil, &utils, &cpe)
   122  		// assert
   123  		assert.Error(t, err)
   124  	})
   125  
   126  	t.Run("error path, try to download file which does not exist", func(t *testing.T) {
   127  		t.Parallel()
   128  		// init
   129  		cpe := abapEnvironmentBuildCommonPipelineEnvironment{}
   130  		config := abapEnvironmentBuildOptions{}
   131  		config.AddonDescriptor = addonDescriptor
   132  		config.Values = `[{"value_id":"PACKAGES","value":"/BUILD/AUNIT_DUMMY_TESTS"},{"value_id":"MyId1","value":"Value1"}]`
   133  		config.DownloadResultFilenames = []string{"DOES_NOT_EXIST"}
   134  		config.PublishAllDownloadedResultFiles = true
   135  		utils := newAbapEnvironmentBuildTestsUtils()
   136  		// test
   137  		err := runAbapEnvironmentBuild(&config, nil, &utils, &cpe)
   138  		// assert
   139  		assert.Error(t, err)
   140  	})
   141  }
   142  
   143  func TestGenerateValues(t *testing.T) {
   144  	t.Run("happy path", func(t *testing.T) {
   145  		// init
   146  		config := abapEnvironmentBuildOptions{}
   147  		config.Values = `[{"value_id":"PACKAGES","value":"/BUILD/AUNIT_DUMMY_TESTS"},{"value_id":"MyId1","value":"Value1"}]`
   148  		config.CpeValues = `[{"value_id":"PHASE","value":"AUNIT"},{"value_id":"PACKAGES","value":"CPE_PACKAGE"},{"value_id":"MyId2","value":"Value2"}]`
   149  		// test
   150  		values, err := generateValuesOnlyFromConfig(&config)
   151  		// assert
   152  		assert.NoError(t, err)
   153  		assert.Equal(t, 3, len(values))
   154  
   155  		//values generated by map -> therefore we can not just iterate over the generated values and check them, as they are in random order
   156  		checkMap := map[string]string{
   157  			"PACKAGES": "/BUILD/AUNIT_DUMMY_TESTS",
   158  			"MyId1":    "Value1",
   159  			"MyId2":    "Value2",
   160  		}
   161  		for _, value := range values {
   162  			checkValue, present := checkMap[value.ValueID]
   163  			assert.True(t, present)
   164  			assert.Equal(t, checkValue, value.Value)
   165  		}
   166  	})
   167  	t.Run("happy path, use addonDescriptor", func(t *testing.T) {
   168  		// init
   169  		config := abapEnvironmentBuildOptions{}
   170  		config.Values = `[{"value_id":"PACKAGES","value":"/BUILD/AUNIT_DUMMY_TESTS"},{"value_id":"MyId1","value":"Value1"}]`
   171  		config.CpeValues = `[{"value_id":"PHASE","value":"AUNIT"},{"value_id":"PACKAGES","value":"CPE_PACKAGE"},{"value_id": "Status","value":"R"},{"value_id":"MyId2","value":"Value2"}]`
   172  		config.AddonDescriptor = addonDescriptor
   173  		config.UseFieldsOfAddonDescriptor = `[{"use":"Name","renameTo":"SWC"},{"use":"Status","renameTo":"Status"}]`
   174  		// test
   175  		valuesAddonDescriptor, err := evaluateAddonDescriptor(&config)
   176  		values0, err := generateValuesWithAddonDescriptor(&config, valuesAddonDescriptor[0])
   177  		// assert
   178  		assert.NoError(t, err)
   179  		assert.Equal(t, 5, len(values0))
   180  		//values generated by map -> therefore we can not just iterate over the generated values and check them, as they are in random order
   181  		checkMap := map[string]string{
   182  			"PACKAGES": "/BUILD/AUNIT_DUMMY_TESTS",
   183  			"MyId1":    "Value1",
   184  			"MyId2":    "Value2",
   185  			"SWC":      "/ITAPC1/I_CURRENCY",
   186  			"Status":   "P",
   187  		}
   188  		for _, value := range values0 {
   189  			checkValue, present := checkMap[value.ValueID]
   190  			assert.True(t, present)
   191  			assert.Equal(t, checkValue, value.Value)
   192  		}
   193  	})
   194  	t.Run("error path, use addonDescriptor already in config", func(t *testing.T) {
   195  		// init
   196  		config := abapEnvironmentBuildOptions{}
   197  		config.Values = `[{"value_id":"PACKAGES","value":"/BUILD/AUNIT_DUMMY_TESTS"},{"value_id":"MyId1","value":"Value1"},{"value_id":"Branch","value":"configBranch"}]`
   198  		config.CpeValues = `[{"value_id":"PHASE","value":"AUNIT"},{"value_id":"PACKAGES","value":"CPE_PACKAGE"},{"value_id": "Status","value":"R"},{"value_id":"MyId2","value":"Value2"}]`
   199  		config.AddonDescriptor = addonDescriptor
   200  		config.UseFieldsOfAddonDescriptor = `[{"use":"Name","renameTo":"SWC"},{"use":"Status","renameTo":"Status"},{"use":"Branch","renameTo":"Branch"}]`
   201  		// test
   202  		valuesAddonDescriptor, err := evaluateAddonDescriptor(&config)
   203  		values0, err := generateValuesWithAddonDescriptor(&config, valuesAddonDescriptor[0])
   204  		// assert
   205  		assert.Error(t, err)
   206  		assert.Equal(t, 0, len(values0))
   207  	})
   208  	t.Run("error path - duplicate in config", func(t *testing.T) {
   209  		// init
   210  		config := abapEnvironmentBuildOptions{}
   211  		config.Values = `[{"value_id":"PACKAGES","value":"/BUILD/AUNIT_DUMMY_TESTS"},{"value_id":"MyId1","value":"Value1"},{"value_id":"MyId1","value":"Value1"}]`
   212  		// test
   213  		values, err := generateValuesOnlyFromConfig(&config)
   214  		// assert
   215  		assert.Error(t, err)
   216  		assert.Equal(t, 0, len(values))
   217  	})
   218  	t.Run("error path - bad formating in config.Values", func(t *testing.T) {
   219  		// init
   220  		config := abapEnvironmentBuildOptions{}
   221  		config.Values = `[{"task_id":"PACKAGES","task":"/BUILD/AUNIT_DUMMY_TESTS"},{"value_id":"MyId1","value":"Value1"}]`
   222  		// test
   223  		_, err := generateValuesOnlyFromConfig(&config)
   224  		// assert
   225  		assert.Error(t, err)
   226  	})
   227  }
   228  
   229  func TestEvaluateAddonDescriptor(t *testing.T) {
   230  	//global init
   231  	config := abapEnvironmentBuildOptions{}
   232  	config.AddonDescriptor = addonDescriptor
   233  	t.Run("Find one", func(t *testing.T) {
   234  		// init
   235  		config.ConditionOnAddonDescriptor = `[{"field":"Name","operator":"==","value":"/ITAPC1/I_CURRENCY"},{"field":"Status","operator":"!=","value":"R"}]`
   236  		config.UseFieldsOfAddonDescriptor = `[{"use":"Name","renameTo":"SWC"},{"use":"Status","renameTo":"Status"}]`
   237  		// test
   238  		values, err := evaluateAddonDescriptor(&config)
   239  		// assert
   240  		assert.NoError(t, err)
   241  		assert.Equal(t, 1, len(values))
   242  		assert.Equal(t, 2, len(values[0]))
   243  	})
   244  	t.Run("Find both", func(t *testing.T) {
   245  		// init
   246  		config.ConditionOnAddonDescriptor = `[{"field":"PackageType","operator":"==","value":"AOI"}]`
   247  		config.UseFieldsOfAddonDescriptor = `[{"use":"Name","renameTo":"SWC"},{"use":"Status","renameTo":"Status"}]`
   248  		// test
   249  		values, err := evaluateAddonDescriptor(&config)
   250  		// assert
   251  		assert.NoError(t, err)
   252  		assert.Equal(t, 2, len(values))
   253  		assert.Equal(t, 2, len(values[0]))
   254  		assert.Equal(t, 2, len(values[1]))
   255  	})
   256  	t.Run("Find none", func(t *testing.T) {
   257  		// init
   258  		config.ConditionOnAddonDescriptor = `[{"field":"PackageType","operator":"!=","value":"AOI"}]`
   259  		config.UseFieldsOfAddonDescriptor = `[{"use":"Name","renameTo":"SWC"},{"use":"Status","renameTo":"Status"}]`
   260  		// test
   261  		values, err := evaluateAddonDescriptor(&config)
   262  		// assert
   263  		assert.NoError(t, err)
   264  		assert.Equal(t, 0, len(values))
   265  	})
   266  	t.Run("No condition", func(t *testing.T) {
   267  		// init
   268  		config.ConditionOnAddonDescriptor = ``
   269  		config.UseFieldsOfAddonDescriptor = `[{"use":"Name","renameTo":"SWC"},{"use":"Status","renameTo":"Status"}]`
   270  		// test
   271  		values, err := evaluateAddonDescriptor(&config)
   272  		// assert
   273  		assert.NoError(t, err)
   274  		assert.Equal(t, 2, len(values))
   275  		assert.Equal(t, 2, len(values[0]))
   276  		assert.Equal(t, 2, len(values[1]))
   277  	})
   278  	t.Run("No UseFields", func(t *testing.T) {
   279  		// init
   280  		config.ConditionOnAddonDescriptor = ``
   281  		config.UseFieldsOfAddonDescriptor = ``
   282  		// test
   283  		values, err := evaluateAddonDescriptor(&config)
   284  		// assert
   285  		assert.NoError(t, err)
   286  		assert.Equal(t, 0, len(values))
   287  	})
   288  	t.Run("Wrong fieldname", func(t *testing.T) {
   289  		// init
   290  		config.ConditionOnAddonDescriptor = `[{"fieldxxx":"Name","operator":"==","value":"/ITAPC1/I_CURRENCY"}]`
   291  		config.UseFieldsOfAddonDescriptor = `[{"use":"Name","renameTo":"SWC"},{"use":"Status","renameTo":"Status"}]`
   292  		// test
   293  		values, err := evaluateAddonDescriptor(&config)
   294  		// assert
   295  		assert.Error(t, err)
   296  		assert.Equal(t, 0, len(values))
   297  	})
   298  	t.Run("Wrong value fieldname", func(t *testing.T) {
   299  		// init
   300  		config.ConditionOnAddonDescriptor = `[{"field":"Name","operator":"==","valuexxxx":"/ITAPC1/I_CURRENCY"}]`
   301  		config.UseFieldsOfAddonDescriptor = `[{"use":"Name","renameTo":"SWC"},{"use":"Status","renameTo":"Status"}]`
   302  		// test
   303  		values, err := evaluateAddonDescriptor(&config)
   304  		// assert
   305  		assert.Error(t, err)
   306  		assert.Equal(t, 0, len(values))
   307  	})
   308  	t.Run("Field which does not exist", func(t *testing.T) {
   309  		// init
   310  		config.ConditionOnAddonDescriptor = `[{"field":"DoesNotExist","operator":"==","valuexxxx":"/ITAPC1/I_CURRENCY"}]`
   311  		config.UseFieldsOfAddonDescriptor = `[{"use":"Name","renameTo":"SWC"},{"use":"Status","renameTo":"Status"}]`
   312  		// test
   313  		values, err := evaluateAddonDescriptor(&config)
   314  		// assert
   315  		assert.Error(t, err)
   316  		assert.Equal(t, 0, len(values))
   317  	})
   318  	t.Run("Wrong operator", func(t *testing.T) {
   319  		// init
   320  		config.ConditionOnAddonDescriptor = `[{"field":"Name","operator":"()","value":"/ITAPC1/I_CURRENCY"}]`
   321  		config.UseFieldsOfAddonDescriptor = `[{"use":"Name","renameTo":"SWC"},{"use":"Status","renameTo":"Status"}]`
   322  		// test
   323  		values, err := evaluateAddonDescriptor(&config)
   324  		// assert
   325  		assert.Error(t, err)
   326  		assert.Equal(t, 0, len(values))
   327  	})
   328  	t.Run("Test UseFieldsOfAddonDescriptor: Bad formatting use", func(t *testing.T) {
   329  		// init
   330  		config.ConditionOnAddonDescriptor = ``
   331  		config.UseFieldsOfAddonDescriptor = `[{"usexxx":"Name","renameTo":"SWC"},{"use":"Status","renameTo":"Status"}]`
   332  		// test
   333  		values, err := evaluateAddonDescriptor(&config)
   334  		// assert
   335  		assert.Error(t, err)
   336  		assert.Equal(t, 0, len(values))
   337  	})
   338  	t.Run("Test UseFieldsOfAddonDescriptor: Bad formatting as", func(t *testing.T) {
   339  		// init
   340  		config.ConditionOnAddonDescriptor = ``
   341  		config.UseFieldsOfAddonDescriptor = `[{"use":"Name","renameTo":"SWC"},{"use":"Status","asxxx":"Status"}]`
   342  		// test
   343  		values, err := evaluateAddonDescriptor(&config)
   344  		// assert
   345  		assert.Error(t, err)
   346  		assert.Equal(t, 0, len(values))
   347  	})
   348  	t.Run("Test UseFieldsOfAddonDescriptor: use which does not exist", func(t *testing.T) {
   349  		// init
   350  		config.ConditionOnAddonDescriptor = ``
   351  		config.UseFieldsOfAddonDescriptor = `[{"use":"DoesNotExist","renameTo":"SWC"},{"use":"Status","renameTo":"Status"}]`
   352  		// test
   353  		values, err := evaluateAddonDescriptor(&config)
   354  		// assert
   355  		assert.Error(t, err)
   356  		assert.Equal(t, 0, len(values))
   357  	})
   358  }
   359  
   360  var addonDescriptor = `{
   361  	"addonProduct":"/ITAPC1/I_CURRENCZPRODUCT",
   362  	"addonVersion":"1.0.0",
   363  	"addonVersionAAK":"0001",
   364  	"AddonSpsLevel":"0000",
   365  	"AddonPatchLevel":"0000",
   366  	"TargetVectorID":"",
   367  	"repositories":[
   368  	  {
   369  		"name":"/ITAPC1/I_CURRENCY",
   370  		"tag":"",
   371  		"branch":"v1.0.0",
   372  		"commitID":"1cb96a82",
   373  		"version":"1.0.0",
   374  		"versionAAK":"0001",
   375  		"PackageName":"SAPK-004AAINITAPC1",
   376  		"PackageType":"AOI",
   377  		"SpLevel":"0000",
   378  		"PatchLevel":"0000",
   379  		"PredecessorCommitID":"",
   380  		"Status":"P",
   381  		"Namespace":"/ITAPC1/",
   382  		"SarXMLFilePath":"",
   383  		"languages":null,
   384  		"InBuildScope":false
   385  		},
   386  	  {
   387  		"name":"/ITAPC1/I_FLIGHT",
   388  		"tag":"",
   389  		"branch":"v2.0.0",
   390  		"commitID":"5b87c03",
   391  		"version":"2.0.0",
   392  		"versionAAK":"0001",
   393  		"PackageName":"SAPK-005AAINITAPC2",
   394  		"PackageType":"AOI",
   395  		"SpLevel":"0000",
   396  		"PatchLevel":"0000",
   397  		"PredecessorCommitID":"",
   398  		"Status":"R",
   399  		"Namespace":"/ITAPC1/",
   400  		"SarXMLFilePath":"",
   401  		"languages":null,
   402  		"InBuildScope":false
   403  		}
   404  	  ]
   405  	}`