/* * Copyright (C) 2008 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 com.android.unit_tests; import android.content.ContentResolver; import android.net.http.AndroidHttpClient; import android.provider.Checkin; import android.provider.Settings; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; import com.google.android.collect.Lists; import com.google.android.net.GoogleHttpClient; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.entity.StringEntity; import org.apache.http.protocol.HttpContext; import org.apache.http.protocol.HttpRequestHandler; import org.apache.http.util.EntityUtils; import java.io.IOException; /** Unit test for {@link GoogleHttpClient}. */ public class GoogleHttpClientTest extends AndroidTestCase { private TestHttpServer mServer; private String mServerUrl; protected void setUp() throws Exception { // Run a test server that echoes the URI back to the caller. mServer = new TestHttpServer(); mServer.registerHandler("*", new HttpRequestHandler() { public void handle( HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException { String uri = request.getRequestLine().getUri(); response.setEntity(new StringEntity(uri)); } }); mServer.start(); mServerUrl = "http://localhost:" + mServer.getPort() + "/"; } protected void tearDown() throws Exception { if (mServer != null) mServer.shutdown(); } @LargeTest public void testThreadCheck() throws Exception { ContentResolver resolver = getContext().getContentResolver(); GoogleHttpClient client = new GoogleHttpClient(resolver, "Test", false /* no gzip */); try { // Note: we must test against a real server, because the connection // gets established before the interceptor can crash the request. HttpGet method = new HttpGet(mServerUrl); // This is actually an AndroidHttpClient feature... // TODO: somehow test that Activity threads have the flag set? AndroidHttpClient.setThreadBlocked(true); try { client.execute(method); fail("\"thread forbids HTTP requests\" exception expected"); } catch (RuntimeException e) { if (!e.toString().contains("forbids HTTP requests")) throw e; } finally { AndroidHttpClient.setThreadBlocked(false); } HttpResponse response = client.execute(method); assertEquals("/", EntityUtils.toString(response.getEntity())); } finally { client.close(); } } @MediumTest public void testUrlRewriteRules() throws Exception { // Don't do anything exotic; UrlRulesTest checks the actual rewriter. // Just make sure that URLs are, in fact, rewritten. // TODO: Use a MockContentProvider/MockContentResolver instead. ContentResolver resolver = getContext().getContentResolver(); GoogleHttpClient client = new GoogleHttpClient(resolver, "Test", false /* not gzip capable */); Settings.Gservices.putString(resolver, "url:test", "http://foo.bar/ rewrite " + mServerUrl + "new/"); // Update the digest, so the UrlRules cache is reloaded. Settings.Gservices.putString(resolver, "digest", mServerUrl); try { HttpGet method = new HttpGet("http://foo.bar/path"); HttpResponse response = client.execute(method); String body = EntityUtils.toString(response.getEntity()); assertEquals("/new/path", body); } finally { client.close(); } } }