/* (c) 2016 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.web.admin; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.geoserver.GeoServerConfigurationLock; import org.geoserver.GeoServerConfigurationLock.LockType; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.web.GeoServerWicketTestSupport; import org.geoserver.web.ServerBusyPage; import org.geoserver.web.data.store.DataAccessEditPage; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; /** * @author Alessio Fabiani, GeoSolutions * */ public class ServerBusyPageTest extends GeoServerWicketTestSupport { long defaultTimeout; @Before public void clearTimeout() { defaultTimeout = GeoServerConfigurationLock.DEFAULT_TRY_LOCK_TIMEOUT_MS; GeoServerConfigurationLock.DEFAULT_TRY_LOCK_TIMEOUT_MS = 1; } @After public void reinstateTimeout() { GeoServerConfigurationLock.DEFAULT_TRY_LOCK_TIMEOUT_MS = defaultTimeout; } @Test public void testStoreEditServerBusyPage() throws Exception { login(); List<GrantedAuthority> l= new ArrayList<GrantedAuthority>(); l.add(new SimpleGrantedAuthority("ROLE_ANONYMOUS")); final LockType type = LockType.WRITE; final GeoServerConfigurationLock locker = (GeoServerConfigurationLock) GeoServerExtensions.bean("configurationLock"); locker.setEnabled(true); locker.unlock(); // just to be on the safe side AtomicBoolean acquired = new AtomicBoolean(false); AtomicBoolean release = new AtomicBoolean(false); if (locker != null) { Thread configWriter = new Thread("Config-writer") { public void run() { // Acquiring Configuration Lock as another user locker.lock(type); acquired.set(true); try { while(!release.get()) { Thread.sleep(50); } } catch (InterruptedException e) { throw new RuntimeException(e); } finally { locker.unlock(); } } }; configWriter.start(); try { while(!acquired.get()) { Thread.sleep(50); } tester.startPage(DataAccessEditPage.class, new PageParameters().add("wsName", "cite").add("storeName", "cite")); tester.assertRenderedPage(ServerBusyPage.class); tester.assertNoErrorMessage(); } finally { release.set(true); } } } }