/*
* Copyright 2012 Splunk, Inc.
*
* Licensed 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 com.splunk;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class SavedSearchTest extends SDKTestCase {
SavedSearchCollection savedSearches;
String savedSearchName;
SavedSearch savedSearch;
String query = "search index=_internal * earliest=-1m | head 3";
@Before
@Override
public void setUp() throws Exception {
super.setUp();
Service.setSslSecurityProtocol(SSLSecurityProtocol.TLSv1_1);
savedSearchName = createTemporaryName();
savedSearches = service.getSavedSearches();
savedSearch = savedSearches.create(savedSearchName, query);
savedSearches.refresh();
Assert.assertTrue(savedSearches.containsKey(savedSearchName));
}
@After
@Override
public void tearDown() throws Exception {
// Remove this run's saved search.
for (Job j : savedSearch.history()) {
j.cancel();
}
savedSearch.remove();
assertEventuallyTrue(new EventuallyTrueBehavior() {
@Override
public boolean predicate() {
savedSearches.refresh();
return !savedSearches.containsKey(savedSearchName);
}
});
// Remove any previously created saved searches that
// somehow escaped.
for (SavedSearch s : savedSearches.values()) {
if (s.getName().startsWith("delete-me")) {
for (Job j : s.history()) {
j.cancel();
}
s.remove();
}
}
super.tearDown();
}
@SuppressWarnings("deprecation")
@Test
public void testUpdate() {
boolean isVisible = savedSearch.isVisible();
savedSearch.setIsVisible(!isVisible);
savedSearch.setActionEmailAuthPassword("sdk-password");
savedSearch.setActionEmailAuthUsername("sdk-username");
savedSearch.setActionEmailBcc("sdk-bcc@splunk.com");
savedSearch.setActionEmailCc("sdk-cc@splunk.com");
savedSearch.setActionEmailCommand("$name1$");
savedSearch.setActionEmailFormat("text");
savedSearch.setActionEmailFrom("sdk@splunk.com");
savedSearch.setActionEmailHostname("dummy1.host.com");
savedSearch.setActionEmailInline(true);
savedSearch.setActionEmailMailServer("splunk.com");
savedSearch.setActionEmailMaxResults(101);
savedSearch.setActionEmailMaxTime("10s");
savedSearch.setActionEmailPdfView("dummy");
savedSearch.setActionEmailPreProcessResults("*");
savedSearch.setActionEmailReportPaperOrientation("landscape");
savedSearch.setActionEmailReportPaperSize("letter");
savedSearch.setActionEmailReportServerEnabled(false);
savedSearch.setActionEmailReportServerUrl("splunk.com");
savedSearch.setActionEmailSendPdf(false);
savedSearch.setActionEmailSendResults(false);
savedSearch.setActionEmailSubject("sdk-subject");
savedSearch.setActionEmailTo("sdk-to@splunk.com");
savedSearch.setActionEmailTrackAlert(false);
savedSearch.setActionEmailTtl("61");
savedSearch.setActionEmailUseSsl(false);
savedSearch.setActionEmailUseTls(false);
savedSearch.setActionEmailWidthSortColumns(false);
savedSearch.setActionPopulateLookupCommand("$name2$");
savedSearch.setActionPopulateLookupDest("dummypath");
savedSearch.setActionPopulateLookupHostname("dummy2.host.com");
savedSearch.setActionPopulateLookupMaxResults(102);
savedSearch.setActionPopulateLookupMaxTime("20s");
savedSearch.setActionPopulateLookupTrackAlert(false);
savedSearch.setActionPopulateLookupTtl("62");
savedSearch.setActionRssCommand("$name3$");
savedSearch.setActionRssHostname("dummy3.host.com");
savedSearch.setActionRssMaxResults(103);
savedSearch.setActionRssMaxTime("30s");
savedSearch.setActionRssTrackAlert(false);
savedSearch.setActionRssTtl("63");
savedSearch.setActionScriptFilename("foo.sh");
savedSearch.setActionScriptCommand("$name4$");
savedSearch.setActionScriptHostname("dummy4.host.com");
savedSearch.setActionScriptMaxResults(104);
savedSearch.setActionScriptMaxTime("40s");
savedSearch.setActionScriptTrackAlert(false);
savedSearch.setActionScriptTtl("64");
savedSearch.setActionSummaryIndexName("default");
savedSearch.setActionSummaryIndexCommand("$name5$");
savedSearch.setActionSummaryIndexHostname("dummy5.host.com");
savedSearch.setActionSummaryIndexInline(false);
savedSearch.setActionSummaryIndexMaxResults(105);
savedSearch.setActionSummaryIndexMaxTime("50s");
savedSearch.setActionSummaryIndexTrackAlert(false);
savedSearch.setActionSummaryIndexTtl("65");
savedSearch.setActions(
"rss,email,populate_lookup,script,summary_index");
savedSearch.setSearch("search index=boris abcd");
savedSearch.setAlertComparator("greater than");
savedSearch.setAlertCondition("*");
savedSearch.setAlertDigestMode(true); // false causes side effects
savedSearch.setAlertExpires("23h");
savedSearch.setAlertSeverity(6);
savedSearch.setAlertSuppress(true);
if (service.versionIsAtLeast("4.3")) {
savedSearch.setAlertSuppressFields("host");
}
savedSearch.setAlertSuppressPeriod("1m");
savedSearch.setAlertThreshold("50%");
savedSearch.setAlertTrack("0");
savedSearch.setAlertType("number of events");
savedSearch.setCronSchedule("*/5 * * * *");
savedSearch.setDescription("Cake!");
savedSearch.setDispatchBuckets("100");
savedSearch.setDispatchEarliestTime("-100s@s");
savedSearch.setDispatchLatestTime("-1s@s");
savedSearch.setDispatchLookups(false);
savedSearch.setDispatchMaxCount(100000);
savedSearch.setDispatchMaxTime(120);
savedSearch.setDispatchSpawnProcess(true);
savedSearch.setDispatchTimeFormat("%FT%T.%Q");
savedSearch.setDispatchTtl("3p");
savedSearch.setDisplayView("flash_timeline");
savedSearch.setMaxConcurrent(2);
savedSearch.setRealtimeSchedule(false);
savedSearch.setRequestUiDispatchApp("foo");
savedSearch.setRequestUiDispatchView("bar");
savedSearch.setRunOnStartup(true);
// TODO: Create a vsid to test this properly
savedSearch.setVsid("");
savedSearch.setDispatchReduceFrequency(11);
savedSearch.setDispatchRealTimeBackfill(true);
savedSearch.setRestartOnSearchpeerAdd(false);
savedSearch.setDisabled(true);
savedSearch.update();
savedSearch.refresh();
Assert.assertTrue(savedSearch.isActionEmail());
Assert.assertTrue(savedSearch.isActionPopulateLookup());
Assert.assertTrue(savedSearch.isActionRss());
Assert.assertTrue(savedSearch.isActionScript());
Assert.assertTrue(savedSearch.isActionSummaryIndex());
Assert.assertTrue(savedSearch.isDigestMode());
Assert.assertEquals("sdk-password", savedSearch.getActionEmailAuthPassword());
Assert.assertEquals("sdk-username", savedSearch.getActionEmailAuthUsername());
Assert.assertEquals("sdk-bcc@splunk.com", savedSearch.getActionEmailBcc());
Assert.assertEquals("sdk-cc@splunk.com", savedSearch.getActionEmailCc());
Assert.assertEquals("$name1$", savedSearch.getActionEmailCommand());
Assert.assertEquals("text", savedSearch.getActionEmailFormat());
Assert.assertEquals("sdk@splunk.com", savedSearch.getActionEmailFrom());
Assert.assertEquals("dummy1.host.com", savedSearch.getActionEmailHostname());
Assert.assertTrue(savedSearch.getActionEmailInline());
Assert.assertEquals("splunk.com", savedSearch.getActionEmailMailServer());
Assert.assertEquals(101, savedSearch.getActionEmailMaxResults());
Assert.assertEquals("10s", savedSearch.getActionEmailMaxTime());
Assert.assertEquals("dummy", savedSearch.getActionEmailPdfView());
Assert.assertEquals("*", savedSearch.getActionEmailPreProcessResults());
Assert.assertEquals("landscape", savedSearch.getActionEmailReportPaperOrientation());
Assert.assertEquals("letter", savedSearch.getActionEmailReportPaperSize());
Assert.assertFalse(savedSearch.getActionEmailReportServerEnabled());
Assert.assertEquals("splunk.com", savedSearch.getActionEmailReportServerUrl());
Assert.assertFalse(savedSearch.getActionEmailSendPdf());
Assert.assertFalse(savedSearch.getActionEmailSendResults());
Assert.assertEquals("sdk-subject", savedSearch.getActionEmailSubject());
Assert.assertEquals("sdk-to@splunk.com", savedSearch.getActionEmailTo());
Assert.assertFalse(savedSearch.getActionEmailTrackAlert());
Assert.assertEquals("61", savedSearch.getActionEmailTtl());
Assert.assertFalse(savedSearch.getActionEmailUseSsl());
Assert.assertFalse(savedSearch.getActionEmailUseTls());
Assert.assertFalse(savedSearch.getActionEmailWidthSortColumns());
Assert.assertEquals("$name2$", savedSearch.getActionPopulateLookupCommand());
Assert.assertEquals("dummypath", savedSearch.getActionPopulateLookupDest());
Assert.assertEquals("dummy2.host.com", savedSearch.getActionPopulateLookupHostname());
Assert.assertEquals(102, savedSearch.getActionPopulateLookupMaxResults());
Assert.assertEquals("20s", savedSearch.getActionPopulateLookupMaxTime());
Assert.assertFalse(savedSearch.getActionPopulateLookupTrackAlert());
Assert.assertEquals("62", savedSearch.getActionPopulateLookupTtl());
Assert.assertEquals("$name3$", savedSearch.getActionRssCommand());
Assert.assertEquals("dummy3.host.com", savedSearch.getActionRssHostname());
Assert.assertEquals(103, savedSearch.getActionRssMaxResults());
Assert.assertEquals("30s", savedSearch.getActionRssMaxTime());
Assert.assertFalse(savedSearch.getActionRssTrackAlert());
Assert.assertEquals("63", savedSearch.getActionRssTtl());
Assert.assertEquals("foo.sh", savedSearch.getActionScriptFilename());
Assert.assertEquals("$name4$", savedSearch.getActionScriptCommand());
Assert.assertEquals("dummy4.host.com", savedSearch.getActionScriptHostname());
Assert.assertEquals(104, savedSearch.getActionScriptMaxResults());
Assert.assertEquals("40s", savedSearch.getActionScriptMaxTime());
Assert.assertFalse(savedSearch.getActionScriptTrackAlert());
Assert.assertEquals("64", savedSearch.getActionScriptTtl());
Assert.assertEquals("default", savedSearch.getActionSummaryIndexName());
Assert.assertEquals("$name5$", savedSearch.getActionSummaryIndexCommand());
Assert.assertEquals("dummy5.host.com", savedSearch.getActionSummaryIndexHostname());
Assert.assertFalse(savedSearch.getActionSummaryIndexInline());
Assert.assertEquals(105, savedSearch.getActionSummaryIndexMaxResults());
Assert.assertEquals("50s", savedSearch.getActionSummaryIndexMaxTime());
Assert.assertFalse(savedSearch.getActionSummaryIndexTrackAlert());
Assert.assertEquals("65", savedSearch.getActionSummaryIndexTtl());
Assert.assertEquals(savedSearch.isVisible(), !isVisible);
boolean isPre620 = service.versionIsEarlierThan("6.2.0");
try {
Assert.assertEquals(savedSearch.isEmbedEnabled(), false);
Assert.assertNull(savedSearch.getEmbedToken());
if (isPre620)
Assert.fail("Expected UnsupportedOperationException");
} catch(UnsupportedOperationException uoe) {
if (!isPre620)
Assert.fail("Unexpected UnsupportedOperationException");
else
Assert.assertNotNull(uoe);
}
Assert.assertNull(savedSearch.getNextScheduledTime());
if (service.versionIsEarlierThan("4.3")) {
Assert.assertEquals("search search index=boris abcd", savedSearch.getQualifiedSearch());
} else {
Assert.assertEquals("search search index=boris abcd", savedSearch.getQualifiedSearch());
}
Assert.assertEquals("greater than", savedSearch.getAlertComparator());
Assert.assertEquals("*", savedSearch.getAlertCondition());
Assert.assertEquals(true, savedSearch.getAlertDigestMode());
Assert.assertEquals("23h", savedSearch.getAlertExpires());
Assert.assertEquals(6, savedSearch.getAlertSeverity());
Assert.assertEquals(true, savedSearch.getAlertSuppress());
if (service.versionIsAtLeast("4.3")) {
Assert.assertEquals("host", savedSearch.getAlertSuppressFields());
}
Assert.assertEquals("1m", savedSearch.getAlertSuppressPeriod());
Assert.assertEquals("50%", savedSearch.getAlertThreshold());
// NOTE: Always returns "0" or "1". Never "auto". Vince notified.
Assert.assertEquals("0", savedSearch.getAlertTrack());
Assert.assertEquals("number of events", savedSearch.getAlertType());
Assert.assertEquals("*/5 * * * *", savedSearch.getCronSchedule());
Assert.assertEquals("Cake!", savedSearch.getDescription());
Assert.assertEquals(100, savedSearch.getDispatchBuckets());
Assert.assertEquals("-100s@s", savedSearch.getDispatchEarliestTime());
Assert.assertEquals("-1s@s", savedSearch.getDispatchLatestTime());
Assert.assertEquals(false, savedSearch.getDispatchLookups());
Assert.assertEquals(100000, savedSearch.getDispatchMaxCount());
// NOTE: Should be int to match setter. See DVPL-1268.
Assert.assertEquals(120, savedSearch.getDispatchMaxTime());
Assert.assertEquals(true, savedSearch.getDispatchSpawnProcess());
Assert.assertEquals("%FT%T.%Q", savedSearch.getDispatchTimeFormat());
Assert.assertEquals("3p", savedSearch.getDispatchTtl());
Assert.assertEquals("flash_timeline", savedSearch.getDisplayView());
Assert.assertEquals(2, savedSearch.getMaxConcurrent());
Assert.assertEquals(false, savedSearch.getRealtimeSchedule());
Assert.assertEquals("foo", savedSearch.getRequestUiDispatchApp());
Assert.assertEquals("bar", savedSearch.getRequestUiDispatchView());
Assert.assertEquals(true, savedSearch.getRunOnStartup());
Assert.assertEquals(null, savedSearch.getVsid());
Assert.assertEquals(11, savedSearch.getDispatchReduceFrequency());
Assert.assertEquals(true, savedSearch.getDispatchRtBackfill());
Assert.assertEquals(false, savedSearch.getRestartOnSearchPeerAdd());
Assert.assertEquals(true, savedSearch.isDisabled());
}
@Test
public void testScheduled() {
SavedSearch savedSearch = this.savedSearches.create(createTemporaryName(), "search index=_internal | head 1");
Assert.assertFalse(savedSearch.isScheduled());
savedSearch.setCronSchedule("*/5 * * * *");
savedSearch.setIsScheduled(true);
savedSearch.update();
Assert.assertTrue(savedSearch.isScheduled());
savedSearch.remove();
}
@Test
public void testCreateWithNoSearch() {
try {
this.savedSearches.create(createTemporaryName());
Assert.fail("Should've thrown!");
} catch (Exception e) {
Assert.assertTrue(true);
}
}
@Test
public void testAcknowledge() {
savedSearch.acknowledge();
}
@Test
public void testUpdateWithBogusKeysFails() {
try {
Args args = new Args("borisTheMadBaboon", "Arrgh!");
savedSearch.update(args);
Assert.fail("Expected an exception.");
} catch (Exception e) {}
}
@Test
public void testCannotUpdateName() {
String newName = savedSearchName + "-alteration";
try {
Args args = new Args("name", newName);
savedSearch.update(args);
savedSearch.refresh();
Assert.fail("Expected exception to be raised when trying to update name.");
} catch (Exception e) {}
}
@Test
public void testDispatch() {
final JobCollection jobs = service.getJobs();
SavedSearchDispatchArgs args = new SavedSearchDispatchArgs();
args.setDispatchBuckets(100);
try {
final Job job = savedSearch.dispatch(args);
assertEventuallyTrue(new EventuallyTrueBehavior() {
@Override
public boolean predicate() {
return job.isReady();
}
});
Assert.assertTrue(jobs.containsKey(job.getSid()));
} catch (InterruptedException e) {
Assert.fail(e.toString());
}
}
@Test
public void testDispatchWithoutOptions() {
final JobCollection jobs = service.getJobs();
try {
final Job job = savedSearch.dispatch();
assertEventuallyTrue(new EventuallyTrueBehavior() {
@Override
public boolean predicate() {
return job.isReady();
}
});
Assert.assertTrue(jobs.containsKey(job.getSid()));
} catch (InterruptedException e) {
Assert.fail(e.toString());
}
}
@Test
public void testHistory() {
savedSearch.refresh();
Job[] oldJobs = savedSearch.history();
try {
final Job job = savedSearch.dispatch();
assertEventuallyTrue(new EventuallyTrueBehavior() {
@Override
public boolean predicate() {
return job.isReady();
}
});
Assert.assertEquals(oldJobs.length + 1, savedSearch.history().length);
boolean isFound = false;
for (Job j : savedSearch.history()) {
if (j.getSid().equals(job.getSid())) {
isFound = true;
}
}
Assert.assertTrue(isFound);
} catch (InterruptedException e) {
Assert.fail(e.toString());
}
}
}