diff options
author | Feideus <erwan.ulrich@gmail.com> | 2018-05-30 18:49:47 +0200 |
---|---|---|
committer | Feideus <erwan.ulrich@gmail.com> | 2018-05-30 18:49:47 +0200 |
commit | 90e55ae08404e8cc2cc49b9ad2bee03ed60ba0c6 (patch) | |
tree | 9aa8402daba1a528929dc08d85b0f17be167eb3d /src/main | |
parent | 72a0c0bb75bd0af284c0f1bdab311b21cb4b5a3b (diff) | |
download | schemafuzz-90e55ae08404e8cc2cc49b9ad2bee03ed60ba0c6.tar.gz schemafuzz-90e55ae08404e8cc2cc49b9ad2bee03ed60ba0c6.tar.bz2 schemafuzz-90e55ae08404e8cc2cc49b9ad2bee03ed60ba0c6.zip |
Main loop crashing all over the place (due to possibilities being empty ??)
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/org/schemaspy/DBFuzzer.java | 23 | ||||
-rw-r--r-- | src/main/java/org/schemaspy/model/GenericTreeNode.java | 72 | ||||
-rw-r--r-- | src/main/java/org/schemaspy/model/QueryResponseParser.java | 1 |
3 files changed, 63 insertions, 33 deletions
diff --git a/src/main/java/org/schemaspy/DBFuzzer.java b/src/main/java/org/schemaspy/DBFuzzer.java index 8de09e3..772c1e4 100644 --- a/src/main/java/org/schemaspy/DBFuzzer.java +++ b/src/main/java/org/schemaspy/DBFuzzer.java @@ -85,9 +85,12 @@ public class DBFuzzer LOGGER.info("Starting Database Fuzzing"); + GenericTreeNode currentMutation; // Building root Mutation. Could be extended by looking for a relevant first SingleChange as rootMutation - Row randomRow = pickRandomRow(); - GenericTreeNode currentMutation = new GenericTreeNode(randomRow,nextId()); + do { + Row randomRow = pickRandomRow(); + currentMutation = new GenericTreeNode(randomRow, nextId()); + } while(currentMutation.getPotential_changes().isEmpty()); currentMutation.setChosenChange(currentMutation.getPotential_changes().get(0)); currentMutation.initPostChangeRow(); mutationTree.setRoot(currentMutation); @@ -319,7 +322,7 @@ public class DBFuzzer if (markingDiff > 0) // { int randNumber = rand.nextInt(previousMutation.getPotential_changes().size()); - nextMut = new GenericTreeNode(previousMutation.getPost_change_row(), nextId(), mutationTree.getRoot(), previousMutation); + nextMut = new GenericTreeNode(previousMutation.getPost_change_row(), nextId(), mutationTree.getRoot(), previousMutation,false); nextMut.setChosenChange(previousMutation.getPotential_changes().get(randNumber)); nextMut.initPostChangeRow(); } @@ -330,14 +333,18 @@ public class DBFuzzer if(changeOrDepthen.nextInt(2) == 1) { SingleChange tmp = mutationTree.getRoot().singleChangeBasedOnWeight(); - nextMut = new GenericTreeNode(tmp.getAttachedToMutation().getPost_change_row(), nextId(), mutationTree.getRoot(), tmp.getAttachedToMutation()); + nextMut = new GenericTreeNode(tmp.getAttachedToMutation().getPost_change_row(), nextId(), mutationTree.getRoot(), tmp.getAttachedToMutation(),false); nextMut.setChosenChange(tmp); nextMut.initPostChangeRow(); } - else - { - Row nextRow = pickRandomRow(); - nextMut = new GenericTreeNode(nextRow,nextId(),mutationTree.getRoot(),previousMutation); + else { + Row nextRow; + do + { + nextRow = pickRandomRow(); + nextMut = new GenericTreeNode(nextRow, nextId(), mutationTree.getRoot(), previousMutation, true); + }while(nextMut.getPotential_changes().isEmpty()); + Random nextSingleChangeId = new Random(); nextMut.setChosenChange(nextMut.getPotential_changes().get(nextSingleChangeId.nextInt(nextMut.getPotential_changes().size()))); nextMut.initPostChangeRow(); diff --git a/src/main/java/org/schemaspy/model/GenericTreeNode.java b/src/main/java/org/schemaspy/model/GenericTreeNode.java index 3ddd9fd..6e846b8 100644 --- a/src/main/java/org/schemaspy/model/GenericTreeNode.java +++ b/src/main/java/org/schemaspy/model/GenericTreeNode.java @@ -2,11 +2,14 @@ package org.schemaspy.model; import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Statement; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.*; import java.util.ArrayList; import java.util.List; +import java.util.logging.Logger; import org.schemaspy.*; import org.schemaspy.service.SqlService; @@ -27,6 +30,7 @@ public class GenericTreeNode { private GenericTreeNode parent; private ArrayList<GenericTreeNode> children = new ArrayList<GenericTreeNode>(); private SingleChange chosenChange; + private boolean isFirstApperance; /** * Default GenericTreeNode constructor @@ -38,6 +42,7 @@ public class GenericTreeNode { this.weight = 1; this.depth = 0; this.id = id; + this.isFirstApperance = true; this.initial_state_row = initial_state_row; this.potential_changes = discoverMutationPossibilities(this); } @@ -49,22 +54,29 @@ public class GenericTreeNode { this.weight = 1; this.depth = 0; this.id = id; + this.isFirstApperance = false; this.initial_state_row = initial_state_row; this.chosenChange = sg; } - public GenericTreeNode(Row initial_state_row, int id, GenericTreeNode rootMutation, GenericTreeNode parentMutation) { + public GenericTreeNode(Row initial_state_row, int id, GenericTreeNode rootMutation, GenericTreeNode parentMutation,boolean isFirstApperance) { this.parent = parentMutation; this.cascadingFK = false; this.subTreeWeight = 0; this.weight = 1; this.id = id; initDepth(); + this.isFirstApperance = isFirstApperance; this.initial_state_row = initial_state_row; this.potential_changes = discoverMutationPossibilities(rootMutation); } + + public boolean getIsFirstApperance() { + return isFirstApperance; + } + public void setDepth(int depth) { this.depth = depth; } @@ -132,6 +144,9 @@ public class GenericTreeNode { { final Random r = new Random(); + if(this.getPotential_changes().isEmpty()) + System.out.println(this+"EMMMMMMPTY"); + checkWeightConsistency(); if (this.potential_changes.isEmpty() && (0 == subTreeWeight)) System.out.println("ERROR PICKING : no potential_changes AND subtreeweight = 0"); @@ -229,14 +244,14 @@ public class GenericTreeNode { } } if(possibilities.isEmpty()) - throw new Error("No raw Mutation could be found for this row"); + System.out.println("No raw Mutation could be found for this row"); // TO BE HANDLED. juste create another GenericTreeNode //REMOVING POSSIBILITIES THAT DONT MATCH CONSTRAINTS - for(SingleChange singleChange : possibilities) - { - if (!singleChange.respectsConstraints()) - possibilities.remove(singleChange); - } + // for(SingleChange singleChange : possibilities) + // { + // if (!singleChange.respectsConstraints()) + // possibilities.remove(singleChange); + // } return possibilities; } @@ -246,13 +261,14 @@ public class GenericTreeNode { ArrayList<SingleChange> oneChange = new ArrayList<SingleChange>(); String typeName = tableColumn.getTypeName(); - System.out.println("TABLECOLUMN TYPE = "+typeName); + GenericTreeNode rootForThisMutation = FirstApperanceOf(this); switch (typeName) { case "smallint": case "integer": case "int2": - int tmp = Integer.parseInt(rootMutation.getInitial_state_row().getContent().get(tableColumn.getName()).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))); oneChange.add(new SingleChange(tableColumn, this, column_value, Integer.toString(1))); @@ -261,17 +277,11 @@ public class GenericTreeNode { case "character": case "character varying": case "varchar": - if (rootMutation == null) { - char tmp2 = column_value.toString().charAt(0); - oneChange.add(new SingleChange(tableColumn, this, column_value, (Character.toString(tmp2++) + column_value.toString().substring(1)))); - oneChange.add(new SingleChange(tableColumn, this, column_value, (Character.toString(tmp2--) + column_value.toString().substring(1)))); - } else { - char tmp2 = (char) rootMutation.getInitial_state_row().getContent().get(tableColumn.getName()).toString().charAt(0); + char tmp2 = (char) rootForThisMutation.getInitial_state_row().getContent().get(tableColumn.getName()).toString().charAt(0); char nextChar = (char) (tmp2 + 1); char prevChar = (char) (tmp2 - 1); - oneChange.add(new SingleChange(tableColumn, this, column_value, (Character.toString(nextChar) + column_value.toString().substring(1)))); - oneChange.add(new SingleChange(tableColumn, this, column_value, (Character.toString(prevChar) + column_value.toString().substring(1)))); - } + SingleChange sg = new SingleChange(tableColumn, this, column_value, (Character.toString(nextChar) + column_value.toString().substring(1))); + oneChange.add(new SingleChange(tableColumn, this, column_value, (Character.toString(nextChar) + column_value.toString().substring(1))));oneChange.add(new SingleChange(tableColumn, this, column_value, (Character.toString(prevChar) + column_value.toString().substring(1)))); break; case "bool": @@ -324,7 +334,6 @@ public class GenericTreeNode { public boolean inject(SqlService sqlService,Database db, boolean undo) { - if (undo) System.out.println("UNDOING"); else @@ -333,8 +342,9 @@ public class GenericTreeNode { String theQuery = updateQueryBuilder(undo); try { - PreparedStatement stmt = sqlService.prepareStatement(theQuery, db, null); - stmt.execute(); + Statement stmt = sqlService.getConnection().createStatement(); + stmt.execute(theQuery); + System.out.println("Query success"); return true; } catch (Exception e) @@ -371,7 +381,8 @@ public class GenericTreeNode { { if (chosenChange.getParentTableColumn().getTypeName().equals("varchar") || chosenChange.getParentTableColumn().getTypeName().equals("bool") - || chosenChange.getParentTableColumn().getTypeName().equals("timestamp")) + || chosenChange.getParentTableColumn().getTypeName().equals("timestamp") + || chosenChange.getParentTableColumn().getTypeName().equals("date")) theQuery = "UPDATE " + initial_state_row.getParentTable().getName() + " SET " + chosenChange.getParentTableColumn().getName() + "='" + chosenChange.getOldValue().toString() + "', "; else theQuery = "UPDATE " + initial_state_row.getParentTable().getName() + " SET " + chosenChange.getParentTableColumn().getName() + " = " + chosenChange.getOldValue().toString() + ", "; @@ -380,7 +391,8 @@ public class GenericTreeNode { { if (chosenChange.getParentTableColumn().getTypeName().equals("varchar") || chosenChange.getParentTableColumn().getTypeName().equals("bool") - || chosenChange.getParentTableColumn().getTypeName().equals("timestamp")) + || chosenChange.getParentTableColumn().getTypeName().equals("timestamp") + || chosenChange.getParentTableColumn().getTypeName().equals("date")) theQuery = "UPDATE " + initial_state_row.getParentTable().getName() + " SET " + chosenChange.getParentTableColumn().getName() + "='" + chosenChange.getNewValue().toString() + "', "; else theQuery = "UPDATE " + initial_state_row.getParentTable().getName() + " SET " + chosenChange.getParentTableColumn().getName() + "=" + chosenChange.getNewValue().toString() + ", "; @@ -391,7 +403,8 @@ public class GenericTreeNode { { if (chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("varchar") || chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("bool") || - chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("timestamp")) + chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("timestamp") + || chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("date")) theQuery = theQuery + (entry.getKey() + "='" + entry.getValue().toString() + "', "); else theQuery = theQuery + (entry.getKey() + "=" + entry.getValue().toString() + ", "); @@ -408,7 +421,8 @@ public class GenericTreeNode { { if (chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("varchar") || chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("bool") || - chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("timestamp")) + chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("timestamp") + || chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("date")) theQuery = theQuery + (entry.getKey() + "='" + entry.getValue().toString() + "' AND "); else theQuery = theQuery + (entry.getKey() + "=" + entry.getValue().toString() + " AND "); @@ -604,4 +618,12 @@ public class GenericTreeNode { this.getParent().propagateWeight(); } + public GenericTreeNode FirstApperanceOf (GenericTreeNode mutation) + { + if(mutation.getIsFirstApperance()) + return mutation; + + return FirstApperanceOf(mutation.getParent()); + } + } diff --git a/src/main/java/org/schemaspy/model/QueryResponseParser.java b/src/main/java/org/schemaspy/model/QueryResponseParser.java index e24b825..e25956a 100644 --- a/src/main/java/org/schemaspy/model/QueryResponseParser.java +++ b/src/main/java/org/schemaspy/model/QueryResponseParser.java @@ -68,6 +68,7 @@ public class QueryResponseParser Row currentRow = new Row(parentTable,mapOfTheRow,resultMeta.getColumnCount()); queryResponse.getRows().add(currentRow); } + assert(!queryResponse.getRows().get(0).getContent().containsValue(null)); return queryResponse; } |