From 71d8fb20832dd36454b80d1fa3383f56eaac4128 Mon Sep 17 00:00:00 2001
From: akwizgran <michael@briarproject.org>
Date: Fri, 10 May 2019 15:33:19 +0100
Subject: [PATCH] Add unit tests for Base32 encoding and decoding.

---
 .../briarproject/bramble/util/Base32Test.java | 71 +++++++++++++++++++
 1 file changed, 71 insertions(+)
 create mode 100644 bramble-core/src/test/java/org/briarproject/bramble/util/Base32Test.java

diff --git a/bramble-core/src/test/java/org/briarproject/bramble/util/Base32Test.java b/bramble-core/src/test/java/org/briarproject/bramble/util/Base32Test.java
new file mode 100644
index 0000000000..41b5824e4a
--- /dev/null
+++ b/bramble-core/src/test/java/org/briarproject/bramble/util/Base32Test.java
@@ -0,0 +1,71 @@
+package org.briarproject.bramble.util;
+
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.junit.Test;
+
+import java.util.Random;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+public class Base32Test extends BrambleTestCase {
+
+	// Test vectors from RFC 4648
+	// https://tools.ietf.org/html/rfc4648#section-10
+
+	@Test
+	public void testEncoding() {
+		assertEquals("", Base32.encode(new byte[0]));
+		assertEquals("MY", Base32.encode(new byte[] {'f'}));
+		assertEquals("MZXQ", Base32.encode(new byte[] {'f', 'o'}));
+		assertEquals("MZXW6", Base32.encode(new byte[] {'f', 'o', 'o'}));
+		assertEquals("MZXW6YQ", Base32.encode(new byte[] {'f', 'o', 'o', 'b'}));
+		assertEquals("MZXW6YTB",
+				Base32.encode(new byte[] {'f', 'o', 'o', 'b', 'a'}));
+		assertEquals("MZXW6YTBOI",
+				Base32.encode(new byte[] {'f', 'o', 'o', 'b', 'a', 'r'}));
+	}
+
+	@Test
+	public void testStrictDecoding() {
+		testDecoding(true);
+	}
+
+	@Test
+	public void testNonStrictDecoding() {
+		testDecoding(false);
+	}
+
+	private void testDecoding(boolean strict) {
+		assertArrayEquals(new byte[0], Base32.decode("", strict));
+		assertArrayEquals(new byte[] {'f'}, Base32.decode("MY", strict));
+		assertArrayEquals(new byte[] {'f', 'o'}, Base32.decode("MZXQ", strict));
+		assertArrayEquals(new byte[] {'f', 'o', 'o'},
+				Base32.decode("MZXW6", strict));
+		assertArrayEquals(new byte[] {'f', 'o', 'o', 'b'},
+				Base32.decode("MZXW6YQ", strict));
+		assertArrayEquals(new byte[] {'f', 'o', 'o', 'b', 'a'},
+				Base32.decode("MZXW6YTB", strict));
+		assertArrayEquals(new byte[] {'f', 'o', 'o', 'b', 'a', 'r'},
+				Base32.decode("MZXW6YTBOI", strict));
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testStrictDecodingRejectsNonZeroUnusedBits() {
+		Base32.decode("MZ", true);
+	}
+
+	@Test
+	public void testNonStrictDecodingAcceptsNonZeroUnusedBits() {
+		assertArrayEquals(new byte[] {'f'}, Base32.decode("MZ", false));
+	}
+
+	@Test
+	public void testRoundTrip() {
+		Random random = new Random();
+		byte[] data = new byte[100 + random.nextInt(100)];
+		random.nextBytes(data);
+		assertArrayEquals(data, Base32.decode(Base32.encode(data), true));
+		assertArrayEquals(data, Base32.decode(Base32.encode(data), false));
+	}
+}
-- 
GitLab