package org.jacorb.test.bugs.bugjac178;
/*
* JacORB - a free Java ORB
*
* Copyright (C) 1997-2014 Gerald Brose / The JacORB Team.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.HashSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jacorb.test.harness.ClientServerSetup;
import org.jacorb.test.harness.ClientServerTestCase;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* <code>POAThreadingTest</code> is a test for JAC178; test interleaving
* of calls in single and multiple thread child POAs
*
* @author Nick Cross
*/
public class POAThreadingTest extends ClientServerTestCase
{
/**
* <code>server</code> is the server reference.
*/
private JAC178 server;
/**
* Creates a new <code>POAThreadingTest</code> instance.
*
* @param name a <code>String</code> value
* @param setup a <code>ClientServerSetup</code> value
*/
/**
* <code>setUp</code> is the JUnit setup code.
*
* @exception Exception if an error occurs
*/
@Before
public void setUp() throws Exception
{
server = JAC178Helper.narrow( setup.getServerObject() );
}
@BeforeClass
public static void beforeClassSetUp() throws Exception
{
setup = new ClientServerSetup("org.jacorb.test.bugs.bugjac178.JAC178Impl");
}
/**
* <code>test_single</code> tests the single thread child poa.
*/
@Test
public void test_single() throws Exception
{
String[] strings = runThreadTest("Single");
verifyResult(true, strings);
}
private void verifyResult(boolean checkSingleThreadedExcution, String[] strings)
{
assertEquals(0, strings.length % 2);
boolean beginLongOpSeen = false;
HashSet<String> beginShortOpSeen = new HashSet<String>();
for (int x=0; x < strings.length; ++x)
{
if (strings[x].startsWith("begin-longOp"))
{
assertFalse("there should only be one begin-longOp", beginLongOpSeen);
beginLongOpSeen = true;
}
else if (strings[x].startsWith("end-longOp"))
{
assertTrue("end should be after begin", beginLongOpSeen);
}
else if (strings[x].startsWith("begin-shortOp"))
{
final String opID = strings[x].substring(12);
assertTrue(!checkSingleThreadedExcution || beginShortOpSeen.isEmpty());
assertFalse(beginShortOpSeen.contains(opID));
beginShortOpSeen.add(opID);
}
else if (strings[x].startsWith("end-shortOp"))
{
assertNotNull(beginShortOpSeen);
final String opID = strings[x].substring(10);
assertTrue(beginShortOpSeen.contains(opID));
beginShortOpSeen.remove(opID);
}
else
{
throw new IllegalArgumentException();
}
}
}
/**
* <code>test_multiple</code> tests the multiple thread child poa.
*/
@Test
public void test_multiple() throws Exception
{
String[] result = runThreadTest("Multiple");
verifyResult(false, result);
}
/**
* <code>runThreadTest</code> is the internal code used to test the poas.
*
* @param prefix a <code>String</code> value which is the sessionID prefix passed
* to getObject. This denotes to the server whether to create a
* child POA with single thread or multiple thread policy.
* @return an <code>int</code> value
*/
private String[] runThreadTest (String prefix) throws Exception
{
org.omg.CORBA.Object childObj1 = server.getObject (prefix + "Session1");
org.omg.CORBA.Object childObj2 = server.getObject (prefix + "Session2");
final JAC178 child1 = JAC178Helper.narrow (childObj1);
final JAC178 child2 = JAC178Helper.narrow (childObj2);
final Exception[] exceptions = new Exception[3];
// Create a thread.
Thread thread1 = new Thread("LongOpThread")
{
public void run()
{
try
{
child1.longOp ();
}
catch (Exception e)
{
exceptions[0] = e;
}
}
};
// Create a thread.
Thread thread2 = new Thread("ShortOpThread")
{
public void run()
{
try
{
child2.shortOp ("1");
}
catch (Exception e)
{
exceptions[1] = e;
}
}
};
Thread thread3 = new Thread("ShortOpThread2")
{
public void run()
{
try
{
child2.shortOp ("2");
}
catch (Exception e)
{
exceptions[2] = e;
}
}
};
assertNull(exceptions[0]);
assertNull(exceptions[1]);
assertNull(exceptions[2]);
thread1.start();
thread2.start();
thread3.start();
child2.shortOp ("3");
// Wait for everything to complete...
thread1.join();
thread2.join();
thread3.join();
// Get the result...
Pattern subst = Pattern.compile("\\[|\\]");
Matcher matcher = subst.matcher(server.getResult());
String resultStr = matcher.replaceAll("");
Pattern split = Pattern.compile("\\s*,\\s*");
return split.split(resultStr);
}
}