/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 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.constant.SysProperties; import org.h2.store.fs.FileUtils; import org.h2.test.TestAll; import org.h2.test.TestBase; import org.h2.tools.DeleteDbFiles; import org.h2.util.MathUtils; /** * This test executes random SQL statements generated using the BNF tool. */ public class TestRandomSQL extends TestBase { private int seed; private boolean exitOnError = true; private BnfRandom bnfRandom; private int success, total; /** * Run just this test. * * @param a ignored */ public static void main(String... a) throws Exception { TestBase.createCaller().init().test(); } private void processException(String sql, SQLException e) { if (e.getSQLState().equals("HY000")) { TestBase.logError("new TestRandomSQL().init(test).testCase(" + seed + "); " + "// FAIL: " + e.toString() + " sql: " + sql, e); if (exitOnError) { System.exit(0); } } } private String getDatabaseName() { return "dataRandomSQL/randomSql" + seed; } private Connection connect() throws SQLException { return getConnection(getDatabaseName()); } private void deleteDb() { String name = getDatabaseName(); if (name.startsWith("memFS:")) { DeleteDbFiles.execute("memFS:/", name, true); } else { DeleteDbFiles.execute(getBaseDir() + "/dataRandomSQL", null, true); FileUtils.delete(getBaseDir() + "/dataRandomSQL"); } } public TestBase init(TestAll conf) throws Exception { super.init(conf); return this; } private void testWithSeed() throws Exception { Connection conn = null; try { conn = connect(); } catch (SQLException e) { processException("connect", e); conn = connect(); } Statement stat = conn.createStatement(); 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) { processException(sql, e); } } } try { conn.close(); conn = connect(); conn.createStatement().execute("shutdown immediately"); conn.close(); } catch (SQLException e) { processException("conn.close", e); } } public void testCase(int i) throws Exception { String old = SysProperties.getScriptDirectory(); try { System.setProperty(SysProperties.H2_SCRIPT_DIRECTORY, "dataScript/"); seed = i; printTime("seed: " + seed); deleteDb(); testWithSeed(); } finally { System.setProperty(SysProperties.H2_SCRIPT_DIRECTORY, old); } deleteDb(); } public void test() throws Exception { if (config.networked) { return; } int len = getSize(2, 6); exitOnError = false; for (int a = 0; a < len; a++) { int s = MathUtils.randomInt(Integer.MAX_VALUE); testCase(s); } } }