public Validator( String controlGateway, String testGateway, Duration controlTimeout, Duration testTimeout, int maxRowCount, boolean explainOnly, int precision, boolean checkCorrectness, boolean verboseResultsComparison, QueryPair queryPair) { this.testUsername = requireNonNull(queryPair.getTest().getUsername(), "test username is null"); this.controlUsername = requireNonNull(queryPair.getControl().getUsername(), "control username is null"); this.testPassword = queryPair.getTest().getPassword(); this.controlPassword = queryPair.getControl().getPassword(); this.controlGateway = requireNonNull(controlGateway, "controlGateway is null"); this.testGateway = requireNonNull(testGateway, "testGateway is null"); this.controlTimeout = controlTimeout; this.testTimeout = testTimeout; this.maxRowCount = maxRowCount; this.explainOnly = explainOnly; this.precision = precision; this.checkCorrectness = checkCorrectness; this.verboseResultsComparison = verboseResultsComparison; this.queryPair = requireNonNull(queryPair, "queryPair is null"); // Test and Control always have the same session properties. this.sessionProperties = queryPair.getTest().getSessionProperties(); }
private QueryResult executeQueryControl() { Query query = queryPair.getControl(); QueryResult queryResult = new QueryResult(State.INVALID, null, null, ImmutableList.<List<Object>>of()); try { // startup queryResult = setup( query, controlPreQueryResults, controlPrequery -> executeQuery( controlGateway, controlUsername, controlPassword, queryPair.getControl(), controlPrequery, controlTimeout, sessionProperties)); // if startup is successful -> execute query if (queryResult.getState() == State.SUCCESS) { queryResult = executeQuery( controlGateway, controlUsername, controlPassword, queryPair.getControl(), query.getQuery(), controlTimeout, sessionProperties); } } finally { // teardown no matter what QueryResult tearDownResult = tearDown( query, controlPostQueryResults, controlPostquery -> executeQuery( controlGateway, controlUsername, controlPassword, queryPair.getControl(), controlPostquery, controlTimeout, sessionProperties)); // if teardown is not successful the query fails queryResult = tearDownResult.getState() == State.SUCCESS ? queryResult : tearDownResult; } return queryResult; }
public boolean isSkipped() { if (queryPair.getControl().getQuery().isEmpty() || queryPair.getTest().getQuery().isEmpty()) { return true; } if (getControlResult().getState() != State.SUCCESS) { return true; } if (!isDeterministic()) { return true; } if (getTestResult().getState() == State.TIMEOUT) { return true; } return false; }
private void trySetConnectionProperties(Query query, Connection connection) throws SQLException { // Required for jdbc drivers that do not implement all/some of these functions (eg. impala jdbc // driver) // For these drivers, set the database default values in the query database try { connection.setClientInfo("ApplicationName", "verifier-test:" + queryPair.getName()); connection.setCatalog(query.getCatalog()); connection.setSchema(query.getSchema()); } catch (SQLClientInfoException ignored) { // Do nothing } }
public String getSkippedMessage() { StringBuilder sb = new StringBuilder(); if (getControlResult().getState() == State.TOO_MANY_ROWS) { sb.append("----------\n"); sb.append("Name: " + queryPair.getName() + "\n"); sb.append("Schema (control): " + queryPair.getControl().getSchema() + "\n"); sb.append("Too many rows.\n"); } else if (!isDeterministic()) { sb.append("----------\n"); sb.append("Name: " + queryPair.getName() + "\n"); sb.append("Schema (control): " + queryPair.getControl().getSchema() + "\n"); sb.append("NON DETERMINISTIC\n"); } else if (getControlResult().getState() == State.TIMEOUT || getTestResult().getState() == State.TIMEOUT) { sb.append("----------\n"); sb.append("Name: " + queryPair.getName() + "\n"); sb.append("Schema (control): " + queryPair.getControl().getSchema() + "\n"); sb.append("TIMEOUT\n"); } else { sb.append("SKIPPED: "); if (getControlResult().getException() != null) { sb.append(getControlResult().getException().getMessage()); } } return sb.toString(); }