/*
*
* Copyright 2013 Netflix, Inc.
*
* 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.netflix.niws.client.http;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URI;
import java.util.Random;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import com.netflix.client.ClientFactory;
import com.netflix.client.http.HttpRequest;
import com.netflix.client.http.HttpResponse;
import com.netflix.client.http.HttpRequest.Verb;
import com.sun.jersey.api.container.httpserver.HttpServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.core.util.MultivaluedMapImpl;
import com.sun.net.httpserver.HttpServer;

public class GetPostTest {

    private static HttpServer server = null;
    private static String SERVICE_URI;
	private static RestClient client;

    @BeforeClass 
    public static void init() throws Exception {
        PackagesResourceConfig resourceConfig = new PackagesResourceConfig("com.netflix.niws.http", "com.netflix.niws.client");
        int port = (new Random()).nextInt(1000) + 4000;
        SERVICE_URI = "http://localhost:" + port + "/";
        try{
            server = HttpServerFactory.create(SERVICE_URI, resourceConfig);           
            server.start();
        } catch (Exception e) {
            e.printStackTrace();
            fail(e.getMessage());
        }
        client = (RestClient) ClientFactory.getNamedClient("GetPostTest");
    }
    
    @AfterClass
    public static void shutDown() {
    	server.stop(0);
    }
    
    @Test
    public void testGet() throws Exception {
    	URI getUri = new URI(SERVICE_URI + "test/getObject");
    	MultivaluedMapImpl params = new MultivaluedMapImpl();
    	params.add("name", "test");
    	HttpRequest request = HttpRequest.newBuilder().uri(getUri).queryParams("name", "test").build();
    	HttpResponse response = client.execute(request);
    	assertEquals(200, response.getStatus());
    	assertTrue(response.getEntity(TestObject.class).name.equals("test"));
    }
    
    @Test
    public void testPost() throws Exception {
    	URI getUri = new URI(SERVICE_URI + "test/setObject");
    	TestObject obj = new TestObject();
    	obj.name = "fromClient";
    	HttpRequest request = HttpRequest.newBuilder().verb(Verb.POST).uri(getUri).entity(obj).build();
    	HttpResponse response = client.execute(request);
    	assertEquals(200, response.getStatus());
    	assertTrue(response.getEntity(TestObject.class).name.equals("fromClient"));
    }
    
    @Test
    public void testChunkedEncoding() throws Exception {
        String obj = "chunked encoded content";
    	URI postUri = new URI(SERVICE_URI + "test/postStream");
    	InputStream input = new ByteArrayInputStream(obj.getBytes("UTF-8"));
    	HttpRequest request = HttpRequest.newBuilder().verb(Verb.POST).uri(postUri).entity(input).build();
    	HttpResponse response = client.execute(request);
    	assertEquals(200, response.getStatus());
    	assertTrue(response.getEntity(String.class).equals(obj));
    }
}