/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.addthis.basis.util;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static com.addthis.basis.util.CookieSafeBase90.decodeBase45;
import static com.addthis.basis.util.CookieSafeBase90.decodeBase90;
import static com.addthis.basis.util.CookieSafeBase90.decodeBytesBase90;
import static com.addthis.basis.util.CookieSafeBase90.encodeBase45;
import static com.addthis.basis.util.CookieSafeBase90.encodeBase90Signed;
import static com.addthis.basis.util.CookieSafeBase90.encodeBase90Unsigned;
import static com.addthis.basis.util.CookieSafeBase90.encodeBytesBase90;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class CookieSafeBase90Test {
@Rule
public final ExpectedException thrown = ExpectedException.none();
@Test
public void shouldEncodeBase45Correctly() {
assertEquals("#", encodeBase45(1L, false, false));
assertEquals("$", encodeBase45(2L, false, false));
assertEquals("R", encodeBase45(1L, true, false));
assertEquals("S", encodeBase45(2L, true, false));
assertEquals("P", encodeBase45(44L, false, false));
assertEquals("~", encodeBase45(44L, true, false));
assertEquals("#!", encodeBase45(45L, false, false));
assertEquals("RQ", encodeBase45(45L, true, false));
assertEquals("!R", encodeBase45(1L, false, true));
assertEquals("!S", encodeBase45(2L, false, true));
assertEquals("Q#", encodeBase45(1L, true, true));
assertEquals("Q$", encodeBase45(2L, true, true));
assertEquals("!~", encodeBase45(44L, false, true));
assertEquals("QP", encodeBase45(44L, true, true));
assertEquals("#Q", encodeBase45(45L, false, true));
assertEquals("R!", encodeBase45(45L, true, true));
assertEquals("RQ!", encodeBase45(2025L, true, true));
assertEquals("RQQ", encodeBase45(2025L, true, false));
assertEquals("#!Q", encodeBase45(2025L, false, true));
assertEquals("#!!", encodeBase45(2025L, false, false));
assertEquals("~P", encodeBase45(2024L, true, true));
assertEquals("~~", encodeBase45(2024L, true, false));
assertEquals("P~", encodeBase45(2024L, false, true));
assertEquals("PP", encodeBase45(2024L, false, false));
}
@Test
public void encodeAndDecodeMaxValueBase45() {
String encoded = CookieSafeBase90.encodeBase45(Long.MAX_VALUE, true, false);
long decoded = decodeBase45(encoded);
assertEquals(Long.MAX_VALUE, decoded);
}
@Test
public void encodeAndDecodeMaxValueBase90() {
String encoded = encodeBase90Signed(Long.MAX_VALUE);
long decoded = decodeBase90(encoded, true);
assertEquals(Long.MAX_VALUE, decoded);
}
@Test
public void shouldDecodeBase45Correctly() {
assertEquals(1, decodeBase45("#"));
assertEquals(2, decodeBase45("$"));
assertEquals(1, decodeBase45("R"));
assertEquals(2, decodeBase45("S"));
assertEquals(44, decodeBase45("P"));
assertEquals(44, decodeBase45("~"));
assertEquals(45, decodeBase45("#!"));
assertEquals(45, decodeBase45("RQ"));
assertEquals(1, decodeBase45("!R"));
assertEquals(2, decodeBase45("!S"));
assertEquals(1, decodeBase45("Q#"));
assertEquals(2, decodeBase45("Q$"));
assertEquals(44, decodeBase45("!~"));
assertEquals(44, decodeBase45("QP"));
assertEquals(45, decodeBase45("#Q"));
assertEquals(45, decodeBase45("R!"));
assertEquals(2025, decodeBase45("RQ!"));
assertEquals(2025, decodeBase45("RQQ"));
assertEquals(2025, decodeBase45("#!Q"));
assertEquals(2025, decodeBase45("#!!"));
assertEquals(2024, decodeBase45("~P"));
assertEquals(2024, decodeBase45("~~"));
assertEquals(2024, decodeBase45("P~"));
assertEquals(2024, decodeBase45("PP"));
assertEquals(12345, decodeBase45("WU2"));
}
@Test
public void exceptionOnBadChar() {
thrown.expect(RuntimeException.class);
decodeBase45(";");
}
@Test
public void exceptionOnBadChar2() {
thrown.expect(RuntimeException.class);
decodeBase45(";");
}
@Test
public void exceptionOnBadChar3() {
thrown.expect(RuntimeException.class);
decodeBase45("abcdef;");
}
@Test
public void shouldEncodeBase90UnsignedCorrectly() {
assertEquals("#!", encodeBase90Unsigned(90));
assertEquals("~", encodeBase90Unsigned(89));
assertEquals("!", encodeBase90Unsigned(0));
assertEquals("#", encodeBase90Unsigned(1));
assertEquals("#!!", encodeBase90Unsigned(8100));
assertEquals("~~", encodeBase90Unsigned(8099));
assertEquals("#S2", encodeBase90Unsigned(12345));
}
@Test
public void shouldEncodeBase90SignedCorrectly() {
assertEquals("Q!!!!!!!!~", encodeBase90Signed(-89));
assertEquals("Q!!!!!!!~~", encodeBase90Signed(-8099));
assertEquals("Q!!!!!!#S2", encodeBase90Signed(-12345));
assertEquals("im^ldBVL7)", encodeBase90Signed(-Long.MAX_VALUE));
assertEquals("!!!!!!!!!~", encodeBase90Signed(89));
assertEquals("!!!!!!!!~~", encodeBase90Signed(8099));
assertEquals("!!!!!!!#S2", encodeBase90Signed(12345));
assertEquals(":m^ldBVL7)", encodeBase90Signed(Long.MAX_VALUE));
assertEquals("!!!!!!!!!!", encodeBase90Signed(0));
}
@Test
public void shouldDecodeBase90SignedCorrectly() {
assertEquals(-89, decodeBase90("Q!!!!!!!!~", true));
assertEquals(-8099, decodeBase90("Q!!!!!!!~~", true));
assertEquals(-12345, decodeBase90("Q!!!!!!#S2", true));
assertEquals(-Long.MAX_VALUE, decodeBase90("im^ldBVL7)", true));
assertEquals(89, decodeBase90("!!!!!!!!!~", true));
assertEquals(8099, decodeBase90("!!!!!!!!~~", true));
assertEquals(12345, decodeBase90("!!!!!!!#S2", true));
assertEquals(Long.MAX_VALUE, decodeBase90(":m^ldBVL7)", true));
assertEquals(0, decodeBase90("!!!!!!!!!!", true));
}
@Test
public void shouldDecodeBase90UnsignedCorrectly() {
assertEquals(90, decodeBase90("#!", false));
assertEquals(89, decodeBase90("~", false));
assertEquals(0, decodeBase90("!", false));
assertEquals(1, decodeBase90("#", false));
assertEquals(8100, decodeBase90("#!!", false));
assertEquals(8099, decodeBase90("~~", false));
assertEquals(12345, decodeBase90("#S2", false));
}
@Test
public void shouldEncodeBytes() {
assertEquals("6ISXAu6*VX'", CookieSafeBase90.encodeBytesBase90("hello".getBytes()));
assertEquals("hello", new String(decodeBytesBase90("6ISXAu6*VX'")));
assertTrue(stringEncodesAndDecodesToItself("x˚xkrf˚"));
assertTrue(stringEncodesAndDecodesToItself("hello"));
assertTrue(stringEncodesAndDecodesToItself("काचं शक्नोम्यत्तुम्"));
assertTrue(stringEncodesAndDecodesToItself("Μπορῶ νὰ φάω σπασμένα γυαλιὰ χωρὶς νὰ πάθω τίποτα."));
assertTrue(stringEncodesAndDecodesToItself("ᚅᚔᚉᚉ"));
assertTrue(stringEncodesAndDecodesToItself("ᚷᛚᚨᛋ᛫ᛖᚩᛏᚪᚾ᛫ᚩᚾᛞ᛫ᚻᛁᛏ᛫ᚾᛖ᛫ᚻᛖᚪᚱᛗᛁᚪᚧ᛫ᛗᛖ᛬"));
assertTrue(stringEncodesAndDecodesToItself("నేను గాజు తినగలను మరియు"));
assertTrue(stringEncodesAndDecodesToItself("ฉันกินกระจกได้ แต่มันไม่ทำให้ฉันเจ็บ"));
assertTrue(stringEncodesAndDecodesToItself("我能吞下玻璃而不傷身體"));
assertTrue(stringEncodesAndDecodesToItself("أنا قادر على أكل الزجاج و هذا لا يؤلمني."));
assertTrue(stringEncodesAndDecodesToItself("אני יכול לאכול זכוכית וזה לא מזיק לי."));
assertTrue(stringEncodesAndDecodesToItself("איך קען עסן גלאָז און עס טוט מיר נישט װײ."));
assertTrue(stringEncodesAndDecodesToItself("色は匂へど 散りぬるを"));
}
private boolean stringEncodesAndDecodesToItself(String s) {
String encoded = encodeBytesBase90(s.getBytes());
String decoded = new String(decodeBytesBase90(encoded));
return decoded.equals(s);
}
}