Skip to content

Commit a407481

Browse files
authored
Merge pull request #1257 from luliqwerty/feature/dqe-sqlqueryerror-extraction
Add the SQLQueryError class for DQE and its test
2 parents 0d85770 + ab1bead commit a407481

File tree

3 files changed

+211
-3
lines changed

3 files changed

+211
-3
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package sqlancer.common.query;
2+
3+
import java.util.Objects;
4+
5+
public class SQLQueryError implements Comparable<SQLQueryError> {
6+
7+
public enum ErrorLevel {
8+
WARNING, ERROR
9+
}
10+
11+
private ErrorLevel level;
12+
private int code;
13+
private String message;
14+
15+
public void setLevel(ErrorLevel level) {
16+
this.level = level;
17+
}
18+
19+
public void setCode(int code) {
20+
this.code = code;
21+
}
22+
23+
public void setMessage(String message) {
24+
this.message = message;
25+
}
26+
27+
public ErrorLevel getLevel() {
28+
return level;
29+
}
30+
31+
public int getCode() {
32+
return code;
33+
}
34+
35+
public String getMessage() {
36+
return message;
37+
}
38+
39+
public boolean hasSameLevel(SQLQueryError that) {
40+
if (level == null) {
41+
return that.getLevel() == null;
42+
} else {
43+
return level.equals(that.getLevel());
44+
}
45+
}
46+
47+
public boolean hasSameCodeAndMessage(SQLQueryError that) {
48+
if (code != that.getCode()) {
49+
return false;
50+
}
51+
if (message == null) {
52+
return that.getMessage() == null;
53+
} else {
54+
return message.equals(that.getMessage());
55+
}
56+
}
57+
58+
@Override
59+
public boolean equals(Object that) {
60+
if (that == null) {
61+
return false;
62+
}
63+
if (that instanceof SQLQueryError) {
64+
SQLQueryError thatError = (SQLQueryError) that;
65+
return hasSameLevel(thatError) && hasSameCodeAndMessage(thatError);
66+
}
67+
return false;
68+
}
69+
70+
@Override
71+
public int hashCode() {
72+
return Objects.hash(level, code, message);
73+
}
74+
75+
@Override
76+
public String toString() {
77+
return String.format("Level: %s; Code: %d; Message: %s.", level, code, message);
78+
}
79+
80+
@Override
81+
public int compareTo(SQLQueryError that) {
82+
if (code < that.getCode()) {
83+
return -1;
84+
} else if (code > that.getCode()) {
85+
return 1;
86+
}
87+
88+
if (level == null && that.getLevel() != null) {
89+
return -1;
90+
} else {
91+
if (that.getLevel() == null) {
92+
return 1;
93+
} else {
94+
int res = level.compareTo(that.getLevel());
95+
if (res != 0) {
96+
return res;
97+
}
98+
}
99+
}
100+
101+
if (message == null && that.getMessage() != null) {
102+
return -1;
103+
} else {
104+
if (that.getMessage() == null) {
105+
return 1;
106+
} else {
107+
int res = message.compareTo(that.getMessage());
108+
if (res != 0) {
109+
return res;
110+
}
111+
}
112+
}
113+
114+
return 0;
115+
}
116+
}

