/* * Copyright 2010-2011 Ning, Inc. * * Ning licenses this file to you 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.ning.metrics.eventtracker; import com.ning.metrics.serialization.writer.CallbackHandler; import org.eclipse.jetty.server.AbstractHttpConnection; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.skife.config.ConfigurationObjectFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import javax.servlet.ServletException; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.net.ServerSocket; public class TestHttpSender { private static final Logger logger = LoggerFactory.getLogger(TestHttpSender.class); private static final File eventsFile = new File(System.getProperty("java.io.tmpdir"), "TestHttpSender-" + System.currentTimeMillis()); private Server server; private Server errorServer; private HttpSender sender; @SuppressWarnings("unused") private CallbackHandler failureCallbackHandler; @SuppressWarnings("unused") private CallbackHandler successCallbackHandler; @BeforeClass(alwaysRun = true) public void setUpGlobal() throws Exception { final int port = findFreePort(); // Set up server server = new Server(port); // Set up server that will return 404 errorServer = new Server(port) { @Override public void handle(final AbstractHttpConnection connection) throws IOException, ServletException { final String target = connection.getRequest().getPathInfo(); final Request request = connection.getRequest(); final Response response = connection.getResponse(); response.setStatus(404); handle(target, request, request, response); } }; System.setProperty("eventtracker.collector.port", Integer.toString(port)); final EventTrackerConfig config = new ConfigurationObjectFactory(System.getProperties()).build(EventTrackerConfig.class); // Set up sender sender = new HttpSender(config.getCollectorHost(), config.getCollectorPort(), config.getEventType(), config.getHttpMaxWaitTimeInMillis(), config.getHttpMaxKeepAlive().getMillis(), 10); failureCallbackHandler = new CallbackHandler() { @Override public void onError(final Throwable t, final File event) { logger.debug("Got error (good): " + t.getMessage()); } @Override public void onSuccess(final File event) { Assert.fail("Got success when we were expecting failure. Uh oh."); } }; successCallbackHandler = new CallbackHandler() { @Override public void onError(final Throwable t, final File event) { Assert.fail("Got error (bad!): ", t); } @Override public void onSuccess(final File event) { logger.debug("Got success. Yay."); } }; // Populate the file Assert.assertTrue(eventsFile.createNewFile()); final FileWriter writer = new FileWriter(eventsFile); writer.write("{ \"eventName\":\"Hello\", \"payload\": { \"dontcare\": \"World\" } }"); writer.close(); } @AfterClass(alwaysRun = true) public void tearDownGlobal() throws Exception { sender.close(); } @Test(groups = "slow") public void testSend() throws Exception { // test send before server's initialized. hope for timeout failure logger.info("sending"); sender.send(eventsFile, failureCallbackHandler); Thread.sleep((long) 100); // 100 is long enough for it to timeout // initialize server and test again. server.start(); logger.info("Started server"); logger.info("sending"); sender.send(eventsFile, successCallbackHandler); Thread.sleep((long) 500); server.stop(); } @Test(groups = "slow") public void test404() throws Exception { errorServer.start(); logger.info("sending"); sender.send(eventsFile, failureCallbackHandler); Thread.sleep((long) 500); errorServer.stop(); } private int findFreePort() throws IOException { ServerSocket socket = null; try { socket = new ServerSocket(0); return socket.getLocalPort(); } finally { if (socket != null) { socket.close(); } } } }