/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.enterprise.server.search; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CommonTokenStream; import org.testng.AssertJUnit; import org.testng.annotations.*; import org.rhq.enterprise.server.search.RHQLParser.searchExpression_return; /** * Test harness to verify correctness of RHQL grammar * * @author Joseph Marques */ public class RHQLTest extends AssertJUnit { private enum TestResult { SUCCESS, FAILURE, TIMEOUT, SKIPPED; } private class AntlrTask implements Callable<TestResult> { private String line; public AntlrTask(String line) { this.line = line; } public TestResult call() throws Exception { try { System.out.println(line); ANTLRStringStream input = new ANTLRStringStream(line); // Create an input character stream from standard in RHQLLexer lexer = new RHQLLexer(input); // Create an echoLexer that feeds from that stream CommonTokenStream tokens = new CommonTokenStream(lexer); // Create a stream of tokens fed by the lexer RHQLParser parser = new RHQLParser(tokens); // Create a parser that feeds off the token stream searchExpression_return parseResults = parser.searchExpression(); // Begin parsing at 'searchExpression' rule System.out.println(parseResults.tree.toStringTree()); // Print result return TestResult.SUCCESS; } catch (Throwable t) { return TestResult.FAILURE; } } }; private ExecutorService executor; @BeforeClass public void init() { executor = Executors.newSingleThreadExecutor(); } @AfterClass public void teardown() { executor.shutdownNow(); } @Test public void testSingleLineRHQL() throws Exception { BufferedReader reader = null; List<String> successes = new java.util.ArrayList<String>(); List<String> failures = new java.util.ArrayList<String>(); int count = 0; try { InputStream stream = getClass().getClassLoader().getResourceAsStream("single-line-rhql.txt"); reader = new BufferedReader(new InputStreamReader(stream)); String line = null; long timeout = 2000; while ((line = reader.readLine()) != null) { TestResult result = testSuccess(line, timeout); if (result == TestResult.SKIPPED) { continue; } count++; if (result == TestResult.SUCCESS) { successes.add(line); } else if (result == TestResult.FAILURE) { failures.add(line); } else if (result == TestResult.TIMEOUT) { System.out.println("Parsing took more than " + timeout + "ms, does your grammar have an infinite loop?"); } } } catch (Exception e) { System.out.println("Error testing single line RHQL: " + e); throw e; } finally { if (reader != null) { reader.close(); } } System.out.println(); for (String success : successes) { System.out.println("Parse success: " + success); } for (String failure : failures) { System.out.println("Parse failure: " + failure); } System.out.println(); System.out.printf("RHQL expressions parsed: %1$s, Failures: %2$s", count, failures.size()); System.out.println(); assert failures.size() == 0; } private TestResult testSuccess(final String line, long timeout) { if (shouldSkip(line)) { return TestResult.SKIPPED; // skip empty lines used for visual separation in test file } AntlrTask task = new AntlrTask(line); Future<TestResult> futureTask = executor.submit(task); TestResult result = null; try { result = futureTask.get(timeout, TimeUnit.MILLISECONDS); } catch (ExecutionException ee) { } catch (TimeoutException te) { futureTask.cancel(true); result = TestResult.TIMEOUT; } catch (InterruptedException ie) { futureTask.cancel(true); } return result; } private boolean shouldSkip(String line) { line = line.trim(); if (line.equals("")) { return true; // ignore empty lines } if (line.startsWith("#")) { return true; // ignore comments } return false; } }