/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
package org.mozilla.android.sync.test.helpers.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.PrintWriter;
import java.io.StringWriter;
import org.junit.Test;
import org.mozilla.android.sync.test.helpers.HTTPServerTestHelper;
import org.mozilla.android.sync.test.helpers.MockServer;
import org.mozilla.android.sync.test.helpers.HTTPServerTestHelper.HTTPServerAlreadyRunningError;
public class TestHTTPServerTestHelper {
public static final int TEST_PORT = HTTPServerTestHelper.getTestPort();
protected MockServer mockServer = new MockServer();
@Test
public void testStartStop() {
// Need to be able to start and stop multiple times.
for (int i = 0; i < 2; i++) {
HTTPServerTestHelper httpServer = new HTTPServerTestHelper();
assertNull(httpServer.connection);
httpServer.startHTTPServer(mockServer);
assertNotNull(httpServer.connection);
httpServer.stopHTTPServer();
}
}
public void startAgain() {
HTTPServerTestHelper httpServer = new HTTPServerTestHelper();
httpServer.startHTTPServer(mockServer);
}
@Test
public void testStartTwice() {
HTTPServerTestHelper httpServer = new HTTPServerTestHelper();
httpServer.startHTTPServer(mockServer);
assertNotNull(httpServer.connection);
// Should not be able to start multiple times.
try {
try {
startAgain();
fail("Expected exception.");
} catch (Throwable e) {
assertEquals(HTTPServerAlreadyRunningError.class, e.getClass());
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String s = sw.toString();
// Ensure we get a useful stack trace.
// We should have the method trying to start the server the second time...
assertTrue(s.contains("startAgain"));
// ... as well as the the method that started the server the first time.
assertTrue(s.contains("testStartTwice"));
}
} finally {
httpServer.stopHTTPServer();
}
}
protected static class LeakyHTTPServerTestHelper extends HTTPServerTestHelper {
// Make this constructor public, just for this test.
public LeakyHTTPServerTestHelper(int port) {
super(port);
}
}
@Test
public void testForceStartTwice() {
HTTPServerTestHelper httpServer1 = new HTTPServerTestHelper();
HTTPServerTestHelper httpServer2 = new LeakyHTTPServerTestHelper(httpServer1.port + 1);
// Should be able to start multiple times if we specify it.
try {
httpServer1.startHTTPServer(mockServer);
assertNotNull(httpServer1.connection);
httpServer2.startHTTPServer(mockServer, true);
assertNotNull(httpServer2.connection);
} finally {
httpServer1.stopHTTPServer();
httpServer2.stopHTTPServer();
}
}
}