blob: de50e164d1c42865464c8b5e4b53965ee94bde1d [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* 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 libcore.java.net;
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.net.URLStreamHandlerFactory;
import junit.framework.TestCase;
import libcore.java.net.customstreamhandler.http.Handler;
public final class URLStreamHandlerFactoryTest extends TestCase {
private URLStreamHandlerFactory oldFactory;
private Field factoryField;
private boolean isCreateURLStreamHandlerCalled;
public void setUp() throws IllegalAccessException {
for (Field field : URL.class.getDeclaredFields()) {
if (URLStreamHandlerFactory.class.equals(field.getType())) {
assertNull("URL declares multiple URLStreamHandlerFactory fields", factoryField);
factoryField = field;
factoryField.setAccessible(true);
oldFactory = (URLStreamHandlerFactory) factoryField.get(null);
return;
}
}
fail("URL does not declare a URLStreamHandlerFactory field");
}
public void tearDown() throws IllegalAccessException {
factoryField.set(null, null);
URL.setURLStreamHandlerFactory(oldFactory);
}
public void testCreateURLStreamHandler() throws Exception {
TestURLStreamHandlerFactory shf = new TestURLStreamHandlerFactory();
assertFalse(isCreateURLStreamHandlerCalled);
URL.setURLStreamHandlerFactory(shf);
URL url = new URL("http://android.com/");
URLConnection connection = url.openConnection();
assertTrue(connection instanceof Handler.HandlerURLConnection);
try {
URL.setURLStreamHandlerFactory(shf);
fail();
} catch (Error expected) {
}
try {
URL.setURLStreamHandlerFactory(null);
fail();
} catch (Error expected) {
}
}
public void testInstallCustomProtocolHandler() throws Exception {
// clear cached protocol handlers if they exist
factoryField.set(null, null);
URL.setURLStreamHandlerFactory(oldFactory);
try {
System.setProperty("java.protocol.handler.pkgs", getHandlerPackageName());
URLConnection connection = new URL("http://android.com/").openConnection();
assertTrue(connection instanceof Handler.HandlerURLConnection);
} finally {
System.clearProperty("java.protocol.handler.pkgs");
}
}
public void testFirstUseIsCached() throws Exception {
// clear cached protocol handlers if they exist
factoryField.set(null, null);
URL.setURLStreamHandlerFactory(oldFactory);
// creating a connection should use the platform's default stream handler
URLConnection connection1 = new URL("http://android.com/").openConnection();
assertFalse(connection1 instanceof Handler.HandlerURLConnection);
try {
// set the property and get another connection. The property should not be honored
System.setProperty("java.protocol.handler.pkgs", getHandlerPackageName());
URLConnection connection2 = new URL("http://android.com/").openConnection();
assertFalse(connection2 instanceof Handler.HandlerURLConnection);
} finally {
System.clearProperty("java.protocol.handler.pkgs");
}
}
private String getHandlerPackageName() {
String className = Handler.class.getName();
return className.substring(0, className.indexOf(".http.Handler"));
}
class TestURLStreamHandlerFactory implements URLStreamHandlerFactory {
@Override public URLStreamHandler createURLStreamHandler(String protocol) {
isCreateURLStreamHandlerCalled = true;
return new Handler();
}
}
}