/*******************************************************************************
 * Copyright (c) 2010-2014 SAP AG and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.skalli.core.destination;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.net.URL;

import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.eclipse.skalli.services.destination.DestinationService;
import org.eclipse.skalli.testutil.BundleManager;
import org.eclipse.skalli.testutil.HttpServerMock;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

@SuppressWarnings("nls")
public class DestinationComponentTest {

    private static HttpServerMock mmus;
    private static final String TEST_CONTENT = "BODY";

    protected DestinationService destinationService;

    @BeforeClass
    public static void setUpOnce() throws Exception {
        BundleManager.startBundles();
        mmus = new HttpServerMock();
        mmus.start();
    }

    @AfterClass
    public static void tearDownOnce() throws Exception {
        mmus.stop();
    }

    @Before
    public void setup() throws Exception {
        destinationService = new DestinationComponent();
    }

    @Test
    public void testGetContent() throws Exception {
        mmus.addContent("testGetContent", TEST_CONTENT);
        assertGetRequest("http", 200, "testGetContent", TEST_CONTENT);
    }

    private void assertGetRequest(String protocol, int responseCode, String contentId, String content) throws Exception {
        URL url = new URL(protocol + "://" + mmus.getHost() + ":" + mmus.getPort() + "/" + contentId + "/"
                + responseCode);
        HttpClient client = destinationService.getClient(url);
        assertNotNull(client);

        HttpGet method = new HttpGet(url.toExternalForm());
        HttpResponse response = client.execute(method);
        assertEquals(200, response.getStatusLine().getStatusCode());
        if (content != null) {
            String contents = IOUtils.toString(response.getEntity().getContent());
            assertEquals(content, contents);
        }
    }
}
