/****************************************************************************** * JBoss, a division of Red Hat * * Copyright 2010, Red Hat Middleware, LLC, and individual * * contributors as indicated by the @authors tag. See the * * copyright.txt in the distribution for a full listing of * * individual contributors. * * * * This is free software; you can redistribute it and/or modify it * * under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 2.1 of * * the License, or (at your option) any later version. * * * * This software is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this software; if not, write to the Free * * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * * 02110-1301 USA, or see the FSF site: http://www.fsf.org. * ******************************************************************************/ package org.exoplatform.portal.webui.test; import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.exoplatform.component.test.AbstractGateInTest; import org.exoplatform.portal.webui.portal.UIPortal; import org.exoplatform.webui.config.Event; /** * Unit test for concurrent read of event from UI component configuration. * * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @version $Revision$ */ public class ComponentConfigConcurrentTest extends AbstractGateInTest { private static final int WORKERS_COUNT = 50; private MockApplication mockApplication; public void testConcurrentReadOfComponentEventConfig() throws Exception { // Init configuration and mock WebUI application Map<String, String> initParams = new HashMap<String, String>(); initParams.put("webui.configuration", "webui.configuration"); String basedir = System.getProperty("basedir"); String webuiConfig = basedir + "/src/test/resources/webui-configuration.xml"; Map<String, URL> resources = new HashMap<String, URL>(); resources.put("webui.configuration", new File(webuiConfig).toURI().toURL()); initParams.put("webui.configuration", new File(webuiConfig).toURI().toURL().toString()); mockApplication = new MockApplication(initParams, resources, null); mockApplication.onInit(); // init workers list List<Worker> workers = new ArrayList<Worker>(WORKERS_COUNT); // test obtain event configuration concurrently with more worker threads for (int i = 0; i < WORKERS_COUNT; i++) { Worker worker = new Worker("Worker-" + i); workers.add(worker); worker.start(); } // Wait for all workers to finish for (Worker worker : workers) { worker.join(); } // Go throguh all workers and throw error if some worker has null eventConfig for (Worker worker : workers) { assertNotNull("event configuration is null in worker " + worker.getName(), worker.eventConfig); } // destroy mock application mockApplication.onDestroy(); } private class Worker extends Thread { private Event eventConfig = null; public Worker(String name) { super(name); } public void run() { try { UIPortal uiPortal = mockApplication.createUIComponent(UIPortal.class, null, null, null); eventConfig = uiPortal.getComponentConfig().getUIComponentEventConfig("Ping"); // log message now if eventConfig is null, so that we know about all failed workers. Test will be failed later. if (eventConfig == null) { log.error("eventConfig is null for worker " + getName()); } } catch (Exception e) { log.error("Exception occured during concurrent test in worker " + getName(), e); } } } }