    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one
    3    * or more contributor license agreements.  See the NOTICE file
    4    * distributed with this work for additional information
    5    * regarding copyright ownership.  The ASF licenses this file
    6    * to you under the Apache License, Version 2.0 (the
    7    * "License"); you may not use this file except in compliance
    8    * with the License.  You may obtain a copy of the License at
    9    *
    10   *   http://www.apache.org/licenses/LICENSE-2.0
    11   *
    12   * Unless required by applicable law or agreed to in writing,
    13   * software distributed under the License is distributed on an
    14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    15   * KIND, either express or implied.  See the License for the
    16   * specific language governing permissions and limitations
    17   * under the License.
    18   */
    19  package org.apache.myfaces.orchestra.conversation;
    20
    21  import org.apache.myfaces.orchestra.conversation.basic.LogConversationMessager;
    22  import org.apache.myfaces.orchestra.frameworkAdapter.FrameworkAdapter;
    23  import org.apache.myfaces.orchestra.frameworkAdapter.local.LocalFrameworkAdapter;
    24  import org.springframework.aop.scope.ScopedObject;
    25  import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
    26
    27  /**
    28   * Test various aspects of the conversation handling
    29   */
    30  public class TestConversation extends AbstractDependencyInjectionSpringContextTests implements ConversationBindingListener
    31  {
    32      protected String[] getConfigLocations()
    33      {
    34          return new String[]
    35              {
    36                  "classpath:testApplicationContext.xml"
    37              };
    38      }
    39
    40
    41      private int valueBoundCount = 0;
    42      private int valueUnboundCount = 0;
    43
    44      protected void onSetUp() throws Exception
    45      {
    46          super.onSetUp();
    47
    48          LocalFrameworkAdapter frameworkAdapter = new LocalFrameworkAdapter();
    49          frameworkAdapter.setApplicationContext(applicationContext);
    50          frameworkAdapter.setConversationMessager(new LogConversationMessager());
    51          FrameworkAdapter.setCurrentInstance(frameworkAdapter);
    52      }
    53
    54      public void testConversation() throws Exception
    55      {
    56          DummyBean.callback=this;
    57          final String BEAN_NAME = "dummyBean";
    58
    59          // The Spring configuration for dummyBean does not explicitly set a conversation name,
    60          // so conversation-name = bean-name
    61          final String CONVERSATION_NAME = BEAN_NAME;
    62
    63          valueBoundCount = 0;
    64          valueUnboundCount = 0;
    65
    66          /* simple create test */
    67          DummyBean bean = (DummyBean) applicationContext.getBean(BEAN_NAME);
    68
    69          assertTrue("should be a scoped object", bean instanceof ScopedObject);
    70
    71          assertFalse("conversation should not have been started yet", ConversationManager.getInstance().hasConversation(CONVERSATION_NAME));
    72          assertEquals("value bound", 0, valueBoundCount);
    73          assertEquals("value unbound", 0, valueUnboundCount);
    74          bean.touch();
    75          assertEquals("value bound", 1, valueBoundCount);
    76          assertEquals("value unbound", 0, valueUnboundCount);
    77          assertTrue("conversation should have been started", ConversationManager.getInstance().hasConversation(CONVERSATION_NAME));
    78
    79          /* check if correct conversation has been started */
    80          Conversation conversationHolder = bean.checkCurrentConversation();
    81          assertNotNull("current conversation", conversationHolder);
    82          assertEquals("conversation name", CONVERSATION_NAME, conversationHolder.getName());
    83
    84          /* invalidate conversation */
    85          bean.invalidateSelf();
    86
    87          assertFalse("conversation should not be running", ConversationManager.getInstance().hasConversation(CONVERSATION_NAME));
    88          assertTrue("conversation should be marked invalid", conversationHolder.isInvalid());
    89          assertEquals("value bound", 1, valueBoundCount);
    90          assertEquals("value unbound", 1, valueUnboundCount);
    91
    92          bean.touch();
    93          assertTrue("conversation should have been started", ConversationManager.getInstance().hasConversation(CONVERSATION_NAME));
    94          assertEquals("value bound", 2, valueBoundCount);
    95
    96
    97          /* check if a new conversation bean has been created */
    98          bean.setData("check");
    99
    100         bean.invalidateAndRestartSelf();
    101
    102         assertEquals("value bound", 2, valueBoundCount);
    103         assertEquals("value unbound", 2, valueUnboundCount);
    104
    105         assertTrue("conversation should still be running", ConversationManager.getInstance().hasConversation(CONVERSATION_NAME));
    106
    107         DummyBean beanNew = (DummyBean) applicationContext.getBean(BEAN_NAME);
    108
    109         assertNotNull("should have got a new conversation", beanNew);
    110         assertNull("the conversation is not new", bean.getData());
    111
    112         beanNew.touch();
    113
    114         assertEquals("value bound", 3, valueBoundCount);
    115
    116         /* clear the whole conversation context */
    117
    118         ConversationManager.getInstance().clearCurrentConversationContext();
    119
    120         assertEquals("value unbound", 3, valueUnboundCount);
    121         assertFalse("conversation should not be running", ConversationManager.getInstance().hasConversation(CONVERSATION_NAME));
    122     }
    123
    124     public void valueBound(ConversationBindingEvent event)
    125     {
    126         valueBoundCount++;
    127     }
    128
    129     public void valueUnbound(ConversationBindingEvent event)
    130     {
    131         valueUnboundCount++;
    132     }
    133 }