View Javadoc
1   package org.dbunit;
2   
3   import java.util.HashSet;
4   import java.util.Set;
5   
6   import org.dbunit.database.DatabaseConfig;
7   import org.dbunit.dataset.DataSetException;
8   import org.dbunit.dataset.IDataSet;
9   import org.slf4j.Logger;
10  import org.slf4j.LoggerFactory;
11  
12  /**
13   * Default implementation for
14   * {@link ExpectedDataSetAndVerifyTableDefinitionVerifier} which logs the
15   * mismatches and fails the test when an expected table does not have a
16   * VerifyTableDefinition.
17   *
18   * Can disable failing the test on mismatch with property
19   * {@link DatabaseConfig#PROPERTY_ALLOW_VERIFYTABLEDEFINITION_EXPECTEDTABLE_COUNT_MISMATCH}
20   * , setting it to false.
21   *
22   * Can change the implementation by extending this class or implementing
23   * {@link ExpectedDataSetAndVerifyTableDefinitionVerifier} and calling
24   * {@link DefaultPrepAndExpectedTestCase#setExpectedDataSetAndVerifyTableDefinitionVerifier}
25   * .
26   *
27   * @author Jeff Jensen
28   */
29  public class DefaultExpectedDataSetAndVerifyTableDefinitionVerifier
30          implements ExpectedDataSetAndVerifyTableDefinitionVerifier
31  {
32      private final Logger log = LoggerFactory.getLogger(getClass());
33  
34      public void verify(final VerifyTableDefinition[] verifyTableDefinitions,
35              final IDataSet expectedDataSet, final DatabaseConfig config)
36              throws DataSetException
37      {
38          final String methodName = "verify";
39  
40          final int verifyTableDefsCount = verifyTableDefinitions.length;
41  
42          final String[] expectedTableNames = expectedDataSet.getTableNames();
43          final int expectedTablesCount = expectedTableNames.length;
44  
45          log.debug(
46                  "{}: expectedTables count={}, verifyTableDefinitions count={}",
47                  methodName, expectedTablesCount, verifyTableDefsCount);
48  
49          if (expectedTablesCount > verifyTableDefsCount)
50          {
51              handleCountMismatch(verifyTableDefinitions, expectedTableNames,
52                      config);
53          }
54      }
55  
56      protected void handleCountMismatch(
57              final VerifyTableDefinition[] verifyTableDefinitions,
58              final String[] expectedTableNames, final DatabaseConfig config)
59              throws DataSetException
60      {
61          final String methodName = "handleCountMismatch";
62  
63          final int verifyTableDefsCount = verifyTableDefinitions.length;
64          final int expectedTablesCount = expectedTableNames.length;
65  
66          final String msg = "{}: Test specified {} expected tables"
67                  + " and {} VerifyTableDefinitions;"
68                  + " usually these numbers should match as an expected table"
69                  + " is not verified without a VerifyTableDefinition";
70          log.warn(msg, methodName, expectedTablesCount, verifyTableDefsCount);
71  
72          final Set<String> mismatchedTableNames = makeMismatchedTableNamesList(
73                  verifyTableDefinitions, expectedTableNames);
74          failOnMismatch(config, mismatchedTableNames);
75      }
76  
77      protected Set<String> makeMismatchedTableNamesList(
78              final VerifyTableDefinition[] verifyTableDefinitions,
79              final String[] expectedTableNames)
80      {
81          final Set<String> tables = new HashSet<String>();
82  
83          final String methodName = "makeMismatchedTableNamesList";
84  
85          final int expectedTablesCount = expectedTableNames.length;
86          for (int i = 0; i < expectedTablesCount; i++)
87          {
88              final String expectedTableName = expectedTableNames[i];
89              final boolean isExpectedTableExist =
90                      isVerifyTableDefinitionsHasTable(verifyTableDefinitions,
91                              expectedTableName);
92  
93              if (!isExpectedTableExist)
94              {
95                  final String msg = "{}: expected table name={} does not have"
96                          + " a corresponding VerifyTableDefinition";
97                  log.warn(msg, methodName, expectedTableName);
98                  tables.add(expectedTableName);
99              }
100         }
101         return tables;
102     }
103 
104     protected boolean isVerifyTableDefinitionsHasTable(
105             final VerifyTableDefinition[] verifyTableDefinitions,
106             final String expectedTableName)
107     {
108         boolean isExpectedTableFound = false;
109         for (int j = 0; j < verifyTableDefinitions.length
110                 && !isExpectedTableFound; j++)
111         {
112             final VerifyTableDefinition verifyTableDefinition =
113                     verifyTableDefinitions[j];
114             final String definitionTableName =
115                     verifyTableDefinition.getTableName();
116             isExpectedTableFound =
117                     expectedTableName.equals(definitionTableName);
118         }
119         return isExpectedTableFound;
120     }
121 
122     protected void failOnMismatch(final DatabaseConfig config,
123             final Set<String> mismatchCountTables) throws DataSetException
124     {
125         final String methodName = "failOnMismatch";
126 
127         final boolean allowCountMismatch = (Boolean) config.getProperty(
128                 DatabaseConfig.PROPERTY_ALLOW_VERIFYTABLEDEFINITION_EXPECTEDTABLE_COUNT_MISMATCH);
129         final String willFailTestWord = allowCountMismatch ? " not" : "";
130         log.info("{}: Property {} is set to {} so will{} fail test", methodName,
131                 DatabaseConfig.PROPERTY_ALLOW_VERIFYTABLEDEFINITION_EXPECTEDTABLE_COUNT_MISMATCH,
132                 allowCountMismatch, willFailTestWord);
133         if (!allowCountMismatch)
134         {
135             final int mismatchCount = mismatchCountTables.size();
136             final String msg = "The following " + mismatchCount
137                     + " expected tables do not have"
138                     + " corresponding VerifyTableDefinitions: "
139                     + mismatchCountTables + "\nSet property '"
140                     + DatabaseConfig.PROPERTY_ALLOW_VERIFYTABLEDEFINITION_EXPECTEDTABLE_COUNT_MISMATCH
141                     + "' to true to suppress test fail.";
142             throw new DataSetException(msg);
143         }
144     }
145 }