/* * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, * and the EPL 1.0 (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.test.synth; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import org.h2.engine.SysProperties; import org.h2.store.fs.FileUtils; import org.h2.test.TestBase; import org.h2.util.MathUtils; /** * This test executes random SQL statements generated using the BNF tool. */ public class TestRandomSQL extends TestBase { private int success, total; /** * Run just this test. * * @param a ignored */ public static void main(String... a) throws Exception { TestBase.createCaller().init().test(); } @Override public void test() throws Exception { if (config.networked) { return; } config.memory = true; int len = getSize(2, 6); for (int a = 0; a < len; a++) { int s = MathUtils.randomInt(Integer.MAX_VALUE); testCase(s); } } private void testWithSeed(int seed) throws Exception { Connection conn = null; try { conn = getConnection(getDatabaseName(seed)); } catch (SQLException e) { if (e.getSQLState().equals("HY000")) { TestBase.logError("new TestRandomSQL().init(test).testCase(" + seed + "); " + "// FAIL: " + e.toString() + " sql: " + "connect", e); } conn = getConnection(getDatabaseName(seed)); } Statement stat = conn.createStatement(); BnfRandom bnfRandom = new BnfRandom(); bnfRandom.setSeed(seed); for (int i = 0; i < bnfRandom.getStatementCount(); i++) { String sql = bnfRandom.getRandomSQL(); if (sql != null) { try { Thread.yield(); total++; if (total % 100 == 0) { printTime("total: " + total + " success: " + (100 * success / total) + "%"); } stat.execute(sql); success++; } catch (SQLException e) { if (e.getSQLState().equals("HY000")) { TestBase.logError( "new TestRandomSQL().init(test).testCase(" + seed + "); " + "// FAIL: " + e.toString() + " sql: " + sql, e); } } } } try { conn.close(); conn = getConnection(getDatabaseName(seed)); conn.createStatement().execute("shutdown immediately"); conn.close(); } catch (SQLException e) { if (e.getSQLState().equals("HY000")) { TestBase.logError("new TestRandomSQL().init(test).testCase(" + seed + "); " + "// FAIL: " + e.toString() + " sql: " + "conn.close", e); } } } @Override public void testCase(int seed) throws Exception { String old = SysProperties.getScriptDirectory(); try { System.setProperty(SysProperties.H2_SCRIPT_DIRECTORY, getBaseDir() + "/" + getTestName()); printTime("seed: " + seed); deleteDb(seed); testWithSeed(seed); } finally { System.setProperty(SysProperties.H2_SCRIPT_DIRECTORY, old); } deleteDb(seed); } private String getDatabaseName(int seed) { return getTestName() + "/db" + seed; } private void deleteDb(int seed) { FileUtils.delete(getDatabaseName(seed)); } }