package groovy class Base64Test extends GroovyTestCase { String testString = '\u00A71234567890-=\u00B1!@\u00A3\$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;\'\\ASDFGHJKL:"|`zxcvbnm,./~ZXCVBNM<>?\u0003\u00ff\u00f0\u000f' byte[] testBytes = testString.getBytes("ISO-8859-1") void testCodec() { // turn the bytes back into a string for later comparison def savedString = new String(testBytes, "ISO-8859-1") def encodedBytes = testBytes.encodeBase64().toString() def decodedBytes = encodedBytes.decodeBase64() def decodedString = new String(decodedBytes, "ISO-8859-1") assert decodedString.equals(testString) assert decodedString.equals(savedString) } // embedding special characters in a string without unicode will yield platform // specific results but should still convert back to what it started with void testCodecSpecialCharacters() { def specialString = "§±£" def specialBytes = specialString.getBytes("ISO-8859-1") // turn the bytes back into a string for later comparison def savedString = new String(specialBytes, "ISO-8859-1") def encodedBytes = specialBytes.encodeBase64().toString() def decodedBytes = encodedBytes.decodeBase64() def decodedString = new String(decodedBytes, "ISO-8859-1") assert decodedString.equals(savedString) } void testChunking() { def encodedBytes = testBytes.encodeBase64(true).toString() // Make sure the encoded, chunked data ends with '\r\n', the chunk separator per RFC 2045 (see also RFC 4648) assert encodedBytes.endsWith("\r\n") def lines = encodedBytes.split() def line0 = lines[0].trim() def line1 = lines[1].trim() // it's important that the data is chunked to 76 characters, per the spec assert line0.size() == 76 assert line0 == 'pzEyMzQ1Njc4OTAtPbEhQKMkJV4mKigpXytxd2VydHl1aW9wW11RV0VSVFlVSU9Qe31hc2RmZ2hq' assert line1 == 'a2w7J1xBU0RGR0hKS0w6InxgenhjdmJubSwuL35aWENWQk5NPD4/A//wDw==' } void testNonChunked() { def encodedBytes = testBytes.encodeBase64().toString() assert encodedBytes == 'pzEyMzQ1Njc4OTAtPbEhQKMkJV4mKigpXytxd2VydHl1aW9wW11RV0VSVFlVSU9Qe31hc2RmZ2hqa2w7J1xBU0RGR0hKS0w6InxgenhjdmJubSwuL35aWENWQk5NPD4/A//wDw==' } }