package org.omg.lsae.sax.test;

import org.omg.lsae.notifications.*;
import junit.framework.*;
import java.net.URL;

public class AnalysisEventTestCase extends TestCase {
    private final static String SOAP_MSG_RESOURCE = "org/omg/lsae/sax/test/SOAPMessage.xml";
    private final static String LSAE_MSG_RESOURCE = "org/omg/lsae/sax/test/LSAEMessage.xml";

    private final static int SOAP_MSG_EVENT_COMPLETED_NUM = 0;// oracle values 
    private final static String[] SOAP_MSG_EVENT_NAMES = new String[]{"sip_1_", "sip_2_"};
    private final static String[] SOAP_MSG_EVENT_PREV_STATES = new String[]{"running", "created"};
    private final static String[] SOAP_MSG_EVENT_NEW_STATES = new String[]{"terminated_by_error", "running"};
    private final static Class[] SOAP_MSG_EVENT_CLASSES = new Class[]{StateEvent.class, StateEvent.class};  

    private final static String LSAE_MSG_EVENT_NAME = "baz";
    private final static String LSAE_MSG_EVENT_MSG_CONTAINS = "...";
    private final static String LSAE_MSG_EVENT_MSG_NOT_CONTAINS = "another";
    private final static String LSAE_MSG_EVENT_TIMESTAMP = "2007-02-31T11:14:55Z";

    /**
     * @param name Test case name.
     */
    public AnalysisEventTestCase(String name) {
        super(name);
    }

    public void testSOAP(){
	URL testURL = getClass().getClassLoader().getResource(SOAP_MSG_RESOURCE);
	assertNotNull("Could not find the test SOAP/LSAE XML document (" + SOAP_MSG_RESOURCE + ")",
		      testURL);
	
	String soapMessage = getContent(testURL);
	assertTrue("The test SOAP/LSAE message was blank", soapMessage != null && soapMessage.length() > 0);

	AnalysisEvent[] events = null;
	try{
	    events = AnalysisEvent.createFromXML(soapMessage);
	} catch(Exception e){
	    e.printStackTrace();
	    fail("Exception while creating the AnalysisEvent objects from the test SOAP data ("+testURL+"): "+e);
	}
	assertNotNull("AnalysisEvent.createFromXML() returned a null array after " +
		      "parsing the test data (" + testURL + ").", events);

	assertTrue("The number of events parsed from the test SOAP data ("+testURL+
		   ") was not correct (expected "+SOAP_MSG_EVENT_NAMES.length + ", but got " + events.length+")",
		   events.length == SOAP_MSG_EVENT_NAMES.length);

	for(int i = 0; i < events.length; i++){
	    assertNotNull("An event (#"+(i+1)+") in the SOAP/LSAE test data ("+testURL+
			  ") was parsed to a null object!", events[i]);

	    assertTrue("An event (#"+(i+1)+") in the SOAP/LSAE test data ("+testURL+
		       ") was parsed to the wrong class (expected "+
		       SOAP_MSG_EVENT_CLASSES[i]+", but got "+events[i].getClass()+")",
		       events[i].getClass().equals(SOAP_MSG_EVENT_CLASSES[i]));

	    if(events[i].getClass().equals(StateEvent.class)){
		StateEvent se = (StateEvent) events[i];
		assertTrue("An event (#"+(i+1)+") in the SOAP/LSAE test data ("+testURL+
			   ") has the wrong query ID (expected " + SOAP_MSG_EVENT_NAMES[i] +
			   ", but got " + se.getQueryId()+")",
			   se.getQueryId() != null && se.getQueryId().equals(SOAP_MSG_EVENT_NAMES[i]));

		assertTrue("An event (#"+(i+1)+") in the SOAP/LSAE test data ("+testURL+
			   ") has the wrong previous state (expected " + SOAP_MSG_EVENT_PREV_STATES[i] +
			   ", but got " + se.getPreviousState()+")",
			   se.getPreviousState() != null && se.getPreviousState().equals(SOAP_MSG_EVENT_PREV_STATES[i]));
		
		assertTrue("An event (#"+(i+1)+") in the SOAP/LSAE test data ("+testURL+
			   ") has the wrong new state (expected " + SOAP_MSG_EVENT_NEW_STATES[i] +
			   ", but got " + se.getNewState()+")",
			   se.getNewState() != null && se.getNewState().equals(SOAP_MSG_EVENT_NEW_STATES[i]));
	    }
	}
	
	// Hardcoded oracle assumes at least one job in the test data in completed
	assertTrue("Event #"+(SOAP_MSG_EVENT_COMPLETED_NUM+1)+" should be considered complete, "+
		   "but isCompleted() returned false (test data "+testURL+")",
		   events[SOAP_MSG_EVENT_COMPLETED_NUM].isCompleted());
    }

