package org.basex.server;
import static org.junit.Assert.*;
import java.io.*;
import java.util.*;
import org.basex.*;
import org.basex.api.client.*;
import org.basex.core.*;
import org.basex.core.cmd.*;
import org.basex.util.*;
import org.junit.*;
import org.junit.Test;
/**
* This class tests the execution of parallel commands.
*
* @author BaseX Team 2005-17, BSD License
* @author Andreas Weiler
*/
public final class ConcurrencyTest extends SandboxTest {
/** Test file. */
private static final String FILE = "src/test/resources/factbook.zip";
/** Test queries. */
private static final String [] QUERIES = {
"(db:open('" + NAME + "')//province)[position() < 10] ! (insert node <test/> into .)",
"(1 to 100000)[. = 0]"
};
/** Server reference. */
private BaseXServer server;
/** Socket reference. */
private Session sess;
/**
* Starts the server.
* @throws IOException exception
*/
@Before
public void start() throws IOException {
server = createServer();
sess = createClient();
sess.execute(new CreateDB(NAME, FILE));
}
/**
* Stops the server.
* @throws Exception exception
*/
@After
public void stop() throws Exception {
sess.execute(new DropDB(NAME));
sess.close();
stopServer(server);
}
/**
* Efficiency test.
* @throws Exception exception
*/
@Test
public void runQueries() throws Exception {
final int cl = 50;
final QueryClient[] clients = new QueryClient[cl];
for(int c = 0; c < cl; ++c) clients[c] = new QueryClient(c);
for(final QueryClient c : clients) c.start();
for(final QueryClient c : clients) c.join();
for(final QueryClient c : clients) c.session.close();
}
/** Single client. */
static class QueryClient extends Thread {
/** Client session. */
ClientSession session;
/** Query number. */
final int number;
/**
* Default constructor.
* @param nr query number
*/
QueryClient(final int nr) {
number = nr;
try {
session = createClient();
} catch(final IOException ex) {
fail(Util.message(ex));
}
}
@Override
public void run() {
try {
session.query(QUERIES[number % QUERIES.length]).execute();
} catch(final IOException ex) {
fail(Util.message(ex));
}
}
}
/**
* Efficiency test.
* @throws Exception exception
*/
@Test
public void runCommands() throws Exception {
final int tl = 100;
final Thread[] th = new Thread[tl];
for(int t = 0; t < tl; t++) th[t] = new CommandClient();
for(final Thread c : th) c.start();
for(final Thread c : th) c.join();
}
/** Random counter. */
private static final Random RANDOM = new Random();
/** Single client. */
private static class CommandClient extends Thread {
@Override
public void run() {
try {
final int i = RANDOM.nextInt(2);
final Command cmd;
if(i == 0) cmd = new CreateDB(NAME);
else cmd = new DropDB(NAME);
cmd.execute(context);
} catch(final IOException ex) {
fail(Util.message(ex));
}
}
}
}