package hk.hku.cecid.edi.sfrm.handler;
import junit.framework.TestCase;
import hk.hku.cecid.edi.sfrm.pkg.SFRMMessage;
/**
* The test-case of <code>SFRMDoSHandler</code>.
*
* Creation Date: 03/07/2007
*
* @author Twinsen Tsang
* @version 1.0.0
* @since Dwarf 10606
*/
public class SFRMDoSHandlerTest extends TestCase {
// The set of sample message.
private SFRMMessage input0;
private SFRMMessage input1;
// The set of sample message id;
private String sampleMessageId0 = "test0@message-id";
private String sampleMessageId1 = "test1@message-id";
// The test target.
private SFRMDoSHandler doSHandler;
/**
* Invoke for setup.
*/
protected void setUp() throws Exception {
super.setUp();
doSHandler = new SFRMDoSHandler();
input0 = new SFRMMessage();
input0.setMessageID(sampleMessageId0);
input0.setSegmentNo(0);
input0.setSegmentType("PAYLOAD");
input1 = new SFRMMessage();
input1.setMessageID(sampleMessageId1);
input1.setSegmentNo(1);
input1.setSegmentType("RECEIPT");
}
/**
* Simplest Testcase for a message entering the DoS Handler.
*/
public void testEnter_Pos_0(){
TestCase.assertEquals(true, doSHandler.enter(input0));
}
/**
* Testcase for multiple message entering the DoS Handler.
*/
public void testEnter_Pos_1(){
TestCase.assertEquals(true, doSHandler.enter(input0));
TestCase.assertEquals(true, doSHandler.enter(input1));
}
/**
* Testcase for duplicate message entering the DosHandler.
*/
public void testEnter_Neg_0(){
TestCase.assertEquals(true , doSHandler.enter(input0));
// Duplicate message record should return false.
TestCase.assertEquals(false, doSHandler.enter(input0));
}
/**
* Testcase for a message entering the DoSHandler with a
* specified lifetime. The record should be removed
* after at least (1 + sweeping_interval) seconds.
*/
public void testEnterWithLifetime_Pos_0(){
// Expire after 1 second.
TestCase.assertEquals(true , doSHandler.enter(input0, 1000));
// At least one timed-out sweeping has been done after 6 seconds.
try{ Thread.sleep(6000); }catch(Exception ex){}
TestCase.assertEquals(false, doSHandler.exit (input0));
}
/**
* Testcase for a message entering the DosHandler with a specified
* lifetime. The record should exist within the lifetime.
*/
public void testEnterWithLifetime_Pos_1(){
// Expire after 1 second.
TestCase.assertEquals(true , doSHandler.enter(input0, 1000));
// At least one timed-out sweeping has been done after 6 seconds.
try{ Thread.sleep(500); }catch(Exception ex){}
TestCase.assertEquals(true, doSHandler.exit (input0));
}
/**
* Testcase for entering the message after previous thread owner
* has been died.
*/
public void testEnterAfterThreadDie_Pos_0(){
// Mark self reference.
final SFRMDoSHandlerTest owner = this;
// Create a dummy thread for enter a message into DoSHandler.
Thread testThread = new Thread(new Runnable(){
public void run(){
try{
TestCase.assertEquals(true, owner.doSHandler.enter(owner.input0));
Thread.sleep(1000);
}catch(Exception ex){}
}
});
// Start the testing thread.
testThread.start();
// Wait the test thread die.
try{ testThread.join(); }catch(Exception ex){}
// The testing thread has died, it should allow input0 enter again.
TestCase.assertEquals(true, doSHandler.enter(input0));
}
/**
* Testcase for entering the message being owner by other
* active thread.
*/
public void testEnterAfterThreadDie_Pos_1(){
// Mark self reference.
final SFRMDoSHandlerTest owner = this;
// Create a dummy thread for enter a message into DoSHandler.
Thread testThread = new Thread(new Runnable(){
public void run(){
try{
TestCase.assertEquals(true, owner.doSHandler.enter(owner.input0));
Thread.sleep(1000);
}catch(Exception ex){}
}
});
// Start the testing thread.
testThread.start();
try{ Thread.sleep(500); }catch(Exception ex){}
// The testing thread has not died, it should not allow input0 enter again.
TestCase.assertEquals(false, doSHandler.enter(input0));
}
/**
* Testcase for entering the message after previous thread owner
* has been interrupted.
*/
// Commented testEnterAfterThreadDie_Pos_2 because it's hard to predict alive time after the thread is interrupted, it's also environment dependent.
/*
public void testEnterAfterThreadDie_Pos_2(){
// Mark self reference.
final SFRMDoSHandlerTest owner = this;
// Create a dummy thread for enter a message into DoSHandler.
Thread testThread = new Thread(new Runnable(){
public void run(){
try{
TestCase.assertEquals(true, owner.doSHandler.enter(owner.input0));
// Guarantee the thread is alive when being interrupted by main thread.
Thread.sleep(10000);
}catch(Exception ex){}
}
});
// Start the testing thread.
testThread.start();
try{ Thread.sleep(500); testThread.interrupt(); }catch(Exception ex){}
//Since the thread cannot be interrupt, when the thread is sleeping, so it still alive
//and cannot enter the barrier
TestCase.assertEquals(false, doSHandler.enter(input0));
}
*/
/**
* Testcase for entering and exiting for one record.
*/
public void testExit_Pos_0(){
TestCase.assertEquals(true, doSHandler.enter(input0));
TestCase.assertEquals(true, doSHandler.exit (input0));
}
/**
* Testcase for entering one record, but with a illegal message
* exiting.
*/
public void testExit_Neg_0(){
TestCase.assertEquals(true , doSHandler.enter(input0));
TestCase.assertEquals(false, doSHandler.exit (input1));
}
}