You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by am...@apache.org on 2015/04/15 21:49:42 UTC
[08/50] [abbrv] incubator-lens git commit: LENS-402: In Query End
Notification mail,
Send status message along with of errorMessage (Amareshwari Sriramadasu via
prongs)
LENS-402: In Query End Notification mail, Send status message along with of errorMessage (Amareshwari Sriramadasu via prongs)
Project: http://git-wip-us.apache.org/repos/asf/incubator-lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-lens/commit/36764bb7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-lens/tree/36764bb7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-lens/diff/36764bb7
Branch: refs/heads/current-release-line
Commit: 36764bb7414f395da0b725c46ab11e954e3dbab0
Parents: 7f6634a
Author: Amareshwari Sriramadasu <am...@apache.org>
Authored: Thu Mar 26 19:11:15 2015 +0530
Committer: Rajat Khandelwal <pr...@apache.org>
Committed: Thu Mar 26 19:11:15 2015 +0530
----------------------------------------------------------------------
.../org/apache/lens/driver/hive/HiveDriver.java | 3 +-
.../org/apache/lens/driver/jdbc/JDBCDriver.java | 3 +-
.../lens/server/query/QueryEndNotifier.java | 10 +-
.../lens/server/query/ResultFormatter.java | 2 +-
.../server/query/TestQueryEndEmailNotifier.java | 293 +++++++++++++++++++
.../lens/server/query/TestQueryService.java | 63 ----
6 files changed, 307 insertions(+), 67 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/36764bb7/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/HiveDriver.java
----------------------------------------------------------------------
diff --git a/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/HiveDriver.java b/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/HiveDriver.java
index 9e3c723..1dc87b6 100644
--- a/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/HiveDriver.java
+++ b/lens-driver-hive/src/main/java/org/apache/lens/driver/hive/HiveDriver.java
@@ -544,7 +544,8 @@ public class HiveDriver implements LensDriver {
break;
case ERROR:
context.getDriverStatus().setState(DriverQueryState.FAILED);
- context.getDriverStatus().setStatusMessage(
+ context.getDriverStatus().setStatusMessage("Query execution failed!");
+ context.getDriverStatus().setErrorMessage(
"Query failed with errorCode:" + opStatus.getOperationException().getErrorCode() + " with errorMessage: "
+ opStatus.getOperationException().getMessage());
break;
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/36764bb7/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java
----------------------------------------------------------------------
diff --git a/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java b/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java
index 35a9067..121b56b 100644
--- a/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java
+++ b/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java
@@ -922,7 +922,8 @@ public class JDBCDriver implements LensDriver {
context.getDriverStatus().setStatusMessage(context.getQueryHandle() + " cancelled");
} else if (ctx.getQueryResult() != null && ctx.getQueryResult().error != null) {
context.getDriverStatus().setState(DriverQueryState.FAILED);
- context.getDriverStatus().setStatusMessage(ctx.getQueryResult().error.getMessage());
+ context.getDriverStatus().setStatusMessage("Query execution failed!");
+ context.getDriverStatus().setErrorMessage(ctx.getQueryResult().error.getMessage());
} else {
context.getDriverStatus().setState(DriverQueryState.SUCCESSFUL);
context.getDriverStatus().setStatusMessage(context.getQueryHandle() + " successful");
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/36764bb7/lens-server/src/main/java/org/apache/lens/server/query/QueryEndNotifier.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/query/QueryEndNotifier.java b/lens-server/src/main/java/org/apache/lens/server/query/QueryEndNotifier.java
index 70f9dba..1c6f186 100644
--- a/lens-server/src/main/java/org/apache/lens/server/query/QueryEndNotifier.java
+++ b/lens-server/src/main/java/org/apache/lens/server/query/QueryEndNotifier.java
@@ -38,6 +38,7 @@ import org.apache.lens.server.api.metrics.MetricsService;
import org.apache.lens.server.api.query.QueryContext;
import org.apache.lens.server.api.query.QueryEnded;
+import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hive.conf.HiveConf;
@@ -153,15 +154,22 @@ public class QueryEndNotifier extends AsyncEventListener<QueryEnded> {
msgBuilder.append("/httpresultset");
break;
case FAILED:
- msgBuilder.append(queryContext.getStatus().getErrorMessage());
+ msgBuilder.append(queryContext.getStatus().getStatusMessage());
+ if (!StringUtils.isBlank(queryContext.getStatus().getErrorMessage())) {
+ msgBuilder.append("\n Reason:\n");
+ msgBuilder.append(queryContext.getStatus().getErrorMessage());
+ }
break;
case CANCELED:
+ msgBuilder.append(queryContext.getStatus().getStatusMessage());
+ break;
case CLOSED:
default:
break;
}
return msgBuilder.toString();
}
+
@Data
public static class Email {
private final String from;
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/36764bb7/lens-server/src/main/java/org/apache/lens/server/query/ResultFormatter.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/query/ResultFormatter.java b/lens-server/src/main/java/org/apache/lens/server/query/ResultFormatter.java
index 0b215d8..b40f949 100644
--- a/lens-server/src/main/java/org/apache/lens/server/query/ResultFormatter.java
+++ b/lens-server/src/main/java/org/apache/lens/server/query/ResultFormatter.java
@@ -134,7 +134,7 @@ public class ResultFormatter extends AsyncEventListener<QueryExecuted> {
metricsService.incrCounter(ResultFormatter.class, "formatting-errors");
LOG.warn("Exception while formatting result for " + queryHandle, e);
try {
- queryService.setFailedStatus(ctx, "Result formatting failed!", e.getLocalizedMessage());
+ queryService.setFailedStatus(ctx, "Result formatting failed!", e.getMessage());
} catch (LensException e1) {
LOG.error("Exception while setting failure for " + queryHandle, e1);
}
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/36764bb7/lens-server/src/test/java/org/apache/lens/server/query/TestQueryEndEmailNotifier.java
----------------------------------------------------------------------
diff --git a/lens-server/src/test/java/org/apache/lens/server/query/TestQueryEndEmailNotifier.java b/lens-server/src/test/java/org/apache/lens/server/query/TestQueryEndEmailNotifier.java
new file mode 100644
index 0000000..5726602
--- /dev/null
+++ b/lens-server/src/test/java/org/apache/lens/server/query/TestQueryEndEmailNotifier.java
@@ -0,0 +1,293 @@
+/**
+ * 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.lens.server.query;
+
+import java.util.*;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.lens.api.LensConf;
+import org.apache.lens.api.LensSessionHandle;
+import org.apache.lens.api.query.*;
+import org.apache.lens.api.query.QueryStatus.Status;
+import org.apache.lens.server.LensJerseyTest;
+import org.apache.lens.server.LensServices;
+import org.apache.lens.server.LensTestUtil;
+import org.apache.lens.server.api.LensConfConstants;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hive.conf.HiveConf;
+
+import org.glassfish.jersey.client.ClientConfig;
+import org.glassfish.jersey.media.multipart.FormDataBodyPart;
+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+import org.glassfish.jersey.media.multipart.FormDataMultiPart;
+import org.glassfish.jersey.media.multipart.MultiPartFeature;
+import org.subethamail.wiser.Wiser;
+import org.subethamail.wiser.WiserMessage;
+import org.testng.Assert;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+/**
+ * The query completion email notifier
+ */
+@Test(groups = "unit-test")
+public class TestQueryEndEmailNotifier extends LensJerseyTest {
+
+ /** The Constant LOG. */
+ public static final Log LOG = LogFactory.getLog(TestQueryEndEmailNotifier.class);
+
+ /** The query service. */
+ QueryExecutionServiceImpl queryService;
+
+ /** The lens session id. */
+ LensSessionHandle lensSessionId;
+
+ /** The wiser. */
+ private Wiser wiser;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.glassfish.jersey.test.JerseyTest#setUp()
+ */
+ @BeforeTest
+ public void setUp() throws Exception {
+ super.setUp();
+ wiser = new Wiser();
+ wiser.setHostname("localhost");
+ wiser.setPort(25000);
+ queryService = (QueryExecutionServiceImpl) LensServices.get().getService("query");
+ Map<String, String> sessionconf = new HashMap<String, String>();
+ sessionconf.put("test.session.key", "svalue");
+ sessionconf.put(LensConfConstants.QUERY_MAIL_NOTIFY, "true");
+ sessionconf.put(LensConfConstants.QUERY_RESULT_EMAIL_CC, "foo1@localhost,foo2@localhost,foo3@localhost");
+ lensSessionId = queryService.openSession("foo@localhost", "bar", sessionconf); // @localhost should be removed
+ // automatically
+ createTable(TEST_TABLE);
+ loadData(TEST_TABLE, TEST_DATA_FILE);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.glassfish.jersey.test.JerseyTest#tearDown()
+ */
+ @AfterTest
+ public void tearDown() throws Exception {
+ dropTable(TEST_TABLE);
+ queryService.closeSession(lensSessionId);
+ super.tearDown();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.glassfish.jersey.test.JerseyTest#configure()
+ */
+ @Override
+ protected Application configure() {
+ return new QueryApp();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.glassfish.jersey.test.JerseyTest#configureClient(org.glassfish.jersey.client.ClientConfig)
+ */
+ @Override
+ protected void configureClient(ClientConfig config) {
+ config.register(MultiPartFeature.class);
+ }
+
+ /** The test table. */
+ public static final String TEST_TABLE = "EMAIL_NOTIFIER_TEST_TABLE";
+
+ /** The Constant TEST_DATA_FILE. */
+ public static final String TEST_DATA_FILE = "./testdata/testdata2.data";
+
+ /**
+ * Creates the table.
+ *
+ * @param tblName the tbl name
+ * @throws InterruptedException the interrupted exception
+ */
+ private void createTable(String tblName) throws InterruptedException {
+ LensTestUtil.createTable(tblName, target(), lensSessionId);
+ }
+
+ /**
+ * Load data.
+ *
+ * @param tblName the tbl name
+ * @param testDataFile the test data file
+ * @throws InterruptedException the interrupted exception
+ */
+ private void loadData(String tblName, final String testDataFile) throws InterruptedException {
+ LensTestUtil.loadData(tblName, testDataFile, target(), lensSessionId);
+ }
+
+ /**
+ * Drop table.
+ *
+ * @param tblName the tbl name
+ * @throws InterruptedException the interrupted exception
+ */
+ private void dropTable(String tblName) throws InterruptedException {
+ LensTestUtil.dropTable(tblName, target(), lensSessionId);
+ }
+
+ private QueryHandle launchAndWaitForQuery(LensConf conf, String query, Status expectedStatus)
+ throws InterruptedException {
+ final WebTarget target = target().path("queryapi/queries");
+ final FormDataMultiPart mp = new FormDataMultiPart();
+ mp.bodyPart(new FormDataBodyPart(FormDataContentDisposition.name("sessionid").build(), lensSessionId,
+ MediaType.APPLICATION_XML_TYPE));
+ mp.bodyPart(new FormDataBodyPart(FormDataContentDisposition.name("query").build(), query));
+ mp.bodyPart(new FormDataBodyPart(FormDataContentDisposition.name("operation").build(), "execute"));
+ mp.bodyPart(new FormDataBodyPart(FormDataContentDisposition.name("conf").fileName("conf").build(), conf,
+ MediaType.APPLICATION_XML_TYPE));
+ final QueryHandle handle = target.request().post(Entity.entity(mp, MediaType.MULTIPART_FORM_DATA_TYPE),
+ QueryHandle.class);
+
+ Assert.assertNotNull(handle);
+ LensQuery ctx = target.path(handle.toString()).queryParam("sessionid", lensSessionId).request()
+ .get(LensQuery.class);
+ QueryStatus stat = ctx.getStatus();
+ while (!stat.isFinished()) {
+ ctx = target.path(handle.toString()).queryParam("sessionid", lensSessionId).request().get(LensQuery.class);
+ stat = ctx.getStatus();
+ Thread.sleep(1000);
+ }
+ Assert.assertEquals(ctx.getStatus().getStatus(), expectedStatus);
+ return handle;
+ }
+ /**
+ * Test launch fail.
+ *
+ * @throws InterruptedException the interrupted exception
+ */
+ @Test
+ public void testEmailNotification() throws InterruptedException {
+ wiser.start();
+ LensConf conf = new LensConf();
+ // launch failure
+ QueryHandle handle = launchAndWaitForQuery(conf, "select ID from non_exist_table", QueryStatus.Status.FAILED);
+ List<WiserMessage> messages = new ArrayList<WiserMessage>();
+ for (int i = 0; i < 20; i++) {
+ messages = wiser.getMessages();
+ if (messages.size() > 0) {
+ break;
+ }
+ Thread.sleep(10000);
+ }
+
+ Assert.assertEquals(messages.size(), 4);
+ Assert.assertTrue(messages.get(0).toString().contains(handle.toString()));
+ Assert.assertEquals(messages.size(), 4);
+ Assert.assertTrue(messages.get(0).toString().contains(handle.toString()));
+ Assert.assertTrue(messages.get(0).toString().contains("Launching query failed"));
+ Assert.assertTrue(messages.get(0).toString().contains("Reason"));
+
+ // rewriter failure
+ handle = launchAndWaitForQuery(conf, "cube select ID from nonexist", QueryStatus.Status.FAILED);
+ messages = new ArrayList<WiserMessage>();
+ for (int i = 0; i < 20; i++) {
+ messages = wiser.getMessages();
+ if (messages.size() > 4) {
+ break;
+ }
+ Thread.sleep(10000);
+ }
+
+ Assert.assertEquals(messages.size(), 8);
+ Assert.assertTrue(messages.get(4).toString().contains(handle.toString()));
+ Assert.assertTrue(messages.get(4).toString().contains("Launching query failed"));
+ Assert.assertTrue(messages.get(4).toString().contains("Reason"));
+
+ // formatting failure
+ conf = new LensConf();
+ conf.addProperty(LensConfConstants.QUERY_PERSISTENT_RESULT_SET, "true");
+ conf.addProperty(LensConfConstants.QUERY_PERSISTENT_RESULT_INDRIVER, "false");
+ conf.addProperty(LensConfConstants.QUERY_OUTPUT_SERDE, "NonexistentSerde.class");
+ handle = launchAndWaitForQuery(conf, "select ID, IDSTR from " + TEST_TABLE,
+ QueryStatus.Status.FAILED);
+ messages = new ArrayList<WiserMessage>();
+ for (int i = 0; i < 20; i++) {
+ messages = wiser.getMessages();
+ if (messages.size() > 8) {
+ break;
+ }
+ Thread.sleep(10000);
+ }
+
+ Assert.assertEquals(messages.size(), 12);
+ Assert.assertTrue(messages.get(8).toString().contains(handle.toString()));
+ Assert.assertTrue(messages.get(8).toString().contains("Result formatting failed!"));
+ Assert.assertTrue(messages.get(8).toString().contains("Reason"));
+
+ // execution failure
+ conf = new LensConf();
+ conf.addProperty(LensConfConstants.QUERY_PERSISTENT_RESULT_INDRIVER, "true");
+ conf.addProperty(HiveConf.ConfVars.COMPRESSRESULT.name(), "true");
+ conf.addProperty("mapred.compress.map.output", "true");
+ conf.addProperty("mapred.map.output.compression.codec", "nonexisting");
+ handle = launchAndWaitForQuery(conf, "select count(ID) from " + TEST_TABLE, QueryStatus.Status.FAILED);
+ messages = new ArrayList<WiserMessage>();
+ for (int i = 0; i < 20; i++) {
+ messages = wiser.getMessages();
+ if (messages.size() > 12) {
+ break;
+ }
+ Thread.sleep(10000);
+ }
+
+ Assert.assertEquals(messages.size(), 16);
+ Assert.assertTrue(messages.get(12).toString().contains(handle.toString()));
+ Assert.assertTrue(messages.get(12).toString().contains("Query execution failed!"));
+ Assert.assertTrue(messages.get(12).toString().contains("Reason"));
+
+ // successful query
+ conf = new LensConf();
+ conf.addProperty(LensConfConstants.QUERY_PERSISTENT_RESULT_SET, "true");
+ conf.addProperty(LensConfConstants.QUERY_PERSISTENT_RESULT_INDRIVER, "true");
+ handle = launchAndWaitForQuery(conf, "select ID, IDSTR from " + TEST_TABLE, QueryStatus.Status.SUCCESSFUL);
+ messages = new ArrayList<WiserMessage>();
+ for (int i = 0; i < 20; i++) {
+ messages = wiser.getMessages();
+ if (messages.size() > 16) {
+ break;
+ }
+ Thread.sleep(10000);
+ }
+
+ Assert.assertEquals(messages.size(), 20);
+ Assert.assertTrue(messages.get(16).toString().contains(handle.toString()));
+ Assert.assertTrue(messages.get(16).toString().contains("Query SUCCESSFUL"));
+ Assert.assertTrue(messages.get(16).toString().contains("Result available at"));
+
+ wiser.stop();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/36764bb7/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java
----------------------------------------------------------------------
diff --git a/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java b/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java
index 14a4eb2..e3e3d4b 100644
--- a/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java
+++ b/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java
@@ -66,8 +66,6 @@ import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
-import org.subethamail.wiser.Wiser;
-import org.subethamail.wiser.WiserMessage;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
@@ -93,9 +91,6 @@ public class TestQueryService extends LensJerseyTest {
/** The lens session id. */
LensSessionHandle lensSessionId;
- /** The wiser. */
- private Wiser wiser;
-
/*
* (non-Javadoc)
*
@@ -104,9 +99,6 @@ public class TestQueryService extends LensJerseyTest {
@BeforeTest
public void setUp() throws Exception {
super.setUp();
- wiser = new Wiser();
- wiser.setHostname("localhost");
- wiser.setPort(25000);
queryService = (QueryExecutionServiceImpl) LensServices.get().getService("query");
metricsSvc = (MetricsService) LensServices.get().getService(MetricsService.NAME);
Map<String, String> sessionconf = new HashMap<String, String>();
@@ -779,61 +771,6 @@ public class TestQueryService extends LensJerseyTest {
}
/**
- * Test notification.
- *
- * @throws IOException Signals that an I/O exception has occurred.
- * @throws InterruptedException the interrupted exception
- */
- @Test
- public void testNotification() throws IOException, InterruptedException {
- wiser.start();
- final WebTarget target = target().path("queryapi/queries");
- final FormDataMultiPart mp2 = new FormDataMultiPart();
- LensConf conf = new LensConf();
- conf.addProperty(LensConfConstants.QUERY_PERSISTENT_RESULT_INDRIVER, "false");
- conf.addProperty(LensConfConstants.QUERY_MAIL_NOTIFY, "true");
- conf.addProperty(LensConfConstants.QUERY_RESULT_EMAIL_CC, "foo1@localhost,foo2@localhost,foo3@localhost");
- mp2.bodyPart(new FormDataBodyPart(FormDataContentDisposition.name("sessionid").build(), lensSessionId,
- MediaType.APPLICATION_XML_TYPE));
- mp2.bodyPart(new FormDataBodyPart(FormDataContentDisposition.name("query").build(), "select ID, IDSTR from "
- + TEST_TABLE));
- mp2.bodyPart(new FormDataBodyPart(FormDataContentDisposition.name("operation").build(), "execute"));
- mp2.bodyPart(new FormDataBodyPart(FormDataContentDisposition.name("conf").fileName("conf").build(), conf,
- MediaType.APPLICATION_XML_TYPE));
- final QueryHandle handle = target.request().post(Entity.entity(mp2, MediaType.MULTIPART_FORM_DATA_TYPE),
- QueryHandle.class);
-
- Assert.assertNotNull(handle);
-
- LensQuery ctx = target.path(handle.toString()).queryParam("sessionid", lensSessionId).request()
- .get(LensQuery.class);
- Assert.assertTrue(ctx.getStatus().getStatus().equals(Status.QUEUED)
- || ctx.getStatus().getStatus().equals(Status.LAUNCHED) || ctx.getStatus().getStatus().equals(Status.RUNNING)
- || ctx.getStatus().getStatus().equals(Status.SUCCESSFUL));
-
- // wait till the query finishes
- QueryStatus stat = ctx.getStatus();
- while (!stat.isFinished()) {
- ctx = target.path(handle.toString()).queryParam("sessionid", lensSessionId).request().get(LensQuery.class);
- stat = ctx.getStatus();
- Thread.sleep(1000);
- }
- Assert.assertEquals(ctx.getStatus().getStatus(), QueryStatus.Status.SUCCESSFUL);
- List<WiserMessage> messages = new ArrayList<WiserMessage>();
- for (int i = 0; i < 20; i++) {
- messages = wiser.getMessages();
- if (messages.size() > 0) {
- break;
- }
- Thread.sleep(10000);
- }
-
- Assert.assertEquals(messages.size(), 4);
- Assert.assertTrue(messages.get(0).toString().contains(handle.toString()));
- wiser.stop();
- }
-
- /**
* Validate persisted result.
*
* @param handle the handle