github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/test/groovy/CfManifestSubstituteVariablesTest.groovy (about)

     1  import org.junit.Before
     2  import org.junit.Rule
     3  import org.junit.Test
     4  import org.junit.rules.ExpectedException
     5  import org.junit.rules.RuleChain
     6  import util.*
     7  
     8  import static org.junit.Assert.*
     9  import static util.JenkinsWriteYamlRule.DATA
    10  import static util.JenkinsWriteYamlRule.SERIALIZED_YAML
    11  
    12  public class CfManifestSubstituteVariablesTest extends BasePiperTest {
    13  
    14      private JenkinsStepRule script = new JenkinsStepRule(this)
    15      private JenkinsReadYamlRule readYamlRule = new JenkinsReadYamlRule(this)
    16      private JenkinsWriteYamlRule writeYamlRule = new JenkinsWriteYamlRule(this)
    17      private JenkinsErrorRule errorRule = new JenkinsErrorRule(this)
    18      private JenkinsEnvironmentRule environmentRule = new JenkinsEnvironmentRule(this)
    19      private JenkinsLoggingRule loggingRule = new JenkinsLoggingRule(this)
    20      private ExpectedException expectedExceptionRule = ExpectedException.none()
    21      private JenkinsFileExistsRule fileExistsRule = new JenkinsFileExistsRule(this, [])
    22  
    23      @Rule
    24      public RuleChain rules = Rules
    25          .getCommonRules(this)
    26          .around(fileExistsRule)
    27          .around(readYamlRule)
    28          .around(writeYamlRule)
    29          .around(errorRule)
    30          .around(environmentRule)
    31          .around(loggingRule)
    32          .around(script)
    33          .around(expectedExceptionRule)
    34  
    35      @Before
    36      public void setup() {
    37          readYamlRule.registerYaml("manifest.yml", new FileInputStream(new File("test/resources/variableSubstitution/manifest.yml")))
    38                      .registerYaml("manifest-variables.yml", new FileInputStream(new File("test/resources/variableSubstitution/manifest-variables.yml")))
    39                      .registerYaml("test/resources/variableSubstitution/manifest.yml", new FileInputStream(new File("test/resources/variableSubstitution/manifest.yml")))
    40                      .registerYaml("test/resources/variableSubstitution/manifest-variables.yml", new FileInputStream(new File("test/resources/variableSubstitution/manifest-variables.yml")))
    41                      .registerYaml("test/resources/variableSubstitution/invalid_manifest.yml", new FileInputStream(new File("test/resources/variableSubstitution/invalid_manifest.yml")))
    42                      .registerYaml("test/resources/variableSubstitution/novars_manifest.yml", new FileInputStream(new File("test/resources/variableSubstitution/novars_manifest.yml")))
    43                      .registerYaml("test/resources/variableSubstitution/multi_manifest.yml", new FileInputStream(new File("test/resources/variableSubstitution/multi_manifest.yml")))
    44                      .registerYaml("test/resources/variableSubstitution/datatypes_manifest.yml", new FileInputStream(new File("test/resources/variableSubstitution/datatypes_manifest.yml")))
    45                      .registerYaml("test/resources/variableSubstitution/datatypes_manifest-variables.yml", new FileInputStream(new File("test/resources/variableSubstitution/datatypes_manifest-variables.yml")))
    46                      .registerYaml("test/resources/variableSubstitution/manifest-variables-conflicting.yml", new FileInputStream(new File("test/resources/variableSubstitution/manifest-variables-conflicting.yml")))
    47      }
    48  
    49      @Test
    50      public void substituteVariables_SkipsExecution_If_ManifestNotPresent() throws Exception {
    51          String manifestFileName = "nonexistent/manifest.yml"
    52          String variablesFileName = "nonexistent/manifest-variables.yml"
    53          List<String> variablesFiles = [ variablesFileName ]
    54  
    55          // check that a proper log is written.
    56          loggingRule.expect("[CFManifestSubstituteVariables] Could not find YAML file at ${manifestFileName}. Skipping variable substitution.")
    57  
    58          // execute step
    59          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, manifestVariablesFiles: variablesFiles, script: nullScript
    60  
    61          //Check that nothing was written
    62          assertNull(writeYamlRule.files[manifestFileName])
    63  
    64          // check that the step was marked as a success (even if it did do nothing).
    65          assertJobStatusSuccess()
    66      }
    67  
    68      @Test
    69      public void substituteVariables_SkipsExecution_If_VariablesFileNotPresent() throws Exception {
    70          String manifestFileName = "test/resources/variableSubstitution/manifest.yml"
    71          String variablesFileName = "nonexistent/manifest-variables.yml"
    72          List<String> variablesFiles = [ variablesFileName ]
    73  
    74          fileExistsRule.registerExistingFile(manifestFileName)
    75  
    76          // check that a proper log is written.
    77          loggingRule.expect("[CFManifestSubstituteVariables] Did not find manifest variable substitution file at ${variablesFileName}.")
    78          expectedExceptionRule.expect(hudson.AbortException)
    79          expectedExceptionRule.expectMessage("[CFManifestSubstituteVariables] Could not find all given manifest variable substitution files. Make sure all files given as manifestVariablesFiles exist.")
    80  
    81          // execute step
    82          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, manifestVariablesFiles: variablesFiles, script: nullScript
    83  
    84          //Check that nothing was written
    85          assertNull(writeYamlRule.files[manifestFileName])
    86  
    87          // check that the step was marked as a success (even if it did do nothing).
    88          assertJobStatusSuccess()
    89      }
    90  
    91      @Test
    92      public void substituteVariables_Throws_If_manifestInvalid() throws Exception {
    93          String manifestFileName = "test/resources/variableSubstitution/invalid_manifest.yml"
    94          String variablesFileName = "test/resources/variableSubstitution/invalid_manifest.yml"
    95          List<String> variablesFiles = [ variablesFileName ]
    96  
    97          fileExistsRule.registerExistingFile(manifestFileName)
    98          fileExistsRule.registerExistingFile(variablesFileName)
    99  
   100          //check that exception is thrown and that it has the correct message.
   101          expectedExceptionRule.expect(org.yaml.snakeyaml.scanner.ScannerException)
   102          expectedExceptionRule.expectMessage("found character '%' that cannot start any token. (Do not use % for indentation)")
   103  
   104          loggingRule.expect("[CFManifestSubstituteVariables] Could not load manifest file at ${manifestFileName}.")
   105  
   106          // execute step
   107          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, manifestVariablesFiles: variablesFiles, script: nullScript
   108  
   109          //Check that nothing was written
   110          assertNull(writeYamlRule.files[manifestFileName])
   111  
   112          // check that the step was marked as a success (even if it did do nothing).
   113          assertJobStatusSuccess()
   114      }
   115  
   116      @Test
   117      public void substituteVariables_Throws_If_manifestVariablesInvalid() throws Exception {
   118          String manifestFileName = "test/resources/variableSubstitution/manifest.yml"
   119          String variablesFileName = "test/resources/variableSubstitution/invalid_manifest.yml"
   120          List<String> variablesFiles = [ variablesFileName ]
   121  
   122          fileExistsRule.registerExistingFile(manifestFileName)
   123          fileExistsRule.registerExistingFile(variablesFileName)
   124  
   125          //check that exception is thrown and that it has the correct message.
   126          expectedExceptionRule.expect(org.yaml.snakeyaml.scanner.ScannerException)
   127          expectedExceptionRule.expectMessage("found character '%' that cannot start any token. (Do not use % for indentation)")
   128  
   129          loggingRule.expect("[CFManifestSubstituteVariables] Could not load manifest variables file at ${variablesFileName}")
   130  
   131          // execute step
   132          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, manifestVariablesFiles: variablesFiles, script: nullScript
   133  
   134          //Check that nothing was written
   135          assertNull(writeYamlRule.files[manifestFileName])
   136  
   137          // check that the step was marked as a success (even if it did do nothing).
   138          assertJobStatusSuccess()
   139      }
   140  
   141      @Test
   142      public void substituteVariables_UsesDefaultFileName_If_NoManifestSpecified() throws Exception {
   143          // In this test, we check that the implementation will resort to the default manifest file name.
   144          // Since the file is not present, the implementation should stop, but the log should indicate that the
   145          // the default file name was used.
   146  
   147          String manifestFileName = "manifest.yml" // default name should be chosen.
   148  
   149          // check that a proper log is written.
   150          loggingRule.expect("[CFManifestSubstituteVariables] Could not find YAML file at ${manifestFileName}. Skipping variable substitution.")
   151  
   152          // execute step
   153          script.step.cfManifestSubstituteVariables script: nullScript
   154  
   155          //Check that nothing was written
   156          assertNull(writeYamlRule.files[manifestFileName])
   157  
   158          // check that the step was marked as a success (even if it did do nothing).
   159          assertJobStatusSuccess()
   160      }
   161  
   162      @Test
   163      public void substituteVariables_UsesDefaultFileName_If_NoVariablesFileSpecified() throws Exception {
   164          // In this test, we check that the implementation will resort to the default manifest _variables_ file name.
   165          // Since the file is not present, the implementation should stop, but the log should indicate that the
   166          // the default file name was used.
   167  
   168          String manifestFileName = "test/resources/variableSubstitution/manifest.yml"
   169          String variablesFileName = "manifest-variables.yml" // default file name that should be chosen.
   170  
   171          fileExistsRule.registerExistingFile(manifestFileName)
   172  
   173          // check that a proper log is written.
   174          loggingRule.expect("[CFManifestSubstituteVariables] Did not find manifest variable substitution file at ${variablesFileName}.")
   175                     .expect("[CFManifestSubstituteVariables] Could not find any default manifest variable substitution file at ${variablesFileName}, and no manifest variables list was specified. Skipping variable substitution.")
   176  
   177          // execute step
   178          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, script: nullScript
   179  
   180          //Check that nothing was written
   181          assertNull(writeYamlRule.files[manifestFileName])
   182  
   183          // check that the step was marked as a success (even if it did do nothing).
   184          assertJobStatusSuccess()
   185      }
   186  
   187      @Test
   188      public void substituteVariables_ReplacesVariablesProperly_InSingleYamlFiles() throws Exception {
   189          String manifestFileName = "test/resources/variableSubstitution/manifest.yml"
   190          String variablesFileName = "test/resources/variableSubstitution/manifest-variables.yml"
   191          List<String> variablesFiles = [ variablesFileName ]
   192  
   193          fileExistsRule.registerExistingFile(manifestFileName)
   194          fileExistsRule.registerExistingFile(variablesFileName)
   195  
   196          // check that a proper log is written.
   197          loggingRule.expect("[CFManifestSubstituteVariables] Loaded manifest at ${manifestFileName}!")
   198                     .expect("[CFManifestSubstituteVariables] Loaded variables file at ${variablesFileName}!")
   199                     .expect("[CFManifestSubstituteVariables] Replaced variables in ${manifestFileName}.")
   200                     .expect("[CFManifestSubstituteVariables] Wrote output file (with variables replaced) at ${manifestFileName}.")
   201  
   202          // execute step
   203          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, manifestVariablesFiles: variablesFiles, script: nullScript
   204  
   205  
   206          String yamlStringAfterReplacement = writeYamlRule.files[manifestFileName].get(SERIALIZED_YAML) as String
   207          Map<String, Object> manifestDataAfterReplacement = writeYamlRule.files[manifestFileName].get(DATA)
   208  
   209          //Check that something was written
   210          assertNotNull(manifestDataAfterReplacement)
   211  
   212          // check that there are no unresolved variables left.
   213          assertAllVariablesReplaced(yamlStringAfterReplacement)
   214  
   215          // check that resolved variables have expected values
   216          assertCorrectVariableResolution(manifestDataAfterReplacement)
   217  
   218          // check that the step was marked as a success (even if it did do nothing).
   219          assertJobStatusSuccess()
   220      }
   221  
   222      private void assertAllVariablesReplaced(String yamlStringAfterReplacement) {
   223          assertFalse(yamlStringAfterReplacement.contains("(("))
   224          assertFalse(yamlStringAfterReplacement.contains("))"))
   225      }
   226  
   227      private void assertCorrectVariableResolution(Map<String, Object> manifestDataAfterReplacement) {
   228          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("name").equals("uniquePrefix-catalog-service-odatav2-0.0.1"))
   229          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("routes").get(0).get("route").equals("uniquePrefix-catalog-service-odatav2-001.cfapps.eu10.hana.ondemand.com"))
   230          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("services").get(0).equals("uniquePrefix-catalog-service-odatav2-xsuaa"))
   231          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("services").get(1).equals("uniquePrefix-catalog-service-odatav2-hana"))
   232          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("xsuaa-instance-name").equals("uniquePrefix-catalog-service-odatav2-xsuaa"))
   233          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("db_service_instance_name").equals("uniquePrefix-catalog-service-odatav2-hana"))
   234      }
   235  
   236      @Test
   237      public void substituteVariables_ReplacesVariablesProperly_InMultiYamlFiles() throws Exception {
   238          String manifestFileName = "test/resources/variableSubstitution/multi_manifest.yml"
   239          String variablesFileName = "test/resources/variableSubstitution/manifest-variables.yml"
   240          List<String> variablesFiles = [ variablesFileName ]
   241  
   242          fileExistsRule.registerExistingFile(manifestFileName)
   243          fileExistsRule.registerExistingFile(variablesFileName)
   244  
   245          // check that a proper log is written.
   246          loggingRule.expect("[CFManifestSubstituteVariables] Loaded manifest at ${manifestFileName}!")
   247                     .expect("[CFManifestSubstituteVariables] Loaded variables file at ${variablesFileName}!")
   248                     .expect("[CFManifestSubstituteVariables] Replaced variables in ${manifestFileName}.")
   249                     .expect("[CFManifestSubstituteVariables] Wrote output file (with variables replaced) at ${manifestFileName}.")
   250  
   251          // execute step
   252          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, manifestVariablesFiles: variablesFiles, script: nullScript
   253  
   254  
   255          String yamlStringAfterReplacement = writeYamlRule.files[manifestFileName].get(SERIALIZED_YAML) as String
   256          List<Object> manifestDataAfterReplacement = writeYamlRule.files[manifestFileName].get(DATA)
   257  
   258          //Check that something was written
   259          assertNotNull(manifestDataAfterReplacement)
   260  
   261          // check that there are no unresolved variables left.
   262          assertAllVariablesReplaced(yamlStringAfterReplacement)
   263  
   264          //check that result still is a multi-YAML file.
   265          assertEquals("Dumped YAML after replacement should still be a multi-YAML file.",2, manifestDataAfterReplacement.size())
   266  
   267          // check that resolved variables have expected values
   268          manifestDataAfterReplacement.each { yaml ->
   269              assertCorrectVariableResolution(yaml as Map<String, Object>)
   270          }
   271  
   272          // check that the step was marked as a success (even if it did do nothing).
   273          assertJobStatusSuccess()
   274      }
   275  
   276      @Test
   277      public void substituteVariables_ReplacesVariablesFromListProperly_whenNoManifestVariablesFilesGiven_InMultiYamlFiles() throws Exception {
   278          // This test replaces variables in multi-yaml files from a list of specified variables
   279          // the the user has not specified any variable substitution files list.
   280  
   281          String manifestFileName = "test/resources/variableSubstitution/multi_manifest.yml"
   282          String variablesFileName = "test/resources/variableSubstitution/manifest-variables.yml"
   283  
   284          List<Map<String, Object>> variablesList = [
   285                                                      ["unique-prefix" : "uniquePrefix"],
   286                                                      ["xsuaa-instance-name" : "uniquePrefix-catalog-service-odatav2-xsuaa"],
   287                                                      ["hana-instance-name" : "uniquePrefix-catalog-service-odatav2-hana"]
   288                                                    ]
   289  
   290          fileExistsRule.registerExistingFile(manifestFileName)
   291          fileExistsRule.registerExistingFile(variablesFileName)
   292  
   293          // check that a proper log is written.
   294          loggingRule.expect("[CFManifestSubstituteVariables] Loaded manifest at ${manifestFileName}!")
   295              //.expect("[CFManifestSubstituteVariables] Loaded variables file at ${variablesFileName}!")
   296              .expect("[CFManifestSubstituteVariables] Replaced variables in ${manifestFileName}.")
   297              .expect("[CFManifestSubstituteVariables] Wrote output file (with variables replaced) at ${manifestFileName}.")
   298  
   299          // execute step
   300          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, manifestVariables: variablesList, script: nullScript
   301  
   302          String yamlStringAfterReplacement = writeYamlRule.files[manifestFileName].get(SERIALIZED_YAML) as String
   303          List<Object> manifestDataAfterReplacement = writeYamlRule.files[manifestFileName].get(DATA)
   304  
   305          //Check that something was written
   306          assertNotNull(manifestDataAfterReplacement)
   307  
   308          // check that there are no unresolved variables left.
   309          assertAllVariablesReplaced(yamlStringAfterReplacement)
   310  
   311          //check that result still is a multi-YAML file.
   312          assertEquals("Dumped YAML after replacement should still be a multi-YAML file.",2, manifestDataAfterReplacement.size())
   313  
   314          // check that resolved variables have expected values
   315          manifestDataAfterReplacement.each { yaml ->
   316              assertCorrectVariableResolution(yaml as Map<String, Object>)
   317          }
   318  
   319          // check that the step was marked as a success (even if it did do nothing).
   320          assertJobStatusSuccess()
   321      }
   322  
   323      @Test
   324      public void substituteVariables_ReplacesVariablesFromListProperly_whenEmptyManifestVariablesFilesGiven_InMultiYamlFiles() throws Exception {
   325          // This test replaces variables in multi-yaml files from a list of specified variables
   326          // the the user has specified an empty list of variable substitution files.
   327  
   328          String manifestFileName = "test/resources/variableSubstitution/multi_manifest.yml"
   329          String variablesFileName = "test/resources/variableSubstitution/manifest-variables.yml"
   330          List<String> variablesFiles = []
   331  
   332          List<Map<String, Object>> variablesList = [
   333              ["unique-prefix" : "uniquePrefix"],
   334              ["xsuaa-instance-name" : "uniquePrefix-catalog-service-odatav2-xsuaa"],
   335              ["hana-instance-name" : "uniquePrefix-catalog-service-odatav2-hana"]
   336          ]
   337  
   338          fileExistsRule.registerExistingFile(manifestFileName)
   339          fileExistsRule.registerExistingFile(variablesFileName)
   340  
   341          // check that a proper log is written.
   342          loggingRule.expect("[CFManifestSubstituteVariables] Loaded manifest at ${manifestFileName}!")
   343          //.expect("[CFManifestSubstituteVariables] Loaded variables file at ${variablesFileName}!")
   344              .expect("[CFManifestSubstituteVariables] Replaced variables in ${manifestFileName}.")
   345              .expect("[CFManifestSubstituteVariables] Wrote output file (with variables replaced) at ${manifestFileName}.")
   346  
   347          // execute step
   348          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, manifestVariablesFiles: variablesFiles, manifestVariables: variablesList, script: nullScript
   349  
   350          String yamlStringAfterReplacement = writeYamlRule.files[manifestFileName].get(SERIALIZED_YAML) as String
   351          List<Object> manifestDataAfterReplacement = writeYamlRule.files[manifestFileName].get(DATA)
   352  
   353          //Check that something was written
   354          assertNotNull(manifestDataAfterReplacement)
   355  
   356          // check that there are no unresolved variables left.
   357          assertAllVariablesReplaced(yamlStringAfterReplacement)
   358  
   359          //check that result still is a multi-YAML file.
   360          assertEquals("Dumped YAML after replacement should still be a multi-YAML file.",2, manifestDataAfterReplacement.size())
   361  
   362          // check that resolved variables have expected values
   363          manifestDataAfterReplacement.each { yaml ->
   364              assertCorrectVariableResolution(yaml as Map<String, Object>)
   365          }
   366  
   367          // check that the step was marked as a success (even if it did do nothing).
   368          assertJobStatusSuccess()
   369      }
   370  
   371      @Test
   372      public void substituteVariables_SkipsExecution_If_NoVariablesInManifest() throws Exception {
   373          // This test makes sure that, if no variables are found in a manifest that need
   374          // to be replaced, the execution is eventually skipped and the manifest remains
   375          // untouched.
   376  
   377          String manifestFileName = "test/resources/variableSubstitution/novars_manifest.yml"
   378          String variablesFileName = "test/resources/variableSubstitution/manifest-variables.yml"
   379          List<String> variablesFiles = [ variablesFileName ]
   380  
   381          fileExistsRule.registerExistingFile(manifestFileName)
   382          fileExistsRule.registerExistingFile(variablesFileName)
   383  
   384          // check that a proper log is written.
   385          loggingRule.expect("[CFManifestSubstituteVariables] Loaded manifest at ${manifestFileName}!")
   386                     .expect("[CFManifestSubstituteVariables] Loaded variables file at ${variablesFileName}!")
   387                     .expect("[CFManifestSubstituteVariables] No variables were found or could be replaced in ${manifestFileName}. Skipping variable substitution.")
   388  
   389          // execute step
   390          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, manifestVariablesFiles: variablesFiles, script: nullScript
   391  
   392          //Check that nothing was written
   393          assertNull(writeYamlRule.files[manifestFileName])
   394  
   395          // check that the step was marked as a success (even if it did do nothing).
   396          assertJobStatusSuccess()
   397      }
   398  
   399      @Test
   400      public void substituteVariables_SupportsAllDataTypes() throws Exception {
   401          // This test makes sure that, all datatypes supported by YAML are also
   402          // properly substituted by the substituteVariables step.
   403          // In particular this includes variables of type:
   404          // Integer, Boolean, String, Float and inline JSON documents (which are parsed as multi-line strings)
   405          // and complex types (like other YAML objects).
   406          // The test also checks the differing behaviour when substituting nodes that only consist of a
   407          // variable reference and nodes that contains several variable references or additional string constants.
   408  
   409          String manifestFileName = "test/resources/variableSubstitution/datatypes_manifest.yml"
   410          String variablesFileName = "test/resources/variableSubstitution/datatypes_manifest-variables.yml"
   411          List<String> variablesFiles = [ variablesFileName ]
   412  
   413          fileExistsRule.registerExistingFile(manifestFileName)
   414          fileExistsRule.registerExistingFile(variablesFileName)
   415  
   416          // check that a proper log is written.
   417          loggingRule.expect("[CFManifestSubstituteVariables] Loaded manifest at ${manifestFileName}!")
   418                     .expect("[CFManifestSubstituteVariables] Loaded variables file at ${variablesFileName}!")
   419  
   420          // execute step
   421          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, manifestVariablesFiles: variablesFiles, script: nullScript
   422  
   423          String yamlStringAfterReplacement = writeYamlRule.files[manifestFileName].get(SERIALIZED_YAML) as String
   424          Map<String, Object> manifestDataAfterReplacement = writeYamlRule.files[manifestFileName].get(DATA)
   425  
   426          //Check that something was written
   427          assertNotNull(manifestDataAfterReplacement)
   428  
   429          assertAllVariablesReplaced(yamlStringAfterReplacement)
   430          assertCorrectVariableResolution(manifestDataAfterReplacement)
   431  
   432          assertDataTypeAndSubstitutionCorrectness(manifestDataAfterReplacement)
   433  
   434          // check that the step was marked as a success (even if it did do nothing).
   435          assertJobStatusSuccess()
   436      }
   437  
   438      private void assertDataTypeAndSubstitutionCorrectness(Map<String, Object> manifestDataAfterReplacement) {
   439          // See datatypes_manifest.yml and datatypes_manifest-variables.yml.
   440          // Note: For debugging consider turning on YAML writing to a file in JenkinsWriteYamlRule to see the
   441          // actual outcome of replacing variables (for visual inspection).
   442  
   443          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("instances").equals(1))
   444          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("instances") instanceof Integer)
   445  
   446          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("services").get(0) instanceof String)
   447  
   448          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("booleanVariableTrue").equals(true))
   449          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("booleanVariableTrue") instanceof Boolean)
   450  
   451          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("floatVariable") == 0.25)
   452          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("floatVariable") instanceof Double)
   453  
   454          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("json-variable") instanceof String)
   455  
   456          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("object-variable") instanceof Map)
   457  
   458          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("string-variable").startsWith("true-0.25-1-"))
   459          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("string-variable") instanceof String)
   460  
   461          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("single-var-with-string-constants").equals("true-with-some-more-text"))
   462          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("single-var-with-string-constants") instanceof String)
   463      }
   464  
   465      @Test
   466      public void substituteVariables_replacesManifestIfNoOutputGiven() throws Exception {
   467          // Test that makes sure that the original input manifest file is replaced with
   468          // a version that has variables replaced (by deleting the original file and
   469          // dumping a new one with the same name).
   470  
   471          String manifestFileName = "test/resources/variableSubstitution/datatypes_manifest.yml"
   472          String variablesFileName = "test/resources/variableSubstitution/datatypes_manifest-variables.yml"
   473          List<String> variablesFiles = [ variablesFileName ]
   474  
   475          fileExistsRule.registerExistingFile(manifestFileName)
   476          fileExistsRule.registerExistingFile(variablesFileName)
   477  
   478          // check that a proper log is written.
   479          loggingRule.expect("[CFManifestSubstituteVariables] Loaded manifest at ${manifestFileName}!")
   480                     .expect("[CFManifestSubstituteVariables] Loaded variables file at ${variablesFileName}!")
   481                     .expect("[CFManifestSubstituteVariables] Successfully deleted file '${manifestFileName}'.")
   482                     .expect("[CFManifestSubstituteVariables] Replaced variables in ${manifestFileName}.")
   483                     .expect("[CFManifestSubstituteVariables] Wrote output file (with variables replaced) at ${manifestFileName}.")
   484  
   485          // execute step
   486          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, manifestVariablesFiles: variablesFiles, script: nullScript
   487  
   488          String yamlStringAfterReplacement = writeYamlRule.files[manifestFileName].get(SERIALIZED_YAML) as String
   489          Map<String, Object> manifestDataAfterReplacement = writeYamlRule.files[manifestFileName].get(DATA)
   490  
   491          //Check that something was written
   492          assertNotNull(manifestDataAfterReplacement)
   493  
   494          assertAllVariablesReplaced(yamlStringAfterReplacement)
   495          assertCorrectVariableResolution(manifestDataAfterReplacement)
   496  
   497          assertDataTypeAndSubstitutionCorrectness(manifestDataAfterReplacement)
   498  
   499          // check that the step was marked as a success (even if it did do nothing).
   500          assertJobStatusSuccess()
   501      }
   502  
   503      @Test
   504      public void substituteVariables_writesToOutputFileIfGiven() throws Exception {
   505          // Test that makes sure that the output is written to the specified file and that the original input manifest
   506          // file is NOT deleted / replaced.
   507  
   508          String manifestFileName = "test/resources/variableSubstitution/datatypes_manifest.yml"
   509          String variablesFileName = "test/resources/variableSubstitution/datatypes_manifest-variables.yml"
   510          List<String> variablesFiles = [ variablesFileName ]
   511          String outputFileName = "output.yml"
   512  
   513          fileExistsRule.registerExistingFile(manifestFileName)
   514          fileExistsRule.registerExistingFile(variablesFileName)
   515  
   516          // check that a proper log is written.
   517          loggingRule.expect("[CFManifestSubstituteVariables] Loaded manifest at ${manifestFileName}!")
   518              .expect("[CFManifestSubstituteVariables] Loaded variables file at ${variablesFileName}!")
   519              .expect("[CFManifestSubstituteVariables] Replaced variables in ${manifestFileName}.")
   520              .expect("[CFManifestSubstituteVariables] Wrote output file (with variables replaced) at ${outputFileName}.")
   521  
   522          // execute step
   523          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, manifestVariablesFiles: variablesFiles, outputManifestFile: outputFileName,  script: nullScript
   524  
   525          String yamlStringAfterReplacement = writeYamlRule.files[outputFileName].get(SERIALIZED_YAML) as String
   526          Map<String, Object> manifestDataAfterReplacement = writeYamlRule.files[outputFileName].get(DATA)
   527  
   528          //Check that something was written
   529          assertNotNull(manifestDataAfterReplacement)
   530  
   531          // make sure the input file was NOT deleted.
   532          assertFalse(loggingRule.expected.contains("[CFManifestSubstituteVariables] Successfully deleted file '${manifestFileName}'."))
   533  
   534          assertAllVariablesReplaced(yamlStringAfterReplacement)
   535          assertCorrectVariableResolution(manifestDataAfterReplacement)
   536  
   537          assertDataTypeAndSubstitutionCorrectness(manifestDataAfterReplacement)
   538  
   539          // check that the step was marked as a success (even if it did do nothing).
   540          assertJobStatusSuccess()
   541      }
   542  
   543      @Test
   544      public void substituteVariables_resolvesConflictsProperly_InMultiYamlFiles() throws Exception {
   545          // This test checks if the resolution and of conflicting variables and the
   546          // overriding nature of variable lists vs. variable files lists is working properly.
   547  
   548          String manifestFileName = "test/resources/variableSubstitution/multi_manifest.yml"
   549          String variablesFileName = "test/resources/variableSubstitution/manifest-variables.yml"
   550          String conflictingVariablesFileName = "test/resources/variableSubstitution/manifest-variables-conflicting.yml"
   551          List<String> variablesFiles = [ variablesFileName, conflictingVariablesFileName ] //introducing a conflicting file whose entries should win, since it is last in the list
   552  
   553          List<Map<String, Object>> variablesList = [
   554              ["unique-prefix" : "uniquePrefix-from-vars-list"],
   555              ["unique-prefix" : "uniquePrefix-from-vars-list-conflicting"] // introduce a conflict that should win, since it is last in the list.
   556          ]
   557  
   558          fileExistsRule.registerExistingFile(manifestFileName)
   559          fileExistsRule.registerExistingFile(variablesFileName)
   560          fileExistsRule.registerExistingFile(conflictingVariablesFileName)
   561  
   562          // check that a proper log is written.
   563          loggingRule.expect("[CFManifestSubstituteVariables] Loaded manifest at ${manifestFileName}!")
   564          //.expect("[CFManifestSubstituteVariables] Loaded variables file at ${variablesFileName}!")
   565              .expect("[CFManifestSubstituteVariables] Replaced variables in ${manifestFileName}.")
   566              .expect("[CFManifestSubstituteVariables] Wrote output file (with variables replaced) at ${manifestFileName}.")
   567  
   568          // execute step
   569          script.step.cfManifestSubstituteVariables manifestFile: manifestFileName, manifestVariablesFiles: variablesFiles, manifestVariables: variablesList, script: nullScript
   570  
   571          String yamlStringAfterReplacement = writeYamlRule.files[manifestFileName].get(SERIALIZED_YAML) as String
   572          List<Object> manifestDataAfterReplacement = writeYamlRule.files[manifestFileName].get(DATA)
   573  
   574          //Check that something was written
   575          assertNotNull(manifestDataAfterReplacement)
   576  
   577          // check that there are no unresolved variables left.
   578          assertAllVariablesReplaced(yamlStringAfterReplacement)
   579  
   580          //check that result still is a multi-YAML file.
   581          assertEquals("Dumped YAML after replacement should still be a multi-YAML file.",2, manifestDataAfterReplacement.size())
   582  
   583          // check that resolved variables have expected values
   584          manifestDataAfterReplacement.each { yaml ->
   585              assertCorrectVariableSubstitutionUnderConflictAndWithOverriding(yaml as Map<String, Object>)
   586          }
   587  
   588          // check that the step was marked as a success (even if it did do nothing).
   589          assertJobStatusSuccess()
   590      }
   591  
   592      private void assertCorrectVariableSubstitutionUnderConflictAndWithOverriding(Map<String, Object> manifestDataAfterReplacement) {
   593          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("name").equals("uniquePrefix-from-vars-list-conflicting-catalog-service-odatav2-0.0.1"))
   594          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("routes").get(0).get("route").equals("uniquePrefix-from-vars-list-conflicting-catalog-service-odatav2-001.cfapps.eu10.hana.ondemand.com"))
   595          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("services").get(0).equals("uniquePrefix-catalog-service-odatav2-xsuaa-conflicting-from-file"))
   596          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("services").get(1).equals("uniquePrefix-catalog-service-odatav2-hana"))
   597          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("xsuaa-instance-name").equals("uniquePrefix-catalog-service-odatav2-xsuaa-conflicting-from-file"))
   598          assertTrue(manifestDataAfterReplacement.get("applications").get(0).get("env").get("db_service_instance_name").equals("uniquePrefix-catalog-service-odatav2-hana"))
   599      }
   600  }