package org.basex.http.rest; import static org.junit.Assert.*; import java.io.*; import org.basex.http.*; import org.basex.util.*; import org.junit.*; /** * This class sends parallel GET requests to the REST API. * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen */ public final class RESTParallelGetTest extends HTTPTest { /** Client count. */ private static final int CLIENTS = 10; /** Runs per client. */ private static final int RUNS = 10; /** Failed string. */ private static String failed; // INITIALIZERS ============================================================= /** * Start server. * @throws Exception exception */ @BeforeClass public static void start() throws Exception { init(REST_ROOT, true); } // TEST METHODS ============================================================= /** * Concurrency test. * @throws Exception exception */ @Test public void test() throws Exception { get("?command=create+db+" + REST + "+<a/>"); // start and join concurrent clients final Client[] clients = new Client[CLIENTS]; final int cs = clients.length; for(int i = 0; i < cs; i++) clients[i] = new Client(); for(final Client c : clients) c.start(); for(final Client c : clients) c.join(); get("?command=drop+db+" + REST); if(failed != null) fail(failed); } /** Client class. */ private static class Client extends Thread { @Override public void run() { try { for(int i = 0; i < RUNS && failed == null; i++) { final double rnd = Math.random(); final boolean query = rnd < 1 / 3.0d; final boolean delete = rnd > 2 / 3.0d; if(query) get('/' + REST + "?query=count(.)"); else if(delete) get('/' + REST + "?query=db:delete('rest','/')"); else get('/' + REST + "?query=db:add('rest',<a/>,'x')"); } } catch(final IOException ex) { failed = ex.getMessage(); Util.stack(ex); } } } }