123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- /*
- * Copyright 2000-2014 Vaadin Ltd.
- *
- * Licensed 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 com.vaadin.tests.server.component.abstractsinglecomponentcontainer;
-
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
-
- import org.junit.Assert;
- import org.junit.Test;
-
- import com.vaadin.server.VaadinRequest;
- import com.vaadin.server.VaadinSession;
- import com.vaadin.ui.UI;
- import com.vaadin.ui.VerticalLayout;
-
- public class RemoveFromParentLockingTest {
-
- private static VerticalLayout createTestComponent() {
- VaadinSession session = new VaadinSession(null) {
- private final ReentrantLock lock = new ReentrantLock();
-
- @Override
- public Lock getLockInstance() {
- return lock;
- }
- };
-
- session.getLockInstance().lock();
-
- UI ui = new UI() {
- @Override
- protected void init(VaadinRequest request) {
- }
- };
- ui.setSession(session);
-
- VerticalLayout layout = new VerticalLayout();
- ui.setContent(layout);
-
- session.getLockInstance().unlock();
- return layout;
- }
-
- @Test
- public void attachNoSessionLocked() {
- VerticalLayout testComponent = createTestComponent();
-
- VerticalLayout target = new VerticalLayout();
-
- try {
- target.addComponent(testComponent);
- throw new AssertionError(
- "Moving component when not holding its sessions's lock should throw");
- } catch (IllegalStateException e) {
- Assert.assertEquals(
- "Cannot remove from parent when the session is not locked.",
- e.getMessage());
- }
- }
-
- @Test
- public void attachSessionLocked() {
- VerticalLayout testComponent = createTestComponent();
-
- VerticalLayout target = new VerticalLayout();
-
- testComponent.getUI().getSession().getLockInstance().lock();
-
- target.addComponent(testComponent);
- // OK if we get here without any exception
- }
-
- @Test
- public void crossAttachOtherSessionLocked() {
- VerticalLayout notLockedComponent = createTestComponent();
-
- VerticalLayout lockedComponent = createTestComponent();
-
- // Simulate the situation when attaching cross sessions
- lockedComponent.getUI().getSession().getLockInstance().lock();
- VaadinSession.setCurrent(lockedComponent.getUI().getSession());
-
- try {
- lockedComponent.addComponent(notLockedComponent);
- throw new AssertionError(
- "Moving component when not holding its sessions's lock should throw");
- } catch (IllegalStateException e) {
- Assert.assertEquals(
- "Cannot remove from parent when the session is not locked."
- + " Furthermore, there is another locked session, indicating that the component might be about to be moved from one session to another.",
- e.getMessage());
- } finally {
- VaadinSession.setCurrent(null);
- }
- }
-
- @Test
- public void crossAttachThisSessionLocked() {
- VerticalLayout notLockedComponent = createTestComponent();
-
- VerticalLayout lockedComponent = createTestComponent();
-
- // Simulate the situation when attaching cross sessions
- lockedComponent.getUI().getSession().getLockInstance().lock();
- VaadinSession.setCurrent(lockedComponent.getUI().getSession());
-
- try {
- notLockedComponent.addComponent(lockedComponent);
- } catch (AssertionError e) {
- // All is fine, don't care about the exact wording in this case
- } finally {
- VaadinSession.setCurrent(null);
- }
- }
-
- }
|