/*
 * Copyright © 2013 – 2015 Ricki Hirner (bitfire web engineering).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 */

package at.bitfire.davdroid;

import junit.framework.TestCase;

import java.io.IOException;
import java.net.URISyntaxException;

import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;

public class HttpClientTest extends TestCase {

    MockWebServer server;
    OkHttpClient httpClient;

    @Override
    public void setUp() throws IOException {
        httpClient = HttpClient.create();

        server = new MockWebServer();
        server.start(30000);
    }

    @Override
    public void tearDown() throws IOException {
        server.shutdown();
    }

    public void testCookies() throws IOException, InterruptedException, URISyntaxException {
        HttpUrl url = server.url("/test");

        // set cookie for root path (/) and /test path in first response
        server.enqueue(new MockResponse()
                .setResponseCode(200)
                .addHeader("Set-Cookie", "cookie1=1; path=/")
                .addHeader("Set-Cookie", "cookie2=2")
                .setBody("Cookie set"));
        httpClient.newCall(new Request.Builder()
                .get().url(url)
                .build()).execute();
        assertNull(server.takeRequest().getHeader("Cookie"));

        // cookie should be sent with second request
        // second response lets first cookie expire and overwrites second cookie
        server.enqueue(new MockResponse()
                .addHeader("Set-Cookie", "cookie1=1a; path=/; Max-Age=0")
                .addHeader("Set-Cookie", "cookie2=2a")
                .setResponseCode(200));
        httpClient.newCall(new Request.Builder()
                .get().url(url)
                .build()).execute();
        assertEquals("cookie2=2; cookie1=1", server.takeRequest().getHeader("Cookie"));

        server.enqueue(new MockResponse()
                .setResponseCode(200));
        httpClient.newCall(new Request.Builder()
                .get().url(url)
                .build()).execute();
        assertEquals("cookie2=2a", server.takeRequest().getHeader("Cookie"));
    }

}
