package org.voltdb.regressionsuites;
import junit.framework.Test;
import org.voltdb.BackendTarget;
import org.voltdb.VoltSystemProcedure;
import org.voltdb.VoltTable;
import org.voltdb.client.Client;
import org.voltdb.client.ClientResponse;
import org.voltdb.client.ProcCallException;
import org.voltdb.sysprocs.AdHoc;
import edu.brown.benchmark.tm1.TM1Client;
import edu.brown.benchmark.tm1.TM1Client.Transaction;
import edu.brown.benchmark.tm1.TM1Constants;
import edu.brown.benchmark.tm1.TM1ProjectBuilder;
import edu.brown.hstore.Hstoreservice.Status;
/**
* Simple test suite for the TM1 benchmark
* @author pavlo
*/
public class TestTM1Suite extends RegressionSuite {
private static final String PREFIX = "tm1";
private static final double SCALEFACTOR = 0.0001;
private static final long NUM_SUBSCRIBERS = (long)(SCALEFACTOR * TM1Constants.SUBSCRIBER_SIZE);
/**
* Constructor needed for JUnit. Should just pass on parameters to superclass.
* @param name The name of the method to test. This is just passed to the superclass.
*/
public TestTM1Suite(String name) {
super(name);
}
/**
* testInitialize
*/
public void testInitialize() throws Exception {
Client client = this.getClient();
RegressionSuiteUtil.initializeTM1Database(this.getCatalogContext(), client);
String procName = VoltSystemProcedure.procCallName(AdHoc.class);
for (String tableName : TM1Constants.TABLENAMES) {
String query = "SELECT COUNT(*) FROM " + tableName;
ClientResponse cresponse = client.callProcedure(procName, query);
assertEquals(Status.OK, cresponse.getStatus());
VoltTable results[] = cresponse.getResults();
assertEquals(1, results.length);
long count = results[0].asScalarLong();
if (tableName.equals(TM1Constants.TABLENAME_SUBSCRIBER)) {
assertEquals(tableName, NUM_SUBSCRIBERS, count);
} else {
assertTrue(tableName + " -> " + count, count > 0);
}
System.err.println(tableName + "\n" + results[0]);
} // FOR
}
/**
* testDeleteCallForwarding
*/
public void testDeleteCallForwarding() throws Exception {
Client client = this.getClient();
RegressionSuiteUtil.initializeTM1Database(this.getCatalogContext(), client);
TM1Client.Transaction txn = Transaction.DELETE_CALL_FORWARDING;
Object params[] = txn.generateParams(NUM_SUBSCRIBERS);
for (int i = 0; i < 1000; i++) {
ClientResponse cresponse = null;
try {
cresponse = client.callProcedure(txn.callName, params);
assertEquals(Status.OK, cresponse.getStatus());
} catch (ProcCallException ex) {
cresponse = ex.getClientResponse();
// System.err.println();
assertEquals(cresponse.toString(), Status.ABORT_USER, cresponse.getStatus());
}
assertNotNull(cresponse);
} // FOR
}
/**
* testGetAccessData
*/
public void testGetAccessData() throws Exception {
Client client = this.getClient();
RegressionSuiteUtil.initializeTM1Database(this.getCatalogContext(), client);
TM1Client.Transaction txn = Transaction.GET_ACCESS_DATA;
Object params[] = txn.generateParams(NUM_SUBSCRIBERS);
ClientResponse cresponse = client.callProcedure(txn.callName, params);
assertNotNull(cresponse);
assertEquals(Status.OK, cresponse.getStatus());
assertTrue(cresponse.toString(), cresponse.isSinglePartition());
}
/**
* testGetNewDestination
*/
public void testGetNewDestination() throws Exception {
Client client = this.getClient();
RegressionSuiteUtil.initializeTM1Database(this.getCatalogContext(), client);
TM1Client.Transaction txn = Transaction.DELETE_CALL_FORWARDING;
Object params[] = txn.generateParams(NUM_SUBSCRIBERS);
ClientResponse cresponse = null;
try {
cresponse = client.callProcedure(txn.callName, params);
assertEquals(Status.OK, cresponse.getStatus());
} catch (ProcCallException ex) {
cresponse = ex.getClientResponse();
assertEquals(cresponse.toString(), Status.ABORT_USER, cresponse.getStatus());
}
assertNotNull(cresponse);
assertTrue(cresponse.toString(), cresponse.isSinglePartition());
}
/**
* testGetSubscriberData
*/
public void testGetSubscriberData() throws Exception {
Client client = this.getClient();
RegressionSuiteUtil.initializeTM1Database(this.getCatalogContext(), client);
TM1Client.Transaction txn = Transaction.GET_SUBSCRIBER_DATA;
Object params[] = txn.generateParams(NUM_SUBSCRIBERS);
ClientResponse cresponse = client.callProcedure(txn.callName, params);
assertNotNull(cresponse);
assertTrue(cresponse.toString(), cresponse.isSinglePartition());
}
/**
* testInsertCallForwarding
*/
public void testInsertCallForwarding() throws Exception {
Client client = this.getClient();
RegressionSuiteUtil.initializeTM1Database(this.getCatalogContext(), client);
TM1Client.Transaction txn = Transaction.INSERT_CALL_FORWARDING;
Object params[] = txn.generateParams(NUM_SUBSCRIBERS);
ClientResponse cresponse = null;
try {
cresponse = client.callProcedure(txn.callName, params);
assertEquals(Status.OK, cresponse.getStatus());
} catch (ProcCallException ex) {
cresponse = ex.getClientResponse();
assertEquals(Status.ABORT_USER, cresponse.getStatus());
}
assertNotNull(cresponse);
}
/**
* testUpdateLocation
*/
public void testUpdateLocation() throws Exception {
Client client = this.getClient();
RegressionSuiteUtil.initializeTM1Database(this.getCatalogContext(), client);
TM1Client.Transaction txn = Transaction.UPDATE_LOCATION;
Object params[] = txn.generateParams(NUM_SUBSCRIBERS);
ClientResponse cresponse = client.callProcedure(txn.callName, params);
assertNotNull(cresponse);
assertEquals(Status.OK, cresponse.getStatus());
}
/**
* testUpdateSubscriberData
*/
public void testUpdateSubscriberData() throws Exception {
Client client = this.getClient();
RegressionSuiteUtil.initializeTM1Database(this.getCatalogContext(), client);
TM1Client.Transaction txn = Transaction.UPDATE_SUBSCRIBER_DATA;
Object params[] = txn.generateParams(NUM_SUBSCRIBERS);
ClientResponse cresponse = null;
try {
cresponse = client.callProcedure(txn.callName, params);
assertEquals(Status.OK, cresponse.getStatus());
} catch (ProcCallException ex) {
cresponse = ex.getClientResponse();
assertEquals(Status.ABORT_USER, cresponse.getStatus());
}
assertNotNull(cresponse);
assertTrue(cresponse.toString(), cresponse.isSinglePartition());
}
public static Test suite() {
VoltServerConfig config = null;
// the suite made here will all be using the tests from this class
MultiConfigSuiteBuilder builder = new MultiConfigSuiteBuilder(TestTM1Suite.class);
builder.setGlobalConfParameter("client.scalefactor", SCALEFACTOR);
// build up a project builder for the TPC-C app
TM1ProjectBuilder project = new TM1ProjectBuilder();
project.addAllDefaults();
boolean success;
/////////////////////////////////////////////////////////////
// CONFIG #1: 1 Local Site/Partition running on JNI backend
/////////////////////////////////////////////////////////////
config = new LocalSingleProcessServer(PREFIX+"-1part.jar", 1, BackendTarget.NATIVE_EE_JNI);
success = config.compile(project);
assert(success);
builder.addServerConfig(config);
/////////////////////////////////////////////////////////////
// CONFIG #2: 1 Local Site with 2 Partitions running on JNI backend
/////////////////////////////////////////////////////////////
config = new LocalSingleProcessServer(PREFIX+"-2part.jar", 2, BackendTarget.NATIVE_EE_JNI);
success = config.compile(project);
assert(success);
builder.addServerConfig(config);
////////////////////////////////////////////////////////////
// CONFIG #3: cluster of 2 nodes running 2 site each, one replica
////////////////////////////////////////////////////////////
config = new LocalCluster(PREFIX+"-cluster.jar", 2, 2, 1, BackendTarget.NATIVE_EE_JNI);
success = config.compile(project);
assert(success);
builder.addServerConfig(config);
return builder;
}
}