src/sqlancer/postgres/PostgresProvider.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,14 +279,14 @@ public SQLConnection createDatabase(PostgresGlobalState globalState) throws SQLE
279279
}
280280
Connection con = DriverManager.getConnection("jdbc:" + entryURL, username, password);
281281
globalState.getState().logStatement(String.format("\\c %s;", entryDatabaseName));
282-
282+
283283
String dropCommand = "DROP DATABASE";
284284
boolean forceDrop = Randomly.getBoolean();
285285
if (forceDrop) {
286286
dropCommand += " FORCE";
287287
}
288288
dropCommand += " IF EXISTS " + databaseName;
289-
289+
290290
globalState.getState().logStatement(dropCommand + ";");
291291
try (Statement s = con.createStatement()) {
292292
s.execute(dropCommand);
@@ -302,7 +302,7 @@ public SQLConnection createDatabase(PostgresGlobalState globalState) throws SQLE
302302
throw e;
303303
}
304304
}
305-
305+
306306
// Create database section
307307
createDatabaseCommand = getCreateDatabaseCommand(globalState);
308308
globalState.getState().logStatement(createDatabaseCommand + ";");
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package sqlancer.common.query;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import static org.junit.jupiter.api.Assertions.assertEquals;
6+
import static org.junit.jupiter.api.Assertions.assertFalse;
7+
import static org.junit.jupiter.api.Assertions.assertNotEquals;
8+
import static org.junit.jupiter.api.Assertions.assertTrue;
9+
10+
public class SQLQueryErrorTest {
11+
@Test
12+
public void testSettersAndGetters() {
13+
SQLQueryError error = new SQLQueryError();
14+
error.setLevel(SQLQueryError.ErrorLevel.ERROR);
15+
error.setCode(123);
16+
error.setMessage("Test message");
17+
assertEquals(SQLQueryError.ErrorLevel.ERROR, error.getLevel());
18+
assertEquals(123, error.getCode());
19+
assertEquals("Test message", error.getMessage());
20+
}
21+
22+
@Test
23+
public void testHasSameLevel() {
24+
SQLQueryError e1 = new SQLQueryError();
25+
SQLQueryError e2 = new SQLQueryError();
26+
e1.setLevel(SQLQueryError.ErrorLevel.WARNING);
27+
e2.setLevel(SQLQueryError.ErrorLevel.WARNING);
28+
assertTrue(e1.hasSameLevel(e2));
29+
e2.setLevel(SQLQueryError.ErrorLevel.ERROR);
30+
assertFalse(e1.hasSameLevel(e2));
31+
}
32+
33+
@Test
34+
public void testHasSameCodeAndMessage() {
35+
SQLQueryError e1 = new SQLQueryError();
36+
SQLQueryError e2 = new SQLQueryError();
37+
e1.setCode(1);
38+
e2.setCode(1);
39+
e1.setMessage("msg");
40+
e2.setMessage("msg");
41+
assertTrue(e1.hasSameCodeAndMessage(e2));
42+
e2.setCode(2);
43+
assertFalse(e1.hasSameCodeAndMessage(e2));
44+
e2.setCode(1);
45+
e2.setMessage("other");
46+
assertFalse(e1.hasSameCodeAndMessage(e2));
47+
}
48+
49+
@Test
50+
public void testEquals() {
51+
SQLQueryError e1 = new SQLQueryError();
52+
SQLQueryError e2 = new SQLQueryError();
53+
e1.setLevel(SQLQueryError.ErrorLevel.ERROR);
54+
e1.setCode(1);
55+
e1.setMessage("msg");
56+
e2.setLevel(SQLQueryError.ErrorLevel.ERROR);
57+
e2.setCode(1);
58+
e2.setMessage("msg");
59+
assertEquals(e1, e2);
60+
e2.setLevel(SQLQueryError.ErrorLevel.WARNING);
61+
assertNotEquals(e1, e2);
62+
}
63+
64+
@Test
65+
public void testToString() {
66+
SQLQueryError e = new SQLQueryError();
67+
e.setLevel(SQLQueryError.ErrorLevel.ERROR);
68+
e.setCode(1);
69+
e.setMessage("msg");
70+
String str = e.toString();
71+
assertTrue(str.contains("Level: ERROR"));
72+
assertTrue(str.contains("Code: 1"));
73+
assertTrue(str.contains("Message: msg"));
74+
}
75+
76+
@Test
77+
public void testCompareTo() {
78+
SQLQueryError e1 = new SQLQueryError();
79+
SQLQueryError e2 = new SQLQueryError();
80+
e1.setCode(1);
81+
e2.setCode(2);
82+
assertTrue(e1.compareTo(e2) < 0);
83+
e2.setCode(1);
84+
e1.setLevel(SQLQueryError.ErrorLevel.ERROR);
85+
e2.setLevel(SQLQueryError.ErrorLevel.WARNING);
86+
assertTrue(e1.compareTo(e2) > 0 || e1.compareTo(e2) < 0);
87+
e2.setLevel(SQLQueryError.ErrorLevel.ERROR);
88+
e1.setMessage("a");
89+
e2.setMessage("b");
90+
assertTrue(e1.compareTo(e2) < 0);
91+
}
92+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy