blob: db1c89acfdfc30a3f41397ceae3a1848af7199b7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2011 Sierra Wireless and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sierra Wireless - initial API and implementation
*******************************************************************************/
package org.eclipse.ldt.jnlua.internal.tests;
import junit.framework.TestCase;
import org.junit.Test;
import com.naef.jnlua.LuaState;
/**
* The aim here is to ensure that LuaJava is able to handle concurrent calls from different {@link LuaState}.
*
* @author Kevin KIN-FOO <kkinfoo@sierrawireless.com>
*/
public class ConcurrencyTest extends TestCase {
/** Quantity of thread to perform calls on LuaJava simultaneously */
private static final int THREAD_COUNT = 5;
/**
* Internal definition of thread for the only purpose to perform a function call using LuaJava
*/
private static class JNLuaUse extends Thread {
private LuaState state;
public JNLuaUse(LuaState l) {
state = l;
}
/**
* Compute the result of the Fibonacci serie from Lua using a {@link LuaState}. The execution of this method take a few time on purpose, in
* order to ensure thats different threads will call LuaJava at the same time.
*/
@Override
public void run() {
// Define Fibonacci serie
String code = "function fibo(n) if n< 2 then return 1 end return fibo(n-1) + fibo(n-2) end"; //$NON-NLS-1$
// Load function
state.load(code, "fibonacciFunction"); //$NON-NLS-1$
state.call(0, 0);
// Retrieve function in Lua
state.getGlobal("fibo"); //$NON-NLS-1$
// Pass an argument to the function
state.pushNumber(32);
// Call the Fibonacci serie
assert state.isNumber(-1) && state.isFunction(-2) : "Badly formed function call."; //$NON-NLS-1$
state.call(1, 1);
// Clean stack
state.pop(1);
}
}
/**
* Here we targeting to activate several thread which are going to use a {@link LuaState} at the same time. If the component is tread safe,
* nothing will happen. Else way, the execution of the unit tests will crash.
*/
@Test
public void testLuaJavaUse() {
// Create several threads
Thread[] threads = new Thread[THREAD_COUNT];
for (int k = 0; k < THREAD_COUNT; k++) {
threads[k] = new JNLuaUse(new LuaState());
}
// Activate all of them, they will start to use LuaJava randomly
for (Thread thread : threads) {
thread.start();
}
// Check if all threads terminate gently
int count = 0;
for (Thread thread : threads) {
try {
thread.join();
count++;
} catch (InterruptedException e) {
fail(e.getMessage());
}
}
assertEquals("A thread encounter an error", count, THREAD_COUNT); //$NON-NLS-1$
}
}