You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ka...@apache.org on 2019/03/19 20:39:50 UTC
[phoenix] branch 4.x-HBase-1.3 updated: PHOENIX-5172: Harden the
PQS canary synth test tool with retry mechanism and more logging
This is an automated email from the ASF dual-hosted git repository.
karanmehta93 pushed a commit to branch 4.x-HBase-1.3
in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/4.x-HBase-1.3 by this push:
new 7865aff PHOENIX-5172: Harden the PQS canary synth test tool with retry mechanism and more logging
7865aff is described below
commit 7865aff02d3d11e9e49a3ba5aebefe621e220cdd
Author: Swaroopa Kadam <sw...@gmail.com>
AuthorDate: Tue Mar 19 13:39:45 2019 -0700
PHOENIX-5172: Harden the PQS canary synth test tool with retry mechanism and more logging
---
.../org/apache/phoenix/tool/PhoenixCanaryTool.java | 212 ++++++----------
.../tool/ParameterizedPhoenixCanaryToolIT.java | 280 +++++++++++++++++++++
.../apache/phoenix/tool/PhoenixCanaryToolTest.java | 53 +---
.../resources/phoenix-canary-file-sink.properties | 17 ++
4 files changed, 378 insertions(+), 184 deletions(-)
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/tool/PhoenixCanaryTool.java b/phoenix-core/src/main/java/org/apache/phoenix/tool/PhoenixCanaryTool.java
index 405f54f..865d210 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/tool/PhoenixCanaryTool.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/tool/PhoenixCanaryTool.java
@@ -28,18 +28,20 @@ import net.sourceforge.argparse4j.inf.ArgumentParserException;
import net.sourceforge.argparse4j.inf.Namespace;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.RetryCounter;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
import java.io.File;
import java.io.InputStream;
import java.sql.Connection;
-import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.Statement;
+import java.sql.SQLException;
+import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
@@ -49,16 +51,23 @@ import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
/**
- * A Canary Tool to perform synthetic tests for Query Server
+ * A Canary Tool to perform synthetic tests for Phoenix
+ * It assumes that TEST.PQSTEST or the schema.table passed in the argument
+ * is already present as following command
+ * CREATE TABLE IF NOT EXISTS TEST.PQSTEST (mykey INTEGER NOT NULL
+ * PRIMARY KEY, mycolumn VARCHAR, insert_date TIMESTAMP);
+ *
*/
public class PhoenixCanaryTool extends Configured implements Tool {
private static String TEST_SCHEMA_NAME = "TEST";
private static String TEST_TABLE_NAME = "PQSTEST";
private static String FQ_TABLE_NAME = "TEST.PQSTEST";
- private boolean USE_NAMESPACE = true;
-
+ private static Timestamp timestamp;
+ private static final int MAX_CONNECTION_ATTEMPTS = 5;
+ private final int FIRST_TIME_RETRY_TIMEOUT = 5000;
private Sink sink = new StdOutSink();
+ public static final String propFileName = "phoenix-canary-file-sink.properties";
/**
* Base class for a Canary Test
@@ -97,84 +106,38 @@ public class PhoenixCanaryTool extends Configured implements Tool {
}
}
- /**
- * Test which prepares environment before other tests run
- */
- static class PrepareTest extends CanaryTest {
- void onExecute() throws Exception {
- result.setTestName("prepare");
- Statement statement = connection.createStatement();
- DatabaseMetaData dbm = connection.getMetaData();
- ResultSet tables = dbm.getTables(null, TEST_SCHEMA_NAME, TEST_TABLE_NAME, null);
- if (tables.next()) {
- // Drop test Table if exists
- statement.executeUpdate("DROP TABLE IF EXISTS " + FQ_TABLE_NAME);
- }
-
- // Drop test schema if exists
- if (TEST_SCHEMA_NAME != null) {
- statement = connection.createStatement();
- statement.executeUpdate("DROP SCHEMA IF EXISTS " + TEST_SCHEMA_NAME);
- }
- }
- }
-
- /**
- * Create Schema Test
- */
- static class CreateSchemaTest extends CanaryTest {
- void onExecute() throws Exception {
- result.setTestName("createSchema");
- Statement statement = connection.createStatement();
- statement.executeUpdate("CREATE SCHEMA IF NOT EXISTS " + TEST_SCHEMA_NAME);
- }
- }
-
- /**
- * Create Table Test
- */
- static class CreateTableTest extends CanaryTest {
- void onExecute() throws Exception {
- result.setTestName("createTable");
- Statement statement = connection.createStatement();
- // Create Table
- statement.executeUpdate("CREATE TABLE IF NOT EXISTS" + FQ_TABLE_NAME + " (mykey " + "INTEGER "
- + "NOT " + "NULL PRIMARY KEY, " + "mycolumn VARCHAR)");
- }
- }
-
- /**
- * Upsert Data into Table Test
- */
static class UpsertTableTest extends CanaryTest {
void onExecute() throws Exception {
result.setTestName("upsertTable");
// Insert data
- Statement statement = connection.createStatement();
- statement.executeUpdate("UPSERT INTO " + FQ_TABLE_NAME + " VALUES (1, " +
- "'Hello" + " World')");
+ timestamp = new Timestamp(System.currentTimeMillis());
+ String stmt = "UPSERT INTO " + FQ_TABLE_NAME
+ + "(mykey, mycolumn, insert_date) VALUES (?, ?, ?)";
+ PreparedStatement ps = connection.prepareStatement(stmt);
+ ps.setInt(1, 1);
+ ps.setString(2, "Hello World");
+ ps.setTimestamp(3, timestamp);
+ ps.executeUpdate();
connection.commit();
}
}
- /**
- * Read data from Table Test
- */
static class ReadTableTest extends CanaryTest {
void onExecute() throws Exception {
result.setTestName("readTable");
- // Query for table
- PreparedStatement ps = connection.prepareStatement("SELECT * FROM " + FQ_TABLE_NAME);
+ PreparedStatement ps = connection.prepareStatement("SELECT * FROM "
+ + FQ_TABLE_NAME+" WHERE INSERT_DATE = ?");
+ ps.setTimestamp(1,timestamp);
ResultSet rs = ps.executeQuery();
- // Check correctness
int totalRows = 0;
while (rs.next()) {
totalRows += 1;
Integer myKey = rs.getInt(1);
String myColumn = rs.getString(2);
if (myKey != 1 || !myColumn.equals("Hello World")) {
- throw new Exception("Retrieved values do not match the inserted " + "values");
+ throw new Exception("Retrieved values do not " +
+ "match the inserted values");
}
}
if (totalRows != 1) {
@@ -186,35 +149,6 @@ public class PhoenixCanaryTool extends Configured implements Tool {
}
/**
- * Delete test table Test
- */
- static class DeleteTableTest extends CanaryTest {
- void onExecute() throws Exception {
- result.setTestName("deleteTable");
- Statement statement = connection.createStatement();
- statement.executeUpdate("DROP TABLE IF EXISTS" + FQ_TABLE_NAME);
-
- // Check if table dropped
- DatabaseMetaData dbm = connection.getMetaData();
- ResultSet tables = dbm.getTables(null, TEST_SCHEMA_NAME, TEST_TABLE_NAME, null);
- if (tables.next()) {
- throw new Exception("Test Table could not be dropped");
- }
- }
- }
-
- /**
- * Delete test Schema Test
- */
- static class DeleteSchemaTest extends CanaryTest {
- void onExecute() throws Exception {
- result.setTestName("deleteSchema");
- Statement statement = connection.createStatement();
- statement.executeUpdate("DROP SCHEMA IF EXISTS " + TEST_SCHEMA_NAME);
- }
- }
-
- /**
* Sink interface used by the canary to output information
*/
public interface Sink {
@@ -227,9 +161,6 @@ public class PhoenixCanaryTool extends Configured implements Tool {
void clearResults();
}
- /**
- * Implementation of Std Out Sink
- */
public static class StdOutSink implements Sink {
private List<CanaryTestResult> results = new ArrayList<>();
@@ -244,7 +175,7 @@ public class PhoenixCanaryTool extends Configured implements Tool {
}
@Override
- public void publishResults() throws Exception {
+ public void publishResults() {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String resultJson = gson.toJson(results);
@@ -264,7 +195,6 @@ public class PhoenixCanaryTool extends Configured implements Tool {
private List<CanaryTestResult> results = new ArrayList<>();
File dir;
String logfileName;
- String propFileName = "phoenix-canary-file-sink.properties";
public FileOutSink() throws Exception {
Properties prop = new Properties();
@@ -338,7 +268,7 @@ public class PhoenixCanaryTool extends Configured implements Tool {
TEST_TABLE_NAME);
parser.addArgument("--logsinkclass", "-lsc").type(String.class).nargs("?").setDefault
- ("PhoenixCanaryTool$StdOutSink").help
+ ("org.apache.phoenix.tool.PhoenixCanaryTool$StdOutSink").help
("Path to a Custom implementation for log sink class. default: stdout");
Namespace res = null;
@@ -393,18 +323,10 @@ public class PhoenixCanaryTool extends Configured implements Tool {
appInfo.setTestName("appInfo");
appInfo.setMiscellaneous(connectionURL);
- Properties connProps = new Properties();
- connProps.setProperty("phoenix.schema.mapSystemTablesToNamespace", "true");
- connProps.setProperty("phoenix.schema.isNamespaceMappingEnabled", "true");
+ connection = getConnectionWithRetry(connectionURL);
- try {
- connection = DriverManager.getConnection(connectionURL, connProps);
- } catch (Exception e) {
- LOG.info("Namespace mapping cannot be set. Using default schema");
- USE_NAMESPACE = false;
- connection = DriverManager.getConnection(connectionURL);
- TEST_SCHEMA_NAME = null;
- FQ_TABLE_NAME = TEST_TABLE_NAME;
+ if (connection == null) {
+ LOG.error("Failed to get connection after multiple retries; the connection is null");
}
SimpleTimeLimiter limiter = new SimpleTimeLimiter();
@@ -416,32 +338,13 @@ public class PhoenixCanaryTool extends Configured implements Tool {
sink.clearResults();
// Execute tests
-
- LOG.info("Starting PrepareTest");
- sink.updateResults(new PrepareTest().runTest(connection));
-
- if (USE_NAMESPACE) {
- LOG.info("Starting CreateSchemaTest");
- sink.updateResults(new CreateSchemaTest().runTest(connection));
- }
-
- LOG.info("Starting CreateTableTest");
- sink.updateResults(new CreateTableTest().runTest(connection));
-
LOG.info("Starting UpsertTableTest");
sink.updateResults(new UpsertTableTest().runTest(connection));
LOG.info("Starting ReadTableTest");
sink.updateResults(new ReadTableTest().runTest(connection));
-
- LOG.info("Starting DeleteTableTest");
- sink.updateResults(new DeleteTableTest().runTest(connection));
-
- if (USE_NAMESPACE) {
- LOG.info("Starting DeleteSchemaTest");
- sink.updateResults(new DeleteSchemaTest().runTest(connection));
- }
return null;
+
}
}, timeoutVal, TimeUnit.SECONDS, true);
@@ -464,11 +367,56 @@ public class PhoenixCanaryTool extends Configured implements Tool {
return 0;
}
+ private Connection getConnectionWithRetry(String connectionURL) {
+ Connection connection=null;
+ try{
+ connection = getConnectionWithRetry(connectionURL, true);
+ } catch (Exception e) {
+ LOG.info("Failed to get connection with namespace enabled", e);
+ try {
+ connection = getConnectionWithRetry(connectionURL, false);
+ } catch (Exception ex) {
+ LOG.info("Failed to get connection without namespace enabled", ex);
+ }
+ }
+ return connection;
+ }
+
+ private Connection getConnectionWithRetry(String connectionURL, boolean namespaceFlag)
+ throws Exception {
+ Properties connProps = new Properties();
+ Connection connection = null;
+
+ connProps.setProperty("phoenix.schema.mapSystemTablesToNamespace", String.valueOf(namespaceFlag));
+ connProps.setProperty("phoenix.schema.isNamespaceMappingEnabled", String.valueOf(namespaceFlag));
+
+ RetryCounter retrier = new RetryCounter(MAX_CONNECTION_ATTEMPTS,
+ FIRST_TIME_RETRY_TIMEOUT, TimeUnit.MILLISECONDS);
+ LOG.info("Trying to get the connection with "
+ + retrier.getMaxAttempts() + " attempts with "
+ + "connectionURL :" + connectionURL
+ + "connProps :" + connProps);
+ while (retrier.shouldRetry()) {
+ try {
+ connection = DriverManager.getConnection(connectionURL, connProps);
+ } catch (SQLException e) {
+ LOG.info("Trying to establish connection with "
+ + retrier.getAttemptTimes() + " attempts", e);
+ }
+ if (connection != null) {
+ LOG.info("Successfully established connection within "
+ + retrier.getAttemptTimes() + " attempts");
+ break;
+ }
+ retrier.sleepUntilNextRetry();
+ }
+ return connection;
+ }
+
public static void main(final String[] args) {
- int result = 0;
try {
LOG.info("Starting Phoenix Canary Test tool...");
- result = ToolRunner.run(new PhoenixCanaryTool(), args);
+ ToolRunner.run(new PhoenixCanaryTool(), args);
} catch (Exception e) {
LOG.error("Error in running Phoenix Canary Test tool. " + e);
}
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/tool/ParameterizedPhoenixCanaryToolIT.java b/phoenix-core/src/test/java/org/apache/phoenix/tool/ParameterizedPhoenixCanaryToolIT.java
new file mode 100644
index 0000000..cefb456
--- /dev/null
+++ b/phoenix-core/src/test/java/org/apache/phoenix/tool/ParameterizedPhoenixCanaryToolIT.java
@@ -0,0 +1,280 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.apache.phoenix.tool;
+
+import com.google.common.collect.Maps;
+import com.google.gson.Gson;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.phoenix.end2end.ChangePermissionsIT;
+import org.apache.phoenix.end2end.NeedsOwnMiniClusterTest;
+import org.apache.phoenix.query.BaseTest;
+import org.apache.phoenix.query.QueryServices;
+import org.apache.phoenix.util.ReadOnlyProps;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.apache.phoenix.tool.PhoenixCanaryTool.propFileName;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(Parameterized.class)
+@Category(NeedsOwnMiniClusterTest.class)
+public class ParameterizedPhoenixCanaryToolIT extends BaseTest {
+
+ private static final Log logger = LogFactory.getLog(ParameterizedPhoenixCanaryToolIT.class);
+ private static final String stdOutSink
+ = "org.apache.phoenix.tool.PhoenixCanaryTool$StdOutSink";
+ private static final String fileOutSink
+ = "org.apache.phoenix.tool.PhoenixCanaryTool$FileOutSink";
+
+ private static Map<String, String> serverProps = Maps.newHashMapWithExpectedSize(2);
+ private static Map<String, String> clientProps = Maps.newHashMapWithExpectedSize(2);
+ private static String connString = "";
+ private static Properties canaryProp = new Properties();
+ private static Connection connection = null;
+ private boolean isNamespaceEnabled;
+ private boolean isPositiveTestType;
+ private List<String> cmd = new ArrayList<>();
+ private String resultSinkOption;
+ private ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+ public ParameterizedPhoenixCanaryToolIT(boolean isPositiveTestType,
+ boolean isNamespaceEnabled, String resultSinkOption) {
+ this.isPositiveTestType = isPositiveTestType;
+ this.isNamespaceEnabled = isNamespaceEnabled;
+ this.resultSinkOption = resultSinkOption;
+ }
+
+ @Parameterized.Parameters(name = "ParameterizedPhoenixCanaryToolIT_isPositiveTestType={0}," +
+ "isNamespaceEnabled={1},resultSinkOption={2}")
+ public static Collection parametersList() {
+ return Arrays.asList(new Object[][] {
+ {true, true, stdOutSink},
+ {true, true, fileOutSink},
+ {false, true, stdOutSink},
+ {false, true, fileOutSink},
+ {true, false, stdOutSink},
+ {true, false, fileOutSink},
+ {false, false, stdOutSink},
+ {false, false, fileOutSink}
+ });
+ }
+
+ @Before
+ public void setup() throws Exception {
+ String createSchema;
+ String createTable;
+
+ if(needsNewCluster()) {
+ setClientSideNamespaceProperties();
+ setServerSideNamespaceProperties();
+ tearDownMiniClusterAsync(1);
+ setUpTestDriver(new ReadOnlyProps(serverProps.entrySet().iterator()),
+ new ReadOnlyProps(clientProps.entrySet().iterator()));
+ logger.info("New cluster is spinned up with test parameters " +
+ "isPositiveTestType" + this.isPositiveTestType +
+ "isNamespaceEnabled" + this.isNamespaceEnabled +
+ "resultSinkOption" + this.resultSinkOption);
+ connString = BaseTest.getUrl();
+ connection = getConnection();
+ }
+
+ if (this.isNamespaceEnabled) {
+ createSchema = "CREATE SCHEMA IF NOT EXISTS TEST";
+ connection.createStatement().execute(createSchema);
+ }
+ createTable = "CREATE TABLE IF NOT EXISTS TEST.PQSTEST " +
+ "(mykey INTEGER NOT NULL PRIMARY KEY, mycolumn VARCHAR," +
+ " insert_date TIMESTAMP)";
+ connection.createStatement().execute(createTable);
+ cmd.add("--constring");
+ cmd.add(connString);
+ cmd.add("--logsinkclass");
+ cmd.add(this.resultSinkOption);
+ if (this.resultSinkOption.contains(stdOutSink)) {
+ System.setOut(new java.io.PrintStream(out));
+ } else {
+ loadCanaryPropertiesFile(canaryProp);
+ }
+ }
+
+ private boolean needsNewCluster() {
+ if (connection == null) {
+ return true;
+ }
+ if (!clientProps.get(QueryServices.IS_SYSTEM_TABLE_MAPPED_TO_NAMESPACE)
+ .equalsIgnoreCase(String.valueOf(this.isNamespaceEnabled))) {
+ return true;
+ }
+ return false;
+ }
+
+ private void setClientSideNamespaceProperties() {
+
+ clientProps.put(QueryServices.IS_SYSTEM_TABLE_MAPPED_TO_NAMESPACE,
+ String.valueOf(this.isNamespaceEnabled));
+
+ clientProps.put(QueryServices.IS_NAMESPACE_MAPPING_ENABLED,
+ String.valueOf(this.isNamespaceEnabled));
+ }
+
+ private Connection getConnection() throws SQLException {
+ Properties props = new Properties();
+ props.setProperty(QueryServices.IS_SYSTEM_TABLE_MAPPED_TO_NAMESPACE,
+ String.valueOf(this.isNamespaceEnabled));
+
+ props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED,
+ String.valueOf(this.isNamespaceEnabled));
+ return DriverManager.getConnection(connString, props);
+ }
+
+ void setServerSideNamespaceProperties() {
+ serverProps.put(QueryServices.IS_NAMESPACE_MAPPING_ENABLED,
+ String.valueOf(this.isNamespaceEnabled));
+ serverProps.put(QueryServices.IS_SYSTEM_TABLE_MAPPED_TO_NAMESPACE,
+ String.valueOf(this.isNamespaceEnabled));
+ }
+
+ /*
+ * This test runs in the test suit with
+ * combination of parameters provided.
+ * It tests the tool in positive type where test expects to pass
+ * and negative type where test expects to fail.
+ */
+ @Test
+ public void phoenixCanaryToolTest() throws SQLException, IOException {
+ if (!isPositiveTestType) {
+ dropTestTable();
+ }
+ PhoenixCanaryTool.main(cmd.toArray(new String[cmd.size()]));
+ Boolean result = getAggregatedResult();
+ if (isPositiveTestType) {
+ assertTrue(result);
+ } else {
+ assertFalse(result);
+ }
+ }
+
+ private Boolean getAggregatedResult() throws IOException {
+ HashMap<String, Boolean> resultsMap;
+ Boolean result = true;
+ resultsMap = parsePublishedResults();
+ for (Boolean b : resultsMap.values()) {
+ result = result && b;
+ }
+ return result;
+ }
+
+ private HashMap<String, Boolean> parsePublishedResults() throws IOException {
+ Gson parser = new Gson();
+ CanaryTestResult[] results;
+ HashMap<String, Boolean> resultsMap = new HashMap<>();
+
+ if (this.resultSinkOption.contains(fileOutSink)) {
+ File resultFile = getTestResultsFile();
+ results = parser.fromJson(new FileReader(resultFile),
+ CanaryTestResult[].class);
+ } else {
+ String result = out.toString();
+ results = parser.fromJson(result, CanaryTestResult[].class);
+ }
+ for (CanaryTestResult r : results) {
+ resultsMap.put(r.getTestName(), r.isSuccessful());
+ }
+ return resultsMap;
+ }
+
+ private File getTestResultsFile() {
+ File[] files = getLogFileList();
+ return files[0];
+ }
+
+ @After
+ public void teardown() throws SQLException {
+ if (this.isNamespaceEnabled) {
+ dropTestTableAndSchema();
+ } else {
+ dropTestTable();
+ }
+ if (this.resultSinkOption.contains(fileOutSink)) {
+ deleteResultSinkFile();
+ }
+ }
+
+ private void deleteResultSinkFile() {
+ File[] files = getLogFileList();
+ for (final File file : files) {
+ if (!file.delete()) {
+ System.err.println("Can't remove " + file.getAbsolutePath());
+ }
+ }
+ }
+
+ private File[] getLogFileList() {
+ File dir = new File(canaryProp.getProperty("file.location"));
+ return dir.listFiles(new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.endsWith(".log");
+ }
+ });
+ }
+
+ private void loadCanaryPropertiesFile(Properties prop) {
+ InputStream input = ClassLoader.getSystemResourceAsStream(propFileName);
+ try {
+ prop.load(input);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void dropTestTable() throws SQLException {
+ String dropTable = "DROP TABLE IF EXISTS TEST.PQSTEST";
+ connection.createStatement().execute(dropTable);
+ }
+
+ private void dropTestTableAndSchema() throws SQLException {
+ dropTestTable();
+ String dropSchema = "DROP SCHEMA IF EXISTS TEST";
+ connection.createStatement().execute(dropSchema);
+ }
+
+}
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/tool/PhoenixCanaryToolTest.java b/phoenix-core/src/test/java/org/apache/phoenix/tool/PhoenixCanaryToolTest.java
index bd2a3d1..94229c2 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/tool/PhoenixCanaryToolTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/tool/PhoenixCanaryToolTest.java
@@ -54,40 +54,9 @@ public class PhoenixCanaryToolTest {
}
@Test
- public void prepareTest() throws Exception {
- when(connection.createStatement()).thenReturn(statement);
- when(statement.executeUpdate(Mockito.anyString())).thenReturn(0);
- when(connection.getMetaData()).thenReturn(dbm);
- when(dbm.getTables(null, "TEST", "PQSTEST", null)).thenReturn(rs);
- when(rs.next()).thenReturn(true).thenReturn(false);
- when(connection.createStatement()).thenReturn(statement);
- when(statement.executeUpdate(Mockito.anyString())).thenReturn(0);
- CanaryTestResult result = new PhoenixCanaryTool.PrepareTest().runTest(connection);
- assertEquals(true, result.isSuccessful());
- assertEquals("Test prepare successful", result.getMessage());
- }
-
- @Test
- public void createSchemaTest() throws Exception {
- when(connection.createStatement()).thenReturn(statement);
- when(statement.executeUpdate(Mockito.anyString())).thenReturn(0);
- CanaryTestResult result = new PhoenixCanaryTool.CreateSchemaTest().runTest(connection);
- assertEquals(true, result.isSuccessful());
- assertEquals("Test createSchema successful", result.getMessage());
- }
-
- @Test
- public void createTableTest() throws Exception {
- when(connection.createStatement()).thenReturn(statement);
- when(statement.executeUpdate(Mockito.anyString())).thenReturn(0);
- CanaryTestResult result = new PhoenixCanaryTool.CreateTableTest().runTest(connection);
- assertEquals(true, result.isSuccessful());
- assertEquals("Test createTable successful", result.getMessage());
- }
-
- @Test
public void upsertTableTest() throws Exception {
when(connection.createStatement()).thenReturn(statement);
+ when(connection.prepareStatement(Mockito.anyString())).thenReturn(ps);
when(statement.executeUpdate(Mockito.anyString())).thenReturn(1);
CanaryTestResult result = new PhoenixCanaryTool.UpsertTableTest().runTest(connection);
assertEquals(true, result.isSuccessful());
@@ -107,26 +76,6 @@ public class PhoenixCanaryToolTest {
}
@Test
- public void deleteTableTest() throws Exception {
- when(connection.createStatement()).thenReturn(statement);
- when(statement.executeUpdate(Mockito.anyString())).thenReturn(0);
- when(connection.getMetaData()).thenReturn(dbm);
- when(dbm.getTables(null, "TEST", "PQSTEST", null)).thenReturn(rs);
- CanaryTestResult result = new PhoenixCanaryTool.DeleteTableTest().runTest(connection);
- assertEquals(true, result.isSuccessful());
- assertEquals("Test deleteTable successful", result.getMessage());
- }
-
- @Test
- public void deleteSchemaTest() throws Exception {
- when(connection.createStatement()).thenReturn(statement);
- when(statement.executeUpdate(Mockito.anyString())).thenReturn(0);
- CanaryTestResult result = new PhoenixCanaryTool.DeleteSchemaTest().runTest(connection);
- assertEquals(true, result.isSuccessful());
- assertEquals("Test deleteSchema successful", result.getMessage());
- }
-
- @Test
public void failTest() throws Exception {
when(connection.prepareStatement(Mockito.anyString())).thenReturn(ps);
when(ps.executeQuery()).thenReturn(rs);
diff --git a/phoenix-core/src/test/resources/phoenix-canary-file-sink.properties b/phoenix-core/src/test/resources/phoenix-canary-file-sink.properties
new file mode 100644
index 0000000..951c7b1
--- /dev/null
+++ b/phoenix-core/src/test/resources/phoenix-canary-file-sink.properties
@@ -0,0 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+file.name=phoenix-canary-result.txt
+file.location=.
\ No newline at end of file