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