package org.altbeacon.beacon.utils;
import java.net.MalformedURLException;
import java.util.Arrays;
import org.junit.Test;
import org.robolectric.RobolectricTestRunner;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
@Config(sdk = 18)
@RunWith(RobolectricTestRunner.class)
public class UrlBeaconUrlCompressorTest {
final protected static char[] hexArray = "0123456789ABCDEF" .toCharArray();
/**
* URLs to test:
* <p/>
* http://www.radiusnetworks.com
* https://www.radiusnetworks.com
* http://radiusnetworks.com
* https://radiusnetworks.com
* https://radiusnetworks.com/
* https://radiusnetworks.com/v1/index.html
* https://api.v1.radiusnetworks.com
* https://www.api.v1.radiusnetworks.com
*/
@Test
public void testCompressURL() throws MalformedURLException {
String testURL = "http://www.radiusnetworks.com";
byte[] expectedBytes = {0x00, 'r', 'a', 'd', 'i', 'u', 's', 'n', 'e', 't', 'w', 'o', 'r', 'k', 's', 0x07};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressHttpsURL() throws MalformedURLException {
String testURL = "https://www.radiusnetworks.com";
byte[] expectedBytes = {0x01, 'r', 'a', 'd', 'i', 'u', 's', 'n', 'e', 't', 'w', 'o', 'r', 'k', 's', 0x07};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressWithTrailingSlash() throws MalformedURLException {
String testURL = "http://google.com/123";
byte[] expectedBytes = {0x02, 'g', 'o', 'o', 'g', 'l', 'e', 0x00, '1', '2', '3'};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressWithoutTLD() throws MalformedURLException {
String testURL = "http://xxx";
byte[] expectedBytes = {0x02, 'x', 'x', 'x'};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressWithSubdomains() throws MalformedURLException {
String testURL = "http://www.forums.google.com";
byte[] expectedBytes = {0x00, 'f', 'o', 'r', 'u', 'm', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', 0x07};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressWithSubdomainsWithTrailingSlash() throws MalformedURLException {
String testURL = "http://www.forums.google.com/";
byte[] expectedBytes = {0x00, 'f', 'o', 'r', 'u', 'm', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', 0x00};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressWithMoreSubdomains() throws MalformedURLException {
String testURL = "http://www.forums.developer.google.com/123";
byte[] expectedBytes = {0x00, 'f', 'o', 'r', 'u', 'm', 's', '.', 'd', 'e', 'v', 'e', 'l', 'o', 'p', 'e', 'r', '.', 'g', 'o', 'o', 'g', 'l', 'e', 0x00, '1', '2', '3'};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressWithSubdomainsAndSlashesInPath() throws MalformedURLException {
String testURL = "http://www.forums.google.com/123/456";
byte[] expectedBytes = {0x00, 'f', 'o', 'r', 'u', 'm', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', 0x00, '1', '2', '3', '/', '4', '5', '6'};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressWithDotCaTLD() throws MalformedURLException {
String testURL = "http://google.ca";
byte[] expectedBytes = {0x02, 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'a'};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressWithDotInfoTLD() throws MalformedURLException {
String testURL = "http://google.info";
byte[] expectedBytes = {0x02, 'g', 'o', 'o', 'g', 'l', 'e', 0x0b};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressWithDotCaTLDWithSlash() throws MalformedURLException {
String testURL = "http://google.ca/";
byte[] expectedBytes = {0x02, 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'a', '/'};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressWithDotCoTLD() throws MalformedURLException {
String testURL = "http://google.co";
byte[] expectedBytes = {0x02, 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o'};
String hexBytes = bytesToHex(UrlBeaconUrlCompressor.compress(testURL));
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressWithShortenedURLContainingCaps() throws MalformedURLException {
String testURL = "http://goo.gl/C2HC48";
byte[] expectedBytes = {0x02, 'g', 'o', 'o', '.', 'g', 'l', '/', 'C', '2', 'H', 'C', '4', '8'};
String hexBytes = bytesToHex(UrlBeaconUrlCompressor.compress(testURL));
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressWithSchemeInCaps() throws MalformedURLException {
String testURL = "HTTP://goo.gl/C2HC48";
byte[] expectedBytes = {0x02, 'g', 'o', 'o', '.', 'g', 'l', '/', 'C', '2', 'H', 'C', '4', '8'};
String hexBytes = bytesToHex(UrlBeaconUrlCompressor.compress(testURL));
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressWithDomainInCaps() throws MalformedURLException {
String testURL = "http://GOO.GL/C2HC48";
byte[] expectedBytes = {0x02, 'g', 'o', 'o', '.', 'g', 'l', '/', 'C', '2', 'H', 'C', '4', '8'};
String hexBytes = bytesToHex(UrlBeaconUrlCompressor.compress(testURL));
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressHttpsAndWWWInCaps() throws MalformedURLException {
String testURL = "HTTPS://WWW.radiusnetworks.com";
byte[] expectedBytes = {0x01, 'r', 'a', 'd', 'i', 'u', 's', 'n', 'e', 't', 'w', 'o', 'r', 'k', 's', 0x07};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressEntireURLInCaps() throws MalformedURLException {
String testURL = "HTTPS://WWW.RADIUSNETWORKS.COM";
byte[] expectedBytes = {0x01, 'r', 'a', 'd', 'i', 'u', 's', 'n', 'e', 't', 'w', 'o', 'r', 'k', 's', 0x07};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testCompressEntireURLInCapsWithPath() throws MalformedURLException {
String testURL = "HTTPS://WWW.RADIUSNETWORKS.COM/C2HC48";
byte[] expectedBytes = {0x01, 'r', 'a', 'd', 'i', 'u', 's', 'n', 'e', 't', 'w', 'o', 'r', 'k', 's', 0x00, 'C', '2', 'H', 'C', '4', '8'};
assertTrue(Arrays.equals(expectedBytes, UrlBeaconUrlCompressor.compress(testURL)));
}
@Test
public void testDecompressWithDotCoTLD() {
String testURL = "http://google.co";
byte[] testBytes = {0x02, 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o'};
assertEquals(testURL, UrlBeaconUrlCompressor.uncompress(testBytes));
}
@Test
public void testDecompressWithPath() {
String testURL = "http://google.com/123";
byte[] testBytes = {0x02, 'g', 'o', 'o', 'g', 'l', 'e', 0x00, '1', '2', '3'};
assertEquals(testURL, UrlBeaconUrlCompressor.uncompress(testBytes));
}
@Test
public void testUncompressHttpsURL() {
String testURL = "https://www.radiusnetworks.com";
byte[] testBytes = {0x01, 'r', 'a', 'd', 'i', 'u', 's', 'n', 'e', 't', 'w', 'o', 'r', 'k', 's', 0x07};
assertEquals(testURL, UrlBeaconUrlCompressor.uncompress(testBytes));
}
@Test
public void testUncompressHttpsURLWithTrailingSlash() {
String testURL = "https://www.radiusnetworks.com/";
byte[] testBytes = {0x01, 'r', 'a', 'd', 'i', 'u', 's', 'n', 'e', 't', 'w', 'o', 'r', 'k', 's', 0x00};
assertEquals(testURL, UrlBeaconUrlCompressor.uncompress(testBytes));
}
@Test
public void testUncompressWithoutTLD() throws MalformedURLException {
String testURL = "http://xxx";
byte[] testBytes = {0x02, 'x', 'x', 'x'};
assertEquals(testURL, UrlBeaconUrlCompressor.uncompress(testBytes));
}
@Test
public void testUncompressWithSubdomains() throws MalformedURLException {
String testURL = "http://www.forums.google.com";
byte[] testBytes = {0x00, 'f', 'o', 'r', 'u', 'm', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', 0x07};
assertEquals(testURL, UrlBeaconUrlCompressor.uncompress(testBytes));
}
@Test
public void testUncompressWithSubdomainsAndTrailingSlash() throws MalformedURLException {
String testURL = "http://www.forums.google.com/";
byte[] testBytes = {0x00, 'f', 'o', 'r', 'u', 'm', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', 0x00};
assertEquals(testURL, UrlBeaconUrlCompressor.uncompress(testBytes));
}
@Test
public void testUncompressWithSubdomainsAndSlashesInPath() throws MalformedURLException {
String testURL = "http://www.forums.google.com/123/456";
byte[] testBytes = {0x00, 'f', 'o', 'r', 'u', 'm', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', 0x00, '1', '2', '3', '/', '4', '5', '6'};
assertEquals(testURL, UrlBeaconUrlCompressor.uncompress(testBytes));
}
@Test
public void testUncompressWithDotInfoTLD() throws MalformedURLException {
String testURL = "http://google.info";
byte[] testBytes = {0x02, 'g', 'o', 'o', 'g', 'l', 'e', 0x0b};
assertEquals(testURL, UrlBeaconUrlCompressor.uncompress(testBytes));
}
private static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
}