blob: 5090a9ef0d899485bdd1ecaf85407e6c454b7294 [file]
/*
*
* Derby - Class org.apache.derbyTesting.system.oe.test.OperationsTester
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the License.
*/
package org.apache.derbyTesting.system.oe.test;
import java.util.HashMap;
import org.apache.derbyTesting.junit.BaseJDBCTestCase;
import org.apache.derbyTesting.system.oe.client.Display;
import org.apache.derbyTesting.system.oe.client.Operations;
import org.apache.derbyTesting.system.oe.client.Submitter;
import org.apache.derbyTesting.system.oe.direct.Standard;
import org.apache.derbyTesting.system.oe.model.Customer;
import org.apache.derbyTesting.system.oe.model.District;
import org.apache.derbyTesting.system.oe.model.Order;
import org.apache.derbyTesting.system.oe.model.OrderLine;
import org.apache.derbyTesting.system.oe.model.Warehouse;
import org.apache.derbyTesting.system.oe.util.OERandom;
/**
* Test an implementation of Operations.
* Currently just tests the setup but as more
* code is added the implemetations of the transactions
* will be added.
*/
public class OperationsTester extends BaseJDBCTestCase implements Display {
private Operations ops;
private OERandom rand;
private final short w = 1;
public OperationsTester(String name) {
super(name);
}
protected void setUp() throws Exception
{
ops = new Standard(getConnection());
rand = Submitter.getRuntimeRandom(getConnection());
}
protected void tearDown() throws Exception
{
ops.close();
super.tearDown();
}
public void testStockLevel() throws Exception
{
// Check a null display is handled
ops.stockLevel(null, null,
w, rand.district(), rand.threshold());
for (int i = 0; i < 20; i++) {
short d = rand.district();
int threshold = rand.threshold();
HashMap<String, Number> inputData = new HashMap<String, Number>();
inputData.put("d", d);
inputData.put("threshold", threshold);
ops.stockLevel(this, inputData,
w, d, threshold);
// Ensures the Display object read it.
assertTrue(inputData.isEmpty());
}
}
/**
* Execute a number of order-status transactions
* by name and identifier. Also check the implementation
* accepts a null display.
* @throws Exception
*/
public void testOrderStatus() throws Exception
{
// By identifier
ops.orderStatus(null, null,
w, rand.district(), rand.NURand1023());
for (int i = 0; i < 50; i++) {
short d = rand.district();
int c = rand.NURand1023();
HashMap<String, Number> inputData = new HashMap<String, Number>();
inputData.put("d", d);
inputData.put("c", c);
ops.orderStatus(this, inputData, w, d, c);
// Ensures the Display object read it.
assertTrue(inputData.isEmpty());
}
// By name
ops.orderStatus(null, null,
w, rand.district(), rand.randomCLast());
for (int i = 0; i < 50; i++)
{
short d = rand.district();
String customerLast = rand.randomCLast();
HashMap<String, Object> inputData = new HashMap<String, Object>();
inputData.put("d", d);
inputData.put("customerLast", customerLast);
ops.orderStatus(this, inputData, w, d, customerLast);
// Ensures the Display object read it.
assertTrue(inputData.isEmpty());
}
}
public void testPayment() throws Exception
{
// With no display
ops.payment(null, null, w, rand.district(),
w, rand.district(), rand.randomCLast(), rand.payment().toString());
for (int i = 0; i < 50; i++) {
ops.payment(this, null, w, rand.district(),
w, rand.district(), rand.randomCLast(), rand.payment().toString());
}
// With no display
ops.payment(null, null, w, rand.district(),
w, rand.district(), rand.NURand1023(), rand.payment().toString());
for (int i = 0; i < 50; i++) {
ops.payment(this, null, w, rand.district(),
w, rand.district(), rand.NURand1023(), rand.payment().toString());
}
}
public void testNewOrder() throws Exception
{
for (int x = 0; x < 50; x++)
{
int itemCount = rand.randomInt(5, 15);
int[] items = new int[itemCount];
short[] quantities = new short[itemCount];
short[] supplyW = new short[itemCount];
// rollback 1% of the transactions
boolean willFail = rand.randomInt(1, 100) == 1;
for (int i = 0 ; i < itemCount; i++) {
if (willFail && (i == (itemCount - 1)))
items[i] = 500000; // some invalid value
else
items[i] = rand.NURand8191();
quantities[i] = (short) rand.randomInt(1, 10);
supplyW[i] = w;
}
ops.newOrder(this, null, w, rand.district(),
rand.NURand1023(), items, quantities, supplyW);
}
}
public void testScheduleDelivery() throws Exception
{
for (int i = 0; i < 50; i++)
ops.scheduleDelivery(this, null, w, rand.carrier());
}
public void testDelivery() throws Exception
{
// Ensure there are some schedule deliveries
testScheduleDelivery();
for (int i = 0; i < 50; i++)
ops.delivery();
}
public void displayStockLevel(Object displayData, short w, short d, int threshold, int lowStock) throws Exception {
// Submitter does not fill this in.
if (displayData == null)
return;
HashMap inputData = (HashMap) displayData;
assertEquals("sl:w", this.w, w);
assertEquals("sl:d", ((Short) inputData.get("d")).shortValue(), d);
assertEquals("sl:threshold", ((Integer) inputData.get("threshold")).intValue(), threshold);
assertTrue("sl:low stock", lowStock >= 0);
// Clear it to inform the caller that it was read.
inputData.clear();
}
public void displayOrderStatus(Object displayData, boolean byName, Customer customer, Order order, OrderLine[] lineItems) throws Exception {
// Submitter does not fill this in.
if (displayData == null)
return;
HashMap inputData = (HashMap) displayData;
assertEquals("os:w", this.w, customer.getWarehouse());
assertEquals("os:d", ((Short) inputData.get("d")).shortValue(), customer.getDistrict());
if (byName)
{
assertNotNull(inputData.get("customerLast"));
}
else
{
assertNull(inputData.get("customerLast"));
}
// Clear it to inform the caller that it was read.
inputData.clear();
}
public void displayPayment(Object displayData, String amount, boolean byName, Warehouse warehouse, District district, Customer customer) throws Exception {
// TODO Auto-generated method stub
}
public void displayNewOrder(Object displayData, Warehouse warehouse, District district, Customer customer, Order order) throws Exception {
// TODO Auto-generated method stub
}
public void displayScheduleDelivery(Object displayData, short w, short carrier) throws Exception {
// TODO Auto-generated method stub
}
/**
* Test submitting transactions through Submitter,
* as individual transactions and as a block.
* @throws Exception
*/
public void testSubmitter() throws Exception
{
Submitter submitter = new Submitter(this, this.ops, this.rand,
(short) 1);
int tranCount = 37;
for (int i = 0; i < tranCount; i++)
{
submitter.runTransaction(null);
}
int tranCount2 = 47;
submitter.runTransactions(null, tranCount2);
int[] executeCounts = submitter.getTransactionCount();
int totalTran = 0;
for (int i = 0; i < executeCounts.length; i++)
totalTran += executeCounts[i];
assertEquals("Mismatch on Submitter transaction count",
tranCount + tranCount2, totalTran);
}
}