An XML format is used for JDBDT log files and for the output of calls to JDBDT.dump.
Every JDBDT log message is defined by a jdbdt-log-message XML node. For each node of this type:
Illustration
<jdbdt-log-message time="..." version="...">
<context>
<caller>
<class>org.foo.MyTestClass</class>
<method>myTestMethod</method>
<file>MyTest.java</file>
<line>999</line>
</caller>
<api-method>
<class>org.jdbdt.JDBDT</class>
<method>dump</method>
<file>JDBDT.java</file>
<line>541</line>
</api-method>
</context>
<data-source type="Table">
<columns count="4">
<column index="1" label="LOGIN" sql-type="VARCHAR"/>
<column index="2" label="NAME" sql-type="VARCHAR"/>
<column index="3" label="PASSWORD" sql-type="VARCHAR"/>
<column index="4" label="CREATED" sql-type="DATE"/>
</columns>
<sql><![CDATA[SELECT login, name, password, created FROM Users]]></sql>
</data-source>
A data-set node displays the contents of a data set that associates to some JDBDT operation (e.g., populate, dump). All rows are detailed in data-set/rows. For each column in a row, a column node indicates the column value as well as its column label (label attribute) and Java type (java-type).
Illustration
<data-set>
<rows count="4">
<row>
<column java-type="java.lang.String" label="LOGIN">root</column>
<column java-type="java.lang.String" label="NAME">Root User</column>
<column java-type="java.lang.String" label="PASSWORD">I like JDBDT</column>
<column java-type="java.sql.Date" label="CREATED">2015-01-01</column>
</row>
<row>
<column java-type="java.lang.String" label="LOGIN">linus</column>
<column java-type="java.lang.String" label="NAME">Linus You Know Who</column>
<column java-type="java.lang.String" label="PASSWORD">linux</column>
<column java-type="java.sql.Date" label="CREATED">2014-10-31</column>
</row>
<row>
<column java-type="java.lang.String" label="LOGIN">steve</column>
<column java-type="java.lang.String" label="NAME">Steve You Know Who</column>
<column java-type="java.lang.String" label="PASSWORD">apple</column>
<column java-type="java.sql.Date" label="CREATED">2010-05-30</column>
</row>
<row>
<column java-type="java.lang.String" label="LOGIN">bill</column>
<column java-type="java.lang.String" label="NAME">Bill You Know Who</column>
<column java-type="java.lang.String" label="PASSWORD">windows</column>
<column java-type="java.sql.Date" label="CREATED">2016-01-01</column>
</row>
</rows>
</data-set>
An assertion node refers to a database state assertion or a data set assertion. It comprises:
Illustration
In the fragment below, the assertion error relates to a mismatch between the expected and actual values of the CREATED column for the linus “user” row, 2015-01-01 (expected) versus 2016-01-01 (actual). The steve and bill “users” were matched.
<assertion>
<expected count="3">
<row>
<column java-type="java.lang.String" label="LOGIN">linus</column>
<column java-type="java.lang.String" label="NAME">Linus Torvalds</column>
<column java-type="java.lang.String" label="PASSWORD">linux</column>
<column java-type="java.sql.Date" label="CREATED">2015-01-01</column>
</row>
<row>
<column java-type="java.lang.String" label="LOGIN">steve</column>
<column java-type="java.lang.String" label="NAME">Steve Jobs</column>
<column java-type="java.lang.String" label="PASSWORD">macos</column>
<column java-type="java.sql.Date" label="CREATED">2015-12-31</column>
</row>
<row>
<column java-type="java.lang.String" label="LOGIN">bill</column>
<column java-type="java.lang.String" label="NAME">Bill Gates</column>
<column java-type="java.lang.String" label="PASSWORD">windows</column>
<column java-type="java.sql.Date" label="CREATED">2015-09-12</column>
</row>
</rows>
<errors>
<expected count="1">
<row>
<column java-type="java.lang.String" label="LOGIN">linus</column>
<column java-type="java.lang.String" label="NAME">Linus Torvalds</column>
<column java-type="java.lang.String" label="PASSWORD">linux</column>
<column java-type="java.sql.Date" label="CREATED">2015-01-01</column>
</row>
</expected>
<actual count="1">
<row>
<column java-type="java.lang.String" label="LOGIN">linus</column>
<column java-type="java.lang.String" label="NAME">Linus Torvalds</column>
<column java-type="java.lang.String" label="PASSWORD">linux</column>
<column java-type="java.sql.Date" label="CREATED">2016-01-01</column>
</row>
</expected>
</errors>
</assertion>
A delta-assertion node refers to a database delta assertion. For an assertion where the expected delta is δ = (O, N) and the actual delta is δ‘ = (O’, N’):
Note that, as for state assertions, errors lists only rows that caused the assertion to fail, i.e., matched rows are not listed.
Illustration
The fragment below illustrates a failed delta assertion, where no database changes were expected. Both expected/old-data and expected/new-data are empty, i.e., O = N = ∅, as in a call to assertUnchanged. The error at stake, identified in errors/old-data/actual, relates to the fact that the entry for “user” linus was removed.
<delta-assertion>
<expected>
<old-data count="0"/>
<new-data count="0"/>
</expected>
<errors>
<old-data>
<expected count="0"/>
<actual count="1">
<row>
<column java-type="java.lang.String" label="LOGIN">linus</column>
<column java-type="java.lang.String" label="NAME">Linus Torvalds</column>
<column java-type="java.lang.String" label="PASSWORD">linux</column>
<column java-type="java.sql.Date" label="CREATED">2015-01-01</column>
</row>
</actual>
</old-data>
<new-data>
<expected count="0"/>
<actual count="0"/>
</new-data>
</errors>
</delta-assertion>
<a name="DatabaseExceptions"></a>
A database-exception node refers to the stack trace of an SQLException thrown by the database engine during the execution of a JDBDT operation.
Illustration
<database-exception><![CDATA[
java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: XXX in statement [SELECT XXX FROM Users]
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
at org.jdbdt.DB.compile(DB.java:276)
... [etc]
]]></database-exception>