1 /** 2 * Copyright (c) 2008, http://www.snakeyaml.org 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package org.yaml.snakeyaml.issues.issue99; 17 18 import java.io.BufferedInputStream; 19 import java.io.IOException; 20 import java.io.InputStream; 21 import java.util.Map; 22 23 import junit.framework.TestCase; 24 25 import org.yaml.snakeyaml.Util; 26 import org.yaml.snakeyaml.Yaml; 27 import org.yaml.snakeyaml.YamlDocument; 28 import org.yaml.snakeyaml.constructor.AbstractConstruct; 29 import org.yaml.snakeyaml.constructor.Constructor; 30 import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; 31 import org.yaml.snakeyaml.nodes.Node; 32 import org.yaml.snakeyaml.nodes.ScalarNode; 33 import org.yaml.snakeyaml.nodes.Tag; 34 35 /** 36 * Example for issue 99 37 * 38 * @see <a href="http://code.google.com/p/snakeyaml/issues/detail?id=99"></a> 39 */ 40 public class YamlBase64Test extends TestCase { 41 42 /** 43 * test base64 decoding 44 */ testBase64()45 public void testBase64() throws IOException { 46 String text = Util.getLocalResource("issues/issue99-base64_literal.yaml"); 47 String[] lines = text.split("\n"); 48 String all = ""; 49 for (int i = 1; i < lines.length; i++) {// skip first line 50 all = all + lines[i].trim(); 51 } 52 // System.out.println(all); 53 byte[] decoded = Base64Coder.decode(all.toCharArray()); 54 assertEquals(3737, decoded.length); 55 checkBytes(decoded); 56 } 57 58 @SuppressWarnings("unchecked") testYamlBase64Loading()59 public void testYamlBase64Loading() throws IOException { 60 Yaml yaml = new Yaml(); 61 InputStream inputStream = YamlBase64Test.class 62 .getResourceAsStream("/issues/issue99-base64_double_quoted.yaml"); 63 Map<String, Object> bean = (Map<String, Object>) yaml.load(inputStream); 64 byte[] jpeg = (byte[]) bean.get("jpegPhoto"); 65 checkBytes(jpeg); 66 inputStream.close(); 67 } 68 checkBytes(byte[] jpeg)69 private void checkBytes(byte[] jpeg) throws IOException { 70 InputStream input; 71 input = YamlDocument.class.getClassLoader().getResourceAsStream("issues/issue99.jpeg"); 72 BufferedInputStream is = new BufferedInputStream(input); 73 int i = 0; 74 while (i < jpeg.length) { 75 int etalon = is.read(); 76 if (jpeg[i] < 0) { 77 assertEquals(etalon, jpeg[i] + 256); 78 } else { 79 assertEquals(etalon, jpeg[i]); 80 } 81 i++; 82 } 83 is.close(); 84 } 85 86 /** 87 * In the literal scalar all the line breaks are significant 88 * 89 * @throws IOException 90 */ testYamlBase64LoadingLiteral()91 public void testYamlBase64LoadingLiteral() throws IOException { 92 Yaml yaml = new Yaml(); 93 InputStream inputStream = YamlBase64Test.class 94 .getResourceAsStream("/issues/issue99-base64_literal.yaml"); 95 try { 96 yaml.load(inputStream); 97 fail("In the literal scalar all the line breaks are significant"); 98 } catch (Exception e) { 99 assertEquals("Length of Base64 encoded input string is not a multiple of 4.", 100 e.getMessage()); 101 } finally { 102 inputStream.close(); 103 } 104 } 105 106 /** 107 * Redefine the !!binary global tag in a way that it ignores all the white 108 * spaces to be able to use literal scalar 109 */ 110 @SuppressWarnings("unchecked") testRedefineBinaryTag()111 public void testRedefineBinaryTag() throws IOException { 112 Yaml yaml = new Yaml(new SpecialContructor(Tag.BINARY)); 113 InputStream inputStream = YamlBase64Test.class 114 .getResourceAsStream("/issues/issue99-base64_literal.yaml"); 115 Map<String, Object> bean = (Map<String, Object>) yaml.load(inputStream); 116 byte[] jpeg = (byte[]) bean.get("jpegPhoto"); 117 checkBytes(jpeg); 118 inputStream.close(); 119 } 120 121 private class SpecialContructor extends Constructor { SpecialContructor(Tag tag)122 public SpecialContructor(Tag tag) { 123 this.yamlConstructors.put(tag, new MyBinaryConstructor()); 124 } 125 126 private class MyBinaryConstructor extends AbstractConstruct { construct(Node node)127 public Object construct(Node node) { 128 String contentWithNewLines = constructScalar((ScalarNode) node).toString(); 129 String noNewLines = contentWithNewLines.replaceAll("\\s", ""); 130 byte[] decoded = Base64Coder.decode(noNewLines.toCharArray()); 131 return decoded; 132 } 133 } 134 } 135 136 /** 137 * Define a local tag to ignore all the white spaces to be able to use 138 * literal scalar 139 */ 140 @SuppressWarnings("unchecked") testLocalBinaryTag()141 public void testLocalBinaryTag() throws IOException { 142 Yaml yaml = new Yaml(new SpecialContructor(new Tag("!beautiful"))); 143 InputStream inputStream = YamlBase64Test.class 144 .getResourceAsStream("/issues/issue99-base64_literal_custom_tag.yaml"); 145 Map<String, Object> bean = (Map<String, Object>) yaml.load(inputStream); 146 byte[] jpeg = (byte[]) bean.get("jpegPhoto"); 147 checkBytes(jpeg); 148 inputStream.close(); 149 } 150 } 151