package edu.brown.benchmark.seats;
import java.util.BitSet;
import org.junit.Test;
import org.voltdb.CatalogContext;
import org.voltdb.ClientResponseImpl;
import org.voltdb.VoltTable;
import org.voltdb.VoltType;
import org.voltdb.types.TimestampType;
import edu.brown.BaseTestCase;
import edu.brown.benchmark.seats.SEATSClient.NewReservationCallback;
import edu.brown.benchmark.seats.util.Reservation;
import edu.brown.hstore.HStoreConstants;
import edu.brown.hstore.Hstoreservice.Status;
public class TestSEATSClient extends SEATSBaseTestCase {
static long FLIGHT_ID = 100001;
static long AIRLINE_ID = 100;
static long DEPART_AIRPORT_ID = 10;
static long ARRIVE_AIRPORT_ID = 15;
static int SEATNUM = 13;
static TimestampType BENCHMARK_START = new TimestampType();
static TimestampType FLIGHT_DATE = new TimestampType(BENCHMARK_START.getTime() + 1000000l);
static long TXN_ID = 1000;
static long CLIENT_HANDLE = 1234;
static long RESERVATION_ID = 9999;
protected static final double SCALE_FACTOR = 1000;
protected static final String MOCK_ARGS[] = {
"CLIENT.SCALEFACTOR=" + SCALE_FACTOR,
"HOST=localhost",
"NUMCLIENTS=1",
"NOCONNECTIONS=true",
""
};
private class MockClient extends SEATSClient {
public MockClient(String[] args) {
super(args);
super.clearCache();
}
@Override
public CatalogContext getCatalogContext() {
return (BaseTestCase.catalogContext);
}
}
private long flight_id;
private long customer_id;
private SEATSClient client;
@Override
protected void setUp() throws Exception {
super.setUp();
this.flight_id = 10000l;
this.customer_id = 99999l;
MOCK_ARGS[MOCK_ARGS.length-1] = HStoreConstants.BENCHMARK_PARAM_PREFIX + "DATADIR=" + SEATSBaseTestCase.AIRLINE_DATA_DIR;
// System.err.println(StringUtil.join("\n", MOCK_ARGS));
this.client = new MockClient(MOCK_ARGS);
}
/**
* testSeatBitMap
*/
@Test
public void testSeatBitMap() throws Exception {
BitSet seats = client.getSeatsBitSet(flight_id);
assertNotNull(seats);
assertFalse(client.isFlightFull(seats));
for (int i = 0; i < SEATSConstants.FLIGHTS_NUM_SEATS; i++) {
assertFalse("SEAT #" + i, seats.get(i));
seats.set(i);
assertTrue("SEAT #" + i, seats.get(i));
if (i+1 < SEATSConstants.FLIGHTS_NUM_SEATS)
assertFalse(client.isFlightFull(seats));
} // FOR
assertTrue(client.isFlightFull(seats));
}
/**
* testIsFlightFull
*/
@Test
public void testIsFlightFull() throws Exception {
BitSet seats = new BitSet(SEATSConstants.FLIGHTS_NUM_SEATS);
int seatnum = rand.nextInt(SEATSConstants.FLIGHTS_NUM_SEATS);
assertFalse(seats.get(seatnum));
seats.set(seatnum);
assertTrue(seats.get(seatnum));
assertFalse(client.isFlightFull(seats));
}
/**
* testNewReservationCallback
*/
@Test
public void testNewReservationCallback() throws Exception {
int seatnum = rand.nextInt(SEATSConstants.FLIGHTS_NUM_SEATS);
BitSet seats = client.getSeatsBitSet(this.flight_id);
assertNotNull(seats);
assertFalse(seats.toString(), client.isFlightFull(seats));
assertFalse(seats.get(seatnum));
// System.err.println(seats);
// Fake a ClientResponse from a NewReservation txn
VoltTable results[] = new VoltTable[] {
new VoltTable(new VoltTable.ColumnInfo("id", VoltType.BIGINT)),
new VoltTable(new VoltTable.ColumnInfo("id", VoltType.BIGINT))
};
results[0].addRow(new Long(1));
ClientResponseImpl cresponse = new ClientResponseImpl(TXN_ID, CLIENT_HANDLE,
0, Status.OK,
results, "");
Reservation r = new Reservation(RESERVATION_ID, this.flight_id, customer_id, seatnum);
assertNotNull(r);
NewReservationCallback callback = this.client.new NewReservationCallback(r);
callback.clientCallback(cresponse);
// Check to make sure that our seat is now reserved
assertFalse("Flight is incorrectly marked as full\n" + seats, client.isFlightFull(seats));
// FIXME assertTrue("Failed to mark seat as reserved?", seats.get(seatnum));
}
}