this.prefs.put("converter.addMeta", ""+true);
this.prefs.put("changeDetector.detectStatement", "SELECT colKey, col1, col2, ICAO_ID FROM TEST_POLL");
this.prefs.put("mom.topicName", "db.change.event.TEST_POLL");
this.processor = createTest(new Info(prefs), this.updateMap);
I_ChangeDetector changeDetector = processor.getChangeDetector();
for (int i=0; i<2; i++) {
log.info("Testing no table ...");
changeDetector.checkAgain(null);
sleep(500);
assertEquals("Number of message is wrong", 0, this.updateMap.size());
}
{
log.info("Now testing an empty table ...");
this.dbPool.update("CREATE TABLE TEST_POLL (colKey NUMBER(10,3), col1 VARCHAR(20), col2 NUMBER(12), ICAO_ID VARCHAR(10))");
changeDetector.checkAgain(null);
sleep(500);
assertEquals("Number of message is wrong", 1, this.updateMap.size());
String xml = (String)this.updateMap.get("db.change.event.TEST_POLL");
assertNotNull("No db.change.event.${groupColValue} message has arrived", xml);
assertXpathNotExists("/myRootTag/row[@num='0']", xml);
assertXpathEvaluatesTo("CREATE", "/myRootTag/desc/command/text()", xml);
this.updateMap.clear();
writeToFile("db.change.event.CREATE", xml);
changeDetector.checkAgain(null);
sleep(500);
assertEquals("Number of message is wrong", 0, this.updateMap.size());
}
{
log.info("Insert one row");
this.dbPool.update("INSERT INTO TEST_POLL VALUES ('1.1', '<Bla', '9000', 'EDDI')");
changeDetector.checkAgain(null);
sleep(500);
assertEquals("Number of message is wrong", 1, this.updateMap.size());
String xml = (String)this.updateMap.get("db.change.event.TEST_POLL");
assertNotNull("xml returned is null", xml);
// TODO: We deliver a "UPDATE" because of the CREATE md5: Is it easy possible to detect the INSERT?
assertXpathEvaluatesTo("UPDATE", "/myRootTag/desc/command/text()", xml);
assertXpathEvaluatesTo("<Bla", "/myRootTag/row[@num='0']/col[@name='COL1']/text()", xml);
this.updateMap.clear();
writeToFile("db.change.event.INSERT", xml);
changeDetector.checkAgain(null);
sleep(500);
assertEquals("Number of message is wrong", 0, this.updateMap.size());
}
{
log.info("Update one row");
this.dbPool.update("UPDATE TEST_POLL SET col1='BXXX' WHERE ICAO_ID='EDDI'");
changeDetector.checkAgain(null);
sleep(500);
assertEquals("Number of message is wrong", 1, this.updateMap.size());
String xml = (String)this.updateMap.get("db.change.event.TEST_POLL");
assertXpathEvaluatesTo("UPDATE", "/myRootTag/desc/command/text()", xml);
assertXpathEvaluatesTo("BXXX", "/myRootTag/row[@num='0']/col[@name='COL1']/text()", xml);
this.updateMap.clear();
writeToFile("db.change.event.UPDATE", xml);
changeDetector.checkAgain(null);
sleep(500);
assertEquals("Number of message is wrong", 0, this.updateMap.size());
}
{
log.info("Delete one row");
this.dbPool.update("DELETE FROM TEST_POLL WHERE ICAO_ID='EDDI'");
changeDetector.checkAgain(null);
sleep(500);
assertEquals("Number of message is wrong", 1, this.updateMap.size());
String xml = (String)this.updateMap.get("db.change.event.TEST_POLL");
// TODO: We deliver "UPDATE" instead of DELETE:
assertXpathEvaluatesTo("UPDATE", "/myRootTag/desc/command/text()", xml);
assertXpathNotExists("/myRootTag/row[@num='0']", xml);
this.updateMap.clear();
writeToFile("db.change.event.DELETE", xml);
changeDetector.checkAgain(null);
sleep(500);
assertEquals("Number of message is wrong", 0, this.updateMap.size());
}
{
log.info("Drop a table");
this.dbPool.update("DROP TABLE TEST_POLL");
changeDetector.checkAgain(null);
sleep(500);
assertEquals("Number of message is wrong", 1, this.updateMap.size());
String xml = (String)this.updateMap.get("db.change.event.TEST_POLL");
assertXpathEvaluatesTo("DROP", "/myRootTag/desc/command/text()", xml);
assertXpathNotExists("/myRootTag/row[@num='0']", xml);
this.updateMap.clear();
writeToFile("db.change.event.DROP", xml);
changeDetector.checkAgain(null);
sleep(500);
assertEquals("Number of message is wrong", 0, this.updateMap.size());
}
log.info("SUCCESS");