package org.basex.local.multiple;
import org.basex.*;
import org.basex.core.*;
import org.basex.core.cmd.*;
import org.basex.core.users.*;
import org.junit.Test;
/**
* This class performs local stress tests with a specified number of threads and queries.
*
* @author BaseX Team 2005-17, BSD License
* @author Christian Gruen
*/
public final class MultipleAddTest extends SandboxTest {
/** Input document. */
private static final String INPUT = "src/test/resources/input.xml";
/** Result counter. */
static int counter;
/**
* Runs the test.
* @throws Exception exception
*/
@Test
public void clients10runs10() throws Exception {
run(10, 10);
}
/**
* Runs the test.
* @throws Exception exception
*/
@Test
public void clients10runs100() throws Exception {
run(10, 100);
}
/**
* Runs the test.
* @throws Exception exception
*/
@Test
public void clients100runs10() throws Exception {
run(100, 10);
}
/**
* Runs the test.
* @throws Exception exception
*/
@Test
public void clients100runs100() throws Exception {
run(100, 100);
}
/**
* Runs the stress test.
* @param clients number of clients
* @param runs number of runs per client
* @throws Exception exception
*/
private static void run(final int clients, final int runs) throws Exception {
// Create test database
execute(new CreateDB(NAME));
// Start clients
final Client[] cl = new Client[clients];
for(int i = 0; i < clients; ++i) cl[i] = new Client(context, runs);
for(final Client c : cl) c.start();
for(final Client c : cl) c.join();
// Drop database
execute(new DropDB(NAME));
}
/** Single client. */
static class Client extends Thread {
/** Client context. */
private final Context ctx;
/** Number of runs. */
private final int runs;
/**
* Constructor.
* @param ctx database context
* @param runs number of runs
*/
Client(final Context ctx, final int runs) {
this.runs = runs;
this.ctx = new Context(ctx);
this.ctx.user(ctx.users.get(UserText.ADMIN));
}
@Override
public void run() {
try {
new Set(MainOptions.AUTOFLUSH, false).execute(ctx);
new Set(MainOptions.INTPARSE, true).execute(ctx);
new Open(NAME).execute(ctx);
try {
for(int r = 0; r < runs; ++r) {
new Add("", INPUT).execute(ctx);
}
} finally {
new Close().execute(ctx);
}
} catch(final BaseXException ex) {
ex.printStackTrace();
}
}
}
}