1package fi.iki.elonen.integration;
2
3import fi.iki.elonen.NanoHTTPD;
4import org.apache.http.client.CookieStore;
5import org.apache.http.client.ResponseHandler;
6import org.apache.http.client.methods.HttpGet;
7import org.apache.http.impl.client.BasicResponseHandler;
8import org.apache.http.impl.cookie.BasicClientCookie;
9import org.junit.Test;
10
11import java.util.ArrayList;
12import java.util.Calendar;
13import java.util.List;
14
15import static org.junit.Assert.*;
16
17/**
18 * @author Paul S. Hawke (paul.hawke@gmail.com)
19 *         On: 9/2/13 at 10:10 PM
20 */
21public class CookieIntegrationTest extends IntegrationTestBase<CookieIntegrationTest.CookieTestServer> {
22
23    @Test
24    public void testNoCookies() throws Exception {
25        HttpGet httpget = new HttpGet("http://localhost:8192/");
26        ResponseHandler<String> responseHandler = new BasicResponseHandler();
27        httpclient.execute(httpget, responseHandler);
28
29        CookieStore cookies = httpclient.getCookieStore();
30        assertEquals(0, cookies.getCookies().size());
31    }
32
33    @Test
34    public void testCookieSentBackToClient() throws Exception {
35        testServer.cookiesToSend.add(new NanoHTTPD.Cookie("name", "value", 30));
36        HttpGet httpget = new HttpGet("http://localhost:8192/");
37        ResponseHandler<String> responseHandler = new BasicResponseHandler();
38        httpclient.execute(httpget, responseHandler);
39
40        CookieStore cookies = httpclient.getCookieStore();
41        assertEquals(1, cookies.getCookies().size());
42        assertEquals("name", cookies.getCookies().get(0).getName());
43        assertEquals("value", cookies.getCookies().get(0).getValue());
44    }
45
46    @Test
47    public void testServerReceivesCookiesSentFromClient() throws Exception {
48        BasicClientCookie clientCookie = new BasicClientCookie("name", "value");
49        Calendar calendar = Calendar.getInstance();
50        calendar.add(Calendar.DAY_OF_YEAR, 100);
51        clientCookie.setExpiryDate(calendar.getTime());
52        clientCookie.setDomain("localhost");
53        httpclient.getCookieStore().addCookie(clientCookie);
54        HttpGet httpget = new HttpGet("http://localhost:8192/");
55        ResponseHandler<String> responseHandler = new BasicResponseHandler();
56        httpclient.execute(httpget, responseHandler);
57
58        assertEquals(1, testServer.cookiesReceived.size());
59        assertTrue(testServer.cookiesReceived.get(0).getHTTPHeader().contains("name=value"));
60    }
61
62    @Override public CookieTestServer createTestServer() {
63        return new CookieTestServer();
64    }
65
66    public static class CookieTestServer extends NanoHTTPD {
67        List<Cookie> cookiesReceived = new ArrayList<Cookie>();
68        List<Cookie> cookiesToSend = new ArrayList<Cookie>();
69
70        public CookieTestServer() {
71            super(8192);
72        }
73
74        @Override public Response serve(IHTTPSession session) {
75            CookieHandler cookies = session.getCookies();
76            for (String cookieName : cookies) {
77                cookiesReceived.add(new Cookie(cookieName, cookies.read(cookieName)));
78            }
79            for (Cookie c : cookiesToSend) {
80                cookies.set(c);
81            }
82            return new Response("Cookies!");
83        }
84    }
85}
86