DefaultExpectedDataSetAndVerifyTableDefinitionVerifier.java

  1. package org.dbunit;

  2. import java.util.HashSet;
  3. import java.util.Set;

  4. import org.dbunit.database.DatabaseConfig;
  5. import org.dbunit.dataset.DataSetException;
  6. import org.dbunit.dataset.IDataSet;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;

  9. /**
  10.  * Default implementation for
  11.  * {@link ExpectedDataSetAndVerifyTableDefinitionVerifier} which logs the
  12.  * mismatches and fails the test when an expected table does not have a
  13.  * VerifyTableDefinition.
  14.  *
  15.  * Can disable failing the test on mismatch with property
  16.  * {@link DatabaseConfig#PROPERTY_ALLOW_VERIFYTABLEDEFINITION_EXPECTEDTABLE_COUNT_MISMATCH}
  17.  * , setting it to false.
  18.  *
  19.  * Can change the implementation by extending this class or implementing
  20.  * {@link ExpectedDataSetAndVerifyTableDefinitionVerifier} and calling
  21.  * {@link DefaultPrepAndExpectedTestCase#setExpectedDataSetAndVerifyTableDefinitionVerifier}
  22.  * .
  23.  *
  24.  * @author Jeff Jensen
  25.  */
  26. public class DefaultExpectedDataSetAndVerifyTableDefinitionVerifier
  27.         implements ExpectedDataSetAndVerifyTableDefinitionVerifier
  28. {
  29.     private final Logger log = LoggerFactory.getLogger(getClass());

  30.     public void verify(final VerifyTableDefinition[] verifyTableDefinitions,
  31.             final IDataSet expectedDataSet, final DatabaseConfig config)
  32.             throws DataSetException
  33.     {
  34.         final String methodName = "verify";

  35.         final int verifyTableDefsCount = verifyTableDefinitions.length;

  36.         final String[] expectedTableNames = expectedDataSet.getTableNames();
  37.         final int expectedTablesCount = expectedTableNames.length;

  38.         log.debug(
  39.                 "{}: expectedTables count={}, verifyTableDefinitions count={}",
  40.                 methodName, expectedTablesCount, verifyTableDefsCount);

  41.         if (expectedTablesCount > verifyTableDefsCount)
  42.         {
  43.             handleCountMismatch(verifyTableDefinitions, expectedTableNames,
  44.                     config);
  45.         }
  46.     }

  47.     protected void handleCountMismatch(
  48.             final VerifyTableDefinition[] verifyTableDefinitions,
  49.             final String[] expectedTableNames, final DatabaseConfig config)
  50.             throws DataSetException
  51.     {
  52.         final String methodName = "handleCountMismatch";

  53.         final int verifyTableDefsCount = verifyTableDefinitions.length;
  54.         final int expectedTablesCount = expectedTableNames.length;

  55.         final String msg = "{}: Test specified {} expected tables"
  56.                 + " and {} VerifyTableDefinitions;"
  57.                 + " usually these numbers should match as an expected table"
  58.                 + " is not verified without a VerifyTableDefinition";
  59.         log.warn(msg, methodName, expectedTablesCount, verifyTableDefsCount);

  60.         final Set<String> mismatchedTableNames = makeMismatchedTableNamesList(
  61.                 verifyTableDefinitions, expectedTableNames);
  62.         failOnMismatch(config, mismatchedTableNames);
  63.     }

  64.     protected Set<String> makeMismatchedTableNamesList(
  65.             final VerifyTableDefinition[] verifyTableDefinitions,
  66.             final String[] expectedTableNames)
  67.     {
  68.         final Set<String> tables = new HashSet<String>();

  69.         final String methodName = "makeMismatchedTableNamesList";

  70.         final int expectedTablesCount = expectedTableNames.length;
  71.         for (int i = 0; i < expectedTablesCount; i++)
  72.         {
  73.             final String expectedTableName = expectedTableNames[i];
  74.             final boolean isExpectedTableExist =
  75.                     isVerifyTableDefinitionsHasTable(verifyTableDefinitions,
  76.                             expectedTableName);

  77.             if (!isExpectedTableExist)
  78.             {
  79.                 final String msg = "{}: expected table name={} does not have"
  80.                         + " a corresponding VerifyTableDefinition";
  81.                 log.warn(msg, methodName, expectedTableName);
  82.                 tables.add(expectedTableName);
  83.             }
  84.         }
  85.         return tables;
  86.     }

  87.     protected boolean isVerifyTableDefinitionsHasTable(
  88.             final VerifyTableDefinition[] verifyTableDefinitions,
  89.             final String expectedTableName)
  90.     {
  91.         boolean isExpectedTableFound = false;
  92.         for (int j = 0; j < verifyTableDefinitions.length
  93.                 && !isExpectedTableFound; j++)
  94.         {
  95.             final VerifyTableDefinition verifyTableDefinition =
  96.                     verifyTableDefinitions[j];
  97.             final String definitionTableName =
  98.                     verifyTableDefinition.getTableName();
  99.             isExpectedTableFound =
  100.                     expectedTableName.equals(definitionTableName);
  101.         }
  102.         return isExpectedTableFound;
  103.     }

  104.     protected void failOnMismatch(final DatabaseConfig config,
  105.             final Set<String> mismatchCountTables) throws DataSetException
  106.     {
  107.         final String methodName = "failOnMismatch";

  108.         final boolean allowCountMismatch = (Boolean) config.getProperty(
  109.                 DatabaseConfig.PROPERTY_ALLOW_VERIFYTABLEDEFINITION_EXPECTEDTABLE_COUNT_MISMATCH);
  110.         final String willFailTestWord = allowCountMismatch ? " not" : "";
  111.         log.info("{}: Property {} is set to {} so will{} fail test", methodName,
  112.                 DatabaseConfig.PROPERTY_ALLOW_VERIFYTABLEDEFINITION_EXPECTEDTABLE_COUNT_MISMATCH,
  113.                 allowCountMismatch, willFailTestWord);
  114.         if (!allowCountMismatch)
  115.         {
  116.             final int mismatchCount = mismatchCountTables.size();
  117.             final String msg = "The following " + mismatchCount
  118.                     + " expected tables do not have"
  119.                     + " corresponding VerifyTableDefinitions: "
  120.                     + mismatchCountTables + "\nSet property '"
  121.                     + DatabaseConfig.PROPERTY_ALLOW_VERIFYTABLEDEFINITION_EXPECTEDTABLE_COUNT_MISMATCH
  122.                     + "' to true to suppress test fail.";
  123.             throw new DataSetException(msg);
  124.         }
  125.     }
  126. }