12ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller/*
22ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller * Copyright (C) 2015 The Android Open Source Project
32ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller *
42ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller * Licensed under the Apache License, Version 2.0 (the "License");
52ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller * you may not use this file except in compliance with the License.
62ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller * You may obtain a copy of the License at
72ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller *
82ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller *      http://www.apache.org/licenses/LICENSE-2.0
92ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller *
102ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller * Unless required by applicable law or agreed to in writing, software
112ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller * distributed under the License is distributed on an "AS IS" BASIS,
122ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller * See the License for the specific language governing permissions and
142ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller * limitations under the License.
152ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller */
162ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
172ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerpackage libcore.io;
182ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
192ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport junit.framework.TestCase;
202ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
212ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport java.io.File;
222ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport java.io.FileNotFoundException;
232ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport java.io.IOException;
242ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport java.net.JarURLConnection;
252ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport java.net.MalformedURLException;
262ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport java.net.URL;
272ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport java.net.URLConnection;
282ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport java.net.URLStreamHandler;
292ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport java.net.UnknownServiceException;
302ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport java.util.Arrays;
312ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
322ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport tests.support.resource.Support_Resources;
332ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
342ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerpublic class ClassPathURLStreamHandlerTest extends TestCase {
352ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
362ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    // A well formed jar file with 6 entries.
372ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    private static final String JAR = "ClassPathURLStreamHandlerTest.jar";
382ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    private static final String ENTRY_IN_ROOT = "root.txt";
397cd7527ab01b87fced3855e5ed91dbaab708b017Neil Fuller    private static final String DIR_ENTRY_WITHOUT_SLASH = "foo";
407cd7527ab01b87fced3855e5ed91dbaab708b017Neil Fuller    private static final String DIR_ENTRY_WITH_SLASH = DIR_ENTRY_WITHOUT_SLASH + "/";
412ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    private static final String ENTRY_IN_SUBDIR = "foo/bar/baz.txt";
42384730cb57f41235f09829355d7ce67132625f7fDmitriy Ivanov    private static final String ENTRY_STORED = "stored_file.txt";
432ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    private static final String ENTRY_WITH_SPACES_ENCODED = "file%20with%20spaces.txt";
442ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    private static final String ENTRY_WITH_SPACES_UNENCODED = "file with spaces.txt";
452ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    private static final String ENTRY_THAT_NEEDS_ESCAPING = "file_with_percent20_%20.txt";
46f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin    private static final String ENTRY_THAT_NEEDS_ESCAPING_ENCODED = "file_with_percent20_%2520.txt";
472ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    private static final String ENTRY_WITH_RELATIVE_PATH = "foo/../foo/bar/baz.txt";
482ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    private static final String MISSING_ENTRY = "Wrong.resource";
492ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
502ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    private File jarFile;
512ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
522ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    @Override
53bb6fd10cd951d0151e4b97c83cb4b8a884de616eNeil Fuller    protected void setUp() throws Exception {
54bb6fd10cd951d0151e4b97c83cb4b8a884de616eNeil Fuller        File resources = Support_Resources.createTempFolder().getCanonicalFile();
552ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        Support_Resources.copyFile(resources, null, JAR);
562ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        jarFile = new File(resources, JAR);
572ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    }
582ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
592ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    public void testConstructor() throws Exception {
602ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        try {
612ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller            ClassPathURLStreamHandler streamHandler = new ClassPathURLStreamHandler("Missing.file");
622ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller            fail("Should throw IOException");
632ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        } catch (IOException expected) {
642ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        }
652ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
66bb6fd10cd951d0151e4b97c83cb4b8a884de616eNeil Fuller        String fileName = jarFile.getPath();
672ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        ClassPathURLStreamHandler streamHandler = new ClassPathURLStreamHandler(fileName);
682ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        streamHandler.close();
692ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    }
702ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
712ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    public void testGetEntryOrNull() throws Exception {
72bb6fd10cd951d0151e4b97c83cb4b8a884de616eNeil Fuller        String fileName = jarFile.getPath();
732ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        ClassPathURLStreamHandler streamHandler = new ClassPathURLStreamHandler(fileName);
742ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
75f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin        checkGetEntryUrlOrNull(streamHandler, ENTRY_IN_ROOT, ENTRY_IN_ROOT);
76f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin        checkGetEntryUrlOrNull(streamHandler, ENTRY_IN_SUBDIR, ENTRY_IN_SUBDIR);
77f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin        checkGetEntryUrlOrNull(streamHandler, ENTRY_WITH_SPACES_UNENCODED,
78f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin                ENTRY_WITH_SPACES_ENCODED);
79f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin        checkGetEntryUrlOrNull(streamHandler, ENTRY_THAT_NEEDS_ESCAPING,
80f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin                ENTRY_THAT_NEEDS_ESCAPING_ENCODED);
812ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
827cd7527ab01b87fced3855e5ed91dbaab708b017Neil Fuller        // getEntryOrNull() performs a lookup with and without trailing slash to handle directories.
837cd7527ab01b87fced3855e5ed91dbaab708b017Neil Fuller        // http://b/22527772
84f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin        checkGetEntryUrlOrNull(streamHandler, DIR_ENTRY_WITHOUT_SLASH,
85f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin                DIR_ENTRY_WITHOUT_SLASH);
86f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin        checkGetEntryUrlOrNull(streamHandler, DIR_ENTRY_WITH_SLASH, DIR_ENTRY_WITH_SLASH);
877cd7527ab01b87fced3855e5ed91dbaab708b017Neil Fuller
882ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertNull(streamHandler.getEntryUrlOrNull(MISSING_ENTRY));
892ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertNull(streamHandler.getEntryUrlOrNull("/" + ENTRY_IN_ROOT));
902ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertNull(streamHandler.getEntryUrlOrNull("/" + ENTRY_IN_SUBDIR));
912ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertNull(streamHandler.getEntryUrlOrNull(ENTRY_WITH_SPACES_ENCODED));
922ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertNull(streamHandler.getEntryUrlOrNull(ENTRY_WITH_RELATIVE_PATH));
937cd7527ab01b87fced3855e5ed91dbaab708b017Neil Fuller        assertNull(streamHandler.getEntryUrlOrNull("/" + DIR_ENTRY_WITHOUT_SLASH));
947cd7527ab01b87fced3855e5ed91dbaab708b017Neil Fuller        assertNull(streamHandler.getEntryUrlOrNull("/" + DIR_ENTRY_WITH_SLASH));
952ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        streamHandler.close();
962ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    }
972ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
98f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin    /**
99f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin     * Check that the call to {@link ClassPathURLStreamHandler#getEntryUrlOrNull(String)} works as
100f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin     * expected.
101f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin     */
102f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin    private void checkGetEntryUrlOrNull(ClassPathURLStreamHandler streamHandler,
103f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin            String entryName, String expectedJarRelativeURI) throws IOException {
104f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin
105f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin        String fileName = jarFile.getPath();
106f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin        URL urlOrNull = streamHandler.getEntryUrlOrNull(entryName);
107f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin        assertNotNull("URL was unexpectedly null for " + entryName, urlOrNull);
108f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin        assertEquals("jar:file:" + fileName + "!/" + expectedJarRelativeURI,
109f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin                urlOrNull.toExternalForm());
110f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin
111f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin        // Make sure that the resource could be opened and the correct contents returned, i.e. the
112f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin        // same as those read from the jar file directly.
113f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin        assertOpenConnectionOk(jarFile, expectedJarRelativeURI, streamHandler);
114f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin    }
115f3fbc0510838d010dd065cc4b19dfff72043eddaPaul Duffin
116384730cb57f41235f09829355d7ce67132625f7fDmitriy Ivanov    public void testIsEntryStored() throws IOException {
117bb6fd10cd951d0151e4b97c83cb4b8a884de616eNeil Fuller        String fileName = jarFile.getPath();
118384730cb57f41235f09829355d7ce67132625f7fDmitriy Ivanov        ClassPathURLStreamHandler streamHandler = new ClassPathURLStreamHandler(fileName);
119384730cb57f41235f09829355d7ce67132625f7fDmitriy Ivanov
120384730cb57f41235f09829355d7ce67132625f7fDmitriy Ivanov        assertFalse(streamHandler.isEntryStored("this/file/does/not/exist.txt"));
121384730cb57f41235f09829355d7ce67132625f7fDmitriy Ivanov        // This one is compressed
122384730cb57f41235f09829355d7ce67132625f7fDmitriy Ivanov        assertFalse(streamHandler.isEntryStored(ENTRY_IN_SUBDIR));
123384730cb57f41235f09829355d7ce67132625f7fDmitriy Ivanov        assertTrue(streamHandler.isEntryStored(ENTRY_STORED));
1247cd7527ab01b87fced3855e5ed91dbaab708b017Neil Fuller
125e8e4da2f84da30bbc11a63b7a87a153f62b1ce65Przemyslaw Szczepaniak        assertTrue(streamHandler.isEntryStored(DIR_ENTRY_WITHOUT_SLASH));
126e8e4da2f84da30bbc11a63b7a87a153f62b1ce65Przemyslaw Szczepaniak
1277cd7527ab01b87fced3855e5ed91dbaab708b017Neil Fuller        // Directory entries are just stored, empty entries with "/" on the end of the name, so
1287cd7527ab01b87fced3855e5ed91dbaab708b017Neil Fuller        // "true".
1297cd7527ab01b87fced3855e5ed91dbaab708b017Neil Fuller        assertTrue(streamHandler.isEntryStored(DIR_ENTRY_WITH_SLASH));
130384730cb57f41235f09829355d7ce67132625f7fDmitriy Ivanov    }
131384730cb57f41235f09829355d7ce67132625f7fDmitriy Ivanov
1322ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    public void testOpenConnection() throws Exception {
133bb6fd10cd951d0151e4b97c83cb4b8a884de616eNeil Fuller        String fileName = jarFile.getPath();
1342ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        ClassPathURLStreamHandler streamHandler = new ClassPathURLStreamHandler(fileName);
1352ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
1362ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertOpenConnectionOk(jarFile, ENTRY_IN_ROOT, streamHandler);
1372ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertOpenConnectionOk(jarFile, ENTRY_IN_SUBDIR, streamHandler);
1382ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertOpenConnectionOk(jarFile, ENTRY_WITH_SPACES_ENCODED, streamHandler);
1392ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertOpenConnectionOk(jarFile, ENTRY_WITH_SPACES_UNENCODED, streamHandler);
1407cd7527ab01b87fced3855e5ed91dbaab708b017Neil Fuller        assertOpenConnectionOk(jarFile, DIR_ENTRY_WITH_SLASH, streamHandler);
1417cd7527ab01b87fced3855e5ed91dbaab708b017Neil Fuller        assertOpenConnectionOk(jarFile, DIR_ENTRY_WITHOUT_SLASH, streamHandler);
1422ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
1432ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertOpenConnectionConnectFails(jarFile, ENTRY_WITH_RELATIVE_PATH, streamHandler);
1442ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertOpenConnectionConnectFails(jarFile, MISSING_ENTRY, streamHandler);
1452ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertOpenConnectionConnectFails(jarFile, ENTRY_THAT_NEEDS_ESCAPING, streamHandler);
1462ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
1472ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        streamHandler.close();
1482ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    }
1492ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
1502ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    private void assertOpenConnectionConnectFails(
1512ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller            File jarFile, String entryName, URLStreamHandler streamHandler) throws IOException {
1522ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
1532ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        URL standardUrl = createJarUrl(jarFile, entryName, null /* use default stream handler */);
1542ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        try {
1552ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller            standardUrl.openConnection().connect();
1562ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller            fail();
1572ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        } catch (FileNotFoundException expected) {
1582ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        }
1592ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
1602ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        URL actualUrl = createJarUrl(jarFile, entryName, streamHandler);
1612ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        try {
1622ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller            actualUrl.openConnection().connect();
1632ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller            fail();
1642ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        } catch (FileNotFoundException expected) {
1652ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        }
1662ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    }
1672ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
1682ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    private static void assertOpenConnectionOk(File jarFile, String entryName,
1692ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller            ClassPathURLStreamHandler streamHandler) throws IOException {
1702ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        URL standardUrl = createJarUrl(jarFile, entryName, null /* use default stream handler */);
1712ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        URLConnection standardUrlConnection = standardUrl.openConnection();
1722ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertNotNull(standardUrlConnection);
1732ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
1742ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        URL actualUrl = createJarUrl(jarFile, entryName, streamHandler);
1752ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        URLConnection actualUrlConnection = actualUrl.openConnection();
1762ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertNotNull(actualUrlConnection);
1772ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertBehaviorSame(standardUrlConnection, actualUrlConnection);
1782ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    }
1792ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
1802ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    private static void assertBehaviorSame(URLConnection standardURLConnection,
1812ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller            URLConnection actualUrlConnection) throws IOException {
1822ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
1832ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        JarURLConnection standardJarUrlConnection = (JarURLConnection) standardURLConnection;
1842ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        JarURLConnection actualJarUrlConnection = (JarURLConnection) actualUrlConnection;
1852ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
1862ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        byte[] actualBytes = Streams.readFully(actualJarUrlConnection.getInputStream());
1872ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        byte[] standardBytes = Streams.readFully(standardJarUrlConnection.getInputStream());
1882ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertEquals(Arrays.toString(standardBytes), Arrays.toString(actualBytes));
1892ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
1902ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        try {
1912ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller            actualJarUrlConnection.getOutputStream();
1922ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller            fail();
1932ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        } catch (UnknownServiceException expected) {
1942ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        }
1952ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
1962ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertEquals(
1972ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller                standardJarUrlConnection.getJarFile().getName(),
1982ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller                actualJarUrlConnection.getJarFile().getName());
1992ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
2002ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertEquals(
2012ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller                standardJarUrlConnection.getJarEntry().getName(),
2022ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller                actualJarUrlConnection.getJarEntry().getName());
2032ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
2042ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertEquals(
2052ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller                standardJarUrlConnection.getJarFileURL(),
2062ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller                actualJarUrlConnection.getJarFileURL());
2072ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
2082ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertEquals(
2092ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller                standardJarUrlConnection.getContentType(),
2102ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller                actualJarUrlConnection.getContentType());
2112ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
2122ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        assertEquals(
2132ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller                standardJarUrlConnection.getContentLength(),
2142ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller                actualJarUrlConnection.getContentLength());
2152ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    }
2162ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
2172ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    private static URL createJarUrl(File jarFile, String entryName, URLStreamHandler streamHandler)
2182ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller            throws MalformedURLException {
2192ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller        return new URL("jar", null, -1, jarFile.toURI() + "!/" + entryName, streamHandler);
2202ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller    }
2212ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller
2222ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller}
223