Repository navigation
Expand file tree
/
Copy pathtest_examples.py
More file actions
executable file
·347 lines (288 loc) · 11.7 KB
/
Copy pathtest_examples.py
File metadata and controls
executable file
·347 lines (288 loc) · 11.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
#!/usr/bin/env python
#
# Copyright 2011-2015 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.
from __future__ import absolute_import
import os
from subprocess import PIPE, Popen
import time
import sys
import io
try:
import unittest
except ImportError:
import unittest2 as unittest
import pytest
from tests import testlib
import splunklib.client as client
from splunklib import six
DIR_PATH = os.path.dirname(os.path.realpath(__file__))
EXAMPLES_PATH = os.path.join(DIR_PATH, '..', 'examples')
BUILD_PATH = os.path.join(DIR_PATH, '..', 'build')
def check_multiline(testcase, first, second, message=None):
"""Assert that two multi-line strings are equal."""
testcase.assertTrue(isinstance(first, six.string_types),
'First argument is not a string')
testcase.assertTrue(isinstance(second, six.string_types),
'Second argument is not a string')
# Unix-ize Windows EOL
first = first.replace("\r", "")
second = second.replace("\r", "")
if first != second:
testcase.fail("Multiline strings are not equal: %s" % message)
# Run the given python script and return its exit code.
def run(script, stdin=None, stdout=PIPE, stderr=None):
process = start(script, stdin, stdout, stderr)
process.communicate()
return process.wait()
# Start the given python script and return the corresponding process object.
# The script can be specified as either a string or arg vector. In either case
# it will be prefixed to invoke python explicitly.
def start(script, stdin=None, stdout=PIPE, stderr=None):
if isinstance(script, str):
script = script.split()
script = ["python"] + script
return Popen(script, stdin=stdin, stdout=stdout, stderr=stderr, cwd=EXAMPLES_PATH)
# Rudimentary sanity check for each of the examples
class ExamplesTestCase(testlib.SDKTestCase):
def check_commands(self, *args):
for arg in args:
result = run(arg)
self.assertEqual(result, 0, '"{0}" run failed with result code {1}'.format(arg, result))
self.service.login() # Because a Splunk restart invalidates our session
def setUp(self):
super(ExamplesTestCase, self).setUp()
# Ignore result, it might already exist
run("index.py create sdk-tests")
@pytest.mark.skipif(six.PY3, reason="Async needs work to support Python 3")
def test_async(self):
result = run("async/async.py sync")
self.assertEqual(result, 0)
try:
# Only try running the async version of the test if eventlet
# is present on the system
import eventlet
result = run("async/async.py async")
self.assertEqual(result, 0)
except:
pass
def test_build_dir_exists(self):
self.assertTrue(os.path.exists(BUILD_PATH), 'Run setup.py build, then setup.py dist')
def test_binding1(self):
result = run("binding1.py")
self.assertEqual(result, 0)
def test_conf(self):
try:
conf = self.service.confs['server']
if 'SDK-STANZA' in conf:
conf.delete("SDK-STANZA")
except Exception as e:
pass
try:
self.check_commands(
"conf.py --help",
"conf.py",
"conf.py viewstates",
'conf.py --app=search --owner=admin viewstates',
"conf.py create server SDK-STANZA",
"conf.py create server SDK-STANZA testkey=testvalue",
"conf.py delete server SDK-STANZA")
finally:
conf = self.service.confs['server']
if 'SDK-STANZA' in conf:
conf.delete('SDK-STANZA')
def test_event_types(self):
self.check_commands(
"event_types.py --help",
"event_types.py")
def test_fired_alerts(self):
self.check_commands(
"fired_alerts.py --help",
"fired_alerts.py")
def test_follow(self):
self.check_commands("follow.py --help")
def test_handlers(self):
self.check_commands(
"handlers/handler_urllib2.py",
"handlers/handler_debug.py",
"handlers/handler_certs.py",
"handlers/handler_certs.py --ca_file=handlers/cacert.pem",
"handlers/handler_proxy.py --help")
# Run the cert handler example with a bad cert file, should error.
result = run(
"handlers/handlers_certs.py --ca_file=handlers/cacert.bad.pem",
stderr=PIPE)
self.assertNotEquals(result, 0)
# The proxy handler example requires that there be a proxy available
# to relay requests, so we spin up a local proxy using the proxy
# script included with the sample.
# Assumes that tiny-proxy.py is in the same directory as the sample
#This test seems to be flaky
# if six.PY2: # Needs to be fixed PY3
# process = start("handlers/tiny-proxy.py -p 8080", stderr=PIPE)
# try:
# time.sleep(5) # Wait for proxy to finish initializing
# result = run("handlers/handler_proxy.py --proxy=localhost:8080")
# self.assertEqual(result, 0)
# finally:
# process.kill()
# Run it again without the proxy and it should fail.
result = run(
"handlers/handler_proxy.py --proxy=localhost:80801", stderr=PIPE)
self.assertNotEquals(result, 0)
def test_index(self):
self.check_commands(
"index.py --help",
"index.py",
"index.py list",
"index.py list sdk-tests",
"index.py disable sdk-tests",
"index.py enable sdk-tests",
"index.py clean sdk-tests")
return
def test_info(self):
self.check_commands(
"info.py --help",
"info.py")
def test_inputs(self):
self.check_commands(
"inputs.py --help",
"inputs.py")
def test_job(self):
self.check_commands(
"job.py --help",
"job.py",
"job.py list",
"job.py list @0")
def test_kvstore(self):
self.check_commands(
"kvstore.py --help",
"kvstore.py")
def test_loggers(self):
self.check_commands(
"loggers.py --help",
"loggers.py")
def test_oneshot(self):
self.check_commands(["oneshot.py", "search * | head 10"])
def test_saved_searches(self):
self.check_commands(
"saved_searches.py --help",
"saved_searches.py")
def test_saved_search(self):
temp_name = testlib.tmpname()
self.check_commands(
"saved_search/saved_search.py",
["saved_search/saved_search.py", "--help"],
["saved_search/saved_search.py", "list-all"],
["saved_search/saved_search.py", "--operation", "create", "--name", temp_name, "--search", "search * | head 5"],
["saved_search/saved_search.py", "list", "--name", temp_name],
["saved_search/saved_search.py", "list", "--operation", "delete", "--name", temp_name],
["saved_search/saved_search.py", "list", "--name", "Errors in the last 24 hours"]
)
def test_search(self):
self.check_commands(
"search.py --help",
["search.py", "search * | head 10"],
["search.py",
"search * | head 10 | stats count", '--output_mode=csv'])
def test_spcmd(self):
self.check_commands(
"spcmd.py --help",
"spcmd.py -e\"get('authentication/users')\"")
def test_spurl(self):
self.check_commands(
"spurl.py --help",
"spurl.py",
"spurl.py /services",
"spurl.py apps/local")
def test_submit(self):
self.check_commands("submit.py --help")
def test_upload(self):
# Note: test must run on machine where splunkd runs,
# or a failure is expected
if "SPLUNK_HOME" not in os.environ:
self.skipTest("SPLUNK_HOME is not set, skipping")
file_to_upload = os.path.expandvars(os.environ.get("INPUT_EXAMPLE_UPLOAD", "./upload.py"))
self.check_commands(
"upload.py --help",
"upload.py --index=sdk-tests %s" % file_to_upload)
# The following tests are for the Analytics example
def test_analytics(self):
# We have to add the current path to the PYTHONPATH,
# otherwise the import doesn't work quite right
sys.path.append(EXAMPLES_PATH)
import analytics
# Create a tracker
tracker = analytics.input.AnalyticsTracker(
"sdk-test", self.opts.kwargs, index = "sdk-test")
service = client.connect(**self.opts.kwargs)
# Before we start, we'll clean the index
index = service.indexes["sdk-test"]
index.clean()
tracker.track("test_event", distinct_id="abc123", foo="bar", abc="123")
tracker.track("test_event", distinct_id="123abc", abc="12345")
# Wait until the events get indexed
self.assertEventuallyTrue(lambda: index.refresh()['totalEventCount'] == '2', timeout=200)
# Now, we create a retriever to retrieve the events
retriever = analytics.output.AnalyticsRetriever(
"sdk-test", self.opts.kwargs, index = "sdk-test")
# Assert applications
applications = retriever.applications()
self.assertEqual(len(applications), 1)
self.assertEqual(applications[0]["name"], "sdk-test")
self.assertEqual(applications[0]["count"], 2)
# Assert events
events = retriever.events()
self.assertEqual(len(events), 1)
self.assertEqual(events[0]["name"], "test_event")
self.assertEqual(events[0]["count"], 2)
# Assert properties
expected_properties = {
"abc": 2,
"foo": 1
}
properties = retriever.properties("test_event")
self.assertEqual(len(properties), len(expected_properties))
for prop in properties:
name = prop["name"]
count = prop["count"]
self.assertTrue(name in list(expected_properties.keys()))
self.assertEqual(count, expected_properties[name])
# Assert property values
expected_property_values = {
"123": 1,
"12345": 1
}
values = retriever.property_values("test_event", "abc")
self.assertEqual(len(values), len(expected_property_values))
for value in values:
name = value["name"]
count = value["count"]
self.assertTrue(name in list(expected_property_values.keys()))
self.assertEqual(count, expected_property_values[name])
# Assert event over time
over_time = retriever.events_over_time(
time_range = analytics.output.TimeRange.MONTH)
self.assertEqual(len(over_time), 1)
self.assertEqual(len(over_time["test_event"]), 1)
self.assertEqual(over_time["test_event"][0]["count"], 2)
# Now that we're done, we'll clean the index
index.clean()
if __name__ == "__main__":
os.chdir("../examples")
try:
import unittest2 as unittest
except ImportError:
import unittest
unittest.main()