    public void testLSAE(){
	URL testURL = getClass().getClassLoader().getResource(LSAE_MSG_RESOURCE);
	assertNotNull("Could not find the test SOAP/LSAE XML document (" + LSAE_MSG_RESOURCE + ")",
		      testURL);
	
	String lsaeMessage = getContent(testURL);
	assertTrue("The test SOAP/LSAE message was blank", lsaeMessage != null && lsaeMessage.length() > 0);

	AnalysisEvent[] events = null;
	try{
	    events = AnalysisEvent.createFromXML(lsaeMessage);
	} catch(Exception e){
	    e.printStackTrace();
	    fail("Exception while creating the AnalysisEvent objects from the test SOAP data ("+testURL+"): "+e);
	}
	assertNotNull("AnalysisEvent.createFromXML() returned a null array after " +
		      "parsing the test data (" + testURL + ").", events);

	assertTrue("The number of events parsed from the test LSAE data ("+testURL+
		   ") was not correct (expected 1, but got " + events.length+")",
		   events.length == 1);
	
	assertNotNull("The event parsed from the test LSAE data ("+testURL+
		      ") was null!", events[0]);

	assertTrue("The event parsed from the test LSAE data ("+testURL+
		   ") did not have the correct name (expected "+LSAE_MSG_EVENT_NAME+
		   ", but got " + events[0].getQueryId() + ")", 
		   events[0].getQueryId() != null && 
		   events[0].getQueryId().equals(LSAE_MSG_EVENT_NAME));

	assertTrue("The event parsed from the test LSAE data ("+testURL+
		   ") did not have the correct timestamp (expected " +
		   LSAE_MSG_EVENT_TIMESTAMP + ", but got " + events[0].getTimestamp()  + "",
		   events[0].getTimestamp() != null && 
		   events[0].getTimestamp().equals(LSAE_MSG_EVENT_TIMESTAMP));

	String message = events[0].getMessage();
	assertNotNull("The event parsed from the test LSAE data ("+testURL+
		      ") has a blank message, but shouldn't" , message);
	assertTrue("The event parsed from the test LSAE data ("+testURL+
		   ") did not contain an expect string ("+LSAE_MSG_EVENT_MSG_CONTAINS+")", 
		   message.indexOf(LSAE_MSG_EVENT_MSG_CONTAINS) != -1);
	assertTrue("The event parsed from the test LSAE data ("+testURL+
		   ") did contained a string it shouldn't ("+LSAE_MSG_EVENT_MSG_NOT_CONTAINS+")", 
		   message.indexOf(LSAE_MSG_EVENT_MSG_NOT_CONTAINS) == -1);
    }

    private static String getContent(URL u){
	StringBuffer contents = new StringBuffer();
	try{
	    java.io.LineNumberReader reader = new java.io.LineNumberReader(new java.io.InputStreamReader(u.openStream()));
	    for(String line = reader.readLine(); line != null; line = reader.readLine()){
		contents.append(line+"\n");
	    }
	} catch(Exception e){
	    e.printStackTrace();
	    fail("Cannot load text data from URL " + u);
	}
	return contents.toString();
    }

    /**
     * @return a test suite for all the test methods of this test case.
     */
    public static Test suite() {
	TestSuite suite = new TestSuite();
 	suite.addTest(new AnalysisEventTestCase("testSOAP")); //done
 	suite.addTest(new AnalysisEventTestCase("testLSAE")); //done
        return suite;
    }

    /**
     * Runs the test suite when the class is invoked on the command line.    
     */
    public static void main(String[] args) throws Exception{
	junit.textui.TestRunner.run(suite());
    }

}
