diff options
author | Feideus <erwan.ulrich@gmail.com> | 2018-06-13 16:39:43 +0200 |
---|---|---|
committer | Feideus <erwan.ulrich@gmail.com> | 2018-06-13 16:39:43 +0200 |
commit | 389ff1303fe0c480bc6a7c416e867b0f58fe9987 (patch) | |
tree | ab2af84b22f635a9117cbbde88d57dfa1b4e74b3 /src/main | |
parent | bffa8bb0862c0394230693ced5d33c1518644362 (diff) | |
download | schemafuzz-389ff1303fe0c480bc6a7c416e867b0f58fe9987.tar.gz schemafuzz-389ff1303fe0c480bc6a7c416e867b0f58fe9987.tar.bz2 schemafuzz-389ff1303fe0c480bc6a7c416e867b0f58fe9987.zip |
Unit tests are back online. Fixed minor same value Mutations bugg that popped up after last commit
Diffstat (limited to 'src/main')
5 files changed, 84 insertions, 32 deletions
diff --git a/src/main/java/org/schemaspy/DBFuzzer.java b/src/main/java/org/schemaspy/DBFuzzer.java index 064a842..fb23059 100644 --- a/src/main/java/org/schemaspy/DBFuzzer.java +++ b/src/main/java/org/schemaspy/DBFuzzer.java @@ -180,10 +180,10 @@ public class DBFuzzer Row res = null; do { - Table randomTable = pickRandomTable(); + //Table randomTable = pickRandomTable(); - String theQuery = "SELECT * FROM " + randomTable.getName() + " ORDER BY RANDOM() LIMIT 1"; - //String theQuery = "SELECT * FROM test_table2 ORDER BY RANDOM() LIMIT 1"; // Change test_table2 to test_table here to swap back to line finding + //String theQuery = "SELECT * FROM " + randomTable.getName() + " ORDER BY RANDOM() LIMIT 1"; + String theQuery = "SELECT * FROM test_table3 ORDER BY RANDOM() LIMIT 1"; // Change test_table2 to test_table here to swap back to line finding QueryResponseParser qrp = new QueryResponseParser(); ResultSet rs = null; PreparedStatement stmt; @@ -191,7 +191,7 @@ public class DBFuzzer try { stmt = analyzer.getSqlService().prepareStatement(theQuery); rs = stmt.executeQuery(); - res = qrp.parse(rs, analyzer.getDb().getTablesMap().get(randomTable.getName())).getRows().get(0); + res = qrp.parse(rs, analyzer.getDb().getTablesMap().get("test_table3")).getRows().get(0); // randomTable should be in the get() } catch (Exception e) { LOGGER.info("This query threw an error" + e); } diff --git a/src/main/java/org/schemaspy/model/GenericTreeNode.java b/src/main/java/org/schemaspy/model/GenericTreeNode.java index 36d932b..bd69fbb 100644 --- a/src/main/java/org/schemaspy/model/GenericTreeNode.java +++ b/src/main/java/org/schemaspy/model/GenericTreeNode.java @@ -1,10 +1,12 @@ package org.schemaspy.model; +import java.math.BigInteger; import java.sql.*; import java.util.*; import java.util.ArrayList; import java.util.List; import org.schemaspy.*; import org.schemaspy.service.SqlService; +import org.springframework.util.SerializationUtils; public class GenericTreeNode { @@ -241,26 +243,43 @@ public class GenericTreeNode { case "smallint": case "integer": case "int2": - - Object tmp3 = rootForThisMutation.getInitial_state_row().getContent().get(tableColumn.getName()); - if( tmp3 != null && tmp3.toString() != "" ) + case "int8": + case "bigserial": + Object tmp = rootForThisMutation.getInitial_state_row().getContent().get(tableColumn.getName()); + if( tmp != null && tmp.toString() != "" ) { - int tmp = Integer.parseInt(rootForThisMutation.getInitial_state_row().getContent().get(tableColumn.getName()).toString()); - oneChange.add(new SingleChange(tableColumn, this, column_value, Integer.toString(tmp++))); - oneChange.add(new SingleChange(tableColumn, this, column_value, Integer.toString(32767))); + int tmp2; + if(typeName.equals("int2")) + { + tmp2 = Integer.parseInt(rootForThisMutation.getInitial_state_row().getContent().get(tableColumn.getName()).toString()); + oneChange.add(new SingleChange(tableColumn, this, column_value, Integer.toString(tmp2++))); + oneChange.add(new SingleChange(tableColumn, this, column_value, Integer.toString(32767))); + } + else if(typeName.equals("int8") || typeName.equals("bigserial") ) + { + BigInteger bigInt = new BigInteger(rootForThisMutation.getInitial_state_row().getContent().get(tableColumn.getName()).toString()); + bigInt = bigInt.add(new BigInteger("1")); + oneChange.add(new SingleChange(tableColumn, this, column_value, bigInt)); + oneChange.add(new SingleChange(tableColumn, this, column_value, new BigInteger("9223372036854775806"))); + } oneChange.add(new SingleChange(tableColumn, this, column_value, Integer.toString(0))); break; } + case "character": case "character varying": + case "bytea": case "varchar": - - - Object tmp4 = rootForThisMutation.getInitial_state_row().getContent().get(tableColumn.getName()); - if(tmp4 != null && tmp4.toString() != "" ) + tmp = rootForThisMutation.getInitial_state_row().getContent().get(tableColumn.getName()); + if(typeName.equals("bytea")) + { + byte[] bytes = SerializationUtils.serialize(tmp); + tmp = Arrays.toString(bytes); + } + if(tmp != null && tmp.toString() != "" ) { - String tmp2 = tmp4.toString().replaceAll("\\d", ""); + String tmp2 = tmp.toString().replaceAll("\\d", ""); if (!tmp2.isEmpty()) { char nextChar = (char) (tmp2.charAt(0) + 1); @@ -270,6 +289,7 @@ public class GenericTreeNode { } } break; + case "bool": if (column_value.equals("f")) oneChange.add(new SingleChange(tableColumn, this, column_value, "t")); @@ -277,7 +297,21 @@ public class GenericTreeNode { oneChange.add(new SingleChange(tableColumn, this, column_value, "f")); break; - /*case "timestamp": + case "text": + tmp = rootForThisMutation.getInitial_state_row().getContent().get(tableColumn.getName()); + if( tmp != null && tmp.toString() != "" ) + { + Random rand = new Random(); + int randNum = rand.nextInt(tmp.toString().length()); + char tmp2 = tmp.toString().charAt(randNum); + + oneChange.add(new SingleChange(tableColumn, this, column_value, tmp.toString().substring(0,randNum) + (Character.toString(tmp2++)) + tmp.toString().substring(randNum+1))); + oneChange.add(new SingleChange(tableColumn, this, column_value, tmp.toString().substring(0,randNum) + (Character.toString(tmp2--)) + tmp.toString().substring(randNum+1))); + break; + } + + + /*case "bytea": SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Calendar cal = Calendar.getInstance(); @@ -296,11 +330,11 @@ public class GenericTreeNode { break; - case 6: typeName = "June"; + case 6: int8 = "June"; break; - case 7: typeName = "July"; + case 7: bigSerial = "July"; break; - case 8: typeName = "August"; + case 8: text = "August"; break; case 9: typeName = "September"; break; @@ -396,7 +430,14 @@ public class GenericTreeNode { if (entry.getValue() != null) theQuery = theQuery + (entry.getKey() + "='" + entry.getValue().toString() + "' AND "); else - theQuery = theQuery + (entry.getKey() + "= null AND "); + theQuery = theQuery + (entry.getKey() + " IS NULL AND "); + } + else + { + if (entry.getValue() != null) + theQuery = theQuery + (entry.getKey() + "=" + entry.getValue().toString() + " AND "); + else + theQuery = theQuery + (entry.getKey() + " IS NULL AND "); } } @@ -711,7 +752,7 @@ public class GenericTreeNode { QueryResponse response = fetchingDataFromDatabase(semiQuery,chosenChange.getParentTableColumn().getTable(),sqlService); - setInitial_state_row(response.getRows().get(0)); // there should be only one row. post change row ? + setInitial_state_row(response.getRows().get(0)); // there should be only one row. semiQuery = "SELECT * FROM " + chosenChange.getParentTableColumn().getTable().getName() ; @@ -789,7 +830,8 @@ public class GenericTreeNode { || column.getTypeName().equals("_text") || column.getTypeName().equals("text") || column.getTypeName().equals("fulltext") - || column.getTypeName().equals("email")) + || column.getTypeName().equals("email") + || column.getTypeName().equals("bytea")) return 1; else return 0; diff --git a/src/main/java/org/schemaspy/model/QueryResponseParser.java b/src/main/java/org/schemaspy/model/QueryResponseParser.java index e24b825..1fbdff9 100644 --- a/src/main/java/org/schemaspy/model/QueryResponseParser.java +++ b/src/main/java/org/schemaspy/model/QueryResponseParser.java @@ -62,7 +62,12 @@ public class QueryResponseParser { if(resultMeta.getColumnTypeName(i).equals("timestamp")) mapOfTheRow.put(resultMeta.getColumnName(i),resultOfQuery.getTimestamp(i)); - mapOfTheRow.put(resultMeta.getColumnName(i), resultOfQuery.getString(i)); + else if(resultOfQuery.getString(i) == null) + { + mapOfTheRow.put(resultMeta.getColumnName(i), null); + } + else + mapOfTheRow.put(resultMeta.getColumnName(i), resultOfQuery.getString(i)); } Row currentRow = new Row(parentTable,mapOfTheRow,resultMeta.getColumnCount()); diff --git a/src/main/java/org/schemaspy/model/Row.java b/src/main/java/org/schemaspy/model/Row.java index a3d3ea3..991e4f7 100644 --- a/src/main/java/org/schemaspy/model/Row.java +++ b/src/main/java/org/schemaspy/model/Row.java @@ -97,14 +97,19 @@ public class Row for(Map.Entry<String,Object> entry : content.entrySet()) { - if(initial_state_row.getContent().get(entry.getKey()) == null ) - return false; - - if(!initial_state_row.getContent().containsKey(entry.getKey())) - return false; - - if(!initial_state_row.getContent().get(entry.getKey()).equals(entry.getValue())) - return false; + if(initial_state_row.getContent().get(entry.getKey()) == null || entry.getValue() == null) + { + if(!(initial_state_row.getContent().get(entry.getKey()) == null && entry.getValue() == null)) + return false; + } + else + { + if (!initial_state_row.getContent().containsKey(entry.getKey())) + return false; + + if (!initial_state_row.getContent().get(entry.getKey()).toString().equals(entry.getValue().toString())) + return false; + } } return true; } diff --git a/src/main/java/org/schemaspy/model/SingleChange.java b/src/main/java/org/schemaspy/model/SingleChange.java index 0463797..a628713 100644 --- a/src/main/java/org/schemaspy/model/SingleChange.java +++ b/src/main/java/org/schemaspy/model/SingleChange.java @@ -98,7 +98,7 @@ public class SingleChange public boolean compareValues() { - if(this.getNewValue().equals(this.getOldValue())) + if(this.getNewValue().toString().equals(this.getOldValue().toString())) return true; return false; |