1   package com.atlassian.seraph.util;
2   
3   import junit.framework.TestCase;
4   
5   import java.util.Arrays;
6   
7   public class TestEncryptionUtils extends TestCase
8   {
9       private static final char[] PAGE_0_ENCODED_VALUES = new char[]{ 'A', 'B', 'C', 'D', 'E', 'F', 'a', 'b', 'c', 'd', 'e', 'f' };
10      private static final char[] PAGE_1_ENCODED_VALUES = new char[]{ 'G', 'H', 'I', 'J', 'K', 'L', 'g', 'h', 'i', 'j', 'k', 'l' };
11      private static final char[] PAGE_2_ENCODED_VALUES = new char[]{ 'M', 'N', 'O', 'P', 'Q', 'R', 'm', 'n', 'o', 'p', 'q', 'r' };
12      private static final char[] PAGE_3_ENCODED_VALUES = new char[]{ 'S', 'T', 'U', 'V', 'W', 'X', 's', 't', 'u', 'v', 'w', 'x' };
13  
14      public void testDecodeOffset()
15      {
16          assertEquals(0, (int) EncryptionUtils.decodeOffset('0'));
17          assertEquals(1, (int) EncryptionUtils.decodeOffset('1'));
18          assertEquals(10, (int) EncryptionUtils.decodeOffset('A'));
19          assertEquals(35, (int) EncryptionUtils.decodeOffset('Z'));
20          assertEquals(42, (int) EncryptionUtils.decodeOffset('g'));
21          assertEquals(61, (int) EncryptionUtils.decodeOffset('z'));
22          assertEquals(62, (int) EncryptionUtils.decodeOffset('<'));
23          assertEquals(63, (int) EncryptionUtils.decodeOffset('>'));
24          assertEquals(2, (int) EncryptionUtils.decodeOffset('!'));
25          assertEquals(2, (int) EncryptionUtils.decodeOffset('\u2042'));
26          assertEquals(2, (int) EncryptionUtils.decodeOffset('\0'));
27      }
28  
29      public void testEncodeOffset()
30      {
31          assertEquals('0', EncryptionUtils.encodeOffset(0));
32          assertEquals('1', EncryptionUtils.encodeOffset(1));
33          assertEquals('9', EncryptionUtils.encodeOffset(9));
34          assertEquals('A', EncryptionUtils.encodeOffset(10));
35          assertEquals('Z', EncryptionUtils.encodeOffset(35));
36          assertEquals('g', EncryptionUtils.encodeOffset(42));
37          assertEquals('z', EncryptionUtils.encodeOffset(61));
38          assertEquals('<', EncryptionUtils.encodeOffset(62));
39          assertEquals('>', EncryptionUtils.encodeOffset(63));
40          assertEquals('\0', EncryptionUtils.encodeOffset(64));
41          assertEquals('\0', EncryptionUtils.encodeOffset(2042));
42      }
43  
44      public void testEncodePageNumber()
45      {
46          char encoded = EncryptionUtils.encodePageNumber(0);
47          assertTrue(encoded + " should be one of " + String.valueOf(PAGE_0_ENCODED_VALUES),
48              Arrays.binarySearch(PAGE_0_ENCODED_VALUES, encoded) >= 0);
49  
50          encoded = EncryptionUtils.encodePageNumber(1);
51          assertTrue(encoded + " should be one of " + String.valueOf(PAGE_1_ENCODED_VALUES),
52              Arrays.binarySearch(PAGE_1_ENCODED_VALUES, encoded) >= 0);
53  
54          encoded = EncryptionUtils.encodePageNumber(2);
55          assertTrue(encoded + " should be one of " + String.valueOf(PAGE_2_ENCODED_VALUES),
56              Arrays.binarySearch(PAGE_2_ENCODED_VALUES, encoded) >= 0);
57  
58          encoded = EncryptionUtils.encodePageNumber(3);
59          assertTrue(encoded + " should be one of " + String.valueOf(PAGE_3_ENCODED_VALUES),
60              Arrays.binarySearch(PAGE_3_ENCODED_VALUES, encoded) >= 0);
61      }
62  
63      public void testEncodePage0()
64      {
65          String encoded = EncryptionUtils.encode(new byte[]{-128});
66          assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_0_ENCODED_VALUES),
67              Arrays.binarySearch(PAGE_0_ENCODED_VALUES, encoded.charAt(0)) >= 0);
68          assertEquals("0", encoded.substring(1));
69  
70          encoded = EncryptionUtils.encode(new byte[]{-86});
71          assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_0_ENCODED_VALUES),
72              Arrays.binarySearch(PAGE_0_ENCODED_VALUES, encoded.charAt(0)) >= 0);
73          assertEquals("g", encoded.substring(1));
74  
75          encoded = EncryptionUtils.encode(new byte[]{-65});
76          assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_0_ENCODED_VALUES),
77              Arrays.binarySearch(PAGE_0_ENCODED_VALUES, encoded.charAt(0)) >= 0);
78          assertEquals(">", encoded.substring(1));
79      }
80  
81      public void testEncodePage1()
82      {
83          String encoded = EncryptionUtils.encode(new byte[]{-64});
84          assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_1_ENCODED_VALUES),
85              Arrays.binarySearch(PAGE_1_ENCODED_VALUES, encoded.charAt(0)) >= 0);
86          assertEquals("0", encoded.substring(1));
87  
88          encoded = EncryptionUtils.encode(new byte[]{-22});
89          assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_1_ENCODED_VALUES),
90              Arrays.binarySearch(PAGE_1_ENCODED_VALUES, encoded.charAt(0)) >= 0);
91          assertEquals("g", encoded.substring(1));
92  
93          encoded = EncryptionUtils.encode(new byte[]{-1});
94          assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_1_ENCODED_VALUES),
95              Arrays.binarySearch(PAGE_1_ENCODED_VALUES, encoded.charAt(0)) >= 0);
96          assertEquals(">", encoded.substring(1));
97      }
98  
99      public void testEncodePage2()
100     {
101         String encoded = EncryptionUtils.encode(new byte[]{0});
102         assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_2_ENCODED_VALUES),
103             Arrays.binarySearch(PAGE_2_ENCODED_VALUES, encoded.charAt(0)) >= 0);
104         assertEquals("0", encoded.substring(1));
105 
106         encoded = EncryptionUtils.encode(new byte[]{10});
107         assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_2_ENCODED_VALUES),
108             Arrays.binarySearch(PAGE_2_ENCODED_VALUES, encoded.charAt(0)) >= 0);
109         assertEquals("A", encoded.substring(1));
110 
111         encoded = EncryptionUtils.encode(new byte[]{35});
112         assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_2_ENCODED_VALUES),
113             Arrays.binarySearch(PAGE_2_ENCODED_VALUES, encoded.charAt(0)) >= 0);
114         assertEquals("Z", encoded.substring(1));
115 
116         encoded = EncryptionUtils.encode(new byte[]{42});
117         assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_2_ENCODED_VALUES),
118             Arrays.binarySearch(PAGE_2_ENCODED_VALUES, encoded.charAt(0)) >= 0);
119         assertEquals("g", encoded.substring(1));
120 
121         encoded = EncryptionUtils.encode(new byte[]{63});
122         assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_2_ENCODED_VALUES),
123             Arrays.binarySearch(PAGE_2_ENCODED_VALUES, encoded.charAt(0)) >= 0);
124         assertEquals(">", encoded.substring(1));
125     }
126 
127     public void testEncodePage3()
128     {
129         String encoded = EncryptionUtils.encode(new byte[]{64});
130         assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_3_ENCODED_VALUES),
131             Arrays.binarySearch(PAGE_3_ENCODED_VALUES, encoded.charAt(0)) >= 0);
132         assertEquals("0", encoded.substring(1));
133 
134         encoded = EncryptionUtils.encode(new byte[]{74});
135         assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_3_ENCODED_VALUES),
136             Arrays.binarySearch(PAGE_3_ENCODED_VALUES, encoded.charAt(0)) >= 0);
137         assertEquals("A", encoded.substring(1));
138 
139         encoded = EncryptionUtils.encode(new byte[]{99});
140         assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_3_ENCODED_VALUES),
141             Arrays.binarySearch(PAGE_3_ENCODED_VALUES, encoded.charAt(0)) >= 0);
142         assertEquals("Z", encoded.substring(1));
143 
144         encoded = EncryptionUtils.encode(new byte[]{106});
145         assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_3_ENCODED_VALUES),
146             Arrays.binarySearch(PAGE_3_ENCODED_VALUES, encoded.charAt(0)) >= 0);
147         assertEquals("g", encoded.substring(1));
148 
149         encoded = EncryptionUtils.encode(new byte[]{127});
150         assertTrue(encoded.charAt(0) + " should be one of " + String.valueOf(PAGE_3_ENCODED_VALUES),
151             Arrays.binarySearch(PAGE_3_ENCODED_VALUES, encoded.charAt(0)) >= 0);
152         assertEquals(">", encoded.substring(1));
153     }
154 
155     public void testEncodeMultipleBytes()
156     {
157         String encoded = EncryptionUtils.encode(new byte[]{1, 2, 3, 4});
158         assertEquals(8, encoded.length());
159         assertEquals("1234", encoded.substring(4)); // ignoring encoded page numbers
160 
161         encoded = EncryptionUtils.encode(new byte[]{42, 6, 63, 96, 9});
162         assertEquals(10, encoded.length());
163         assertEquals("g6>W9", encoded.substring(5)); // ignoring encoded page numbers
164     }
165 
166     public void testDecode()
167     {
168         byte[] decoded = EncryptionUtils.decode("AGinSuZpVmW0>7W<qr#2");
169         assertEquals(10, decoded.length);
170         assertEquals(-96, decoded[0]); // 'A' = page 0, 'W' = offset 32
171         assertEquals(-64, decoded[1]); // 'G' = page 1, '0' = offset 0
172         assertEquals(-1, decoded[2]); // 'i' = page 1, '>' = offset 63
173         assertEquals(7, decoded[3]); // 'n' = page 2, '7' = offset 7
174         assertEquals(96, decoded[4]); // 'S' = page 3, 'W' = offset 32
175         assertEquals(126, decoded[5]); // 'u' = page 3, '<' = offset 62
176         assertEquals(0, decoded[6]); // 'Z' = invalid encoded page number, returns zero byte
177         assertEquals(53, decoded[7]); // 'p' = page 2, 'r' = offset 53
178         assertEquals(66, decoded[8]); // 'V' = page 3, '#' = invalid encoded offset, uses 2 as default offset
179         assertEquals(2, decoded[9]); // 'm' = page 2, '2' = offset 2
180     }
181 }