summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorFeideus <erwan.ulrich@gmail.com>2018-06-13 16:39:43 +0200
committerFeideus <erwan.ulrich@gmail.com>2018-06-13 16:39:43 +0200
commit389ff1303fe0c480bc6a7c416e867b0f58fe9987 (patch)
treeab2af84b22f635a9117cbbde88d57dfa1b4e74b3 /src/main
parentbffa8bb0862c0394230693ced5d33c1518644362 (diff)
downloadschemafuzz-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')
-rw-r--r--src/main/java/org/schemaspy/DBFuzzer.java8
-rw-r--r--src/main/java/org/schemaspy/model/GenericTreeNode.java78
-rw-r--r--src/main/java/org/schemaspy/model/QueryResponseParser.java7
-rw-r--r--src/main/java/org/schemaspy/model/Row.java21
-rw-r--r--src/main/java/org/schemaspy/model/SingleChange.java2
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;