diff --git a/889-yaml-commons/src/main/java/io/harness/pms/merger/helpers/MergeHelper.java b/889-yaml-commons/src/main/java/io/harness/pms/merger/helpers/MergeHelper.java index a21f67b147f2e..963eaa9e57cf4 100644 --- a/889-yaml-commons/src/main/java/io/harness/pms/merger/helpers/MergeHelper.java +++ b/889-yaml-commons/src/main/java/io/harness/pms/merger/helpers/MergeHelper.java @@ -121,16 +121,23 @@ public String mergeUpdatesIntoJson(String pipelineJson, Map fqnT return JsonUtils.asJson(pipelineNode.getCurrJsonNode()); } fqnToJsonMap.keySet().forEach(fqn -> { + String content = fqnToJsonMap.get(fqn); + content = removeNonASCII(content); try { - pipelineNode.replacePath(fqn, YamlUtils.readTree(fqnToJsonMap.get(fqn)).getNode().getCurrJsonNode()); + pipelineNode.replacePath(fqn, YamlUtils.readTree(content).getNode().getCurrJsonNode()); } catch (IOException e) { - log.error("Could not read json provided for the fqn: " + fqn + ". Json:\n" + fqnToJsonMap.get(fqn), e); + log.error("Could not read json provided for the fqn: " + fqn + ". Json:\n" + content, e); throw new YamlException("Could not read json provided for the fqn: " + fqn); } }); return JsonUtils.asJson(pipelineNode.getCurrJsonNode()); } + // Yaml Object Mapper can't handle emojis and non ascii characters + public String removeNonASCII(String content) { + return content.replaceAll("[^\\x00-\\x7F]", ""); + } + public String removeFQNs(String json, List toBeRemovedFQNs) { if (EmptyPredicate.isEmpty(toBeRemovedFQNs)) { return json; diff --git a/889-yaml-commons/src/test/java/io/harness/pms/merger/helpers/MergeHelperTest.java b/889-yaml-commons/src/test/java/io/harness/pms/merger/helpers/MergeHelperTest.java index 60dfae53e4e36..bd7c18da014f0 100644 --- a/889-yaml-commons/src/test/java/io/harness/pms/merger/helpers/MergeHelperTest.java +++ b/889-yaml-commons/src/test/java/io/harness/pms/merger/helpers/MergeHelperTest.java @@ -9,6 +9,7 @@ import static io.harness.annotations.dev.HarnessTeam.PIPELINE; import static io.harness.pms.merger.helpers.MergeHelper.mergeRuntimeInputValuesIntoOriginalYaml; +import static io.harness.rule.OwnerRule.DEV_MITTAL; import static io.harness.rule.OwnerRule.NAMAN; import static org.assertj.core.api.Assertions.assertThat; @@ -120,6 +121,53 @@ public void testMergeYamlUpdates() throws IOException { assertThat(noUpdatesOnYaml).isEqualTo(readFile("opa-pipeline.json")); } + @Test + @Owner(developers = DEV_MITTAL) + @Category(UnitTests.class) + public void testMergeYamlUpdatesEmojis() throws IOException { + String filename = "opa-pipeline.yaml"; + String pipeline = readFile(filename); + + String fqn1 = "pipeline/stages/[0]/stage/spec/execution/steps/[0]/step/spec/connector"; + String exp1 = readFile("emojiExp1.txt"); + + String fqn2 = "pipeline/stages/[1]/stage/spec/infrastructure/environment"; + String exp2 = readFile("emojiExp2.txt"); + + Map fqnToJsonMap = new HashMap<>(); + fqnToJsonMap.put(fqn1, exp1); + fqnToJsonMap.put(fqn2, exp2); + String expandedPipeline = MergeHelper.mergeUpdatesIntoJson(pipeline, fqnToJsonMap); + assertThat(expandedPipeline).isNotNull(); + String expandedPipelineExpected = readFile("opa-pipeline-with-expansions-no-removals.json"); + assertThat(expandedPipeline).isEqualTo(expandedPipelineExpected); + YamlField yamlField = YamlUtils.readTree(expandedPipeline); + YamlNode firstExp = + yamlField.getNode().gotoPath("pipeline/stages/[0]/stage/spec/execution/steps/[0]/step/spec/connector"); + YamlNode secondExp = yamlField.getNode().gotoPath("pipeline/stages/[1]/stage/spec/infrastructure/environment"); + assertThat(firstExp).isNotNull(); + assertThat(secondExp).isNotNull(); + + String noUpdates = MergeHelper.mergeUpdatesIntoJson(expandedPipeline, null); + assertThat(noUpdates).isEqualTo(expandedPipeline); + + String noUpdatesOnYaml = MergeHelper.mergeUpdatesIntoJson(pipeline, null); + assertThat(noUpdatesOnYaml).isEqualTo(readFile("opa-pipeline.json")); + } + + @Test + @Owner(developers = DEV_MITTAL) + @Category(UnitTests.class) + public void testRemoveNonASCII() { + String asciiString = ""; + for (int i = 0; i < 128; i++) { + asciiString += (char) i; + } + assertThat(MergeHelper.removeNonASCII(asciiString)).isEqualTo(asciiString); + assertThat(MergeHelper.removeNonASCII(asciiString + "\ud330\ud803\ud823")).isEqualTo(asciiString); + assertThat(MergeHelper.removeNonASCII("\ud230\ud803\ud123" + asciiString)).isEqualTo(asciiString); + } + @Test @Owner(developers = NAMAN) @Category(UnitTests.class) diff --git a/889-yaml-commons/src/test/resources/emojiExp1.txt b/889-yaml-commons/src/test/resources/emojiExp1.txt new file mode 100644 index 0000000000000..086ccb697b267 --- /dev/null +++ b/889-yaml-commons/src/test/resources/emojiExp1.txt @@ -0,0 +1,15 @@ +{ + "name": "jira ๐Ÿคฃ๐Ÿ˜„๐˜…โ…๐Ÿ˜ดโŽbasic", + "identifier": "jira_b๐Ÿ˜จโ„ฌ๐Ÿ˜asic", + "description": "", + "orgIdentifier": "defโ˜บ๏ธ๐Ÿ˜Šault", + "projectIdentifier": "Local๐Ÿ˜๐Ÿ˜Š_Dev", + "tags": {}, + "type": "Ji๐Ÿง‘โ€๐Ÿญ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿญ๐Ÿ‘จ๐Ÿผโ€๐Ÿ”งra", + "spec": { + "jiraUrl": "๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ผ๐Ÿ™‡๐Ÿปโ€โ™‚๏ธ๐Ÿ™‡๐Ÿปhttps://harness.atlassian.net/", + "username": "naman๐Ÿ™‡๐Ÿปvermah", + "passwordRef": "nvh_do๐Ÿ๐˜…๐Ÿ€cker_pass", + "delegateSelectors": [] + } +} \ No newline at end of file diff --git a/889-yaml-commons/src/test/resources/emojiExp2.txt b/889-yaml-commons/src/test/resources/emojiExp2.txt new file mode 100644 index 0000000000000..a8a70a50612f0 --- /dev/null +++ b/889-yaml-commons/src/test/resources/emojiExp2.txt @@ -0,0 +1,10 @@ +{ + "identifier": "PR_ENV", + "name": "PR ENV๐˜…๐Ÿ˜ด๐Ÿ˜โšก๏ธŽ", + "description": "", + "type": "PreP๐Ÿ’๐Ÿผโ€โ™€๏ธ๐Ÿ๐Ÿขroduction", + "accountIdentifier": "kmpySmUISimoRrJL6NL73w", + "orgIdentifier": "d๐Ÿ๐Ÿชฐ๐Ÿฆ„efault", + "projectIdentifier": "Loc๐Ÿฟ๐Ÿ€๐Ÿ€al_Dev", + "tags": {} +} \ No newline at end of file diff --git a/README.md b/README.md index 5b6f7524efffe..087d6788512b3 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ This repo contains code used in the [Harness CD Community Edition](https://githu harness-core Project Dev environment setup instructions ================================================== -## On MacOS +## On MacOSxf f ### Prerequisities 1. Install Homebrew: @@ -652,4 +652,4 @@ We are already using logback framework in our application, so it is simple to en 1. Create a new JIRA ticket(Don't use the feature branch). 2. Checkout the branch to hotfix on and make the changes. 3. Bump up the build number in the build.properties. -4. Create a pull request on this branch and master as well, make sure you merge them on master within the next 3 4 hours. \ No newline at end of file +4. Create a pull request on this branch and master as well, make sure you merge them on master within the next 3 4 hours.