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
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 }