/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF 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 org.apache.cxf.jaxrs.impl;

import java.util.Date;

import javax.servlet.AsyncContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.container.AsyncResponse;

import org.apache.cxf.continuations.ContinuationProvider;
import org.apache.cxf.message.ExchangeImpl;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
import org.apache.cxf.transport.http.Servlet3ContinuationProvider;

import org.easymock.EasyMock;
import org.easymock.IMocksControl;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class AsyncResponseImplTest extends Assert {

    private IMocksControl control;
    
    @Before
    public void setUp() {
        control = EasyMock.createNiceControl();
    }
    
    /**
     * According to the spec, subsequent calls to cancel the same AsyncResponse should
     * have the same behavior as the first call.
     */
    @Test
    public void testCancelBehavesTheSameWhenInvokedMultipleTimes() {
        HttpServletRequest req = control.createMock(HttpServletRequest.class);
        HttpServletResponse resp = control.createMock(HttpServletResponse.class);
        AsyncContext asyncCtx = control.createMock(AsyncContext.class);
        Message msg = new MessageImpl();
        msg.setExchange(new ExchangeImpl());
        msg.put(ContinuationProvider.class.getName(), new Servlet3ContinuationProvider(req, resp, msg));
        
        req.startAsync();
        EasyMock.expectLastCall().andReturn(asyncCtx);
        control.replay();
        
        AsyncResponse impl = new AsyncResponseImpl(msg);
        
        // cancel the AsyncResponse for the first time
        assertTrue("Unexpectedly returned false when canceling the first time", impl.cancel());
        
        // check the state of the AsyncResponse
        assertTrue("AsyncResponse was canceled but is reporting that it was not canceled", impl.isCancelled());
        boolean isDone = impl.isDone();
        boolean isSuspended = impl.isSuspended();
        
        // cancel the AsyncResponse a second time
        assertTrue("Unexpectedly returned false when canceling the second time", impl.cancel());
        
        // verify that the state is the same as before the second cancel
        assertTrue("AsyncResponse was canceled (twice) but is reporting that it was not canceled", impl.isCancelled());
        assertEquals("AsynchResponse.isDone() returned a different response after canceling a second time", 
                     isDone, impl.isDone());
        assertEquals("AsynchResponse.isSuspended() returned a different response after canceling a second time", 
                     isSuspended, impl.isSuspended());
    }
    
    /**
     * Similar to testCancelBehavesTheSameWhenInvokedMultipleTimes, but using the cancel(int) signature.
     */
    @Test
    public void testCancelIntBehavesTheSameWhenInvokedMultipleTimes() {
        HttpServletRequest req = control.createMock(HttpServletRequest.class);
        HttpServletResponse resp = control.createMock(HttpServletResponse.class);
        AsyncContext asyncCtx = control.createMock(AsyncContext.class);
        Message msg = new MessageImpl();
        msg.setExchange(new ExchangeImpl());
        msg.put(ContinuationProvider.class.getName(), new Servlet3ContinuationProvider(req, resp, msg));
        
        req.startAsync();
        EasyMock.expectLastCall().andReturn(asyncCtx);
        control.replay();
        
        AsyncResponse impl = new AsyncResponseImpl(msg);
        
        // cancel the AsyncResponse for the first time
        assertTrue("Unexpectedly returned false when canceling the first time", impl.cancel(10));
        
        // check the state of the AsyncResponse
        assertTrue("AsyncResponse was canceled but is reporting that it was not canceled", impl.isCancelled());
        boolean isDone = impl.isDone();
        boolean isSuspended = impl.isSuspended();
        
        // cancel the AsyncResponse a second time
        assertTrue("Unexpectedly returned false when canceling the second time", impl.cancel(25));
        
        // verify that the state is the same as before the second cancel
        assertTrue("AsyncResponse was canceled (twice) but is reporting that it was not canceled", impl.isCancelled());
        assertEquals("AsynchResponse.isDone() returned a different response after canceling a second time", 
                     isDone, impl.isDone());
        assertEquals("AsynchResponse.isSuspended() returned a different response after canceling a second time", 
                     isSuspended, impl.isSuspended());
    }
    
    /**
     * Similar to testCancelBehavesTheSameWhenInvokedMultipleTimes, but using the cancel(Date) signature.
     */
    @Test
    public void testCancelDateBehavesTheSameWhenInvokedMultipleTimes() {
        HttpServletRequest req = control.createMock(HttpServletRequest.class);
        HttpServletResponse resp = control.createMock(HttpServletResponse.class);
        AsyncContext asyncCtx = control.createMock(AsyncContext.class);
        Message msg = new MessageImpl();
        msg.setExchange(new ExchangeImpl());
        msg.put(ContinuationProvider.class.getName(), new Servlet3ContinuationProvider(req, resp, msg));
        
        req.startAsync();
        EasyMock.expectLastCall().andReturn(asyncCtx);
        control.replay();
        
        AsyncResponse impl = new AsyncResponseImpl(msg);
        
        // cancel the AsyncResponse for the first time
        Date d = new Date(System.currentTimeMillis() + 60000);
        assertTrue("Unexpectedly returned false when canceling the first time", impl.cancel(d));
        
        // check the state of the AsyncResponse
        assertTrue("AsyncResponse was canceled but is reporting that it was not canceled", impl.isCancelled());
        boolean isDone = impl.isDone();
        boolean isSuspended = impl.isSuspended();
        
        // cancel the AsyncResponse a second time
        d = new Date(System.currentTimeMillis() + 120000);
        assertTrue("Unexpectedly returned false when canceling the second time", impl.cancel(d));
        
        // verify that the state is the same as before the second cancel
        assertTrue("AsyncResponse was canceled (twice) but is reporting that it was not canceled", impl.isCancelled());
        assertEquals("AsynchResponse.isDone() returned a different response after canceling a second time", 
                     isDone, impl.isDone());
        assertEquals("AsynchResponse.isSuspended() returned a different response after canceling a second time", 
                     isSuspended, impl.isSuspended());
    }
    
    /**
     * Test that creatinging an AsyncResponse with a null continuation throws
     * an IllegalArgumentException instead of a NullPointer Exception.
     */
    @Test
    public void testNullContinutaion() {
        HttpServletRequest req = control.createMock(HttpServletRequest.class);
        AsyncContext asyncCtx = control.createMock(AsyncContext.class);
        Message msg = new MessageImpl();
        msg.setExchange(new ExchangeImpl());

        req.startAsync();
        EasyMock.expectLastCall().andReturn(asyncCtx);
        control.replay();

        AsyncResponse impl;
        try {
            impl = new AsyncResponseImpl(msg);
        } catch (IllegalArgumentException e) {
            assertEquals("Continuation not supported. " 
                             + "Please ensure that all servlets and servlet filters support async operations",
                         e.getMessage());
            return;
        }
        Assert.fail("Expected IllegalArgumentException, but instead got valid AsyncResponse, " + impl);
    }
}
