1+ package sqlancer ;
2+
3+ import static org .junit .jupiter .api .Assertions .assertEquals ;
4+ import static org .junit .jupiter .api .Assertions .assertFalse ;
5+ import static org .junit .jupiter .api .Assertions .assertTrue ;
6+
7+ import java .io .IOException ;
8+ import java .nio .file .Path ;
9+ import java .util .ArrayList ;
10+ import java .util .List ;
11+
12+ import org .junit .jupiter .api .Test ;
13+ import org .junit .jupiter .api .io .TempDir ;
14+
15+ import sqlancer .common .query .ExpectedErrors ;
16+ import sqlancer .common .query .Query ;
17+ import sqlancer .common .query .SQLQueryAdapter ;
18+ import sqlancer .sqlite3 .SQLite3Provider ;
19+
20+ public class TestStateToReproduce {
21+
22+ @ TempDir
23+ Path tempDir ;
24+
25+ @ Test
26+ public void testBasicFields () throws IOException {
27+ SQLite3Provider provider = new SQLite3Provider ();
28+ StateToReproduce state = new StateToReproduce ("test_db" , provider );
29+ state .databaseVersion = "3.36.0" ;
30+ state .seedValue = 12345L ;
31+ state .exception = "Test exception message" ;
32+
33+ Path file = tempDir .resolve ("test_basic.ser" );
34+ state .serialize (file );
35+ StateToReproduce result = StateToReproduce .deserialize (file );
36+
37+ assertEquals (state .getDatabaseName (), result .getDatabaseName ());
38+ assertEquals (state .getDatabaseVersion (), result .getDatabaseVersion ());
39+ assertEquals (state .getSeedValue (), result .getSeedValue ());
40+ assertEquals (state .getException (), result .getException ());
41+ }
42+
43+ @ Test
44+ public void testStatements () throws IOException {
45+ SQLite3Provider provider = new SQLite3Provider ();
46+ StateToReproduce state = new StateToReproduce ("test_statements" , provider );
47+ List <Query <?>> statements = new ArrayList <>();
48+
49+ ExpectedErrors errors1 = new ExpectedErrors ();
50+ errors1 .add ("syntax error" );
51+ errors1 .add ("table already exists" );
52+ statements .add (new SQLQueryAdapter ("CREATE TABLE test (id INTEGER);" , errors1 ));
53+
54+ ExpectedErrors errors2 = new ExpectedErrors ();
55+ errors2 .add ("constraint failed" );
56+ statements .add (new SQLQueryAdapter ("INSERT INTO test VALUES (1);" , errors2 ));
57+
58+ statements .add (new SQLQueryAdapter ("SELECT * FROM test;" , new ExpectedErrors ()));
59+ state .setStatements (statements );
60+
61+ Path file = tempDir .resolve ("test_statements.ser" );
62+ state .serialize (file );
63+ StateToReproduce result = StateToReproduce .deserialize (file );
64+
65+ List <Query <?>> resultStatements = result .getStatements ();
66+ assertEquals (3 , resultStatements .size ());
67+
68+ Query <?> q1 = resultStatements .get (0 );
69+ Query <?> q2 = resultStatements .get (1 );
70+ Query <?> q3 = resultStatements .get (2 );
71+
72+ assertEquals ("CREATE TABLE test (id INTEGER);" , q1 .getLogString ());
73+ assertEquals ("INSERT INTO test VALUES (1);" , q2 .getLogString ());
74+ assertEquals ("SELECT * FROM test;" , q3 .getLogString ());
75+
76+ ExpectedErrors e1 = q1 .getExpectedErrors ();
77+ ExpectedErrors e2 = q2 .getExpectedErrors ();
78+ ExpectedErrors e3 = q3 .getExpectedErrors ();
79+
80+ assertTrue (e1 .errorIsExpected ("syntax error" ));
81+ assertTrue (e1 .errorIsExpected ("table already exists" ));
82+ assertFalse (e1 .errorIsExpected ("constraint failed" ));
83+
84+ assertFalse (e2 .errorIsExpected ("syntax error" ));
85+ assertTrue (e2 .errorIsExpected ("constraint failed" ));
86+
87+ assertFalse (e3 .errorIsExpected ("syntax error" ));
88+ assertFalse (e3 .errorIsExpected ("constraint failed" ));
89+ }
90+
91+ @ Test
92+ public void testDatabaseProvider () throws IOException {
93+ SQLite3Provider provider = new SQLite3Provider ();
94+ StateToReproduce state = new StateToReproduce ("test_provider" , provider );
95+ state .logStatement ("CREATE TABLE test (id INTEGER);" );
96+
97+ Path file = tempDir .resolve ("test_provider.ser" );
98+ state .serialize (file );
99+ StateToReproduce result = StateToReproduce .deserialize (file );
100+
101+ // Verify databaseProvider is correctly deserialized
102+ assertEquals ("sqlite3" , result .getDatabaseProvider ().getDBMSName ());
103+
104+ // Verify databaseProvider functionality by testing logStatement
105+ result .logStatement ("INSERT INTO test VALUES (1);" );
106+ assertEquals (2 , result .getStatements ().size ());
107+ assertEquals ("INSERT INTO test VALUES (1);" , result .getStatements ().get (1 ).getLogString ());
108+ }
109+ }
0 commit comments