]> source.dussan.org Git - vaadin-framework.git/blob
e277d4e075f43c06ade488ced8fb51900e7cd00b
[vaadin-framework.git] /
1 /*
2  * Copyright 2000-2014 Vaadin Ltd.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5  * use this file except in compliance with the License. You may obtain a copy of
6  * the License at
7  * 
8  * http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations under
14  * the License.
15  */
16 package com.vaadin.tests.server.component.abstractsinglecomponentcontainer;
17
18 import java.util.concurrent.locks.Lock;
19 import java.util.concurrent.locks.ReentrantLock;
20
21 import org.junit.Assert;
22 import org.junit.Test;
23
24 import com.vaadin.server.VaadinRequest;
25 import com.vaadin.server.VaadinSession;
26 import com.vaadin.ui.UI;
27 import com.vaadin.ui.VerticalLayout;
28
29 public class RemoveFromParentLockingTest {
30
31     private static VerticalLayout createTestComponent() {
32         VaadinSession session = new VaadinSession(null) {
33             private final ReentrantLock lock = new ReentrantLock();
34
35             @Override
36             public Lock getLockInstance() {
37                 return lock;
38             }
39         };
40
41         session.getLockInstance().lock();
42
43         UI ui = new UI() {
44             @Override
45             protected void init(VaadinRequest request) {
46             }
47         };
48         ui.setSession(session);
49
50         VerticalLayout layout = new VerticalLayout();
51         ui.setContent(layout);
52
53         session.getLockInstance().unlock();
54         return layout;
55     }
56
57     @Test
58     public void attachNoSessionLocked() {
59         VerticalLayout testComponent = createTestComponent();
60
61         VerticalLayout target = new VerticalLayout();
62
63         try {
64             target.addComponent(testComponent);
65             throw new AssertionError(
66                     "Moving component when not holding its sessions's lock should throw");
67         } catch (IllegalStateException e) {
68             Assert.assertEquals(
69                     "Cannot remove from parent when the session is not locked.",
70                     e.getMessage());
71         }
72     }
73
74     @Test
75     public void attachSessionLocked() {
76         VerticalLayout testComponent = createTestComponent();
77
78         VerticalLayout target = new VerticalLayout();
79
80         testComponent.getUI().getSession().getLockInstance().lock();
81
82         target.addComponent(testComponent);
83         // OK if we get here without any exception
84     }
85
86     @Test
87     public void crossAttachOtherSessionLocked() {
88         VerticalLayout notLockedComponent = createTestComponent();
89
90         VerticalLayout lockedComponent = createTestComponent();
91
92         // Simulate the situation when attaching cross sessions
93         lockedComponent.getUI().getSession().getLockInstance().lock();
94         VaadinSession.setCurrent(lockedComponent.getUI().getSession());
95
96         try {
97             lockedComponent.addComponent(notLockedComponent);
98             throw new AssertionError(
99                     "Moving component when not holding its sessions's lock should throw");
100         } catch (IllegalStateException e) {
101             Assert.assertEquals(
102                     "Cannot remove from parent when the session is not locked."
103                             + " Furthermore, there is another locked session, indicating that the component might be about to be moved from one session to another.",
104                     e.getMessage());
105         }
106     }
107
108     @Test
109     public void crossAttachThisSessionLocked() {
110         VerticalLayout notLockedComponent = createTestComponent();
111
112         VerticalLayout lockedComponent = createTestComponent();
113
114         // Simulate the situation when attaching cross sessions
115         lockedComponent.getUI().getSession().getLockInstance().lock();
116         VaadinSession.setCurrent(lockedComponent.getUI().getSession());
117
118         try {
119             notLockedComponent.addComponent(lockedComponent);
120         } catch (AssertionError e) {
121             // All is fine, don't care about the exact wording in this case
122         }
123     }
124
125 }