/*
 * 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.tuscany.sca.itest.conversational;

import org.apache.tuscany.sca.host.embedded.SCADomain;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class ConversationLifetimeTestCase {

    private SCADomain domain;

    @Before
    public void setUp() throws Exception {
        domain = SCADomain.newInstance("conversationLifetime.composite");
    }

    @After
    public void tearDown() throws Exception {
        if (domain != null) {
            domain.close();
        }
    }

    /**
     * Following a clarification re. the wording of the Java Common Annotations and APIs 1.00 Specification
     * (see TUSCANY-2055) the following is accepted to be the intended operation
     * 
     * Whether the conversation ID is chosen by the user or is generated by the system, the client
     * may access the conversation ID by calling getConversationID() on the current conversation object.
     * 
     * ServiceReference.getConversationID() - Returns the id supplied by the user that will be associated with
     * future conversations initiated through this reference, or null if no ID has been set by the user.
     * 
     * ServiceReference.setConversationID(Object conversationId) - Set an ID, supplied by the user, to associate with any future conversation
     * started through this reference. If the value supplied is null then the id will be generated
     * by the implementation. Throws an IllegalStateException if a conversation is currently
     * associated with this reference. 
     * 
     */

    /**
     * Verify that ServiceReference.getConversationID() returns null before a conversation
     * ID has been set manually.
     */
    @Test
    public void getConversationID() {
        CService service = domain.getService(CService.class, "ConversationalCComponent");
        service.getState();
        Assert.assertNull(service.getConversationID());
    }

    /**
     * Verify that ServiceReference.getConversationID() returns any value previous set through the
     * setConversationID() API.
     */
    @Test
    public void getConversationID2() {
        String userProvidedID = "A conversation ID";
        CService service = domain.getService(CService.class, "ConversationalCComponent");
        service.setConversationID(userProvidedID);
        service.getState();
        Assert.assertEquals(service.getConversationID(), userProvidedID);
    }
    
    /**
     * Whether the conversation ID is chosen by the user or is generated by the system, the client
     * may access the conversation ID by calling getConversationID() on the current conversation object.
     * Here test the manually set conversationID
     */
    @Test
    public void getConversationID3() {
        String userProvidedID = "A conversation ID";
        CService service = domain.getService(CService.class, "ConversationalCComponent");
        service.setConversationID(userProvidedID);
        service.getState();
        Assert.assertEquals(service.getConversationObjectConversationId(), userProvidedID);
    }
    
    /**
     * Whether the conversation ID is chosen by the user or is generated by the system, the client
     * may access the conversation ID by calling getConversationID() on the current conversation object.
     * Here test the auto generated conversationId
     */
    @Test
    public void getConversationID4() {
        CService service = domain.getService(CService.class, "ConversationalCComponent");
        service.getState();
        Assert.assertNotNull(service.getConversationObjectConversationId());
    }    
    
    /**
     * Java Common Annotations and APIs 1.00 Specification line 494-495 Verify:
     * If a method is invoked on a service reference after an
     * "@EndsConversation" method has been called then a new conversation will
     * automatically be started.
     */
    @Test
    public void implicitStartNewConversationAfterEnd() {
        CService service = domain.getService(CService.class, "ConversationalCComponent");
        service.getState();
        Object firstID = service.getConversationObjectConversationId();
        service.endConversationViaAnnotatedMethod();
        service.getState();
        Assert.assertNotSame(firstID, service.getConversationObjectConversationId());
    }

    /**
     * Java Common Annotations and APIs 1.00 Specification line 495-495 Verify: If a
     * method is invoked on a service reference after an "@EndsConversation"
     * method has been called then a new conversation will automatically be
     * started. Note: Uses Conversation.end() rather than "@EndsConversation"
     */
    @Test
    public void implicitStartNewConversationAfterEnd2() {
        CService service = domain.getService(CService.class, "ConversationalCComponent");
        service.getState();
        Object firstID = service.getConversationObjectConversationId();
        service.endConversation();
        service.getState();
        Assert.assertNotSame(firstID, service.getConversationObjectConversationId());
    }

    /**
     * Java Common Annotations and APIs 1.00 Specification line 495-497 Verify:
     * If ServiceReference.getConversationID() is called after the
     * "@EndsConversation" method is called, but before the next conversation
     * has been started, it will return null.
     */
    @Test
    public void nullConversationIDAfterEndConversation() {
        CService service = domain.getService(CService.class, "ConversationalCComponent");
        service.getState();
        service.endConversationViaAnnotatedMethod();
        Assert.assertNull(service.getConversationObjectConversationId());
    }
    
    /**
     * Java Common Annotations and APIs 1.00 Specification line 495-497 Verify:
     * If ServiceReference.getConversationID() is called after the
     * "@EndsConversation" method is called, but before the next conversation
     * has been started, it will return null.  Note: Uses explicit set of Conversation ID
     */
    @Test
    public void nullConversationIDAfterEndConversation1a() {
        CService service = domain.getService(CService.class, "ConversationalCComponent");
        service.setConversationID("User provided ID");
        service.getState();
        service.endConversationViaAnnotatedMethod();
        Assert.assertNull(service.getConversationObjectConversationId());
    }

    /**
     * Java Common Annotations and APIs 1.00 Specification line 495-497 Verify: If
     * ServiceReference.getConversationID() is called after the
     * "@EndsConversationmethod" is called, but before the next conversation has
     * been started, it will return null. Note: Uses Conversation.end() rather
     * than "@EndsConversation"
     */
    @Test
    public void nullConversationIDAfterEndConversation2() {
        CService service = domain.getService(CService.class, "ConversationalCComponent");
        service.getState();
        service.endConversation();
        Assert.assertNull(service.getConversationObjectConversationId());
    }
    
    /**
     * Java Common Annotations and APIs 1.00 Specification line 495-497 Verify: If
     * ServiceReference.getConversationID() is called after the
     * "@EndsConversationmethod" is called, but before the next conversation has
     * been started, it will return null. Note: Uses Conversation.end() rather
     * than "@EndsConversation".  Note 2: Uses explicit set of Conversation ID
     */
    @Test
    public void nullConversationIDAfterEndConversation2a() {
        CService service = domain.getService(CService.class, "ConversationalCComponent");
        service.setConversationID("User provided ID");
        service.getState();
        service.endConversation();
        Assert.assertNull(service.getConversationObjectConversationId());
    }

}
