From 22640b9a81d57135403642b0df05854d29bcb9fe Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Fri, 16 Jul 2021 12:24:01 +0530 Subject: [PATCH 1/7] Initial commit to support for node@8.17.0 --- .../data_model_expected_calculations.json | 90 + .../data/data_model_expected_constraints.json | 6 + .../data/data_model_expected_fields.json | 194 ++ tests_spike/data/data_model_for_pivot.json | 336 ++++ .../data/data_model_with_test_objects.json | 258 +++ tests_spike/data/empty_data_model.json | 5 + tests_spike/data/inheritance_test_data.json | 375 ++++ .../data/model_with_empty_headers.json | 5 + .../data/model_with_multiple_types.json | 604 +++++++ .../data/model_with_unicode_headers.json | 5 + tests_spike/data/object_with_one_search.json | 14 + .../data/object_with_two_searches.json | 22 + .../data/argument_with_defaults.xml | 5 + .../data/argument_without_defaults.xml | 7 + .../modularinputs/data/conf_with_0_inputs.xml | 8 + .../modularinputs/data/conf_with_2_inputs.xml | 29 + .../modularinputs/data/conf_with_5_inputs.xml | 55 + .../data/conf_with_invalid_inputs.xml | 15 + .../modularinputs/data/event_maximal.xml | 9 + .../modularinputs/data/event_minimal.xml | 5 + .../data/scheme_with_defaults.xml | 11 + .../data/scheme_without_defaults.xml | 24 + .../data/stream_with_five_events.xml | 47 + .../data/stream_with_one_event.xml | 11 + .../data/stream_with_two_events.xml | 20 + .../data/stream_with_two_json_events.xml | 20 + tests_spike/modularinputs/data/validation.xml | 22 + .../modularinputs/data/validation_error.xml | 1 + tests_spike/modularinputs/index.js | 27 + tests_spike/modularinputs/test_event.js | 355 ++++ .../modularinputs/test_input_definition.js | 132 ++ .../modularinputs/test_modularinput.js | 728 ++++++++ tests_spike/modularinputs/test_scheme.js | 151 ++ .../test_validation_definition.js | 90 + tests_spike/modularinputs/utils.js | 147 ++ tests_spike/service_tests/app.js | 209 +++ tests_spike/service_tests/collection.js | 100 ++ tests_spike/service_tests/configuration.js | 243 +++ tests_spike/service_tests/datamodels.js | 1107 ++++++++++++ tests_spike/service_tests/endpoint.js | 69 + tests_spike/service_tests/entity.js | 153 ++ tests_spike/service_tests/firedalerts.js | 308 ++++ tests_spike/service_tests/indexes.js | 472 +++++ tests_spike/service_tests/job.js | 1023 +++++++++++ tests_spike/service_tests/namespace.js | 285 +++ tests_spike/service_tests/parser.js | 62 + tests_spike/service_tests/pivot.js | 1589 +++++++++++++++++ tests_spike/service_tests/properties.js | 161 ++ tests_spike/service_tests/savedsearch.js | 458 +++++ tests_spike/service_tests/serverinfo.js | 56 + tests_spike/service_tests/storagepasswords.js | 645 +++++++ tests_spike/service_tests/typeahead.js | 80 + tests_spike/service_tests/user.js | 290 +++ tests_spike/service_tests/view.js | 96 + tests_spike/test_async.js | 537 ++++++ tests_spike/test_context.js | 1106 ++++++++++++ tests_spike/test_examples.js | 506 ++++++ tests_spike/test_http.js | 314 ++++ tests_spike/test_log.js | 94 + tests_spike/test_service.js | 83 + tests_spike/test_utils.js | 268 +++ tests_spike/tests.browser.html | 204 +++ tests_spike/tests.js | 86 + tests_spike/utils.js | 53 + 64 files changed, 14490 insertions(+) create mode 100644 tests_spike/data/data_model_expected_calculations.json create mode 100644 tests_spike/data/data_model_expected_constraints.json create mode 100644 tests_spike/data/data_model_expected_fields.json create mode 100644 tests_spike/data/data_model_for_pivot.json create mode 100644 tests_spike/data/data_model_with_test_objects.json create mode 100644 tests_spike/data/empty_data_model.json create mode 100644 tests_spike/data/inheritance_test_data.json create mode 100644 tests_spike/data/model_with_empty_headers.json create mode 100644 tests_spike/data/model_with_multiple_types.json create mode 100644 tests_spike/data/model_with_unicode_headers.json create mode 100644 tests_spike/data/object_with_one_search.json create mode 100644 tests_spike/data/object_with_two_searches.json create mode 100644 tests_spike/modularinputs/data/argument_with_defaults.xml create mode 100644 tests_spike/modularinputs/data/argument_without_defaults.xml create mode 100644 tests_spike/modularinputs/data/conf_with_0_inputs.xml create mode 100644 tests_spike/modularinputs/data/conf_with_2_inputs.xml create mode 100644 tests_spike/modularinputs/data/conf_with_5_inputs.xml create mode 100644 tests_spike/modularinputs/data/conf_with_invalid_inputs.xml create mode 100644 tests_spike/modularinputs/data/event_maximal.xml create mode 100644 tests_spike/modularinputs/data/event_minimal.xml create mode 100644 tests_spike/modularinputs/data/scheme_with_defaults.xml create mode 100644 tests_spike/modularinputs/data/scheme_without_defaults.xml create mode 100644 tests_spike/modularinputs/data/stream_with_five_events.xml create mode 100644 tests_spike/modularinputs/data/stream_with_one_event.xml create mode 100644 tests_spike/modularinputs/data/stream_with_two_events.xml create mode 100644 tests_spike/modularinputs/data/stream_with_two_json_events.xml create mode 100644 tests_spike/modularinputs/data/validation.xml create mode 100644 tests_spike/modularinputs/data/validation_error.xml create mode 100644 tests_spike/modularinputs/index.js create mode 100644 tests_spike/modularinputs/test_event.js create mode 100644 tests_spike/modularinputs/test_input_definition.js create mode 100644 tests_spike/modularinputs/test_modularinput.js create mode 100644 tests_spike/modularinputs/test_scheme.js create mode 100644 tests_spike/modularinputs/test_validation_definition.js create mode 100644 tests_spike/modularinputs/utils.js create mode 100644 tests_spike/service_tests/app.js create mode 100644 tests_spike/service_tests/collection.js create mode 100644 tests_spike/service_tests/configuration.js create mode 100644 tests_spike/service_tests/datamodels.js create mode 100644 tests_spike/service_tests/endpoint.js create mode 100644 tests_spike/service_tests/entity.js create mode 100644 tests_spike/service_tests/firedalerts.js create mode 100644 tests_spike/service_tests/indexes.js create mode 100644 tests_spike/service_tests/job.js create mode 100644 tests_spike/service_tests/namespace.js create mode 100644 tests_spike/service_tests/parser.js create mode 100644 tests_spike/service_tests/pivot.js create mode 100644 tests_spike/service_tests/properties.js create mode 100644 tests_spike/service_tests/savedsearch.js create mode 100644 tests_spike/service_tests/serverinfo.js create mode 100644 tests_spike/service_tests/storagepasswords.js create mode 100644 tests_spike/service_tests/typeahead.js create mode 100644 tests_spike/service_tests/user.js create mode 100644 tests_spike/service_tests/view.js create mode 100644 tests_spike/test_async.js create mode 100644 tests_spike/test_context.js create mode 100644 tests_spike/test_examples.js create mode 100644 tests_spike/test_http.js create mode 100644 tests_spike/test_log.js create mode 100644 tests_spike/test_service.js create mode 100644 tests_spike/test_utils.js create mode 100644 tests_spike/tests.browser.html create mode 100644 tests_spike/tests.js create mode 100644 tests_spike/utils.js diff --git a/tests_spike/data/data_model_expected_calculations.json b/tests_spike/data/data_model_expected_calculations.json new file mode 100644 index 000000000..9b94b7c3e --- /dev/null +++ b/tests_spike/data/data_model_expected_calculations.json @@ -0,0 +1,90 @@ +[ + { + "outputFields": [ + { + "fieldName": "is_realtime", + "owner": "Audit.searches", + "type": "boolean", + "required": false, + "multivalue": false, + "hidden": false, + "editable": true, + "displayName": "Realtime?", + "comment": "", + "fieldSearch": "" + } + ], + "calculationID": "42on2o5518vbzkt9", + "owner": "Audit.searches", + "editable": true, + "comment": "", + "calculationType": "Eval", + "expression": "case(is_realtime == 0, \"false\", is_realtime == 1, \"true\", is_realtime == \"N/A\", \"false\")" + }, + { + "outputFields": [ + { + "fieldName": "search_id", + "owner": "Audit.searches", + "type": "string", + "required": false, + "multivalue": false, + "hidden": false, + "editable": true, + "displayName": "search_id", + "comment": "", + "fieldSearch": "" + } + ], + "calculationID": "i69cygcgck5wxw29", + "owner": "Audit.searches", + "editable": true, + "comment": "", + "calculationType": "Eval", + "expression": "replace(search_id,\"'\",\"\")" + }, + { + "outputFields": [ + { + "fieldName": "search", + "owner": "Audit.searches", + "type": "string", + "required": false, + "multivalue": false, + "hidden": false, + "editable": true, + "displayName": "search", + "comment": "", + "fieldSearch": "" + } + ], + "calculationID": "8q76efc4bulerk9", + "owner": "Audit.searches", + "editable": true, + "comment": "", + "calculationType": "Eval", + "expression": "replace(search,\"'\",\"\")" + }, + { + "outputFields": [ + { + "fieldName": "search_type", + "owner": "Audit.searches", + "type": "string", + "required": false, + "multivalue": false, + "hidden": false, + "editable": true, + "displayName": "search type", + "comment": "", + "fieldSearch": "" + } + ], + "calculationID": "lnnoqwo7qi8p8pvi", + "owner": "Audit.searches", + "editable": true, + "comment": "", + "calculationType": "Eval", + "expression": "case((id LIKE \"DM_%\" OR savedsearch_name LIKE \"_ACCELERATE_DM%\"), \"dm_acceleration\", search_id LIKE \"scheduler%\", \"scheduled\", search_id LIKE \"rt%\", \"realtime\", search_id LIKE \"subsearch%\", \"subsearch\", (search_id LIKE \"SummaryDirector%\" OR search_id LIKE \"summarize_SummaryDirector%\"), \"summary_director\", 1=1, \"adhoc\") " + } +] \ No newline at end of file diff --git a/tests_spike/data/data_model_expected_constraints.json b/tests_spike/data/data_model_expected_constraints.json new file mode 100644 index 000000000..22976d4c4 --- /dev/null +++ b/tests_spike/data/data_model_expected_constraints.json @@ -0,0 +1,6 @@ +[ + { + "search": "index=_audit", + "owner": "Audit" + } +] \ No newline at end of file diff --git a/tests_spike/data/data_model_expected_fields.json b/tests_spike/data/data_model_expected_fields.json new file mode 100644 index 000000000..41d39675d --- /dev/null +++ b/tests_spike/data/data_model_expected_fields.json @@ -0,0 +1,194 @@ +[ + { + "fieldName": "action", + "owner": "Audit", + "type": "string", + "required": false, + "multivalue": false, + "hidden": false, + "editable": true, + "displayName": "action", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "info", + "owner": "Audit", + "type": "string", + "required": false, + "multivalue": false, + "hidden": false, + "editable": true, + "displayName": "info", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "object", + "owner": "Audit", + "type": "string", + "required": false, + "multivalue": false, + "hidden": true, + "editable": true, + "displayName": "object", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "operation", + "owner": "Audit", + "type": "string", + "required": false, + "multivalue": false, + "hidden": true, + "editable": true, + "displayName": "operation", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "path", + "owner": "Audit", + "type": "string", + "required": false, + "multivalue": false, + "hidden": true, + "editable": true, + "displayName": "path", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "user", + "owner": "Audit", + "type": "string", + "required": false, + "multivalue": false, + "hidden": false, + "editable": true, + "displayName": "user", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "exec_time", + "owner": "Audit", + "type": "number", + "required": false, + "multivalue": false, + "hidden": true, + "editable": true, + "displayName": "execution time", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "result_count", + "owner": "Audit", + "type": "number", + "required": false, + "multivalue": false, + "hidden": true, + "editable": true, + "displayName": "result count", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "savedsearch_name", + "owner": "Audit", + "type": "string", + "required": false, + "multivalue": false, + "hidden": true, + "editable": true, + "displayName": "savedsearch name", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "scan_count", + "owner": "Audit", + "type": "number", + "required": false, + "multivalue": false, + "hidden": true, + "editable": true, + "displayName": "scan count", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "total_run_time", + "owner": "Audit", + "type": "number", + "required": false, + "multivalue": false, + "hidden": true, + "editable": true, + "displayName": "total run time", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "_time", + "owner": "BaseEvent", + "type": "timestamp", + "required": false, + "multivalue": false, + "hidden": false, + "editable": false, + "displayName": "_time", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "host", + "owner": "BaseEvent", + "type": "string", + "required": false, + "multivalue": false, + "hidden": false, + "editable": false, + "displayName": "host", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "source", + "owner": "BaseEvent", + "type": "string", + "required": false, + "multivalue": false, + "hidden": false, + "editable": false, + "displayName": "source", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "sourcetype", + "owner": "BaseEvent", + "type": "string", + "required": false, + "multivalue": false, + "hidden": false, + "editable": false, + "displayName": "sourcetype", + "comment": "", + "fieldSearch": "" + }, + { + "fieldName": "Audit", + "owner": "Audit", + "type": "objectCount", + "required": false, + "multivalue": false, + "hidden": false, + "editable": false, + "displayName": "Audit", + "comment": "", + "fieldSearch": "" + } +] \ No newline at end of file diff --git a/tests_spike/data/data_model_for_pivot.json b/tests_spike/data/data_model_for_pivot.json new file mode 100644 index 000000000..c4c84d168 --- /dev/null +++ b/tests_spike/data/data_model_for_pivot.json @@ -0,0 +1,336 @@ +{ + "displayName":"pivot test data", + "description":"", + "modelName":"pivot_test_data", + "objectSummary":{ + "Transaction-Based":0, + "Interfaces":0, + "Interface Implementations":0, + "Search-Based":0, + "Event-Based":2 + }, + "objects":[ + { + "fields":[ + { + "editable":false, + "fieldSearch":"", + "fieldName":"_time", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"BaseEvent", + "comment":"", + "type":"timestamp", + "displayName":"_time" + }, + { + "editable":false, + "fieldSearch":"", + "fieldName":"host", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"BaseEvent", + "comment":"", + "type":"string", + "displayName":"host" + }, + { + "editable":false, + "fieldSearch":"", + "fieldName":"source", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"BaseEvent", + "comment":"", + "type":"string", + "displayName":"source" + }, + { + "editable":false, + "fieldSearch":"", + "fieldName":"sourcetype", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"BaseEvent", + "comment":"", + "type":"string", + "displayName":"sourcetype" + }, + { + "editable":false, + "fieldSearch":"", + "fieldName":"test_data", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"test_data", + "comment":"", + "type":"objectCount", + "displayName":"test data" + } + ], + "objectSearchNoFields":"| rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\", \"is_child\" AS \"test_data.is_child\", \"is_not_child\" AS \"test_data.is_not_child\" | rename \"test_data.has_boris\" AS \"has_boris\", \"test_data.hostip\" AS \"hostip\", \"test_data.epsilon\" AS \"epsilon\", \"test_data.is_child\" AS \"is_child\", \"test_data.is_not_child\" AS \"is_not_child\" | eval \"has_boris\"=if(boris != null, \"true\", \"false\") | eval \"hostip\"=\"129.0.0.1\" | eval \"epsilon\"=25 | eval \"is_child\"=if(searchmatch(\"\"),1,0) | eval \"is_not_child\"=if(searchmatch(\"NOT( )\"),1,0) | rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\", \"is_child\" AS \"test_data.is_child\", \"is_not_child\" AS \"test_data.is_not_child\"", + "constraints":[ + + ], + "displayName":"test data", + "previewSearch":" | eval \"has_boris\"=if(boris != null, \"true\", \"false\") | eval \"hostip\"=\"129.0.0.1\" | eval \"epsilon\"=25", + "objectSearch":"| rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\", \"is_child\" AS \"test_data.is_child\", \"is_not_child\" AS \"test_data.is_not_child\" | rename \"test_data.has_boris\" AS \"has_boris\", \"test_data.hostip\" AS \"hostip\", \"test_data.epsilon\" AS \"epsilon\", \"test_data.is_child\" AS \"is_child\", \"test_data.is_not_child\" AS \"is_not_child\" | eval \"has_boris\"=if(boris != null, \"true\", \"false\") | eval \"hostip\"=\"129.0.0.1\" | eval \"epsilon\"=25 | eval \"is_child\"=if(searchmatch(\"\"),1,0) | eval \"is_not_child\"=if(searchmatch(\"NOT( )\"),1,0) | rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\", \"is_child\" AS \"test_data.is_child\", \"is_not_child\" AS \"test_data.is_not_child\" | fields \"_time\", \"host\", \"source\", \"sourcetype\", \"test_data.has_boris\", \"test_data.hostip\", \"test_data.epsilon\", \"test_data.is_child\", \"test_data.is_not_child\"", + "objectName":"test_data", + "calculations":[ + { + "editable":true, + "outputFields":[ + { + "editable":true, + "fieldSearch":"", + "fieldName":"has_boris", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"test_data", + "comment":"", + "type":"boolean", + "displayName":"has_boris" + } + ], + "owner":"test_data", + "comment":"", + "calculationID":"2f8rvff3gsm", + "expression":"if(boris != null, \"true\", \"false\")", + "calculationType":"Eval" + }, + { + "editable":true, + "outputFields":[ + { + "editable":true, + "fieldSearch":"", + "fieldName":"hostip", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"test_data", + "comment":"", + "type":"ipv4", + "displayName":"hostip" + } + ], + "owner":"test_data", + "comment":"", + "calculationID":"bs7krya32co", + "expression":"129.0.0.1", + "calculationType":"Eval" + }, + { + "editable":true, + "outputFields":[ + { + "editable":true, + "fieldSearch":"", + "fieldName":"epsilon", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"test_data", + "comment":"", + "type":"number", + "displayName":"epsilon" + } + ], + "owner":"test_data", + "comment":"", + "calculationID":"bsbno65h5v", + "expression":"25", + "calculationType":"Eval" + }, + { + "editable":false, + "outputFields":[ + { + "editable":false, + "fieldSearch":"", + "fieldName":"is_child", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"test_data", + "comment":"", + "type":"childCount", + "displayName":"is_child" + } + ], + "owner":"test_data", + "comment":"", + "calculationID":"ec9664b60b8de96cd9d7a0114e89e358d1620c19", + "expression":"if(searchmatch(\"\"),1,0)", + "calculationType":"Eval" + }, + { + "editable":false, + "outputFields":[ + { + "editable":false, + "fieldSearch":"", + "fieldName":"is_not_child", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"test_data", + "comment":"", + "type":"childCount", + "displayName":"is_not_child" + } + ], + "owner":"test_data", + "comment":"", + "calculationID":"64f71e104ac3b7cdbf665046891b79adb58ddf6d", + "expression":"if(searchmatch(\"NOT( )\"),1,0)", + "calculationType":"Eval" + } + ], + "autoextractSearch":"", + "comment":"", + "parentName":"BaseEvent", + "children":[ + "child" + ], + "lineage":"test_data", + "tsidxNamespace":"" + }, + { + "fields":[ + { + "editable":false, + "fieldSearch":"", + "fieldName":"_time", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"BaseEvent", + "comment":"", + "type":"timestamp", + "displayName":"_time" + }, + { + "editable":false, + "fieldSearch":"", + "fieldName":"host", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"BaseEvent", + "comment":"", + "type":"string", + "displayName":"host" + }, + { + "editable":false, + "fieldSearch":"", + "fieldName":"source", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"BaseEvent", + "comment":"", + "type":"string", + "displayName":"source" + }, + { + "editable":false, + "fieldSearch":"", + "fieldName":"sourcetype", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"BaseEvent", + "comment":"", + "type":"string", + "displayName":"sourcetype" + }, + { + "editable":false, + "fieldSearch":"", + "fieldName":"child", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"test_data.child", + "comment":"", + "type":"objectCount", + "displayName":"child" + } + ], + "objectSearchNoFields":"| rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\" | rename \"test_data.has_boris\" AS \"has_boris\", \"test_data.hostip\" AS \"hostip\", \"test_data.epsilon\" AS \"epsilon\" | eval \"has_boris\"=if(boris != null, \"true\", \"false\") | eval \"hostip\"=\"129.0.0.1\" | eval \"epsilon\"=25 | rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\"", + "constraints":[ + + ], + "displayName":"child", + "previewSearch":" | eval \"has_boris\"=if(boris != null, \"true\", \"false\") | eval \"hostip\"=\"129.0.0.1\" | eval \"epsilon\"=25", + "objectSearch":"| rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\" | rename \"test_data.has_boris\" AS \"has_boris\", \"test_data.hostip\" AS \"hostip\", \"test_data.epsilon\" AS \"epsilon\" | eval \"has_boris\"=if(boris != null, \"true\", \"false\") | eval \"hostip\"=\"129.0.0.1\" | eval \"epsilon\"=25 | rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\" | fields \"_time\", \"host\", \"source\", \"sourcetype\", \"test_data.has_boris\", \"test_data.hostip\", \"test_data.epsilon\"", + "objectName":"child", + "calculations":[ + { + "editable":true, + "outputFields":[ + { + "editable":true, + "fieldSearch":"", + "fieldName":"hostip", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"test_data", + "comment":"", + "type":"ipv4", + "displayName":"hostip" + } + ], + "owner":"test_data", + "comment":"", + "calculationID":"bs7krya32co", + "expression":"129.0.0.1", + "calculationType":"Eval" + }, + { + "editable":true, + "outputFields":[ + { + "editable":true, + "fieldSearch":"", + "fieldName":"epsilon", + "required":false, + "multivalue":false, + "hidden":false, + "owner":"test_data", + "comment":"", + "type":"number", + "displayName":"epsilon" + } + ], + "owner":"test_data", + "comment":"", + "calculationID":"bsbno65h5v", + "expression":"25", + "calculationType":"Eval" + } + ], + "autoextractSearch":"", + "comment":"", + "parentName":"test_data", + "children":[ + + ], + "lineage":"test_data.child", + "tsidxNamespace":"" + } + ], + "objectNameList":[ + "test_data", + "child" + ] +} \ No newline at end of file diff --git a/tests_spike/data/data_model_with_test_objects.json b/tests_spike/data/data_model_with_test_objects.json new file mode 100644 index 000000000..5d3971fa7 --- /dev/null +++ b/tests_spike/data/data_model_with_test_objects.json @@ -0,0 +1,258 @@ +{ + "objects":[ + { + "objectName":"event1", + "comment":"·Ä©·öô‡Øµ comment on event1", + "autoextractSearch":" (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) ", + "calculations":[ + { + "owner":"event1", + "calculationID":"93fzsv03wa7", + "outputFields":[ + { + "owner":"event1", + "type":"string", + "hidden":true, + "fieldSearch":"new_field=* ", + "fieldName":"new_field", + "multivalue":false, + "displayName":"My New Field", + "editable":true, + "required":true, + "comment":"" + } + ], + "comment":"", + "editable":true, + "calculationType":"Eval", + "expression":"if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\")" + }, + { + "owner":"event1", + "calculationID":"sr3mc8o3mjr", + "outputFields":[ + { + "multivalue":false, + "hidden":false, + "fieldName":"output_from_reverse_hostname", + "type":"ipv4", + "owner":"event1", + "comment":"", + "fieldSearch":"output_from_reverse_hostname=* ", + "editable":true, + "lookupOutputFieldName":"reverse_hostname", + "displayName":"\u0bf5aad", + "required":true + } + ], + "comment":"", + "editable":true, + "lookupName":"dnslookup", + "inputField":"host", + "calculationType":"Lookup", + "lookupField":"a_lookup_field" + }, + { + "owner":"event1", + "calculationID":"a5v1k82ymic", + "outputFields":[ + { + "owner":"event1", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"from", + "multivalue":false, + "displayName":"from", + "editable":true, + "required":false, + "comment":"" + }, + { + "owner":"event1", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"to", + "multivalue":false, + "displayName":"to", + "editable":true, + "required":false, + "comment":"" + } + ], + "comment":"", + "editable":true, + "inputField":"_raw", + "calculationType":"Rex", + "expression":" From: (?.*) To: (?.*) " + }, + { + "owner":"event1", + "calculationID":"pbe9bd0rp4", + "outputFields":[ + { + "multivalue":false, + "hidden":false, + "fieldName":"output_from_reverse_hostname_lon", + "type":"number", + "owner":"event1", + "comment":"", + "fieldSearch":"output_from_reverse_hostname_lon=* ", + "editable":true, + "lookupOutputFieldName":"lon", + "displayName":"output_from_reverse_hostname_lon", + "required":true + }, + { + "multivalue":false, + "hidden":false, + "fieldName":"output_from_reverse_hostname_lat", + "type":"number", + "owner":"event1", + "comment":"", + "fieldSearch":"output_from_reverse_hostname_lat=* ", + "editable":true, + "lookupOutputFieldName":"lat", + "displayName":"output_from_reverse_hostname_lat", + "required":true + }, + { + "multivalue":false, + "hidden":false, + "fieldName":"output_from_reverse_hostname_City", + "type":"string", + "owner":"event1", + "comment":"", + "fieldSearch":"output_from_reverse_hostname_City=* ", + "editable":true, + "lookupOutputFieldName":"City", + "displayName":"output_from_reverse_hostname_City", + "required":true + }, + { + "multivalue":false, + "hidden":false, + "fieldName":"output_from_reverse_hostname_Region", + "type":"string", + "owner":"event1", + "comment":"", + "fieldSearch":"output_from_reverse_hostname_Region=* ", + "editable":true, + "lookupOutputFieldName":"Region", + "displayName":"output_from_reverse_hostname_Region", + "required":true + }, + { + "multivalue":false, + "hidden":false, + "fieldName":"output_from_reverse_hostname_Country", + "type":"string", + "owner":"event1", + "comment":"", + "fieldSearch":"output_from_reverse_hostname_Country=* ", + "editable":true, + "lookupOutputFieldName":"Country", + "displayName":"output_from_reverse_hostname_Country", + "required":true + } + ], + "comment":"·Ä©·öô‡Øµ comment of pbe9bd0rp4", + "editable":true, + "inputField":"output_from_reverse_hostname", + "calculationType":"GeoIP" + } + ], + "previewSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* ", + "children":[ + + ], + "objectSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\" | rename \"event1.new_field\" AS \"new_field\", \"event1.output_from_reverse_hostname\" AS \"output_from_reverse_hostname\", \"event1.from\" AS \"from\", \"event1.to\" AS \"to\", \"event1.output_from_reverse_hostname_lon\" AS \"output_from_reverse_hostname_lon\", \"event1.output_from_reverse_hostname_lat\" AS \"output_from_reverse_hostname_lat\", \"event1.output_from_reverse_hostname_City\" AS \"output_from_reverse_hostname_City\", \"event1.output_from_reverse_hostname_Region\" AS \"output_from_reverse_hostname_Region\", \"event1.output_from_reverse_hostname_Country\" AS \"output_from_reverse_hostname_Country\" | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\" | fields \"_time\", \"host\", \"source\", \"sourcetype\", \"event1.new_field\", \"event1.output_from_reverse_hostname\", \"event1.from\", \"event1.to\", \"event1.output_from_reverse_hostname_lon\", \"event1.output_from_reverse_hostname_lat\", \"event1.output_from_reverse_hostname_City\", \"event1.output_from_reverse_hostname_Region\", \"event1.output_from_reverse_hostname_Country\"", + "constraints":[ + { + "owner":"event1", + "search":"uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")" + } + ], + "lineage":"event1", + "tsidxNamespace":"", + "displayName":"event1 ·Ä©·öô", + "fields":[ + { + "owner":"BaseEvent", + "type":"timestamp", + "hidden":false, + "fieldSearch":"", + "fieldName":"_time", + "multivalue":false, + "displayName":"_time", + "editable":false, + "required":false, + "comment":"" + }, + { + "owner":"BaseEvent", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"host", + "multivalue":false, + "displayName":"host", + "editable":false, + "required":false, + "comment":"" + }, + { + "owner":"BaseEvent", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"source", + "multivalue":false, + "displayName":"source", + "editable":false, + "required":false, + "comment":"" + }, + { + "owner":"BaseEvent", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"sourcetype", + "multivalue":false, + "displayName":"sourcetype", + "editable":false, + "required":false, + "comment":"" + }, + { + "owner":"event1", + "type":"objectCount", + "hidden":false, + "fieldSearch":"", + "fieldName":"event1", + "multivalue":false, + "displayName":"event1", + "editable":false, + "required":false, + "comment":"" + } + ], + "parentName":"BaseEvent", + "objectSearchNoFields":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\" | rename \"event1.new_field\" AS \"new_field\", \"event1.output_from_reverse_hostname\" AS \"output_from_reverse_hostname\", \"event1.from\" AS \"from\", \"event1.to\" AS \"to\", \"event1.output_from_reverse_hostname_lon\" AS \"output_from_reverse_hostname_lon\", \"event1.output_from_reverse_hostname_lat\" AS \"output_from_reverse_hostname_lat\", \"event1.output_from_reverse_hostname_City\" AS \"output_from_reverse_hostname_City\", \"event1.output_from_reverse_hostname_Region\" AS \"output_from_reverse_hostname_Region\", \"event1.output_from_reverse_hostname_Country\" AS \"output_from_reverse_hostname_Country\" | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\"" + } + ], + "displayName":"\u0bf5\u0bf1\u0bf0\u0bef - search 1", + "objectSummary":{ + "Event-Based":1, + "Search-Based":0, + "Transaction-Based":0, + "Interfaces":0, + "Interface Implementations":0 + }, + "description":"A description", + "objectNameList":[ + "event1" + ] +} \ No newline at end of file diff --git a/tests_spike/data/empty_data_model.json b/tests_spike/data/empty_data_model.json new file mode 100644 index 000000000..ad6cad47f --- /dev/null +++ b/tests_spike/data/empty_data_model.json @@ -0,0 +1,5 @@ +{ + "description":"Empty model", + "displayName":"A human readable name", + "objects": [] +} \ No newline at end of file diff --git a/tests_spike/data/inheritance_test_data.json b/tests_spike/data/inheritance_test_data.json new file mode 100644 index 000000000..31fa34cd0 --- /dev/null +++ b/tests_spike/data/inheritance_test_data.json @@ -0,0 +1,375 @@ +{ + "objects":[ + { + "objectSearch":" | search (boris=hilda) | rename \"is_level_1\" AS \"level_0.is_level_1\", \"is_not_level_1\" AS \"level_0.is_not_level_1\" | rename \"level_0.is_level_1\" AS \"is_level_1\", \"level_0.is_not_level_1\" AS \"is_not_level_1\" | eval \"is_level_1\"=if(searchmatch(\" (natasha=meep) \"),1,0) | eval \"is_not_level_1\"=if(searchmatch(\"NOT( (natasha=meep) )\"),1,0) | rename \"is_level_1\" AS \"level_0.is_level_1\", \"is_not_level_1\" AS \"level_0.is_not_level_1\" | fields \"_time\", \"host\", \"source\", \"sourcetype\", \"level_0.is_level_1\", \"level_0.is_not_level_1\"", + "constraints":[ + { + "owner":"level_0", + "search":"boris=hilda" + } + ], + "lineage":"level_0", + "objectName":"level_0", + "displayName":"level 0", + "autoextractSearch":" (boris=hilda) ", + "calculations":[ + { + "owner":"level_0", + "calculationID":"5d76326e6a312efd4630317be0a7212cb99a9c14", + "expression":"if(searchmatch(\" (natasha=meep) \"),1,0)", + "editable":false, + "calculationType":"Eval", + "outputFields":[ + { + "owner":"level_0", + "type":"childCount", + "hidden":false, + "fieldSearch":"", + "fieldName":"is_level_1", + "displayName":"is_level_1", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + } + ], + "comment":"" + }, + { + "owner":"level_0", + "calculationID":"8c7a163a740a9c27dd2a99b70e45fa7bd1e3ee9b", + "expression":"if(searchmatch(\"NOT( (natasha=meep) )\"),1,0)", + "editable":false, + "calculationType":"Eval", + "outputFields":[ + { + "owner":"level_0", + "type":"childCount", + "hidden":false, + "fieldSearch":"", + "fieldName":"is_not_level_1", + "displayName":"is_not_level_1", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + } + ], + "comment":"" + } + ], + "previewSearch":" | search (boris=hilda) ", + "objectSearchNoFields":" | search (boris=hilda) | rename \"is_level_1\" AS \"level_0.is_level_1\", \"is_not_level_1\" AS \"level_0.is_not_level_1\" | rename \"level_0.is_level_1\" AS \"is_level_1\", \"level_0.is_not_level_1\" AS \"is_not_level_1\" | eval \"is_level_1\"=if(searchmatch(\" (natasha=meep) \"),1,0) | eval \"is_not_level_1\"=if(searchmatch(\"NOT( (natasha=meep) )\"),1,0) | rename \"is_level_1\" AS \"level_0.is_level_1\", \"is_not_level_1\" AS \"level_0.is_not_level_1\"", + "tsidxNamespace":"", + "comment":"", + "fields":[ + { + "owner":"BaseEvent", + "type":"timestamp", + "hidden":false, + "fieldSearch":"", + "fieldName":"_time", + "displayName":"_time", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + }, + { + "owner":"BaseEvent", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"host", + "displayName":"host", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + }, + { + "owner":"BaseEvent", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"source", + "displayName":"source", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + }, + { + "owner":"BaseEvent", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"sourcetype", + "displayName":"sourcetype", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + }, + { + "owner":"level_0", + "type":"objectCount", + "hidden":false, + "fieldSearch":"", + "fieldName":"level_0", + "displayName":"level 0", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + } + ], + "parentName":"BaseEvent", + "children":[ + "level_1" + ] + }, + { + "objectSearch":" | search (boris=hilda) | rename \"is_level_2\" AS \"level_0.level_1.is_level_2\", \"is_not_level_2\" AS \"level_0.level_1.is_not_level_2\" | rename \"level_0.level_1.is_level_2\" AS \"is_level_2\", \"level_0.level_1.is_not_level_2\" AS \"is_not_level_2\" | search (natasha=meep) | eval \"is_level_2\"=if(searchmatch(\" (prr=4) \"),1,0) | eval \"is_not_level_2\"=if(searchmatch(\"NOT( (prr=4) )\"),1,0) | rename \"is_level_2\" AS \"level_0.level_1.is_level_2\", \"is_not_level_2\" AS \"level_0.level_1.is_not_level_2\" | fields \"_time\", \"host\", \"source\", \"sourcetype\", \"level_0.level_1.is_level_2\", \"level_0.level_1.is_not_level_2\"", + "constraints":[ + { + "owner":"level_0", + "search":"boris=hilda" + }, + { + "owner":"level_0.level_1", + "search":"natasha=meep" + } + ], + "lineage":"level_0.level_1", + "objectName":"level_1", + "displayName":"level 1", + "autoextractSearch":" (boris=hilda) ", + "calculations":[ + { + "owner":"level_0.level_1", + "calculationID":"3077412e0686c92fe9f1bbf6ae58e8c6daf98cfd", + "expression":"if(searchmatch(\" (prr=4) \"),1,0)", + "editable":false, + "calculationType":"Eval", + "outputFields":[ + { + "owner":"level_0.level_1", + "type":"childCount", + "hidden":false, + "fieldSearch":"", + "fieldName":"is_level_2", + "displayName":"is_level_2", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + } + ], + "comment":"" + }, + { + "owner":"level_0.level_1", + "calculationID":"4a30d30bca031a36e4fde3de802c5b60f9efde95", + "expression":"if(searchmatch(\"NOT( (prr=4) )\"),1,0)", + "editable":false, + "calculationType":"Eval", + "outputFields":[ + { + "owner":"level_0.level_1", + "type":"childCount", + "hidden":false, + "fieldSearch":"", + "fieldName":"is_not_level_2", + "displayName":"is_not_level_2", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + } + ], + "comment":"" + } + ], + "previewSearch":" | search (boris=hilda) (natasha=meep) ", + "objectSearchNoFields":" | search (boris=hilda) | rename \"is_level_2\" AS \"level_0.level_1.is_level_2\", \"is_not_level_2\" AS \"level_0.level_1.is_not_level_2\" | rename \"level_0.level_1.is_level_2\" AS \"is_level_2\", \"level_0.level_1.is_not_level_2\" AS \"is_not_level_2\" | search (natasha=meep) | eval \"is_level_2\"=if(searchmatch(\" (prr=4) \"),1,0) | eval \"is_not_level_2\"=if(searchmatch(\"NOT( (prr=4) )\"),1,0) | rename \"is_level_2\" AS \"level_0.level_1.is_level_2\", \"is_not_level_2\" AS \"level_0.level_1.is_not_level_2\"", + "tsidxNamespace":"", + "comment":"", + "fields":[ + { + "owner":"BaseEvent", + "type":"timestamp", + "hidden":false, + "fieldSearch":"", + "fieldName":"_time", + "displayName":"_time", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + }, + { + "owner":"BaseEvent", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"host", + "displayName":"host", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + }, + { + "owner":"BaseEvent", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"source", + "displayName":"source", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + }, + { + "owner":"BaseEvent", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"sourcetype", + "displayName":"sourcetype", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + }, + { + "owner":"level_0.level_1", + "type":"objectCount", + "hidden":false, + "fieldSearch":"", + "fieldName":"level_1", + "displayName":"level 1", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + } + ], + "parentName":"level_0", + "children":[ + "level_2" + ] + }, + { + "objectSearch":" | search (boris=hilda) (natasha=meep) (prr=4) | fields \"_time\", \"host\", \"source\", \"sourcetype\"", + "constraints":[ + { + "owner":"level_0", + "search":"boris=hilda" + }, + { + "owner":"level_0.level_1", + "search":"natasha=meep" + }, + { + "owner":"level_0.level_1.level_2", + "search":"prr=4" + } + ], + "lineage":"level_0.level_1.level_2", + "objectName":"level_2", + "displayName":"level 2", + "autoextractSearch":" (boris=hilda) ", + "calculations":[ + + ], + "previewSearch":" | search (boris=hilda) (natasha=meep) (prr=4) ", + "objectSearchNoFields":" | search (boris=hilda) (natasha=meep) (prr=4) ", + "tsidxNamespace":"", + "comment":"", + "fields":[ + { + "owner":"BaseEvent", + "type":"timestamp", + "hidden":false, + "fieldSearch":"", + "fieldName":"_time", + "displayName":"_time", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + }, + { + "owner":"BaseEvent", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"host", + "displayName":"host", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + }, + { + "owner":"BaseEvent", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"source", + "displayName":"source", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + }, + { + "owner":"BaseEvent", + "type":"string", + "hidden":false, + "fieldSearch":"", + "fieldName":"sourcetype", + "displayName":"sourcetype", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + }, + { + "owner":"level_0.level_1.level_2", + "type":"objectCount", + "hidden":false, + "fieldSearch":"", + "fieldName":"level_2", + "displayName":"level 2", + "editable":false, + "comment":"", + "required":false, + "multivalue":false + } + ], + "parentName":"level_1", + "children":[ + + ] + } + ], + "displayName":"inheritance test", + "objectSummary":{ + "Event-Based":3, + "Search-Based":0, + "Transaction-Based":0, + "Interfaces":0, + "Interface Implementations":0 + }, + "modelName":"inheritance_test", + "description":"Data model description to test lineages.", + "objectNameList":[ + "level_0", + "level_1", + "level_2" + ] +} \ No newline at end of file diff --git a/tests_spike/data/model_with_empty_headers.json b/tests_spike/data/model_with_empty_headers.json new file mode 100644 index 000000000..296b754d7 --- /dev/null +++ b/tests_spike/data/model_with_empty_headers.json @@ -0,0 +1,5 @@ +{ + "displayName": "", + "description": "", + "objects": [] +} \ No newline at end of file diff --git a/tests_spike/data/model_with_multiple_types.json b/tests_spike/data/model_with_multiple_types.json new file mode 100644 index 000000000..5200f6da9 --- /dev/null +++ b/tests_spike/data/model_with_multiple_types.json @@ -0,0 +1,604 @@ +{ + "objectNameList":[ + "event1", + "transaction1", + "search1", + "subsearch" + ], + "objectSummary":{ + "Search-Based":2, + "Transaction-Based":1, + "Event-Based":1, + "Interfaces":0, + "Interface Implementations":0 + }, + "displayName":"\u0bf5\u0bf1\u0bf0\u0bef - search 1", + "description":"A description", + "modelName":"search1", + "objects":[ + { + "constraints":[ + { + "search":"uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")", + "owner":"event1" + } + ], + "tsidxNamespace":"", + "objectSearchNoFields":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\" | rename \"event1.new_field\" AS \"new_field\", \"event1.output_from_reverse_hostname\" AS \"output_from_reverse_hostname\", \"event1.from\" AS \"from\", \"event1.to\" AS \"to\", \"event1.output_from_reverse_hostname_lon\" AS \"output_from_reverse_hostname_lon\", \"event1.output_from_reverse_hostname_lat\" AS \"output_from_reverse_hostname_lat\", \"event1.output_from_reverse_hostname_City\" AS \"output_from_reverse_hostname_City\", \"event1.output_from_reverse_hostname_Region\" AS \"output_from_reverse_hostname_Region\", \"event1.output_from_reverse_hostname_Country\" AS \"output_from_reverse_hostname_Country\" | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\"", + "objectSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\" | rename \"event1.new_field\" AS \"new_field\", \"event1.output_from_reverse_hostname\" AS \"output_from_reverse_hostname\", \"event1.from\" AS \"from\", \"event1.to\" AS \"to\", \"event1.output_from_reverse_hostname_lon\" AS \"output_from_reverse_hostname_lon\", \"event1.output_from_reverse_hostname_lat\" AS \"output_from_reverse_hostname_lat\", \"event1.output_from_reverse_hostname_City\" AS \"output_from_reverse_hostname_City\", \"event1.output_from_reverse_hostname_Region\" AS \"output_from_reverse_hostname_Region\", \"event1.output_from_reverse_hostname_Country\" AS \"output_from_reverse_hostname_Country\" | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\" | fields \"_time\", \"host\", \"source\", \"sourcetype\", \"event1.new_field\", \"event1.output_from_reverse_hostname\", \"event1.from\", \"event1.to\", \"event1.output_from_reverse_hostname_lon\", \"event1.output_from_reverse_hostname_lat\", \"event1.output_from_reverse_hostname_City\", \"event1.output_from_reverse_hostname_Region\", \"event1.output_from_reverse_hostname_Country\"", + "calculations":[ + { + "expression":"if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\")", + "outputFields":[ + { + "multivalue":false, + "type":"string", + "comment":"", + "required":true, + "editable":true, + "hidden":true, + "fieldName":"new_field", + "displayName":"My New Field", + "owner":"event1", + "fieldSearch":"new_field=* " + } + ], + "comment":"", + "calculationID":"93fzsv03wa7", + "editable":true, + "calculationType":"Eval", + "owner":"event1" + }, + { + "lookupField":"a_lookup_field", + "outputFields":[ + { + "editable":true, + "multivalue":false, + "lookupOutputFieldName":"reverse_hostname", + "fieldSearch":"output_from_reverse_hostname=* ", + "required":true, + "hidden":false, + "comment":"", + "displayName":"\u0bf5aad", + "fieldName":"output_from_reverse_hostname", + "type":"ipv4", + "owner":"event1" + } + ], + "comment":"", + "calculationID":"sr3mc8o3mjr", + "editable":true, + "lookupName":"dnslookup", + "inputField":"host", + "calculationType":"Lookup", + "owner":"event1" + }, + { + "expression":" From: (?.*) To: (?.*) ", + "outputFields":[ + { + "multivalue":false, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"from", + "displayName":"from", + "owner":"event1", + "fieldSearch":"" + }, + { + "multivalue":false, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"to", + "displayName":"to", + "owner":"event1", + "fieldSearch":"" + } + ], + "comment":"", + "calculationID":"a5v1k82ymic", + "editable":true, + "inputField":"_raw", + "calculationType":"Rex", + "owner":"event1" + }, + { + "outputFields":[ + { + "editable":true, + "multivalue":false, + "lookupOutputFieldName":"lon", + "fieldSearch":"output_from_reverse_hostname_lon=* ", + "required":true, + "hidden":false, + "comment":"", + "displayName":"output_from_reverse_hostname_lon", + "fieldName":"output_from_reverse_hostname_lon", + "type":"number", + "owner":"event1" + }, + { + "editable":true, + "multivalue":false, + "lookupOutputFieldName":"lat", + "fieldSearch":"output_from_reverse_hostname_lat=* ", + "required":true, + "hidden":false, + "comment":"", + "displayName":"output_from_reverse_hostname_lat", + "fieldName":"output_from_reverse_hostname_lat", + "type":"number", + "owner":"event1" + }, + { + "editable":true, + "multivalue":false, + "lookupOutputFieldName":"City", + "fieldSearch":"output_from_reverse_hostname_City=* ", + "required":true, + "hidden":false, + "comment":"", + "displayName":"output_from_reverse_hostname_City", + "fieldName":"output_from_reverse_hostname_City", + "type":"string", + "owner":"event1" + }, + { + "editable":true, + "multivalue":false, + "lookupOutputFieldName":"Region", + "fieldSearch":"output_from_reverse_hostname_Region=* ", + "required":true, + "hidden":false, + "comment":"", + "displayName":"output_from_reverse_hostname_Region", + "fieldName":"output_from_reverse_hostname_Region", + "type":"string", + "owner":"event1" + }, + { + "editable":true, + "multivalue":false, + "lookupOutputFieldName":"Country", + "fieldSearch":"output_from_reverse_hostname_Country=* ", + "required":true, + "hidden":false, + "comment":"", + "displayName":"output_from_reverse_hostname_Country", + "fieldName":"output_from_reverse_hostname_Country", + "type":"string", + "owner":"event1" + } + ], + "comment":"", + "calculationID":"pbe9bd0rp4", + "editable":true, + "inputField":"output_from_reverse_hostname", + "calculationType":"GeoIP", + "owner":"event1" + } + ], + "children":[ + + ], + "previewSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* ", + "comment":"", + "fields":[ + { + "multivalue":false, + "type":"timestamp", + "comment":"", + "required":false, + "editable":false, + "hidden":false, + "fieldName":"_time", + "displayName":"_time", + "owner":"BaseEvent", + "fieldSearch":"" + }, + { + "multivalue":false, + "type":"string", + "comment":"", + "required":false, + "editable":false, + "hidden":false, + "fieldName":"host", + "displayName":"host", + "owner":"BaseEvent", + "fieldSearch":"" + }, + { + "multivalue":false, + "type":"string", + "comment":"", + "required":false, + "editable":false, + "hidden":false, + "fieldName":"source", + "displayName":"source", + "owner":"BaseEvent", + "fieldSearch":"" + }, + { + "multivalue":false, + "type":"string", + "comment":"", + "required":false, + "editable":false, + "hidden":false, + "fieldName":"sourcetype", + "displayName":"sourcetype", + "owner":"BaseEvent", + "fieldSearch":"" + }, + { + "multivalue":false, + "type":"objectCount", + "comment":"", + "required":false, + "editable":false, + "hidden":false, + "fieldName":"event1", + "displayName":"event1", + "owner":"event1", + "fieldSearch":"" + } + ], + "objectName":"event1", + "displayName":"event1", + "parentName":"BaseEvent", + "lineage":"event1", + "autoextractSearch":" (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) " + }, + { + "constraints":[ + + ], + "objectsToGroup":[ + "event1" + ], + "tsidxNamespace":"", + "objectSearchNoFields":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | transaction mvlist=t keepevicted=f maxspan=100m maxpause=25s host from | search *", + "transactionMaxPause":"25s", + "groupByFields":[ + "host", + "from" + ], + "objectSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | transaction mvlist=t keepevicted=f maxspan=100m maxpause=25s host from | search * | fields \"eventcount\", \"duration\", \"_time\", \"host\", \"source\", \"sourcetype\", \"new_field\", \"output_from_reverse_hostname\", \"from\", \"to\", \"output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\"", + "calculations":[ + + ], + "children":[ + + ], + "previewSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | head 10000 | transaction keepevicted=f maxspan=100m maxpause=25s host from | search *", + "comment":"", + "fields":[ + { + "multivalue":false, + "type":"number", + "comment":"", + "required":true, + "editable":false, + "hidden":false, + "fieldName":"eventcount", + "displayName":"eventcount", + "owner":"BaseEventSet", + "fieldSearch":"eventcount=* " + }, + { + "multivalue":false, + "type":"number", + "comment":"", + "required":true, + "editable":false, + "hidden":false, + "fieldName":"duration", + "displayName":"duration", + "owner":"BaseEventSet", + "fieldSearch":"duration=* " + }, + { + "multivalue":false, + "type":"timestamp", + "comment":"", + "required":true, + "editable":false, + "hidden":false, + "fieldName":"_time", + "displayName":"_time", + "owner":"BaseEventSet", + "fieldSearch":"_time=* " + }, + { + "multivalue":true, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"host", + "displayName":"host", + "owner":"BaseTransaction", + "fieldSearch":"" + }, + { + "multivalue":true, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"source", + "displayName":"source", + "owner":"BaseTransaction", + "fieldSearch":"" + }, + { + "multivalue":true, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"sourcetype", + "displayName":"sourcetype", + "owner":"BaseTransaction", + "fieldSearch":"" + }, + { + "multivalue":true, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"new_field", + "displayName":"new_field", + "owner":"BaseTransaction", + "fieldSearch":"" + }, + { + "multivalue":true, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"output_from_reverse_hostname", + "displayName":"output_from_reverse_hostname", + "owner":"BaseTransaction", + "fieldSearch":"" + }, + { + "multivalue":true, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"from", + "displayName":"from", + "owner":"BaseTransaction", + "fieldSearch":"" + }, + { + "multivalue":true, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"to", + "displayName":"to", + "owner":"BaseTransaction", + "fieldSearch":"" + }, + { + "multivalue":true, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"output_from_reverse_hostname_lon", + "displayName":"output_from_reverse_hostname_lon", + "owner":"BaseTransaction", + "fieldSearch":"" + }, + { + "multivalue":true, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"output_from_reverse_hostname_lat", + "displayName":"output_from_reverse_hostname_lat", + "owner":"BaseTransaction", + "fieldSearch":"" + }, + { + "multivalue":true, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"output_from_reverse_hostname_City", + "displayName":"output_from_reverse_hostname_City", + "owner":"BaseTransaction", + "fieldSearch":"" + }, + { + "multivalue":true, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"output_from_reverse_hostname_Region", + "displayName":"output_from_reverse_hostname_Region", + "owner":"BaseTransaction", + "fieldSearch":"" + }, + { + "multivalue":true, + "type":"string", + "comment":"", + "required":false, + "editable":true, + "hidden":false, + "fieldName":"output_from_reverse_hostname_Country", + "displayName":"output_from_reverse_hostname_Country", + "owner":"BaseTransaction", + "fieldSearch":"" + }, + { + "multivalue":false, + "type":"objectCount", + "comment":"", + "required":false, + "editable":false, + "hidden":false, + "fieldName":"transaction1", + "displayName":"transaction1", + "owner":"transaction1", + "fieldSearch":"" + } + ], + "objectName":"transaction1", + "transactionMaxTimeSpan":"100m", + "displayName":"transaction1", + "parentName":"BaseTransaction", + "lineage":"transaction1", + "autoextractSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | transaction mvlist=t keepevicted=f maxspan=100m maxpause=25s host from | search *" + }, + { + "constraints":[ + + ], + "tsidxNamespace":"", + "objectSearchNoFields":"| search search index=_internal | head 10| rename \"is_subsearch\" AS \"search1.is_subsearch\", \"is_not_subsearch\" AS \"search1.is_not_subsearch\" | rename \"search1.is_subsearch\" AS \"is_subsearch\", \"search1.is_not_subsearch\" AS \"is_not_subsearch\" | eval \"is_subsearch\"=if(searchmatch(\" (boris=meep) \"),1,0) | eval \"is_not_subsearch\"=if(searchmatch(\"NOT( (boris=meep) )\"),1,0) | rename \"is_subsearch\" AS \"search1.is_subsearch\", \"is_not_subsearch\" AS \"search1.is_not_subsearch\"", + "objectSearch":"| search search index=_internal | head 10| rename \"is_subsearch\" AS \"search1.is_subsearch\", \"is_not_subsearch\" AS \"search1.is_not_subsearch\" | rename \"search1.is_subsearch\" AS \"is_subsearch\", \"search1.is_not_subsearch\" AS \"is_not_subsearch\" | eval \"is_subsearch\"=if(searchmatch(\" (boris=meep) \"),1,0) | eval \"is_not_subsearch\"=if(searchmatch(\"NOT( (boris=meep) )\"),1,0) | rename \"is_subsearch\" AS \"search1.is_subsearch\", \"is_not_subsearch\" AS \"search1.is_not_subsearch\" | fields \"search1.is_subsearch\", \"search1.is_not_subsearch\"", + "calculations":[ + { + "expression":"if(searchmatch(\" (boris=meep) \"),1,0)", + "outputFields":[ + { + "multivalue":false, + "type":"childCount", + "comment":"", + "required":false, + "editable":false, + "hidden":false, + "fieldName":"is_subsearch", + "displayName":"is_subsearch", + "owner":"search1", + "fieldSearch":"" + } + ], + "comment":"", + "calculationID":"0ed17fcd0954d6299d64bf4e1556514229b61fa8", + "editable":false, + "calculationType":"Eval", + "owner":"search1" + }, + { + "expression":"if(searchmatch(\"NOT( (boris=meep) )\"),1,0)", + "outputFields":[ + { + "multivalue":false, + "type":"childCount", + "comment":"", + "required":false, + "editable":false, + "hidden":false, + "fieldName":"is_not_subsearch", + "displayName":"is_not_subsearch", + "owner":"search1", + "fieldSearch":"" + } + ], + "comment":"", + "calculationID":"ce565b44f7e01bb1ea9afb742f5bb361f94e39b2", + "editable":false, + "calculationType":"Eval", + "owner":"search1" + } + ], + "children":[ + "subsearch" + ], + "previewSearch":"| search search index=_internal | head 10", + "comment":"", + "fields":[ + { + "multivalue":false, + "type":"objectCount", + "comment":"", + "required":false, + "editable":false, + "hidden":false, + "fieldName":"search1", + "displayName":"search1", + "owner":"search1", + "fieldSearch":"" + } + ], + "objectName":"search1", + "displayName":"search1", + "baseSearch":"search index=_internal | head 10", + "parentName":"BaseSearch", + "lineage":"search1", + "autoextractSearch":"| search search index=_internal | head 10" + }, + { + "constraints":[ + { + "search":"boris=meep", + "owner":"search1.subsearch" + } + ], + "tsidxNamespace":"", + "objectSearchNoFields":"| search search index=_internal | head 10 | search (boris=meep) ", + "objectSearch":"| search search index=_internal | head 10 | search (boris=meep) ", + "calculations":[ + + ], + "children":[ + + ], + "previewSearch":"| search search index=_internal | head 10 | search (boris=meep) ", + "comment":"", + "fields":[ + { + "multivalue":false, + "type":"objectCount", + "comment":"", + "required":false, + "editable":false, + "hidden":false, + "fieldName":"subsearch", + "displayName":"subsearch", + "owner":"search1.subsearch", + "fieldSearch":"" + } + ], + "objectName":"subsearch", + "displayName":"subsearch", + "baseSearch":"search index=_internal | head 10", + "parentName":"search1", + "lineage":"search1.subsearch", + "autoextractSearch":"| search search index=_internal | head 10" + } + ] +} \ No newline at end of file diff --git a/tests_spike/data/model_with_unicode_headers.json b/tests_spike/data/model_with_unicode_headers.json new file mode 100644 index 000000000..88ba67d32 --- /dev/null +++ b/tests_spike/data/model_with_unicode_headers.json @@ -0,0 +1,5 @@ +{ + "displayName": "·Ä©·öô‡Øµ", + "description": "‡Øµ‡Ø±‡Ø∞‡ØØ", + "objects": [] +} \ No newline at end of file diff --git a/tests_spike/data/object_with_one_search.json b/tests_spike/data/object_with_one_search.json new file mode 100644 index 000000000..8eff7775c --- /dev/null +++ b/tests_spike/data/object_with_one_search.json @@ -0,0 +1,14 @@ +{ + "displayName": "·Ä©·öô‡Øµ", + "description": "‡Øµ‡Ø±‡Ø∞‡ØØ", + "objects": [ + { + "objectName": "search1", + "displayName": "‡Øµ‡Ø±‡Ø∞‡ØØ - search 1", + "parentName": "BaseEvent", + "fields": [], + "calculations": [], + "constraints": [] + } + ] +} \ No newline at end of file diff --git a/tests_spike/data/object_with_two_searches.json b/tests_spike/data/object_with_two_searches.json new file mode 100644 index 000000000..ccc6ae66d --- /dev/null +++ b/tests_spike/data/object_with_two_searches.json @@ -0,0 +1,22 @@ +{ + "displayName": "·Ä©·öô‡Øµ 2", + "description": "‡Øµ‡Ø±‡Ø∞‡ØØ", + "objects": [ + { + "objectName": "search1", + "displayName": "‡Øµ‡Ø±‡Ø∞‡ØØ - search 1", + "parentName": "BaseEvent", + "fields": [], + "calculations": [], + "constraints": [] + }, + { + "objectName": "search2", + "displayName": "‡Øµ‡Ø±‡Ø∞‡ØØ - search 2", + "parentName": "BaseEvent", + "fields": [], + "calculations": [], + "constraints": [] + } + ] +} \ No newline at end of file diff --git a/tests_spike/modularinputs/data/argument_with_defaults.xml b/tests_spike/modularinputs/data/argument_with_defaults.xml new file mode 100644 index 000000000..56a2e3dff --- /dev/null +++ b/tests_spike/modularinputs/data/argument_with_defaults.xml @@ -0,0 +1,5 @@ + + string + false + false + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/argument_without_defaults.xml b/tests_spike/modularinputs/data/argument_without_defaults.xml new file mode 100644 index 000000000..5560186ea --- /dev/null +++ b/tests_spike/modularinputs/data/argument_without_defaults.xml @@ -0,0 +1,7 @@ + + 쎼 and 쎶 and <&> für + is_pos_int('some_name') + boolean + true + true + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/conf_with_0_inputs.xml b/tests_spike/modularinputs/data/conf_with_0_inputs.xml new file mode 100644 index 000000000..4530a8b06 --- /dev/null +++ b/tests_spike/modularinputs/data/conf_with_0_inputs.xml @@ -0,0 +1,8 @@ + + + tiny + https://127.0.0.1:8089 + /some/dir + 123102983109283019283 + + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/conf_with_2_inputs.xml b/tests_spike/modularinputs/data/conf_with_2_inputs.xml new file mode 100644 index 000000000..99299a631 --- /dev/null +++ b/tests_spike/modularinputs/data/conf_with_2_inputs.xml @@ -0,0 +1,29 @@ + + + tiny + https://127.0.0.1:8089 + /some/dir + 123102983109283019283 + + + value1 + value2 + 0 + default + + + value11 + value22 + 0 + default + + value1 + value2 + + + value3 + value4 + + + + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/conf_with_5_inputs.xml b/tests_spike/modularinputs/data/conf_with_5_inputs.xml new file mode 100644 index 000000000..89309de8a --- /dev/null +++ b/tests_spike/modularinputs/data/conf_with_5_inputs.xml @@ -0,0 +1,55 @@ + + + tiny + https://127.0.0.1:8089 + /some/dir + 123102983109283019283 + + + value1 + value2 + 0 + default + + + value11 + value22 + 0 + default + + value1 + value2 + + + value3 + value4 + + + + value1 + value2 + 0 + default + + + value11 + value22 + 0 + default + + value1 + value2 + + + value3 + value4 + + + + value1 + value2 + 0 + default + + + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/conf_with_invalid_inputs.xml b/tests_spike/modularinputs/data/conf_with_invalid_inputs.xml new file mode 100644 index 000000000..879257f62 --- /dev/null +++ b/tests_spike/modularinputs/data/conf_with_invalid_inputs.xml @@ -0,0 +1,15 @@ + + + tiny + https://127.0.0.1:8089 + /opt/splunk/var/lib/splunk/modinputs + 123102983109283019283 + + + value1 + value2 + 0 + default + + + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/event_maximal.xml b/tests_spike/modularinputs/data/event_maximal.xml new file mode 100644 index 000000000..ba94e1e0f --- /dev/null +++ b/tests_spike/modularinputs/data/event_maximal.xml @@ -0,0 +1,9 @@ + + + hilda + misc + main + localhost + This is a test of the emergency broadcast system. + + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/event_minimal.xml b/tests_spike/modularinputs/data/event_minimal.xml new file mode 100644 index 000000000..7b743a385 --- /dev/null +++ b/tests_spike/modularinputs/data/event_minimal.xml @@ -0,0 +1,5 @@ + + + This is a test of the emergency broadcast system. + + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/scheme_with_defaults.xml b/tests_spike/modularinputs/data/scheme_with_defaults.xml new file mode 100644 index 000000000..0a17ac7e0 --- /dev/null +++ b/tests_spike/modularinputs/data/scheme_with_defaults.xml @@ -0,0 +1,11 @@ + + + abcd + true + false + xml + + + + + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/scheme_without_defaults.xml b/tests_spike/modularinputs/data/scheme_without_defaults.xml new file mode 100644 index 000000000..ef48af5fa --- /dev/null +++ b/tests_spike/modularinputs/data/scheme_without_defaults.xml @@ -0,0 +1,24 @@ + + + abcd + 쎼 and 쎶 and <&> für + false + true + simple + + + + string + false + false + + + 쎼 and 쎶 and <&> für + is_pos_int('some_name') + number + true + true + + + + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/stream_with_five_events.xml b/tests_spike/modularinputs/data/stream_with_five_events.xml new file mode 100644 index 000000000..35963c47f --- /dev/null +++ b/tests_spike/modularinputs/data/stream_with_five_events.xml @@ -0,0 +1,47 @@ + + + + hilda + misc + main + localhost + This is a test of the emergency broadcast system. 1 + + + + + hilda + misc + main + localhost + This is a test of the emergency broadcast system. 2 + + + + + hilda + misc + main + localhost + This is a test of the emergency broadcast system. 3 + + + + + hilda + misc + main + localhost + This is a test of the emergency broadcast system. 4 + + + + + hilda + misc + main + localhost + This is a test of the emergency broadcast system. 5 + + + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/stream_with_one_event.xml b/tests_spike/modularinputs/data/stream_with_one_event.xml new file mode 100644 index 000000000..91572cadb --- /dev/null +++ b/tests_spike/modularinputs/data/stream_with_one_event.xml @@ -0,0 +1,11 @@ + + + + hilda + misc + main + localhost + This is a test of the emergency broadcast system. + + + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/stream_with_two_events.xml b/tests_spike/modularinputs/data/stream_with_two_events.xml new file mode 100644 index 000000000..977c710cc --- /dev/null +++ b/tests_spike/modularinputs/data/stream_with_two_events.xml @@ -0,0 +1,20 @@ + + + + hilda + misc + main + localhost + This is a test of the emergency broadcast system. + + + + + hilda + misc + main + localhost + This is a test of the emergency broadcast system. + + + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/stream_with_two_json_events.xml b/tests_spike/modularinputs/data/stream_with_two_json_events.xml new file mode 100644 index 000000000..e466f249b --- /dev/null +++ b/tests_spike/modularinputs/data/stream_with_two_json_events.xml @@ -0,0 +1,20 @@ + + + + hilda + misc + main + localhost + {"some":"json"} + + + + + hilda + misc + main + localhost + {"some":"json object"} + + + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/validation.xml b/tests_spike/modularinputs/data/validation.xml new file mode 100644 index 000000000..b1341ee33 --- /dev/null +++ b/tests_spike/modularinputs/data/validation.xml @@ -0,0 +1,22 @@ + + + tiny + https://127.0.0.1:8089 + /opt/splunk/var/lib/splunk/modinputs + 123102983109283019283 + + + value1 + value2 + 0 + default + + value1 + value2 + + + value3 + value4 + + + \ No newline at end of file diff --git a/tests_spike/modularinputs/data/validation_error.xml b/tests_spike/modularinputs/data/validation_error.xml new file mode 100644 index 000000000..e119300e0 --- /dev/null +++ b/tests_spike/modularinputs/data/validation_error.xml @@ -0,0 +1 @@ +Big fat validation error! \ No newline at end of file diff --git a/tests_spike/modularinputs/index.js b/tests_spike/modularinputs/index.js new file mode 100644 index 000000000..78f036634 --- /dev/null +++ b/tests_spike/modularinputs/index.js @@ -0,0 +1,27 @@ + +// Copyright 2014 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. + +var splunkjs = require('../../index'); +splunkjs.Logger.setLevel("ALL"); + +// // Modular input tests +module.exports = ( + require('./test_event').setup(), + require('./test_input_definition').setup(), + require('./test_modularinput').setup(), + require('./test_scheme').setup(), + require('./test_validation_definition').setup() +) + diff --git a/tests_spike/modularinputs/test_event.js b/tests_spike/modularinputs/test_event.js new file mode 100644 index 000000000..34fcceba8 --- /dev/null +++ b/tests_spike/modularinputs/test_event.js @@ -0,0 +1,355 @@ + +// Copyright 2014 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. + +var assert = require('chai').assert; +var ET = require("elementtree"); + +var splunkjs = require('../../index'); +var testUtils = require("./utils"); + +exports.setup = function () { + var ModularInput = splunkjs.ModularInputs; + var Logger = splunkjs.ModularInputs.Logger; + var Event = ModularInput.Event; + var EventWriter = ModularInput.EventWriter; + var utils = ModularInput.utils; + + splunkjs.Logger.setLevel("ALL"); + + function compareEvents(expected, found) { + assert.ok(testUtils.XMLCompare(expected, found)); + assert.equal(expected.tag.trim(), found.tag.trim()); + assert.equal(expected.text.trim(), found.text.trim()); + assert.equal(expected.tail, found.tail); + assert.equal(expected.attrib.stanza, found.attrib.stanza); + assert.equal(expected.attrib.unbroken, found.attrib.unbroken); + assert.equal(expected._children.length, found._children.length); + if (expected._children.length > 0) { + testChildren(expected, found); + } + } + + function testChildren(expected, found) { + // Sort the children by tag name + var expectedChildren = testUtils.sortByKey(expected._children, "tag"); + var foundChildren = testUtils.sortByKey(found._children, "tag"); + + for (var i = 0; i < foundChildren.length; i++) { + var f = foundChildren[i]; + var ex = expectedChildren[i]; + assert.equal(ex.tag.trim(), f.tag.trim()); + assert.equal(ex.text.trim(), f.text.trim()); + assert.equal(ex.tail.trim(), f.tail.trim()); + assert.deepEqual(ex.attrib, f.attrib); + assert.equal(ex._children.length, f._children.length); + } + } + + return ( + describe("Event tests", function () { + this.beforeEach(function (done) { + done(); + }); + + it("Event class handles times correctly - Date object", function (done) { + var now = Date.now(); + var expected = (now / 1000).toFixed(3); + var found = Event.formatTime(now); + assert.equal(found, expected); + + var old = new Date(1372187084); + var oldExpected = (1372187084000 / 1000).toFixed(3); + var oldFound = Event.formatTime(old); + assert.equal(oldFound, oldExpected); + + var other = Date.parse("2014-04-11T19:41:32Z"); + var otherExpected = (1397245292000 / 1000).toFixed(3); + var otherFound = Event.formatTime(other); + assert.equal(otherFound, otherExpected); + + done(); + }); + + it("Event class handles times correctly - String", function (done) { + // Test time in seconds + var stringTime = "1372187084"; + var expected = 1372187084.000; + var found = Event.formatTime(stringTime); + assert.equal(found, expected); + + // Test a super small time, 4 seconds since the epoch + var tinyStringTime = "4"; + expected = 4.000; + found = Event.formatTime(tinyStringTime); + assert.equal(found, expected); + + // Test the time in milliseconds + var milliStringTime = "1372187084000"; + expected = 1372187084.000; + found = Event.formatTime(milliStringTime); + assert.equal(found, expected); + + // Test a huge integer value, just get the first 14 digits + var hugeStringTime = "13721870840001234"; + expected = 1372187084.000; + found = Event.formatTime(hugeStringTime); + assert.equal(found, expected); + + // Test a value starting with zeros + var leadingZeroStringTime = "000000000137218.442"; + expected = 137218.442; + found = Event.formatTime(leadingZeroStringTime); + assert.equal(found, expected); + + done(); + }); + + it("Event class handles times correctly - Number (integer)", function (done) { + // Test time in seconds + var intTime = 1372187084; + var expected = 1372187084.000; + var found = Event.formatTime(intTime); + assert.equal(found, expected); + + // Test a super small time, 4 seconds since the epoch + var tinyIntTime = 4; + expected = 4.000; + found = Event.formatTime(tinyIntTime); + assert.equal(found, expected); + + // Test the time in milliseconds + var milliIntTime = 1372187084000; + expected = 1372187084.000; + found = Event.formatTime(milliIntTime); + assert.equal(found, expected); + + // Test a huge integer value, just get the first 14 digits + var hugeIntTime = 13721870840001234; + expected = 1372187084.000; + found = Event.formatTime(hugeIntTime); + assert.equal(found, expected); + + done(); + }); + + it("Event class handles times correctly - Number (float)", function (done) { + // Test a perfect value + var floatTime = 1372187084.424; + var expected = 1372187084.424; + var found = Event.formatTime(floatTime); + assert.equal(found, expected); + + // Test a really long decimal value + var longDecimalFloatTime = 1372187084.424242425350823423423; + expected = 1372187084.424; + found = Event.formatTime(longDecimalFloatTime); + assert.equal(found, expected); + + // Test a date far into the future + var crazyFloatTime = 13721874084.424242425350823423423; + expected = 13721874084.420; + found = Event.formatTime(crazyFloatTime); + assert.equal(found, expected); + + // Test a really really far into the future + var crazyFloatTime2 = 1372187084555.424242425350823423423; + expected = 1372187084555.000; + found = Event.formatTime(crazyFloatTime2); + assert.equal(found, expected); + + // Test a slightly crazy value + var crazyFloatTime3 = 137218.424242425350823423423; + expected = 137218.424; + found = Event.formatTime(crazyFloatTime3); + assert.equal(found, expected); + + // Test a tiny value + var crazyFloatTime5 = 4.001234235; + expected = 4.001; + found = Event.formatTime(crazyFloatTime5); + assert.equal(found, expected); + + done(); + }); + + it("Event without enough fields throws error", function (done) { + try { + var myEvent = new Event(); + myEvent._writeTo(testUtils.getDuplexStream()); + assert.ok(false); // This should not execute if an error is thrown by `Event._writeTo` + } + catch (e) { + assert.equal(e.message, "Events must have at least the data field set to be written to XML."); + assert.ok(e); + } + done(); + }); + + it("Event with minimal config matches expected XML", function (done) { + var out = testUtils.getDuplexStream(); + + var myEvent = new Event({ + data: "This is a test of the emergency broadcast system.", + stanza: "fubar", + time: 1372187084.000 + }); + + var expectedEvent = utils.readFile(__filename, "../data/event_minimal.xml"); + + try { + myEvent._writeTo(out); + var found = ET.parse(out._read()).getroot(); + var expected = ET.parse(expectedEvent).getroot(); + compareEvents(expected, found); + } + catch (e) { + Logger.error("", "Something happened!", e); + assert.ok(false); + } + done(); + }); + + it("Event with full config matches expected XML", function (done) { + var out = testUtils.getDuplexStream(); + + var myEvent = new Event({ + data: "This is a test of the emergency broadcast system.", + stanza: "fubar", + time: 1372274622.493, + host: "localhost", + index: "main", + source: "hilda", + sourcetype: "misc", + done: true, + unbroken: true + }); + + var expectedEvent = utils.readFile(__filename, "../data/event_maximal.xml"); + + try { + myEvent._writeTo(out); + var found = ET.parse(out._read()).getroot(); + var expected = ET.parse(expectedEvent).getroot(); + assert.ok(testUtils.XMLCompare(expected, found)); + compareEvents(expected, found); + } + catch (e) { + assert.ok(false); + } + done(); + }); + + it("EventWriter event writing works", function (done) { + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + + var myEvent = new Event({ + data: "This is a test of the emergency broadcast system.", + stanza: "fubar", + time: 1372275124.466, + host: "localhost", + index: "main", + source: "hilda", + sourcetype: "misc", + done: true, + unbroken: true + }); + + var expectedOne = utils.readFile(__filename, "../data/stream_with_one_event.xml"); + var expectedTwo = utils.readFile(__filename, "../data/stream_with_two_events.xml"); + + var ew = new EventWriter(out, err); + + try { + ew.writeEvent(myEvent); + var found = ET.parse(ew._out._read() + "").getroot(); + var expected = ET.parse(expectedOne).getroot(); + assert.ok(testUtils.XMLCompare(expected, found)); + compareEvents(expected, found); + + ew.writeEvent(myEvent); + ew.close(); + + found = ET.parse(ew._out._read()).getroot(); + expected = ET.parse(expectedTwo).getroot(); + assert.ok(testUtils.XMLCompare(expected, found)); + compareEvents(expected, found); + } + catch (e) { + assert.ok(false); + } + done(); + }); + + it("EventWriter gets an error from invalid Event", function (done) { + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + + var ew = new EventWriter(out, err); + + try { + ew.writeEvent(new Event()); + assert.ok(false); // This should not execute if an error is thrown by `EventWriter.writeEvent` + } + catch (e) { + assert.ok(e); + assert.ok(utils.startsWith(ew._err._read(), Logger.WARN)); + } + done(); + }); + + it("EventWriter logging works", function (done) { + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + + var ew = new EventWriter(out, err); + + try { + Logger.error("", "Something happened!", err); + assert.ok(utils.startsWith(ew._err._read(), Logger.ERROR)); + } + catch (e) { + assert.ok(false); + } + done(); + }); + + it("EventWriter XML writing works", function (done) { + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + + var ew = new EventWriter(out, err); + + var expected = ET.parse(utils.readFile(__filename, "../data/event_minimal.xml")).getroot(); + + try { + ew.writeXMLDocument(expected); + var found = ET.parse(ew._out._read()).getroot(); + assert.ok(testUtils.XMLCompare(expected, found)); + compareEvents(expected, found); + } + catch (e) { + assert.ok(false); + } + done(); + }); + }) + ) +}; + +// Run the individual test suite +if (module === require.cache[__filename] && !module.parent) { + module.exports = exports.setup(); +} diff --git a/tests_spike/modularinputs/test_input_definition.js b/tests_spike/modularinputs/test_input_definition.js new file mode 100644 index 000000000..af44e67cb --- /dev/null +++ b/tests_spike/modularinputs/test_input_definition.js @@ -0,0 +1,132 @@ + +// Copyright 2014 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. + +var assert = require('chai').assert; + +const { Logger } = require("../../lib/log"); +var splunkjs = require('../../index'); + +exports.setup = function () { + var ModularInputs = splunkjs.ModularInputs; + var InputDefinition = ModularInputs.InputDefinition; + var utils = ModularInputs.utils; + + splunkjs.Logger.setLevel("ALL"); + + return ( + describe("Input Definition tests", function (done) { + this.beforeEach(function (done) { + done(); + }); + + it("Parse produces expected result - no inputs", function (done) { + var expected = new InputDefinition(); + expected.metadata = { + "server_host": "tiny", + "server_uri": "https://127.0.0.1:8089", + "checkpoint_dir": "/some/dir", + "session_key": "123102983109283019283" + }; + + try { + var found = InputDefinition.parse(utils.readFile(__filename, "../data/conf_with_0_inputs.xml")); + + assert.equal(found.metadata["server_host"], expected.metadata["server_host"]); + assert.equal(found.metadata["server_uri"], expected.metadata["server_uri"]); + assert.equal(found.metadata["checkpoint_dir"], expected.metadata["checkpoint_dir"]); + assert.equal(found.metadata["session_key"], expected.metadata["session_key"]); + assert.deepEqual(found, expected); + } + catch (e) { + Logger.info(JSON.stringify(e)); + assert.ok(false); + } + done(); + }); + + it("Parse produces expected result - 2 inputs", function (done) { + var expected = new InputDefinition(); + expected.metadata = { + "server_host": "tiny", + "server_uri": "https://127.0.0.1:8089", + "checkpoint_dir": "/some/dir", + "session_key": "123102983109283019283" + }; + expected.inputs["foobar://aaa"] = { + "param1": "value1", + "param2": "value2", + "disabled": "0", + "index": "default" + }; + expected.inputs["foobar://bbb"] = { + "param1": "value11", + "param2": "value22", + "disabled": "0", + "index": "default", + "multiValue": ["value1", "value2"], + "multiValue2": ["value3", "value4"] + }; + + try { + var found = InputDefinition.parse(utils.readFile(__filename, "../data/conf_with_2_inputs.xml")); + + assert.equal(found.metadata["server_host"], expected.metadata["server_host"]); + assert.equal(found.metadata["server_uri"], expected.metadata["server_uri"]); + assert.equal(found.metadata["checkpoint_dir"], expected.metadata["checkpoint_dir"]); + assert.equal(found.metadata["session_key"], expected.metadata["session_key"]); + + assert.deepEqual(found.inputs["foobar://bbb"], expected.inputs["foobar://bbb"]); + assert.equal(found.inputs["foobar://bbb"]["param1"], expected.inputs["foobar://bbb"]["param1"]); + assert.equal(found.inputs["foobar://bbb"]["param2"], expected.inputs["foobar://bbb"]["param2"]); + assert.equal(found.inputs["foobar://bbb"]["disabled"], expected.inputs["foobar://bbb"]["disabled"]); + assert.equal(found.inputs["foobar://bbb"]["index"], expected.inputs["foobar://bbb"]["index"]); + + assert.deepEqual(found.inputs["foobar://bbb"], expected.inputs["foobar://bbb"]); + assert.equal(found.inputs["foobar://bbb"]["param1"], expected.inputs["foobar://bbb"]["param1"]); + assert.equal(found.inputs["foobar://bbb"]["param2"], expected.inputs["foobar://bbb"]["param2"]); + assert.equal(found.inputs["foobar://bbb"]["disabled"], expected.inputs["foobar://bbb"]["disabled"]); + assert.equal(found.inputs["foobar://bbb"]["index"], expected.inputs["foobar://bbb"]["index"]); + assert.deepEqual(found.inputs["foobar://bbb"]["multiValue"], expected.inputs["foobar://bbb"]["multiValue"]); + assert.equal(found.inputs["foobar://bbb"]["multiValue"][0], expected.inputs["foobar://bbb"]["multiValue"][0]); + assert.equal(found.inputs["foobar://bbb"]["multiValue"][1], expected.inputs["foobar://bbb"]["multiValue"][1]); + assert.deepEqual(found.inputs["foobar://bbb"]["multiValue2"], expected.inputs["foobar://bbb"]["multiValue2"]); + assert.equal(found.inputs["foobar://bbb"]["multiValue2"][0], expected.inputs["foobar://bbb"]["multiValue2"][0]); + assert.equal(found.inputs["foobar://bbb"]["multiValue2"][1], expected.inputs["foobar://bbb"]["multiValue2"][1]); + + assert.deepEqual(found, expected); + } + catch (e) { + assert.ok(false); + } + done(); + }); + + it("Parse throws an error with malformed input definition", function (done) { + try { + InputDefinition.parse(utils.readFile(__filename, "../data/conf_with_invalid_inputs.xml")); + assert.ok(false); + } + catch (e) { + assert.ok(true); + } + done(); + }); + }) + ) +} +// Run the individual test suite +if (module === require.cache[__filename] && !module.parent) { + module.exports = exports.setup(); +} diff --git a/tests_spike/modularinputs/test_modularinput.js b/tests_spike/modularinputs/test_modularinput.js new file mode 100644 index 000000000..3c2e5f59c --- /dev/null +++ b/tests_spike/modularinputs/test_modularinput.js @@ -0,0 +1,728 @@ + +// Copyright 2014 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. + +var assert = require('chai').assert; +var ET = require("elementtree"); + +var splunkjs = require("../../index"); +var testUtils = require("./utils"); + +exports.setup = function () { + var ModularInputs = splunkjs.ModularInputs; + var Logger = ModularInputs.Logger; + var ModularInput = ModularInputs.ModularInput; + var Event = ModularInputs.Event; + var EventWriter = ModularInputs.EventWriter; + var Scheme = ModularInputs.Scheme; + var Argument = ModularInputs.Argument; + var utils = ModularInputs.utils; + + splunkjs.Logger.setLevel("ALL"); + + var TEST_SCRIPT_PATH = "__IGNORED_SCRIPT_PATH__"; + + return ( + describe("ModularInput tests", function (done) { + this.beforeEach(function (done) { + done(); + }); + + it("ModularInputs logger works, severity: DEBUG", function (done) { + var err = testUtils.getDuplexStream(); + try { + Logger.debug("Modular Input Tests", "Something happened!", err); + assert.ok(utils.startsWith(err._read(), Logger.DEBUG)); + } + catch (e) { + assert.ok(false); + } + done(); + }); + + it("ModularInputs logger works, severity: INFO", function (done) { + var err = testUtils.getDuplexStream(); + try { + Logger.info("Modular Input Tests", "Something happened!", err); + assert.ok(utils.startsWith(err._read(), Logger.INFO)); + } + catch (e) { + assert.ok(false); + } + done(); + }); + + it("ModularInputs logger works, severity: WARN", function (done) { + var err = testUtils.getDuplexStream(); + try { + Logger.warn("Modular Input Tests", "Something happened!", err); + assert.ok(utils.startsWith(err._read(), Logger.WARN)); + } + catch (e) { + assert.ok(false); + } + done(); + }); + + it("ModularInputs logger works, severity: ERROR", function (done) { + var err = testUtils.getDuplexStream(); + try { + Logger.error("Modular Input Tests", "Something happened!", err); + assert.ok(utils.startsWith(err._read(), Logger.ERROR)); + } + catch (e) { + assert.ok(false); + } + done(); + }); + + it("ModularInputs logger works, severity: FATAL", function (done) { + var err = testUtils.getDuplexStream(); + try { + Logger.fatal("Modular Input Tests", "Something happened!", err); + assert.ok(utils.startsWith(err._read(), Logger.FATAL)); + } + catch (e) { + assert.ok(false); + } + done(); + }); + + it("An error happens when a ModularInput gets bad args", function (done) { + // A script that returns a null scheme should generate no output on stdout + // and an error on stderr saying that the scheme was null. + + exports.getScheme = function () { + return null; + }; + + exports.streamEvents = function () { + // Not used + return null; + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var inStream = testUtils.getReadableStream(); + + var args = [TEST_SCRIPT_PATH, "foobar"]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + var error = ew._err._read(); + + assert.ok(utils.startsWith(error, "ERROR Modular input Invalid arguments to modular input script:")); + assert.strictEqual(1, scriptStatus); + done(); + }); + }); + + it("An error happens when a ModularInput has a null scheme", function (done) { + // A script that returns a null scheme should generate no output on stdout + // and an error on stderr saying that the scheme was null. + + exports.getScheme = function () { + return null; + }; + + exports.streamEvents = function () { + // Not used + return null; + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var inStream = testUtils.getReadableStream(); + + var args = [TEST_SCRIPT_PATH, "--scheme"]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + var error = ew._err._read(); + + assert.strictEqual(error, "FATAL Modular input script returned a null scheme.\n"); + assert.strictEqual(1, scriptStatus); + done(); + }); + }); + + it("ModularInput properly generates Scheme", function (done) { + // Check that a scheme generated by a script is what we expect. + + exports.getScheme = function () { + var scheme = new Scheme("abcd"); + scheme.description = "\uC3BC and \uC3B6 and <&> f\u00FCr"; + scheme.streamingMode = Scheme.streamingModeSimple; + scheme.useExternalValidation = false; + scheme.useSingleInstance = true; + + var arg1 = new Argument("arg1"); + scheme.addArgument(arg1); + + var arg2 = new Argument("arg2"); + arg2.description = "\uC3BC and \uC3B6 and <&> f\u00FCr"; + arg2.dataType = Argument.dataTypeNumber; + arg2.requiredOnCreate = true; + arg2.requiredOnEdit = true; + arg2.validation = "is_pos_int('some_name')"; + scheme.addArgument(arg2); + + return scheme; + }; + + exports.streamEvents = function () { + // Not used + return null; + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var inStream = testUtils.getReadableStream(); + + var args = [TEST_SCRIPT_PATH, "--scheme"]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + var expected = utils.readFile(__filename, "../data/scheme_without_defaults.xml"); + var output = ew._out._read(); + + assert.ok(testUtils.XMLCompare(ET.parse(expected), ET.parse(output))); + assert.strictEqual("", ew._err._read()); + assert.strictEqual(0, scriptStatus); + done(); + }); + }); + + it("ModularInput Input Validation succeeds", function (done) { + exports.getScheme = function () { + return null; + }; + + exports.validateInput = function (definition, done) { + // Always succeed + done(); + }; + + exports.streamEvents = function () { + // not used + return; + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var validationFile = utils.readFile(__filename, "../data/validation.xml"); + + var inStream = testUtils.getReadableStream(); + + var args = [TEST_SCRIPT_PATH, "--validate-arguments"]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + assert.ok(!err); + + assert.strictEqual("", ew._out._read()); + assert.strictEqual("", ew._err._read()); + assert.strictEqual(0, scriptStatus); + done(); + }); + inStream.emit("data", Buffer.from(validationFile)); + }); + + it("ModularInput Input Validation succeeds when validateInput is undefined", function (done) { + exports.getScheme = function () { + return null; + }; + + exports.validateInput = undefined; + + exports.streamEvents = function () { + // not used + return; + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var validationFile = utils.readFile(__filename, "../data/validation.xml"); + + var inStream = testUtils.getReadableStream(); + + var args = [TEST_SCRIPT_PATH, "--validate-arguments"]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + assert.ok(!err); + + assert.strictEqual("", ew._out._read()); + assert.strictEqual("", ew._err._read()); + assert.strictEqual(0, scriptStatus); + done(); + }); + inStream.emit("data", Buffer.from(validationFile)); + }); + + it("ModularInput Input Validation times out after 30s with impartial XML", function (done) { + + this.timeout(40000); + exports.getScheme = function () { + return null; + }; + + exports.validateInput = function () { + return; + }; + exports.validateInput = undefined; + + exports.streamEvents = function () { + // not used + return; + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var validationFile = utils.readFile(__filename, "../data/validation.xml"); + + var inStream = testUtils.getReadableStream(); + + var startTime = Date.now(); + + var args = [TEST_SCRIPT_PATH, "--validate-arguments"]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + assert.ok(err); + assert.strictEqual("Receiving validation definition prior to validating timed out.", err.message); + + assert.ok(Date.now() - startTime >= 30000); // Make sure it times out only after 30 seconds + assert.strictEqual("", ew._out._read()); + assert.strictEqual("", ew._err._read()); + assert.strictEqual(1, scriptStatus); + done(); + }); + // Remove the closing tag to send impartial data + inStream.emit("data", Buffer.from(validationFile.replace("", ""))); + }); + + it("ModularInput Input Validation fails", function (done) { + // Make logger noop so testoutput is cleaner + var loggerErrorBackup = Logger.error; + Logger.error = function () { }; + + exports.getScheme = function () { + return null; + }; + + exports.validateInput = function (definition, done) { + done(new Error("Big fat validation error!")); + }; + + exports.streamEvents = function () { + // not used + return; + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var inStream = testUtils.getReadableStream(); + + var validationFile = utils.readFile(__filename, "../data/validation.xml"); + + var args = [TEST_SCRIPT_PATH, "--validate-arguments"]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + assert.ok(err); + var output = ew._out._read(); + + var expected = ET.parse(utils.readFile(__filename, "../data/validation_error.xml")).getroot(); + var found = ET.parse(output).getroot(); + + assert.strictEqual(expected.tag, found.tag); + assert.strictEqual(expected.text.trim(), found.text.trim()); + assert.strictEqual(expected.tail, found.tail); + assert.strictEqual(expected.getchildren().length, found.getchildren().length); + + var expectedChildren = expected.getchildren(); + var foundChildren = found.getchildren(); + for (var i = 0; i < expectedChildren.length; i++) { + var expectedchild = expectedChildren[i]; + var foundChild = foundChildren[i]; + assert.strictEqual(expectedchild.tag, foundChild.tag); + assert.strictEqual(expectedchild.text.trim(), foundChild.text.trim()); + assert.strictEqual(expectedchild.tail, foundChild.tail); + } + + assert.ok(testUtils.XMLCompare(expected, found)); + assert.strictEqual("", ew._err._read()); + assert.strictEqual(1, scriptStatus); + done(); + }); + inStream.emit("data", Buffer.from(validationFile)); + }); + + it("ModularInput streaming events works - 2 inputs", function (done) { + exports.getScheme = function () { + return null; + }; + + exports.streamEvents = function (name, input, eventWriter, callback) { + var myEvent = new Event({ + data: "This is a test of the emergency broadcast system.", + stanza: "fubar", + time: 1372275124.466, + host: "localhost", + index: "main", + source: "hilda", + sourcetype: "misc", + done: true, + unbroken: true + }); + + try { + eventWriter.writeEvent(myEvent); + callback(null); + } + catch (e) { + callback(e); + } + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var inStream = testUtils.getReadableStream(); + + var inputConfiguration = utils.readFile(__filename, "../data/conf_with_2_inputs.xml"); + + var args = [TEST_SCRIPT_PATH]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + assert.ok(!err); + + var expected = utils.readFile(__filename, "../data/stream_with_two_events.xml"); + var found = ew._out._read(); + assert.ok(testUtils.XMLCompare(ET.parse(expected).getroot(), ET.parse(found).getroot())); + assert.strictEqual(0, scriptStatus); + done(); + }); + inStream.emit("data", Buffer.from(inputConfiguration)); + }); + + it("ModularInput streaming events works - 5 inputs", function (done) { + exports.getScheme = function () { + return null; + }; + + var num = 1; + exports.streamEvents = function (name, input, eventWriter, callback) { + var myEvent = new Event({ + data: "This is a test of the emergency broadcast system. " + num, + stanza: "fubar", + time: 1372275124.466, + host: "localhost", + index: "main", + source: "hilda", + sourcetype: "misc", + done: true, + unbroken: true + }); + + try { + eventWriter.writeEvent(myEvent); + num++; + callback(null); + } + catch (e) { + callback(e); + } + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var inStream = testUtils.getReadableStream(); + + var inputConfiguration = utils.readFile(__filename, "../data/conf_with_5_inputs.xml"); + + var args = [TEST_SCRIPT_PATH]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + assert.ok(!err); + + var expected = utils.readFile(__filename, "../data/stream_with_five_events.xml"); + var found = ew._out._read(); + + var expectedChildren = ET.parse(expected).getroot().getchildren(); + var foundChildren = ET.parse(found).getroot().getchildren(); + + // Loop through instead of comparing to hardcoded XML, since + // streamEvents() will be called several times in parallel + // and the events MAY not get streamed in the order they're sent. + var totalFound = 0; + // We're expecting 5 events to have data ending in a different value between 1 and 5 + for (var i = 1; i <= 5; i++) { + // Iterate over the individual events + for (var c = 0; c < foundChildren.length; c++) { + // Iterate over the tags of the current event + var tags = foundChildren[c].getchildren(); + for (var t = 0; t < tags.length; t++) { + // When we find the tag, read the text and check if it ends with the current value we're looking for + // between 1 and 5 + if (tags[t].tag === "data") { + if (tags[t].text.indexOf("This is a test of the emergency broadcast system. " + i) >= 0) { + totalFound++; + i++; + } + } + } + } + } + + assert.equal(5, totalFound); // Did we find as many events as we expected? + assert.equal(5, expectedChildren.length); + assert.equal(expectedChildren.length, foundChildren.length); + + assert.ok(testUtils.XMLCompare(ET.parse(expected).getroot(), ET.parse(found).getroot())); + assert.strictEqual(0, scriptStatus); + done(); + }); + inStream.emit("data", Buffer.from(inputConfiguration)); + }); + + it("ModularInput streaming events works - as object", function (done) { + exports.getScheme = function () { + return null; + }; + + var asObject = false; + exports.streamEvents = function (name, input, eventWriter, callback) { + var myEvent = new Event({ + data: "{\"some\":\"json\"}", + stanza: "fubar", + time: 1372275124.466, + host: "localhost", + index: "main", + source: "hilda", + sourcetype: "misc", + done: true, + unbroken: true + }); + + if (asObject) { + myEvent.data = { some: "json object" }; // Write a JS object + } + + try { + eventWriter.writeEvent(myEvent); + asObject = true; + callback(null); + } + catch (e) { + callback(e); + } + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var inStream = testUtils.getReadableStream(); + + var inputConfiguration = utils.readFile(__filename, "../data/conf_with_2_inputs.xml"); + + var args = [TEST_SCRIPT_PATH]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + assert.ok(!err); + + var expected = utils.readFile(__filename, "../data/stream_with_two_json_events.xml"); + var found = ew._out._read(); + + assert.ok(asObject); + assert.ok(testUtils.XMLCompare(ET.parse(expected).getroot(), ET.parse(found).getroot())); + assert.strictEqual(0, scriptStatus); + done(); + }); + inStream.emit("data", Buffer.from(inputConfiguration)); + }); + + it("ModularInput streaming events times out after 30s with impartial XML", function (done) { + + this.timeout(40000); + exports.getScheme = function () { + return null; + }; + + exports.streamEvents = function (name, input, eventWriter, callback) { + var myEvent = new Event({ + data: "This is a test of the emergency broadcast system.", + stanza: "fubar", + time: 1372275124.466, + host: "localhost", + index: "main", + source: "hilda", + sourcetype: "misc", + done: true, + unbroken: true + }); + + try { + eventWriter.writeEvent(myEvent); + callback(null); + } + catch (e) { + callback(e); + } + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var inStream = testUtils.getReadableStream(); + + var inputConfiguration = utils.readFile(__filename, "../data/conf_with_2_inputs.xml"); + + var startTime = Date.now(); + + var args = [TEST_SCRIPT_PATH]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + assert.ok(err); + assert.strictEqual("Receiving input definitions prior to streaming timed out.", err.message); + + assert.ok(Date.now() - startTime >= 30000); // Make sure it times out only after 30 seconds + assert.strictEqual("", ew._out._read()); + assert.strictEqual("", ew._err._read()); + assert.strictEqual(1, scriptStatus); + done(); + }); + // Remove the closing tag to send impartial data + inStream.emit("data", Buffer.from(inputConfiguration.replace("", ""))); + }); + + it("ModularInput streaming events times out after 30s with no data sent", function (done) { + + this.timeout(40000); + exports.getScheme = function () { + return null; + }; + + exports.streamEvents = function (name, input, eventWriter, callback) { + return; + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var inStream = testUtils.getReadableStream(); + + var inputConfiguration = utils.readFile(__filename, "../data/conf_with_2_inputs.xml"); + + var startTime = Date.now(); + + var args = [TEST_SCRIPT_PATH]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + assert.ok(err); + assert.strictEqual("Receiving input definitions prior to streaming timed out.", err.message); + + assert.ok(Date.now() - startTime >= 30000); // Make sure it times out only after 30 seconds + assert.strictEqual("", ew._out._read()); + assert.strictEqual("", ew._err._read()); + assert.strictEqual(1, scriptStatus); + done(); + }); + }); + + it("ModularInput streaming events times out after 30s with data sent after 30s", function (done) { + + this.timeout(40000); + exports.getScheme = function () { + return null; + }; + + exports.streamEvents = function (name, input, eventWriter, callback) { + return; + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var inStream = testUtils.getReadableStream(); + + var inputConfiguration = utils.readFile(__filename, "../data/conf_with_2_inputs.xml"); + + var startTime = Date.now(); + + // Emit the data 1.5 seconds after the timeout threshold + setTimeout(function () { + inStream.emit("data", Buffer.from(inputConfiguration)); + done(); + }, 32000); + + var args = [TEST_SCRIPT_PATH]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + assert.ok(err); + assert.strictEqual("Receiving input definitions prior to streaming timed out.", err.message); + + assert.ok(Date.now() - startTime >= 30000); // Make sure it times out only after 30 seconds + assert.strictEqual("", ew._out._read()); + assert.strictEqual("", ew._err._read()); + assert.strictEqual(1, scriptStatus); + }); + }); + + it("ModularInput gets a valid Service", function (done) { + exports.getScheme = function () { + return null; + }; + + exports.validateInput = function (definition) { + return null; + }; + + exports.streamEvents = function (name, input, eventWriter, callback) { + var service = ModularInput.service(); + + assert.ok(service instanceof splunkjs.Service); + assert.strictEqual(service.prefix, this._inputDefinition.metadata["server_uri"]); + callback(null); + }; + + var out = testUtils.getDuplexStream(); + var err = testUtils.getDuplexStream(); + var ew = new EventWriter(out, err); + + var inStream = testUtils.getReadableStream(); + + var inputConfiguration = utils.readFile(__filename, "../data/conf_with_2_inputs.xml"); + + assert.ok(utils.isUndefined(ModularInput._service)); + + var args = [TEST_SCRIPT_PATH]; + ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { + assert.ok(!err); + assert.strictEqual("", ew._err._read()); + assert.strictEqual(0, scriptStatus); + done(); + }); + inStream.emit("data", Buffer.from(inputConfiguration)); + }); + }) + ) +}; + +// Run the individual test suite +if (module === require.cache[__filename] && !module.parent) { + module.exports = exports.setup(); +} diff --git a/tests_spike/modularinputs/test_scheme.js b/tests_spike/modularinputs/test_scheme.js new file mode 100644 index 000000000..3d147753f --- /dev/null +++ b/tests_spike/modularinputs/test_scheme.js @@ -0,0 +1,151 @@ + +// Copyright 2014 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. + +var assert = require('chai').assert; +var ET = require("elementtree"); + +var splunkjs = require('../../index'); +var testUtils = require("./utils"); + +exports.setup = function () { + var ModularInput = splunkjs.ModularInputs; + var Scheme = ModularInput.Scheme; + var Argument = ModularInput.Argument; + var utils = ModularInput.utils; + + splunkjs.Logger.setLevel("ALL"); + + return ( + describe("Scheme tests", function () { + + it("Generate XML from scheme with default values", function () { + // Checks the Scheme generated by creating a Scheme object and setting no fields on it. + // This test checks for sane defaults in the Scheme class. + + var myScheme = new Scheme("abcd"); + + var constructed = myScheme.toXML(); + var expected = ET.parse(utils.readFile(__filename, "../data/scheme_with_defaults.xml")).getroot(); + + assert.equal(myScheme.title, "abcd"); + assert.equal(myScheme.description, null); + assert.equal(myScheme.useExternalValidation, true); + assert.equal(myScheme.useSingleInstance, false); + assert.equal(myScheme.streamingMode, Scheme.streamingModeXML); + assert.ok(testUtils.XMLCompare(expected, constructed)); + ; + }); + + it("Generate XML from scheme", function () { + // Checks that the XML generated by a Scheme object with all its fields set and + // some arguments added matches what we expect + + var myScheme = new Scheme("abcd"); + myScheme.description = "쎼 and 쎶 and <&> für"; + myScheme.streamingMode = Scheme.streamingModeSimple; + myScheme.useExternalValidation = false; + myScheme.useSingleInstance = true; + + assert.equal(myScheme.title, "abcd"); + assert.equal(myScheme.description, "쎼 and 쎶 and <&> für"); + assert.equal(myScheme.streamingMode, Scheme.streamingModeSimple); + assert.equal(myScheme.useExternalValidation, false); + assert.equal(myScheme.useSingleInstance, true); + + var arg1 = new Argument({ + name: "arg1" + }); + myScheme.addArgument(arg1); + + assert.equal(myScheme.args[0].name, arg1.name); + assert.equal(myScheme.args[0].requiredOnEdit, arg1.requiredOnEdit); + assert.equal(myScheme.args[0].requiredOnCreate, arg1.requiredOnCreate); + + var arg2 = new Argument({ + name: "arg2", + description: "쎼 and 쎶 and <&> für", + validation: "is_pos_int('some_name')", + dataType: Argument.dataTypeNumber, + requiredOnEdit: true, + requiredOnCreate: true + }); + myScheme.addArgument(arg2); + + assert.equal(myScheme.args[1].name, arg2.name); + assert.equal(myScheme.args[1].requiredOnEdit, arg2.requiredOnEdit); + assert.equal(myScheme.args[1].requiredOnCreate, arg2.requiredOnCreate); + + assert.equal(myScheme.args.length, 2); + + var constructed = myScheme.toXML(); + var expected = ET.parse(utils.readFile(__filename, "../data/scheme_without_defaults.xml")).getroot(); + + assert.ok(testUtils.XMLCompare(expected, constructed)); + ; + }); + + it("Generate XML from argument with default values", function () { + // Checks that the XML produced from an Argument object that is initialized has + // is what we expect. This is mostly a check of the default values. + + var myArg = new Argument({ name: "some_name" }); + + var root = ET.Element(""); + var constructed = myArg.addToDocument(root); + + var expected = ET.parse(utils.readFile(__filename, "../data/argument_with_defaults.xml")).getroot(); + + assert.equal(myArg.name, "some_name"); + assert.equal(myArg.requiredOnEdit, false); + assert.equal(myArg.requiredOnCreate, false); + assert.ok(testUtils.XMLCompare(expected, constructed)); + ; + }); + + it("Generate XML from argument", function () { + // Checks that the XML generated by an Argument object with all possible set matches what + // we expect. + + var myArg = new Argument({ + name: "some_name", + description: "쎼 and 쎶 and <&> für", + validation: "is_pos_int('some_name')", + dataType: Argument.dataTypeBoolean, + requiredOnEdit: true, + requiredOnCreate: true + }); + + assert.equal(myArg.name, "some_name"); + assert.equal(myArg.description, "쎼 and 쎶 and <&> für"); + assert.equal(myArg.validation, "is_pos_int('some_name')"); + assert.equal(myArg.dataType, Argument.dataTypeBoolean); + assert.equal(myArg.requiredOnEdit, true); + assert.equal(myArg.requiredOnCreate, true); + + var root = ET.Element(""); + var constructed = myArg.addToDocument(root); + + var expected = ET.parse(utils.readFile(__filename, "../data/argument_without_defaults.xml")).getroot(); + assert.ok(testUtils.XMLCompare(expected, constructed)); + ; + }); + }) + ); +}; + +// Run the individual test suite +if (module === require.cache[__filename] && !module.parent) { + module.exports = exports.setup(); +} diff --git a/tests_spike/modularinputs/test_validation_definition.js b/tests_spike/modularinputs/test_validation_definition.js new file mode 100644 index 000000000..658514106 --- /dev/null +++ b/tests_spike/modularinputs/test_validation_definition.js @@ -0,0 +1,90 @@ + +// Copyright 2014 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. + +var assert = require('chai').assert; + +var splunkjs = require('../../index'); + +exports.setup = function () { + var ModularInputs = splunkjs.ModularInputs; + var ValidationDefinition = ModularInputs.ValidationDefinition; + var utils = ModularInputs.utils; + + splunkjs.Logger.setLevel("ALL"); + + return ( + describe("Validation Definition tests", function () { + before(function (done) { + done(); + }); + + it("Parse produces expected result", function (done) { + try { + var found = ValidationDefinition.parse(utils.readFile(__filename, "../data/validation.xml")); + + var expected = new ValidationDefinition(); + expected.metadata = { + "server_host": "tiny", + "server_uri": "https://127.0.0.1:8089", + "checkpoint_dir": "/opt/splunk/var/lib/splunk/modinputs", + "session_key": "123102983109283019283", + "name": "aaa" + }; + expected.parameters = { + "param1": "value1", + "param2": "value2", + "disabled": "0", + "index": "default", + "multiValue": ["value1", "value2"], + "multiValue2": ["value3", "value4"] + }; + + assert.deepEqual(found.metadata, expected.metadata); + assert.equal(found.metadata["server_host"], expected.metadata["server_host"]); + assert.equal(found.metadata["server_uri"], expected.metadata["server_uri"]); + assert.equal(found.metadata["checkpoint_dir"], expected.metadata["checkpoint_dir"]); + assert.equal(found.metadata["session_key"], expected.metadata["session_key"]); + assert.equal(found.metadata["name"], expected.metadata["name"]); + + assert.deepEqual(found.parameters, expected.parameters); + assert.equal(found.parameters["param1"], expected.parameters["param1"]); + assert.equal(found.parameters["param2"], expected.parameters["param2"]); + assert.equal(found.parameters["disabled"], expected.parameters["disabled"]); + assert.equal(found.parameters["index"], expected.parameters["index"]); + + assert.deepEqual(found.parameters["multiValue"], expected.parameters["multiValue"]); + assert.equal(found.parameters["multiValue"][0], expected.parameters["multiValue"][0]); + assert.equal(found.parameters["multiValue"][1], expected.parameters["multiValue"][1]); + + assert.deepEqual(found.parameters["multiValue2"], expected.parameters["multiValue2"]); + assert.equal(found.parameters["multiValue2"][0], expected.parameters["multiValue2"][0]); + assert.equal(found.parameters["multiValue2"][1], expected.parameters["multiValue2"][1]); + + assert.deepEqual(found, expected); + } + catch (e) { + assert.ok(!e, JSON.stringify(e)); + } + + done(); + }); + }) + ) +}; + +// Run the individual test suite +if (module === require.cache[__filename] && !module.parent) { + module.exports = exports.setup(); +} diff --git a/tests_spike/modularinputs/utils.js b/tests_spike/modularinputs/utils.js new file mode 100644 index 000000000..cbc1094e6 --- /dev/null +++ b/tests_spike/modularinputs/utils.js @@ -0,0 +1,147 @@ +// Copyright 2014 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. + +(function () { + "use strict"; + var Stream = require("readable-stream"); + var utils = require("../../lib/utils"); // Grab the SDK utils + var root = exports || this; + + root.getDuplexStream = function () { + var duplex = new Stream.Duplex(); + duplex.data = ""; + duplex._write = function (chunk, enc, next) { + this.data += chunk.toString(); + next(); + }; + duplex._read = function () { + return this.data; + }; + return duplex; + }; + + root.getReadableStream = function () { + var readable = new Stream.Readable(); + readable.data = ""; + readable._read = function () { + return this.data; + }; + return readable; + }; + + /** + * Takes an array of objects, and sorts the array by the values of each + * object at the specified key. + * + * @param {Array} an array of objects. + * @param {String} the key to sort by. + * @return {Boolean} true if they are equal, else false + */ + root.sortByKey = function (array, key) { + return array.sort(function (a, b) { + var x = a[key]; var y = b[key]; + return ((x < y) ? -1 : ((x > y) ? 1 : 0)); + }); + }; + + /** + * Takes two XML documents represented by `Elementtree` objects and + * checks whether their children are equal. + * + * @param {Object} an `Elementtree` object. + * @param {Object} an `Elementtree` object. + * @return {Boolean} true if their children are equal, else false + */ + root.XMLCompareChildren = function (expected, found) { + if (expected.len !== found.len) { + return false; + } + + // If there's no children to compare, we're done + if (!expected._children && !found._children) { + return true; + } + + var expectedChildren = expected.getchildren().sort(); + var foundChildren = found.getchildren().sort(); + + // Check if all of expected's children are equal to all of found's children + for (var i = 0; i < expectedChildren.length; i++) { + if (!root.XMLCompare(expectedChildren[i], foundChildren[i])) { + return false; + } + } + + return true; + }; + + /** + * Takes two XML documents represented by `Elementtree` objects and + * checks whether they are equal. + * + * @param {Object} an `Elementtree` object. + * @param {Object} an `Elementtree` object. + * @return {Boolean} true if they are equal, else false + */ + root.XMLCompare = function (expected, found) { + // They're equal if they're the same. + if (expected === found) { + return true; + } + + // Compare the attributes. + if (typeof expected.items !== typeof found.items) { + return false; + } + if (found.items && expected.items) { + var expectedItems = expected.items().sort(); + var foundItems = expected.items().sort(); + + if (expectedItems.length !== foundItems.length) { + return false; + } + else { + for (var i = 0; i < foundItems.length; i++) { + if (foundItems[i] && expectedItems[i]) { + var f = foundItems[i]; + var e = expectedItems[i]; + + for (var j = 0; j < e.length; j++) { + if (f[j] !== e[j]) { + return false; + } + } + } + else { + return false; + } + } + } + } + + // Compare their children + if (!root.XMLCompareChildren(expected, found)) { + return false; + } + + // Compare the root level elements. + if (!expected.text || utils.trim(expected.text) === "" && + !found.text || utils.trim(found.text) === "") { + return true; + } + else { + return (expected.tag === found.tag && expected.text === found.text); + } + }; +})(); diff --git a/tests_spike/service_tests/app.js b/tests_spike/service_tests/app.js new file mode 100644 index 000000000..5102d1b4d --- /dev/null +++ b/tests_spike/service_tests/app.js @@ -0,0 +1,209 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); + +var Async = splunkjs.Async; +var utils = splunkjs.Utils; +var idCounter = 0; + +var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); +}; + +exports.setup = function (svc) { + + return { + beforeEach: function (done) { + this.service = svc; + done(); + }, + + "Callback#list applications": function (done) { + var apps = this.service.apps(); + apps.fetch(function (err, apps) { + var appList = apps.list(); + assert.ok(appList.length > 0); + done(); + }); + }, + + "Callback#contains applications": function (done) { + var apps = this.service.apps(); + apps.fetch(function (err, apps) { + var app = apps.item("search"); + assert.ok(app); + done(); + }); + }, + + "Callback#create + contains app": function (done) { + var name = "jssdk_testapp_" + getNextId(); + var apps = this.service.apps(); + + apps.create({ name: name }, function (err, app) { + var appName = app.name; + apps.fetch(function (err, apps) { + var entity = apps.item(appName); + assert.ok(entity); + app.remove(function () { + done(); + }); + }); + }); + }, + + "Callback#create + modify app": function (done) { + var DESCRIPTION = "TEST DESCRIPTION"; + var VERSION = "1.1.0"; + + var name = "jssdk_testapp_" + getNextId(); + var apps = this.service.apps(); + + Async.chain([ + function (callback) { + apps.create({ name: name }, callback); + }, + function (app, callback) { + assert.ok(app); + assert.strictEqual(app.name, name); + var versionMatches = app.properties().version === "1.0" || + app.properties().version === "1.0.0"; + assert.ok(versionMatches); + + app.update({ + description: DESCRIPTION, + version: VERSION + }, callback); + }, + function (app, callback) { + assert.ok(app); + var properties = app.properties(); + + assert.strictEqual(properties.description, DESCRIPTION); + assert.strictEqual(properties.version, VERSION); + + app.remove(callback); + } + ], function (err) { + assert.ok(!err); + done(); + }); + }, + + "Callback#delete test applications": function (done) { + + var apps = this.service.apps(); + apps.fetch(function (err, apps) { + + var appList = apps.list(); + + Async.parallelEach(appList, + + function (app, idx, callback) { + if (utils.startsWith(app.name, "jssdk_")) { + app.remove(callback); + } + else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); + } + ); + }); + }, + + "list applications with cookies as authentication": function (done) { + this.service.serverInfo(function (err, info) { + // Cookie authentication was added in splunk 6.2 + var majorVersion = parseInt(info.properties().version.split(".")[0], 10); + var minorVersion = parseInt(info.properties().version.split(".")[1], 10); + // Skip cookie test if Splunk older than 6.2 + if (majorVersion < 6 || (majorVersion === 6 && minorVersion < 2)) { + splunkjs.Logger.log("Skipping cookie test..."); + done(); + return; + } + + var service = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + username: svc.username, + password: svc.password, + version: svc.version + }); + + var service2 = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + version: svc.version + }); + + Async.chain([ + function (done) { + service.login(done); + }, + function (job, done) { + // Save the cookie store + var cookieStore = service.http._cookieStore; + // Test that there are cookies + assert.ok(!utils.isEmpty(cookieStore)); + + // Add the cookies to a service with no other authenitcation information + service2.http._cookieStore = cookieStore; + + var apps = service2.apps(); + apps.fetch(done); + }, + function (apps, done) { + var appList = apps.list(); + assert.ok(appList.length > 0); + assert.ok(!utils.isEmpty(service2.http._cookieStore)); + done(); + } + ], + function (err) { + // Test that no errors were returned + assert.ok(!err); + done(); + }); + }); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc)); + }); + }); +} diff --git a/tests_spike/service_tests/collection.js b/tests_spike/service_tests/collection.js new file mode 100644 index 000000000..ddf8f6b9a --- /dev/null +++ b/tests_spike/service_tests/collection.js @@ -0,0 +1,100 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); + +exports.setup = function (svc, loggedOutSvc) { + + return { + beforeEach: function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + done(); + }, + + "Methods to be overridden throw": function (done) { + var coll = new splunkjs.Service.Collection( + this.service, + "/data/indexes", + { + owner: "admin", + app: "search", + sharing: "app" + } + ); + assert.throws(function () { + coll.instantiateEntity({}); + }); + done(); + }, + + "Accessors work": function (done) { + var coll = new splunkjs.Service.Collection( + this.service, + "/data/indexes", + { + owner: "admin", + app: "search", + sharing: "app" + } + ); + coll._load({ links: "Hilda", updated: true }); + assert.strictEqual(coll.links(), "Hilda"); + assert.ok(coll.updated()); + done(); + }, + + "Contains throws without a good id": function (done) { + var coll = new splunkjs.Service.Collection( + this.service, + "/data/indexes", + { + owner: "admin", + app: "search", + sharing: "app" + } + ); + assert.throws(function () { coll.item(null); }); + done(); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + var loggedOutSvc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password + 'wrong', + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc, loggedOutSvc)); + }); + }); +} diff --git a/tests_spike/service_tests/configuration.js b/tests_spike/service_tests/configuration.js new file mode 100644 index 000000000..026783340 --- /dev/null +++ b/tests_spike/service_tests/configuration.js @@ -0,0 +1,243 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); + +var Async = splunkjs.Async; +var idCounter = 0; +var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); +}; + +exports.setup = function (svc) { + + return { + beforeEach: function (done) { + this.service = svc; + done(); + }, + + "Callback#list": function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var files = props.list(); + assert.ok(files.length > 0); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }, + + "Callback#contains": function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("web"); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(file.name, "web"); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }, + + "Callback#contains stanza": function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("web"); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(file.name, "web"); + + var stanza = file.item("settings"); + assert.ok(stanza); + stanza.fetch(done); + }, + function (stanza, done) { + assert.ok(stanza.properties().hasOwnProperty("httpport")); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }, + + "Callback#configurations init": function (done) { + assert.throws(function () { + var confs = new splunkjs.Service.Configurations( + this.service, + { owner: "-", app: "-", sharing: "system" } + ); + }); + done(); + }, + + "Callback#create file + create stanza + update stanza": function (done) { + var that = this; + var namespace = { owner: "nobody", app: "system" }; + var fileName = "jssdk_file_" + getNextId(); + var value = "barfoo_" + getNextId(); + + Async.chain([ + function (done) { + var configs = svc.configurations(namespace); + configs.fetch(done); + }, + function (configs, done) { + configs.create({ __conf: fileName }, done); + }, + function (file, done) { + if (file.item("stanza")) { + file.item("stanza").remove(); + } + file.create("stanza", done); + }, + function (stanza, done) { + stanza.update({ "jssdk_foobar": value }, done); + }, + function (stanza, done) { + assert.strictEqual(stanza.properties()["jssdk_foobar"], value); + done(); + }, + function (done) { + var file = new splunkjs.Service.ConfigurationFile(svc, fileName); + file.fetch(done); + }, + function (file, done) { + var stanza = file.item("stanza"); + assert.ok(stanza); + stanza.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }, + + "Callback#can get default stanza": function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("savedsearches"); + assert.strictEqual(namespace, file.namespace); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(namespace, file.namespace); + file.getDefaultStanza().fetch(done); + }, + function (stanza, done) { + assert.strictEqual(stanza.name, "default"); + assert.strictEqual(namespace, stanza.namespace); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }, + + "Callback#updating default stanza is noop": function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + var backup = null; + var invalid = "this won't work"; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("savedsearches"); + assert.strictEqual(namespace, file.namespace); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(namespace, file.namespace); + file.getDefaultStanza().fetch(done); + }, + function (stanza, done) { + assert.ok(stanza._properties.hasOwnProperty("max_concurrent")); + assert.strictEqual(namespace, stanza.namespace); + backup = stanza._properties.max_concurrent; + stanza.update({ "max_concurrent": invalid }, done); + }, + function (stanza, done) { + assert.ok(stanza.properties().hasOwnProperty("max_concurrent")); + assert.strictEqual(stanza.properties()["max_concurrent"], backup); + assert.notStrictEqual(stanza.properties()["max_concurrent"], invalid); + stanza.fetch(done); + }, + function (stanza, done) { + assert.ok(stanza.properties().hasOwnProperty("max_concurrent")); + assert.strictEqual(stanza.properties()["max_concurrent"], backup); + assert.notStrictEqual(stanza.properties()["max_concurrent"], invalid); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc)); + }); + }); +} diff --git a/tests_spike/service_tests/datamodels.js b/tests_spike/service_tests/datamodels.js new file mode 100644 index 000000000..c4b8ffd73 --- /dev/null +++ b/tests_spike/service_tests/datamodels.js @@ -0,0 +1,1107 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); +var tutils = require('../utils'); + +var Async = splunkjs.Async; +var utils = splunkjs.Utils; + +var idCounter = 0; +var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); +}; + +exports.setup = function (svc) { + return { + beforeEach: function (done) { + this.service = svc; + this.dataModels = svc.dataModels(); + this.skip = false; + var that = this; + this.service.serverInfo(function (err, info) { + if (parseInt(info.properties().version.split(".")[0], 10) < 6) { + that.skip = true; + splunkjs.Logger.log("Skipping data model tests..."); + } + done(err); + }); + }, + + "Callback#DataModels - fetch a built-in data model": function (done) { + if (this.skip) { + done(); + return; + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + var dm = dataModels.item("internal_audit_logs"); + // Check for the 3 objects we expect + assert.ok(dm.objectByName("Audit")); + assert.ok(dm.objectByName("searches")); + assert.ok(dm.objectByName("modify")); + + // Check for an object that shouldn't exist + assert.strictEqual(null, dm.objectByName(getNextId())); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - create & delete an empty data model": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var initialSize; + var that = this; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + initialSize = dataModels.list().length; + dataModels.create(name, args, done); + }, + function (dataModel, done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Make sure we have 1 more data model than we started with + assert.strictEqual(initialSize + 1, dataModels.list().length); + // Delete the data model we just created, by name. + dataModels.item(name).remove(done); + }, + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Make sure we have as many data models as we started with + assert.strictEqual(initialSize, dataModels.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - create a data model with spaces in the name, which are swapped for -'s": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me- " + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.strictEqual(name.replace(" ", "_"), dataModel.name); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - create a data model with 0 objects": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + // Check for 0 objects before fetch + assert.strictEqual(0, dataModel.objects.length); + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Check for 0 objects after fetch + assert.strictEqual(0, dataModels.item(name).objects.length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - create a data model with 1 search object": function (done) { + if (this.skip) { + done(); + return; + } + var dataModels = this.service.dataModels(); + + + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/object_with_one_search.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + // Check for 1 object before fetch + assert.strictEqual(1, dataModel.objects.length); + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Check for 1 object after fetch + assert.strictEqual(1, dataModels.item(name).objects.length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - create a data model with 2 search objects": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/object_with_two_searches.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + // Check for 2 objects before fetch + assert.strictEqual(2, dataModel.objects.length); + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Check for 2 objects after fetch + assert.strictEqual(2, dataModels.item(name).objects.length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - data model objects are created correctly": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/object_with_two_searches.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.ok(dataModel.hasObject("search1")); + assert.ok(dataModel.hasObject("search2")); + + var search1 = dataModel.objectByName("search1"); + assert.ok(search1); + assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ - search 1", search1.displayName); + + var search2 = dataModel.objectByName("search2"); + assert.ok(search2); + assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ - search 2", search2.displayName); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - data model handles unicode characters": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/model_with_unicode_headers.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.strictEqual(name, dataModel.name); + assert.strictEqual("·Ä©·öô‡Øµ", dataModel.displayName); + assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ", dataModel.description); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - create data model with empty headers": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/model_with_empty_headers.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.strictEqual(name, dataModel.name); + assert.strictEqual("", dataModel.displayName); + assert.strictEqual("", dataModel.description); + + // Make sure we're not getting a summary of the data model + assert.strictEqual("0", dataModel.concise); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - test acceleration settings": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + dataModel.acceleration.enabled = true; + dataModel.acceleration.earliestTime = "-2mon"; + dataModel.acceleration.cronSchedule = "5/* * * * *"; + + assert.strictEqual(true, dataModel.isAccelerated()); + assert.strictEqual(true, dataModel.acceleration.enabled); + assert.strictEqual("-2mon", dataModel.acceleration.earliestTime); + assert.strictEqual("5/* * * * *", dataModel.acceleration.cronSchedule); + + dataModel.acceleration.enabled = false; + dataModel.acceleration.earliestTime = "-1mon"; + dataModel.acceleration.cronSchedule = "* * * * *"; + + assert.strictEqual(false, dataModel.isAccelerated()); + assert.strictEqual(false, dataModel.acceleration.enabled); + assert.strictEqual("-1mon", dataModel.acceleration.earliestTime); + assert.strictEqual("* * * * *", dataModel.acceleration.cronSchedule); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - test data model object metadata": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("event1"); + assert.ok(obj); + + assert.strictEqual("event1 ·Ä©·öô", obj.displayName); + assert.strictEqual("event1", obj.name); + assert.deepEqual(dataModel, obj.dataModel); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - test data model object parent": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("event1"); + assert.ok(obj); + assert.ok(!obj.parent()); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - test data model object lineage": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("level_0"); + assert.ok(obj); + assert.strictEqual(1, obj.lineage.length); + assert.strictEqual("level_0", obj.lineage[0]); + assert.strictEqual("BaseEvent", obj.parentName); + + obj = dataModel.objectByName("level_1"); + assert.ok(obj); + assert.strictEqual(2, obj.lineage.length); + assert.deepEqual(["level_0", "level_1"], obj.lineage); + assert.strictEqual("level_0", obj.parentName); + + obj = dataModel.objectByName("level_2"); + assert.ok(obj); + assert.strictEqual(3, obj.lineage.length); + assert.deepEqual(["level_0", "level_1", "level_2"], obj.lineage); + assert.strictEqual("level_1", obj.parentName); + + // Make sure there's no extra children + assert.ok(!dataModel.objectByName("level_3")); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - test data model object fields": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("level_2"); + assert.ok(obj); + + var timeField = obj.fieldByName("_time"); + assert.ok(timeField); + assert.strictEqual("timestamp", timeField.type); + assert.ok(timeField.isTimestamp()); + assert.ok(!timeField.isNumber()); + assert.ok(!timeField.isString()); + assert.ok(!timeField.isObjectcount()); + assert.ok(!timeField.isChildcount()); + assert.ok(!timeField.isIPv4()); + assert.deepEqual(["BaseEvent"], timeField.lineage); + assert.strictEqual("_time", timeField.name); + assert.strictEqual(false, timeField.required); + assert.strictEqual(false, timeField.multivalued); + assert.strictEqual(false, timeField.hidden); + assert.strictEqual(false, timeField.editable); + assert.strictEqual(null, timeField.comment); + + var lvl2 = obj.fieldByName("level_2"); + assert.strictEqual("level_2", lvl2.owner); + assert.deepEqual(["level_0", "level_1", "level_2"], lvl2.lineage); + assert.strictEqual("objectCount", lvl2.type); + assert.ok(!lvl2.isTimestamp()); + assert.ok(!lvl2.isNumber()); + assert.ok(!lvl2.isString()); + assert.ok(lvl2.isObjectcount()); + assert.ok(!lvl2.isChildcount()); + assert.ok(!lvl2.isIPv4()); + assert.strictEqual("level_2", lvl2.name); + assert.strictEqual("level 2", lvl2.displayName); + assert.strictEqual(false, lvl2.required); + assert.strictEqual(false, lvl2.multivalued); + assert.strictEqual(false, lvl2.hidden); + assert.strictEqual(false, lvl2.editable); + assert.strictEqual(null, lvl2.comment); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - test data model object properties": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + assert.strictEqual(5, obj.fieldNames().length); + assert.strictEqual(10, obj.allFieldNames().length); + assert.ok(obj.fieldByName("has_boris")); + assert.ok(obj.hasField("has_boris")); + assert.ok(obj.fieldByName("_time")); + assert.ok(obj.hasField("_time")); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - create local acceleration job": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("level_2"); + assert.ok(obj); + + obj.createLocalAccelerationJob(null, done); + }, + function (job, done) { + assert.ok(job); + + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + assert.strictEqual("| datamodel \"" + name + "\" level_2 search | tscollect", job.properties().request.search); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - create local acceleration job with earliest time": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var obj; + var oldNow = Date.now(); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("level_2"); + assert.ok(obj); + obj.createLocalAccelerationJob("-1d", done); + }, + function (job, done) { + assert.ok(job); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + assert.strictEqual("| datamodel \"" + name + "\" level_2 search | tscollect", job.properties().request.search); + + // Make sure the earliest time is 1 day behind + var yesterday = new Date(Date.now() - (1000 * 60 * 60 * 24)); + var month = (yesterday.getMonth() + 1); + if (month <= 9) { + month = "0" + month; + } + var date = yesterday.getDate(); + if (date <= 9) { + date = "0" + date; + } + var expectedDate = yesterday.getFullYear() + "-" + month + "-" + date; + assert.ok(utils.startsWith(job._state.content.earliestTime, expectedDate)); + + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - test data model constraints": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("event1"); + assert.ok(obj); + var constraints = obj.constraints; + assert.ok(constraints); + var onlyOne = true; + + for (var i = 0; i < constraints.length; i++) { + var constraint = constraints[i]; + assert.ok(!!onlyOne); + + assert.strictEqual("event1", constraint.owner); + assert.strictEqual("uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")", constraint.query); + } + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - test data model calculations, and the different types": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("event1"); + assert.ok(obj); + + var calculations = obj.calculations; + assert.strictEqual(4, Object.keys(calculations).length); + assert.strictEqual(4, obj.calculationIDs().length); + + var evalCalculation = calculations["93fzsv03wa7"]; + assert.ok(evalCalculation); + assert.strictEqual("event1", evalCalculation.owner); + assert.deepEqual(["event1"], evalCalculation.lineage); + assert.strictEqual("Eval", evalCalculation.type); + assert.ok(evalCalculation.isEval()); + assert.ok(!evalCalculation.isLookup()); + assert.ok(!evalCalculation.isGeoIP()); + assert.ok(!evalCalculation.isRex()); + assert.strictEqual(null, evalCalculation.comment); + assert.strictEqual(true, evalCalculation.isEditable()); + assert.strictEqual("if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\")", evalCalculation.expression); + + assert.strictEqual(1, Object.keys(evalCalculation.outputFields).length); + assert.strictEqual(1, evalCalculation.outputFieldNames().length); + + var field = evalCalculation.outputFields["new_field"]; + assert.ok(field); + assert.strictEqual("My New Field", field.displayName); + + var lookupCalculation = calculations["sr3mc8o3mjr"]; + assert.ok(lookupCalculation); + assert.strictEqual("event1", lookupCalculation.owner); + assert.deepEqual(["event1"], lookupCalculation.lineage); + assert.strictEqual("Lookup", lookupCalculation.type); + assert.ok(lookupCalculation.isLookup()); + assert.ok(!lookupCalculation.isEval()); + assert.ok(!lookupCalculation.isGeoIP()); + assert.ok(!lookupCalculation.isRex()); + assert.strictEqual(null, lookupCalculation.comment); + assert.strictEqual(true, lookupCalculation.isEditable()); + assert.deepEqual({ lookupField: "a_lookup_field", inputField: "host" }, lookupCalculation.inputFieldMappings); + assert.strictEqual(2, Object.keys(lookupCalculation.inputFieldMappings).length); + assert.strictEqual("a_lookup_field", lookupCalculation.inputFieldMappings.lookupField); + assert.strictEqual("host", lookupCalculation.inputFieldMappings.inputField); + assert.strictEqual("dnslookup", lookupCalculation.lookupName); + + var regexpCalculation = calculations["a5v1k82ymic"]; + assert.ok(regexpCalculation); + assert.strictEqual("event1", regexpCalculation.owner); + assert.deepEqual(["event1"], regexpCalculation.lineage); + assert.strictEqual("Rex", regexpCalculation.type); + assert.ok(regexpCalculation.isRex()); + assert.ok(!regexpCalculation.isLookup()); + assert.ok(!regexpCalculation.isEval()); + assert.ok(!regexpCalculation.isGeoIP()); + assert.strictEqual(2, regexpCalculation.outputFieldNames().length); + assert.strictEqual("_raw", regexpCalculation.inputField); + assert.strictEqual(" From: (?.*) To: (?.*) ", regexpCalculation.expression); + + var geoIPCalculation = calculations["pbe9bd0rp4"]; + assert.ok(geoIPCalculation); + assert.strictEqual("event1", geoIPCalculation.owner); + assert.deepEqual(["event1"], geoIPCalculation.lineage); + assert.strictEqual("GeoIP", geoIPCalculation.type); + assert.ok(geoIPCalculation.isGeoIP()); + assert.ok(!geoIPCalculation.isLookup()); + assert.ok(!geoIPCalculation.isEval()); + assert.ok(!geoIPCalculation.isRex()); + assert.strictEqual("·Ä©·öô‡Øµ comment of pbe9bd0rp4", geoIPCalculation.comment); + assert.strictEqual(5, geoIPCalculation.outputFieldNames().length); + assert.strictEqual("output_from_reverse_hostname", geoIPCalculation.inputField); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - run queries": function (done) { + if (this.skip) { + done(); + return; + } + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + var dm = dataModels.item("internal_audit_logs"); + obj = dm.objectByName("searches"); + obj.startSearch({}, "", done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + assert.strictEqual("| datamodel internal_audit_logs searches search", job.properties().request.search); + job.cancel(done); + }, + function (response, done) { + obj.startSearch({ status_buckets: 5, enable_lookups: false }, "| head 3", done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + assert.strictEqual("| datamodel internal_audit_logs searches search | head 3", job.properties().request.search); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - baseSearch is parsed correctly": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/model_with_multiple_types.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("search1"); + assert.ok(obj); + assert.ok(obj instanceof splunkjs.Service.DataModelObject); + assert.strictEqual("BaseSearch", obj.parentName); + assert.ok(obj.isBaseSearch()); + assert.ok(!obj.isBaseTransaction()); + assert.strictEqual("search index=_internal | head 10", obj.baseSearch); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#DataModels - baseTransaction is parsed correctly": function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/model_with_multiple_types.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("transaction1"); + assert.ok(obj); + assert.ok(obj instanceof splunkjs.Service.DataModelObject); + assert.strictEqual("BaseTransaction", obj.parentName); + assert.ok(obj.isBaseTransaction()); + assert.ok(!obj.isBaseSearch()); + assert.deepEqual(["event1"], obj.objectsToGroup); + assert.deepEqual(["host", "from"], obj.groupByFields); + assert.strictEqual("25s", obj.maxPause); + assert.strictEqual("100m", obj.maxSpan); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc)); + }); + }); +} diff --git a/tests_spike/service_tests/endpoint.js b/tests_spike/service_tests/endpoint.js new file mode 100644 index 000000000..369577626 --- /dev/null +++ b/tests_spike/service_tests/endpoint.js @@ -0,0 +1,69 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); + +exports.setup = function (svc) { + return { + beforeEach: function (done) { + this.service = svc; + done(); + }, + + "Throws on null arguments to init": function (done) { + var service = this.service; + assert.throws(function () { + var endpoint = new splunkjs.Service.Endpoint(null, "a/b"); + }); + assert.throws(function () { + var endpoint = new splunkjs.Service.Endpoint(service, null); + }); + done(); + }, + + "Endpoint delete on a relative path": function (done) { + var service = this.service; + var endpoint = new splunkjs.Service.Endpoint(service, "/search/jobs/12345"); + endpoint.del("search/jobs/12345", {}, function () { done(); }); + }, + + "Methods of Resource to be overridden": function (done) { + var service = this.service; + var resource = new splunkjs.Service.Resource(service, "/search/jobs/12345"); + assert.throws(function () { resource.path(); }); + assert.throws(function () { resource.fetch(); }); + assert.ok(splunkjs.Utils.isEmpty(resource.state())); + done(); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc)); + }); + }); +} diff --git a/tests_spike/service_tests/entity.js b/tests_spike/service_tests/entity.js new file mode 100644 index 000000000..52dfa6b6e --- /dev/null +++ b/tests_spike/service_tests/entity.js @@ -0,0 +1,153 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); + +var Async = splunkjs.Async; +var idCounter = 0; + +var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); +}; + +exports.setup = function (svc, loggedOutSvc) { + return { + beforeEach: function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + done(); + }, + + "Accessors function properly": function (done) { + var entity = new splunkjs.Service.Entity( + this.service, + "/search/jobs/12345", + { owner: "boris", app: "factory", sharing: "app" } + ); + entity._load( + { + acl: { owner: "boris", app: "factory", sharing: "app" }, + links: { link1: 35 }, + published: "meep", + author: "Hilda" + } + ); + assert.ok(entity.acl().owner === "boris"); + assert.ok(entity.acl().app === "factory"); + assert.ok(entity.acl().sharing === "app"); + assert.ok(entity.links().link1 === 35); + assert.strictEqual(entity.author(), "Hilda"); + assert.strictEqual(entity.published(), "meep"); + done(); + }, + + "Refresh throws error correctly": function (done) { + var entity = new splunkjs.Service.Entity(this.loggedOutService, "/search/jobs/12345", { owner: "boris", app: "factory", sharing: "app" }); + entity.fetch({}, function (err) { assert.ok(err); done(); }); + }, + + "Cannot update name of entity": function (done) { + var entity = new splunkjs.Service.Entity(this.service, "/search/jobs/12345", { owner: "boris", app: "factory", sharing: "app" }); + assert.throws(function () { entity.update({ name: "asdf" }); }); + done(); + }, + + "Disable throws error correctly": function (done) { + var entity = new splunkjs.Service.Entity( + this.loggedOutService, + "/search/jobs/12345", + { owner: "boris", app: "factory", sharing: "app" } + ); + entity.disable(function (err) { assert.ok(err); done(); }); + }, + + "Enable throws error correctly": function (done) { + var entity = new splunkjs.Service.Entity( + this.loggedOutService, + "/search/jobs/12345", + { owner: "boris", app: "factory", sharing: "app" } + ); + entity.enable(function (err) { assert.ok(err); done(); }); + }, + + "Does reload work?": function (done) { + var idx = new splunkjs.Service.Index( + this.service, + "data/indexes/sdk-test", + { + owner: "admin", + app: "search", + sharing: "app" + } + ); + var name = "jssdk_testapp_" + getNextId(); + var apps = this.service.apps(); + + var that = this; + Async.chain( + function (done) { + apps.create({ name: name }, done); + }, + function (app, done) { + app.reload(function (err) { + assert.ok(!err); + done(null, app); + }); + }, + function (app, done) { + var app2 = new splunkjs.Service.Application(that.loggedOutService, app.name); + app2.reload(function (err) { + assert.ok(err); + done(null, app); + }); + }, + function (app, done) { + app.remove(done); + }, + function (err) { + assert.ok(!err); + done(); + } + ); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + var loggedOutSvc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password + 'wrong', + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc, loggedOutSvc)); + }); + }); +} diff --git a/tests_spike/service_tests/firedalerts.js b/tests_spike/service_tests/firedalerts.js new file mode 100644 index 000000000..0889cd03c --- /dev/null +++ b/tests_spike/service_tests/firedalerts.js @@ -0,0 +1,308 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); + +var Async = splunkjs.Async; +var utils = splunkjs.Utils; +var idCounter = 0; + +var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); +}; + +exports.setup = function (svc, loggedOutSvc) { + return { + beforeEach: function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + var indexes = this.service.indexes(); + done(); + }, + + "Callback#create + verify emptiness + delete new alert group": function (done) { + + var searches = this.service.savedSearches({ owner: this.service.username }); + var name = "jssdk_savedsearch_alert_" + getNextId(); + var searchConfig = { + "name": name, + "search": "index=_internal | head 1", + "alert_type": "always", + "alert.severity": "2", + "alert.suppress": "0", + "alert.track": "1", + "dispatch.earliest_time": "-1h", + "dispatch.latest_time": "now", + "is_scheduled": "1", + "cron_schedule": "* * * * *" + }; + + Async.chain([ + function (done) { + searches.create(searchConfig, done); + }, + function (search, done) { + assert.ok(search); + assert.strictEqual(search.alertCount(), 0); + search.history(done); + }, + function (jobs, search, done) { + assert.strictEqual(jobs.length, 0); + assert.strictEqual(search.firedAlertGroup().count(), 0); + searches.service.firedAlertGroups().fetch(Async.augment(done, search)); + }, + function (firedAlertGroups, originalSearch, done) { + assert.strictEqual(firedAlertGroups.list().indexOf(originalSearch.name), -1); + done(null, originalSearch); + }, + function (originalSearch, done) { + originalSearch.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + // This test is not stable, commenting it out until we figure it out + // "Callback#alert is triggered + test firedAlert entity -- FAILS INTERMITTENTLY": function(done) { + // var searches = this.service.savedSearches({owner: this.service.username}); + // var indexName = "sdk-tests-alerts"; + // var name = "jssdk_savedsearch_alert_" + getNextId(); + + // // Real-time search config + // var searchConfig = { + // "name": name, + // "search": "index="+indexName+" sourcetype=sdk-tests-alerts | head 1", + // "alert_type": "always", + // "alert.severity": "2", + // "alert.suppress": "0", + // "alert.track": "1", + // "dispatch.earliest_time": "rt-1s", + // "dispatch.latest_time": "rt", + // "is_scheduled": "1", + // "cron_schedule": "* * * * *" + // }; + + // Async.chain([ + // function(done) { + // searches.create(searchConfig, done); + // }, + // function(search, done) { + // assert.ok(search); + // assert.strictEqual(search.alertCount(), 0); + // assert.strictEqual(search.firedAlertGroup().count(), 0); + + // var indexes = search.service.indexes(); + // indexes.create(indexName, {}, function(err, index) { + // if (err && err.status !== 409) { + // done(new Error("Index creation failed for an unknown reason")); + // } + // done(null, search); + // }); + // }, + // function(originalSearch, done) { + // var indexes = originalSearch.service.indexes(); + // indexes.fetch(function(err, indexes) { + // if (err) { + // done(err); + // } + // else { + // var index = indexes.item(indexName); + // assert.ok(index); + // index.enable(Async.augment(done, originalSearch)); + // } + // }); + // }, + // function(index, originalSearch, done) { + // //Is the index enabled? + // assert.ok(!index.properties().disabled); + // //refresh the index + // index.fetch(Async.augment(done, originalSearch)); + // }, + // function(index, originalSearch, done) { + // //Store the current event count for a later comparison + // var eventCount = index.properties().totalEventCount; + + // assert.strictEqual(index.properties().sync, 0); + // assert.ok(!index.properties().disabled); + + // index.fetch(Async.augment(done, originalSearch, eventCount)); + // }, + // function(index, originalSearch, eventCount, done) { + // // submit an event + // index.submitEvent( + // "JS SDK: testing alerts", + // { + // sourcetype: "sdk-tests-alerts" + // }, + // Async.augment(done, originalSearch, eventCount) + // ); + // }, + // function(result, index, originalSearch, eventCount, done) { + // Async.sleep(1000, function(){ + // //refresh the search + // index.fetch(Async.augment(done, originalSearch, eventCount)); + // }); + // }, + // function(index, originalSearch, eventCount, done) { + // // Did the event get submitted + // assert.strictEqual(index.properties().totalEventCount, eventCount+1); + // // Refresh the search + // originalSearch.fetch(Async.augment(done, index)); + // }, + // function(originalSearch, index, done) { + // splunkjs.Logger.log("\tAlert count pre-fetch", originalSearch.alertCount()); + // var attemptNum = 1; + // var maxAttempts = 20; + // Async.whilst( + // function() { + // // When this returns false, it hits the final function in the chain + // splunkjs.Logger.log("\tFetch attempt", attemptNum, "of", maxAttempts, "alertCount", originalSearch.alertCount()); + // if (originalSearch.alertCount() !== 0) { + // return false; + // } + // else { + // attemptNum++; + // return attemptNum < maxAttempts; + // } + // }, + // function(callback) { + // Async.sleep(500, function() { + // originalSearch.fetch(callback); + // }); + // }, + // function(err) { + // splunkjs.Logger.log("Attempted fetching", attemptNum, "of", maxAttempts, "result is", originalSearch.alertCount() !== 0); + // originalSearch.fetch(Async.augment(done, index)); + // } + // ); + // }, + // function(originalSearch, index, done) { + // splunkjs.Logger.log("about to fetch"); + // splunkjs.Logger.log("SavedSearch name was: " + originalSearch.name); + // svc.firedAlertGroups({username: svc.username}).fetch(Async.augment(done, index, originalSearch)); + // }, + // function(firedAlertGroups, index, originalSearch, done) { + // Async.seriesEach( + // firedAlertGroups.list(), + // function(firedAlertGroup, innerIndex, seriescallback) { + // Async.chain([ + // function(insideChainCallback) { + // firedAlertGroup.list(insideChainCallback); + // }, + // function(firedAlerts, firedAlertGroup, insideChainCallback) { + // for(var i = 0; i < firedAlerts.length; i++) { + // var firedAlert = firedAlerts[i]; + // firedAlert.actions(); + // firedAlert.alertType(); + // firedAlert.isDigestMode(); + // firedAlert.expirationTime(); + // firedAlert.savedSearchName(); + // firedAlert.severity(); + // firedAlert.sid(); + // firedAlert.triggerTime(); + // firedAlert.triggerTimeRendered(); + // firedAlert.triggeredAlertCount(); + // } + // insideChainCallback(null); + // } + // ], + // function(err) { + // if (err) { + // seriescallback(err); + // } + // seriescallback(null); + // } + // ); + // }, + // function(err) { + // if (err) { + // done(err, originalSearch, index); + // } + // done(null, originalSearch, index); + // } + // ); + // }, + // function(originalSearch, index, done) { + // // Make sure the event count has incremented, as expected + // assert.strictEqual(originalSearch.alertCount(), 1); + // // Remove the search, especially because it's a real-time search + // originalSearch.remove(Async.augment(done, index)); + // }, + // function(index, done) { + // Async.sleep(500, function() { + // index.remove(done); + // }); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }, + + "Callback#delete all alerts": function (done) { + var namePrefix = "jssdk_savedsearch_alert_"; + var alertList = this.service.savedSearches().list(); + + Async.parallelEach( + alertList, + function (alert, idx, callback) { + if (utils.startsWith(alert.name, namePrefix)) { + splunkjs.Logger.log("ALERT ---", alert.name); + alert.remove(callback); + } + else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); + } + ); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + var loggedOutSvc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password + 'wrong', + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc, loggedOutSvc)); + }); + }); +} diff --git a/tests_spike/service_tests/indexes.js b/tests_spike/service_tests/indexes.js new file mode 100644 index 000000000..c6327f246 --- /dev/null +++ b/tests_spike/service_tests/indexes.js @@ -0,0 +1,472 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); + +var Async = splunkjs.Async; +var idCounter = 0; + +var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); +}; + +exports.setup = function (svc, loggedOutSvc) { + return { + + beforeEach: function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + + // Create the index for everyone to use + var name = this.indexName = "sdk-tests"; + var indexes = this.service.indexes(); + indexes.create(name, {}, function (err, index) { + if (err && err.status !== 409) { + throw new Error("Index creation failed for an unknown reason"); + } + + done(); + }); + }, + + // "Callback#remove index fails on Splunk 4.x": function(done) { + // var original_version = this.service.version; + // this.service.version = "4.0"; + // + // var index = this.service.indexes().item(this.indexName); + // assert.throws(function() { index.remove(function(err) {}); }); + // + // this.service.version = original_version; + // done(); + // }, + + // "Callback#remove index": function(done) { + // var indexes = this.service.indexes(); + // + // // Must generate a private index because an index cannot + // // be recreated with the same name as a deleted index + // // for a certain period of time after the deletion. + // var salt = Math.floor(Math.random() * 65536); + // var myIndexName = this.indexName + '-' + salt; + // + // if (this.service.versionCompare("5.0") < 0) { + // splunkjs.Logger.info("", "Must be running Splunk 5.0+ for this test to work."); + // done(); + // return; + // } + // + // Async.chain([ + // function(callback) { + // indexes.create(myIndexName, {}, callback); + // }, + // function(index, callback) { + // index.remove(callback); + // }, + // function(callback) { + // var numTriesLeft = 50; + // var delayPerTry = 200; // ms + // + // Async.whilst( + // function() { return indexes.item(myIndexName) && ((numTriesLeft--) > 0); }, + // function(iterDone) { + // Async.sleep(delayPerTry, function() { indexes.fetch(iterDone); }); + // }, + // function(err) { + // if (err) { + // callback(err); + // } + // else { + // callback(numTriesLeft <= 0 ? "Timed out" : null); + // } + // } + // ); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }, + + "Callback#list indexes": function (done) { + var indexes = this.service.indexes(); + indexes.fetch(function (err, indexes) { + var indexList = indexes.list(); + assert.ok(indexList.length > 0); + done(); + }); + }, + + "Callback#contains index": function (done) { + var indexes = this.service.indexes(); + var indexName = this.indexName; + + indexes.fetch(function (err, indexes) { + var index = indexes.item(indexName); + assert.ok(index); + done(); + }); + }, + + "Callback#modify index": function (done) { + + var name = this.indexName; + var indexes = this.service.indexes(); + var originalSyncMeta = false; + + Async.chain([ + function (callback) { + indexes.fetch(callback); + }, + function (indexes, callback) { + var index = indexes.item(name); + assert.ok(index); + + originalSyncMeta = index.properties().syncMeta; + index.update({ + syncMeta: !originalSyncMeta + }, callback); + }, + function (index, callback) { + assert.ok(index); + var properties = index.properties(); + + assert.strictEqual(!originalSyncMeta, properties.syncMeta); + + index.update({ + syncMeta: !properties.syncMeta + }, callback); + }, + function (index, callback) { + assert.ok(index); + var properties = index.properties(); + + assert.strictEqual(originalSyncMeta, properties.syncMeta); + callback(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Enable+disable index": function (done) { + + this.timeout(40000); + var name = this.indexName; + var indexes = this.service.indexes(); + + Async.chain([ + function (callback) { + indexes.fetch(callback); + }, + function (indexes, callback) { + var index = indexes.item(name); + assert.ok(index); + + index.disable(callback); + }, + function (index, callback) { + Async.sleep(5000, function () { + callback(null, index); + }); + }, + function (index, callback) { + assert.ok(index); + index.fetch(callback); + }, + function (index, callback) { + assert.ok(index); + assert.ok(index.properties().disabled); + + index.enable(callback); + }, + function (index, callback) { + Async.sleep(5000, function () { + callback(null, index); + }); + }, + function (index, callback) { + assert.ok(index); + index.fetch(callback); + }, + function (index, callback) { + assert.ok(index); + assert.ok(!index.properties().disabled); + + callback(); + } + ], + function (err) { + assert.ok(!err, JSON.stringify(err)); + done(); + } + ); + }, + + "Callback#Service submit event": function (done) { + var message = "Hello World -- " + getNextId(); + var sourcetype = "sdk-tests"; + + var service = this.service; + var indexName = this.indexName; + Async.chain( + function (done) { + service.log(message, { sourcetype: sourcetype, index: indexName }, done); + }, + function (eventInfo, done) { + assert.ok(eventInfo); + assert.strictEqual(eventInfo.sourcetype, sourcetype); + assert.strictEqual(eventInfo.bytes, message.length); + assert.strictEqual(eventInfo.index, indexName); + + // We could poll to make sure the index has eaten up the event, + // but unfortunately this can take an unbounded amount of time. + // As such, since we got a good response, we'll just be done with it. + done(); + }, + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Service submit event, omitting optional arguments": function (done) { + var message = "Hello World -- " + getNextId(); + var sourcetype = "sdk-tests"; + + var service = this.service; + var indexName = this.indexName; + Async.chain( + function (done) { + service.log(message, done); + }, + function (eventInfo, done) { + assert.ok(eventInfo); + assert.strictEqual(eventInfo.bytes, message.length); + + // We could poll to make sure the index has eaten up the event, + // but unfortunately this can take an unbounded amount of time. + // As such, since we got a good response, we'll just be done with it. + done(); + }, + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Service submit events with multi-byte chars": function (done) { + var service = this.service; + var messages = [ + "Ummelner Straße 6", + "Ümmelner Straße 6", + "Iԉtérԉátíòлåɭìƶåtiòл", + "Intérnâtì߀лàɭíƶɑtïòл", + "ãϻét dòner turƙëy ѵ߀lù", + "ptãte ìԉ rëρrèhënԁérit ", + "ϻ߀lɭit fìɭèt ϻìǥnoԉ ɭäb߀ríѕ", + " êӽ cɦùck cüpïᏧåtåt Ꮷèѕëruлt. ", + "D߀ɭor ѵélít ìrurè, sèᏧ ѕhòr", + "t riƅѕ c߀ɰ ɭãnԁյàéɢêr drúmst", + "ícƙ. Minïm ƃàɭl tip ѕհòrt rìƃѕ,", + " ïԁ aɭïqúìρ ѕɦànƙ ρ߀rcɦéttɑ. Pìǥ", + " hãm ɦòck ìлcídíԁùԉt séԁ cüpïϻ ", + "ƙèviл láborê. Et taiɭ ѕtriρ", + " steák út üllãϻc߀ rump d߀ɭore.", + "٩(͡๏̯͡๏)۶ ٩(-̮̮̃•̃).", + "Lɑƅòré ƃrësãòlá d߀лèr ѕâlámí ", + "cíllûm ìn ѕɯìлe ϻêàtɭ߀àf dûìs ", + "ρãncettä ƅrìsƙét ԁèsêrûлt áútè", + " յòɰɭ. Lɑbòrìѕ ƙìêɭ", + "básá ԁòlòré fatƃɑck ƅêéf. Pɑѕtr", + "ämì piɢ ѕհàлƙ ùɭɭamcò ѕaû", + "ѕäǥë sɦànƙlë.", + " Cúpím ɭäƃorum drumstïcƙ jerkϒ veli", + " pïcåԉɦɑ ƙíéɭƅãsa. Alïqû", + "iρ írürë cûpíϻ, äɭìɋuâ ǥròûлd ", + "roúлᏧ toԉgüè ρàrìãtùr ", + "briѕkèt ԉostruᏧ cûɭpɑ", + " ìd còлѕèqûât làƅ߀rìs." + ]; + + var counter = 0; + Async.seriesMap( + messages, + function (val, idx, done) { + counter++; + service.log(val, done); + }, + function (err, vals) { + assert.ok(!err); + assert.strictEqual(counter, messages.length); + + // Verify that the full byte-length was sent for each message + for (var m in messages) { + assert.notStrictEqual(messages[m].length, vals[m].bytes); + try { + assert.strictEqual(Buffer.byteLength(messages[m]), vals[m].bytes); + } + catch (err) { + // Assume Buffer isn't defined, we're probably in the browser + assert.strictEqual(decodeURI(encodeURIComponent(messages[m])).length, vals[m].bytes); + } + } + + done(); + } + ); + }, + + "Callback#Service submit event, failure": function (done) { + var message = "Hello World -- " + getNextId(); + var sourcetype = "sdk-tests"; + + var service = this.loggedOutService; + var indexName = this.indexName; + Async.chain( + function (done) { + assert.ok(service); + service.log(message, done); + }, + function (err) { + assert.ok(err); + done(); + } + ); + }, + + "Callback#remove throws an error": function (done) { + var index = this.service.indexes().item("_internal"); + assert.throws(function () { + index.remove(); + }); + done(); + }, + + "Callback#create an index with alternate argument format": function (done) { + var indexes = this.service.indexes(); + indexes.create( + { name: "_internal" }, + function (err, newIndex) { + assert.ok(err.data.messages[0].text.match("name=_internal already exists")); + done(); + } + ); + }, + + "Callback#Index submit event with omitted optional arguments": function (done) { + var message = "Hello world -- " + getNextId(); + + var indexName = this.indexName; + var indexes = this.service.indexes(); + + Async.chain( + [ + function (done) { + indexes.fetch(done); + }, + function (indexes, done) { + var index = indexes.item(indexName); + assert.ok(index); + assert.strictEqual(index.name, indexName); + index.submitEvent(message, done); + }, + function (eventInfo, index, done) { + assert.ok(eventInfo); + assert.strictEqual(eventInfo.bytes, message.length); + assert.strictEqual(eventInfo.index, indexName); + + // We could poll to make sure the index has eaten up the event, + // but unfortunately this can take an unbounded amount of time. + // As such, since we got a good response, we'll just be done with it. + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Index submit event": function (done) { + var message = "Hello World -- " + getNextId(); + var sourcetype = "sdk-tests"; + + var indexName = this.indexName; + var indexes = this.service.indexes(); + Async.chain([ + function (done) { + indexes.fetch(done); + }, + function (indexes, done) { + var index = indexes.item(indexName); + assert.ok(index); + assert.strictEqual(index.name, indexName); + index.submitEvent(message, { sourcetype: sourcetype }, done); + }, + function (eventInfo, index, done) { + assert.ok(eventInfo); + assert.strictEqual(eventInfo.sourcetype, sourcetype); + assert.strictEqual(eventInfo.bytes, message.length); + assert.strictEqual(eventInfo.index, indexName); + + // We could poll to make sure the index has eaten up the event, + // but unfortunately this can take an unbounded amount of time. + // As such, since we got a good response, we'll just be done with it. + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + var loggedOutSvc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password + 'wrong', + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc, loggedOutSvc)); + }); + }); +} diff --git a/tests_spike/service_tests/job.js b/tests_spike/service_tests/job.js new file mode 100644 index 000000000..1fe303a0a --- /dev/null +++ b/tests_spike/service_tests/job.js @@ -0,0 +1,1023 @@ +var assert = require('chai').assert; +var path = require("path"); + +var splunkjs = require('../../index'); +var tutils = require('../utils'); +const { Logger } = require('../../lib/log'); + +var Async = splunkjs.Async; +var idCounter = 0; + +var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); +}; + +exports.setup = function (svc) { + return { + beforeEach: function (done) { + this.service = svc; + done(); + }, + + // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. + // + // "Callback#Create+abort job": function(done) { + // var service = this.service; + // Async.chain([ + // function(done){ + // var app_name = path.join(process.env.SPLUNK_HOME, ('/etc/apps/sdk-app-collection/build/sleep_command.tar')); + // // Fix path on Windows if $SPLUNK_HOME contains a space (ex: C:/Program%20Files/Splunk) + // app_name = app_name.replace("%20", " "); + // service.post("apps/appinstall", {update:1, name:app_name}, done); + // }, + // function(done){ + // var sid = getNextId(); + // var options = {id: sid}; + // var jobs = service.jobs({app: "sdk-app-collection"}); + // var req = jobs.oneshotSearch('search index=_internal | head 1 | sleep 10', options, function(err, job) { + // assert.ok(err); + // assert.ok(!job); + // assert.strictEqual(err.error, "abort"); + // done(); + // }); + + // Async.sleep(1000, function(){ + // req.abort(); + // }); + // } + // ], + // function(err){ + // assert.ok(!err); + // done(); + // }); + // }, + + "Callback#Create+cancel job": function (done) { + var sid = getNextId(); + this.service.jobs().search('search index=_internal | head 1', { id: sid }, function (err, job) { + assert.ok(job); + assert.strictEqual(job.sid, sid); + + job.cancel(function () { + done(); + }); + }); + }, + + "Callback#Create job error": function (done) { + var sid = getNextId(); + this.service.jobs().search({ search: 'index=_internal | head 1', id: sid }, function (err) { + assert.ok(!!err); + done(); + }); + }, + + "Callback#List jobs": function (done) { + this.service.jobs().fetch(function (err, jobs) { + assert.ok(!err); + assert.ok(jobs); + + var jobsList = jobs.list(); + assert.ok(jobsList.length > 0); + + for (var i = 0; i < jobsList.length; i++) { + assert.ok(jobsList[i]); + } + + done(); + }); + }, + + "Callback#Contains job": function (done) { + var that = this; + var sid = getNextId(); + var jobs = this.service.jobs(); + + jobs.search('search index=_internal | head 1', { id: sid }, function (err, job) { + assert.ok(!err); + assert.ok(job); + assert.strictEqual(job.sid, sid); + + jobs.fetch(function (err, jobs) { + assert.ok(!err); + var job = jobs.item(sid); + assert.ok(job); + + job.cancel(function () { + done(); + }); + }); + }); + }, + + "Callback#job results": function (done) { + var sid = getNextId(); + var service = this.service; + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1 | stats count', { id: sid }, done); + }, + function (job, done) { + assert.strictEqual(job.sid, sid); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + job.results({}, done); + }, + function (results, job, done) { + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.fields.length, 1); + assert.strictEqual(results.fields[0], "count"); + assert.strictEqual(results.rows[0][0], "1"); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#job events": function (done) { + var sid = getNextId(); + var service = this.service; + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); + }, + function (job, done) { + assert.strictEqual(job.sid, sid); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + job.events({}, done); + }, + function (results, job, done) { + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.fields.length, results.rows[0].length); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#job results preview": function (done) { + var sid = getNextId(); + var service = this.service; + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1 | stats count', { id: sid }, done); + }, + function (job, done) { + assert.strictEqual(job.sid, sid); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + job.preview({}, done); + }, + function (results, job, done) { + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.fields.length, 1); + assert.strictEqual(results.fields[0], "count"); + assert.strictEqual(results.rows[0][0], "1"); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#job results iterator": function (done) { + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 10', {}, done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + var iterator = job.iterator("results", { pagesize: 4 }); + var hasMore = true; + var numElements = 0; + var pageSizes = []; + Async.whilst( + function () { return hasMore; }, + function (nextIteration) { + iterator.next(function (err, results, _hasMore) { + if (err) { + nextIteration(err); + return; + } + + hasMore = _hasMore; + if (hasMore) { + pageSizes.push(results.rows.length); + } + nextIteration(); + }); + }, + function (err) { + assert.deepStrictEqual(pageSizes, [4, 4, 2]); + done(err); + } + ); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. + // + // + // "Callback#Enable + disable preview": function(done) { + // var that = this; + // var sid = getNextId(); + + // var service = this.service.specialize("nobody", "sdk-app-collection"); + + // Async.chain([ + // function(done) { + // service.jobs().search('search index=_internal | head 1 | sleep 60', {id: sid}, done); + // }, + // function(job, done) { + // job.enablePreview(done); + + // }, + // function(job, done) { + // job.disablePreview(done); + // }, + // function(job, done) { + // job.cancel(done); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }, + + + // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. + // + // + // "Callback#Pause + unpause + finalize preview": function(done) { + // var that = this; + // var sid = getNextId(); + + // var service = this.service.specialize("nobody", "sdk-app-collection"); + + // Async.chain([ + // function(done) { + // service.jobs().search('search index=_internal | head 1 | sleep 5', {id: sid}, done); + // }, + // function(job, done) { + // job.pause(done); + // }, + // function(job, done) { + // tutils.pollUntil( + // job, + // function(j) { + // return j.properties()["isPaused"]; + // }, + // 10, + // done + // ); + // }, + // function(job, done) { + // assert.ok(job.properties()["isPaused"]); + // job.unpause(done); + // }, + // function(job, done) { + // tutils.pollUntil( + // job, + // function(j) { + // return !j.properties()["isPaused"]; + // }, + // 10, + // done + // ); + // }, + // function(job, done) { + // assert.ok(!job.properties()["isPaused"]); + // job.finalize(done); + // }, + // function(job, done) { + // job.cancel(done); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }, + + "Callback#Set TTL": function (done) { + var sid = getNextId(); + var originalTTL = 0; + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); + }, + function (job, done) { + job.fetch(done); + }, + function (job, done) { + var ttl = job.properties()["ttl"]; + originalTTL = ttl; + + job.setTTL(ttl * 2, done); + }, + function (job, done) { + job.fetch(done); + }, + function (job, done) { + var ttl = job.properties()["ttl"]; + assert.ok(ttl > originalTTL); + assert.ok(ttl <= (originalTTL * 2)); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. + // + // + // "Callback#Set priority": function(done) { + // var sid = getNextId(); + // var originalPriority = 0; + // var that = this; + + // var service = this.service.specialize("nobody", "sdk-app-collection"); + + // Async.chain([ + // function(done) { + // service.jobs().search('search index=_internal | head 1 | sleep 5', {id: sid}, done); + // }, + // function(job, done) { + // job.track({}, { + // ready: function(job) { + // done(null, job); + // } + // }); + // }, + // function(job, done) { + // var priority = job.properties()["priority"]; + // assert.ok(priority, 5); + // job.setPriority(priority + 1, done); + // }, + // function(job, done) { + // job.fetch(done); + // }, + // function(job, done) { + // job.cancel(done); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }, + + "Callback#Search log": function (done) { + var sid = getNextId(); + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1', { id: sid, exec_mode: "blocking" }, done); + }, + function (job, done) { + job.searchlog(done); + }, + function (log, job, done) { + assert.ok(job); + assert.ok(log); + assert.ok(log.length > 0); + assert.ok(log.split("\r\n").length > 0); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Search summary": function (done) { + var sid = getNextId(); + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search( + 'search index=_internal | head 1 | eval foo="bar" | fields foo', + { + id: sid, + status_buckets: 300, + rf: ["foo"] + }, + done); + }, + function (job, done) { + // Let's sleep for 2 second so + // we let the server catch up + Async.sleep(2000, function () { + job.summary({}, done); + }); + }, + function (summary, job, done) { + assert.ok(job); + assert.ok(summary); + assert.strictEqual(summary.event_count, 1); + assert.strictEqual(summary.fields.foo.count, 1); + assert.strictEqual(summary.fields.foo.distinct_count, 1); + assert.ok(summary.fields.foo.is_exact, 1); + assert.strictEqual(summary.fields.foo.modes.length, 1); + assert.strictEqual(summary.fields.foo.modes[0].count, 1); + assert.strictEqual(summary.fields.foo.modes[0].value, "bar"); + assert.ok(summary.fields.foo.modes[0].is_exact); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Search timeline": function (done) { + var sid = getNextId(); + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search( + 'search index=_internal | head 1 | eval foo="bar" | fields foo', + { + id: sid, + status_buckets: 300, + rf: ["foo"], + exec_mode: "blocking" + }, + done); + }, + function (job, done) { + job.timeline({}, done); + }, + function (timeline, job, done) { + assert.ok(job); + assert.ok(timeline); + assert.strictEqual(timeline.buckets.length, 1); + assert.strictEqual(timeline.event_count, 1); + assert.strictEqual(timeline.buckets[0].available_count, 1); + assert.strictEqual(timeline.buckets[0].duration, 0.001); + assert.strictEqual(timeline.buckets[0].earliest_time_offset, timeline.buckets[0].latest_time_offset); + assert.strictEqual(timeline.buckets[0].total_count, 1); + assert.ok(timeline.buckets[0].is_finalized); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Touch": function (done) { + var sid = getNextId(); + var that = this; + var originalTime = ""; + + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); + }, + function (job, done) { + job.fetch(done); + }, + function (job, done) { + assert.ok(job); + originalTime = job.properties().updated; + Async.sleep(1200, function () { job.touch(done); }); + }, + function (job, done) { + job.fetch(done); + }, + function (job, done) { + assert.ok(originalTime !== job.updated()); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Create failure": function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + + var jobs = this.service.jobs(); + assert.throws(function () { jobs.create({ search: originalSearch, name: name, exec_mode: "oneshot" }, function () { }); }); + done(); + }, + + "Callback#Create fails with no search string": function (done) { + var jobs = this.service.jobs(); + jobs.create( + "", {}, + function (err) { + assert.ok(err); + done(); + } + ); + }, + + "Callback#Oneshot search": function (done) { + var sid = getNextId(); + var that = this; + var originalTime = ""; + + Async.chain([ + function (done) { + that.service.jobs().oneshotSearch('search index=_internal | head 1 | stats count', { id: sid }, done); + }, + function (results, done) { + assert.ok(results); + assert.ok(results.fields); + assert.strictEqual(results.fields.length, 1); + assert.strictEqual(results.fields[0], "count"); + assert.ok(results.rows); + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.rows[0].length, 1); + assert.strictEqual(results.rows[0][0], "1"); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Oneshot search with no results": function (done) { + var sid = getNextId(); + var that = this; + var originalTime = ""; + + Async.chain([ + function (done) { + var query = 'search index=history MUST_NOT_EXISTABCDEF'; + that.service.jobs().oneshotSearch(query, { id: sid }, done); + }, + function (results, done) { + assert.ok(results); + assert.strictEqual(results.fields.length, 0); + assert.strictEqual(results.rows.length, 0); + assert.ok(!results.preview); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + // "Callback#Service oneshot search": function(done) { + // var sid = getNextId(); + // var that = this; + // var namespace = {owner: "admin", app: "search"}; + // var splunkVersion = 6.1; // Default to pre-6.2 version + // var originalLoggerLevel = "DEBUG"; + + // Async.chain([ + // function(done) { + // // If running on Splunk 6.2+, first set the search logger level to DEBUG + // Async.chain([ + // function(done1) { + // that.service.serverInfo(done1); + // }, + // function(info, done1) { + // splunkVersion = parseFloat(info.properties().version); + // if (splunkVersion < 6.2) { + // done(); // Exit the inner Async.chain + // } + // else { + // done1(); + // } + // }, + // function(done1) { + // that.service.configurations({owner: "admin", app: "search"}).fetch(done1); + // }, + // function(confs, done1) { + // try { + // confs.item("limits").fetch(done1); + // } + // catch(e) { + // done1(e); + // } + // }, + // function(conf, done1) { + // var searchInfo = conf.item("search_info"); + // // Save this so it can be restored later + // originalLoggerLevel = searchInfo.properties()["infocsv_log_level"]; + // searchInfo.update({"infocsv_log_level": "DEBUG"}, done1); + // }, + // function(conf, done1) { + // assert.strictEqual("DEBUG", conf.properties()["infocsv_log_level"]); + // done1(); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }, + // function(done) { + // that.service.oneshotSearch('search index=_internal | head 1 | stats count', {id: sid}, namespace, done); + // }, + // function(results, done) { + // assert.ok(results); + // assert.ok(results.fields); + // assert.strictEqual(results.fields.length, 1); + // assert.strictEqual(results.fields[0], "count"); + // assert.ok(results.rows); + // assert.strictEqual(results.rows.length, 1); + // assert.strictEqual(results.rows[0].length, 1); + // assert.strictEqual(results.rows[0][0], "1"); + // assert.ok(results.messages[1].text.indexOf('owner="admin"')); + // assert.ok(results.messages[1].text.indexOf('app="search"')); + + // done(); + // }, + // function(done) { + // Async.chain([ + // function(done1) { + // if (splunkVersion < 6.2) { + // done(); // Exit the inner Async.chain + // } + // else { + // done1(); + // } + // }, + // function(done1) { + // that.service.configurations({owner: "admin", app: "search"}).fetch(done1); + // }, + // function(confs, done1) { + // try { + // confs.item("limits").fetch(done1); + // } + // catch(e) { + // done1(e); + // } + // }, + // function(conf, done1) { + // var searchInfo = conf.item("search_info"); + // // Restore the logger level from before + // searchInfo.update({"infocsv_log_level": originalLoggerLevel}, done1); + // }, + // function(conf, done1) { + // assert.strictEqual(originalLoggerLevel, conf.properties()["infocsv_log_level"]); + // done1(); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }, + + "Callback#Service search": function (done) { + var sid = getNextId(); + var service = this.service; + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { + that.service.search('search index=_internal | head 1 | stats count', { id: sid }, namespace, done); + }, + function (job, done) { + assert.strictEqual(job.sid, sid); + assert.strictEqual(job.namespace, namespace); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + job.results({}, done); + }, + function (results, job, done) { + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.fields.length, 1); + assert.strictEqual(results.fields[0], "count"); + assert.strictEqual(results.rows[0][0], "1"); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Wait until job done": function (done) { + this.service.search('search index=_internal | head 1000', {}, function (err, job) { + assert.ok(!err); + + var numReadyEvents = 0; + var numProgressEvents = 0; + job.track({ period: 200 }, { + ready: function (job) { + assert.ok(job); + + numReadyEvents++; + }, + progress: function (job) { + assert.ok(job); + + numProgressEvents++; + }, + done: function (job) { + assert.ok(job); + + assert.ok(numReadyEvents === 1); // all done jobs must have become ready + assert.ok(numProgressEvents >= 1); // a job that becomes ready has progress + done(); + }, + failed: function (job) { + assert.ok(job); + + assert.ok(false, "Job failed unexpectedly."); + done(); + }, + error: function (err) { + assert.ok(err); + + assert.ok(false, "Error while tracking job."); + done(); + } + }); + }); + }, + + "Callback#Wait until job failed": function (done) { + this.service.search('search index=_internal | head bogusarg', {}, function (err, job) { + if (err) { + assert.ok(!err); + done(); + return; + } + + var numReadyEvents = 0; + var numProgressEvents = 0; + job.track({ period: 200 }, { + ready: function (job) { + assert.ok(job); + + numReadyEvents++; + }, + progress: function (job) { + assert.ok(job); + + numProgressEvents++; + }, + done: function (job) { + assert.ok(job); + + assert.ok(false, "Job became done unexpectedly."); + done(); + }, + failed: function (job) { + assert.ok(job); + + assert.ok(numReadyEvents === 1); // even failed jobs become ready + assert.ok(numProgressEvents >= 1); // a job that becomes ready has progress + done(); + }, + error: function (err) { + assert.ok(err); + + assert.ok(false, "Error while tracking job."); + done(); + } + }); + }); + }, + + "Callback#track() with default params and one function": function (done) { + this.service.search('search index=_internal | head 1', {}, function (err, job) { + if (err) { + assert.ok(!err); + done(); + return; + } + + job.track({}, function (job) { + assert.ok(job); + done(); + }); + }); + }, + + "Callback#track() should stop polling if only the ready callback is specified": function (done) { + this.service.search('search index=_internal | head 1', {}, function (err, job) { + if (err) { + assert.ok(!err); + done(); + return; + } + + job.track({}, { + ready: function (job) { + assert.ok(job); + }, + + _stoppedAfterReady: function (job) { + done(); + } + }); + }); + }, + + "Callback#track() a job that is not immediately ready": function (done) { + /*jshint loopfunc:true */ + var numJobs = 20; + var numJobsLeft = numJobs; + var gotJobNotImmediatelyReady = false; + for (var i = 0; i < numJobs; i++) { + this.service.search('search index=_internal | head 10000', {}, function (err, job) { + if (err) { + assert.ok(!err); + done(); + return; + } + + job.track({}, { + _preready: function (job) { + gotJobNotImmediatelyReady = true; + }, + + ready: function (job) { + numJobsLeft--; + + if (numJobsLeft === 0) { + if (!gotJobNotImmediatelyReady) { + splunkjs.Logger.error("", "WARNING: Couldn't test code path in track() where job wasn't ready immediately."); + } + done(); + } + } + }); + }); + } + }, + + "Callback#Service.getJob() works": function (done) { + var that = this; + var sidsMatch = false; + this.service.search('search index=_internal | head 1', {}, function (err, job) { + if (err) { + assert.ok(!err); + done(); + return; + } + var sid = job.sid; + return Async.chain([ + function (done) { + that.service.getJob(sid, done); + }, + function (innerJob, done) { + assert.strictEqual(sid, innerJob.sid); + sidsMatch = sid === innerJob.sid; + done(); + } + ], + function (err) { + assert.ok(!err); + assert.ok(sidsMatch); + done(); + } + ); + }); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + if (!process.env.SPLUNK_HOME) { + throw new Error("$PATH variable SPLUNK_HOME is not set. Please export SPLUNK_HOME to the splunk instance."); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc)); + }); + }); +} diff --git a/tests_spike/service_tests/namespace.js b/tests_spike/service_tests/namespace.js new file mode 100644 index 000000000..54a5846f2 --- /dev/null +++ b/tests_spike/service_tests/namespace.js @@ -0,0 +1,285 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); +const { Logger } = require('../../lib/log'); + +var Async = splunkjs.Async; +var utils = splunkjs.Utils; +var idCounter = 0; + +var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); +}; + +exports.setup = function (svc) { + return { + beforeEach: function (finished) { + this.service = svc; + var that = this; + + var appName1 = "jssdk_testapp_" + getNextId(); + var appName2 = "jssdk_testapp_" + getNextId(); + + var userName1 = "jssdk_testuser_" + getNextId(); + var userName2 = "jssdk_testuser_" + getNextId(); + + var apps = this.service.apps(); + var users = this.service.users(); + + this.namespace11 = { owner: userName1, app: appName1 }; + this.namespace12 = { owner: userName1, app: appName2 }; + this.namespace21 = { owner: userName2, app: appName1 }; + this.namespace22 = { owner: userName2, app: appName2 }; + + Async.chain([ + function (done) { + apps.create({ name: appName1 }, done); + }, + function (app1, done) { + that.app1 = app1; + that.appName1 = appName1; + apps.create({ name: appName2 }, done); + }, + function (app2, done) { + that.app2 = app2; + that.appName2 = appName2; + users.create({ name: userName1, password: "abcdefg!", roles: ["user"] }, done); + }, + function (user1, done) { + that.user1 = user1; + that.userName1 = userName1; + users.create({ name: userName2, password: "abcdefg!", roles: ["user"] }, done); + }, + function (user2, done) { + that.user2 = user2; + that.userName2 = userName2; + + done(); + } + ], + function (err) { + finished(err); + } + ); + }, + + "Callback#Namespace protection": function (done) { + var searchName = "jssdk_search_" + getNextId(); + var search = "search *"; + var service = this.service; + var savedSearches11 = service.savedSearches(this.namespace11); + var savedSearches21 = service.savedSearches(this.namespace21); + + Async.chain([ + function (done) { + // Create the saved search only in the 11 namespace + savedSearches11.create({ name: searchName, search: search }, done); + }, + function (savedSearch, done) { + // Refresh the 11 saved searches + savedSearches11.fetch(done); + }, + function (savedSearches, done) { + // Refresh the 21 saved searches + savedSearches21.fetch(done); + }, + function (savedSearches, done) { + var entity11 = savedSearches11.item(searchName); + var entity21 = savedSearches21.item(searchName); + + // Make sure the saved search exists in the 11 namespace + assert.ok(entity11); + assert.strictEqual(entity11.name, searchName); + assert.strictEqual(entity11.properties().search, search); + + // Make sure the saved search doesn't exist in the 11 namespace + assert.ok(!entity21); + done(); + } + ], + function (err) { + assert.ok(!err, JSON.stringify(err)); + done(); + } + ); + }, + + "Callback#Namespace item": function (done) { + var searchName = "jssdk_search_" + getNextId(); + var search = "search *"; + var service = this.service; + + var namespace_1 = { owner: "-", app: this.appName1 }; + var namespace_nobody1 = { owner: "nobody", app: this.appName1 }; + + var savedSearches11 = service.savedSearches(this.namespace11); + var savedSearches21 = service.savedSearches(this.namespace21); + var savedSearches_1 = service.savedSearches(namespace_1); + var savedSearches_nobody1 = service.savedSearches(namespace_nobody1); + + var that = this; + Async.chain([ + function (done) { + // Create a saved search in the 11 namespace + savedSearches11.create({ name: searchName, search: search }, done); + }, + function (savedSearch, done) { + // Create a saved search in the 21 namespace + savedSearches21.create({ name: searchName, search: search }, done); + }, + function (savedSearch, done) { + // Refresh the -/1 namespace + savedSearches_1.fetch(done); + }, + function (savedSearches, done) { + // Refresh the 1/1 namespace + savedSearches11.fetch(done); + }, + function (savedSearches, done) { + // Refresh the 2/1 namespace + savedSearches21.fetch(done); + }, + function (savedSearches, done) { + var entity11 = savedSearches11.item(searchName, that.namespace11); + var entity21 = savedSearches21.item(searchName, that.namespace21); + + // Ensure that the saved search exists in the 11 namespace + assert.ok(entity11); + assert.strictEqual(entity11.name, searchName); + assert.strictEqual(entity11.properties().search, search); + assert.strictEqual(entity11.namespace.owner, that.namespace11.owner); + assert.strictEqual(entity11.namespace.app, that.namespace11.app); + + // Ensure that the saved search exists in the 21 namespace + assert.ok(entity21); + assert.strictEqual(entity21.name, searchName); + assert.strictEqual(entity21.properties().search, search); + assert.strictEqual(entity21.namespace.owner, that.namespace21.owner); + assert.strictEqual(entity21.namespace.app, that.namespace21.app); + + done(); + }, + function (done) { + // Create a saved search in the nobody/1 namespace + savedSearches_nobody1.create({ name: searchName, search: search }, done); + }, + function (savedSearch, done) { + // Refresh the 1/1 namespace + savedSearches11.fetch(done); + }, + function (savedSearches, done) { + // Refresh the 2/1 namespace + savedSearches21.fetch(done); + }, + function (savedSearches, done) { + // Ensure that we can't get the item from the generic + // namespace without specifying a namespace + try { + savedSearches_1.item(searchName); + assert.ok(false); + } catch (err) { + assert.ok(err); + } + + // Ensure that we can't get the item using wildcard namespaces. + try { + savedSearches_1.item(searchName, { owner: '-' }); + assert.ok(false); + } catch (err) { + assert.ok(err); + } + + try { + savedSearches_1.item(searchName, { app: '-' }); + assert.ok(false); + } catch (err) { + assert.ok(err); + } + + try { + savedSearches_1.item(searchName, { app: '-', owner: '-' }); + assert.ok(false); + } catch (err) { + assert.ok(err); + } + + // Ensure we get the right entities from the -/1 namespace when we + // specify it. + var entity11 = savedSearches_1.item(searchName, that.namespace11); + var entity21 = savedSearches_1.item(searchName, that.namespace21); + + assert.ok(entity11); + assert.strictEqual(entity11.name, searchName); + assert.strictEqual(entity11.properties().search, search); + assert.strictEqual(entity11.namespace.owner, that.namespace11.owner); + assert.strictEqual(entity11.namespace.app, that.namespace11.app); + + assert.ok(entity21); + assert.strictEqual(entity21.name, searchName); + assert.strictEqual(entity21.properties().search, search); + assert.strictEqual(entity21.namespace.owner, that.namespace21.owner); + assert.strictEqual(entity21.namespace.app, that.namespace21.app); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#delete test users": function (done) { + var users = this.service.users(); + users.fetch(function (err, users) { + var userList = users.list(); + + Async.parallelEach( + userList, + function (user, idx, callback) { + if (utils.startsWith(user.name, "jssdk_")) { + user.remove(callback); + } else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); + } + ); + }); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc)); + }); + }); +} diff --git a/tests_spike/service_tests/parser.js b/tests_spike/service_tests/parser.js new file mode 100644 index 000000000..d5dab6f86 --- /dev/null +++ b/tests_spike/service_tests/parser.js @@ -0,0 +1,62 @@ +var assert = require('chai').assert; + +exports.setup = function (svc) { + return { + beforeEach: function (done) { + this.service = svc; + done(); + }, + + "Callback#Basic parse": function (done) { + var service = this.service; + + service.parse("search index=_internal | head 1", function (err, parse) { + assert.ok(!err); + assert.ok(parse); + assert.ok(parse.commands.length > 0); + done(); + }); + }, + + "Callback#Parse error": function (done) { + var service = this.service; + + service.parse("ABCXYZ", function (err, parse) { + assert.ok(err); + assert.strictEqual(err.status, 400); + done(); + }); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc)); + }); + }); +} diff --git a/tests_spike/service_tests/pivot.js b/tests_spike/service_tests/pivot.js new file mode 100644 index 000000000..b9e5f822f --- /dev/null +++ b/tests_spike/service_tests/pivot.js @@ -0,0 +1,1589 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); +var tutils = require('../utils'); + +var Async = splunkjs.Async; +var utils = splunkjs.Utils; +var idCounter = 0; + +var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); +}; + +exports.setup = function (svc) { + return { + beforeEach: function (done) { + this.service = svc; + this.dataModels = svc.dataModels({ owner: "nobody", app: "search" }); + this.skip = false; + var that = this; + this.service.serverInfo(function (err, info) { + if (parseInt(info.properties().version.split(".")[0], 10) < 6) { + that.skip = true; + splunkjs.Logger.log("Skipping pivot tests..."); + } + done(err); + }); + }, + + "Callback#Pivot - test constructor args": function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.ok(dataModel.objectByName("test_data")); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Pivot - test acceleration, then pivot": function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + dataModel.objectByName("test_data"); + assert.ok(dataModel); + + dataModel.acceleration.enabled = true; + dataModel.acceleration.earliestTime = "-2mon"; + dataModel.acceleration.cronSchedule = "0 */12 * * *"; + dataModel.update(done); + }, + function (dataModel, done) { + var props = dataModel.properties(); + + assert.strictEqual(true, dataModel.isAccelerated()); + assert.strictEqual(true, !!dataModel.acceleration.enabled); + assert.strictEqual("-2mon", dataModel.acceleration.earliest_time); + assert.strictEqual("0 */12 * * *", dataModel.acceleration.cron_schedule); + + var dataModelObject = dataModel.objectByName("test_data"); + var pivotSpecification = dataModelObject.createPivotSpecification(); + + assert.strictEqual(dataModelObject.dataModel.name, pivotSpecification.accelerationNamespace); + + var name1 = "delete-me-" + getNextId(); + pivotSpecification.setAccelerationJob(name1); + assert.strictEqual("sid=" + name1, pivotSpecification.accelerationNamespace); + + var namespaceTemp = "delete-me-" + getNextId(); + pivotSpecification.accelerationNamespace = namespaceTemp; + assert.strictEqual(namespaceTemp, pivotSpecification.accelerationNamespace); + + pivotSpecification + .addCellValue("test_data", "Source Value", "count") + .run(done); + }, + function (job, pivot, done) { + assert.ok(job); + assert.ok(pivot); + assert.notStrictEqual("FAILED", job.properties().dispatchState); + + job.track({}, function (job) { + assert.ok(pivot.tstatsSearch); + assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); + assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); + assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); + + assert.strictEqual(pivot.tstatsSearch, job.properties().request.search); + done(null, job); + }); + }, + function (job, done) { + assert.ok(job); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Pivot - test illegal filtering (all types)": function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + + // Boolean comparisons + try { + pivotSpecification.addFilter(getNextId(), "boolean", "=", true); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); + } + try { + pivotSpecification.addFilter("_time", "boolean", "=", true); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add boolean filter on _time because it is of type timestamp"); + } + + // String comparisons + try { + pivotSpecification.addFilter("has_boris", "string", "contains", "abc"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add string filter on has_boris because it is of type boolean"); + } + try { + pivotSpecification.addFilter(getNextId(), "string", "contains", "abc"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); + } + + // IPv4 comparisons + try { + pivotSpecification.addFilter("has_boris", "ipv4", "startsWith", "192.168"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add ipv4 filter on has_boris because it is of type boolean"); + } + try { + pivotSpecification.addFilter(getNextId(), "ipv4", "startsWith", "192.168"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); + } + + // Number comparisons + try { + pivotSpecification.addFilter("has_boris", "number", "atLeast", 2.3); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add number filter on has_boris because it is of type boolean"); + } + try { + pivotSpecification.addFilter(getNextId(), "number", "atLeast", 2.3); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); + } + + // Limit filter + try { + pivotSpecification.addLimitFilter("has_boris", "host", "DEFAULT", 50, "count"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add limit filter on has_boris because it is of type boolean"); + } + try { + pivotSpecification.addLimitFilter(getNextId(), "host", "DEFAULT", 50, "count"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add limit filter on a nonexistent field."); + } + try { + pivotSpecification.addLimitFilter("source", "host", "DEFAULT", 50, "sum"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, + "Stats function for fields of type string must be COUNT or DISTINCT_COUNT; found sum"); + } + try { + pivotSpecification.addLimitFilter("epsilon", "host", "DEFAULT", 50, "duration"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, + "Stats function for fields of type number must be one of COUNT, DISTINCT_COUNT, SUM, or AVERAGE; found duration"); + } + try { + pivotSpecification.addLimitFilter("test_data", "host", "DEFAULT", 50, "list"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, + "Stats function for fields of type object count must be COUNT; found list"); + } + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Pivot - test boolean filtering": function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addFilter("has_boris", "boolean", "=", true); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("rule")); + assert.ok(filter.hasOwnProperty("owner")); + + assert.strictEqual("has_boris", filter.fieldName); + assert.strictEqual("boolean", filter.type); + assert.strictEqual("=", filter.rule.comparator); + assert.strictEqual(true, filter.rule.compareTo); + assert.strictEqual("test_data", filter.owner); + } + catch (e) { + assert.ok(false); + } + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Pivot - test string filtering": function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addFilter("host", "string", "contains", "abc"); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("rule")); + assert.ok(filter.hasOwnProperty("owner")); + + assert.strictEqual("host", filter.fieldName); + assert.strictEqual("string", filter.type); + assert.strictEqual("contains", filter.rule.comparator); + assert.strictEqual("abc", filter.rule.compareTo); + assert.strictEqual("BaseEvent", filter.owner); + } + catch (e) { + assert.ok(false); + } + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Pivot - test IPv4 filtering": function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addFilter("hostip", "ipv4", "startsWith", "192.168"); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("rule")); + assert.ok(filter.hasOwnProperty("owner")); + + assert.strictEqual("hostip", filter.fieldName); + assert.strictEqual("ipv4", filter.type); + assert.strictEqual("startsWith", filter.rule.comparator); + assert.strictEqual("192.168", filter.rule.compareTo); + assert.strictEqual("test_data", filter.owner); + } + catch (e) { + assert.ok(false); + } + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Pivot - test number filtering": function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addFilter("epsilon", "number", ">=", 2.3); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("rule")); + assert.ok(filter.hasOwnProperty("owner")); + + assert.strictEqual("epsilon", filter.fieldName); + assert.strictEqual("number", filter.type); + assert.strictEqual(">=", filter.rule.comparator); + assert.strictEqual(2.3, filter.rule.compareTo); + assert.strictEqual("test_data", filter.owner); + } + catch (e) { + assert.ok(false); + } + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + "Callback#Pivot - test limit filtering": function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addLimitFilter("epsilon", "host", "ASCENDING", 500, "average"); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("owner")); + assert.ok(filter.hasOwnProperty("attributeName")); + assert.ok(filter.hasOwnProperty("attributeOwner")); + assert.ok(filter.hasOwnProperty("limitType")); + assert.ok(filter.hasOwnProperty("limitAmount")); + assert.ok(filter.hasOwnProperty("statsFn")); + + assert.strictEqual("epsilon", filter.fieldName); + assert.strictEqual("number", filter.type); + assert.strictEqual("test_data", filter.owner); + assert.strictEqual("host", filter.attributeName); + assert.strictEqual("BaseEvent", filter.attributeOwner); + assert.strictEqual("lowest", filter.limitType); + assert.strictEqual(500, filter.limitAmount); + assert.strictEqual("average", filter.statsFn); + } + catch (e) { + assert.ok(false); + } + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + "Callback#Pivot - test row split": function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + + // Test error handling for row split + try { + pivotSpecification.addRowSplit("has_boris", "Wrong type here"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number or string."); + } + var field = getNextId(); + try { + + pivotSpecification.addRowSplit(field, "Break Me!"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test row split, number + pivotSpecification.addRowSplit("epsilon", "My Label"); + assert.strictEqual(1, pivotSpecification.rows.length); + + var row = pivotSpecification.rows[0]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(row.hasOwnProperty("display")); + + assert.strictEqual("epsilon", row.fieldName); + assert.strictEqual("test_data", row.owner); + assert.strictEqual("number", row.type); + assert.strictEqual("My Label", row.label); + assert.strictEqual("all", row.display); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + label: "My Label", + display: "all" + }, + row); + + // Test row split, string + pivotSpecification.addRowSplit("host", "My Label"); + assert.strictEqual(2, pivotSpecification.rows.length); + + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(!row.hasOwnProperty("display")); + + assert.strictEqual("host", row.fieldName); + assert.strictEqual("BaseEvent", row.owner); + assert.strictEqual("string", row.type); + assert.strictEqual("My Label", row.label); + assert.deepEqual({ + fieldName: "host", + owner: "BaseEvent", + type: "string", + label: "My Label" + }, + row); + + // Test error handling on range row split + try { + pivotSpecification.addRangeRowSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number."); + } + try { + pivotSpecification.addRangeRowSplit(field, "Break Me!", { start: 0, end: 100, step: 20, limit: 5 }); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test range row split + pivotSpecification.addRangeRowSplit("epsilon", "My Label", { start: 0, end: 100, step: 20, limit: 5 }); + assert.strictEqual(3, pivotSpecification.rows.length); + + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(row.hasOwnProperty("display")); + assert.ok(row.hasOwnProperty("ranges")); + + assert.strictEqual("epsilon", row.fieldName); + assert.strictEqual("test_data", row.owner); + assert.strictEqual("number", row.type); + assert.strictEqual("My Label", row.label); + assert.strictEqual("ranges", row.display); + + var ranges = { + start: 0, + end: 100, + size: 20, + maxNumberOf: 5 + }; + assert.deepEqual(ranges, row.ranges); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + label: "My Label", + display: "ranges", + ranges: ranges + }, + row); + + // Test error handling on boolean row split + try { + pivotSpecification.addBooleanRowSplit("epsilon", "Wrong type here", "t", "f"); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected boolean."); + } + try { + pivotSpecification.addBooleanRowSplit(field, "Break Me!", "t", "f"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test boolean row split + pivotSpecification.addBooleanRowSplit("has_boris", "My Label", "is_true", "is_false"); + assert.strictEqual(4, pivotSpecification.rows.length); + + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(row.hasOwnProperty("trueLabel")); + assert.ok(row.hasOwnProperty("falseLabel")); + + assert.strictEqual("has_boris", row.fieldName); + assert.strictEqual("My Label", row.label); + assert.strictEqual("test_data", row.owner); + assert.strictEqual("boolean", row.type); + assert.strictEqual("is_true", row.trueLabel); + assert.strictEqual("is_false", row.falseLabel); + assert.deepEqual({ + fieldName: "has_boris", + label: "My Label", + owner: "test_data", + type: "boolean", + trueLabel: "is_true", + falseLabel: "is_false" + }, + row); + + // Test error handling on timestamp row split + try { + pivotSpecification.addTimestampRowSplit("epsilon", "Wrong type here", "some binning"); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected timestamp."); + } + try { + pivotSpecification.addTimestampRowSplit(field, "Break Me!", "some binning"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + try { + pivotSpecification.addTimestampRowSplit("_time", "some label", "Bogus binning value"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); + } + + // Test timestamp row split + pivotSpecification.addTimestampRowSplit("_time", "My Label", "day"); + assert.strictEqual(5, pivotSpecification.rows.length); + + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(row.hasOwnProperty("period")); + + assert.strictEqual("_time", row.fieldName); + assert.strictEqual("My Label", row.label); + assert.strictEqual("BaseEvent", row.owner); + assert.strictEqual("timestamp", row.type); + assert.strictEqual("day", row.period); + assert.deepEqual({ + fieldName: "_time", + label: "My Label", + owner: "BaseEvent", + type: "timestamp", + period: "day" + }, + row); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + "Callback#Pivot - test column split": function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + + // Test error handling for column split + try { + pivotSpecification.addColumnSplit("has_boris", "Wrong type here"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number or string."); + } + var field = getNextId(); + try { + + pivotSpecification.addColumnSplit(field, "Break Me!"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test column split, number + pivotSpecification.addColumnSplit("epsilon"); + assert.strictEqual(1, pivotSpecification.columns.length); + + var col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(col.hasOwnProperty("display")); + + assert.strictEqual("epsilon", col.fieldName); + assert.strictEqual("test_data", col.owner); + assert.strictEqual("number", col.type); + assert.strictEqual("all", col.display); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + display: "all" + }, + col); + + // Test column split, string + pivotSpecification.addColumnSplit("host"); + assert.strictEqual(2, pivotSpecification.columns.length); + + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(!col.hasOwnProperty("display")); + + assert.strictEqual("host", col.fieldName); + assert.strictEqual("BaseEvent", col.owner); + assert.strictEqual("string", col.type); + assert.deepEqual({ + fieldName: "host", + owner: "BaseEvent", + type: "string" + }, + col); + + done(); + + // Test error handling for range column split + try { + pivotSpecification.addRangeColumnSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number."); + } + try { + pivotSpecification.addRangeColumnSplit(field, { start: 0, end: 100, step: 20, limit: 5 }); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test range column split + pivotSpecification.addRangeColumnSplit("epsilon", { start: 0, end: 100, step: 20, limit: 5 }); + assert.strictEqual(3, pivotSpecification.columns.length); + + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(col.hasOwnProperty("display")); + assert.ok(col.hasOwnProperty("ranges")); + + assert.strictEqual("epsilon", col.fieldName); + assert.strictEqual("test_data", col.owner); + assert.strictEqual("number", col.type); + assert.strictEqual("ranges", col.display); + var ranges = { + start: 0, + end: 100, + size: 20, + maxNumberOf: 5 + }; + assert.deepEqual(ranges, col.ranges); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + display: "ranges", + ranges: ranges + }, + col); + + // Test error handling on boolean column split + try { + pivotSpecification.addBooleanColumnSplit("epsilon", "t", "f"); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected boolean."); + } + try { + pivotSpecification.addBooleanColumnSplit(field, "t", "f"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test boolean column split + pivotSpecification.addBooleanColumnSplit("has_boris", "is_true", "is_false"); + assert.strictEqual(4, pivotSpecification.columns.length); + + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(!col.hasOwnProperty("label")); + assert.ok(col.hasOwnProperty("trueLabel")); + assert.ok(col.hasOwnProperty("falseLabel")); + + assert.strictEqual("has_boris", col.fieldName); + assert.strictEqual("test_data", col.owner); + assert.strictEqual("boolean", col.type); + assert.strictEqual("is_true", col.trueLabel); + assert.strictEqual("is_false", col.falseLabel); + assert.deepEqual({ + fieldName: "has_boris", + owner: "test_data", + type: "boolean", + trueLabel: "is_true", + falseLabel: "is_false" + }, + col); + + // Test error handling on timestamp column split + try { + pivotSpecification.addTimestampColumnSplit("epsilon", "Wrong type here"); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected timestamp."); + } + try { + pivotSpecification.addTimestampColumnSplit(field, "Break Me!"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + try { + pivotSpecification.addTimestampColumnSplit("_time", "Bogus binning value"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); + } + + // Test timestamp column split + pivotSpecification.addTimestampColumnSplit("_time", "day"); + assert.strictEqual(5, pivotSpecification.columns.length); + + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(!col.hasOwnProperty("label")); + assert.ok(col.hasOwnProperty("period")); + + assert.strictEqual("_time", col.fieldName); + assert.strictEqual("BaseEvent", col.owner); + assert.strictEqual("timestamp", col.type); + assert.strictEqual("day", col.period); + assert.deepEqual({ + fieldName: "_time", + owner: "BaseEvent", + type: "timestamp", + period: "day" + }, + col); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + "Callback#Pivot - test cell value": function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + + // Test error handling for cell value, string + try { + pivotSpecification.addCellValue("iDontExist", "Break Me!", "explosion"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field iDontExist"); + } + try { + pivotSpecification.addCellValue("source", "Wrong Stats Function", "stdev"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + + " list, distinct_values, first, last, count, or distinct_count; found stdev"); + } + + // Add cell value, string + pivotSpecification.addCellValue("source", "Source Value", "dc"); + assert.strictEqual(1, pivotSpecification.cells.length); + + var cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("source", cell.fieldName); + assert.strictEqual("BaseEvent", cell.owner); + assert.strictEqual("string", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("dc", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "source", + owner: "BaseEvent", + type: "string", + label: "Source Value", + value: "dc", + sparkline: false + }, cell); + + // Test error handling for cell value, IPv4 + try { + pivotSpecification.addCellValue("hostip", "Wrong Stats Function", "stdev"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + + " list, distinct_values, first, last, count, or distinct_count; found stdev"); + } + + // Add cell value, IPv4 + pivotSpecification.addCellValue("hostip", "Source Value", "dc"); + assert.strictEqual(2, pivotSpecification.cells.length); + + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("hostip", cell.fieldName); + assert.strictEqual("test_data", cell.owner); + assert.strictEqual("ipv4", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("dc", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "hostip", + owner: "test_data", + type: "ipv4", + label: "Source Value", + value: "dc", + sparkline: false + }, cell); + + // Test error handling for cell value, boolean + try { + pivotSpecification.addCellValue("has_boris", "Booleans not allowed", "sum"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot use boolean valued fields as cell values."); + } + + // Test error handling for cell value, number + try { + pivotSpecification.addCellValue("epsilon", "Wrong Stats Function", "latest"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on number field must be must be one of:" + + " sum, count, average, max, min, stdev, list, or distinct_values; found latest"); + } + + // Add cell value, number + pivotSpecification.addCellValue("epsilon", "Source Value", "average"); + assert.strictEqual(3, pivotSpecification.cells.length); + + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("epsilon", cell.fieldName); + assert.strictEqual("test_data", cell.owner); + assert.strictEqual("number", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("average", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + label: "Source Value", + value: "average", + sparkline: false + }, cell); + + // Test error handling for cell value, timestamp + try { + pivotSpecification.addCellValue("_time", "Wrong Stats Function", "max"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on timestamp field must be one of:" + + " duration, earliest, latest, list, or distinct values; found max"); + } + + // Add cell value, timestamp + pivotSpecification.addCellValue("_time", "Source Value", "earliest"); + assert.strictEqual(4, pivotSpecification.cells.length); + + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("_time", cell.fieldName); + assert.strictEqual("BaseEvent", cell.owner); + assert.strictEqual("timestamp", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("earliest", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "_time", + owner: "BaseEvent", + type: "timestamp", + label: "Source Value", + value: "earliest", + sparkline: false + }, cell); + + // Test error handling for cell value, count + try { + pivotSpecification.addCellValue("test_data", "Wrong Stats Function", "min"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on childcount and objectcount fields " + + "must be count; found " + "min"); + } + + // Add cell value, count + pivotSpecification.addCellValue("test_data", "Source Value", "count"); + assert.strictEqual(5, pivotSpecification.cells.length); + + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("test_data", cell.fieldName); + assert.strictEqual("test_data", cell.owner); + assert.strictEqual("objectCount", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("count", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "test_data", + owner: "test_data", + type: "objectCount", + label: "Source Value", + value: "count", + sparkline: false + }, cell); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + "Callback#Pivot - test pivot throws HTTP exception": function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + obj.createPivotSpecification().pivot(done); + }, + function (pivot, done) { + assert.ok(false); + } + ], + function (err) { + assert.ok(err); + var expectedErr = "In handler 'datamodelpivot': Error in 'PivotReport': Must have non-empty cells or non-empty rows."; + assert.ok(utils.endsWith(err.message, expectedErr)); + done(); + } + ); + }, + "Callback#Pivot - test pivot with simple namespace": function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + var obj; + var pivotSpecification; + var adhocjob; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("test_data"); + assert.ok(obj); + obj.createLocalAccelerationJob(null, done); + }, + function (job, done) { + adhocjob = job; + assert.ok(job); + pivotSpecification = obj.createPivotSpecification(); + + pivotSpecification.addBooleanRowSplit("has_boris", "Has Boris", "meep", "hilda"); + pivotSpecification.addCellValue("hostip", "Distinct IPs", "count"); + + // Test setting a job + pivotSpecification.setAccelerationJob(job); + assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); + assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); + + // Test setting a job's SID + pivotSpecification.setAccelerationJob(job.sid); + assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); + assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); + + pivotSpecification.pivot(done); + }, + function (pivot, done) { + assert.ok(pivot.tstatsSearch); + assert.ok(pivot.tstatsSearch.length > 0); + assert.strictEqual(0, pivot.tstatsSearch.indexOf("| tstats")); + // This test won't work with utils.startsWith due to the regex escaping + assert.strictEqual("| tstats", pivot.tstatsSearch.match("^\\| tstats")[0]); + assert.strictEqual(1, pivot.tstatsSearch.match("^\\| tstats").length); + + pivot.run(done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties().isDone; + }, + 10, + done + ); + }, + function (job, done) { + assert.ok("FAILED" !== job.properties().dispatchState); + + assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); + // This test won't work with utils.startsWith due to the regex escaping + assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); + assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); + + adhocjob.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + "Callback#Pivot - test pivot column range split": function (done) { + // This test is here because we had a problem with fields that were supposed to be + // numbers being expected as strings in Splunk 6.0. This was fixed in Splunk 6.1, and accepts + // either strings or numbers. + + if (this.skip) { + done(); + return; + } + var that = this; + var search; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + var dm = dataModels.item("internal_audit_logs"); + var obj = dm.objectByName("searches"); + var pivotSpecification = obj.createPivotSpecification(); + + pivotSpecification.addRowSplit("user", "Executing user"); + pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); + pivotSpecification.addCellValue("search", "Search Query", "values"); + pivotSpecification.pivot(done); + }, + function (pivot, done) { + // If tstats is undefined, use pivotSearch + search = pivot.tstatsSearch || pivot.pivotSearch; + pivot.run(done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties().isDone; + }, + 10, + done + ); + }, + function (job, done) { + assert.notStrictEqual("FAILED", job.properties().dispatchState); + // Make sure the job is run with the correct search query + assert.strictEqual(search, job.properties().request.search); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + "Callback#Pivot - test pivot with PivotSpecification.run and Job.track": function (done) { + if (this.skip) { + done(); + return; + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + var dm = dataModels.item("internal_audit_logs"); + var obj = dm.objectByName("searches"); + var pivotSpecification = obj.createPivotSpecification(); + + pivotSpecification.addRowSplit("user", "Executing user"); + pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); + pivotSpecification.addCellValue("search", "Search Query", "values"); + + pivotSpecification.run({}, done); + }, + function (job, pivot, done) { + job.track({}, function (job) { + assert.strictEqual(pivot.tstatsSearch || pivot.pivotSearch, job.properties().request.search); + done(null, job); + }); + }, + function (job, done) { + assert.notStrictEqual("FAILED", job.properties().dispatchState); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + "Callback#DataModels - delete any remaining data models created by the SDK tests": function (done) { + if (this.skip) { + done(); + return; + } + svc.dataModels().fetch(function (err, dataModels) { + if (err) { + assert.ok(!err); + } + + var dms = dataModels.list(); + Async.seriesEach( + dms, + function (datamodel, i, done) { + // Delete any test data models that we created + if (utils.startsWith(datamodel.name, "delete-me")) { + datamodel.remove(done); + } + else { + done(); + } + }, + function (err) { + assert.ok(!err); + done(); + } + ); + }); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc)); + }); + }); +} diff --git a/tests_spike/service_tests/properties.js b/tests_spike/service_tests/properties.js new file mode 100644 index 000000000..911b5b762 --- /dev/null +++ b/tests_spike/service_tests/properties.js @@ -0,0 +1,161 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); + +var Async = splunkjs.Async; +var idCounter = 0; + +var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); +}; + +exports.setup = function (svc) { + return { + beforeEach: function (done) { + this.service = svc; + done(); + }, + + "Callback#list": function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { + that.service.configurations(namespace).fetch(done); + }, + function (props, done) { + var files = props.list(); + assert.ok(files.length > 0); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }, + + "Callback#item": function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("web"); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(file.name, "web"); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }, + + "Callback#contains stanza": function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("web"); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(file.name, "web"); + var stanza = file.item("settings"); + assert.ok(stanza); + stanza.fetch(done); + }, + function (stanza, done) { + assert.ok(stanza.properties().hasOwnProperty("httpport")); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }, + + "Callback#create file + create stanza + update stanza": function (done) { + var that = this; + var fileName = "jssdk_file_" + getNextId(); + var value = "barfoo_" + getNextId(); + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { + var properties = that.service.configurations(namespace); + properties.fetch(done); + }, + function (properties, done) { + properties.create(fileName, done); + }, + function (file, done) { + file.create("stanza", done); + }, + function (stanza, done) { + stanza.update({ "jssdk_foobar": value }, done); + }, + function (stanza, done) { + assert.strictEqual(stanza.properties()["jssdk_foobar"], value); + done(); + }, + function (done) { + var file = new splunkjs.Service.ConfigurationFile(svc, fileName); + file.fetch(done); + }, + function (file, done) { + var stanza = file.item("stanza"); + assert.ok(stanza); + stanza.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc)); + }); + }); +} + diff --git a/tests_spike/service_tests/savedsearch.js b/tests_spike/service_tests/savedsearch.js new file mode 100644 index 000000000..075e9f47d --- /dev/null +++ b/tests_spike/service_tests/savedsearch.js @@ -0,0 +1,458 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); +var tutils = require('../utils'); + +var Async = splunkjs.Async; +var utils = splunkjs.Utils; +var idCounter = 0; + +var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); +}; + +exports.setup = function (svc, loggedOutSvc) { + return { + beforeEach: function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + done(); + }, + + "Callback#list": function (done) { + var searches = this.service.savedSearches(); + searches.fetch(function (err, searches) { + var savedSearches = searches.list(); + assert.ok(savedSearches.length > 0); + + for (var i = 0; i < savedSearches.length; i++) { + assert.ok(savedSearches[i]); + } + + done(); + }); + }, + + "Callback#contains": function (done) { + var searches = this.service.savedSearches(); + searches.fetch(function (err, searches) { + var search = searches.item("Errors in the last hour"); + assert.ok(search); + + done(); + }); + }, + + "Callback#suppress": function (done) { + var searches = this.service.savedSearches(); + searches.fetch(function (err, searches) { + var search = searches.item("Errors in the last hour"); + assert.ok(search); + + search.suppressInfo(function (err, info, search) { + assert.ok(!err); + done(); + }); + }); + }, + + "Callback#list limit count": function (done) { + var searches = this.service.savedSearches(); + searches.fetch({ count: 2 }, function (err, searches) { + var savedSearches = searches.list(); + assert.strictEqual(savedSearches.length, 2); + + for (var i = 0; i < savedSearches.length; i++) { + assert.ok(savedSearches[i]); + } + + done(); + }); + }, + + "Callback#list filter": function (done) { + var searches = this.service.savedSearches(); + searches.fetch({ search: "Error" }, function (err, searches) { + var savedSearches = searches.list(); + assert.ok(savedSearches.length > 0); + + for (var i = 0; i < savedSearches.length; i++) { + assert.ok(savedSearches[i]); + } + + done(); + }); + }, + + "Callback#list offset": function (done) { + var searches = this.service.savedSearches(); + searches.fetch({ offset: 2, count: 1 }, function (err, searches) { + var savedSearches = searches.list(); + assert.strictEqual(searches.paging().offset, 2); + assert.strictEqual(searches.paging().perPage, 1); + assert.strictEqual(savedSearches.length, 1); + + for (var i = 0; i < savedSearches.length; i++) { + assert.ok(savedSearches[i]); + } + + done(); + }); + }, + + "Callback#create + modify + delete saved search": function (done) { + var name = "jssdk_savedsearch"; + var originalSearch = "search * | head 1"; + var updatedSearch = "search * | head 10"; + var updatedDescription = "description"; + + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); + + Async.chain([ + function (done) { + searches.create({ search: originalSearch, name: name }, done); + }, + function (search, done) { + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, originalSearch); + assert.ok(!search.properties().description); + + search.update({ search: updatedSearch }, done); + }, + function (search, done) { + assert.ok(search); + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, updatedSearch); + assert.ok(!search.properties().description); + + search.update({ description: updatedDescription }, done); + }, + function (search, done) { + assert.ok(search); + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, updatedSearch); + assert.strictEqual(search.properties().description, updatedDescription); + + search.fetch(done); + }, + function (search, done) { + // Verify that we have the required fields + assert.ok(search.fields().optional.length > 1); + assert.ok(utils.indexOf(search.fields().optional, "disabled") > -1); + + search.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#dispatch error": function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + var search = new splunkjs.Service.SavedSearch( + this.loggedOutService, + name, + { owner: "nobody", app: "search" } + ); + search.dispatch(function (err) { + assert.ok(err); + done(); + }); + }, + + "Callback#dispatch omitting optional arguments": function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); + + Async.chain( + [function (done) { + searches.create({ search: originalSearch, name: name }, done); + }, + function (search, done) { + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, originalSearch); + assert.ok(!search.properties().description); + + search.dispatch(done); + }, + function (job, search, done) { + assert.ok(job); + assert.ok(search); + }] + ); + done(); + }, + + "Callback#history error": function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + var search = new splunkjs.Service.SavedSearch( + this.loggedOutService, + name, + { owner: "nobody", app: "search", sharing: "system" } + ); + search.history(function (err) { + assert.ok(err); + done(); + }); + }, + + "Callback#Update error": function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + var search = new splunkjs.Service.SavedSearch( + this.loggedOutService, + name, + { owner: "nobody", app: "search", sharing: "system" } + ); + search.update( + {}, + function (err) { + assert.ok(err); + done(); + }); + }, + + "Callback#oneshot requires search string": function (done) { + assert.throws(function () { this.service.oneshotSearch({ name: "jssdk_oneshot_" + getNextId() }, function (err) { }); }); + done(); + }, + + "Callback#Create + dispatch + history": function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); + + Async.chain( + function (done) { + searches.create({ search: originalSearch, name: name }, done); + }, + function (search, done) { + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, originalSearch); + assert.ok(!search.properties().description); + + search.dispatch({ force_dispatch: false, "dispatch.buckets": 295 }, done); + }, + function (job, search, done) { + assert.ok(job); + assert.ok(search); + + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + Async.augment(done, search) + ); + }, + function (job, search, done) { + assert.strictEqual(job.properties().statusBuckets, 295); + search.history(Async.augment(done, job)); + }, + function (jobs, search, originalJob, done) { + assert.ok(jobs); + assert.ok(jobs.length > 0); + assert.ok(search); + assert.ok(originalJob); + + var cancel = function (job) { + return function (cb) { + job.cancel(cb); + }; + }; + + var found = false; + var cancellations = []; + for (var i = 0; i < jobs.length; i++) { + cancellations.push(cancel(jobs[i])); + found = found || (jobs[i].sid === originalJob.sid); + } + + assert.ok(found); + + search.remove(function (err) { + if (err) { + done(err); + } + else { + Async.parallel(cancellations, done); + } + }); + }, + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#job events fails": function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.events({}, function (err) { + assert.ok(err); + done(); + }); + }, + + "Callback#job preview fails": function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.preview({}, function (err) { + assert.ok(err); + done(); + }); + }, + + "Callback#job results fails": function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.results({}, function (err) { + assert.ok(err); + done(); + }); + }, + + "Callback#job searchlog fails": function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.searchlog(function (err) { + assert.ok(err); + done(); + }); + }, + + "Callback#job summary fails": function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.summary({}, function (err) { + assert.ok(err); + done(); + }); + }, + + "Callback#job timeline fails": function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.timeline({}, function (err) { + assert.ok(err); + done(); + }); + }, + + "Callback#delete test saved searches": function (done) { + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); + searches.fetch(function (err, searches) { + var searchList = searches.list(); + Async.parallelEach( + searchList, + function (search, idx, callback) { + if (utils.startsWith(search.name, "jssdk_")) { + search.remove(callback); + } + else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); + } + ); + }); + }, + + "Callback#setupInfo fails": function (done) { + var searches = new splunkjs.Service.Application(this.loggedOutService, "search"); + searches.setupInfo(function (err, content, that) { + assert.ok(err); + done(); + }); + }, + + "Callback#setupInfo succeeds": function (done) { + var app = new splunkjs.Service.Application(this.service, "sdk-app-collection"); + app.setupInfo(function (err, content, app) { + // This error message was removed in modern versions of Splunk + if (err) { + assert.ok(err.data.messages[0].text.match("Setup configuration file does not")); + splunkjs.Logger.log("ERR ---", err.data.messages[0].text); + } + else { + assert.ok(app); + } + done(); + }); + }, + + "Callback#updateInfo": function (done) { + var app = new splunkjs.Service.Application(this.service, "search"); + app.updateInfo(function (err, info, app) { + assert.ok(!err); + assert.ok(app); + assert.strictEqual(app.name, 'search'); + done(); + }); + }, + + "Callback#updateInfo failure": function (done) { + var app = new splunkjs.Service.Application(this.loggedOutService, "sdk-app-collection"); + app.updateInfo(function (err, info, app) { + assert.ok(err); + done(); + }); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + var loggedOutSvc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password + 'wrong', + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc, loggedOutSvc)); + }); + }); +} diff --git a/tests_spike/service_tests/serverinfo.js b/tests_spike/service_tests/serverinfo.js new file mode 100644 index 000000000..c5d1f8d7b --- /dev/null +++ b/tests_spike/service_tests/serverinfo.js @@ -0,0 +1,56 @@ +var assert = require('chai').assert; + +exports.setup = function (svc) { + return { + beforeEach: function (done) { + this.service = svc; + done(); + }, + + "Callback#Basic": function (done) { + var service = this.service; + + service.serverInfo(function (err, info) { + assert.ok(!err); + assert.ok(info); + assert.strictEqual(info.name, "server-info"); + assert.ok(info.properties().hasOwnProperty("version")); + assert.ok(info.properties().hasOwnProperty("serverName")); + assert.ok(info.properties().hasOwnProperty("os_version")); + + done(); + }); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc)); + }); + }); +} diff --git a/tests_spike/service_tests/storagepasswords.js b/tests_spike/service_tests/storagepasswords.js new file mode 100644 index 000000000..b6ae37830 --- /dev/null +++ b/tests_spike/service_tests/storagepasswords.js @@ -0,0 +1,645 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); + +var Async = splunkjs.Async; +var idCounter = 0; + +var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); +}; + +exports.setup = function (svc) { + return { + beforeEach: function (done) { + this.service = svc; + done(); + }, + + "Callback#Create": function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Create with backslashes": function (done) { + var startcount = -1; + var name = "\\delete-me-" + getNextId(); + var realm = "\\delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual("\\" + realm + ":\\" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Create with slashes": function (done) { + var startcount = -1; + var name = "/delete-me-" + getNextId(); + var realm = "/delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Create without realm": function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual("", storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Create should fail without user, or realm": function (done) { + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + storagePasswords.create({ name: null, password: "changed!" }, done); + } + ], + function (err) { + assert.ok(err); + done(); + } + ); + }, + + "Callback#Create should fail without password": function (done) { + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + storagePasswords.create({ name: "something", password: null }, done); + } + ], + function (err) { + assert.ok(err); + done(); + } + ); + }, + + "Callback#Create should fail without user, realm, or password": function (done) { + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + storagePasswords.create({ name: null, password: null }, done); + } + ], + function (err) { + assert.ok(err); + done(); + } + ); + }, + + "Callback#Create with colons": function (done) { + var startcount = -1; + var name = ":delete-me-" + getNextId(); + var realm = ":delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual("\\" + realm + ":\\" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Create crazy": function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ + name: name + ":end!@#$%^&*()_+{}:|<>?", + realm: ":start::!@#$%^&*()_+{}:|<>?" + realm, + password: "changed!" + }, + done); + }, + function (storagePassword, done) { + assert.strictEqual(name + ":end!@#$%^&*()_+{}:|<>?", storagePassword.properties().username); + assert.strictEqual("\\:start\\:\\:!@#$%^&*()_+{}\\:|<>?" + realm + ":" + name + "\\:end!@#$%^&*()_+{}\\:|<>?:", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(":start::!@#$%^&*()_+{}:|<>?" + realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Create with unicode chars": function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ + name: name + ":end!@#$%^&*()_+{}:|<>?쎼 and 쎶 and <&> für", + realm: ":start::!@#$%^&*()_+{}:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm, + password: decodeURIComponent(encodeURIComponent("쎼 and 쎶 and <&> für")) + }, + done); + }, + function (storagePassword, done) { + assert.strictEqual(name + ":end!@#$%^&*()_+{}:|<>?쎼 and 쎶 and <&> für", storagePassword.properties().username); + assert.strictEqual("\\:start\\:\\:!@#$%^&*()_+{}\\:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm + ":" + name + "\\:end!@#$%^&*()_+{}\\:|<>?쎼 and 쎶 and <&> für:", storagePassword.name); + assert.strictEqual(decodeURIComponent(encodeURIComponent("쎼 and 쎶 and <&> für")), storagePassword.properties().clear_password); + assert.strictEqual(":start::!@#$%^&*()_+{}:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Read": function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + try { + assert.ok(!!storagePasswords.item(realm + ":" + name + ":")); + } + catch (e) { + assert.ok(false); + } + + var list = storagePasswords.list(); + var found = false; + + assert.strictEqual(startcount + 1, list.length); + for (var i = 0; i < list.length; i++) { + if (realm + ":" + name + ":" === list[i].name) { + found = true; + } + } + assert.ok(found); + + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Read with slashes": function (done) { + var startcount = -1; + var name = "/delete-me-" + getNextId(); + var realm = "/delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + try { + assert.ok(!!storagePasswords.item(realm + ":" + name + ":")); + } + catch (e) { + assert.ok(false); + } + + var list = storagePasswords.list(); + var found = false; + + assert.strictEqual(startcount + 1, list.length); + for (var i = 0; i < list.length; i++) { + if (realm + ":" + name + ":" === list[i].name) { + found = true; + } + } + assert.ok(found); + + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + // Disabling this test because clear_password field has been removed in Splunk 8.2 + // + // + // "Callback#Update": function(done) { + // var startcount = -1; + // var name = "delete-me-" + getNextId(); + // var realm = "delete-me-" + getNextId(); + // var that = this; + // Async.chain([ + // function(done) { + // that.service.storagePasswords().fetch(done); + // }, + // function(storagePasswords, done) { + // startcount = storagePasswords.list().length; + // storagePasswords.create({name: name, realm: realm, password: "changed!"}, done); + // }, + // function(storagePassword, done) { + // assert.strictEqual(name, storagePassword.properties().username); + // assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + // assert.strictEqual("changed!", storagePassword.properties().clear_password); + // assert.strictEqual(realm, storagePassword.properties().realm); + // that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + // }, + // function(storagePasswords, storagePassword, done) { + // assert.strictEqual(startcount + 1, storagePasswords.list().length); + // storagePassword.update({password: "changed"}, done); + // }, + // function(storagePassword, done) { + // assert.strictEqual(name, storagePassword.properties().username); + // assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + // assert.strictEqual("changed", storagePassword.properties().clear_password); + // assert.strictEqual(realm, storagePassword.properties().realm); + // that.service.storagePasswords().fetch(done); + // }, + // function(storagePasswords, done) { + // var list = storagePasswords.list(); + // var found = false; + // var index = -1; + + // assert.strictEqual(startcount + 1, list.length); + // for (var i = 0; i < list.length; i ++) { + // if (realm + ":" + name + ":" === list[i].name) { + // found = true; + // index = i; + // assert.strictEqual(name, list[i].properties().username); + // assert.strictEqual(realm + ":" + name + ":", list[i].name); + // assert.strictEqual("changed", list[i].properties().clear_password); + // assert.strictEqual(realm, list[i].properties().realm); + // } + // } + // assert.ok(found); + + // if (!found) { + // done(new Error("Didn't find the created password")); + // } + // else { + // list[index].remove(done); + // } + // }, + // function(done) { + // that.service.storagePasswords().fetch(done); + // }, + // function(storagePasswords, done) { + // assert.strictEqual(startcount, storagePasswords.list().length); + // done(); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }, + + "Callback#Delete": function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + var list = storagePasswords.list(); + var found = false; + var index = -1; + + assert.strictEqual(startcount + 1, list.length); + for (var i = 0; i < list.length; i++) { + if (realm + ":" + name + ":" === list[i].name) { + found = true; + index = i; + assert.strictEqual(name, list[i].properties().username); + assert.strictEqual(realm + ":" + name + ":", list[i].name); + assert.strictEqual("changed!", list[i].properties().clear_password); + assert.strictEqual(realm, list[i].properties().realm); + } + } + assert.ok(found); + + if (!found) { + done(new Error("Didn't find the created password")); + } + else { + list[index].remove(done); + } + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc)); + }); + }); +} diff --git a/tests_spike/service_tests/typeahead.js b/tests_spike/service_tests/typeahead.js new file mode 100644 index 000000000..d7806ddc2 --- /dev/null +++ b/tests_spike/service_tests/typeahead.js @@ -0,0 +1,80 @@ +var assert = require('chai').assert; + +exports.setup = function (svc, loggedOutSvc) { + return { + beforeEach: function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + done(); + }, + + "Callback#Typeahead failure": function (done) { + var service = this.loggedOutService; + service.typeahead("index=", 1, function (err, options) { + assert.ok(err); + done(); + }); + }, + + "Callback#Basic typeahead": function (done) { + var service = this.service; + + service.typeahead("index=", 1, function (err, options) { + assert.ok(!err); + assert.ok(options); + assert.strictEqual(options.length, 1); + assert.ok(options[0]); + done(); + }); + }, + + "Typeahead with omitted optional arguments": function (done) { + var service = this.service; + service.typeahead("index=", function (err, options) { + assert.ok(!err); + assert.ok(options); + done(); + }); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + var loggedOutSvc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password + 'wrong', + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc, loggedOutSvc)); + }); + }); +} diff --git a/tests_spike/service_tests/user.js b/tests_spike/service_tests/user.js new file mode 100644 index 000000000..370f1ea9d --- /dev/null +++ b/tests_spike/service_tests/user.js @@ -0,0 +1,290 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); + +var Async = splunkjs.Async; +var utils = splunkjs.Utils; +var idCounter = 0; + +var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); +}; + +exports.setup = function (svc, loggedOutSvc) { + return { + beforeEach: function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + done(); + }, + + afterEach: function (done) { + this.service.logout(done); + }, + + "Callback#Current user": function (done) { + var service = this.service; + + service.currentUser(function (err, user) { + assert.ok(!err); + assert.ok(user); + assert.strictEqual(user.name, service.username); + done(); + }); + }, + + "Callback#Current user fails": function (done) { + var service = this.loggedOutService; + + service.currentUser(function (err, user) { + assert.ok(err); + done(); + }); + }, + + "Callback#List users": function (done) { + var service = this.service; + + service.users().fetch(function (err, users) { + var userList = users.list(); + assert.ok(!err); + assert.ok(users); + + assert.ok(userList); + assert.ok(userList.length > 0); + done(); + }); + }, + + "Callback#create user failure": function (done) { + this.loggedOutService.users().create( + { name: "jssdk_testuser", password: "abcdefg!", roles: "user" }, + function (err, response) { + assert.ok(err); + done(); + } + ); + }, + + "Callback#Create + update + delete user": function (done) { + var service = this.service; + var name = "jssdk_testuser"; + + Async.chain([ + function (done) { + service.users().create({ name: "jssdk_testuser", password: "abcdefg!", roles: "user" }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.name, name); + assert.strictEqual(user.properties().roles.length, 1); + assert.strictEqual(user.properties().roles[0], "user"); + + user.update({ realname: "JS SDK", roles: ["admin", "user"] }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.properties().realname, "JS SDK"); + assert.strictEqual(user.properties().roles.length, 2); + assert.strictEqual(user.properties().roles[0], "admin"); + assert.strictEqual(user.properties().roles[1], "user"); + + user.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }, + + "Callback#Roles": function (done) { + var service = this.service; + var name = "jssdk_testuser_" + getNextId(); + + Async.chain([ + function (done) { + service.users().create({ name: name, password: "abcdefg!", roles: "user" }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.name, name); + assert.strictEqual(user.properties().roles.length, 1); + assert.strictEqual(user.properties().roles[0], "user"); + + user.update({ roles: ["admin", "user"] }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.properties().roles.length, 2); + assert.strictEqual(user.properties().roles[0], "admin"); + assert.strictEqual(user.properties().roles[1], "user"); + + user.update({ roles: "user" }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.properties().roles.length, 1); + assert.strictEqual(user.properties().roles[0], "user"); + + user.update({ roles: "__unknown__" }, done); + } + ], + function (err) { + assert.ok(err); + assert.strictEqual(err.status, 400); + done(); + } + ); + }, + + "Callback#Passwords": function (done) { + var service = this.service; + var newService = null; + var name = "jssdk_testuser_" + getNextId(); + + var firstPassword = "abcdefg!"; + var secondPassword = "hijklmn!"; + + var useOldPassword = false; + + Async.chain([ + function (done) { + service.serverInfo(done); + }, + function (info, done) { + var versionParts = info.properties().version.split("."); + + var isDevBuild = versionParts.length === 1; + var newerThan72 = (parseInt(versionParts[0], 10) > 7 || + (parseInt(versionParts[0], 10) === 7 && parseInt(versionParts[1], 10) >= 2)); + + if (isDevBuild || newerThan72) { + useOldPassword = true; + } + done(); + }, + function (done) { + service.users().create({ name: name, password: firstPassword, roles: "user" }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.name, name); + assert.strictEqual(user.properties().roles.length, 1); + assert.strictEqual(user.properties().roles[0], "user"); + + newService = new splunkjs.Service(service.http, { + username: name, + password: firstPassword, + host: service.host, + port: service.port, + scheme: service.scheme, + version: service.version + }); + + newService.login(Async.augment(done, user)); + }, + function (success, user, done) { + assert.ok(success); + assert.ok(user); + + var body = { + password: secondPassword + }; + if (useOldPassword) { + body['oldpassword'] = firstPassword; + } + + user.update(body, done); + }, + function (user, done) { + newService.login(function (err, success) { + assert.ok(err); + assert.ok(!success); + + var body = { + password: firstPassword + }; + if (useOldPassword) { + body['oldpassword'] = secondPassword; + } + + user.update(body, done); + }); + }, + function (user, done) { + assert.ok(user); + newService.login(done); + } + ], + function (err) { + assert.ok(!err, JSON.stringify(err)); + done(); + } + ); + }, + + "Callback#delete test users": function (done) { + var users = this.service.users(); + users.fetch(function (err, users) { + var userList = users.list(); + + Async.parallelEach( + userList, + function (user, idx, callback) { + if (utils.startsWith(user.name, "jssdk_")) { + user.remove(callback); + } + else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); + } + ); + }); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + var loggedOutSvc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password + 'wrong', + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc, loggedOutSvc)); + }); + }); +} diff --git a/tests_spike/service_tests/view.js b/tests_spike/service_tests/view.js new file mode 100644 index 000000000..907206746 --- /dev/null +++ b/tests_spike/service_tests/view.js @@ -0,0 +1,96 @@ +var assert = require('chai').assert; + +var splunkjs = require('../../index'); + +var Async = splunkjs.Async; + +exports.setup = function (svc) { + return { + beforeEach: function (done) { + this.service = svc; + done(); + }, + + "Callback#List views": function (done) { + var service = this.service; + + service.views({ owner: "admin", app: "search" }).fetch(function (err, views) { + assert.ok(!err); + assert.ok(views); + + var viewsList = views.list(); + assert.ok(viewsList); + assert.ok(viewsList.length > 0); + + for (var i = 0; i < viewsList.length; i++) { + assert.ok(viewsList[i]); + } + + done(); + }); + }, + + "Callback#Create + update + delete view": function (done) { + var service = this.service; + var name = "jssdk_testview"; + var originalData = ""; + var newData = ""; + + Async.chain([ + function (done) { + service.views({ owner: "admin", app: "sdk-app-collection" }).create({ name: name, "eai:data": originalData }, done); + }, + function (view, done) { + assert.ok(view); + + assert.strictEqual(view.name, name); + assert.strictEqual(view.properties()["eai:data"], originalData); + + view.update({ "eai:data": newData }, done); + }, + function (view, done) { + assert.ok(view); + assert.strictEqual(view.properties()["eai:data"], newData); + + view.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + } + }; +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../../index'); + var options = require('../../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc)); + }); + }); +} diff --git a/tests_spike/test_async.js b/tests_spike/test_async.js new file mode 100644 index 000000000..c7b542f52 --- /dev/null +++ b/tests_spike/test_async.js @@ -0,0 +1,537 @@ + +// Copyright 2011 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. + +exports.setup = function () { + var assert = require('chai').assert; + var splunkjs = require('../index'); + var Async = splunkjs.Async; + var isBrowser = typeof "window" !== "undefined"; + splunkjs.Logger.setLevel("ALL"); + + return ( + describe('Async tests', function () { + + it("While success", function (done) { + var i = 0; + Async.whilst( + function () { return i++ < 3; }, + function (done) { + Async.sleep(0, function () { done(); }); + }, + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("While success deep", function (done) { + var i = 0; + Async.whilst( + function () { return i++ < (isBrowser ? 100 : 10000); }, + function (done) { + Async.sleep(0, function () { done(); }); + }, + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("While error", function (done) { + var i = 0; + Async.whilst( + function () { return i++ < (isBrowser ? 100 : 10000); }, + function (done) { + Async.sleep(0, function () { done(i === (isBrowser ? 50 : 10000) ? 1 : null); }); + }, + function (err) { + assert.ok(err); + assert.strictEqual(err, 1); + done(); + } + ); + }); + + it("Whilst sans condition is never", function (done) { + var i = false; + Async.whilst( + undefined, + function (done) { i = true; done(); }, + function (err) { + assert.strictEqual(i, false); + done(); + } + ); + }); + + it("Whilst with empty body does nothing", function (done) { + var i = true; + Async.whilst( + function () { + if (i) { + i = false; + return true; + } + else { + return i; + } + }, + undefined, + function (err) { + done(); + } + ); + }); + + it("Parallel success", function (done) { + Async.parallel([ + function (done) { + done(null, 1); + }, + function (done) { + done(null, 2, 3); + }], + function (err, one, two) { + assert.ok(!err); + assert.strictEqual(one, 1); + assert.strictEqual(two[0], 2); + assert.strictEqual(two[1], 3); + done(); + } + ); + }); + + it("Parallel success - outside of arrays", function (done) { + Async.parallel( + function (done) { done(null, 1); }, + function (done) { done(null, 2, 3); }, + function (err, one, two) { + assert.ok(!err); + assert.strictEqual(one, 1); + assert.strictEqual(two[0], 2); + assert.strictEqual(two[1], 3); + done(); + }); + }); + + it("Parallel success - no reordering", function (done) { + Async.parallel([ + function (done) { + Async.sleep(1, function () { done(null, 1); }); + }, + function (done) { + done(null, 2, 3); + }], + function (err, one, two) { + assert.ok(!err); + assert.strictEqual(one, 1); + assert.strictEqual(two[0], 2); + assert.strictEqual(two[1], 3); + done(); + } + ); + }); + + it("Parallel error", function (done) { + Async.parallel([ + function (done) { + done(null, 1); + }, + function (done) { + done(null, 2, 3); + }, + function (done) { + Async.sleep(0, function () { + done("ERROR"); + }); + }], + function (err, one, two) { + assert.ok(err === "ERROR"); + assert.ok(!one); + assert.ok(!two); + done(); + } + ); + }); + + it("Parallel no tasks", function (done) { + Async.parallel( + [], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("Series success", function (done) { + Async.series([ + function (done) { + done(null, 1); + }, + function (done) { + done(null, 2, 3); + }], + function (err, one, two) { + assert.ok(!err); + assert.strictEqual(one, 1); + assert.strictEqual(two[0], 2); + assert.strictEqual(two[1], 3); + done(); + } + ); + }); + + it("Series success - outside of array", function (done) { + Async.series( + function (done) { + done(null, 1); + }, + function (done) { + done(null, 2, 3); + }, + function (err, one, two) { + assert.ok(!err); + assert.strictEqual(one, 1); + assert.strictEqual(two[0], 2); + assert.strictEqual(two[1], 3); + done(); + } + ); + }); + + it("Series reordering success", function (done) { + var keeper = 0; + Async.series([ + function (done) { + Async.sleep(10, function () { + assert.strictEqual(keeper++, 0); + done(null, 1); + }); + }, + function (done) { + assert.strictEqual(keeper++, 1); + done(null, 2, 3); + }], + function (err, one, two) { + assert.ok(!err); + assert.strictEqual(keeper, 2); + assert.strictEqual(one, 1); + assert.strictEqual(two[0], 2); + assert.strictEqual(two[1], 3); + done(); + } + ); + }); + + it("Series error", function (done) { + Async.series([ + function (done) { + done(null, 1); + }, + function (done) { + done("ERROR", 2, 3); + }], + function (err, one, two) { + assert.strictEqual(err, "ERROR"); + assert.ok(!one); + assert.ok(!two); + done(); + } + ); + }); + + it("Series no tasks", function (done) { + Async.series( + [], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("Parallel map success", function (done) { + Async.parallelMap( + [1, 2, 3], + function (val, idx, done) { + done(null, val + 1); + }, + function (err, vals) { + assert.ok(!err); + assert.strictEqual(vals[0], 2); + assert.strictEqual(vals[1], 3); + assert.strictEqual(vals[2], 4); + done(); + } + ); + }); + + it("Parallel map reorder success", function (done) { + Async.parallelMap( + [1, 2, 3], + function (val, idx, done) { + if (val === 2) { + Async.sleep(100, function () { done(null, val + 1); }); + } + else { + done(null, val + 1); + } + }, + function (err, vals) { + assert.strictEqual(vals[0], 2); + assert.strictEqual(vals[1], 3); + assert.strictEqual(vals[2], 4); + done(); + } + ); + }); + + it("Parallel map error", function (done) { + Async.parallelMap( + [1, 2, 3], + function (val, idx, done) { + if (val === 2) { + done(5); + } + else { + done(null, val + 1); + } + }, + function (err, vals) { + assert.ok(err); + assert.ok(!vals); + assert.strictEqual(err, 5); + done(); + } + ); + }); + + it("Series map success", function (done) { + var keeper = 1; + Async.seriesMap( + [1, 2, 3], + function (val, idx, done) { + assert.strictEqual(keeper++, val); + done(null, val + 1); + }, + function (err, vals) { + assert.ok(!err); + assert.strictEqual(vals[0], 2); + assert.strictEqual(vals[1], 3); + assert.strictEqual(vals[2], 4); + assert.strictEqual(vals[2], keeper); + done(); + } + ); + }); + + it("Series map error", function (done) { + Async.seriesMap( + [1, 2, 3], + function (val, idx, done) { + if (val === 2) { + done(5); + } + else { + done(null, val + 1); + } + }, + function (err, vals) { + assert.ok(err); + assert.ok(!vals); + assert.strictEqual(err, 5); + done(); + } + ); + }); + + it("Chain single success", function (done) { + Async.chain([ + function (callback) { + callback(null, 1); + }, + function (val, callback) { + callback(null, val + 1); + }, + function (val, callback) { + callback(null, val + 1); + }], + function (err, val) { + assert.ok(!err); + assert.strictEqual(val, 3); + done(); + } + ); + }); + + it("Chain flat single success", function (done) { + Async.chain( + function (callback) { + callback(null, 1); + }, + function (val, callback) { + callback(null, val + 1); + }, + function (val, callback) { + callback(null, val + 1); + }, + function (err, val) { + assert.ok(!err); + assert.strictEqual(val, 3); + done(); + } + ); + }); + + it("Chain flat multiple success", function (done) { + Async.chain( + function (callback) { + callback(null, 1, 2); + }, + function (val1, val2, callback) { + callback(null, val1 + 1, val2 + 1); + }, + function (val1, val2, callback) { + callback(null, val1 + 1, val2 + 1); + }, + function (err, val1, val2) { + assert.ok(!err); + assert.strictEqual(val1, 3); + assert.strictEqual(val2, 4); + done(); + } + ); + }); + + it("Chain flat arity change success", function (done) { + Async.chain( + function (callback) { + callback(null, 1, 2); + }, + function (val1, val2, callback) { + callback(null, val1 + 1); + }, + function (val1, callback) { + callback(null, val1 + 1, 5); + }, + function (err, val1, val2) { + assert.ok(!err); + assert.strictEqual(val1, 3); + assert.strictEqual(val2, 5); + done(); + } + ); + }); + + it("Chain error", function (done) { + Async.chain([ + function (callback) { + callback(null, 1, 2); + }, + function (val1, val2, callback) { + callback(5, val1 + 1); + }, + function (val1, callback) { + callback(null, val1 + 1, 5); + }], + function (err, val1, val2) { + assert.ok(err); + assert.ok(!val1); + assert.ok(!val2); + assert.strictEqual(err, 5); + done(); + } + ); + }); + + it("Chain no tasks", function (done) { + Async.chain([], + function (err, val1, val2) { + assert.ok(!err); + assert.ok(!val1); + assert.ok(!val2); + done(); + } + ); + }); + + it("Parallel each reodrder success", function (done) { + var total = 0; + Async.parallelEach( + [1, 2, 3], + function (val, idx, done) { + var go = function () { + total += val; + done(); + }; + + if (idx === 1) { + Async.sleep(100, go); + } + else { + go(); + } + }, + function (err) { + assert.ok(!err); + assert.strictEqual(total, 6); + done(); + } + ); + }); + + it("Series each success", function (done) { + var results = [1, 3, 6]; + var total = 0; + Async.seriesEach( + [1, 2, 3], + function (val, idx, done) { + total += val; + assert.strictEqual(total, results[idx]); + done(); + }, + function (err) { + assert.ok(!err); + assert.strictEqual(total, 6); + done(); + } + ); + }); + + it("Augment callback", function (done) { + var callback = function (a, b) { + assert.ok(a); + assert.ok(b); + assert.strictEqual(a, 1); + assert.strictEqual(b, 2); + + done(); + }; + + var augmented = Async.augment(callback, 2); + augmented(1); + }); + + }) + ); +}; + +// Run the individual test suite +// if (module === require.cache[__filename] && !module.parent) { +// module.exports = exports.setup(); +// } diff --git a/tests_spike/test_context.js b/tests_spike/test_context.js new file mode 100644 index 000000000..c1c29e08c --- /dev/null +++ b/tests_spike/test_context.js @@ -0,0 +1,1106 @@ + +// Copyright 2011 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. + +exports.setup = function (svc) { + var splunkjs = require('../index'); + var tutils = require('./utils'); + var Async = splunkjs.Async; + var utils = splunkjs.Utils; + var assert = require('chai').assert; + + splunkjs.Logger.setLevel("ALL"); + var isBrowser = typeof window !== "undefined"; + + var suite = ( + describe("General Context Test", function (done) { + before(function (done) { + this.service = svc; + done(); + }); + + it("Service exists", function (done) { + assert.ok(this.service); + done(); + }); + + it("Create test search", function (done) { + // The search created here is used by several of the following tests, specifically those using get() + var searchID = "DELETEME_JSSDK_UNITTEST"; + this.service.post("search/jobs", { search: "search index=_internal | head 1", exec_mode: "blocking", id: searchID }, function (err, res) { + assert.ok(res.data.sid); + done(); + }); + }); + + it("Callback#login", function (done) { + var newService = new splunkjs.Service(svc.http, { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + username: svc.username, + password: svc.password, + version: svc.version + }); + + newService.login(function (err, success) { + assert.ok(success); + done(); + }); + }); + + it("Callback#login fail", function (done) { + var newService = new splunkjs.Service(svc.http, { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + username: svc.username, + password: svc.password + "wrong_password", + version: svc.version + }); + if (!isBrowser) { + newService.login(function (err, success) { + assert.ok(err); + assert.ok(!success); + done(); + }); + } + else { + done(); + } + }); + + it("Callback#get", function (done) { + this.service.get("search/jobs", { count: 1 }, function (err, res) { + assert.strictEqual(res.data.paging.offset, 0); + assert.ok(res.data.entry.length <= res.data.paging.total); + assert.strictEqual(res.data.entry.length, 1); + assert.ok(res.data.entry[0].content.sid); + done(); + }); + }); + + it("Callback#get error", function (done) { + this.service.get("search/jobs/1234_nosuchjob", {}, function (res) { + assert.ok(!!res); + assert.strictEqual(res.status, 404); + done(); + }); + }); + + it("Callback#get autologin - success", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + version: svc.version + } + ); + + service.get("search/jobs", { count: 1 }, function (err, res) { + assert.strictEqual(res.data.paging.offset, 0); + assert.ok(res.data.entry.length <= res.data.paging.total); + assert.strictEqual(res.data.entry.length, 1); + assert.ok(res.data.entry[0].content.sid); + done(); + }); + }); + + it("Callback#get autologin - error", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password + "ABC", + version: svc.version + } + ); + + service.get("search/jobs", { count: 1 }, function (err, res) { + assert.ok(err); + assert.strictEqual(err.status, 401); + done(); + }); + }); + + + it("Callback#get autologin - disabled", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + autologin: false, + version: svc.version + } + ); + + service.get("search/jobs", { count: 1 }, function (err, res) { + assert.ok(err); + assert.strictEqual(err.status, 401); + done(); + }); + }); + + it("Callback#get relogin - success", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + sessionKey: "ABCDEF-not-real", + version: svc.version + } + ); + + service.get("search/jobs", { count: 1 }, function (err, res) { + assert.ok(!err); + assert.strictEqual(res.data.paging.offset, 0); + assert.ok(res.data.entry.length <= res.data.paging.total); + assert.strictEqual(res.data.entry.length, 1); + assert.ok(res.data.entry[0].content.sid); + done(); + }); + }); + + it("Callback#get relogin - error", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password + "ABC", + sessionKey: "ABCDEF-not-real", + version: svc.version + } + ); + + service.get("search/jobs", { count: 1 }, function (err, res) { + assert.ok(err); + assert.strictEqual(err.status, 401); + done(); + }); + }); + + it("Callback#post", function (done) { + var service = this.service; + this.service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { + var sid = res.data.sid; + assert.ok(sid); + + var endpoint = "search/jobs/" + sid + "/control"; + service.post(endpoint, { action: "cancel" }, function (err, res) { + done(); + } + ); + } + ); + }); + + it("Callback#post error", function (done) { + this.service.post("search/jobs", { search: "index_internal | head 1" }, function (res) { + assert.ok(!!res); + assert.strictEqual(res.status, 400); + done(); + }); + }); + + it("Callback#post autologin - success", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + version: svc.version + } + ); + + service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { + var sid = res.data.sid; + assert.ok(sid); + + var endpoint = "search/jobs/" + sid + "/control"; + service.post(endpoint, { action: "cancel" }, function (err, res) { + done(); + } + ); + } + ); + }); + + it("Callback#post autologin - error", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password + "ABC", + version: svc.version + } + ); + + service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { + assert.ok(err); + assert.strictEqual(err.status, 401); + done(); + }); + }); + + it("Callback#post autologin - disabled", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + autologin: false, + version: svc.version + } + ); + + service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { + assert.ok(err); + assert.strictEqual(err.status, 401); + done(); + }); + }); + + it("Callback#post relogin - success", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + sessionKey: "ABCDEF-not-real", + version: svc.version + } + ); + + service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { + var sid = res.data.sid; + assert.ok(sid); + + var endpoint = "search/jobs/" + sid + "/control"; + service.post(endpoint, { action: "cancel" }, function (err, res) { + done(); + } + ); + } + ); + }); + + it("Callback#post relogin - error", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password + "ABC", + sessionKey: "ABCDEF-not-real", + version: svc.version + } + ); + + service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { + assert.ok(err); + assert.strictEqual(err.status, 401); + done(); + }); + }); + + it("Callback#delete", function (done) { + var service = this.service; + this.service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { + var sid = res.data.sid; + assert.ok(sid); + + var endpoint = "search/jobs/" + sid; + service.del(endpoint, {}, function (err, res) { + done(); + }); + }); + }); + + it("Callback#delete error", function (done) { + this.service.del("search/jobs/1234_nosuchjob", {}, function (res) { + assert.ok(!!res); + assert.strictEqual(res.status, 404); + done(); + }); + }); + + it("Callback#delete autologin - success", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + version: svc.version + } + ); + + service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { + var sid = res.data.sid; + assert.ok(sid); + + service.sessionKey = null; + var endpoint = "search/jobs/" + sid; + service.del(endpoint, {}, function (err, res) { + done(); + }); + }); + }); + + it("Callback#delete autologin - error", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password + "ABC", + version: svc.version + } + ); + + service.del("search/jobs/NO_SUCH_SID", {}, function (err, res) { + assert.ok(err); + assert.strictEqual(err.status, 401); + done(); + }); + }); + + it("Callback#delete autologin - disabled", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + autologin: false, + version: svc.version + } + ); + + service.del("search/jobs/NO_SUCH_SID", {}, function (err, res) { + assert.ok(err); + assert.strictEqual(err.status, 401); + done(); + }); + }); + + it("Callback#delete relogin - success", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + sessionKey: "ABCDEF-not-real", + version: svc.version + } + ); + + service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { + var sid = res.data.sid; + assert.ok(sid); + + service.sessionKey = "ABCDEF-not-real"; + var endpoint = "search/jobs/" + sid; + service.del(endpoint, {}, function (err, res) { + done(); + }); + }); + }); + + it("Callback#delete relogin - error", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password + "ABC", + sessionKey: "ABCDEF-not-real", + version: svc.version + } + ); + + service.del("search/jobs/NO_SUCH_SID", {}, function (err, res) { + assert.ok(err); + assert.strictEqual(err.status, 401); + done(); + }); + }); + + it("Callback#request get", function (done) { + var get = { count: 1 }; + var post = null; + var body = null; + this.service.request("search/jobs", "GET", get, post, body, { "X-TestHeader": 1 }, function (err, res) { + assert.strictEqual(res.data.paging.offset, 0); + assert.ok(res.data.entry.length <= res.data.paging.total); + assert.strictEqual(res.data.entry.length, 1); + assert.ok(res.data.entry[0].content.sid); + + if (res.response.request) { + assert.strictEqual(res.response.request.headers["X-TestHeader"], 1); + } + + done(); + }); + }); + + it("Callback#request post", function (done) { + var body = "search=" + encodeURIComponent("search index=_internal | head 1"); + var headers = { + "Content-Type": "application/x-www-form-urlencoded" + }; + var service = this.service; + this.service.request("search/jobs", "POST", null, null, body, headers, function (err, res) { + var sid = res.data.sid; + assert.ok(sid); + + var endpoint = "search/jobs/" + sid + "/control"; + service.post(endpoint, { action: "cancel" }, function (err, res) { + done(); + }); + }); + }); + + it("Callback#request error", function (done) { + this.service.request("search/jobs/1234_nosuchjob", "GET", null, null, null, { "X-TestHeader": 1 }, function (res) { + assert.ok(!!res); + + if (res.response.request) { + assert.strictEqual(res.response.request.headers["X-TestHeader"], 1); + } + + assert.strictEqual(res.status, 404); + done(); + }); + }); + + it("Callback#request autologin - success", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + version: svc.version + } + ); + + var get = { count: 1 }; + var post = null; + var body = null; + service.request("search/jobs", "GET", get, post, body, { "X-TestHeader": 1 }, function (err, res) { + assert.strictEqual(res.data.paging.offset, 0); + assert.ok(res.data.entry.length <= res.data.paging.total); + assert.strictEqual(res.data.entry.length, 1); + assert.ok(res.data.entry[0].content.sid); + + if (res.response.request) { + assert.strictEqual(res.response.request.headers["X-TestHeader"], 1); + } + + done(); + }); + }); + + it("Callback#request autologin - error", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password + "ABC", + version: svc.version + } + ); + + var get = { count: 1 }; + var post = null; + var body = null; + service.request("search/jobs", "GET", get, post, body, { "X-TestHeader": 1 }, function (err, res) { + assert.ok(err); + assert.strictEqual(err.status, 401); + done(); + }); + }); + + it("Callback#request autologin - disabled", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + autologin: false, + version: svc.version + } + ); + + var get = { count: 1 }; + var post = null; + var body = null; + service.request("search/jobs", "GET", get, post, body, { "X-TestHeader": 1 }, function (err, res) { + assert.ok(err); + assert.strictEqual(err.status, 401); + done(); + }); + }); + + it("Callback#request relogin - success", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + sessionKey: "ABCDEF-not-real", + version: svc.version + } + ); + + var get = { count: 1 }; + var post = null; + var body = null; + service.request("search/jobs", "GET", get, post, body, { "X-TestHeader": 1 }, function (err, res) { + assert.strictEqual(res.data.paging.offset, 0); + assert.ok(res.data.entry.length <= res.data.paging.total); + assert.strictEqual(res.data.entry.length, 1); + assert.ok(res.data.entry[0].content.sid); + + if (res.response.request) { + assert.strictEqual(res.response.request.headers["X-TestHeader"], 1); + } + + done(); + }); + }); + + it("Callback#request relogin - error", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password + "ABC", + sessionKey: "ABCDEF-not-real", + version: svc.version + } + ); + + var get = { count: 1 }; + var post = null; + var body = null; + service.request("search/jobs", "GET", get, post, body, { "X-TestHeader": 1 }, function (err, res) { + assert.ok(err); + assert.strictEqual(err.status, 401); + done(); + }); + }); + + it("Callback#abort", function (done) { + var req = this.service.get("search/jobs", { count: 1 }, function (err, res) { + assert.ok(!res); + assert.ok(err); + assert.strictEqual(err.error, "abort"); + assert.strictEqual(err.status, "abort"); + done(); + }); + + req.abort(); + }); + + it("Callback#timeout default test", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + version: svc.version + } + ); + + assert.strictEqual(0, service.timeout); + service.request("search/jobs", "GET", { count: 1 }, null, null, { "X-TestHeader": 1 }, function (err, res) { + assert.ok(res); + done(); + }); + }); + + it("Callback#timeout timed test", function (done) { + var service = new splunkjs.Service( + { + scheme: this.service.scheme, + host: this.service.host, + port: this.service.port, + username: this.service.username, + password: this.service.password, + version: svc.version, + timeout: 10000 + } + ); + + assert.strictEqual(service.timeout, 10000); + service.request("search/jobs", "GET", { count: 1 }, null, null, { "X-TestHeader": 1 }, function (err, res) { + assert.ok(res); + done(); + }); + }); + + // This test is not stable, commenting it out until we figure it out + // "Callback#timeout fail -- FAILS INTERMITTENTLY": function(done){ + // var service = new splunkjs.Service( + // { + // scheme: this.service.scheme, + // host: this.service.host, + // port: this.service.port, + // username: this.service.username, + // password: this.service.password, + // version: svc.version, + // timeout: 3000 + // } + // ); + + // // Having a timeout of 3 seconds, a max_time of 5 seconds with a blocking mode and searching realtime should involve a timeout error. + // service.get("search/jobs/export", {search:"search index=_internal", timeout:2, max_time:5, search_mode:"realtime", exec_mode:"blocking"}, function(err, res){ + // assert.ok(err); + // // Prevent test suite from erroring out if `err` is null, just fail the test + // if (err) { + // assert.strictEqual(err.status, 600); + // } + // done(); + // }); + // }, + + it("Cancel test search", function (done) { + // Here, the search created for several of the previous tests is terminated, it is no longer necessary + var endpoint = "search/jobs/DELETEME_JSSDK_UNITTEST/control"; + this.service.post(endpoint, { action: "cancel" }, function (err, res) { + done(); + }); + }); + + it("fullpath gets its owner/app from the right places", function (done) { + var http = tutils.DummyHttp; + var ctx = new splunkjs.Context(http, { /*nothing*/ }); + + // Absolute paths are unchanged + assert.strictEqual(ctx.fullpath("/a/b/c"), "/a/b/c"); + // Fall through to /services if there is no app + assert.strictEqual(ctx.fullpath("meep"), "/services/meep"); + // Are username and app set properly? + var ctx2 = new splunkjs.Context(http, { owner: "alpha", app: "beta" }); + assert.strictEqual(ctx2.fullpath("meep"), "/servicesNS/alpha/beta/meep"); + assert.strictEqual(ctx2.fullpath("meep", { owner: "boris" }), "/servicesNS/boris/beta/meep"); + assert.strictEqual(ctx2.fullpath("meep", { app: "factory" }), "/servicesNS/alpha/factory/meep"); + assert.strictEqual(ctx2.fullpath("meep", { owner: "boris", app: "factory" }), "/servicesNS/boris/factory/meep"); + // Sharing settings + assert.strictEqual(ctx2.fullpath("meep", { sharing: "app" }), "/servicesNS/nobody/beta/meep"); + assert.strictEqual(ctx2.fullpath("meep", { sharing: "global" }), "/servicesNS/nobody/beta/meep"); + assert.strictEqual(ctx2.fullpath("meep", { sharing: "system" }), "/servicesNS/nobody/system/meep"); + // Do special characters get encoded? + var ctx3 = new splunkjs.Context(http, { owner: "alpha@beta.com", app: "beta" }); + assert.strictEqual(ctx3.fullpath("meep"), "/servicesNS/alpha%40beta.com/beta/meep"); + done(); + }); + + it("version check", function (done) { + var http = tutils.DummyHttp; + var ctx; + + ctx = new splunkjs.Context(http, { "version": "4.0" }); + assert.ok(ctx.version === "4.0"); + + ctx = new splunkjs.Context(http, { "version": "4.0" }); + assert.ok(ctx.versionCompare("5.0") === -1); + ctx = new splunkjs.Context(http, { "version": "4" }); + assert.ok(ctx.versionCompare("5.0") === -1); + ctx = new splunkjs.Context(http, { "version": "4.0" }); + assert.ok(ctx.versionCompare("5") === -1); + ctx = new splunkjs.Context(http, { "version": "4.1" }); + assert.ok(ctx.versionCompare("4.9") === -1); + + ctx = new splunkjs.Context(http, { "version": "4.0" }); + assert.ok(ctx.versionCompare("4.0") === 0); + ctx = new splunkjs.Context(http, { "version": "4" }); + assert.ok(ctx.versionCompare("4.0") === 0); + ctx = new splunkjs.Context(http, { "version": "4.0" }); + assert.ok(ctx.versionCompare("4") === 0); + + ctx = new splunkjs.Context(http, { "version": "5.0" }); + assert.ok(ctx.versionCompare("4.0") === 1); + ctx = new splunkjs.Context(http, { "version": "5.0" }); + assert.ok(ctx.versionCompare("4") === 1); + ctx = new splunkjs.Context(http, { "version": "5" }); + assert.ok(ctx.versionCompare("4.0") === 1); + ctx = new splunkjs.Context(http, { "version": "4.9" }); + assert.ok(ctx.versionCompare("4.1") === 1); + + ctx = new splunkjs.Context(http, { /*nothing*/ }); + assert.ok(ctx.versionCompare("5.0") === 0); + + done(); + }); + }), + + describe("Cookie Tests", function (done) { + before(function (done) { + this.service = svc; + this.skip = false; + var that = this; + svc.serverInfo(function (err, info) { + var majorVersion = parseInt(info.properties().version.split(".")[0], 10); + var minorVersion = parseInt(info.properties().version.split(".")[1], 10); + // Skip cookie tests if Splunk older than 6.2 + if (majorVersion < 6 || (majorVersion === 6 && minorVersion < 2)) { + that.skip = true; + splunkjs.Logger.log("Skipping cookie tests..."); + } + done(); + }); + }); + + after(function (done) { + this.service.logout(done); + }); + + it("_getCookieString works as expected", function (done) { + var service = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port + }); + + service.http._cookieStore = { + 'cookie': 'format', + 'another': 'one' + }; + + var expectedCookieString = 'cookie=format; another=one; '; + var cookieString = service.http._getCookieString(); + + assert.strictEqual(cookieString, expectedCookieString); + done(); + }); + + it("login and store cookie", function (done) { + if (this.skip) { + done(); + return; + } + var service = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + username: svc.username, + password: svc.password, + version: svc.version + }); + + // Check that there are no cookies + assert.ok(utils.isEmpty(service.http._cookieStore)); + + + service.login(function (err, success) { + // Check that cookies were saved + assert.ok(!utils.isEmpty(service.http._cookieStore)); + assert.notStrictEqual(service.http._getCookieString(), ''); + done(); + }); + }); + + it("request with cookie", function (done) { + if (this.skip) { + done(); + return; + } + var service = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + username: svc.username, + password: svc.password, + version: svc.version + }); + // Create another service to put valid cookie into, give no other authentication information + var service2 = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + version: svc.version + }); + + // Login to service to get a valid cookie + Async.chain([ + function (done) { + service.login(done); + }, + function (job, done) { + // Save the cookie store + var cookieStore = service.http._cookieStore; + // Test that there are cookies + assert.ok(!utils.isEmpty(cookieStore)); + // Add the cookies to a service with no other authentication information + service2.http._cookieStore = cookieStore; + // Make a request that requires authentication + service2.get("search/jobs", { count: 1 }, done); + }, + function (res, done) { + // Test that a response was returned + assert.ok(res); + done(); + } + ], + function (err) { + // Test that no errors were returned + assert.ok(!err); + done(); + } + ); + }); + + it("request fails with bad cookie", function (done) { + if (this.skip) { + done(); + return; + } + // Create a service with no login information + var service = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + version: svc.version + }); + + // Put a bad cookie into the service + service.http._cookieStore = { "bad": "cookie" }; + + // Try requesting something that requires authentication + service.get("search/jobs", { count: 1 }, function (err, res) { + // Test if an error is returned + assert.ok(err); + // Check that it is an unauthorized error + assert.strictEqual(err.status, 401); + done(); + }); + }); + + it("autologin with cookie", function (done) { + if (this.skip) { + done(); + return; + } + var service = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + username: svc.username, + password: svc.password, + version: svc.version + }); + + // Test if service has no cookies + assert.ok(utils.isEmpty(service.http._cookieStore)); + + service.get("search/jobs", { count: 1 }, function (err, res) { + // Test if service now has a cookie + assert.ok(service.http._cookieStore); + done(); + }); + }); + + it("login fails with no cookie and no sessionKey", function (done) { + if (this.skip) { + done(); + return; + } + var service = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + version: svc.version + }); + + // Test there is no authentication information + assert.ok(utils.isEmpty(service.http._cookieStore)); + assert.strictEqual(service.sessionKey, ''); + assert.ok(!service.username); + assert.ok(!service.password); + + service.get("search/jobs", { count: 1 }, function (err, res) { + // Test if an error is returned + assert.ok(err); + done(); + }); + }); + + it("login with multiple cookies", function (done) { + if (this.skip) { + done(); + return; + } + var service = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + username: svc.username, + password: svc.password, + version: svc.version + }); + // Create another service to put valid cookie into, give no other authentication information + var service2 = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + version: svc.version + }); + + // Login to service to get a valid cookie + Async.chain([ + function (done) { + service.login(done); + }, + function (job, done) { + // Save the cookie store + var cookieStore = service.http._cookieStore; + // Test that there are cookies + assert.ok(!utils.isEmpty(cookieStore)); + + // Add a bad cookie to the cookieStore + cookieStore['bad'] = 'cookie'; + + // Add the cookies to a service with no other authenitcation information + service2.http._cookieStore = cookieStore; + + // Make a request that requires authentication + service2.get("search/jobs", { count: 1 }, done); + }, + function (res, done) { + // Test that a response was returned + assert.ok(res); + done(); + } + ], + function (err) { + // Test that no errors were returned + assert.ok(!err); + done(); + } + ); + }); + + it("autologin with cookie and bad sessionKey", function (done) { + if (this.skip) { + done(); + return; + } + var service = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, port: svc.port, + username: svc.username, + password: svc.password, + sessionKey: 'ABC-BADKEY', + version: svc.version + }); + + // Test if service has no cookies + assert.ok(utils.isEmpty(service.http._cookieStore)); + + service.get("search/jobs", { count: 1 }, function (err, res) { + // Test if service now has a cookie + assert.ok(service.http._cookieStore); + done(); + }); + }); + }) + ) + + return suite; +}; + +// Run the individual test suite +if (module === require.cache[__filename] && !module.parent) { + + var options = require('../examples/node/cmdline'); + var splunkjs = require('../index'); + + var cmdline = new options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc)); + }); + }); +} diff --git a/tests_spike/test_examples.js b/tests_spike/test_examples.js new file mode 100644 index 000000000..b3bbcde30 --- /dev/null +++ b/tests_spike/test_examples.js @@ -0,0 +1,506 @@ +// Copyright 2011 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. + +exports.setup = function (svc, opts) { + var assert = require('chai').assert; + var splunkjs = require('../index'); + var Async = splunkjs.Async; + var idCounter = 0; + var argv = ["program", "script"]; + + var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); + }; + + splunkjs.Logger.setLevel("ALL"); + + return ( + describe("Hello World Tests", function (done) { + it("Apps", function (done) { + var main = require("../examples/node/helloworld/apps").main; + main(opts, done); + }); + + it("Apps#Async", function (done) { + var main = require("../examples/node/helloworld/apps_async").main; + main(opts, done); + }); + + it("Pivot#Async", function (done) { + var main = require("../examples/node/helloworld/pivot_async").main; + main(opts, done); + }); + + it("Fired Alerts", function (done) { + var main = require("../examples/node/helloworld/firedalerts").main; + main(opts, done); + }); + + it("Fired Alerts#Async", function (done) { + var main = require("../examples/node/helloworld/firedalerts_async").main; + main(opts, done); + }); + + it("Fired Alerts#Create", function (done) { + var main = require("../examples/node/helloworld/firedalerts_create").main; + main(opts, done); + }); + + it("Fired Alerts#Delete", function (done) { + var main = require("../examples/node/helloworld/firedalerts_delete").main; + main(opts, done); + }); + + it("Get Job by sid", function (done) { + var main = require("../examples/node/helloworld/get_job").main; + main(opts, done); + }); + + it("Endpoint Instantiation", function (done) { + var main = require("../examples/node/helloworld/endpoint_instantiation").main; + main(opts, done); + }); + + it("Saved Searches", function (done) { + var main = require("../examples/node/helloworld/savedsearches").main; + main(opts, done); + }); + + it("Saved Searches#Async", function (done) { + var main = require("../examples/node/helloworld/savedsearches_async").main; + main(opts, done); + }); + + it("Saved Searches#Delete", function (done) { + var main = require("../examples/node/helloworld/savedsearches_delete").main; + main(opts, done); + }); + + it("Saved Searches#Create", function (done) { + var main = require("../examples/node/helloworld/savedsearches_create").main; + main(opts, done); + }); + + it("Saved Searches#Delete Again", function (done) { + var main = require("../examples/node/helloworld/savedsearches_delete").main; + main(opts, done); + }); + + it("Search#normal", function (done) { + var main = require("../examples/node/helloworld/search_normal").main; + main(opts, done); + }); + + it("Search#blocking", function (done) { + var main = require("../examples/node/helloworld/search_blocking").main; + main(opts, done); + }); + + it("Search#oneshot", function (done) { + var main = require("../examples/node/helloworld/search_oneshot").main; + main(opts, done); + }); + + it("Search#realtime", function (done) { + + this.timeout(40000) + var main = require("../examples/node/helloworld/search_realtime").main; + main(opts, done); + }); + + it("Logging", function (done) { + var main = require("../examples/node/helloworld/log").main; + main(opts, done); + }) + }), + + describe("Jobs Example Tests", function (done) { + beforeEach(function (done) { + var context = this; + + this.main = require("../examples/node/jobs").main; + this.run = function (command, args, options, callback) { + var combinedArgs = argv.slice(); + if (command) { + combinedArgs.push(command); + } + + if (args) { + for (var i = 0; i < args.length; i++) { + combinedArgs.push(args[i]); + } + } + + if (options) { + for (var key in options) { + if (options.hasOwnProperty(key)) { + combinedArgs.push("--" + key); + combinedArgs.push(options[key]); + } + } + } + + return context.main(combinedArgs, callback); + }; + + done(); + }); + + it("help", function (done) { + this.run(null, null, null, function (err) { + assert.ok(!!err); + done(); + }); + }); + + it("List jobs", function (done) { + this.run("list", null, null, function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Create job", function (done) { + var create = { + search: "search index=_internal | head 1", + id: getNextId() + }; + + var context = this; + context.run("create", [], create, function (err) { + assert.ok(!err); + context.run("cancel", [create.id], null, function (err) { + assert.ok(!err); + done(); + }); + }); + }); + + it("Cancel job", function (done) { + var create = { + search: "search index=_internal | head 1", + id: getNextId() + }; + + var context = this; + context.run("create", [], create, function (err) { + assert.ok(!err); + context.run("cancel", [create.id], null, function (err) { + assert.ok(!err); + done(); + }); + }); + }); + + it("List job properties", function (done) { + var create = { + search: "search index=_internal | head 1", + id: getNextId() + }; + + var context = this; + context.run("create", [], create, function (err) { + assert.ok(!err); + context.run("list", [create.id], null, function (err) { + assert.ok(!err); + context.run("cancel", [create.id], null, function (err) { + assert.ok(!err); + done(); + }); + }); + }); + }); + + it("List job events", function (done) { + var create = { + search: "search index=_internal | head 1", + id: getNextId() + }; + + var context = this; + context.run("create", [], create, function (err) { + assert.ok(!err); + context.run("events", [create.id], null, function (err) { + assert.ok(!err); + context.run("cancel", [create.id], null, function (err) { + assert.ok(!err); + done(); + }); + }); + }); + }); + + it("List job preview", function (done) { + var create = { + search: "search index=_internal | head 1", + id: getNextId() + }; + + var context = this; + context.run("create", [], create, function (err) { + assert.ok(!err); + context.run("preview", [create.id], null, function (err) { + assert.ok(!err); + context.run("cancel", [create.id], null, function (err) { + assert.ok(!err); + done(); + }); + }); + }); + }); + + it("List job results", function (done) { + var create = { + search: "search index=_internal | head 1", + id: getNextId() + }; + + var context = this; + context.run("create", [], create, function (err) { + assert.ok(!err); + context.run("results", [create.id], null, function (err) { + assert.ok(!err); + context.run("cancel", [create.id], null, function (err) { + assert.ok(!err); + done(); + }); + }); + }); + }); + + it("List job results, by column", function (done) { + var create = { + search: "search index=_internal | head 1", + id: getNextId() + }; + + var context = this; + context.run("create", [], create, function (err) { + assert.ok(!err); + context.run("results", [create.id], { output_mode: "json_cols" }, function (err) { + assert.ok(!err); + context.run("cancel", [create.id], null, function (err) { + assert.ok(!err); + done(); + }); + }); + }); + }); + + it("Create+list multiple jobs", function (done) { + var creates = []; + for (var i = 0; i < 3; i++) { + creates[i] = { + search: "search index=_internal | head 1", + id: getNextId() + }; + } + var sids = creates.map(function (create) { return create.id; }); + + var context = this; + Async.parallelMap( + creates, + function (create, idx, done) { + context.run("create", [], create, function (err, job) { + assert.ok(!err); + assert.ok(job); + assert.strictEqual(job.sid, create.id); + done(null, job); + }); + }, + function (err, created) { + for (var i = 0; i < created.length; i++) { + assert.strictEqual(creates[i].id, created[i].sid); + } + + context.run("list", sids, null, function (err) { + assert.ok(!err); + context.run("cancel", sids, null, function (err) { + assert.ok(!err); + done(); + }); + }); + + } + ); + }) + }), + + describe("Search Example Tests", function (done) { + beforeEach(function (done) { + var context = this; + + this.main = require("../examples/node/search").main; + this.run = function (command, args, options, callback) { + var combinedArgs = argv.slice(); + if (command) { + combinedArgs.push(command); + } + + if (args) { + for (var i = 0; i < args.length; i++) { + combinedArgs.push(args[i]); + } + } + + if (options) { + for (var key in options) { + if (options.hasOwnProperty(key)) { + combinedArgs.push("--" + key); + combinedArgs.push(options[key]); + } + } + } + + return context.main(combinedArgs, callback); + }; + + done(); + }); + + it("Create regular search", function (done) { + var options = { + search: "search index=_internal | head 5" + }; + + this.run(null, null, options, function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Create regular search with verbose", function (done) { + var options = { + search: "search index=_internal | head 5" + }; + + this.run(null, ["--verbose"], options, function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Create oneshot search", function (done) { + var options = { + search: "search index=_internal | head 5", + exec_mode: "oneshot" + }; + + this.run(null, ["--verbose"], options, function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Create normal search with reduced count", function (done) { + var options = { + search: "search index=_internal | head 20", + count: 10 + }; + + this.run(null, ["--verbose"], options, function (err) { + assert.ok(!err); + done(); + }); + }) + }) + + // This test is commented out because it causes a failure/hang on + // Node >0.6. We need to revisit this test, so disabling it for now. + /*"Results Example Tests": { + + "Parse row results": function(done) { + var main = require("../examples/node/results").main; + + svc.search( + "search index=_internal | head 1 | stats count by sourcetype", + {exec_mode: "blocking"}, + function(err, job) { + assert.ok(!err); + job.results({output_mode: "json_rows"}, function(err, results) { + assert.ok(!err); + process.stdin.emit("data", JSON.stringify(results)); + process.stdin.emit("end"); + }); + } + ); + + main([], function(err) { + assert.ok(!err); + done(); + }); + }, + + "Parse column results": function(done) { + var main = require("../examples/node/results").main; + + svc.search( + "search index=_internal | head 10 | stats count by sourcetype", + {exec_mode: "blocking"}, + function(err, job) { + assert.ok(!err); + job.results({output_mode: "json_cols"}, function(err, results) { + assert.ok(!err); + process.stdin.emit("data", JSON.stringify(results)); + process.stdin.emit("end"); + }); + } + ); + + main([], function(err) { + assert.ok(!err); + done(); + }); + }, + + "Close stdin": function(done) { + process.stdin.destroy(); + done(); + } + }*/ + ) +}; + +// Run the individual test suite +if (module === require.cache[__filename] && !module.parent) { + + var splunkjs = require('../index'); + var options = require('../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc, cmdline.opts)); + }); + }); +} diff --git a/tests_spike/test_http.js b/tests_spike/test_http.js new file mode 100644 index 000000000..94cbd6615 --- /dev/null +++ b/tests_spike/test_http.js @@ -0,0 +1,314 @@ + +// Copyright 2011 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. + +exports.setup = function (http) { + var assert = require('chai').assert; + var splunkjs = require('../index'); + + splunkjs.Logger.setLevel("ALL"); + + return ( + describe("HTTP GET Tests", function (done) { + before(function (done) { + this.http = http; + done(); + }); + + it("Callback#abort simple", function (done) { + var req = this.http.get("https://httpbin.org/get", {}, {}, 0, function (err, res) { + assert.ok(err); + assert.strictEqual(err.error, "abort"); + done(); + }); + + req.abort(); + }); + + it("Callback#abort delay", function (done) { + var req = this.http.get("https://httpbin.org/delay/20", {}, {}, 0, function (err, res) { + assert.ok(err); + assert.strictEqual(err.error, "abort"); + done(); + }); + + splunkjs.Async.sleep(1000, function () { + req.abort(); + }); + }); + + it("Callback#no args", function (done) { + this.http.get("https://httpbin.org/get", [], {}, 0, function (err, res) { + assert.strictEqual(res.data.url, "https://httpbin.org/get"); + done(); + }); + }); + + it("Callback#success success+error", function (done) { + this.http.get("https://httpbin.org/get", [], {}, 0, function (err, res) { + assert.ok(!err); + assert.strictEqual(res.data.url, "https://httpbin.org/get"); + done(); + }); + }); + + it("Callback#error all", function (done) { + this.timeout(40000); + this.http.get("https://httpbin.org/status/404", [], {}, 0, function (err, res) { + assert.strictEqual(err.status, 404); + done(); + }); + }); + + it("Callback#args", function (done) { + this.timeout(40000); + this.http.get("https://httpbin.org/get", [], { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { + var args = res.data.args; + assert.strictEqual(args.a, "1"); + assert.strictEqual(args.b, "2"); + assert.deepEqual(args.c, ["1", "2", "3"]); + assert.strictEqual(args.d, "a/b"); + assert.strictEqual(res.data.url, "https://httpbin.org/get?a=1&b=2&c=1&c=2&c=3&d=a%2Fb"); + done(); + }); + }); + + it("Callback#args with objects", function (done) { + this.timeout(40000); + this.http.get( + "https://httpbin.org/get", [], + { a: 1, b: { c: "ab", d: 12 } }, 0, + function (err, res) { + var args = res.data.args; + assert.strictEqual(args.a, "1"); + assert.deepEqual(args.b, ["ab", "12"]); + assert.strictEqual( + res.data.url, + "https://httpbin.org/get?a=1&b=ab&b=12" + ); + done(); + } + ); + }); + + it("Callback#headers", function (done) { + var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; + + this.http.get("https://httpbin.org/get", { "X-Test1": 1, "X-Test2": "a/b/c" }, {}, 0, function (err, res) { + var returnedHeaders = res.data.headers; + for (var headerName in headers) { + if (headers.hasOwnProperty(headerName)) { + // We have to make the header values into strings + assert.strictEqual(headers[headerName] + "", returnedHeaders[headerName]); + } + } + + assert.strictEqual(res.data.url, "https://httpbin.org/get"); + done(); + }); + }); + + it("Callback#all", function (done) { + var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; + + this.http.get("https://httpbin.org/get", { "X-Test1": 1, "X-Test2": "a/b/c" }, { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { + var returnedHeaders = res.data.headers; + for (var headerName in headers) { + if (headers.hasOwnProperty(headerName)) { + // We have to make the header values into strings + assert.strictEqual(headers[headerName] + "", returnedHeaders[headerName]); + } + } + + var args = res.data.args; + assert.strictEqual(args.a, "1"); + assert.strictEqual(args.b, "2"); + assert.deepEqual(args.c, ["1", "2", "3"]); + assert.strictEqual(args.d, "a/b"); + assert.strictEqual(res.data.url, "https://httpbin.org/get?a=1&b=2&c=1&c=2&c=3&d=a%2Fb"); + done(); + }); + }); + }), + + describe("HTTP POST Tests", function (done) { + before(function (done) { + this.http = http; + done(); + }); + + it("Callback#no args", function (done) { + this.http.post("https://httpbin.org/post", {}, {}, 0, function (err, res) { + assert.strictEqual(res.data.url, "https://httpbin.org/post"); + done(); + }); + }); + + it("Callback#success success+error", function (done) { + this.http.post("https://httpbin.org/post", {}, {}, 0, function (err, res) { + assert.ok(!err); + assert.strictEqual(res.data.url, "https://httpbin.org/post"); + done(); + }); + }); + + it("Callback#error all", function (done) { + this.http.post("https://httpbin.org/status/405", {}, {}, 0, function (err, res) { + assert.strictEqual(err.status, 405); + done(); + }); + }); + + it("Callback#args", function (done) { + this.http.post("https://httpbin.org/post", {}, { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { + var args = res.data.form; + assert.strictEqual(args.a, "1"); + assert.strictEqual(args.b, "2"); + assert.deepStrictEqual(args.c, ["1", "2", "3"]); + assert.strictEqual(args.d, "a/b"); + assert.strictEqual(res.data.url, "https://httpbin.org/post"); + done(); + }); + }); + + it("Callback#headers", function (done) { + var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; + + this.http.post("https://httpbin.org/post", { "X-Test1": 1, "X-Test2": "a/b/c" }, {}, 0, function (err, res) { + var returnedHeaders = res.data.headers; + for (var headerName in headers) { + if (headers.hasOwnProperty(headerName)) { + // We have to make the header values into strings + assert.strictEqual(headers[headerName] + "", returnedHeaders[headerName]); + } + } + assert.strictEqual(res.data.url, "https://httpbin.org/post"); + done(); + }); + }); + + it("Callback#all", function (done) { + var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; + + this.http.post("https://httpbin.org/post", { "X-Test1": 1, "X-Test2": "a/b/c" }, { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { + var returnedHeaders = res.data.headers; + for (var headerName in headers) { + if (headers.hasOwnProperty(headerName)) { + // We have to make the header values into strings + assert.strictEqual(headers[headerName] + "", returnedHeaders[headerName]); + } + } + + var args = res.data.form; + assert.strictEqual(args.a, "1"); + assert.strictEqual(args.b, "2"); + assert.deepStrictEqual(args.c, ["1", "2", "3"]); + assert.strictEqual(args.d, "a/b"); + assert.strictEqual(res.data.url, "https://httpbin.org/post"); + done(); + }); + }) + }), + + describe("HTTP DELETE Tests", function (done) { + before(function (done) { + this.http = http; + done(); + }); + + it("Callback#no args", function (done) { + this.http.del("https://httpbin.org/delete", [], {}, 0, function (err, res) { + assert.strictEqual(res.data.url, "https://httpbin.org/delete"); + done(); + }); + }); + + it("Callback#success success+error", function (done) { + this.http.del("https://httpbin.org/delete", [], {}, 0, function (err, res) { + assert.ok(!err); + assert.strictEqual(res.data.url, "https://httpbin.org/delete"); + done(); + }); + }); + + it("Callback#error all", function (done) { + this.http.del("https://httpbin.org/status/405", [], {}, 0, function (err, res) { + assert.strictEqual(err.status, 405); + done(); + }); + }); + + it("Callback#args", function (done) { + this.http.del("https://httpbin.org/delete", [], { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { + assert.strictEqual(res.data.url, "https://httpbin.org/delete?a=1&b=2&c=1&c=2&c=3&d=a%2Fb"); + done(); + }); + }); + + it("Callback#headers", function (done) { + var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; + + this.http.del("https://httpbin.org/delete", { "X-Test1": 1, "X-Test2": "a/b/c" }, {}, 0, function (err, res) { + var returnedHeaders = res.data.headers; + for (var headerName in headers) { + if (headers.hasOwnProperty(headerName)) { + // We have to make the header values into strings + assert.strictEqual(headers[headerName] + "", returnedHeaders[headerName]); + } + } + assert.strictEqual(res.data.url, "https://httpbin.org/delete"); + done(); + }); + }); + + it("Callback#all", function (done) { + var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; + + this.http.del("https://httpbin.org/delete", { "X-Test1": 1, "X-Test2": "a/b/c" }, { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { + var returnedHeaders = res.data.headers; + for (var headerName in headers) { + if (headers.hasOwnProperty(headerName)) { + // We have to make the header values into strings + assert.strictEqual(headers[headerName] + "", returnedHeaders[headerName]); + } + } + assert.strictEqual(res.data.url, "https://httpbin.org/delete?a=1&b=2&c=1&c=2&c=3&d=a%2Fb"); + done(); + }); + }); + + it("Default arguments to Http work", function (done) { + var NodeHttp = splunkjs.NodeHttp; + var h = new NodeHttp(); + assert.ok(h); + done(); + }); + + it("Methods of Http base class that must be overrided", function (done) { + var h = new splunkjs.Http(); + assert.throws(function () { h.makeRequest("asdf", null, null); }); + assert.throws(function () { h.parseJson("{}"); }); + done(); + }) + }) + ) +}; + +// Run the individual test suite +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../index'); + var http = new splunkjs.NodeHttp(); + + module.exports = exports.setup(http); +} diff --git a/tests_spike/test_log.js b/tests_spike/test_log.js new file mode 100644 index 000000000..a0bdb118e --- /dev/null +++ b/tests_spike/test_log.js @@ -0,0 +1,94 @@ +// Copyright 2011 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. + +exports.setup = function () { + var assert = require('chai').assert; + var isBrowser = typeof window !== "undefined"; + + var unload = function (name) { + for (var k in require.cache) { + if (require.cache[k] && k.match(name + "$")) { + delete require.cache[k]; + } + } + }; + + if (isBrowser) { + return {}; + } + else { + return ( + describe('Log tests', function () { + it("Default level with no environment variable", function (done) { + var oldVal = process.env.LOG_LEVEL; + delete process.env.LOG_LEVEL; + unload("log.js"); + var logger = require("../lib/log.js"); + assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.ERROR); + process.env.LOG_LEVEL = oldVal; + unload("log.js"); + done(); + }); + + it("Setting a nonexistant level default to errors", function (done) { + var oldVal = process.env.LOG_LEVEL; + process.env.LOG_LEVEL = "25"; + unload("log.js"); + var logger = require("../lib/log.js"); + assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.ERROR); + process.env.LOG_LEVEL = oldVal; + unload("log.js"); + done(); + }); + + it("Setting logging level as integer works", function (done) { + var oldVal = process.env.LOG_LEVEL; + process.env.LOG_LEVEL = "3"; + unload("log.js"); + var logger = require("../lib/log.js"); + assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.INFO); + process.env.LOG_LEVEL = oldVal; + unload("log.js"); + done(); + }); + + it("Setting logging level as string works", function (done) { + var oldVal = process.env.LOG_LEVEL; + process.env.LOG_LEVEL = "INFO"; + unload("log.js"); + var logger = require("../lib/log.js"); + assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.INFO); + process.env.LOG_LEVEL = oldVal; + unload("log.js"); + done(); + }); + + it("Setting logging level after the fact works", function (done) { + var oldVal = process.env.LOG_LEVEL; + unload("log.js"); + var logger = require("../lib/log.js"); + logger.Logger.setLevel(); + process.env.LOG_LEVEL = oldVal; + unload("log.js"); + done(); + }); + }) + ) + }; +}; + +// Run the individual test suite +if (module === require.cache[__filename] && !module.parent) { + module.exports = exports.setup(); +} diff --git a/tests_spike/test_service.js b/tests_spike/test_service.js new file mode 100644 index 000000000..3cb5534ce --- /dev/null +++ b/tests_spike/test_service.js @@ -0,0 +1,83 @@ + +// Copyright 2011 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. + +exports.setup = function (svc, loggedOutSvc) { + + return ( + require("./service_tests/app").setup(svc), + require("./service_tests/collection").setup(svc, loggedOutSvc), + require("./service_tests/configuration").setup(svc), + require("./service_tests/datamodels").setup(svc), + require("./service_tests/endpoint").setup(svc), + require("./service_tests/entity").setup(svc, loggedOutSvc), + require("./service_tests/firedalerts").setup(svc, loggedOutSvc), + require("./service_tests/indexes").setup(svc, loggedOutSvc), + require("./service_tests/job").setup(svc), + require("./service_tests/namespace").setup(svc), + require("./service_tests/parser").setup(svc), + require("./service_tests/pivot").setup(svc), + require("./service_tests/properties").setup(svc), + require("./service_tests/savedsearch").setup(svc, loggedOutSvc), + require("./service_tests/serverinfo").setup(svc), + require("./service_tests/storagepasswords").setup(svc), + require("./service_tests/typeahead").setup(svc, loggedOutSvc), + require("./service_tests/user").setup(svc, loggedOutSvc), + require("./service_tests/view").setup(svc) + ) +}; + +if (module === require.cache[__filename] && !module.parent) { + var splunkjs = require('../index'); + var options = require('../examples/node/cmdline'); + + var cmdline = options.create().parse(process.argv); + + // If there is no command line, we should return + if (!cmdline) { + throw new Error("Error in parsing command line parameters"); + } + + if (!process.env.SPLUNK_HOME) { + throw new Error("$PATH variable SPLUNK_HOME is not set. Please export SPLUNK_HOME to the splunk instance."); + } + + var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version + }); + + var loggedOutSvc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password + 'wrong', + version: cmdline.opts.version + }); + + // Exports tests on a successful login + module.exports = new Promise((resolve, reject) => { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + return resolve(exports.setup(svc, loggedOutSvc)); + }); + }); +} diff --git a/tests_spike/test_utils.js b/tests_spike/test_utils.js new file mode 100644 index 000000000..3c5ff3484 --- /dev/null +++ b/tests_spike/test_utils.js @@ -0,0 +1,268 @@ + +// Copyright 2011 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. + +exports.setup = function () { + var splunkjs = require('../index'); + var assert = require('chai').assert; + + splunkjs.Logger.setLevel("ALL"); + + return ( + describe('Utils tests', function (done) { + it("Callback#callback to object success", function (done) { + var successfulFunction = function (callback) { + callback(null, "one", "two"); + }; + + successfulFunction(function (err, one, two) { + assert.strictEqual(one, "one"); + assert.strictEqual(two, "two"); + done(); + }); + }); + + it("Callback#callback to object error - single argument", function (done) { + var successfulFunction = function (callback) { + callback("one"); + }; + + successfulFunction(function (err, one, two) { + assert.strictEqual(err, "one"); + assert.ok(!one); + assert.ok(!two); + done(); + }); + }); + + it("Callback#callback to object error - multi argument", function (done) { + var successfulFunction = function (callback) { + callback(["one", "two"]); + }; + + successfulFunction(function (err, one, two) { + assert.strictEqual(err[0], "one"); + assert.strictEqual(err[1], "two"); + assert.ok(!one); + assert.ok(!two); + done(); + }); + }); + + it("keyOf works", function (done) { + assert.ok(splunkjs.Utils.keyOf(3, { a: 3, b: 5 })); + assert.ok(!splunkjs.Utils.keyOf(3, { a: 12, b: 6 })); + done(); + }); + + it("bind", function (done) { + var f; + (function () { + f = function (a) { + this.a = a; + }; + })(); + var q = {}; + var g = splunkjs.Utils.bind(q, f); + g(12); + assert.strictEqual(q.a, 12); + done(); + }); + + it("trim", function (done) { + assert.strictEqual(splunkjs.Utils.trim(" test of something \n\r \t"), "test of something"); + + var realTrim = String.prototype.trim; + String.prototype.trim = null; + assert.strictEqual(splunkjs.Utils.trim(" test of something \n\r \t"), "test of something"); + String.prototype.trim = realTrim; + + done(); + }); + + it("indexOf", function (done) { + assert.strictEqual(splunkjs.Utils.indexOf([1, 2, 3, 4, 5], 3), 2); + assert.strictEqual(splunkjs.Utils.indexOf([1, 2, 3, 4, 3], 3), 2); + assert.strictEqual(splunkjs.Utils.indexOf([1, 2, 3, 4, 5], 12), -1); + done(); + }); + + it("contains", function (done) { + assert.ok(splunkjs.Utils.contains([1, 2, 3, 4, 5], 3)); + assert.ok(splunkjs.Utils.contains([1, 2, 3, 4, 3], 3)); + assert.ok(!splunkjs.Utils.contains([1, 2, 3, 4, 5], 12)); + done(); + }); + + it("startsWith", function (done) { + assert.ok(splunkjs.Utils.startsWith("abcdefg", "abc")); + assert.ok(!splunkjs.Utils.startsWith("bcdefg", "abc")); + done(); + }); + + it("endsWith", function (done) { + assert.ok(splunkjs.Utils.endsWith("abcdef", "def")); + assert.ok(!splunkjs.Utils.endsWith("abcdef", "bcd")); + done(); + }); + + it("toArray", function (done) { + (function () { + var found = splunkjs.Utils.toArray(arguments); + var expected = [1, 2, 3, 4, 5]; + for (var i = 0; i < found.length; i++) { + assert.strictEqual(found[i], expected[i]); + } + })(1, 2, 3, 4, 5); + done(); + }); + + it("isArray", function (done) { + var a = [1, 2, 3, 4, 5]; + assert.ok(splunkjs.Utils.isArray(a)); + done(); + }); + + it("isFunction", function (done) { + assert.ok(splunkjs.Utils.isFunction(function () { })); + assert.ok(!splunkjs.Utils.isFunction(3)); + assert.ok(!splunkjs.Utils.isFunction("abc")); + assert.ok(!splunkjs.Utils.isFunction({})); + done(); + }); + + it("isNumber", function (done) { + assert.ok(splunkjs.Utils.isNumber(3)); + assert.ok(splunkjs.Utils.isNumber(-2.55113e12)); + assert.ok(!splunkjs.Utils.isNumber("3")); + assert.ok(!splunkjs.Utils.isNumber({ 3: 5 })); + done(); + }); + + it("isObject", function (done) { + assert.ok(splunkjs.Utils.isObject({})); + assert.ok(!splunkjs.Utils.isObject(3)); + assert.ok(!splunkjs.Utils.isObject("3")); + done(); + }); + + it("isEmpty", function (done) { + assert.ok(splunkjs.Utils.isEmpty({})); + assert.ok(splunkjs.Utils.isEmpty([])); + assert.ok(splunkjs.Utils.isEmpty("")); + assert.ok(!splunkjs.Utils.isEmpty({ a: 3 })); + assert.ok(!splunkjs.Utils.isEmpty([1, 2])); + assert.ok(!splunkjs.Utils.isEmpty("abc")); + done(); + }); + + it("forEach", function (done) { + var a = [1, 2, 3, 4, 5]; + splunkjs.Utils.forEach( + a, + function (elem, index, list) { + assert.strictEqual(a[index], elem); + } + ); + var b = { 1: 2, 2: 4, 3: 6 }; + splunkjs.Utils.forEach( + b, + function (elem, key, obj) { + assert.strictEqual(b[key], elem); + } + ); + splunkjs.Utils.forEach(null, function (elem, key, obj) { }); + var c = { length: 5, 1: 12, 2: 15, 3: 8 }; + splunkjs.Utils.forEach( + c, + function (elem, key, obj) { + assert.strictEqual(c[key], elem); + } + ); + done(); + }); + + it("extend", function (done) { + var found = splunkjs.Utils.extend({}, { a: 1, b: 2 }, { c: 3, b: 4 }); + var expected = { a: 1, b: 4, c: 3 }; + for (var k in found) { + if (found.hasOwnProperty(k)) { + assert.strictEqual(found[k], expected[k]); + } + } + done(); + }); + + it("clone", function (done) { + var a = { a: 1, b: 2, c: { p: 5, q: 6 } }; + var b = splunkjs.Utils.clone(a); + splunkjs.Utils.forEach(a, function (val, key, obj) { assert.strictEqual(val, b[key]); }); + a.a = 5; + assert.strictEqual(b.a, 1); + a.c.p = 4; + assert.strictEqual(b.c.p, 4); + done(); + assert.strictEqual(splunkjs.Utils.clone(3), 3); + assert.strictEqual(splunkjs.Utils.clone("asdf"), "asdf"); + var p = [1, 2, [3, 4], 3]; + var q = splunkjs.Utils.clone(p); + splunkjs.Utils.forEach(p, function (val, index, arr) { assert.strictEqual(p[index], q[index]); }); + p[0] = 3; + assert.strictEqual(q[0], 1); + p[2][0] = 7; + assert.strictEqual(q[2][0], 7); + }); + + it("namespaceFromProperties", function (done) { + var a = splunkjs.Utils.namespaceFromProperties( + { + acl: { + owner: "boris", + app: "factory", + sharing: "system", + other: 3 + }, + more: 12 + }); + splunkjs.Utils.forEach( + a, + function (val, key, obj) { + assert.ok((key === "owner" && val === "boris") || + (key === "app" && val === "factory") || + (key === "sharing" && val === "system")); + } + ); + done(); + }); + + it("namespaceFromProperties - bad data", function (done) { + var undefinedProps; + var a = splunkjs.Utils.namespaceFromProperties(undefinedProps); + assert.strictEqual(a.owner, ''); + assert.strictEqual(a.app, ''); + assert.strictEqual(a.sharing, ''); + + var b = splunkjs.Utils.namespaceFromProperties(undefinedProps); + assert.strictEqual(b.owner, ''); + assert.strictEqual(b.app, ''); + assert.strictEqual(b.sharing, ''); + done(); + }); + }) + ); +} +// Run the individual test suite +if (module === require.cache[__filename] && !module.parent) { + module.exports = exports.setup(); +} diff --git a/tests_spike/tests.browser.html b/tests_spike/tests.browser.html new file mode 100644 index 000000000..54298b018 --- /dev/null +++ b/tests_spike/tests.browser.html @@ -0,0 +1,204 @@ + + + + Splunk SDK Browser Tests + + + + + + + + + + + +
+

Splunk SDK Browser Test Suite

+
+
+

Scheme

+ +
+
+

Host

+ +
+
+

Port

+ +
+
+

Username

+ +
+
+

Password

+ +
+
+

Version

+ +
+
+

 

+ Run +
+
+
+
+ + \ No newline at end of file diff --git a/tests_spike/tests.js b/tests_spike/tests.js new file mode 100644 index 000000000..96b7b8513 --- /dev/null +++ b/tests_spike/tests.js @@ -0,0 +1,86 @@ +// Copyright 2011 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. + +const { describe } = require('mocha'); +var options = require('../examples/node/cmdline'); +var splunkjs = require('../index'); +var utils = require('../lib/utils'); +var NodeHttp = splunkjs.NodeHttp; + +var parser = new options.create(); + +// If we found the --quiet flag, remove it +var quiet = utils.contains(process.argv, "--quiet"); +if (quiet) { + splunkjs.Logger.setLevel("NONE"); + var quietIndex = utils.keyOf("--quiet", process.argv); + process.argv.splice(quietIndex, 1); +} +else { + splunkjs.Logger.setLevel("ALL"); +} + +// If $SPLUNK_HOME isn't set, abort the tests +if (!Object.prototype.hasOwnProperty.call(process.env, "SPLUNK_HOME")) { + console.error("$SPLUNK_HOME is not set, aborting tests."); + return; +} + +// Do the normal parsing +var cmdline = parser.parse(process.argv); + +var nonSplunkHttp = new NodeHttp(false); + +var svc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password, + version: cmdline.opts.version +}); + +var loggedOutSvc = new splunkjs.Service({ + scheme: cmdline.opts.scheme, + host: cmdline.opts.host, + port: cmdline.opts.port, + username: cmdline.opts.username, + password: cmdline.opts.password + 'wrong', + version: cmdline.opts.version +}); + +describe("Server tests", function () { + + this.beforeAll(function (done) { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + }); + done(); + }) + + require('./modularinputs'); + require('./test_async').setup(); + require('./test_context').setup(svc); + require('./test_examples').setup(svc, cmdline.opts); + require('./test_http').setup(nonSplunkHttp); + require('./test_log').setup(); + require('./test_service').setup(svc, loggedOutSvc); + require('./test_utils').setup(); +}) + + + + diff --git a/tests_spike/utils.js b/tests_spike/utils.js new file mode 100644 index 000000000..3d9018f90 --- /dev/null +++ b/tests_spike/utils.js @@ -0,0 +1,53 @@ +// Copyright 2011 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. + +(function () { + "use strict"; + var Async = require('../lib/async'); + var assert = require('chai').assert; + + var root = exports || this; + + root.pollUntil = function (obj, condition, iterations, callback) { + callback = callback || function () { }; + + var i = 0; + Async.whilst( + function () { return !condition(obj) && (i++ < iterations); }, + function (done) { + Async.sleep(500, function () { + obj.fetch(done); + }); + }, + function (err) { + callback(err, obj); + } + ); + }; + + // Minimal Http implementation that is designed to pass the tests + // done by Context.init(), but nothing more. + root.DummyHttp = { + // Required by Context.init() + _setSplunkVersion: function (version) { + // nothing + } + }; + + var idCounter = 0; + root.getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); + }; + +})(); From 78849c6ea28ef5233750cbb96576d5361c2fd5f7 Mon Sep 17 00:00:00 2001 From: Abhi Shah Date: Fri, 16 Jul 2021 14:55:01 +0530 Subject: [PATCH 2/7] Modify Mocha test cases to use 'BDD' interface --- tests_spike/service_tests/parser.js | 53 +- tests_spike/service_tests/pivot.js | 2923 +++++++++-------- tests_spike/service_tests/properties.js | 249 +- tests_spike/service_tests/savedsearch.js | 793 +++-- tests_spike/service_tests/serverinfo.js | 44 +- tests_spike/service_tests/storagepasswords.js | 1199 ++++--- tests_spike/service_tests/typeahead.js | 74 +- tests_spike/service_tests/user.js | 435 +-- tests_spike/service_tests/view.js | 113 +- 9 files changed, 2951 insertions(+), 2932 deletions(-) diff --git a/tests_spike/service_tests/parser.js b/tests_spike/service_tests/parser.js index d5dab6f86..2f64822d4 100644 --- a/tests_spike/service_tests/parser.js +++ b/tests_spike/service_tests/parser.js @@ -1,33 +1,34 @@ -var assert = require('chai').assert; - exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Callback#Basic parse": function (done) { - var service = this.service; - - service.parse("search index=_internal | head 1", function (err, parse) { - assert.ok(!err); - assert.ok(parse); - assert.ok(parse.commands.length > 0); + var assert = require('chai').assert; + return ( + describe("Parsing Tests",function(){ + before(function (done) { + this.service = svc; done(); }); - }, - - "Callback#Parse error": function (done) { - var service = this.service; - - service.parse("ABCXYZ", function (err, parse) { - assert.ok(err); - assert.strictEqual(err.status, 400); - done(); + + it("Callback#Basic parse", function (done) { + var service = this.service; + + service.parse("search index=_internal | head 1", function (err, parse) { + assert.ok(!err); + assert.ok(parse); + assert.ok(parse.commands.length > 0); + done(); + }); + }); + + it("Callback#Parse error", function (done) { + var service = this.service; + + service.parse("ABCXYZ", function (err, parse) { + assert.ok(err); + assert.strictEqual(err.status, 400); + done(); + }); }); - } - }; + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/pivot.js b/tests_spike/service_tests/pivot.js index b9e5f822f..f3c1f6819 100644 --- a/tests_spike/service_tests/pivot.js +++ b/tests_spike/service_tests/pivot.js @@ -1,1560 +1,1571 @@ -var assert = require('chai').assert; -var splunkjs = require('../../index'); -var tutils = require('../utils'); - -var Async = splunkjs.Async; -var utils = splunkjs.Utils; -var idCounter = 0; +exports.setup = function (svc) { + var assert = require('chai').assert; -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; + var splunkjs = require('../../index'); + var tutils = require('../utils'); -exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - this.dataModels = svc.dataModels({ owner: "nobody", app: "search" }); - this.skip = false; - var that = this; - this.service.serverInfo(function (err, info) { - if (parseInt(info.properties().version.split(".")[0], 10) < 6) { - that.skip = true; - splunkjs.Logger.log("Skipping pivot tests..."); - } - done(err); - }); - }, + var Async = splunkjs.Async; + var utils = splunkjs.Utils; + var idCounter = 0; - "Callback#Pivot - test constructor args": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.ok(dataModel.objectByName("test_data")); + var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); + }; + return ( + describe("Pivot Tests", function(){ + before(function (done) { + this.service = svc; + this.dataModels = svc.dataModels({ owner: "nobody", app: "search" }); + this.skip = false; + var that = this; + this.service.serverInfo(function (err, info) { + if (parseInt(info.properties().version.split(".")[0], 10) < 6) { + that.skip = true; + splunkjs.Logger.log("Skipping pivot tests..."); + } + done(err); + }); + }) + + it("Callback#Pivot - test constructor args", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#Pivot - test acceleration, then pivot": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - dataModel.objectByName("test_data"); - assert.ok(dataModel); - - dataModel.acceleration.enabled = true; - dataModel.acceleration.earliestTime = "-2mon"; - dataModel.acceleration.cronSchedule = "0 */12 * * *"; - dataModel.update(done); - }, - function (dataModel, done) { - var props = dataModel.properties(); - - assert.strictEqual(true, dataModel.isAccelerated()); - assert.strictEqual(true, !!dataModel.acceleration.enabled); - assert.strictEqual("-2mon", dataModel.acceleration.earliest_time); - assert.strictEqual("0 */12 * * *", dataModel.acceleration.cron_schedule); - - var dataModelObject = dataModel.objectByName("test_data"); - var pivotSpecification = dataModelObject.createPivotSpecification(); - - assert.strictEqual(dataModelObject.dataModel.name, pivotSpecification.accelerationNamespace); - - var name1 = "delete-me-" + getNextId(); - pivotSpecification.setAccelerationJob(name1); - assert.strictEqual("sid=" + name1, pivotSpecification.accelerationNamespace); - - var namespaceTemp = "delete-me-" + getNextId(); - pivotSpecification.accelerationNamespace = namespaceTemp; - assert.strictEqual(namespaceTemp, pivotSpecification.accelerationNamespace); - - pivotSpecification - .addCellValue("test_data", "Source Value", "count") - .run(done); - }, - function (job, pivot, done) { - assert.ok(job); - assert.ok(pivot); - assert.notStrictEqual("FAILED", job.properties().dispatchState); - - job.track({}, function (job) { - assert.ok(pivot.tstatsSearch); - assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); - assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); - assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); - - assert.strictEqual(pivot.tstatsSearch, job.properties().request.search); - done(null, job); - }); - }, - function (job, done) { - assert.ok(job); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.ok(dataModel.objectByName("test_data")); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Pivot - test acceleration, then pivot", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#Pivot - test illegal filtering (all types)": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - - // Boolean comparisons - try { - pivotSpecification.addFilter(getNextId(), "boolean", "=", true); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); - } - try { - pivotSpecification.addFilter("_time", "boolean", "=", true); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add boolean filter on _time because it is of type timestamp"); - } - - // String comparisons - try { - pivotSpecification.addFilter("has_boris", "string", "contains", "abc"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add string filter on has_boris because it is of type boolean"); - } - try { - pivotSpecification.addFilter(getNextId(), "string", "contains", "abc"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); - } - - // IPv4 comparisons - try { - pivotSpecification.addFilter("has_boris", "ipv4", "startsWith", "192.168"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add ipv4 filter on has_boris because it is of type boolean"); - } - try { - pivotSpecification.addFilter(getNextId(), "ipv4", "startsWith", "192.168"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); - } - - // Number comparisons - try { - pivotSpecification.addFilter("has_boris", "number", "atLeast", 2.3); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add number filter on has_boris because it is of type boolean"); - } - try { - pivotSpecification.addFilter(getNextId(), "number", "atLeast", 2.3); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); - } - - // Limit filter - try { - pivotSpecification.addLimitFilter("has_boris", "host", "DEFAULT", 50, "count"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add limit filter on has_boris because it is of type boolean"); - } - try { - pivotSpecification.addLimitFilter(getNextId(), "host", "DEFAULT", 50, "count"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add limit filter on a nonexistent field."); - } - try { - pivotSpecification.addLimitFilter("source", "host", "DEFAULT", 50, "sum"); - assert.ok(false); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + dataModel.objectByName("test_data"); + assert.ok(dataModel); + + dataModel.acceleration.enabled = true; + dataModel.acceleration.earliestTime = "-2mon"; + dataModel.acceleration.cronSchedule = "0 */12 * * *"; + dataModel.update(done); + }, + function (dataModel, done) { + var props = dataModel.properties(); + + assert.strictEqual(true, dataModel.isAccelerated()); + assert.strictEqual(true, !!dataModel.acceleration.enabled); + assert.strictEqual("-2mon", dataModel.acceleration.earliest_time); + assert.strictEqual("0 */12 * * *", dataModel.acceleration.cron_schedule); + + var dataModelObject = dataModel.objectByName("test_data"); + var pivotSpecification = dataModelObject.createPivotSpecification(); + + assert.strictEqual(dataModelObject.dataModel.name, pivotSpecification.accelerationNamespace); + + var name1 = "delete-me-" + getNextId(); + pivotSpecification.setAccelerationJob(name1); + assert.strictEqual("sid=" + name1, pivotSpecification.accelerationNamespace); + + var namespaceTemp = "delete-me-" + getNextId(); + pivotSpecification.accelerationNamespace = namespaceTemp; + assert.strictEqual(namespaceTemp, pivotSpecification.accelerationNamespace); + + pivotSpecification + .addCellValue("test_data", "Source Value", "count") + .run(done); + }, + function (job, pivot, done) { + assert.ok(job); + assert.ok(pivot); + assert.notStrictEqual("FAILED", job.properties().dispatchState); + + job.track({}, function (job) { + assert.ok(pivot.tstatsSearch); + assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); + assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); + assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); + + assert.strictEqual(pivot.tstatsSearch, job.properties().request.search); + done(null, job); + }); + }, + function (job, done) { + assert.ok(job); + done(); } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, - "Stats function for fields of type string must be COUNT or DISTINCT_COUNT; found sum"); + ], + function (err) { + assert.ok(!err); + done(); } - try { - pivotSpecification.addLimitFilter("epsilon", "host", "DEFAULT", 50, "duration"); - assert.ok(false); + ); + }) + + it("Callback#Pivot - test illegal filtering (all types)", function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + + // Boolean comparisons + try { + pivotSpecification.addFilter(getNextId(), "boolean", "=", true); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); + } + try { + pivotSpecification.addFilter("_time", "boolean", "=", true); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add boolean filter on _time because it is of type timestamp"); + } + + // String comparisons + try { + pivotSpecification.addFilter("has_boris", "string", "contains", "abc"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add string filter on has_boris because it is of type boolean"); + } + try { + pivotSpecification.addFilter(getNextId(), "string", "contains", "abc"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); + } + + // IPv4 comparisons + try { + pivotSpecification.addFilter("has_boris", "ipv4", "startsWith", "192.168"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add ipv4 filter on has_boris because it is of type boolean"); + } + try { + pivotSpecification.addFilter(getNextId(), "ipv4", "startsWith", "192.168"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); + } + + // Number comparisons + try { + pivotSpecification.addFilter("has_boris", "number", "atLeast", 2.3); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add number filter on has_boris because it is of type boolean"); + } + try { + pivotSpecification.addFilter(getNextId(), "number", "atLeast", 2.3); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); + } + + // Limit filter + try { + pivotSpecification.addLimitFilter("has_boris", "host", "DEFAULT", 50, "count"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add limit filter on has_boris because it is of type boolean"); + } + try { + pivotSpecification.addLimitFilter(getNextId(), "host", "DEFAULT", 50, "count"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add limit filter on a nonexistent field."); + } + try { + pivotSpecification.addLimitFilter("source", "host", "DEFAULT", 50, "sum"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, + "Stats function for fields of type string must be COUNT or DISTINCT_COUNT; found sum"); + } + try { + pivotSpecification.addLimitFilter("epsilon", "host", "DEFAULT", 50, "duration"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, + "Stats function for fields of type number must be one of COUNT, DISTINCT_COUNT, SUM, or AVERAGE; found duration"); + } + try { + pivotSpecification.addLimitFilter("test_data", "host", "DEFAULT", 50, "list"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, + "Stats function for fields of type object count must be COUNT; found list"); + } + done(); } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, - "Stats function for fields of type number must be one of COUNT, DISTINCT_COUNT, SUM, or AVERAGE; found duration"); + ], + function (err) { + assert.ok(!err); + done(); } - try { - pivotSpecification.addLimitFilter("test_data", "host", "DEFAULT", 50, "list"); - assert.ok(false); + ); + }) + + it("Callback#Pivot - test boolean filtering", function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addFilter("has_boris", "boolean", "=", true); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("rule")); + assert.ok(filter.hasOwnProperty("owner")); + + assert.strictEqual("has_boris", filter.fieldName); + assert.strictEqual("boolean", filter.type); + assert.strictEqual("=", filter.rule.comparator); + assert.strictEqual(true, filter.rule.compareTo); + assert.strictEqual("test_data", filter.owner); + } + catch (e) { + assert.ok(false); + } + + done(); } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, - "Stats function for fields of type object count must be COUNT; found list"); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) + + it("Callback#Pivot - test string filtering", function (done) { + if (this.skip) { done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#Pivot - test boolean filtering": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addFilter("has_boris", "boolean", "=", true); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("rule")); - assert.ok(filter.hasOwnProperty("owner")); - - assert.strictEqual("has_boris", filter.fieldName); - assert.strictEqual("boolean", filter.type); - assert.strictEqual("=", filter.rule.comparator); - assert.strictEqual(true, filter.rule.compareTo); - assert.strictEqual("test_data", filter.owner); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addFilter("host", "string", "contains", "abc"); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("rule")); + assert.ok(filter.hasOwnProperty("owner")); + + assert.strictEqual("host", filter.fieldName); + assert.strictEqual("string", filter.type); + assert.strictEqual("contains", filter.rule.comparator); + assert.strictEqual("abc", filter.rule.compareTo); + assert.strictEqual("BaseEvent", filter.owner); + } + catch (e) { + assert.ok(false); + } + + done(); } - catch (e) { - assert.ok(false); + ], + function (err) { + assert.ok(!err); + done(); } - + ); + }) + + it("Callback#Pivot - test IPv4 filtering", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#Pivot - test string filtering": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addFilter("host", "string", "contains", "abc"); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("rule")); - assert.ok(filter.hasOwnProperty("owner")); - - assert.strictEqual("host", filter.fieldName); - assert.strictEqual("string", filter.type); - assert.strictEqual("contains", filter.rule.comparator); - assert.strictEqual("abc", filter.rule.compareTo); - assert.strictEqual("BaseEvent", filter.owner); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addFilter("hostip", "ipv4", "startsWith", "192.168"); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("rule")); + assert.ok(filter.hasOwnProperty("owner")); + + assert.strictEqual("hostip", filter.fieldName); + assert.strictEqual("ipv4", filter.type); + assert.strictEqual("startsWith", filter.rule.comparator); + assert.strictEqual("192.168", filter.rule.compareTo); + assert.strictEqual("test_data", filter.owner); + } + catch (e) { + assert.ok(false); + } + + done(); } - catch (e) { - assert.ok(false); + ], + function (err) { + assert.ok(!err); + done(); } - + ); + }) + + it("Callback#Pivot - test number filtering", function (done) { + if (this.skip) { done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#Pivot - test IPv4 filtering": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addFilter("hostip", "ipv4", "startsWith", "192.168"); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("rule")); - assert.ok(filter.hasOwnProperty("owner")); - - assert.strictEqual("hostip", filter.fieldName); - assert.strictEqual("ipv4", filter.type); - assert.strictEqual("startsWith", filter.rule.comparator); - assert.strictEqual("192.168", filter.rule.compareTo); - assert.strictEqual("test_data", filter.owner); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addFilter("epsilon", "number", ">=", 2.3); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("rule")); + assert.ok(filter.hasOwnProperty("owner")); + + assert.strictEqual("epsilon", filter.fieldName); + assert.strictEqual("number", filter.type); + assert.strictEqual(">=", filter.rule.comparator); + assert.strictEqual(2.3, filter.rule.compareTo); + assert.strictEqual("test_data", filter.owner); + } + catch (e) { + assert.ok(false); + } + + done(); } - catch (e) { - assert.ok(false); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) + it("Callback#Pivot - test limit filtering", function (done) { + if (this.skip) { done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#Pivot - test number filtering": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addFilter("epsilon", "number", ">=", 2.3); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("rule")); - assert.ok(filter.hasOwnProperty("owner")); - - assert.strictEqual("epsilon", filter.fieldName); - assert.strictEqual("number", filter.type); - assert.strictEqual(">=", filter.rule.comparator); - assert.strictEqual(2.3, filter.rule.compareTo); - assert.strictEqual("test_data", filter.owner); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addLimitFilter("epsilon", "host", "ASCENDING", 500, "average"); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("owner")); + assert.ok(filter.hasOwnProperty("attributeName")); + assert.ok(filter.hasOwnProperty("attributeOwner")); + assert.ok(filter.hasOwnProperty("limitType")); + assert.ok(filter.hasOwnProperty("limitAmount")); + assert.ok(filter.hasOwnProperty("statsFn")); + + assert.strictEqual("epsilon", filter.fieldName); + assert.strictEqual("number", filter.type); + assert.strictEqual("test_data", filter.owner); + assert.strictEqual("host", filter.attributeName); + assert.strictEqual("BaseEvent", filter.attributeOwner); + assert.strictEqual("lowest", filter.limitType); + assert.strictEqual(500, filter.limitAmount); + assert.strictEqual("average", filter.statsFn); + } + catch (e) { + assert.ok(false); + } + + done(); } - catch (e) { - assert.ok(false); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) + it("Callback#Pivot - test row split", function (done) { + if (this.skip) { done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - "Callback#Pivot - test limit filtering": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addLimitFilter("epsilon", "host", "ASCENDING", 500, "average"); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("owner")); - assert.ok(filter.hasOwnProperty("attributeName")); - assert.ok(filter.hasOwnProperty("attributeOwner")); - assert.ok(filter.hasOwnProperty("limitType")); - assert.ok(filter.hasOwnProperty("limitAmount")); - assert.ok(filter.hasOwnProperty("statsFn")); - - assert.strictEqual("epsilon", filter.fieldName); - assert.strictEqual("number", filter.type); - assert.strictEqual("test_data", filter.owner); - assert.strictEqual("host", filter.attributeName); - assert.strictEqual("BaseEvent", filter.attributeOwner); - assert.strictEqual("lowest", filter.limitType); - assert.strictEqual(500, filter.limitAmount); - assert.strictEqual("average", filter.statsFn); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + + // Test error handling for row split + try { + pivotSpecification.addRowSplit("has_boris", "Wrong type here"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number or string."); + } + var field = getNextId(); + try { + + pivotSpecification.addRowSplit(field, "Break Me!"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test row split, number + pivotSpecification.addRowSplit("epsilon", "My Label"); + assert.strictEqual(1, pivotSpecification.rows.length); + + var row = pivotSpecification.rows[0]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(row.hasOwnProperty("display")); + + assert.strictEqual("epsilon", row.fieldName); + assert.strictEqual("test_data", row.owner); + assert.strictEqual("number", row.type); + assert.strictEqual("My Label", row.label); + assert.strictEqual("all", row.display); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + label: "My Label", + display: "all" + }, + row); + + // Test row split, string + pivotSpecification.addRowSplit("host", "My Label"); + assert.strictEqual(2, pivotSpecification.rows.length); + + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(!row.hasOwnProperty("display")); + + assert.strictEqual("host", row.fieldName); + assert.strictEqual("BaseEvent", row.owner); + assert.strictEqual("string", row.type); + assert.strictEqual("My Label", row.label); + assert.deepEqual({ + fieldName: "host", + owner: "BaseEvent", + type: "string", + label: "My Label" + }, + row); + + // Test error handling on range row split + try { + pivotSpecification.addRangeRowSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number."); + } + try { + pivotSpecification.addRangeRowSplit(field, "Break Me!", { start: 0, end: 100, step: 20, limit: 5 }); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test range row split + pivotSpecification.addRangeRowSplit("epsilon", "My Label", { start: 0, end: 100, step: 20, limit: 5 }); + assert.strictEqual(3, pivotSpecification.rows.length); + + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(row.hasOwnProperty("display")); + assert.ok(row.hasOwnProperty("ranges")); + + assert.strictEqual("epsilon", row.fieldName); + assert.strictEqual("test_data", row.owner); + assert.strictEqual("number", row.type); + assert.strictEqual("My Label", row.label); + assert.strictEqual("ranges", row.display); + + var ranges = { + start: 0, + end: 100, + size: 20, + maxNumberOf: 5 + }; + assert.deepEqual(ranges, row.ranges); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + label: "My Label", + display: "ranges", + ranges: ranges + }, + row); + + // Test error handling on boolean row split + try { + pivotSpecification.addBooleanRowSplit("epsilon", "Wrong type here", "t", "f"); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected boolean."); + } + try { + pivotSpecification.addBooleanRowSplit(field, "Break Me!", "t", "f"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test boolean row split + pivotSpecification.addBooleanRowSplit("has_boris", "My Label", "is_true", "is_false"); + assert.strictEqual(4, pivotSpecification.rows.length); + + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(row.hasOwnProperty("trueLabel")); + assert.ok(row.hasOwnProperty("falseLabel")); + + assert.strictEqual("has_boris", row.fieldName); + assert.strictEqual("My Label", row.label); + assert.strictEqual("test_data", row.owner); + assert.strictEqual("boolean", row.type); + assert.strictEqual("is_true", row.trueLabel); + assert.strictEqual("is_false", row.falseLabel); + assert.deepEqual({ + fieldName: "has_boris", + label: "My Label", + owner: "test_data", + type: "boolean", + trueLabel: "is_true", + falseLabel: "is_false" + }, + row); + + // Test error handling on timestamp row split + try { + pivotSpecification.addTimestampRowSplit("epsilon", "Wrong type here", "some binning"); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected timestamp."); + } + try { + pivotSpecification.addTimestampRowSplit(field, "Break Me!", "some binning"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + try { + pivotSpecification.addTimestampRowSplit("_time", "some label", "Bogus binning value"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); + } + + // Test timestamp row split + pivotSpecification.addTimestampRowSplit("_time", "My Label", "day"); + assert.strictEqual(5, pivotSpecification.rows.length); + + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(row.hasOwnProperty("period")); + + assert.strictEqual("_time", row.fieldName); + assert.strictEqual("My Label", row.label); + assert.strictEqual("BaseEvent", row.owner); + assert.strictEqual("timestamp", row.type); + assert.strictEqual("day", row.period); + assert.deepEqual({ + fieldName: "_time", + label: "My Label", + owner: "BaseEvent", + type: "timestamp", + period: "day" + }, + row); + + done(); } - catch (e) { - assert.ok(false); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) + it("Callback#Pivot - test column split", function (done) { + if (this.skip) { done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - "Callback#Pivot - test row split": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - - // Test error handling for row split - try { - pivotSpecification.addRowSplit("has_boris", "Wrong type here"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number or string."); - } - var field = getNextId(); - try { - - pivotSpecification.addRowSplit(field, "Break Me!"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - - // Test row split, number - pivotSpecification.addRowSplit("epsilon", "My Label"); - assert.strictEqual(1, pivotSpecification.rows.length); - - var row = pivotSpecification.rows[0]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(row.hasOwnProperty("display")); - - assert.strictEqual("epsilon", row.fieldName); - assert.strictEqual("test_data", row.owner); - assert.strictEqual("number", row.type); - assert.strictEqual("My Label", row.label); - assert.strictEqual("all", row.display); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - label: "My Label", - display: "all" + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); }, - row); - - // Test row split, string - pivotSpecification.addRowSplit("host", "My Label"); - assert.strictEqual(2, pivotSpecification.rows.length); - - row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(!row.hasOwnProperty("display")); - - assert.strictEqual("host", row.fieldName); - assert.strictEqual("BaseEvent", row.owner); - assert.strictEqual("string", row.type); - assert.strictEqual("My Label", row.label); - assert.deepEqual({ - fieldName: "host", - owner: "BaseEvent", - type: "string", - label: "My Label" - }, - row); - - // Test error handling on range row split - try { - pivotSpecification.addRangeRowSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number."); - } - try { - pivotSpecification.addRangeRowSplit(field, "Break Me!", { start: 0, end: 100, step: 20, limit: 5 }); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - - // Test range row split - pivotSpecification.addRangeRowSplit("epsilon", "My Label", { start: 0, end: 100, step: 20, limit: 5 }); - assert.strictEqual(3, pivotSpecification.rows.length); - - row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(row.hasOwnProperty("display")); - assert.ok(row.hasOwnProperty("ranges")); - - assert.strictEqual("epsilon", row.fieldName); - assert.strictEqual("test_data", row.owner); - assert.strictEqual("number", row.type); - assert.strictEqual("My Label", row.label); - assert.strictEqual("ranges", row.display); - - var ranges = { - start: 0, - end: 100, - size: 20, - maxNumberOf: 5 - }; - assert.deepEqual(ranges, row.ranges); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - label: "My Label", - display: "ranges", - ranges: ranges - }, - row); - - // Test error handling on boolean row split - try { - pivotSpecification.addBooleanRowSplit("epsilon", "Wrong type here", "t", "f"); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected boolean."); - } - try { - pivotSpecification.addBooleanRowSplit(field, "Break Me!", "t", "f"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - - // Test boolean row split - pivotSpecification.addBooleanRowSplit("has_boris", "My Label", "is_true", "is_false"); - assert.strictEqual(4, pivotSpecification.rows.length); - - row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(row.hasOwnProperty("trueLabel")); - assert.ok(row.hasOwnProperty("falseLabel")); - - assert.strictEqual("has_boris", row.fieldName); - assert.strictEqual("My Label", row.label); - assert.strictEqual("test_data", row.owner); - assert.strictEqual("boolean", row.type); - assert.strictEqual("is_true", row.trueLabel); - assert.strictEqual("is_false", row.falseLabel); - assert.deepEqual({ - fieldName: "has_boris", - label: "My Label", - owner: "test_data", - type: "boolean", - trueLabel: "is_true", - falseLabel: "is_false" - }, - row); - - // Test error handling on timestamp row split - try { - pivotSpecification.addTimestampRowSplit("epsilon", "Wrong type here", "some binning"); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected timestamp."); - } - try { - pivotSpecification.addTimestampRowSplit(field, "Break Me!", "some binning"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - try { - pivotSpecification.addTimestampRowSplit("_time", "some label", "Bogus binning value"); - assert.ok(false); + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + + // Test error handling for column split + try { + pivotSpecification.addColumnSplit("has_boris", "Wrong type here"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number or string."); + } + var field = getNextId(); + try { + + pivotSpecification.addColumnSplit(field, "Break Me!"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test column split, number + pivotSpecification.addColumnSplit("epsilon"); + assert.strictEqual(1, pivotSpecification.columns.length); + + var col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(col.hasOwnProperty("display")); + + assert.strictEqual("epsilon", col.fieldName); + assert.strictEqual("test_data", col.owner); + assert.strictEqual("number", col.type); + assert.strictEqual("all", col.display); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + display: "all" + }, + col); + + // Test column split, string + pivotSpecification.addColumnSplit("host"); + assert.strictEqual(2, pivotSpecification.columns.length); + + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(!col.hasOwnProperty("display")); + + assert.strictEqual("host", col.fieldName); + assert.strictEqual("BaseEvent", col.owner); + assert.strictEqual("string", col.type); + assert.deepEqual({ + fieldName: "host", + owner: "BaseEvent", + type: "string" + }, + col); + + done(); + + // Test error handling for range column split + try { + pivotSpecification.addRangeColumnSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number."); + } + try { + pivotSpecification.addRangeColumnSplit(field, { start: 0, end: 100, step: 20, limit: 5 }); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test range column split + pivotSpecification.addRangeColumnSplit("epsilon", { start: 0, end: 100, step: 20, limit: 5 }); + assert.strictEqual(3, pivotSpecification.columns.length); + + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(col.hasOwnProperty("display")); + assert.ok(col.hasOwnProperty("ranges")); + + assert.strictEqual("epsilon", col.fieldName); + assert.strictEqual("test_data", col.owner); + assert.strictEqual("number", col.type); + assert.strictEqual("ranges", col.display); + var ranges = { + start: 0, + end: 100, + size: 20, + maxNumberOf: 5 + }; + assert.deepEqual(ranges, col.ranges); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + display: "ranges", + ranges: ranges + }, + col); + + // Test error handling on boolean column split + try { + pivotSpecification.addBooleanColumnSplit("epsilon", "t", "f"); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected boolean."); + } + try { + pivotSpecification.addBooleanColumnSplit(field, "t", "f"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test boolean column split + pivotSpecification.addBooleanColumnSplit("has_boris", "is_true", "is_false"); + assert.strictEqual(4, pivotSpecification.columns.length); + + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(!col.hasOwnProperty("label")); + assert.ok(col.hasOwnProperty("trueLabel")); + assert.ok(col.hasOwnProperty("falseLabel")); + + assert.strictEqual("has_boris", col.fieldName); + assert.strictEqual("test_data", col.owner); + assert.strictEqual("boolean", col.type); + assert.strictEqual("is_true", col.trueLabel); + assert.strictEqual("is_false", col.falseLabel); + assert.deepEqual({ + fieldName: "has_boris", + owner: "test_data", + type: "boolean", + trueLabel: "is_true", + falseLabel: "is_false" + }, + col); + + // Test error handling on timestamp column split + try { + pivotSpecification.addTimestampColumnSplit("epsilon", "Wrong type here"); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected timestamp."); + } + try { + pivotSpecification.addTimestampColumnSplit(field, "Break Me!"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + try { + pivotSpecification.addTimestampColumnSplit("_time", "Bogus binning value"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); + } + + // Test timestamp column split + pivotSpecification.addTimestampColumnSplit("_time", "day"); + assert.strictEqual(5, pivotSpecification.columns.length); + + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(!col.hasOwnProperty("label")); + assert.ok(col.hasOwnProperty("period")); + + assert.strictEqual("_time", col.fieldName); + assert.strictEqual("BaseEvent", col.owner); + assert.strictEqual("timestamp", col.type); + assert.strictEqual("day", col.period); + assert.deepEqual({ + fieldName: "_time", + owner: "BaseEvent", + type: "timestamp", + period: "day" + }, + col); } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) - // Test timestamp row split - pivotSpecification.addTimestampRowSplit("_time", "My Label", "day"); - assert.strictEqual(5, pivotSpecification.rows.length); - - row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(row.hasOwnProperty("period")); - - assert.strictEqual("_time", row.fieldName); - assert.strictEqual("My Label", row.label); - assert.strictEqual("BaseEvent", row.owner); - assert.strictEqual("timestamp", row.type); - assert.strictEqual("day", row.period); - assert.deepEqual({ - fieldName: "_time", - label: "My Label", - owner: "BaseEvent", - type: "timestamp", - period: "day" - }, - row); - + it("Callback#Pivot - test cell value", function (done) { + if (this.skip) { done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - "Callback#Pivot - test column split": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - - // Test error handling for column split - try { - pivotSpecification.addColumnSplit("has_boris", "Wrong type here"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number or string."); - } - var field = getNextId(); - try { - - pivotSpecification.addColumnSplit(field, "Break Me!"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - - // Test column split, number - pivotSpecification.addColumnSplit("epsilon"); - assert.strictEqual(1, pivotSpecification.columns.length); - - var col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(col.hasOwnProperty("display")); - - assert.strictEqual("epsilon", col.fieldName); - assert.strictEqual("test_data", col.owner); - assert.strictEqual("number", col.type); - assert.strictEqual("all", col.display); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - display: "all" + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); }, - col); - - // Test column split, string - pivotSpecification.addColumnSplit("host"); - assert.strictEqual(2, pivotSpecification.columns.length); - - col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(!col.hasOwnProperty("display")); - - assert.strictEqual("host", col.fieldName); - assert.strictEqual("BaseEvent", col.owner); - assert.strictEqual("string", col.type); - assert.deepEqual({ - fieldName: "host", - owner: "BaseEvent", - type: "string" - }, - col); - - done(); - - // Test error handling for range column split - try { - pivotSpecification.addRangeColumnSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number."); - } - try { - pivotSpecification.addRangeColumnSplit(field, { start: 0, end: 100, step: 20, limit: 5 }); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - - // Test range column split - pivotSpecification.addRangeColumnSplit("epsilon", { start: 0, end: 100, step: 20, limit: 5 }); - assert.strictEqual(3, pivotSpecification.columns.length); - - col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(col.hasOwnProperty("display")); - assert.ok(col.hasOwnProperty("ranges")); - - assert.strictEqual("epsilon", col.fieldName); - assert.strictEqual("test_data", col.owner); - assert.strictEqual("number", col.type); - assert.strictEqual("ranges", col.display); - var ranges = { - start: 0, - end: 100, - size: 20, - maxNumberOf: 5 - }; - assert.deepEqual(ranges, col.ranges); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - display: "ranges", - ranges: ranges - }, - col); - - // Test error handling on boolean column split - try { - pivotSpecification.addBooleanColumnSplit("epsilon", "t", "f"); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected boolean."); - } - try { - pivotSpecification.addBooleanColumnSplit(field, "t", "f"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - - // Test boolean column split - pivotSpecification.addBooleanColumnSplit("has_boris", "is_true", "is_false"); - assert.strictEqual(4, pivotSpecification.columns.length); - - col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(!col.hasOwnProperty("label")); - assert.ok(col.hasOwnProperty("trueLabel")); - assert.ok(col.hasOwnProperty("falseLabel")); - - assert.strictEqual("has_boris", col.fieldName); - assert.strictEqual("test_data", col.owner); - assert.strictEqual("boolean", col.type); - assert.strictEqual("is_true", col.trueLabel); - assert.strictEqual("is_false", col.falseLabel); - assert.deepEqual({ - fieldName: "has_boris", - owner: "test_data", - type: "boolean", - trueLabel: "is_true", - falseLabel: "is_false" - }, - col); - - // Test error handling on timestamp column split - try { - pivotSpecification.addTimestampColumnSplit("epsilon", "Wrong type here"); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected timestamp."); - } - try { - pivotSpecification.addTimestampColumnSplit(field, "Break Me!"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - try { - pivotSpecification.addTimestampColumnSplit("_time", "Bogus binning value"); - assert.ok(false); + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + + // Test error handling for cell value, string + try { + pivotSpecification.addCellValue("iDontExist", "Break Me!", "explosion"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field iDontExist"); + } + try { + pivotSpecification.addCellValue("source", "Wrong Stats Function", "stdev"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + + " list, distinct_values, first, last, count, or distinct_count; found stdev"); + } + + // Add cell value, string + pivotSpecification.addCellValue("source", "Source Value", "dc"); + assert.strictEqual(1, pivotSpecification.cells.length); + + var cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("source", cell.fieldName); + assert.strictEqual("BaseEvent", cell.owner); + assert.strictEqual("string", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("dc", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "source", + owner: "BaseEvent", + type: "string", + label: "Source Value", + value: "dc", + sparkline: false + }, cell); + + // Test error handling for cell value, IPv4 + try { + pivotSpecification.addCellValue("hostip", "Wrong Stats Function", "stdev"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + + " list, distinct_values, first, last, count, or distinct_count; found stdev"); + } + + // Add cell value, IPv4 + pivotSpecification.addCellValue("hostip", "Source Value", "dc"); + assert.strictEqual(2, pivotSpecification.cells.length); + + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("hostip", cell.fieldName); + assert.strictEqual("test_data", cell.owner); + assert.strictEqual("ipv4", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("dc", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "hostip", + owner: "test_data", + type: "ipv4", + label: "Source Value", + value: "dc", + sparkline: false + }, cell); + + // Test error handling for cell value, boolean + try { + pivotSpecification.addCellValue("has_boris", "Booleans not allowed", "sum"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot use boolean valued fields as cell values."); + } + + // Test error handling for cell value, number + try { + pivotSpecification.addCellValue("epsilon", "Wrong Stats Function", "latest"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on number field must be must be one of:" + + " sum, count, average, max, min, stdev, list, or distinct_values; found latest"); + } + + // Add cell value, number + pivotSpecification.addCellValue("epsilon", "Source Value", "average"); + assert.strictEqual(3, pivotSpecification.cells.length); + + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("epsilon", cell.fieldName); + assert.strictEqual("test_data", cell.owner); + assert.strictEqual("number", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("average", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + label: "Source Value", + value: "average", + sparkline: false + }, cell); + + // Test error handling for cell value, timestamp + try { + pivotSpecification.addCellValue("_time", "Wrong Stats Function", "max"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on timestamp field must be one of:" + + " duration, earliest, latest, list, or distinct values; found max"); + } + + // Add cell value, timestamp + pivotSpecification.addCellValue("_time", "Source Value", "earliest"); + assert.strictEqual(4, pivotSpecification.cells.length); + + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("_time", cell.fieldName); + assert.strictEqual("BaseEvent", cell.owner); + assert.strictEqual("timestamp", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("earliest", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "_time", + owner: "BaseEvent", + type: "timestamp", + label: "Source Value", + value: "earliest", + sparkline: false + }, cell); + + // Test error handling for cell value, count + try { + pivotSpecification.addCellValue("test_data", "Wrong Stats Function", "min"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on childcount and objectcount fields " + + "must be count; found " + "min"); + } + + // Add cell value, count + pivotSpecification.addCellValue("test_data", "Source Value", "count"); + assert.strictEqual(5, pivotSpecification.cells.length); + + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("test_data", cell.fieldName); + assert.strictEqual("test_data", cell.owner); + assert.strictEqual("objectCount", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("count", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "test_data", + owner: "test_data", + type: "objectCount", + label: "Source Value", + value: "count", + sparkline: false + }, cell); + + done(); } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) - // Test timestamp column split - pivotSpecification.addTimestampColumnSplit("_time", "day"); - assert.strictEqual(5, pivotSpecification.columns.length); - - col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(!col.hasOwnProperty("label")); - assert.ok(col.hasOwnProperty("period")); - - assert.strictEqual("_time", col.fieldName); - assert.strictEqual("BaseEvent", col.owner); - assert.strictEqual("timestamp", col.type); - assert.strictEqual("day", col.period); - assert.deepEqual({ - fieldName: "_time", - owner: "BaseEvent", - type: "timestamp", - period: "day" - }, - col); + it("Callback#Pivot - test pivot throws HTTP exception", function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - "Callback#Pivot - test cell value": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - - // Test error handling for cell value, string - try { - pivotSpecification.addCellValue("iDontExist", "Break Me!", "explosion"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field iDontExist"); - } - try { - pivotSpecification.addCellValue("source", "Wrong Stats Function", "stdev"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + - " list, distinct_values, first, last, count, or distinct_count; found stdev"); - } - - // Add cell value, string - pivotSpecification.addCellValue("source", "Source Value", "dc"); - assert.strictEqual(1, pivotSpecification.cells.length); - - var cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("source", cell.fieldName); - assert.strictEqual("BaseEvent", cell.owner); - assert.strictEqual("string", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("dc", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "source", - owner: "BaseEvent", - type: "string", - label: "Source Value", - value: "dc", - sparkline: false - }, cell); - - // Test error handling for cell value, IPv4 - try { - pivotSpecification.addCellValue("hostip", "Wrong Stats Function", "stdev"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + - " list, distinct_values, first, last, count, or distinct_count; found stdev"); - } - - // Add cell value, IPv4 - pivotSpecification.addCellValue("hostip", "Source Value", "dc"); - assert.strictEqual(2, pivotSpecification.cells.length); - - cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("hostip", cell.fieldName); - assert.strictEqual("test_data", cell.owner); - assert.strictEqual("ipv4", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("dc", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "hostip", - owner: "test_data", - type: "ipv4", - label: "Source Value", - value: "dc", - sparkline: false - }, cell); - - // Test error handling for cell value, boolean - try { - pivotSpecification.addCellValue("has_boris", "Booleans not allowed", "sum"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot use boolean valued fields as cell values."); - } - - // Test error handling for cell value, number - try { - pivotSpecification.addCellValue("epsilon", "Wrong Stats Function", "latest"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on number field must be must be one of:" + - " sum, count, average, max, min, stdev, list, or distinct_values; found latest"); - } - - // Add cell value, number - pivotSpecification.addCellValue("epsilon", "Source Value", "average"); - assert.strictEqual(3, pivotSpecification.cells.length); - - cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("epsilon", cell.fieldName); - assert.strictEqual("test_data", cell.owner); - assert.strictEqual("number", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("average", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - label: "Source Value", - value: "average", - sparkline: false - }, cell); - - // Test error handling for cell value, timestamp - try { - pivotSpecification.addCellValue("_time", "Wrong Stats Function", "max"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on timestamp field must be one of:" + - " duration, earliest, latest, list, or distinct values; found max"); - } - - // Add cell value, timestamp - pivotSpecification.addCellValue("_time", "Source Value", "earliest"); - assert.strictEqual(4, pivotSpecification.cells.length); - - cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("_time", cell.fieldName); - assert.strictEqual("BaseEvent", cell.owner); - assert.strictEqual("timestamp", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("earliest", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "_time", - owner: "BaseEvent", - type: "timestamp", - label: "Source Value", - value: "earliest", - sparkline: false - }, cell); - - // Test error handling for cell value, count - try { - pivotSpecification.addCellValue("test_data", "Wrong Stats Function", "min"); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + obj.createPivotSpecification().pivot(done); + }, + function (pivot, done) { assert.ok(false); } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on childcount and objectcount fields " + - "must be count; found " + "min"); + ], + function (err) { + assert.ok(err); + var expectedErr = "In handler 'datamodelpivot': Error in 'PivotReport': Must have non-empty cells or non-empty rows."; + assert.ok(utils.endsWith(err.message, expectedErr)); + done(); } + ); + }) - // Add cell value, count - pivotSpecification.addCellValue("test_data", "Source Value", "count"); - assert.strictEqual(5, pivotSpecification.cells.length); - - cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("test_data", cell.fieldName); - assert.strictEqual("test_data", cell.owner); - assert.strictEqual("objectCount", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("count", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "test_data", - owner: "test_data", - type: "objectCount", - label: "Source Value", - value: "count", - sparkline: false - }, cell); - + it("Callback#Pivot - test pivot with simple namespace", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - "Callback#Pivot - test pivot throws HTTP exception": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - obj.createPivotSpecification().pivot(done); - }, - function (pivot, done) { - assert.ok(false); - } - ], - function (err) { - assert.ok(err); - var expectedErr = "In handler 'datamodelpivot': Error in 'PivotReport': Must have non-empty cells or non-empty rows."; - assert.ok(utils.endsWith(err.message, expectedErr)); - done(); + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ); - }, - "Callback#Pivot - test pivot with simple namespace": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - var obj; - var pivotSpecification; - var adhocjob; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("test_data"); - assert.ok(obj); - obj.createLocalAccelerationJob(null, done); - }, - function (job, done) { - adhocjob = job; - assert.ok(job); - pivotSpecification = obj.createPivotSpecification(); - - pivotSpecification.addBooleanRowSplit("has_boris", "Has Boris", "meep", "hilda"); - pivotSpecification.addCellValue("hostip", "Distinct IPs", "count"); - - // Test setting a job - pivotSpecification.setAccelerationJob(job); - assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); - assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); - - // Test setting a job's SID - pivotSpecification.setAccelerationJob(job.sid); - assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); - assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); - - pivotSpecification.pivot(done); - }, - function (pivot, done) { - assert.ok(pivot.tstatsSearch); - assert.ok(pivot.tstatsSearch.length > 0); - assert.strictEqual(0, pivot.tstatsSearch.indexOf("| tstats")); - // This test won't work with utils.startsWith due to the regex escaping - assert.strictEqual("| tstats", pivot.tstatsSearch.match("^\\| tstats")[0]); - assert.strictEqual(1, pivot.tstatsSearch.match("^\\| tstats").length); - - pivot.run(done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties().isDone; - }, - 10, - done - ); - }, - function (job, done) { - assert.ok("FAILED" !== job.properties().dispatchState); - - assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); - // This test won't work with utils.startsWith due to the regex escaping - assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); - assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); - - adhocjob.cancel(done); - } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - "Callback#Pivot - test pivot column range split": function (done) { - // This test is here because we had a problem with fields that were supposed to be - // numbers being expected as strings in Splunk 6.0. This was fixed in Splunk 6.1, and accepts - // either strings or numbers. - - if (this.skip) { - done(); - return; - } - var that = this; - var search; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - var dm = dataModels.item("internal_audit_logs"); - var obj = dm.objectByName("searches"); - var pivotSpecification = obj.createPivotSpecification(); - - pivotSpecification.addRowSplit("user", "Executing user"); - pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); - pivotSpecification.addCellValue("search", "Search Query", "values"); - pivotSpecification.pivot(done); - }, - function (pivot, done) { - // If tstats is undefined, use pivotSearch - search = pivot.tstatsSearch || pivot.pivotSearch; - pivot.run(done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties().isDone; - }, - 10, - done - ); - }, - function (job, done) { - assert.notStrictEqual("FAILED", job.properties().dispatchState); - // Make sure the job is run with the correct search query - assert.strictEqual(search, job.properties().request.search); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); + var that = this; + var obj; + var pivotSpecification; + var adhocjob; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("test_data"); + assert.ok(obj); + obj.createLocalAccelerationJob(null, done); + }, + function (job, done) { + adhocjob = job; + assert.ok(job); + pivotSpecification = obj.createPivotSpecification(); + + pivotSpecification.addBooleanRowSplit("has_boris", "Has Boris", "meep", "hilda"); + pivotSpecification.addCellValue("hostip", "Distinct IPs", "count"); + + // Test setting a job + pivotSpecification.setAccelerationJob(job); + assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); + assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); + + // Test setting a job's SID + pivotSpecification.setAccelerationJob(job.sid); + assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); + assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); + + pivotSpecification.pivot(done); + }, + function (pivot, done) { + assert.ok(pivot.tstatsSearch); + assert.ok(pivot.tstatsSearch.length > 0); + assert.strictEqual(0, pivot.tstatsSearch.indexOf("| tstats")); + // This test won't work with utils.startsWith due to the regex escaping + assert.strictEqual("| tstats", pivot.tstatsSearch.match("^\\| tstats")[0]); + assert.strictEqual(1, pivot.tstatsSearch.match("^\\| tstats").length); + + pivot.run(done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties().isDone; + }, + 10, + done + ); + }, + function (job, done) { + assert.ok("FAILED" !== job.properties().dispatchState); + + assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); + // This test won't work with utils.startsWith due to the regex escaping + assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); + assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); + + adhocjob.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Pivot - test pivot column range split", function (done) { + // This test is here because we had a problem with fields that were supposed to be + // numbers being expected as strings in Splunk 6.0. This was fixed in Splunk 6.1, and accepts + // either strings or numbers. + + if (this.skip) { done(); + return; } - ); - }, - "Callback#Pivot - test pivot with PivotSpecification.run and Job.track": function (done) { - if (this.skip) { - done(); - return; - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - var dm = dataModels.item("internal_audit_logs"); - var obj = dm.objectByName("searches"); - var pivotSpecification = obj.createPivotSpecification(); - - pivotSpecification.addRowSplit("user", "Executing user"); - pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); - pivotSpecification.addCellValue("search", "Search Query", "values"); + var that = this; + var search; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + var dm = dataModels.item("internal_audit_logs"); + var obj = dm.objectByName("searches"); + var pivotSpecification = obj.createPivotSpecification(); + + pivotSpecification.addRowSplit("user", "Executing user"); + pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); + pivotSpecification.addCellValue("search", "Search Query", "values"); + pivotSpecification.pivot(done); + }, + function (pivot, done) { + // If tstats is undefined, use pivotSearch + search = pivot.tstatsSearch || pivot.pivotSearch; + pivot.run(done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties().isDone; + }, + 10, + done + ); + }, + function (job, done) { + assert.notStrictEqual("FAILED", job.properties().dispatchState); + // Make sure the job is run with the correct search query + assert.strictEqual(search, job.properties().request.search); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) - pivotSpecification.run({}, done); - }, - function (job, pivot, done) { - job.track({}, function (job) { - assert.strictEqual(pivot.tstatsSearch || pivot.pivotSearch, job.properties().request.search); - done(null, job); - }); - }, - function (job, done) { - assert.notStrictEqual("FAILED", job.properties().dispatchState); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); + it("Callback#Pivot - test pivot with PivotSpecification.run and Job.track", function (done) { + if (this.skip) { done(); + return; } - ); - }, - "Callback#DataModels - delete any remaining data models created by the SDK tests": function (done) { - if (this.skip) { - done(); - return; - } - svc.dataModels().fetch(function (err, dataModels) { - if (err) { - assert.ok(!err); - } - - var dms = dataModels.list(); - Async.seriesEach( - dms, - function (datamodel, i, done) { - // Delete any test data models that we created - if (utils.startsWith(datamodel.name, "delete-me")) { - datamodel.remove(done); - } - else { - done(); - } + var that = this; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + var dm = dataModels.item("internal_audit_logs"); + var obj = dm.objectByName("searches"); + var pivotSpecification = obj.createPivotSpecification(); + + pivotSpecification.addRowSplit("user", "Executing user"); + pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); + pivotSpecification.addCellValue("search", "Search Query", "values"); + + pivotSpecification.run({}, done); }, + function (job, pivot, done) { + job.track({}, function (job) { + assert.strictEqual(pivot.tstatsSearch || pivot.pivotSearch, job.properties().request.search); + done(null, job); + }); + }, + function (job, done) { + assert.notStrictEqual("FAILED", job.properties().dispatchState); + job.cancel(done); + } + ], function (err) { assert.ok(!err); done(); } ); - }); - } - }; + }) + + it("Callback#DataModels - delete any remaining data models created by the SDK tests", function (done) { + if (this.skip) { + done(); + return; + } + svc.dataModels().fetch(function (err, dataModels) { + if (err) { + assert.ok(!err); + } + + var dms = dataModels.list(); + Async.seriesEach( + dms, + function (datamodel, i, done) { + // Delete any test data models that we created + if (utils.startsWith(datamodel.name, "delete-me")) { + datamodel.remove(done); + } + else { + done(); + } + }, + function (err) { + assert.ok(!err); + done(); + } + ); + }); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/properties.js b/tests_spike/service_tests/properties.js index 911b5b762..e4d787925 100644 --- a/tests_spike/service_tests/properties.js +++ b/tests_spike/service_tests/properties.js @@ -1,131 +1,134 @@ -var assert = require('chai').assert; -var splunkjs = require('../../index'); +exports.setup = function (svc) { + var assert = require('chai').assert; -var Async = splunkjs.Async; -var idCounter = 0; + var splunkjs = require('../../index'); -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; + var Async = splunkjs.Async; + var idCounter = 0; -exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Callback#list": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { - that.service.configurations(namespace).fetch(done); - }, - function (props, done) { - var files = props.list(); - assert.ok(files.length > 0); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#item": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("web"); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(file.name, "web"); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#contains stanza": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("web"); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(file.name, "web"); - var stanza = file.item("settings"); - assert.ok(stanza); - stanza.fetch(done); - }, - function (stanza, done) { - assert.ok(stanza.properties().hasOwnProperty("httpport")); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#create file + create stanza + update stanza": function (done) { - var that = this; - var fileName = "jssdk_file_" + getNextId(); - var value = "barfoo_" + getNextId(); - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { - var properties = that.service.configurations(namespace); - properties.fetch(done); - }, - function (properties, done) { - properties.create(fileName, done); - }, - function (file, done) { - file.create("stanza", done); - }, - function (stanza, done) { - stanza.update({ "jssdk_foobar": value }, done); - }, - function (stanza, done) { - assert.strictEqual(stanza.properties()["jssdk_foobar"], value); - done(); - }, - function (done) { - var file = new splunkjs.Service.ConfigurationFile(svc, fileName); - file.fetch(done); - }, - function (file, done) { - var stanza = file.item("stanza"); - assert.ok(stanza); - stanza.remove(done); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - } + var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); }; + return ( + describe("Properties Test", function(){ + + before(function (done) { + this.service = svc; + done(); + }) + + it("Callback#list", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { + that.service.configurations(namespace).fetch(done); + }, + function (props, done) { + var files = props.list(); + assert.ok(files.length > 0); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }) + + it("Callback#item", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("web"); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(file.name, "web"); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }) + + it("Callback#contains stanza", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("web"); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(file.name, "web"); + var stanza = file.item("settings"); + assert.ok(stanza); + stanza.fetch(done); + }, + function (stanza, done) { + assert.ok(stanza.properties().hasOwnProperty("httpport")); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }) + + it("Callback#create file + create stanza + update stanza", function (done) { + var that = this; + var fileName = "jssdk_file_" + getNextId(); + var value = "barfoo_" + getNextId(); + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { + var properties = that.service.configurations(namespace); + properties.fetch(done); + }, + function (properties, done) { + properties.create(fileName, done); + }, + function (file, done) { + file.create("stanza", done); + }, + function (stanza, done) { + stanza.update({ "jssdk_foobar": value }, done); + }, + function (stanza, done) { + assert.strictEqual(stanza.properties()["jssdk_foobar"], value); + done(); + }, + function (done) { + var file = new splunkjs.Service.ConfigurationFile(svc, fileName); + file.fetch(done); + }, + function (file, done) { + var stanza = file.item("stanza"); + assert.ok(stanza); + stanza.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/savedsearch.js b/tests_spike/service_tests/savedsearch.js index 075e9f47d..209eed5f9 100644 --- a/tests_spike/service_tests/savedsearch.js +++ b/tests_spike/service_tests/savedsearch.js @@ -1,420 +1,419 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); -var tutils = require('../utils'); - -var Async = splunkjs.Async; -var utils = splunkjs.Utils; -var idCounter = 0; - -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; exports.setup = function (svc, loggedOutSvc) { - return { - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }, - - "Callback#list": function (done) { - var searches = this.service.savedSearches(); - searches.fetch(function (err, searches) { - var savedSearches = searches.list(); - assert.ok(savedSearches.length > 0); - - for (var i = 0; i < savedSearches.length; i++) { - assert.ok(savedSearches[i]); - } - - done(); - }); - }, - - "Callback#contains": function (done) { - var searches = this.service.savedSearches(); - searches.fetch(function (err, searches) { - var search = searches.item("Errors in the last hour"); - assert.ok(search); - + var assert = require('chai').assert; + var splunkjs = require('../../index'); + var tutils = require('../utils'); + var Async = splunkjs.Async; + var utils = splunkjs.Utils; + var idCounter = 0; + var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); + }; + return ( + describe("Saved Search", function(){ + before(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; done(); - }); - }, - - "Callback#suppress": function (done) { - var searches = this.service.savedSearches(); - searches.fetch(function (err, searches) { - var search = searches.item("Errors in the last hour"); - assert.ok(search); - - search.suppressInfo(function (err, info, search) { - assert.ok(!err); + }) + + it("Callback#list", function (done) { + var searches = this.service.savedSearches(); + searches.fetch(function (err, searches) { + var savedSearches = searches.list(); + assert.ok(savedSearches.length > 0); + + for (var i = 0; i < savedSearches.length; i++) { + assert.ok(savedSearches[i]); + } + done(); }); - }); - }, - - "Callback#list limit count": function (done) { - var searches = this.service.savedSearches(); - searches.fetch({ count: 2 }, function (err, searches) { - var savedSearches = searches.list(); - assert.strictEqual(savedSearches.length, 2); - - for (var i = 0; i < savedSearches.length; i++) { - assert.ok(savedSearches[i]); - } - - done(); - }); - }, - - "Callback#list filter": function (done) { - var searches = this.service.savedSearches(); - searches.fetch({ search: "Error" }, function (err, searches) { - var savedSearches = searches.list(); - assert.ok(savedSearches.length > 0); - - for (var i = 0; i < savedSearches.length; i++) { - assert.ok(savedSearches[i]); - } - - done(); - }); - }, - - "Callback#list offset": function (done) { - var searches = this.service.savedSearches(); - searches.fetch({ offset: 2, count: 1 }, function (err, searches) { - var savedSearches = searches.list(); - assert.strictEqual(searches.paging().offset, 2); - assert.strictEqual(searches.paging().perPage, 1); - assert.strictEqual(savedSearches.length, 1); - - for (var i = 0; i < savedSearches.length; i++) { - assert.ok(savedSearches[i]); - } - - done(); - }); - }, - - "Callback#create + modify + delete saved search": function (done) { - var name = "jssdk_savedsearch"; - var originalSearch = "search * | head 1"; - var updatedSearch = "search * | head 10"; - var updatedDescription = "description"; - - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - - Async.chain([ - function (done) { - searches.create({ search: originalSearch, name: name }, done); - }, - function (search, done) { - assert.ok(search); - - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, originalSearch); - assert.ok(!search.properties().description); - - search.update({ search: updatedSearch }, done); - }, - function (search, done) { - assert.ok(search); + }) + + it("Callback#contains", function (done) { + var searches = this.service.savedSearches(); + searches.fetch(function (err, searches) { + var search = searches.item("Errors in the last hour"); assert.ok(search); - - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, updatedSearch); - assert.ok(!search.properties().description); - - search.update({ description: updatedDescription }, done); - }, - function (search, done) { - assert.ok(search); - assert.ok(search); - - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, updatedSearch); - assert.strictEqual(search.properties().description, updatedDescription); - - search.fetch(done); - }, - function (search, done) { - // Verify that we have the required fields - assert.ok(search.fields().optional.length > 1); - assert.ok(utils.indexOf(search.fields().optional, "disabled") > -1); - - search.remove(done); - } - ], - function (err) { - assert.ok(!err); + done(); - } - ); - }, - - "Callback#dispatch error": function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - var search = new splunkjs.Service.SavedSearch( - this.loggedOutService, - name, - { owner: "nobody", app: "search" } - ); - search.dispatch(function (err) { - assert.ok(err); - done(); - }); - }, - - "Callback#dispatch omitting optional arguments": function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - - Async.chain( - [function (done) { - searches.create({ search: originalSearch, name: name }, done); - }, - function (search, done) { - assert.ok(search); - - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, originalSearch); - assert.ok(!search.properties().description); - - search.dispatch(done); - }, - function (job, search, done) { - assert.ok(job); + }); + }) + + it("Callback#suppress", function (done) { + var searches = this.service.savedSearches(); + searches.fetch(function (err, searches) { + var search = searches.item("Errors in the last hour"); assert.ok(search); - }] - ); - done(); - }, - - "Callback#history error": function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - var search = new splunkjs.Service.SavedSearch( - this.loggedOutService, - name, - { owner: "nobody", app: "search", sharing: "system" } - ); - search.history(function (err) { - assert.ok(err); - done(); - }); - }, - - "Callback#Update error": function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - var search = new splunkjs.Service.SavedSearch( - this.loggedOutService, - name, - { owner: "nobody", app: "search", sharing: "system" } - ); - search.update( - {}, - function (err) { - assert.ok(err); + + search.suppressInfo(function (err, info, search) { + assert.ok(!err); + done(); + }); + }); + }) + + it("Callback#list limit count", function (done) { + var searches = this.service.savedSearches(); + searches.fetch({ count: 2 }, function (err, searches) { + var savedSearches = searches.list(); + assert.strictEqual(savedSearches.length, 2); + + for (var i = 0; i < savedSearches.length; i++) { + assert.ok(savedSearches[i]); + } + done(); }); - }, - - "Callback#oneshot requires search string": function (done) { - assert.throws(function () { this.service.oneshotSearch({ name: "jssdk_oneshot_" + getNextId() }, function (err) { }); }); - done(); - }, - - "Callback#Create + dispatch + history": function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - - Async.chain( - function (done) { - searches.create({ search: originalSearch, name: name }, done); - }, - function (search, done) { - assert.ok(search); - - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, originalSearch); - assert.ok(!search.properties().description); - - search.dispatch({ force_dispatch: false, "dispatch.buckets": 295 }, done); - }, - function (job, search, done) { - assert.ok(job); - assert.ok(search); - - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - Async.augment(done, search) - ); - }, - function (job, search, done) { - assert.strictEqual(job.properties().statusBuckets, 295); - search.history(Async.augment(done, job)); - }, - function (jobs, search, originalJob, done) { - assert.ok(jobs); - assert.ok(jobs.length > 0); - assert.ok(search); - assert.ok(originalJob); - - var cancel = function (job) { - return function (cb) { - job.cancel(cb); - }; - }; - - var found = false; - var cancellations = []; - for (var i = 0; i < jobs.length; i++) { - cancellations.push(cancel(jobs[i])); - found = found || (jobs[i].sid === originalJob.sid); + }) + + it("Callback#list filter", function (done) { + var searches = this.service.savedSearches(); + searches.fetch({ search: "Error" }, function (err, searches) { + var savedSearches = searches.list(); + assert.ok(savedSearches.length > 0); + + for (var i = 0; i < savedSearches.length; i++) { + assert.ok(savedSearches[i]); } - - assert.ok(found); - - search.remove(function (err) { - if (err) { - done(err); - } - else { - Async.parallel(cancellations, done); - } - }); - }, - function (err) { - assert.ok(!err); + done(); - } - ); - }, - - "Callback#job events fails": function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.events({}, function (err) { - assert.ok(err); - done(); - }); - }, - - "Callback#job preview fails": function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.preview({}, function (err) { - assert.ok(err); - done(); - }); - }, - - "Callback#job results fails": function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.results({}, function (err) { - assert.ok(err); - done(); - }); - }, - - "Callback#job searchlog fails": function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.searchlog(function (err) { - assert.ok(err); - done(); - }); - }, - - "Callback#job summary fails": function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.summary({}, function (err) { - assert.ok(err); + }); + }) + + it("Callback#list offset", function (done) { + var searches = this.service.savedSearches(); + searches.fetch({ offset: 2, count: 1 }, function (err, searches) { + var savedSearches = searches.list(); + assert.strictEqual(searches.paging().offset, 2); + assert.strictEqual(searches.paging().perPage, 1); + assert.strictEqual(savedSearches.length, 1); + + for (var i = 0; i < savedSearches.length; i++) { + assert.ok(savedSearches[i]); + } + + done(); + }); + }) + + it("Callback#create + modify + delete saved search", function (done) { + var name = "jssdk_savedsearch"; + var originalSearch = "search * | head 1"; + var updatedSearch = "search * | head 10"; + var updatedDescription = "description"; + + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); + + Async.chain([ + function (done) { + searches.create({ search: originalSearch, name: name }, done); + }, + function (search, done) { + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, originalSearch); + assert.ok(!search.properties().description); + + search.update({ search: updatedSearch }, done); + }, + function (search, done) { + assert.ok(search); + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, updatedSearch); + assert.ok(!search.properties().description); + + search.update({ description: updatedDescription }, done); + }, + function (search, done) { + assert.ok(search); + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, updatedSearch); + assert.strictEqual(search.properties().description, updatedDescription); + + search.fetch(done); + }, + function (search, done) { + // Verify that we have the required fields + assert.ok(search.fields().optional.length > 1); + assert.ok(utils.indexOf(search.fields().optional, "disabled") > -1); + + search.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#dispatch error", function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + var search = new splunkjs.Service.SavedSearch( + this.loggedOutService, + name, + { owner: "nobody", app: "search" } + ); + search.dispatch(function (err) { + assert.ok(err); + done(); + }); + }) + + it("Callback#dispatch omitting optional arguments", function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); + + Async.chain( + [function (done) { + searches.create({ search: originalSearch, name: name }, done); + }, + function (search, done) { + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, originalSearch); + assert.ok(!search.properties().description); + + search.dispatch(done); + }, + function (job, search, done) { + assert.ok(job); + assert.ok(search); + }] + ); done(); - }); - }, - - "Callback#job timeline fails": function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.timeline({}, function (err) { - assert.ok(err); + }) + + it("Callback#history error", function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + var search = new splunkjs.Service.SavedSearch( + this.loggedOutService, + name, + { owner: "nobody", app: "search", sharing: "system" } + ); + search.history(function (err) { + assert.ok(err); + done(); + }); + }) + + it("Callback#Update error", function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + var search = new splunkjs.Service.SavedSearch( + this.loggedOutService, + name, + { owner: "nobody", app: "search", sharing: "system" } + ); + search.update( + {}, + function (err) { + assert.ok(err); + done(); + }); + }) + + it("Callback#oneshot requires search string", function (done) { + assert.throws(function () { this.service.oneshotSearch({ name: "jssdk_oneshot_" + getNextId() }, function (err) { }); }); done(); - }); - }, - - "Callback#delete test saved searches": function (done) { - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - searches.fetch(function (err, searches) { - var searchList = searches.list(); - Async.parallelEach( - searchList, - function (search, idx, callback) { - if (utils.startsWith(search.name, "jssdk_")) { - search.remove(callback); - } - else { - callback(); + }) + + it("Callback#Create + dispatch + history", function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); + + Async.chain( + function (done) { + searches.create({ search: originalSearch, name: name }, done); + }, + function (search, done) { + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, originalSearch); + assert.ok(!search.properties().description); + + search.dispatch({ force_dispatch: false, "dispatch.buckets": 295 }, done); + }, + function (job, search, done) { + assert.ok(job); + assert.ok(search); + + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + Async.augment(done, search) + ); + }, + function (job, search, done) { + assert.strictEqual(job.properties().statusBuckets, 295); + search.history(Async.augment(done, job)); + }, + function (jobs, search, originalJob, done) { + assert.ok(jobs); + assert.ok(jobs.length > 0); + assert.ok(search); + assert.ok(originalJob); + + var cancel = function (job) { + return function (cb) { + job.cancel(cb); + }; + }; + + var found = false; + var cancellations = []; + for (var i = 0; i < jobs.length; i++) { + cancellations.push(cancel(jobs[i])); + found = found || (jobs[i].sid === originalJob.sid); } - }, function (err) { + + assert.ok(found); + + search.remove(function (err) { + if (err) { + done(err); + } + else { + Async.parallel(cancellations, done); + } + }); + }, + function (err) { assert.ok(!err); done(); } ); - }); - }, - - "Callback#setupInfo fails": function (done) { - var searches = new splunkjs.Service.Application(this.loggedOutService, "search"); - searches.setupInfo(function (err, content, that) { - assert.ok(err); - done(); - }); - }, - - "Callback#setupInfo succeeds": function (done) { - var app = new splunkjs.Service.Application(this.service, "sdk-app-collection"); - app.setupInfo(function (err, content, app) { - // This error message was removed in modern versions of Splunk - if (err) { - assert.ok(err.data.messages[0].text.match("Setup configuration file does not")); - splunkjs.Logger.log("ERR ---", err.data.messages[0].text); - } - else { + }) + + it("Callback#job events fails", function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.events({}, function (err) { + assert.ok(err); + done(); + }); + }) + + it("Callback#job preview fails", function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.preview({}, function (err) { + assert.ok(err); + done(); + }); + }) + + it("Callback#job results fails", function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.results({}, function (err) { + assert.ok(err); + done(); + }); + }) + + it("Callback#job searchlog fails", function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.searchlog(function (err) { + assert.ok(err); + done(); + }); + }) + + it("Callback#job summary fails", function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.summary({}, function (err) { + assert.ok(err); + done(); + }); + }) + + it("Callback#job timeline fails", function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.timeline({}, function (err) { + assert.ok(err); + done(); + }); + }) + + it("Callback#delete test saved searches", function (done) { + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); + searches.fetch(function (err, searches) { + var searchList = searches.list(); + Async.parallelEach( + searchList, + function (search, idx, callback) { + if (utils.startsWith(search.name, "jssdk_")) { + search.remove(callback); + } + else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); + } + ); + }); + }) + + it("Callback#setupInfo fails", function (done) { + var searches = new splunkjs.Service.Application(this.loggedOutService, "search"); + searches.setupInfo(function (err, content, that) { + assert.ok(err); + done(); + }); + }) + + it("Callback#setupInfo succeeds", function (done) { + var app = new splunkjs.Service.Application(this.service, "sdk-app-collection"); + app.setupInfo(function (err, content, app) { + // This error message was removed in modern versions of Splunk + if (err) { + assert.ok(err.data.messages[0].text.match("Setup configuration file does not")); + splunkjs.Logger.log("ERR ---", err.data.messages[0].text); + } + else { + assert.ok(app); + } + done(); + }); + }) + + it("Callback#updateInfo", function (done) { + var app = new splunkjs.Service.Application(this.service, "search"); + app.updateInfo(function (err, info, app) { + assert.ok(!err); assert.ok(app); - } - done(); - }); - }, - - "Callback#updateInfo": function (done) { - var app = new splunkjs.Service.Application(this.service, "search"); - app.updateInfo(function (err, info, app) { - assert.ok(!err); - assert.ok(app); - assert.strictEqual(app.name, 'search'); - done(); - }); - }, - - "Callback#updateInfo failure": function (done) { - var app = new splunkjs.Service.Application(this.loggedOutService, "sdk-app-collection"); - app.updateInfo(function (err, info, app) { - assert.ok(err); - done(); - }); - } - }; + assert.strictEqual(app.name, 'search'); + done(); + }); + }) + + it("Callback#updateInfo failure", function (done) { + var app = new splunkjs.Service.Application(this.loggedOutService, "sdk-app-collection"); + app.updateInfo(function (err, info, app) { + assert.ok(err); + done(); + }); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/serverinfo.js b/tests_spike/service_tests/serverinfo.js index c5d1f8d7b..860bc47d8 100644 --- a/tests_spike/service_tests/serverinfo.js +++ b/tests_spike/service_tests/serverinfo.js @@ -1,27 +1,29 @@ -var assert = require('chai').assert; exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Callback#Basic": function (done) { - var service = this.service; - - service.serverInfo(function (err, info) { - assert.ok(!err); - assert.ok(info); - assert.strictEqual(info.name, "server-info"); - assert.ok(info.properties().hasOwnProperty("version")); - assert.ok(info.properties().hasOwnProperty("serverName")); - assert.ok(info.properties().hasOwnProperty("os_version")); - + var assert = require('chai').assert; + return ( + describe("Server Info Test", function(){ + before(function (done) { + this.service = svc; done(); - }); - } - }; + }) + + it("Callback#Basic", function (done) { + var service = this.service; + + service.serverInfo(function (err, info) { + assert.ok(!err); + assert.ok(info); + assert.strictEqual(info.name, "server-info"); + assert.ok(info.properties().hasOwnProperty("version")); + assert.ok(info.properties().hasOwnProperty("serverName")); + assert.ok(info.properties().hasOwnProperty("os_version")); + + done(); + }); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/storagepasswords.js b/tests_spike/service_tests/storagepasswords.js index b6ae37830..dfd0953e7 100644 --- a/tests_spike/service_tests/storagepasswords.js +++ b/tests_spike/service_tests/storagepasswords.js @@ -1,616 +1,615 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -var Async = splunkjs.Async; -var idCounter = 0; - -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Callback#Create": function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create with backslashes": function (done) { - var startcount = -1; - var name = "\\delete-me-" + getNextId(); - var realm = "\\delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual("\\" + realm + ":\\" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create with slashes": function (done) { - var startcount = -1; - var name = "/delete-me-" + getNextId(); - var realm = "/delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create without realm": function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual("", storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create should fail without user, or realm": function (done) { - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - storagePasswords.create({ name: null, password: "changed!" }, done); - } - ], - function (err) { - assert.ok(err); - done(); - } - ); - }, - - "Callback#Create should fail without password": function (done) { - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - storagePasswords.create({ name: "something", password: null }, done); - } - ], - function (err) { - assert.ok(err); - done(); - } - ); - }, - - "Callback#Create should fail without user, realm, or password": function (done) { - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - storagePasswords.create({ name: null, password: null }, done); - } - ], - function (err) { - assert.ok(err); - done(); - } - ); - }, - - "Callback#Create with colons": function (done) { - var startcount = -1; - var name = ":delete-me-" + getNextId(); - var realm = ":delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual("\\" + realm + ":\\" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create crazy": function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ - name: name + ":end!@#$%^&*()_+{}:|<>?", - realm: ":start::!@#$%^&*()_+{}:|<>?" + realm, - password: "changed!" - }, - done); - }, - function (storagePassword, done) { - assert.strictEqual(name + ":end!@#$%^&*()_+{}:|<>?", storagePassword.properties().username); - assert.strictEqual("\\:start\\:\\:!@#$%^&*()_+{}\\:|<>?" + realm + ":" + name + "\\:end!@#$%^&*()_+{}\\:|<>?:", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(":start::!@#$%^&*()_+{}:|<>?" + realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create with unicode chars": function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ - name: name + ":end!@#$%^&*()_+{}:|<>?쎼 and 쎶 and <&> für", - realm: ":start::!@#$%^&*()_+{}:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm, - password: decodeURIComponent(encodeURIComponent("쎼 and 쎶 and <&> für")) - }, - done); - }, - function (storagePassword, done) { - assert.strictEqual(name + ":end!@#$%^&*()_+{}:|<>?쎼 and 쎶 and <&> für", storagePassword.properties().username); - assert.strictEqual("\\:start\\:\\:!@#$%^&*()_+{}\\:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm + ":" + name + "\\:end!@#$%^&*()_+{}\\:|<>?쎼 and 쎶 and <&> für:", storagePassword.name); - assert.strictEqual(decodeURIComponent(encodeURIComponent("쎼 and 쎶 and <&> für")), storagePassword.properties().clear_password); - assert.strictEqual(":start::!@#$%^&*()_+{}:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Read": function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - try { - assert.ok(!!storagePasswords.item(realm + ":" + name + ":")); + var assert = require('chai').assert; + var splunkjs = require('../../index'); + var Async = splunkjs.Async; + var idCounter = 0; + var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); + }; + return ( + describe("Storage Password Tests", function(){ + before(function (done) { + this.service = svc; + done(); + }); + + it("Callback#Create", function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); } - catch (e) { - assert.ok(false); + ], + function (err) { + assert.ok(!err); + done(); } - - var list = storagePasswords.list(); - var found = false; - - assert.strictEqual(startcount + 1, list.length); - for (var i = 0; i < list.length; i++) { - if (realm + ":" + name + ":" === list[i].name) { - found = true; - } + ); + }) + + it("Callback#Create with backslashes", function (done) { + var startcount = -1; + var name = "\\delete-me-" + getNextId(); + var realm = "\\delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual("\\" + realm + ":\\" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); } - assert.ok(found); - - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Read with slashes": function (done) { - var startcount = -1; - var name = "/delete-me-" + getNextId(); - var realm = "/delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - try { - assert.ok(!!storagePasswords.item(realm + ":" + name + ":")); + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Create with slashes", function (done) { + var startcount = -1; + var name = "/delete-me-" + getNextId(); + var realm = "/delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); } - catch (e) { - assert.ok(false); + ], + function (err) { + assert.ok(!err); + done(); } - - var list = storagePasswords.list(); - var found = false; - - assert.strictEqual(startcount + 1, list.length); - for (var i = 0; i < list.length; i++) { - if (realm + ":" + name + ":" === list[i].name) { - found = true; + ); + }) + + it("Callback#Create without realm", function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual("", storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Create should fail without user, or realm", function (done) { + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + storagePasswords.create({ name: null, password: "changed!" }, done); + } + ], + function (err) { + assert.ok(err); + done(); + } + ); + }) + + it("Callback#Create should fail without password", function (done) { + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + storagePasswords.create({ name: "something", password: null }, done); + } + ], + function (err) { + assert.ok(err); + done(); + } + ); + }) + + it("Callback#Create should fail without user, realm, or password", function (done) { + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + storagePasswords.create({ name: null, password: null }, done); + } + ], + function (err) { + assert.ok(err); + done(); + } + ); + }) + + it("Callback#Create with colons", function (done) { + var startcount = -1; + var name = ":delete-me-" + getNextId(); + var realm = ":delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual("\\" + realm + ":\\" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Create crazy", function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ + name: name + ":end!@#$%^&*()_+{}:|<>?", + realm: ":start::!@#$%^&*()_+{}:|<>?" + realm, + password: "changed!" + }, + done); + }, + function (storagePassword, done) { + assert.strictEqual(name + ":end!@#$%^&*()_+{}:|<>?", storagePassword.properties().username); + assert.strictEqual("\\:start\\:\\:!@#$%^&*()_+{}\\:|<>?" + realm + ":" + name + "\\:end!@#$%^&*()_+{}\\:|<>?:", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(":start::!@#$%^&*()_+{}:|<>?" + realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Create with unicode chars", function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ + name: name + ":end!@#$%^&*()_+{}:|<>?쎼 and 쎶 and <&> für", + realm: ":start::!@#$%^&*()_+{}:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm, + password: decodeURIComponent(encodeURIComponent("쎼 and 쎶 and <&> für")) + }, + done); + }, + function (storagePassword, done) { + assert.strictEqual(name + ":end!@#$%^&*()_+{}:|<>?쎼 and 쎶 and <&> für", storagePassword.properties().username); + assert.strictEqual("\\:start\\:\\:!@#$%^&*()_+{}\\:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm + ":" + name + "\\:end!@#$%^&*()_+{}\\:|<>?쎼 and 쎶 and <&> für:", storagePassword.name); + assert.strictEqual(decodeURIComponent(encodeURIComponent("쎼 and 쎶 and <&> für")), storagePassword.properties().clear_password); + assert.strictEqual(":start::!@#$%^&*()_+{}:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Read", function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + try { + assert.ok(!!storagePasswords.item(realm + ":" + name + ":")); + } + catch (e) { + assert.ok(false); + } + + var list = storagePasswords.list(); + var found = false; + + assert.strictEqual(startcount + 1, list.length); + for (var i = 0; i < list.length; i++) { + if (realm + ":" + name + ":" === list[i].name) { + found = true; + } } + assert.ok(found); + + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); } - assert.ok(found); - - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - // Disabling this test because clear_password field has been removed in Splunk 8.2 - // - // - // "Callback#Update": function(done) { - // var startcount = -1; - // var name = "delete-me-" + getNextId(); - // var realm = "delete-me-" + getNextId(); - // var that = this; - // Async.chain([ - // function(done) { - // that.service.storagePasswords().fetch(done); - // }, - // function(storagePasswords, done) { - // startcount = storagePasswords.list().length; - // storagePasswords.create({name: name, realm: realm, password: "changed!"}, done); - // }, - // function(storagePassword, done) { - // assert.strictEqual(name, storagePassword.properties().username); - // assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - // assert.strictEqual("changed!", storagePassword.properties().clear_password); - // assert.strictEqual(realm, storagePassword.properties().realm); - // that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - // }, - // function(storagePasswords, storagePassword, done) { - // assert.strictEqual(startcount + 1, storagePasswords.list().length); - // storagePassword.update({password: "changed"}, done); - // }, - // function(storagePassword, done) { - // assert.strictEqual(name, storagePassword.properties().username); - // assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - // assert.strictEqual("changed", storagePassword.properties().clear_password); - // assert.strictEqual(realm, storagePassword.properties().realm); - // that.service.storagePasswords().fetch(done); - // }, - // function(storagePasswords, done) { - // var list = storagePasswords.list(); - // var found = false; - // var index = -1; - - // assert.strictEqual(startcount + 1, list.length); - // for (var i = 0; i < list.length; i ++) { - // if (realm + ":" + name + ":" === list[i].name) { - // found = true; - // index = i; - // assert.strictEqual(name, list[i].properties().username); - // assert.strictEqual(realm + ":" + name + ":", list[i].name); - // assert.strictEqual("changed", list[i].properties().clear_password); - // assert.strictEqual(realm, list[i].properties().realm); - // } - // } - // assert.ok(found); - - // if (!found) { - // done(new Error("Didn't find the created password")); - // } - // else { - // list[index].remove(done); - // } - // }, - // function(done) { - // that.service.storagePasswords().fetch(done); - // }, - // function(storagePasswords, done) { - // assert.strictEqual(startcount, storagePasswords.list().length); - // done(); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - - "Callback#Delete": function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - var list = storagePasswords.list(); - var found = false; - var index = -1; - - assert.strictEqual(startcount + 1, list.length); - for (var i = 0; i < list.length; i++) { - if (realm + ":" + name + ":" === list[i].name) { - found = true; - index = i; - assert.strictEqual(name, list[i].properties().username); - assert.strictEqual(realm + ":" + name + ":", list[i].name); - assert.strictEqual("changed!", list[i].properties().clear_password); - assert.strictEqual(realm, list[i].properties().realm); + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Read with slashes", function (done) { + var startcount = -1; + var name = "/delete-me-" + getNextId(); + var realm = "/delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + try { + assert.ok(!!storagePasswords.item(realm + ":" + name + ":")); + } + catch (e) { + assert.ok(false); + } + + var list = storagePasswords.list(); + var found = false; + + assert.strictEqual(startcount + 1, list.length); + for (var i = 0; i < list.length; i++) { + if (realm + ":" + name + ":" === list[i].name) { + found = true; + } } + assert.ok(found); + + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); } - assert.ok(found); - - if (!found) { - done(new Error("Didn't find the created password")); + ], + function (err) { + assert.ok(!err); + done(); } - else { - list[index].remove(done); + ); + }) + + // Disabling this test because clear_password field has been removed in Splunk 8.2 + // + // + // it("Callback#Update": function(done) { + // var startcount = -1; + // var name = "delete-me-" + getNextId(); + // var realm = "delete-me-" + getNextId(); + // var that = this; + // Async.chain([ + // function(done) { + // that.service.storagePasswords().fetch(done); + // }, + // function(storagePasswords, done) { + // startcount = storagePasswords.list().length; + // storagePasswords.create({name: name, realm: realm, password: "changed!"}, done); + // }, + // function(storagePassword, done) { + // assert.strictEqual(name, storagePassword.properties().username); + // assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + // assert.strictEqual("changed!", storagePassword.properties().clear_password); + // assert.strictEqual(realm, storagePassword.properties().realm); + // that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + // }, + // function(storagePasswords, storagePassword, done) { + // assert.strictEqual(startcount + 1, storagePasswords.list().length); + // storagePassword.update({password: "changed"}, done); + // }, + // function(storagePassword, done) { + // assert.strictEqual(name, storagePassword.properties().username); + // assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + // assert.strictEqual("changed", storagePassword.properties().clear_password); + // assert.strictEqual(realm, storagePassword.properties().realm); + // that.service.storagePasswords().fetch(done); + // }, + // function(storagePasswords, done) { + // var list = storagePasswords.list(); + // var found = false; + // var index = -1; + + // assert.strictEqual(startcount + 1, list.length); + // for (var i = 0; i < list.length; i ++) { + // if (realm + ":" + name + ":" === list[i].name) { + // found = true; + // index = i; + // assert.strictEqual(name, list[i].properties().username); + // assert.strictEqual(realm + ":" + name + ":", list[i].name); + // assert.strictEqual("changed", list[i].properties().clear_password); + // assert.strictEqual(realm, list[i].properties().realm); + // } + // } + // assert.ok(found); + + // if (!found) { + // done(new Error("Didn't find the created password")); + // } + // else { + // list[index].remove(done); + // } + // }, + // function(done) { + // that.service.storagePasswords().fetch(done); + // }, + // function(storagePasswords, done) { + // assert.strictEqual(startcount, storagePasswords.list().length); + // done(); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }, + + it("Callback#Delete", function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + var list = storagePasswords.list(); + var found = false; + var index = -1; + + assert.strictEqual(startcount + 1, list.length); + for (var i = 0; i < list.length; i++) { + if (realm + ":" + name + ":" === list[i].name) { + found = true; + index = i; + assert.strictEqual(name, list[i].properties().username); + assert.strictEqual(realm + ":" + name + ":", list[i].name); + assert.strictEqual("changed!", list[i].properties().clear_password); + assert.strictEqual(realm, list[i].properties().realm); + } + } + assert.ok(found); + + if (!found) { + done(new Error("Didn't find the created password")); + } + else { + list[index].remove(done); + } + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); } - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - } - }; + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/typeahead.js b/tests_spike/service_tests/typeahead.js index d7806ddc2..04b1ede4a 100644 --- a/tests_spike/service_tests/typeahead.js +++ b/tests_spike/service_tests/typeahead.js @@ -1,42 +1,44 @@ -var assert = require('chai').assert; exports.setup = function (svc, loggedOutSvc) { - return { - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }, - - "Callback#Typeahead failure": function (done) { - var service = this.loggedOutService; - service.typeahead("index=", 1, function (err, options) { - assert.ok(err); - done(); - }); - }, - - "Callback#Basic typeahead": function (done) { - var service = this.service; - - service.typeahead("index=", 1, function (err, options) { - assert.ok(!err); - assert.ok(options); - assert.strictEqual(options.length, 1); - assert.ok(options[0]); - done(); - }); - }, - - "Typeahead with omitted optional arguments": function (done) { - var service = this.service; - service.typeahead("index=", function (err, options) { - assert.ok(!err); - assert.ok(options); + var assert = require('chai').assert; + return ( + describe("Typeahad Tests", function(){ + before(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; done(); - }); - } - }; + }) + + it("Callback#Typeahead failure", function (done) { + var service = this.loggedOutService; + service.typeahead("index=", 1, function (err, options) { + assert.ok(err); + done(); + }); + }) + + it("Callback#Basic typeahead", function (done) { + var service = this.service; + + service.typeahead("index=", 1, function (err, options) { + assert.ok(!err); + assert.ok(options); + assert.strictEqual(options.length, 1); + assert.ok(options[0]); + done(); + }); + }) + + it("Typeahead with omitted optional arguments", function (done) { + var service = this.service; + service.typeahead("index=", function (err, options) { + assert.ok(!err); + assert.ok(options); + done(); + }); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/user.js b/tests_spike/service_tests/user.js index 370f1ea9d..6c559986e 100644 --- a/tests_spike/service_tests/user.js +++ b/tests_spike/service_tests/user.js @@ -1,252 +1,253 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -var Async = splunkjs.Async; -var utils = splunkjs.Utils; -var idCounter = 0; - -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; exports.setup = function (svc, loggedOutSvc) { - return { - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }, - - afterEach: function (done) { - this.service.logout(done); - }, - - "Callback#Current user": function (done) { - var service = this.service; - - service.currentUser(function (err, user) { - assert.ok(!err); - assert.ok(user); - assert.strictEqual(user.name, service.username); - done(); - }); - }, + var assert = require('chai').assert; + var splunkjs = require('../../index'); + var Async = splunkjs.Async; + var utils = splunkjs.Utils; + var idCounter = 0; - "Callback#Current user fails": function (done) { - var service = this.loggedOutService; + var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); + }; + return ( + describe("User Tests", function(){ - service.currentUser(function (err, user) { - assert.ok(err); + before(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; done(); - }); - }, + }) - "Callback#List users": function (done) { - var service = this.service; + after(function (done) { + this.service.logout(done); + }) - service.users().fetch(function (err, users) { - var userList = users.list(); - assert.ok(!err); - assert.ok(users); + it("Callback#CCurrent user", function (done) { + var service = this.service; - assert.ok(userList); - assert.ok(userList.length > 0); - done(); - }); - }, - - "Callback#create user failure": function (done) { - this.loggedOutService.users().create( - { name: "jssdk_testuser", password: "abcdefg!", roles: "user" }, - function (err, response) { - assert.ok(err); - done(); - } - ); - }, - - "Callback#Create + update + delete user": function (done) { - var service = this.service; - var name = "jssdk_testuser"; - - Async.chain([ - function (done) { - service.users().create({ name: "jssdk_testuser", password: "abcdefg!", roles: "user" }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.name, name); - assert.strictEqual(user.properties().roles.length, 1); - assert.strictEqual(user.properties().roles[0], "user"); - - user.update({ realname: "JS SDK", roles: ["admin", "user"] }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.properties().realname, "JS SDK"); - assert.strictEqual(user.properties().roles.length, 2); - assert.strictEqual(user.properties().roles[0], "admin"); - assert.strictEqual(user.properties().roles[1], "user"); - - user.remove(done); - } - ], - function (err) { + service.currentUser(function (err, user) { assert.ok(!err); - done(); - } - ); - }, - - "Callback#Roles": function (done) { - var service = this.service; - var name = "jssdk_testuser_" + getNextId(); - - Async.chain([ - function (done) { - service.users().create({ name: name, password: "abcdefg!", roles: "user" }, done); - }, - function (user, done) { assert.ok(user); - assert.strictEqual(user.name, name); - assert.strictEqual(user.properties().roles.length, 1); - assert.strictEqual(user.properties().roles[0], "user"); + assert.strictEqual(user.name, service.username); + done(); + }); + }) - user.update({ roles: ["admin", "user"] }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.properties().roles.length, 2); - assert.strictEqual(user.properties().roles[0], "admin"); - assert.strictEqual(user.properties().roles[1], "user"); + it("Callback#CCurrent user fails", function (done) { + var service = this.loggedOutService; - user.update({ roles: "user" }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.properties().roles.length, 1); - assert.strictEqual(user.properties().roles[0], "user"); - - user.update({ roles: "__unknown__" }, done); - } - ], - function (err) { + service.currentUser(function (err, user) { assert.ok(err); - assert.strictEqual(err.status, 400); done(); - } - ); - }, + }); + }) - "Callback#Passwords": function (done) { - var service = this.service; - var newService = null; - var name = "jssdk_testuser_" + getNextId(); + it("Callback#CList users", function (done) { + var service = this.service; - var firstPassword = "abcdefg!"; - var secondPassword = "hijklmn!"; + service.users().fetch(function (err, users) { + var userList = users.list(); + assert.ok(!err); + assert.ok(users); - var useOldPassword = false; + assert.ok(userList); + assert.ok(userList.length > 0); + done(); + }); + }) - Async.chain([ - function (done) { - service.serverInfo(done); - }, - function (info, done) { - var versionParts = info.properties().version.split("."); + it("Callback#Ccreate user failure", function (done) { + this.loggedOutService.users().create( + { name: "jssdk_testuser", password: "abcdefg!", roles: "user" }, + function (err, response) { + assert.ok(err); + done(); + } + ); + }) + + it("Callback#CCreate + update + delete user", function (done) { + var service = this.service; + var name = "jssdk_testuser"; + + Async.chain([ + function (done) { + service.users().create({ name: "jssdk_testuser", password: "abcdefg!", roles: "user" }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.name, name); + assert.strictEqual(user.properties().roles.length, 1); + assert.strictEqual(user.properties().roles[0], "user"); + + user.update({ realname: "JS SDK", roles: ["admin", "user"] }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.properties().realname, "JS SDK"); + assert.strictEqual(user.properties().roles.length, 2); + assert.strictEqual(user.properties().roles[0], "admin"); + assert.strictEqual(user.properties().roles[1], "user"); + + user.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#CRoles", function (done) { + var service = this.service; + var name = "jssdk_testuser_" + getNextId(); + + Async.chain([ + function (done) { + service.users().create({ name: name, password: "abcdefg!", roles: "user" }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.name, name); + assert.strictEqual(user.properties().roles.length, 1); + assert.strictEqual(user.properties().roles[0], "user"); + + user.update({ roles: ["admin", "user"] }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.properties().roles.length, 2); + assert.strictEqual(user.properties().roles[0], "admin"); + assert.strictEqual(user.properties().roles[1], "user"); + + user.update({ roles: "user" }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.properties().roles.length, 1); + assert.strictEqual(user.properties().roles[0], "user"); + + user.update({ roles: "__unknown__" }, done); + } + ], + function (err) { + assert.ok(err); + assert.strictEqual(err.status, 400); + done(); + } + ); + }) - var isDevBuild = versionParts.length === 1; - var newerThan72 = (parseInt(versionParts[0], 10) > 7 || - (parseInt(versionParts[0], 10) === 7 && parseInt(versionParts[1], 10) >= 2)); + it("Callback#CPasswords", function (done) { + var service = this.service; + var newService = null; + var name = "jssdk_testuser_" + getNextId(); - if (isDevBuild || newerThan72) { - useOldPassword = true; - } - done(); - }, - function (done) { - service.users().create({ name: name, password: firstPassword, roles: "user" }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.name, name); - assert.strictEqual(user.properties().roles.length, 1); - assert.strictEqual(user.properties().roles[0], "user"); - - newService = new splunkjs.Service(service.http, { - username: name, - password: firstPassword, - host: service.host, - port: service.port, - scheme: service.scheme, - version: service.version - }); - - newService.login(Async.augment(done, user)); - }, - function (success, user, done) { - assert.ok(success); - assert.ok(user); + var firstPassword = "abcdefg!"; + var secondPassword = "hijklmn!"; - var body = { - password: secondPassword - }; - if (useOldPassword) { - body['oldpassword'] = firstPassword; - } + var useOldPassword = false; - user.update(body, done); - }, - function (user, done) { - newService.login(function (err, success) { - assert.ok(err); - assert.ok(!success); + Async.chain([ + function (done) { + service.serverInfo(done); + }, + function (info, done) { + var versionParts = info.properties().version.split("."); + + var isDevBuild = versionParts.length === 1; + var newerThan72 = (parseInt(versionParts[0], 10) > 7 || + (parseInt(versionParts[0], 10) === 7 && parseInt(versionParts[1], 10) >= 2)); + + if (isDevBuild || newerThan72) { + useOldPassword = true; + } + done(); + }, + function (done) { + service.users().create({ name: name, password: firstPassword, roles: "user" }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.name, name); + assert.strictEqual(user.properties().roles.length, 1); + assert.strictEqual(user.properties().roles[0], "user"); + + newService = new splunkjs.Service(service.http, { + username: name, + password: firstPassword, + host: service.host, + port: service.port, + scheme: service.scheme, + version: service.version + }); + + newService.login(Async.augment(done, user)); + }, + function (success, user, done) { + assert.ok(success); + assert.ok(user); var body = { - password: firstPassword + password: secondPassword }; if (useOldPassword) { - body['oldpassword'] = secondPassword; + body['oldpassword'] = firstPassword; } user.update(body, done); - }); - }, - function (user, done) { - assert.ok(user); - newService.login(done); - } - ], - function (err) { - assert.ok(!err, JSON.stringify(err)); - done(); - } - ); - }, - - "Callback#delete test users": function (done) { - var users = this.service.users(); - users.fetch(function (err, users) { - var userList = users.list(); - - Async.parallelEach( - userList, - function (user, idx, callback) { - if (utils.startsWith(user.name, "jssdk_")) { - user.remove(callback); - } - else { - callback(); - } - }, function (err) { - assert.ok(!err); + }, + function (user, done) { + newService.login(function (err, success) { + assert.ok(err); + assert.ok(!success); + + var body = { + password: firstPassword + }; + if (useOldPassword) { + body['oldpassword'] = secondPassword; + } + + user.update(body, done); + }); + }, + function (user, done) { + assert.ok(user); + newService.login(done); + } + ], + function (err) { + assert.ok(!err, JSON.stringify(err)); done(); } ); - }); - } - }; + }) + + it("Callback#Cdelete test users", function (done) { + var users = this.service.users(); + users.fetch(function (err, users) { + var userList = users.list(); + + Async.parallelEach( + userList, + function (user, idx, callback) { + if (utils.startsWith(user.name, "jssdk_")) { + user.remove(callback); + } + else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); + } + ); + }); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/view.js b/tests_spike/service_tests/view.js index 907206746..08217cac6 100644 --- a/tests_spike/service_tests/view.js +++ b/tests_spike/service_tests/view.js @@ -1,67 +1,68 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -var Async = splunkjs.Async; exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, + var assert = require('chai').assert; + var splunkjs = require('../../index'); + var Async = splunkjs.Async; + return ( + describe("Views ", function(){ + + before(function (done) { + this.service = svc; + done(); + }) - "Callback#List views": function (done) { - var service = this.service; + it("Callback#List views", function (done) { + var service = this.service; - service.views({ owner: "admin", app: "search" }).fetch(function (err, views) { - assert.ok(!err); - assert.ok(views); + service.views({ owner: "admin", app: "search" }).fetch(function (err, views) { + assert.ok(!err); + assert.ok(views); - var viewsList = views.list(); - assert.ok(viewsList); - assert.ok(viewsList.length > 0); + var viewsList = views.list(); + assert.ok(viewsList); + assert.ok(viewsList.length > 0); - for (var i = 0; i < viewsList.length; i++) { - assert.ok(viewsList[i]); - } + for (var i = 0; i < viewsList.length; i++) { + assert.ok(viewsList[i]); + } - done(); - }); - }, - - "Callback#Create + update + delete view": function (done) { - var service = this.service; - var name = "jssdk_testview"; - var originalData = ""; - var newData = ""; - - Async.chain([ - function (done) { - service.views({ owner: "admin", app: "sdk-app-collection" }).create({ name: name, "eai:data": originalData }, done); - }, - function (view, done) { - assert.ok(view); - - assert.strictEqual(view.name, name); - assert.strictEqual(view.properties()["eai:data"], originalData); - - view.update({ "eai:data": newData }, done); - }, - function (view, done) { - assert.ok(view); - assert.strictEqual(view.properties()["eai:data"], newData); - - view.remove(done); - } - ], - function (err) { - assert.ok(!err); done(); - } - ); - } - }; + }); + }) + + it("Callback#Create + update + delete view", function (done) { + var service = this.service; + var name = "jssdk_testview"; + var originalData = ""; + var newData = ""; + + Async.chain([ + function (done) { + service.views({ owner: "admin", app: "sdk-app-collection" }).create({ name: name, "eai:data": originalData }, done); + }, + function (view, done) { + assert.ok(view); + + assert.strictEqual(view.name, name); + assert.strictEqual(view.properties()["eai:data"], originalData); + + view.update({ "eai:data": newData }, done); + }, + function (view, done) { + assert.ok(view); + assert.strictEqual(view.properties()["eai:data"], newData); + + view.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { From ed443eb17613b204c245691b2e13bc677a30ac92 Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Fri, 16 Jul 2021 15:29:41 +0530 Subject: [PATCH 3/7] Service tests added --- package.json | 6 +- tests_spike/service_tests/app.js | 278 +-- tests_spike/service_tests/collection.js | 100 +- tests_spike/service_tests/configuration.js | 394 +++-- tests_spike/service_tests/datamodels.js | 1866 ++++++++++---------- tests_spike/service_tests/endpoint.js | 58 +- tests_spike/service_tests/entity.js | 201 +-- tests_spike/service_tests/firedalerts.js | 486 ++--- tests_spike/service_tests/indexes.js | 757 ++++---- tests_spike/service_tests/job.js | 1780 +++++++++---------- tests_spike/service_tests/namespace.js | 456 ++--- tests_spike/test_service.js | 41 +- tests_spike/tests.js | 16 +- 13 files changed, 3231 insertions(+), 3208 deletions(-) diff --git a/package.json b/package.json index 20f7b17e7..180d16d5a 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "javascript" ], "scripts": { - "test": "nyc mocha tests/tests.js --ui exports -t 50000 --exit" + "test": "mocha tests_spike/tests.js -t 50000 --allow-uncaught --exit" }, "dependencies": { "cookie": "0.4.1", @@ -33,7 +33,7 @@ "browserify": "^17.0.0", "chai": "^4.3.4", "jshint": "2.13.0", - "mocha": "^9.0.2", + "mocha": "7.2.0", "mustache": "4.2.0", "nyc": "^15.1.0", "readable-stream": "3.6.0", @@ -48,4 +48,4 @@ "engine": { "node": ">=0.8.0" } -} +} \ No newline at end of file diff --git a/tests_spike/service_tests/app.js b/tests_spike/service_tests/app.js index 5102d1b4d..cb4e825ca 100644 --- a/tests_spike/service_tests/app.js +++ b/tests_spike/service_tests/app.js @@ -12,169 +12,171 @@ var getNextId = function () { exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Callback#list applications": function (done) { - var apps = this.service.apps(); - apps.fetch(function (err, apps) { - var appList = apps.list(); - assert.ok(appList.length > 0); + return ( + describe("App tests", function (done) { + beforeEach(function (done) { + this.service = svc; done(); }); - }, - "Callback#contains applications": function (done) { - var apps = this.service.apps(); - apps.fetch(function (err, apps) { - var app = apps.item("search"); - assert.ok(app); - done(); + it("Callback#list applications", function (done) { + var apps = this.service.apps(); + apps.fetch(function (err, apps) { + var appList = apps.list(); + assert.ok(appList.length > 0); + done(); + }); }); - }, - - "Callback#create + contains app": function (done) { - var name = "jssdk_testapp_" + getNextId(); - var apps = this.service.apps(); - apps.create({ name: name }, function (err, app) { - var appName = app.name; + it("Callback#contains applications", function (done) { + var apps = this.service.apps(); apps.fetch(function (err, apps) { - var entity = apps.item(appName); - assert.ok(entity); - app.remove(function () { - done(); + var app = apps.item("search"); + assert.ok(app); + done(); + }); + }); + + it("Callback#create + contains app", function (done) { + var name = "jssdk_testapp_" + getNextId(); + var apps = this.service.apps(); + + apps.create({ name: name }, function (err, app) { + var appName = app.name; + apps.fetch(function (err, apps) { + var entity = apps.item(appName); + assert.ok(entity); + app.remove(function () { + done(); + }); }); }); }); - }, - "Callback#create + modify app": function (done) { - var DESCRIPTION = "TEST DESCRIPTION"; - var VERSION = "1.1.0"; + it("Callback#create + modify app", function (done) { + var DESCRIPTION = "TEST DESCRIPTION"; + var VERSION = "1.1.0"; - var name = "jssdk_testapp_" + getNextId(); - var apps = this.service.apps(); + var name = "jssdk_testapp_" + getNextId(); + var apps = this.service.apps(); - Async.chain([ - function (callback) { - apps.create({ name: name }, callback); - }, - function (app, callback) { - assert.ok(app); - assert.strictEqual(app.name, name); - var versionMatches = app.properties().version === "1.0" || - app.properties().version === "1.0.0"; - assert.ok(versionMatches); - - app.update({ - description: DESCRIPTION, - version: VERSION - }, callback); - }, - function (app, callback) { - assert.ok(app); - var properties = app.properties(); + Async.chain([ + function (callback) { + apps.create({ name: name }, callback); + }, + function (app, callback) { + assert.ok(app); + assert.strictEqual(app.name, name); + var versionMatches = app.properties().version === "1.0" || + app.properties().version === "1.0.0"; + assert.ok(versionMatches); + + app.update({ + description: DESCRIPTION, + version: VERSION + }, callback); + }, + function (app, callback) { + assert.ok(app); + var properties = app.properties(); - assert.strictEqual(properties.description, DESCRIPTION); - assert.strictEqual(properties.version, VERSION); + assert.strictEqual(properties.description, DESCRIPTION); + assert.strictEqual(properties.version, VERSION); - app.remove(callback); - } - ], function (err) { - assert.ok(!err); - done(); + app.remove(callback); + } + ], function (err) { + assert.ok(!err); + done(); + }); }); - }, - "Callback#delete test applications": function (done) { + it("Callback#delete test applications", function (done) { - var apps = this.service.apps(); - apps.fetch(function (err, apps) { + var apps = this.service.apps(); + apps.fetch(function (err, apps) { - var appList = apps.list(); + var appList = apps.list(); - Async.parallelEach(appList, + Async.parallelEach(appList, - function (app, idx, callback) { - if (utils.startsWith(app.name, "jssdk_")) { - app.remove(callback); - } - else { - callback(); + function (app, idx, callback) { + if (utils.startsWith(app.name, "jssdk_")) { + app.remove(callback); + } + else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); } - }, function (err) { - assert.ok(!err); - done(); - } - ); + ); + }); }); - }, - - "list applications with cookies as authentication": function (done) { - this.service.serverInfo(function (err, info) { - // Cookie authentication was added in splunk 6.2 - var majorVersion = parseInt(info.properties().version.split(".")[0], 10); - var minorVersion = parseInt(info.properties().version.split(".")[1], 10); - // Skip cookie test if Splunk older than 6.2 - if (majorVersion < 6 || (majorVersion === 6 && minorVersion < 2)) { - splunkjs.Logger.log("Skipping cookie test..."); - done(); - return; - } - - var service = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - username: svc.username, - password: svc.password, - version: svc.version - }); - var service2 = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - version: svc.version - }); - - Async.chain([ - function (done) { - service.login(done); - }, - function (job, done) { - // Save the cookie store - var cookieStore = service.http._cookieStore; - // Test that there are cookies - assert.ok(!utils.isEmpty(cookieStore)); - - // Add the cookies to a service with no other authenitcation information - service2.http._cookieStore = cookieStore; - - var apps = service2.apps(); - apps.fetch(done); - }, - function (apps, done) { - var appList = apps.list(); - assert.ok(appList.length > 0); - assert.ok(!utils.isEmpty(service2.http._cookieStore)); + it("list applications with cookies as authentication", function (done) { + this.service.serverInfo(function (err, info) { + // Cookie authentication was added in splunk 6.2 + var majorVersion = parseInt(info.properties().version.split(".")[0], 10); + var minorVersion = parseInt(info.properties().version.split(".")[1], 10); + // Skip cookie test if Splunk older than 6.2 + if (majorVersion < 6 || (majorVersion === 6 && minorVersion < 2)) { + splunkjs.Logger.log("Skipping cookie test..."); done(); + return; } - ], - function (err) { - // Test that no errors were returned - assert.ok(!err); - done(); - }); - }); - } - }; + + var service = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + username: svc.username, + password: svc.password, + version: svc.version + }); + + var service2 = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + version: svc.version + }); + + Async.chain([ + function (done) { + service.login(done); + }, + function (job, done) { + // Save the cookie store + var cookieStore = service.http._cookieStore; + // Test that there are cookies + assert.ok(!utils.isEmpty(cookieStore)); + + // Add the cookies to a service with no other authenitcation information + service2.http._cookieStore = cookieStore; + + var apps = service2.apps(); + apps.fetch(done); + }, + function (apps, done) { + var appList = apps.list(); + assert.ok(appList.length > 0); + assert.ok(!utils.isEmpty(service2.http._cookieStore)); + done(); + } + ], + function (err) { + // Test that no errors were returned + assert.ok(!err); + done(); + }); + }) + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/collection.js b/tests_spike/service_tests/collection.js index ddf8f6b9a..0c5770e28 100644 --- a/tests_spike/service_tests/collection.js +++ b/tests_spike/service_tests/collection.js @@ -4,59 +4,61 @@ var splunkjs = require('../../index'); exports.setup = function (svc, loggedOutSvc) { - return { - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }, + return ( + describe("Collection tests", function (done) { + beforeEach(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + done(); + }); - "Methods to be overridden throw": function (done) { - var coll = new splunkjs.Service.Collection( - this.service, - "/data/indexes", - { - owner: "admin", - app: "search", - sharing: "app" - } - ); - assert.throws(function () { - coll.instantiateEntity({}); + it("Methods to be overridden throw", function (done) { + var coll = new splunkjs.Service.Collection( + this.service, + "/data/indexes", + { + owner: "admin", + app: "search", + sharing: "app" + } + ); + assert.throws(function () { + coll.instantiateEntity({}); + }); + done(); }); - done(); - }, - "Accessors work": function (done) { - var coll = new splunkjs.Service.Collection( - this.service, - "/data/indexes", - { - owner: "admin", - app: "search", - sharing: "app" - } - ); - coll._load({ links: "Hilda", updated: true }); - assert.strictEqual(coll.links(), "Hilda"); - assert.ok(coll.updated()); - done(); - }, + it("Accessors work", function (done) { + var coll = new splunkjs.Service.Collection( + this.service, + "/data/indexes", + { + owner: "admin", + app: "search", + sharing: "app" + } + ); + coll._load({ links: "Hilda", updated: true }); + assert.strictEqual(coll.links(), "Hilda"); + assert.ok(coll.updated()); + done(); + }); - "Contains throws without a good id": function (done) { - var coll = new splunkjs.Service.Collection( - this.service, - "/data/indexes", - { - owner: "admin", - app: "search", - sharing: "app" - } - ); - assert.throws(function () { coll.item(null); }); - done(); - } - }; + it("Contains throws without a good id", function (done) { + var coll = new splunkjs.Service.Collection( + this.service, + "/data/indexes", + { + owner: "admin", + app: "search", + sharing: "app" + } + ); + assert.throws(function () { coll.item(null); }); + done(); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/configuration.js b/tests_spike/service_tests/configuration.js index 026783340..d0e6f125a 100644 --- a/tests_spike/service_tests/configuration.js +++ b/tests_spike/service_tests/configuration.js @@ -10,205 +10,207 @@ var getNextId = function () { exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Callback#list": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var files = props.list(); - assert.ok(files.length > 0); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#contains": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("web"); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(file.name, "web"); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#contains stanza": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("web"); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(file.name, "web"); - - var stanza = file.item("settings"); - assert.ok(stanza); - stanza.fetch(done); - }, - function (stanza, done) { - assert.ok(stanza.properties().hasOwnProperty("httpport")); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#configurations init": function (done) { - assert.throws(function () { - var confs = new splunkjs.Service.Configurations( - this.service, - { owner: "-", app: "-", sharing: "system" } - ); + return ( + describe("Configuration tests", function (done) { + beforeEach(function (done) { + this.service = svc; + done(); }); - done(); - }, - - "Callback#create file + create stanza + update stanza": function (done) { - var that = this; - var namespace = { owner: "nobody", app: "system" }; - var fileName = "jssdk_file_" + getNextId(); - var value = "barfoo_" + getNextId(); - - Async.chain([ - function (done) { - var configs = svc.configurations(namespace); - configs.fetch(done); - }, - function (configs, done) { - configs.create({ __conf: fileName }, done); - }, - function (file, done) { - if (file.item("stanza")) { - file.item("stanza").remove(); + + it("Callback#list", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var files = props.list(); + assert.ok(files.length > 0); + done(); } - file.create("stanza", done); - }, - function (stanza, done) { - stanza.update({ "jssdk_foobar": value }, done); - }, - function (stanza, done) { - assert.strictEqual(stanza.properties()["jssdk_foobar"], value); - done(); - }, - function (done) { - var file = new splunkjs.Service.ConfigurationFile(svc, fileName); - file.fetch(done); - }, - function (file, done) { - var stanza = file.item("stanza"); - assert.ok(stanza); - stanza.remove(done); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#can get default stanza": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("savedsearches"); - assert.strictEqual(namespace, file.namespace); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(namespace, file.namespace); - file.getDefaultStanza().fetch(done); - }, - function (stanza, done) { - assert.strictEqual(stanza.name, "default"); - assert.strictEqual(namespace, stanza.namespace); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#updating default stanza is noop": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - var backup = null; - var invalid = "this won't work"; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("savedsearches"); - assert.strictEqual(namespace, file.namespace); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(namespace, file.namespace); - file.getDefaultStanza().fetch(done); - }, - function (stanza, done) { - assert.ok(stanza._properties.hasOwnProperty("max_concurrent")); - assert.strictEqual(namespace, stanza.namespace); - backup = stanza._properties.max_concurrent; - stanza.update({ "max_concurrent": invalid }, done); - }, - function (stanza, done) { - assert.ok(stanza.properties().hasOwnProperty("max_concurrent")); - assert.strictEqual(stanza.properties()["max_concurrent"], backup); - assert.notStrictEqual(stanza.properties()["max_concurrent"], invalid); - stanza.fetch(done); - }, - function (stanza, done) { - assert.ok(stanza.properties().hasOwnProperty("max_concurrent")); - assert.strictEqual(stanza.properties()["max_concurrent"], backup); - assert.notStrictEqual(stanza.properties()["max_concurrent"], invalid); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); + ], + function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Callback#contains", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("web"); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(file.name, "web"); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Callback#contains stanza", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("web"); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(file.name, "web"); + + var stanza = file.item("settings"); + assert.ok(stanza); + stanza.fetch(done); + }, + function (stanza, done) { + assert.ok(stanza.properties().hasOwnProperty("httpport")); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Callback#configurations init", function (done) { + assert.throws(function () { + var confs = new splunkjs.Service.Configurations( + this.service, + { owner: "-", app: "-", sharing: "system" } + ); }); - } - }; + done(); + }); + + it("Callback#create file + create stanza + update stanza", function (done) { + var that = this; + var namespace = { owner: "nobody", app: "system" }; + var fileName = "jssdk_file_" + getNextId(); + var value = "barfoo_" + getNextId(); + + Async.chain([ + function (done) { + var configs = svc.configurations(namespace); + configs.fetch(done); + }, + function (configs, done) { + configs.create({ __conf: fileName }, done); + }, + function (file, done) { + if (file.item("stanza")) { + file.item("stanza").remove(); + } + file.create("stanza", done); + }, + function (stanza, done) { + stanza.update({ "jssdk_foobar": value }, done); + }, + function (stanza, done) { + assert.strictEqual(stanza.properties()["jssdk_foobar"], value); + done(); + }, + function (done) { + var file = new splunkjs.Service.ConfigurationFile(svc, fileName); + file.fetch(done); + }, + function (file, done) { + var stanza = file.item("stanza"); + assert.ok(stanza); + stanza.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Callback#can get default stanza", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("savedsearches"); + assert.strictEqual(namespace, file.namespace); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(namespace, file.namespace); + file.getDefaultStanza().fetch(done); + }, + function (stanza, done) { + assert.strictEqual(stanza.name, "default"); + assert.strictEqual(namespace, stanza.namespace); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Callback#updating default stanza is noop", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + var backup = null; + var invalid = "this won't work"; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("savedsearches"); + assert.strictEqual(namespace, file.namespace); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(namespace, file.namespace); + file.getDefaultStanza().fetch(done); + }, + function (stanza, done) { + assert.ok(stanza._properties.hasOwnProperty("max_concurrent")); + assert.strictEqual(namespace, stanza.namespace); + backup = stanza._properties.max_concurrent; + stanza.update({ "max_concurrent": invalid }, done); + }, + function (stanza, done) { + assert.ok(stanza.properties().hasOwnProperty("max_concurrent")); + assert.strictEqual(stanza.properties()["max_concurrent"], backup); + assert.notStrictEqual(stanza.properties()["max_concurrent"], invalid); + stanza.fetch(done); + }, + function (stanza, done) { + assert.ok(stanza.properties().hasOwnProperty("max_concurrent")); + assert.strictEqual(stanza.properties()["max_concurrent"], backup); + assert.notStrictEqual(stanza.properties()["max_concurrent"], invalid); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/datamodels.js b/tests_spike/service_tests/datamodels.js index c4b8ffd73..56a3c2a16 100644 --- a/tests_spike/service_tests/datamodels.js +++ b/tests_spike/service_tests/datamodels.js @@ -12,1067 +12,1069 @@ var getNextId = function () { }; exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - this.dataModels = svc.dataModels(); - this.skip = false; - var that = this; - this.service.serverInfo(function (err, info) { - if (parseInt(info.properties().version.split(".")[0], 10) < 6) { - that.skip = true; - splunkjs.Logger.log("Skipping data model tests..."); - } - done(err); + return ( + describe("Datamodels test", function (done) { + beforeEach(function (done) { + this.service = svc; + this.dataModels = svc.dataModels(); + this.skip = false; + var that = this; + this.service.serverInfo(function (err, info) { + if (parseInt(info.properties().version.split(".")[0], 10) < 6) { + that.skip = true; + splunkjs.Logger.log("Skipping data model tests..."); + } + done(err); + }); }); - }, - "Callback#DataModels - fetch a built-in data model": function (done) { - if (this.skip) { - done(); - return; - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - var dm = dataModels.item("internal_audit_logs"); - // Check for the 3 objects we expect - assert.ok(dm.objectByName("Audit")); - assert.ok(dm.objectByName("searches")); - assert.ok(dm.objectByName("modify")); - - // Check for an object that shouldn't exist - assert.strictEqual(null, dm.objectByName(getNextId())); - done(); - } - ], - function (err) { - assert.ok(!err); + it("Callback#DataModels - fetch a built-in data model", function (done) { + if (this.skip) { done(); + return; } - ); - }, + var that = this; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + var dm = dataModels.item("internal_audit_logs"); + // Check for the 3 objects we expect + assert.ok(dm.objectByName("Audit")); + assert.ok(dm.objectByName("searches")); + assert.ok(dm.objectByName("modify")); + + // Check for an object that shouldn't exist + assert.strictEqual(null, dm.objectByName(getNextId())); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - create & delete an empty data model": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var initialSize; - var that = this; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - initialSize = dataModels.list().length; - dataModels.create(name, args, done); - }, - function (dataModel, done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Make sure we have 1 more data model than we started with - assert.strictEqual(initialSize + 1, dataModels.list().length); - // Delete the data model we just created, by name. - dataModels.item(name).remove(done); - }, - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Make sure we have as many data models as we started with - assert.strictEqual(initialSize, dataModels.list().length); + it("Callback#DataModels - create & delete an empty data model", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var name = "delete-me-" + getNextId(); + + var initialSize; + var that = this; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + initialSize = dataModels.list().length; + dataModels.create(name, args, done); + }, + function (dataModel, done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Make sure we have 1 more data model than we started with + assert.strictEqual(initialSize + 1, dataModels.list().length); + // Delete the data model we just created, by name. + dataModels.item(name).remove(done); + }, + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Make sure we have as many data models as we started with + assert.strictEqual(initialSize, dataModels.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - create a data model with spaces in the name, which are swapped for -'s": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me- " + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.strictEqual(name.replace(" ", "_"), dataModel.name); + it("Callback#DataModels - create a data model with spaces in the name, which are swapped for -'s", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var name = "delete-me- " + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.strictEqual(name.replace(" ", "_"), dataModel.name); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - create a data model with 0 objects": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - // Check for 0 objects before fetch - assert.strictEqual(0, dataModel.objects.length); - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Check for 0 objects after fetch - assert.strictEqual(0, dataModels.item(name).objects.length); + it("Callback#DataModels - create a data model with 0 objects", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + // Check for 0 objects before fetch + assert.strictEqual(0, dataModel.objects.length); + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Check for 0 objects after fetch + assert.strictEqual(0, dataModels.item(name).objects.length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - create a data model with 1 search object": function (done) { - if (this.skip) { - done(); - return; - } - var dataModels = this.service.dataModels(); + it("Callback#DataModels - create a data model with 1 search object", function (done) { + if (this.skip) { + done(); + return; + } + var dataModels = this.service.dataModels(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/object_with_one_search.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - // Check for 1 object before fetch - assert.strictEqual(1, dataModel.objects.length); - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Check for 1 object after fetch - assert.strictEqual(1, dataModels.item(name).objects.length); - done(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/object_with_one_search.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + // Check for 1 object before fetch + assert.strictEqual(1, dataModel.objects.length); + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Check for 1 object after fetch + assert.strictEqual(1, dataModels.item(name).objects.length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - create a data model with 2 search objects": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/object_with_two_searches.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - // Check for 2 objects before fetch - assert.strictEqual(2, dataModel.objects.length); - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Check for 2 objects after fetch - assert.strictEqual(2, dataModels.item(name).objects.length); + it("Callback#DataModels - create a data model with 2 search objects", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/object_with_two_searches.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - data model objects are created correctly": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/object_with_two_searches.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.ok(dataModel.hasObject("search1")); - assert.ok(dataModel.hasObject("search2")); - - var search1 = dataModel.objectByName("search1"); - assert.ok(search1); - assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ - search 1", search1.displayName); - - var search2 = dataModel.objectByName("search2"); - assert.ok(search2); - assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ - search 2", search2.displayName); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + // Check for 2 objects before fetch + assert.strictEqual(2, dataModel.objects.length); + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Check for 2 objects after fetch + assert.strictEqual(2, dataModels.item(name).objects.length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - data model objects are created correctly", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/object_with_two_searches.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - data model handles unicode characters": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/model_with_unicode_headers.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.strictEqual(name, dataModel.name); - assert.strictEqual("·Ä©·öô‡Øµ", dataModel.displayName); - assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ", dataModel.description); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.ok(dataModel.hasObject("search1")); + assert.ok(dataModel.hasObject("search2")); + + var search1 = dataModel.objectByName("search1"); + assert.ok(search1); + assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ - search 1", search1.displayName); + + var search2 = dataModel.objectByName("search2"); + assert.ok(search2); + assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ - search 2", search2.displayName); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - data model handles unicode characters", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/model_with_unicode_headers.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - create data model with empty headers": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/model_with_empty_headers.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.strictEqual(name, dataModel.name); - assert.strictEqual("", dataModel.displayName); - assert.strictEqual("", dataModel.description); - - // Make sure we're not getting a summary of the data model - assert.strictEqual("0", dataModel.concise); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.strictEqual(name, dataModel.name); + assert.strictEqual("·Ä©·öô‡Øµ", dataModel.displayName); + assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ", dataModel.description); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - create data model with empty headers", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/model_with_empty_headers.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test acceleration settings": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - dataModel.acceleration.enabled = true; - dataModel.acceleration.earliestTime = "-2mon"; - dataModel.acceleration.cronSchedule = "5/* * * * *"; - - assert.strictEqual(true, dataModel.isAccelerated()); - assert.strictEqual(true, dataModel.acceleration.enabled); - assert.strictEqual("-2mon", dataModel.acceleration.earliestTime); - assert.strictEqual("5/* * * * *", dataModel.acceleration.cronSchedule); - - dataModel.acceleration.enabled = false; - dataModel.acceleration.earliestTime = "-1mon"; - dataModel.acceleration.cronSchedule = "* * * * *"; - - assert.strictEqual(false, dataModel.isAccelerated()); - assert.strictEqual(false, dataModel.acceleration.enabled); - assert.strictEqual("-1mon", dataModel.acceleration.earliestTime); - assert.strictEqual("* * * * *", dataModel.acceleration.cronSchedule); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.strictEqual(name, dataModel.name); + assert.strictEqual("", dataModel.displayName); + assert.strictEqual("", dataModel.description); + + // Make sure we're not getting a summary of the data model + assert.strictEqual("0", dataModel.concise); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test acceleration settings", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model object metadata": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("event1"); - assert.ok(obj); - - assert.strictEqual("event1 ·Ä©·öô", obj.displayName); - assert.strictEqual("event1", obj.name); - assert.deepEqual(dataModel, obj.dataModel); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + dataModel.acceleration.enabled = true; + dataModel.acceleration.earliestTime = "-2mon"; + dataModel.acceleration.cronSchedule = "5/* * * * *"; + + assert.strictEqual(true, dataModel.isAccelerated()); + assert.strictEqual(true, dataModel.acceleration.enabled); + assert.strictEqual("-2mon", dataModel.acceleration.earliestTime); + assert.strictEqual("5/* * * * *", dataModel.acceleration.cronSchedule); + + dataModel.acceleration.enabled = false; + dataModel.acceleration.earliestTime = "-1mon"; + dataModel.acceleration.cronSchedule = "* * * * *"; + + assert.strictEqual(false, dataModel.isAccelerated()); + assert.strictEqual(false, dataModel.acceleration.enabled); + assert.strictEqual("-1mon", dataModel.acceleration.earliestTime); + assert.strictEqual("* * * * *", dataModel.acceleration.cronSchedule); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model object metadata", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model object parent": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("event1"); - assert.ok(obj); - assert.ok(!obj.parent()); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("event1"); + assert.ok(obj); + + assert.strictEqual("event1 ·Ä©·öô", obj.displayName); + assert.strictEqual("event1", obj.name); + assert.deepEqual(dataModel, obj.dataModel); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model object parent", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model object lineage": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("level_0"); - assert.ok(obj); - assert.strictEqual(1, obj.lineage.length); - assert.strictEqual("level_0", obj.lineage[0]); - assert.strictEqual("BaseEvent", obj.parentName); - - obj = dataModel.objectByName("level_1"); - assert.ok(obj); - assert.strictEqual(2, obj.lineage.length); - assert.deepEqual(["level_0", "level_1"], obj.lineage); - assert.strictEqual("level_0", obj.parentName); - - obj = dataModel.objectByName("level_2"); - assert.ok(obj); - assert.strictEqual(3, obj.lineage.length); - assert.deepEqual(["level_0", "level_1", "level_2"], obj.lineage); - assert.strictEqual("level_1", obj.parentName); - - // Make sure there's no extra children - assert.ok(!dataModel.objectByName("level_3")); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("event1"); + assert.ok(obj); + assert.ok(!obj.parent()); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model object lineage", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model object fields": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("level_2"); - assert.ok(obj); - - var timeField = obj.fieldByName("_time"); - assert.ok(timeField); - assert.strictEqual("timestamp", timeField.type); - assert.ok(timeField.isTimestamp()); - assert.ok(!timeField.isNumber()); - assert.ok(!timeField.isString()); - assert.ok(!timeField.isObjectcount()); - assert.ok(!timeField.isChildcount()); - assert.ok(!timeField.isIPv4()); - assert.deepEqual(["BaseEvent"], timeField.lineage); - assert.strictEqual("_time", timeField.name); - assert.strictEqual(false, timeField.required); - assert.strictEqual(false, timeField.multivalued); - assert.strictEqual(false, timeField.hidden); - assert.strictEqual(false, timeField.editable); - assert.strictEqual(null, timeField.comment); - - var lvl2 = obj.fieldByName("level_2"); - assert.strictEqual("level_2", lvl2.owner); - assert.deepEqual(["level_0", "level_1", "level_2"], lvl2.lineage); - assert.strictEqual("objectCount", lvl2.type); - assert.ok(!lvl2.isTimestamp()); - assert.ok(!lvl2.isNumber()); - assert.ok(!lvl2.isString()); - assert.ok(lvl2.isObjectcount()); - assert.ok(!lvl2.isChildcount()); - assert.ok(!lvl2.isIPv4()); - assert.strictEqual("level_2", lvl2.name); - assert.strictEqual("level 2", lvl2.displayName); - assert.strictEqual(false, lvl2.required); - assert.strictEqual(false, lvl2.multivalued); - assert.strictEqual(false, lvl2.hidden); - assert.strictEqual(false, lvl2.editable); - assert.strictEqual(null, lvl2.comment); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("level_0"); + assert.ok(obj); + assert.strictEqual(1, obj.lineage.length); + assert.strictEqual("level_0", obj.lineage[0]); + assert.strictEqual("BaseEvent", obj.parentName); + + obj = dataModel.objectByName("level_1"); + assert.ok(obj); + assert.strictEqual(2, obj.lineage.length); + assert.deepEqual(["level_0", "level_1"], obj.lineage); + assert.strictEqual("level_0", obj.parentName); + + obj = dataModel.objectByName("level_2"); + assert.ok(obj); + assert.strictEqual(3, obj.lineage.length); + assert.deepEqual(["level_0", "level_1", "level_2"], obj.lineage); + assert.strictEqual("level_1", obj.parentName); + + // Make sure there's no extra children + assert.ok(!dataModel.objectByName("level_3")); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model object fields", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model object properties": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - assert.strictEqual(5, obj.fieldNames().length); - assert.strictEqual(10, obj.allFieldNames().length); - assert.ok(obj.fieldByName("has_boris")); - assert.ok(obj.hasField("has_boris")); - assert.ok(obj.fieldByName("_time")); - assert.ok(obj.hasField("_time")); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("level_2"); + assert.ok(obj); + + var timeField = obj.fieldByName("_time"); + assert.ok(timeField); + assert.strictEqual("timestamp", timeField.type); + assert.ok(timeField.isTimestamp()); + assert.ok(!timeField.isNumber()); + assert.ok(!timeField.isString()); + assert.ok(!timeField.isObjectcount()); + assert.ok(!timeField.isChildcount()); + assert.ok(!timeField.isIPv4()); + assert.deepEqual(["BaseEvent"], timeField.lineage); + assert.strictEqual("_time", timeField.name); + assert.strictEqual(false, timeField.required); + assert.strictEqual(false, timeField.multivalued); + assert.strictEqual(false, timeField.hidden); + assert.strictEqual(false, timeField.editable); + assert.strictEqual(null, timeField.comment); + + var lvl2 = obj.fieldByName("level_2"); + assert.strictEqual("level_2", lvl2.owner); + assert.deepEqual(["level_0", "level_1", "level_2"], lvl2.lineage); + assert.strictEqual("objectCount", lvl2.type); + assert.ok(!lvl2.isTimestamp()); + assert.ok(!lvl2.isNumber()); + assert.ok(!lvl2.isString()); + assert.ok(lvl2.isObjectcount()); + assert.ok(!lvl2.isChildcount()); + assert.ok(!lvl2.isIPv4()); + assert.strictEqual("level_2", lvl2.name); + assert.strictEqual("level 2", lvl2.displayName); + assert.strictEqual(false, lvl2.required); + assert.strictEqual(false, lvl2.multivalued); + assert.strictEqual(false, lvl2.hidden); + assert.strictEqual(false, lvl2.editable); + assert.strictEqual(null, lvl2.comment); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model object properties", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + assert.strictEqual(5, obj.fieldNames().length); + assert.strictEqual(10, obj.allFieldNames().length); + assert.ok(obj.fieldByName("has_boris")); + assert.ok(obj.hasField("has_boris")); + assert.ok(obj.fieldByName("_time")); + assert.ok(obj.hasField("_time")); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - create local acceleration job": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("level_2"); - assert.ok(obj); - - obj.createLocalAccelerationJob(null, done); - }, - function (job, done) { - assert.ok(job); - - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - assert.strictEqual("| datamodel \"" + name + "\" level_2 search | tscollect", job.properties().request.search); - job.cancel(done); + it("Callback#DataModels - create local acceleration job", function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - create local acceleration job with earliest time": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var oldNow = Date.now(); - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("level_2"); - assert.ok(obj); - obj.createLocalAccelerationJob("-1d", done); - }, - function (job, done) { - assert.ok(job); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - assert.strictEqual("| datamodel \"" + name + "\" level_2 search | tscollect", job.properties().request.search); - - // Make sure the earliest time is 1 day behind - var yesterday = new Date(Date.now() - (1000 * 60 * 60 * 24)); - var month = (yesterday.getMonth() + 1); - if (month <= 9) { - month = "0" + month; + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("level_2"); + assert.ok(obj); + + obj.createLocalAccelerationJob(null, done); + }, + function (job, done) { + assert.ok(job); + + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + assert.strictEqual("| datamodel \"" + name + "\" level_2 search | tscollect", job.properties().request.search); + job.cancel(done); } - var date = yesterday.getDate(); - if (date <= 9) { - date = "0" + date; + ], + function (err) { + assert.ok(!err); + done(); } - var expectedDate = yesterday.getFullYear() + "-" + month + "-" + date; - assert.ok(utils.startsWith(job._state.content.earliestTime, expectedDate)); + ); + }); - job.cancel(done); + it("Callback#DataModels - create local acceleration job with earliest time", function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model constraints": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("event1"); - assert.ok(obj); - var constraints = obj.constraints; - assert.ok(constraints); - var onlyOne = true; - - for (var i = 0; i < constraints.length; i++) { - var constraint = constraints[i]; - assert.ok(!!onlyOne); - - assert.strictEqual("event1", constraint.owner); - assert.strictEqual("uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")", constraint.query); + var name = "delete-me-" + getNextId(); + + var obj; + var oldNow = Date.now(); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("level_2"); + assert.ok(obj); + obj.createLocalAccelerationJob("-1d", done); + }, + function (job, done) { + assert.ok(job); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + assert.strictEqual("| datamodel \"" + name + "\" level_2 search | tscollect", job.properties().request.search); + + // Make sure the earliest time is 1 day behind + var yesterday = new Date(Date.now() - (1000 * 60 * 60 * 24)); + var month = (yesterday.getMonth() + 1); + if (month <= 9) { + month = "0" + month; + } + var date = yesterday.getDate(); + if (date <= 9) { + date = "0" + date; + } + var expectedDate = yesterday.getFullYear() + "-" + month + "-" + date; + assert.ok(utils.startsWith(job._state.content.earliestTime, expectedDate)); + + job.cancel(done); } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model constraints", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model calculations, and the different types": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("event1"); - assert.ok(obj); - - var calculations = obj.calculations; - assert.strictEqual(4, Object.keys(calculations).length); - assert.strictEqual(4, obj.calculationIDs().length); - - var evalCalculation = calculations["93fzsv03wa7"]; - assert.ok(evalCalculation); - assert.strictEqual("event1", evalCalculation.owner); - assert.deepEqual(["event1"], evalCalculation.lineage); - assert.strictEqual("Eval", evalCalculation.type); - assert.ok(evalCalculation.isEval()); - assert.ok(!evalCalculation.isLookup()); - assert.ok(!evalCalculation.isGeoIP()); - assert.ok(!evalCalculation.isRex()); - assert.strictEqual(null, evalCalculation.comment); - assert.strictEqual(true, evalCalculation.isEditable()); - assert.strictEqual("if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\")", evalCalculation.expression); - - assert.strictEqual(1, Object.keys(evalCalculation.outputFields).length); - assert.strictEqual(1, evalCalculation.outputFieldNames().length); - - var field = evalCalculation.outputFields["new_field"]; - assert.ok(field); - assert.strictEqual("My New Field", field.displayName); - - var lookupCalculation = calculations["sr3mc8o3mjr"]; - assert.ok(lookupCalculation); - assert.strictEqual("event1", lookupCalculation.owner); - assert.deepEqual(["event1"], lookupCalculation.lineage); - assert.strictEqual("Lookup", lookupCalculation.type); - assert.ok(lookupCalculation.isLookup()); - assert.ok(!lookupCalculation.isEval()); - assert.ok(!lookupCalculation.isGeoIP()); - assert.ok(!lookupCalculation.isRex()); - assert.strictEqual(null, lookupCalculation.comment); - assert.strictEqual(true, lookupCalculation.isEditable()); - assert.deepEqual({ lookupField: "a_lookup_field", inputField: "host" }, lookupCalculation.inputFieldMappings); - assert.strictEqual(2, Object.keys(lookupCalculation.inputFieldMappings).length); - assert.strictEqual("a_lookup_field", lookupCalculation.inputFieldMappings.lookupField); - assert.strictEqual("host", lookupCalculation.inputFieldMappings.inputField); - assert.strictEqual("dnslookup", lookupCalculation.lookupName); - - var regexpCalculation = calculations["a5v1k82ymic"]; - assert.ok(regexpCalculation); - assert.strictEqual("event1", regexpCalculation.owner); - assert.deepEqual(["event1"], regexpCalculation.lineage); - assert.strictEqual("Rex", regexpCalculation.type); - assert.ok(regexpCalculation.isRex()); - assert.ok(!regexpCalculation.isLookup()); - assert.ok(!regexpCalculation.isEval()); - assert.ok(!regexpCalculation.isGeoIP()); - assert.strictEqual(2, regexpCalculation.outputFieldNames().length); - assert.strictEqual("_raw", regexpCalculation.inputField); - assert.strictEqual(" From: (?.*) To: (?.*) ", regexpCalculation.expression); - - var geoIPCalculation = calculations["pbe9bd0rp4"]; - assert.ok(geoIPCalculation); - assert.strictEqual("event1", geoIPCalculation.owner); - assert.deepEqual(["event1"], geoIPCalculation.lineage); - assert.strictEqual("GeoIP", geoIPCalculation.type); - assert.ok(geoIPCalculation.isGeoIP()); - assert.ok(!geoIPCalculation.isLookup()); - assert.ok(!geoIPCalculation.isEval()); - assert.ok(!geoIPCalculation.isRex()); - assert.strictEqual("·Ä©·öô‡Øµ comment of pbe9bd0rp4", geoIPCalculation.comment); - assert.strictEqual(5, geoIPCalculation.outputFieldNames().length); - assert.strictEqual("output_from_reverse_hostname", geoIPCalculation.inputField); + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("event1"); + assert.ok(obj); + var constraints = obj.constraints; + assert.ok(constraints); + var onlyOne = true; + + for (var i = 0; i < constraints.length; i++) { + var constraint = constraints[i]; + assert.ok(!!onlyOne); + + assert.strictEqual("event1", constraint.owner); + assert.strictEqual("uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")", constraint.query); + } + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model calculations, and the different types", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("event1"); + assert.ok(obj); + + var calculations = obj.calculations; + assert.strictEqual(4, Object.keys(calculations).length); + assert.strictEqual(4, obj.calculationIDs().length); + + var evalCalculation = calculations["93fzsv03wa7"]; + assert.ok(evalCalculation); + assert.strictEqual("event1", evalCalculation.owner); + assert.deepEqual(["event1"], evalCalculation.lineage); + assert.strictEqual("Eval", evalCalculation.type); + assert.ok(evalCalculation.isEval()); + assert.ok(!evalCalculation.isLookup()); + assert.ok(!evalCalculation.isGeoIP()); + assert.ok(!evalCalculation.isRex()); + assert.strictEqual(null, evalCalculation.comment); + assert.strictEqual(true, evalCalculation.isEditable()); + assert.strictEqual("if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\")", evalCalculation.expression); + + assert.strictEqual(1, Object.keys(evalCalculation.outputFields).length); + assert.strictEqual(1, evalCalculation.outputFieldNames().length); + + var field = evalCalculation.outputFields["new_field"]; + assert.ok(field); + assert.strictEqual("My New Field", field.displayName); + + var lookupCalculation = calculations["sr3mc8o3mjr"]; + assert.ok(lookupCalculation); + assert.strictEqual("event1", lookupCalculation.owner); + assert.deepEqual(["event1"], lookupCalculation.lineage); + assert.strictEqual("Lookup", lookupCalculation.type); + assert.ok(lookupCalculation.isLookup()); + assert.ok(!lookupCalculation.isEval()); + assert.ok(!lookupCalculation.isGeoIP()); + assert.ok(!lookupCalculation.isRex()); + assert.strictEqual(null, lookupCalculation.comment); + assert.strictEqual(true, lookupCalculation.isEditable()); + assert.deepEqual({ lookupField: "a_lookup_field", inputField: "host" }, lookupCalculation.inputFieldMappings); + assert.strictEqual(2, Object.keys(lookupCalculation.inputFieldMappings).length); + assert.strictEqual("a_lookup_field", lookupCalculation.inputFieldMappings.lookupField); + assert.strictEqual("host", lookupCalculation.inputFieldMappings.inputField); + assert.strictEqual("dnslookup", lookupCalculation.lookupName); + + var regexpCalculation = calculations["a5v1k82ymic"]; + assert.ok(regexpCalculation); + assert.strictEqual("event1", regexpCalculation.owner); + assert.deepEqual(["event1"], regexpCalculation.lineage); + assert.strictEqual("Rex", regexpCalculation.type); + assert.ok(regexpCalculation.isRex()); + assert.ok(!regexpCalculation.isLookup()); + assert.ok(!regexpCalculation.isEval()); + assert.ok(!regexpCalculation.isGeoIP()); + assert.strictEqual(2, regexpCalculation.outputFieldNames().length); + assert.strictEqual("_raw", regexpCalculation.inputField); + assert.strictEqual(" From: (?.*) To: (?.*) ", regexpCalculation.expression); + + var geoIPCalculation = calculations["pbe9bd0rp4"]; + assert.ok(geoIPCalculation); + assert.strictEqual("event1", geoIPCalculation.owner); + assert.deepEqual(["event1"], geoIPCalculation.lineage); + assert.strictEqual("GeoIP", geoIPCalculation.type); + assert.ok(geoIPCalculation.isGeoIP()); + assert.ok(!geoIPCalculation.isLookup()); + assert.ok(!geoIPCalculation.isEval()); + assert.ok(!geoIPCalculation.isRex()); + assert.strictEqual("·Ä©·öô‡Øµ comment of pbe9bd0rp4", geoIPCalculation.comment); + assert.strictEqual(5, geoIPCalculation.outputFieldNames().length); + assert.strictEqual("output_from_reverse_hostname", geoIPCalculation.inputField); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - run queries": function (done) { - if (this.skip) { - done(); - return; - } - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - var dm = dataModels.item("internal_audit_logs"); - obj = dm.objectByName("searches"); - obj.startSearch({}, "", done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - assert.strictEqual("| datamodel internal_audit_logs searches search", job.properties().request.search); - job.cancel(done); - }, - function (response, done) { - obj.startSearch({ status_buckets: 5, enable_lookups: false }, "| head 3", done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - assert.strictEqual("| datamodel internal_audit_logs searches search | head 3", job.properties().request.search); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); + it("Callback#DataModels - run queries", function (done) { + if (this.skip) { done(); + return; } - ); - }, + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + var dm = dataModels.item("internal_audit_logs"); + obj = dm.objectByName("searches"); + obj.startSearch({}, "", done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + assert.strictEqual("| datamodel internal_audit_logs searches search", job.properties().request.search); + job.cancel(done); + }, + function (response, done) { + obj.startSearch({ status_buckets: 5, enable_lookups: false }, "| head 3", done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + assert.strictEqual("| datamodel internal_audit_logs searches search | head 3", job.properties().request.search); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - baseSearch is parsed correctly": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/model_with_multiple_types.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("search1"); - assert.ok(obj); - assert.ok(obj instanceof splunkjs.Service.DataModelObject); - assert.strictEqual("BaseSearch", obj.parentName); - assert.ok(obj.isBaseSearch()); - assert.ok(!obj.isBaseTransaction()); - assert.strictEqual("search index=_internal | head 10", obj.baseSearch); + it("Callback#DataModels - baseSearch is parsed correctly", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/model_with_multiple_types.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - baseTransaction is parsed correctly": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/model_with_multiple_types.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("transaction1"); - assert.ok(obj); - assert.ok(obj instanceof splunkjs.Service.DataModelObject); - assert.strictEqual("BaseTransaction", obj.parentName); - assert.ok(obj.isBaseTransaction()); - assert.ok(!obj.isBaseSearch()); - assert.deepEqual(["event1"], obj.objectsToGroup); - assert.deepEqual(["host", "from"], obj.groupByFields); - assert.strictEqual("25s", obj.maxPause); - assert.strictEqual("100m", obj.maxSpan); + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("search1"); + assert.ok(obj); + assert.ok(obj instanceof splunkjs.Service.DataModelObject); + assert.strictEqual("BaseSearch", obj.parentName); + assert.ok(obj.isBaseSearch()); + assert.ok(!obj.isBaseTransaction()); + assert.strictEqual("search index=_internal | head 10", obj.baseSearch); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - baseTransaction is parsed correctly", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/model_with_multiple_types.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - } - }; + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("transaction1"); + assert.ok(obj); + assert.ok(obj instanceof splunkjs.Service.DataModelObject); + assert.strictEqual("BaseTransaction", obj.parentName); + assert.ok(obj.isBaseTransaction()); + assert.ok(!obj.isBaseSearch()); + assert.deepEqual(["event1"], obj.objectsToGroup); + assert.deepEqual(["host", "from"], obj.groupByFields); + assert.strictEqual("25s", obj.maxPause); + assert.strictEqual("100m", obj.maxSpan); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/endpoint.js b/tests_spike/service_tests/endpoint.js index 369577626..f31ebcc4c 100644 --- a/tests_spike/service_tests/endpoint.js +++ b/tests_spike/service_tests/endpoint.js @@ -3,38 +3,40 @@ var assert = require('chai').assert; var splunkjs = require('../../index'); exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Throws on null arguments to init": function (done) { - var service = this.service; - assert.throws(function () { - var endpoint = new splunkjs.Service.Endpoint(null, "a/b"); + return ( + describe("Endpoint tests", function (done) { + beforeEach(function (done) { + this.service = svc; + done(); }); - assert.throws(function () { - var endpoint = new splunkjs.Service.Endpoint(service, null); + + it("Throws on null arguments to init", function (done) { + var service = this.service; + assert.throws(function () { + var endpoint = new splunkjs.Service.Endpoint(null, "a/b"); + }); + assert.throws(function () { + var endpoint = new splunkjs.Service.Endpoint(service, null); + }); + done(); }); - done(); - }, - "Endpoint delete on a relative path": function (done) { - var service = this.service; - var endpoint = new splunkjs.Service.Endpoint(service, "/search/jobs/12345"); - endpoint.del("search/jobs/12345", {}, function () { done(); }); - }, + it("Endpoint delete on a relative path", function (done) { + var service = this.service; + var endpoint = new splunkjs.Service.Endpoint(service, "/search/jobs/12345"); + endpoint.del("search/jobs/12345", {}, function () { done(); }); + }); - "Methods of Resource to be overridden": function (done) { - var service = this.service; - var resource = new splunkjs.Service.Resource(service, "/search/jobs/12345"); - assert.throws(function () { resource.path(); }); - assert.throws(function () { resource.fetch(); }); - assert.ok(splunkjs.Utils.isEmpty(resource.state())); - done(); - } - }; + it("Methods of Resource to be overridden", function (done) { + var service = this.service; + var resource = new splunkjs.Service.Resource(service, "/search/jobs/12345"); + assert.throws(function () { resource.path(); }); + assert.throws(function () { resource.fetch(); }); + assert.ok(splunkjs.Utils.isEmpty(resource.state())); + done(); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/entity.js b/tests_spike/service_tests/entity.js index 52dfa6b6e..b82df1f06 100644 --- a/tests_spike/service_tests/entity.js +++ b/tests_spike/service_tests/entity.js @@ -10,106 +10,109 @@ var getNextId = function () { }; exports.setup = function (svc, loggedOutSvc) { - return { - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }, - - "Accessors function properly": function (done) { - var entity = new splunkjs.Service.Entity( - this.service, - "/search/jobs/12345", - { owner: "boris", app: "factory", sharing: "app" } - ); - entity._load( - { - acl: { owner: "boris", app: "factory", sharing: "app" }, - links: { link1: 35 }, - published: "meep", - author: "Hilda" - } - ); - assert.ok(entity.acl().owner === "boris"); - assert.ok(entity.acl().app === "factory"); - assert.ok(entity.acl().sharing === "app"); - assert.ok(entity.links().link1 === 35); - assert.strictEqual(entity.author(), "Hilda"); - assert.strictEqual(entity.published(), "meep"); - done(); - }, - - "Refresh throws error correctly": function (done) { - var entity = new splunkjs.Service.Entity(this.loggedOutService, "/search/jobs/12345", { owner: "boris", app: "factory", sharing: "app" }); - entity.fetch({}, function (err) { assert.ok(err); done(); }); - }, - - "Cannot update name of entity": function (done) { - var entity = new splunkjs.Service.Entity(this.service, "/search/jobs/12345", { owner: "boris", app: "factory", sharing: "app" }); - assert.throws(function () { entity.update({ name: "asdf" }); }); - done(); - }, - - "Disable throws error correctly": function (done) { - var entity = new splunkjs.Service.Entity( - this.loggedOutService, - "/search/jobs/12345", - { owner: "boris", app: "factory", sharing: "app" } - ); - entity.disable(function (err) { assert.ok(err); done(); }); - }, - - "Enable throws error correctly": function (done) { - var entity = new splunkjs.Service.Entity( - this.loggedOutService, - "/search/jobs/12345", - { owner: "boris", app: "factory", sharing: "app" } - ); - entity.enable(function (err) { assert.ok(err); done(); }); - }, - - "Does reload work?": function (done) { - var idx = new splunkjs.Service.Index( - this.service, - "data/indexes/sdk-test", - { - owner: "admin", - app: "search", - sharing: "app" - } - ); - var name = "jssdk_testapp_" + getNextId(); - var apps = this.service.apps(); - - var that = this; - Async.chain( - function (done) { - apps.create({ name: name }, done); - }, - function (app, done) { - app.reload(function (err) { + return ( + describe("Entity tests", function () { + + beforeEach(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + done(); + }); + + it("Accessors function properly", function (done) { + var entity = new splunkjs.Service.Entity( + this.service, + "/search/jobs/12345", + { owner: "boris", app: "factory", sharing: "app" } + ); + entity._load( + { + acl: { owner: "boris", app: "factory", sharing: "app" }, + links: { link1: 35 }, + published: "meep", + author: "Hilda" + } + ); + assert.ok(entity.acl().owner === "boris"); + assert.ok(entity.acl().app === "factory"); + assert.ok(entity.acl().sharing === "app"); + assert.ok(entity.links().link1 === 35); + assert.strictEqual(entity.author(), "Hilda"); + assert.strictEqual(entity.published(), "meep"); + done(); + }); + + it("Refresh throws error correctly", function (done) { + var entity = new splunkjs.Service.Entity(this.loggedOutService, "/search/jobs/12345", { owner: "boris", app: "factory", sharing: "app" }); + entity.fetch({}, function (err) { assert.ok(err); done(); }); + }); + + it("Cannot update name of entity", function (done) { + var entity = new splunkjs.Service.Entity(this.service, "/search/jobs/12345", { owner: "boris", app: "factory", sharing: "app" }); + assert.throws(function () { entity.update({ name: "asdf" }); }); + done(); + }); + + it("Disable throws error correctly", function (done) { + var entity = new splunkjs.Service.Entity( + this.loggedOutService, + "/search/jobs/12345", + { owner: "boris", app: "factory", sharing: "app" } + ); + entity.disable(function (err) { assert.ok(err); done(); }); + }); + + it("Enable throws error correctly", function (done) { + var entity = new splunkjs.Service.Entity( + this.loggedOutService, + "/search/jobs/12345", + { owner: "boris", app: "factory", sharing: "app" } + ); + entity.enable(function (err) { assert.ok(err); done(); }); + }); + + it("Does reload work?", function (done) { + var idx = new splunkjs.Service.Index( + this.service, + "data/indexes/sdk-test", + { + owner: "admin", + app: "search", + sharing: "app" + } + ); + var name = "jssdk_testapp_" + getNextId(); + var apps = this.service.apps(); + + var that = this; + Async.chain( + function (done) { + apps.create({ name: name }, done); + }, + function (app, done) { + app.reload(function (err) { + assert.ok(!err); + done(null, app); + }); + }, + function (app, done) { + var app2 = new splunkjs.Service.Application(that.loggedOutService, app.name); + app2.reload(function (err) { + assert.ok(err); + done(null, app); + }); + }, + function (app, done) { + app.remove(done); + }, + function (err) { assert.ok(!err); - done(null, app); - }); - }, - function (app, done) { - var app2 = new splunkjs.Service.Application(that.loggedOutService, app.name); - app2.reload(function (err) { - assert.ok(err); - done(null, app); - }); - }, - function (app, done) { - app.remove(done); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - } - }; + done(); + } + ); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/firedalerts.js b/tests_spike/service_tests/firedalerts.js index 0889cd03c..dd4ddc5c9 100644 --- a/tests_spike/service_tests/firedalerts.js +++ b/tests_spike/service_tests/firedalerts.js @@ -11,260 +11,262 @@ var getNextId = function () { }; exports.setup = function (svc, loggedOutSvc) { - return { - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - var indexes = this.service.indexes(); - done(); - }, + return ( + describe("Fired alerts tests", () => { + beforeEach(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + var indexes = this.service.indexes(); + done(); + }); - "Callback#create + verify emptiness + delete new alert group": function (done) { + it("Callback#create + verify emptiness + delete new alert group", function (done) { - var searches = this.service.savedSearches({ owner: this.service.username }); - var name = "jssdk_savedsearch_alert_" + getNextId(); - var searchConfig = { - "name": name, - "search": "index=_internal | head 1", - "alert_type": "always", - "alert.severity": "2", - "alert.suppress": "0", - "alert.track": "1", - "dispatch.earliest_time": "-1h", - "dispatch.latest_time": "now", - "is_scheduled": "1", - "cron_schedule": "* * * * *" - }; + var searches = this.service.savedSearches({ owner: this.service.username }); + var name = "jssdk_savedsearch_alert_" + getNextId(); + var searchConfig = { + "name": name, + "search": "index=_internal | head 1", + "alert_type": "always", + "alert.severity": "2", + "alert.suppress": "0", + "alert.track": "1", + "dispatch.earliest_time": "-1h", + "dispatch.latest_time": "now", + "is_scheduled": "1", + "cron_schedule": "* * * * *" + }; - Async.chain([ - function (done) { - searches.create(searchConfig, done); - }, - function (search, done) { - assert.ok(search); - assert.strictEqual(search.alertCount(), 0); - search.history(done); - }, - function (jobs, search, done) { - assert.strictEqual(jobs.length, 0); - assert.strictEqual(search.firedAlertGroup().count(), 0); - searches.service.firedAlertGroups().fetch(Async.augment(done, search)); - }, - function (firedAlertGroups, originalSearch, done) { - assert.strictEqual(firedAlertGroups.list().indexOf(originalSearch.name), -1); - done(null, originalSearch); - }, - function (originalSearch, done) { - originalSearch.remove(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, + Async.chain([ + function (done) { + searches.create(searchConfig, done); + }, + function (search, done) { + assert.ok(search); + assert.strictEqual(search.alertCount(), 0); + search.history(done); + }, + function (jobs, search, done) { + assert.strictEqual(jobs.length, 0); + assert.strictEqual(search.firedAlertGroup().count(), 0); + searches.service.firedAlertGroups().fetch(Async.augment(done, search)); + }, + function (firedAlertGroups, originalSearch, done) { + assert.strictEqual(firedAlertGroups.list().indexOf(originalSearch.name), -1); + done(null, originalSearch); + }, + function (originalSearch, done) { + originalSearch.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - // This test is not stable, commenting it out until we figure it out - // "Callback#alert is triggered + test firedAlert entity -- FAILS INTERMITTENTLY": function(done) { - // var searches = this.service.savedSearches({owner: this.service.username}); - // var indexName = "sdk-tests-alerts"; - // var name = "jssdk_savedsearch_alert_" + getNextId(); + // This test is not stable, commenting it out until we figure it out + // it("Callback#alert is triggered + test firedAlert entity -- FAILS INTERMITTENTLY", function(done) { + // var searches = this.service.savedSearches({owner: this.service.username}); + // var indexName = "sdk-tests-alerts"; + // var name = "jssdk_savedsearch_alert_" + getNextId(); - // // Real-time search config - // var searchConfig = { - // "name": name, - // "search": "index="+indexName+" sourcetype=sdk-tests-alerts | head 1", - // "alert_type": "always", - // "alert.severity": "2", - // "alert.suppress": "0", - // "alert.track": "1", - // "dispatch.earliest_time": "rt-1s", - // "dispatch.latest_time": "rt", - // "is_scheduled": "1", - // "cron_schedule": "* * * * *" - // }; + // // Real-time search config + // var searchConfig = { + // "name": name, + // "search": "index="+indexName+" sourcetype=sdk-tests-alerts | head 1", + // "alert_type": "always", + // "alert.severity": "2", + // "alert.suppress": "0", + // "alert.track": "1", + // "dispatch.earliest_time": "rt-1s", + // "dispatch.latest_time": "rt", + // "is_scheduled": "1", + // "cron_schedule": "* * * * *" + // }; - // Async.chain([ - // function(done) { - // searches.create(searchConfig, done); - // }, - // function(search, done) { - // assert.ok(search); - // assert.strictEqual(search.alertCount(), 0); - // assert.strictEqual(search.firedAlertGroup().count(), 0); + // Async.chain([ + // function(done) { + // searches.create(searchConfig, done); + // }, + // function(search, done) { + // assert.ok(search); + // assert.strictEqual(search.alertCount(), 0); + // assert.strictEqual(search.firedAlertGroup().count(), 0); - // var indexes = search.service.indexes(); - // indexes.create(indexName, {}, function(err, index) { - // if (err && err.status !== 409) { - // done(new Error("Index creation failed for an unknown reason")); - // } - // done(null, search); - // }); - // }, - // function(originalSearch, done) { - // var indexes = originalSearch.service.indexes(); - // indexes.fetch(function(err, indexes) { - // if (err) { - // done(err); - // } - // else { - // var index = indexes.item(indexName); - // assert.ok(index); - // index.enable(Async.augment(done, originalSearch)); - // } - // }); - // }, - // function(index, originalSearch, done) { - // //Is the index enabled? - // assert.ok(!index.properties().disabled); - // //refresh the index - // index.fetch(Async.augment(done, originalSearch)); - // }, - // function(index, originalSearch, done) { - // //Store the current event count for a later comparison - // var eventCount = index.properties().totalEventCount; + // var indexes = search.service.indexes(); + // indexes.create(indexName, {}, function(err, index) { + // if (err && err.status !== 409) { + // done(new Error("Index creation failed for an unknown reason")); + // } + // done(null, search); + // }); + // }, + // function(originalSearch, done) { + // var indexes = originalSearch.service.indexes(); + // indexes.fetch(function(err, indexes) { + // if (err) { + // done(err); + // } + // else { + // var index = indexes.item(indexName); + // assert.ok(index); + // index.enable(Async.augment(done, originalSearch)); + // } + // }); + // }, + // function(index, originalSearch, done) { + // //Is the index enabled? + // assert.ok(!index.properties().disabled); + // //refresh the index + // index.fetch(Async.augment(done, originalSearch)); + // }, + // function(index, originalSearch, done) { + // //Store the current event count for a later comparison + // var eventCount = index.properties().totalEventCount; - // assert.strictEqual(index.properties().sync, 0); - // assert.ok(!index.properties().disabled); + // assert.strictEqual(index.properties().sync, 0); + // assert.ok(!index.properties().disabled); - // index.fetch(Async.augment(done, originalSearch, eventCount)); - // }, - // function(index, originalSearch, eventCount, done) { - // // submit an event - // index.submitEvent( - // "JS SDK: testing alerts", - // { - // sourcetype: "sdk-tests-alerts" - // }, - // Async.augment(done, originalSearch, eventCount) - // ); - // }, - // function(result, index, originalSearch, eventCount, done) { - // Async.sleep(1000, function(){ - // //refresh the search - // index.fetch(Async.augment(done, originalSearch, eventCount)); - // }); - // }, - // function(index, originalSearch, eventCount, done) { - // // Did the event get submitted - // assert.strictEqual(index.properties().totalEventCount, eventCount+1); - // // Refresh the search - // originalSearch.fetch(Async.augment(done, index)); - // }, - // function(originalSearch, index, done) { - // splunkjs.Logger.log("\tAlert count pre-fetch", originalSearch.alertCount()); - // var attemptNum = 1; - // var maxAttempts = 20; - // Async.whilst( - // function() { - // // When this returns false, it hits the final function in the chain - // splunkjs.Logger.log("\tFetch attempt", attemptNum, "of", maxAttempts, "alertCount", originalSearch.alertCount()); - // if (originalSearch.alertCount() !== 0) { - // return false; - // } - // else { - // attemptNum++; - // return attemptNum < maxAttempts; - // } - // }, - // function(callback) { - // Async.sleep(500, function() { - // originalSearch.fetch(callback); - // }); - // }, - // function(err) { - // splunkjs.Logger.log("Attempted fetching", attemptNum, "of", maxAttempts, "result is", originalSearch.alertCount() !== 0); - // originalSearch.fetch(Async.augment(done, index)); - // } - // ); - // }, - // function(originalSearch, index, done) { - // splunkjs.Logger.log("about to fetch"); - // splunkjs.Logger.log("SavedSearch name was: " + originalSearch.name); - // svc.firedAlertGroups({username: svc.username}).fetch(Async.augment(done, index, originalSearch)); - // }, - // function(firedAlertGroups, index, originalSearch, done) { - // Async.seriesEach( - // firedAlertGroups.list(), - // function(firedAlertGroup, innerIndex, seriescallback) { - // Async.chain([ - // function(insideChainCallback) { - // firedAlertGroup.list(insideChainCallback); - // }, - // function(firedAlerts, firedAlertGroup, insideChainCallback) { - // for(var i = 0; i < firedAlerts.length; i++) { - // var firedAlert = firedAlerts[i]; - // firedAlert.actions(); - // firedAlert.alertType(); - // firedAlert.isDigestMode(); - // firedAlert.expirationTime(); - // firedAlert.savedSearchName(); - // firedAlert.severity(); - // firedAlert.sid(); - // firedAlert.triggerTime(); - // firedAlert.triggerTimeRendered(); - // firedAlert.triggeredAlertCount(); - // } - // insideChainCallback(null); - // } - // ], - // function(err) { - // if (err) { - // seriescallback(err); - // } - // seriescallback(null); - // } - // ); - // }, - // function(err) { - // if (err) { - // done(err, originalSearch, index); - // } - // done(null, originalSearch, index); - // } - // ); - // }, - // function(originalSearch, index, done) { - // // Make sure the event count has incremented, as expected - // assert.strictEqual(originalSearch.alertCount(), 1); - // // Remove the search, especially because it's a real-time search - // originalSearch.remove(Async.augment(done, index)); - // }, - // function(index, done) { - // Async.sleep(500, function() { - // index.remove(done); - // }); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, + // index.fetch(Async.augment(done, originalSearch, eventCount)); + // }, + // function(index, originalSearch, eventCount, done) { + // // submit an event + // index.submitEvent( + // "JS SDK: testing alerts", + // { + // sourcetype: "sdk-tests-alerts" + // }, + // Async.augment(done, originalSearch, eventCount) + // ); + // }, + // function(result, index, originalSearch, eventCount, done) { + // Async.sleep(1000, function(){ + // //refresh the search + // index.fetch(Async.augment(done, originalSearch, eventCount)); + // }); + // }, + // function(index, originalSearch, eventCount, done) { + // // Did the event get submitted + // assert.strictEqual(index.properties().totalEventCount, eventCount+1); + // // Refresh the search + // originalSearch.fetch(Async.augment(done, index)); + // }, + // function(originalSearch, index, done) { + // splunkjs.Logger.log("\tAlert count pre-fetch", originalSearch.alertCount()); + // var attemptNum = 1; + // var maxAttempts = 20; + // Async.whilst( + // function() { + // // When this returns false, it hits the final function in the chain + // splunkjs.Logger.log("\tFetch attempt", attemptNum, "of", maxAttempts, "alertCount", originalSearch.alertCount()); + // if (originalSearch.alertCount() !== 0) { + // return false; + // } + // else { + // attemptNum++; + // return attemptNum < maxAttempts; + // } + // }, + // function(callback) { + // Async.sleep(500, function() { + // originalSearch.fetch(callback); + // }); + // }, + // function(err) { + // splunkjs.Logger.log("Attempted fetching", attemptNum, "of", maxAttempts, "result is", originalSearch.alertCount() !== 0); + // originalSearch.fetch(Async.augment(done, index)); + // } + // ); + // }, + // function(originalSearch, index, done) { + // splunkjs.Logger.log("about to fetch"); + // splunkjs.Logger.log("SavedSearch name was: " + originalSearch.name); + // svc.firedAlertGroups({username: svc.username}).fetch(Async.augment(done, index, originalSearch)); + // }, + // function(firedAlertGroups, index, originalSearch, done) { + // Async.seriesEach( + // firedAlertGroups.list(), + // function(firedAlertGroup, innerIndex, seriescallback) { + // Async.chain([ + // function(insideChainCallback) { + // firedAlertGroup.list(insideChainCallback); + // }, + // function(firedAlerts, firedAlertGroup, insideChainCallback) { + // for(var i = 0; i < firedAlerts.length; i++) { + // var firedAlert = firedAlerts[i]; + // firedAlert.actions(); + // firedAlert.alertType(); + // firedAlert.isDigestMode(); + // firedAlert.expirationTime(); + // firedAlert.savedSearchName(); + // firedAlert.severity(); + // firedAlert.sid(); + // firedAlert.triggerTime(); + // firedAlert.triggerTimeRendered(); + // firedAlert.triggeredAlertCount(); + // } + // insideChainCallback(null); + // } + // ], + // function(err) { + // if (err) { + // seriescallback(err); + // } + // seriescallback(null); + // } + // ); + // }, + // function(err) { + // if (err) { + // done(err, originalSearch, index); + // } + // done(null, originalSearch, index); + // } + // ); + // }, + // function(originalSearch, index, done) { + // // Make sure the event count has incremented, as expected + // assert.strictEqual(originalSearch.alertCount(), 1); + // // Remove the search, especially because it's a real-time search + // originalSearch.remove(Async.augment(done, index)); + // }, + // function(index, done) { + // Async.sleep(500, function() { + // index.remove(done); + // }); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }); - "Callback#delete all alerts": function (done) { - var namePrefix = "jssdk_savedsearch_alert_"; - var alertList = this.service.savedSearches().list(); + it("Callback#delete all alerts", function (done) { + var namePrefix = "jssdk_savedsearch_alert_"; + var alertList = this.service.savedSearches().list(); - Async.parallelEach( - alertList, - function (alert, idx, callback) { - if (utils.startsWith(alert.name, namePrefix)) { - splunkjs.Logger.log("ALERT ---", alert.name); - alert.remove(callback); - } - else { - callback(); + Async.parallelEach( + alertList, + function (alert, idx, callback) { + if (utils.startsWith(alert.name, namePrefix)) { + splunkjs.Logger.log("ALERT ---", alert.name); + alert.remove(callback); + } + else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); } - }, function (err) { - assert.ok(!err); - done(); - } - ); - } - }; + ); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/indexes.js b/tests_spike/service_tests/indexes.js index c6327f246..e5712ba45 100644 --- a/tests_spike/service_tests/indexes.js +++ b/tests_spike/service_tests/indexes.js @@ -10,363 +10,397 @@ var getNextId = function () { }; exports.setup = function (svc, loggedOutSvc) { - return { - - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; + return ( + describe("Indexes tests", function (done) { + beforeEach(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + + // Create the index for everyone to use + var name = this.indexName = "sdk-tests"; + var indexes = this.service.indexes(); + indexes.create(name, {}, function (err, index) { + if (err && err.status !== 409) { + throw new Error("Index creation failed for an unknown reason"); + } - // Create the index for everyone to use - var name = this.indexName = "sdk-tests"; - var indexes = this.service.indexes(); - indexes.create(name, {}, function (err, index) { - if (err && err.status !== 409) { - throw new Error("Index creation failed for an unknown reason"); - } + done(); + }); + }); - done(); + // it("Callback#remove index fails on Splunk 4.x", function(done) { + // var original_version = this.service.version; + // this.service.version = "4.0"; + // + // var index = this.service.indexes().item(this.indexName); + // assert.throws(function() { index.remove(function(err) {}); }); + // + // this.service.version = original_version; + // done(); + // }); + + // it("Callback#remove index", function(done) { + // var indexes = this.service.indexes(); + // + // // Must generate a private index because an index cannot + // // be recreated with the same name as a deleted index + // // for a certain period of time after the deletion. + // var salt = Math.floor(Math.random() * 65536); + // var myIndexName = this.indexName + '-' + salt; + // + // if (this.service.versionCompare("5.0") < 0) { + // splunkjs.Logger.info("", "Must be running Splunk 5.0+ for this test to work."); + // done(); + // return; + // } + // + // Async.chain([ + // function(callback) { + // indexes.create(myIndexName, {}, callback); + // }, + // function(index, callback) { + // index.remove(callback); + // }, + // function(callback) { + // var numTriesLeft = 50; + // var delayPerTry = 200; // ms + // + // Async.whilst( + // function() { return indexes.item(myIndexName) && ((numTriesLeft--) > 0); }, + // function(iterDone) { + // Async.sleep(delayPerTry, function() { indexes.fetch(iterDone); }); + // }, + // function(err) { + // if (err) { + // callback(err); + // } + // else { + // callback(numTriesLeft <= 0 ? "Timed out" : null); + // } + // } + // ); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }); + + it("Callback#list indexes", function (done) { + var indexes = this.service.indexes(); + indexes.fetch(function (err, indexes) { + var indexList = indexes.list(); + assert.ok(indexList.length > 0); + done(); + }); }); - }, - - // "Callback#remove index fails on Splunk 4.x": function(done) { - // var original_version = this.service.version; - // this.service.version = "4.0"; - // - // var index = this.service.indexes().item(this.indexName); - // assert.throws(function() { index.remove(function(err) {}); }); - // - // this.service.version = original_version; - // done(); - // }, - - // "Callback#remove index": function(done) { - // var indexes = this.service.indexes(); - // - // // Must generate a private index because an index cannot - // // be recreated with the same name as a deleted index - // // for a certain period of time after the deletion. - // var salt = Math.floor(Math.random() * 65536); - // var myIndexName = this.indexName + '-' + salt; - // - // if (this.service.versionCompare("5.0") < 0) { - // splunkjs.Logger.info("", "Must be running Splunk 5.0+ for this test to work."); - // done(); - // return; - // } - // - // Async.chain([ - // function(callback) { - // indexes.create(myIndexName, {}, callback); - // }, - // function(index, callback) { - // index.remove(callback); - // }, - // function(callback) { - // var numTriesLeft = 50; - // var delayPerTry = 200; // ms - // - // Async.whilst( - // function() { return indexes.item(myIndexName) && ((numTriesLeft--) > 0); }, - // function(iterDone) { - // Async.sleep(delayPerTry, function() { indexes.fetch(iterDone); }); - // }, - // function(err) { - // if (err) { - // callback(err); - // } - // else { - // callback(numTriesLeft <= 0 ? "Timed out" : null); - // } - // } - // ); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - - "Callback#list indexes": function (done) { - var indexes = this.service.indexes(); - indexes.fetch(function (err, indexes) { - var indexList = indexes.list(); - assert.ok(indexList.length > 0); - done(); + + it("Callback#contains index", function (done) { + var indexes = this.service.indexes(); + var indexName = this.indexName; + + indexes.fetch(function (err, indexes) { + var index = indexes.item(indexName); + assert.ok(index); + done(); + }); }); - }, - "Callback#contains index": function (done) { - var indexes = this.service.indexes(); - var indexName = this.indexName; + it("Callback#modify index", function (done) { - indexes.fetch(function (err, indexes) { - var index = indexes.item(indexName); - assert.ok(index); - done(); + var name = this.indexName; + var indexes = this.service.indexes(); + var originalSyncMeta = false; + + Async.chain([ + function (callback) { + indexes.fetch(callback); + }, + function (indexes, callback) { + var index = indexes.item(name); + assert.ok(index); + + originalSyncMeta = index.properties().syncMeta; + index.update({ + syncMeta: !originalSyncMeta + }, callback); + }, + function (index, callback) { + assert.ok(index); + var properties = index.properties(); + + assert.strictEqual(!originalSyncMeta, properties.syncMeta); + + index.update({ + syncMeta: !properties.syncMeta + }, callback); + }, + function (index, callback) { + assert.ok(index); + var properties = index.properties(); + + assert.strictEqual(originalSyncMeta, properties.syncMeta); + callback(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); }); - }, - "Callback#modify index": function (done) { + it("Callback#Enable+disable index", function (done) { - var name = this.indexName; - var indexes = this.service.indexes(); - var originalSyncMeta = false; + this.timeout(40000); + var name = this.indexName; + var indexes = this.service.indexes(); - Async.chain([ - function (callback) { - indexes.fetch(callback); - }, - function (indexes, callback) { - var index = indexes.item(name); - assert.ok(index); + Async.chain([ + function (callback) { + indexes.fetch(callback); + }, + function (indexes, callback) { + var index = indexes.item(name); + assert.ok(index); - originalSyncMeta = index.properties().syncMeta; - index.update({ - syncMeta: !originalSyncMeta - }, callback); - }, - function (index, callback) { - assert.ok(index); - var properties = index.properties(); + index.disable(callback); + }, + function (index, callback) { + Async.sleep(5000, function () { + callback(null, index); + }); + }, + function (index, callback) { + assert.ok(index); + index.fetch(callback); + }, + function (index, callback) { + assert.ok(index); + assert.ok(index.properties().disabled); - assert.strictEqual(!originalSyncMeta, properties.syncMeta); + index.enable(callback); + }, + function (index, callback) { + Async.sleep(5000, function () { + callback(null, index); + }); + }, + function (index, callback) { + assert.ok(index); + index.fetch(callback); + }, + function (index, callback) { + assert.ok(index); + assert.ok(!index.properties().disabled); - index.update({ - syncMeta: !properties.syncMeta - }, callback); - }, - function (index, callback) { - assert.ok(index); - var properties = index.properties(); - - assert.strictEqual(originalSyncMeta, properties.syncMeta); - callback(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Enable+disable index": function (done) { - - this.timeout(40000); - var name = this.indexName; - var indexes = this.service.indexes(); - - Async.chain([ - function (callback) { - indexes.fetch(callback); - }, - function (indexes, callback) { - var index = indexes.item(name); - assert.ok(index); + callback(); + } + ], + function (err) { + assert.ok(!err, JSON.stringify(err)); + done(); + } + ); + }); - index.disable(callback); - }, - function (index, callback) { - Async.sleep(5000, function () { - callback(null, index); - }); - }, - function (index, callback) { - assert.ok(index); - index.fetch(callback); - }, - function (index, callback) { - assert.ok(index); - assert.ok(index.properties().disabled); - - index.enable(callback); - }, - function (index, callback) { - Async.sleep(5000, function () { - callback(null, index); - }); - }, - function (index, callback) { - assert.ok(index); - index.fetch(callback); - }, - function (index, callback) { - assert.ok(index); - assert.ok(!index.properties().disabled); + it("Callback#Service submit event", function (done) { + var message = "Hello World -- " + getNextId(); + var sourcetype = "sdk-tests"; - callback(); - } - ], - function (err) { - assert.ok(!err, JSON.stringify(err)); - done(); - } - ); - }, - - "Callback#Service submit event": function (done) { - var message = "Hello World -- " + getNextId(); - var sourcetype = "sdk-tests"; - - var service = this.service; - var indexName = this.indexName; - Async.chain( - function (done) { - service.log(message, { sourcetype: sourcetype, index: indexName }, done); - }, - function (eventInfo, done) { - assert.ok(eventInfo); - assert.strictEqual(eventInfo.sourcetype, sourcetype); - assert.strictEqual(eventInfo.bytes, message.length); - assert.strictEqual(eventInfo.index, indexName); - - // We could poll to make sure the index has eaten up the event, - // but unfortunately this can take an unbounded amount of time. - // As such, since we got a good response, we'll just be done with it. - done(); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Service submit event, omitting optional arguments": function (done) { - var message = "Hello World -- " + getNextId(); - var sourcetype = "sdk-tests"; - - var service = this.service; - var indexName = this.indexName; - Async.chain( - function (done) { - service.log(message, done); - }, - function (eventInfo, done) { - assert.ok(eventInfo); - assert.strictEqual(eventInfo.bytes, message.length); - - // We could poll to make sure the index has eaten up the event, - // but unfortunately this can take an unbounded amount of time. - // As such, since we got a good response, we'll just be done with it. - done(); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Service submit events with multi-byte chars": function (done) { - var service = this.service; - var messages = [ - "Ummelner Straße 6", - "Ümmelner Straße 6", - "Iԉtérԉátíòлåɭìƶåtiòл", - "Intérnâtì߀лàɭíƶɑtïòл", - "ãϻét dòner turƙëy ѵ߀lù", - "ptãte ìԉ rëρrèhënԁérit ", - "ϻ߀lɭit fìɭèt ϻìǥnoԉ ɭäb߀ríѕ", - " êӽ cɦùck cüpïᏧåtåt Ꮷèѕëruлt. ", - "D߀ɭor ѵélít ìrurè, sèᏧ ѕhòr", - "t riƅѕ c߀ɰ ɭãnԁյàéɢêr drúmst", - "ícƙ. Minïm ƃàɭl tip ѕհòrt rìƃѕ,", - " ïԁ aɭïqúìρ ѕɦànƙ ρ߀rcɦéttɑ. Pìǥ", - " hãm ɦòck ìлcídíԁùԉt séԁ cüpïϻ ", - "ƙèviл láborê. Et taiɭ ѕtriρ", - " steák út üllãϻc߀ rump d߀ɭore.", - "٩(͡๏̯͡๏)۶ ٩(-̮̮̃•̃).", - "Lɑƅòré ƃrësãòlá d߀лèr ѕâlámí ", - "cíllûm ìn ѕɯìлe ϻêàtɭ߀àf dûìs ", - "ρãncettä ƅrìsƙét ԁèsêrûлt áútè", - " յòɰɭ. Lɑbòrìѕ ƙìêɭ", - "básá ԁòlòré fatƃɑck ƅêéf. Pɑѕtr", - "ämì piɢ ѕհàлƙ ùɭɭamcò ѕaû", - "ѕäǥë sɦànƙlë.", - " Cúpím ɭäƃorum drumstïcƙ jerkϒ veli", - " pïcåԉɦɑ ƙíéɭƅãsa. Alïqû", - "iρ írürë cûpíϻ, äɭìɋuâ ǥròûлd ", - "roúлᏧ toԉgüè ρàrìãtùr ", - "briѕkèt ԉostruᏧ cûɭpɑ", - " ìd còлѕèqûât làƅ߀rìs." - ]; - - var counter = 0; - Async.seriesMap( - messages, - function (val, idx, done) { - counter++; - service.log(val, done); - }, - function (err, vals) { - assert.ok(!err); - assert.strictEqual(counter, messages.length); - - // Verify that the full byte-length was sent for each message - for (var m in messages) { - assert.notStrictEqual(messages[m].length, vals[m].bytes); - try { - assert.strictEqual(Buffer.byteLength(messages[m]), vals[m].bytes); - } - catch (err) { - // Assume Buffer isn't defined, we're probably in the browser - assert.strictEqual(decodeURI(encodeURIComponent(messages[m])).length, vals[m].bytes); + var service = this.service; + var indexName = this.indexName; + Async.chain( + function (done) { + service.log(message, { sourcetype: sourcetype, index: indexName }, done); + }, + function (eventInfo, done) { + assert.ok(eventInfo); + assert.strictEqual(eventInfo.sourcetype, sourcetype); + assert.strictEqual(eventInfo.bytes, message.length); + assert.strictEqual(eventInfo.index, indexName); + + // We could poll to make sure the index has eaten up the event, + // but unfortunately this can take an unbounded amount of time. + // As such, since we got a good response, we'll just be done with it. + done(); + }, + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("Callback#Service submit event, omitting optional arguments", function (done) { + var message = "Hello World -- " + getNextId(); + var sourcetype = "sdk-tests"; + + var service = this.service; + var indexName = this.indexName; + Async.chain( + function (done) { + service.log(message, done); + }, + function (eventInfo, done) { + assert.ok(eventInfo); + assert.strictEqual(eventInfo.bytes, message.length); + + // We could poll to make sure the index has eaten up the event, + // but unfortunately this can take an unbounded amount of time. + // As such, since we got a good response, we'll just be done with it. + done(); + }, + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("Callback#Service submit events with multi-byte chars", function (done) { + var service = this.service; + var messages = [ + "Ummelner Straße 6", + "Ümmelner Straße 6", + "Iԉtérԉátíòлåɭìƶåtiòл", + "Intérnâtì߀лàɭíƶɑtïòл", + "ãϻét dòner turƙëy ѵ߀lù", + "ptãte ìԉ rëρrèhënԁérit ", + "ϻ߀lɭit fìɭèt ϻìǥnoԉ ɭäb߀ríѕ", + " êӽ cɦùck cüpïᏧåtåt Ꮷèѕëruлt. ", + "D߀ɭor ѵélít ìrurè, sèᏧ ѕhòr", + "t riƅѕ c߀ɰ ɭãnԁյàéɢêr drúmst", + "ícƙ. Minïm ƃàɭl tip ѕհòrt rìƃѕ,", + " ïԁ aɭïqúìρ ѕɦànƙ ρ߀rcɦéttɑ. Pìǥ", + " hãm ɦòck ìлcídíԁùԉt séԁ cüpïϻ ", + "ƙèviл láborê. Et taiɭ ѕtriρ", + " steák út üllãϻc߀ rump d߀ɭore.", + "٩(͡๏̯͡๏)۶ ٩(-̮̮̃•̃).", + "Lɑƅòré ƃrësãòlá d߀лèr ѕâlámí ", + "cíllûm ìn ѕɯìлe ϻêàtɭ߀àf dûìs ", + "ρãncettä ƅrìsƙét ԁèsêrûлt áútè", + " յòɰɭ. Lɑbòrìѕ ƙìêɭ", + "básá ԁòlòré fatƃɑck ƅêéf. Pɑѕtr", + "ämì piɢ ѕհàлƙ ùɭɭamcò ѕaû", + "ѕäǥë sɦànƙlë.", + " Cúpím ɭäƃorum drumstïcƙ jerkϒ veli", + " pïcåԉɦɑ ƙíéɭƅãsa. Alïqû", + "iρ írürë cûpíϻ, äɭìɋuâ ǥròûлd ", + "roúлᏧ toԉgüè ρàrìãtùr ", + "briѕkèt ԉostruᏧ cûɭpɑ", + " ìd còлѕèqûât làƅ߀rìs." + ]; + + var counter = 0; + Async.seriesMap( + messages, + function (val, idx, done) { + counter++; + service.log(val, done); + }, + function (err, vals) { + assert.ok(!err); + assert.strictEqual(counter, messages.length); + + // Verify that the full byte-length was sent for each message + for (var m in messages) { + assert.notStrictEqual(messages[m].length, vals[m].bytes); + try { + assert.strictEqual(Buffer.byteLength(messages[m]), vals[m].bytes); + } + catch (err) { + // Assume Buffer isn't defined, we're probably in the browser + assert.strictEqual(decodeURI(encodeURIComponent(messages[m])).length, vals[m].bytes); + } } + + done(); } + ); + }); - done(); - } - ); - }, - - "Callback#Service submit event, failure": function (done) { - var message = "Hello World -- " + getNextId(); - var sourcetype = "sdk-tests"; - - var service = this.loggedOutService; - var indexName = this.indexName; - Async.chain( - function (done) { - assert.ok(service); - service.log(message, done); - }, - function (err) { - assert.ok(err); - done(); - } - ); - }, - - "Callback#remove throws an error": function (done) { - var index = this.service.indexes().item("_internal"); - assert.throws(function () { - index.remove(); + it("Callback#Service submit event, failure", function (done) { + var message = "Hello World -- " + getNextId(); + var sourcetype = "sdk-tests"; + + var service = this.loggedOutService; + var indexName = this.indexName; + Async.chain( + function (done) { + assert.ok(service); + service.log(message, done); + }, + function (err) { + assert.ok(err); + done(); + } + ); + }); + + it("Callback#remove throws an error", function (done) { + var index = this.service.indexes().item("_internal"); + assert.throws(function () { + index.remove(); + }); + done(); }); - done(); - }, - - "Callback#create an index with alternate argument format": function (done) { - var indexes = this.service.indexes(); - indexes.create( - { name: "_internal" }, - function (err, newIndex) { - assert.ok(err.data.messages[0].text.match("name=_internal already exists")); - done(); - } - ); - }, - "Callback#Index submit event with omitted optional arguments": function (done) { - var message = "Hello world -- " + getNextId(); + it("Callback#create an index with alternate argument format", function (done) { + var indexes = this.service.indexes(); + indexes.create( + { name: "_internal" }, + function (err, newIndex) { + assert.ok(err.data.messages[0].text.match("name=_internal already exists")); + done(); + } + ); + }); + + it("Callback#Index submit event with omitted optional arguments", function (done) { + var message = "Hello world -- " + getNextId(); + + var indexName = this.indexName; + var indexes = this.service.indexes(); + + Async.chain( + [ + function (done) { + indexes.fetch(done); + }, + function (indexes, done) { + var index = indexes.item(indexName); + assert.ok(index); + assert.strictEqual(index.name, indexName); + index.submitEvent(message, done); + }, + function (eventInfo, index, done) { + assert.ok(eventInfo); + assert.strictEqual(eventInfo.bytes, message.length); + assert.strictEqual(eventInfo.index, indexName); + + // We could poll to make sure the index has eaten up the event, + // but unfortunately this can take an unbounded amount of time. + // As such, since we got a good response, we'll just be done with it. + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - var indexName = this.indexName; - var indexes = this.service.indexes(); + it("Callback#Index submit event", function (done) { + var message = "Hello World -- " + getNextId(); + var sourcetype = "sdk-tests"; - Async.chain( - [ + var indexName = this.indexName; + var indexes = this.service.indexes(); + Async.chain([ function (done) { indexes.fetch(done); }, @@ -374,10 +408,11 @@ exports.setup = function (svc, loggedOutSvc) { var index = indexes.item(indexName); assert.ok(index); assert.strictEqual(index.name, indexName); - index.submitEvent(message, done); + index.submitEvent(message, { sourcetype: sourcetype }, done); }, function (eventInfo, index, done) { assert.ok(eventInfo); + assert.strictEqual(eventInfo.sourcetype, sourcetype); assert.strictEqual(eventInfo.bytes, message.length); assert.strictEqual(eventInfo.index, indexName); @@ -387,48 +422,14 @@ exports.setup = function (svc, loggedOutSvc) { done(); } ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Index submit event": function (done) { - var message = "Hello World -- " + getNextId(); - var sourcetype = "sdk-tests"; - - var indexName = this.indexName; - var indexes = this.service.indexes(); - Async.chain([ - function (done) { - indexes.fetch(done); - }, - function (indexes, done) { - var index = indexes.item(indexName); - assert.ok(index); - assert.strictEqual(index.name, indexName); - index.submitEvent(message, { sourcetype: sourcetype }, done); - }, - function (eventInfo, index, done) { - assert.ok(eventInfo); - assert.strictEqual(eventInfo.sourcetype, sourcetype); - assert.strictEqual(eventInfo.bytes, message.length); - assert.strictEqual(eventInfo.index, indexName); - - // We could poll to make sure the index has eaten up the event, - // but unfortunately this can take an unbounded amount of time. - // As such, since we got a good response, we'll just be done with it. - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - } - }; + function (err) { + assert.ok(!err); + done(); + } + ); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/job.js b/tests_spike/service_tests/job.js index 1fe303a0a..0af5fb3e1 100644 --- a/tests_spike/service_tests/job.js +++ b/tests_spike/service_tests/job.js @@ -13,923 +13,899 @@ var getNextId = function () { }; exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. - // - // "Callback#Create+abort job": function(done) { - // var service = this.service; - // Async.chain([ - // function(done){ - // var app_name = path.join(process.env.SPLUNK_HOME, ('/etc/apps/sdk-app-collection/build/sleep_command.tar')); - // // Fix path on Windows if $SPLUNK_HOME contains a space (ex: C:/Program%20Files/Splunk) - // app_name = app_name.replace("%20", " "); - // service.post("apps/appinstall", {update:1, name:app_name}, done); - // }, - // function(done){ - // var sid = getNextId(); - // var options = {id: sid}; - // var jobs = service.jobs({app: "sdk-app-collection"}); - // var req = jobs.oneshotSearch('search index=_internal | head 1 | sleep 10', options, function(err, job) { - // assert.ok(err); - // assert.ok(!job); - // assert.strictEqual(err.error, "abort"); - // done(); - // }); - - // Async.sleep(1000, function(){ - // req.abort(); - // }); - // } - // ], - // function(err){ - // assert.ok(!err); - // done(); - // }); - // }, - - "Callback#Create+cancel job": function (done) { - var sid = getNextId(); - this.service.jobs().search('search index=_internal | head 1', { id: sid }, function (err, job) { - assert.ok(job); - assert.strictEqual(job.sid, sid); - - job.cancel(function () { - done(); + return ( + describe("Job tests", function (done) { + beforeEach(function (done) { + this.service = svc; + done(); + }); + + // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. + // + // it("Callback#Create+abort job", function(done) { + // var service = this.service; + // Async.chain([ + // function(done){ + // var app_name = path.join(process.env.SPLUNK_HOME, ('/etc/apps/sdk-app-collection/build/sleep_command.tar')); + // // Fix path on Windows if $SPLUNK_HOME contains a space (ex: C:/Program%20Files/Splunk) + // app_name = app_name.replace("%20", " "); + // service.post("apps/appinstall", {update:1, name:app_name}, done); + // }, + // function(done){ + // var sid = getNextId(); + // var options = {id: sid}; + // var jobs = service.jobs({app: "sdk-app-collection"}); + // var req = jobs.oneshotSearch('search index=_internal | head 1 | sleep 10', options, function(err, job) { + // assert.ok(err); + // assert.ok(!job); + // assert.strictEqual(err.error, "abort"); + // done(); + // }); + + // Async.sleep(1000, function(){ + // req.abort(); + // }); + // } + // ], + // function(err){ + // assert.ok(!err); + // done(); + // }); + // }); + + it("Callback#Create+cancel job", function (done) { + var sid = getNextId(); + this.service.jobs().search('search index=_internal | head 1', { id: sid }, function (err, job) { + assert.ok(job); + assert.strictEqual(job.sid, sid); + + job.cancel(function () { + done(); + }); }); }); - }, - "Callback#Create job error": function (done) { - var sid = getNextId(); - this.service.jobs().search({ search: 'index=_internal | head 1', id: sid }, function (err) { - assert.ok(!!err); - done(); + it("Callback#Create job error", function (done) { + var sid = getNextId(); + this.service.jobs().search({ search: 'index=_internal | head 1', id: sid }, function (err) { + assert.ok(!!err); + done(); + }); }); - }, - "Callback#List jobs": function (done) { - this.service.jobs().fetch(function (err, jobs) { - assert.ok(!err); - assert.ok(jobs); + it("Callback#List jobs", function (done) { + this.service.jobs().fetch(function (err, jobs) { + assert.ok(!err); + assert.ok(jobs); - var jobsList = jobs.list(); - assert.ok(jobsList.length > 0); + var jobsList = jobs.list(); + assert.ok(jobsList.length > 0); - for (var i = 0; i < jobsList.length; i++) { - assert.ok(jobsList[i]); - } + for (var i = 0; i < jobsList.length; i++) { + assert.ok(jobsList[i]); + } - done(); + done(); + }); }); - }, - - "Callback#Contains job": function (done) { - var that = this; - var sid = getNextId(); - var jobs = this.service.jobs(); - jobs.search('search index=_internal | head 1', { id: sid }, function (err, job) { - assert.ok(!err); - assert.ok(job); - assert.strictEqual(job.sid, sid); + it("Callback#Contains job", function (done) { + var that = this; + var sid = getNextId(); + var jobs = this.service.jobs(); - jobs.fetch(function (err, jobs) { + jobs.search('search index=_internal | head 1', { id: sid }, function (err, job) { assert.ok(!err); - var job = jobs.item(sid); assert.ok(job); + assert.strictEqual(job.sid, sid); - job.cancel(function () { - done(); + jobs.fetch(function (err, jobs) { + assert.ok(!err); + var job = jobs.item(sid); + assert.ok(job); + + job.cancel(function () { + done(); + }); }); }); }); - }, - - "Callback#job results": function (done) { - var sid = getNextId(); - var service = this.service; - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1 | stats count', { id: sid }, done); - }, - function (job, done) { - assert.strictEqual(job.sid, sid); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - job.results({}, done); - }, - function (results, job, done) { - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.fields.length, 1); - assert.strictEqual(results.fields[0], "count"); - assert.strictEqual(results.rows[0][0], "1"); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#job events": function (done) { - var sid = getNextId(); - var service = this.service; - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); - }, - function (job, done) { - assert.strictEqual(job.sid, sid); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - job.events({}, done); - }, - function (results, job, done) { - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.fields.length, results.rows[0].length); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#job results preview": function (done) { - var sid = getNextId(); - var service = this.service; - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1 | stats count', { id: sid }, done); - }, - function (job, done) { - assert.strictEqual(job.sid, sid); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - job.preview({}, done); - }, - function (results, job, done) { - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.fields.length, 1); - assert.strictEqual(results.fields[0], "count"); - assert.strictEqual(results.rows[0][0], "1"); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#job results iterator": function (done) { - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 10', {}, done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - var iterator = job.iterator("results", { pagesize: 4 }); - var hasMore = true; - var numElements = 0; - var pageSizes = []; - Async.whilst( - function () { return hasMore; }, - function (nextIteration) { - iterator.next(function (err, results, _hasMore) { - if (err) { - nextIteration(err); - return; - } - hasMore = _hasMore; - if (hasMore) { - pageSizes.push(results.rows.length); - } - nextIteration(); - }); - }, - function (err) { - assert.deepStrictEqual(pageSizes, [4, 4, 2]); - done(err); - } - ); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. - // - // - // "Callback#Enable + disable preview": function(done) { - // var that = this; - // var sid = getNextId(); - - // var service = this.service.specialize("nobody", "sdk-app-collection"); - - // Async.chain([ - // function(done) { - // service.jobs().search('search index=_internal | head 1 | sleep 60', {id: sid}, done); - // }, - // function(job, done) { - // job.enablePreview(done); - - // }, - // function(job, done) { - // job.disablePreview(done); - // }, - // function(job, done) { - // job.cancel(done); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - - - // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. - // - // - // "Callback#Pause + unpause + finalize preview": function(done) { - // var that = this; - // var sid = getNextId(); - - // var service = this.service.specialize("nobody", "sdk-app-collection"); - - // Async.chain([ - // function(done) { - // service.jobs().search('search index=_internal | head 1 | sleep 5', {id: sid}, done); - // }, - // function(job, done) { - // job.pause(done); - // }, - // function(job, done) { - // tutils.pollUntil( - // job, - // function(j) { - // return j.properties()["isPaused"]; - // }, - // 10, - // done - // ); - // }, - // function(job, done) { - // assert.ok(job.properties()["isPaused"]); - // job.unpause(done); - // }, - // function(job, done) { - // tutils.pollUntil( - // job, - // function(j) { - // return !j.properties()["isPaused"]; - // }, - // 10, - // done - // ); - // }, - // function(job, done) { - // assert.ok(!job.properties()["isPaused"]); - // job.finalize(done); - // }, - // function(job, done) { - // job.cancel(done); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - - "Callback#Set TTL": function (done) { - var sid = getNextId(); - var originalTTL = 0; - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); - }, - function (job, done) { - job.fetch(done); - }, - function (job, done) { - var ttl = job.properties()["ttl"]; - originalTTL = ttl; - - job.setTTL(ttl * 2, done); - }, - function (job, done) { - job.fetch(done); - }, - function (job, done) { - var ttl = job.properties()["ttl"]; - assert.ok(ttl > originalTTL); - assert.ok(ttl <= (originalTTL * 2)); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. - // - // - // "Callback#Set priority": function(done) { - // var sid = getNextId(); - // var originalPriority = 0; - // var that = this; - - // var service = this.service.specialize("nobody", "sdk-app-collection"); - - // Async.chain([ - // function(done) { - // service.jobs().search('search index=_internal | head 1 | sleep 5', {id: sid}, done); - // }, - // function(job, done) { - // job.track({}, { - // ready: function(job) { - // done(null, job); - // } - // }); - // }, - // function(job, done) { - // var priority = job.properties()["priority"]; - // assert.ok(priority, 5); - // job.setPriority(priority + 1, done); - // }, - // function(job, done) { - // job.fetch(done); - // }, - // function(job, done) { - // job.cancel(done); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - - "Callback#Search log": function (done) { - var sid = getNextId(); - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1', { id: sid, exec_mode: "blocking" }, done); - }, - function (job, done) { - job.searchlog(done); - }, - function (log, job, done) { - assert.ok(job); - assert.ok(log); - assert.ok(log.length > 0); - assert.ok(log.split("\r\n").length > 0); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Search summary": function (done) { - var sid = getNextId(); - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search( - 'search index=_internal | head 1 | eval foo="bar" | fields foo', - { - id: sid, - status_buckets: 300, - rf: ["foo"] - }, - done); - }, - function (job, done) { - // Let's sleep for 2 second so - // we let the server catch up - Async.sleep(2000, function () { - job.summary({}, done); - }); - }, - function (summary, job, done) { - assert.ok(job); - assert.ok(summary); - assert.strictEqual(summary.event_count, 1); - assert.strictEqual(summary.fields.foo.count, 1); - assert.strictEqual(summary.fields.foo.distinct_count, 1); - assert.ok(summary.fields.foo.is_exact, 1); - assert.strictEqual(summary.fields.foo.modes.length, 1); - assert.strictEqual(summary.fields.foo.modes[0].count, 1); - assert.strictEqual(summary.fields.foo.modes[0].value, "bar"); - assert.ok(summary.fields.foo.modes[0].is_exact); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Search timeline": function (done) { - var sid = getNextId(); - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search( - 'search index=_internal | head 1 | eval foo="bar" | fields foo', - { - id: sid, - status_buckets: 300, - rf: ["foo"], - exec_mode: "blocking" - }, - done); - }, - function (job, done) { - job.timeline({}, done); - }, - function (timeline, job, done) { - assert.ok(job); - assert.ok(timeline); - assert.strictEqual(timeline.buckets.length, 1); - assert.strictEqual(timeline.event_count, 1); - assert.strictEqual(timeline.buckets[0].available_count, 1); - assert.strictEqual(timeline.buckets[0].duration, 0.001); - assert.strictEqual(timeline.buckets[0].earliest_time_offset, timeline.buckets[0].latest_time_offset); - assert.strictEqual(timeline.buckets[0].total_count, 1); - assert.ok(timeline.buckets[0].is_finalized); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Touch": function (done) { - var sid = getNextId(); - var that = this; - var originalTime = ""; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); - }, - function (job, done) { - job.fetch(done); - }, - function (job, done) { - assert.ok(job); - originalTime = job.properties().updated; - Async.sleep(1200, function () { job.touch(done); }); - }, - function (job, done) { - job.fetch(done); - }, - function (job, done) { - assert.ok(originalTime !== job.updated()); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create failure": function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - - var jobs = this.service.jobs(); - assert.throws(function () { jobs.create({ search: originalSearch, name: name, exec_mode: "oneshot" }, function () { }); }); - done(); - }, - - "Callback#Create fails with no search string": function (done) { - var jobs = this.service.jobs(); - jobs.create( - "", {}, - function (err) { - assert.ok(err); - done(); - } - ); - }, - - "Callback#Oneshot search": function (done) { - var sid = getNextId(); - var that = this; - var originalTime = ""; - - Async.chain([ - function (done) { - that.service.jobs().oneshotSearch('search index=_internal | head 1 | stats count', { id: sid }, done); - }, - function (results, done) { - assert.ok(results); - assert.ok(results.fields); - assert.strictEqual(results.fields.length, 1); - assert.strictEqual(results.fields[0], "count"); - assert.ok(results.rows); - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.rows[0].length, 1); - assert.strictEqual(results.rows[0][0], "1"); + it("Callback#job results", function (done) { + var sid = getNextId(); + var service = this.service; + var that = this; - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Oneshot search with no results": function (done) { - var sid = getNextId(); - var that = this; - var originalTime = ""; - - Async.chain([ - function (done) { - var query = 'search index=history MUST_NOT_EXISTABCDEF'; - that.service.jobs().oneshotSearch(query, { id: sid }, done); - }, - function (results, done) { - assert.ok(results); - assert.strictEqual(results.fields.length, 0); - assert.strictEqual(results.rows.length, 0); - assert.ok(!results.preview); + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1 | stats count', { id: sid }, done); + }, + function (job, done) { + assert.strictEqual(job.sid, sid); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + job.results({}, done); + }, + function (results, job, done) { + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.fields.length, 1); + assert.strictEqual(results.fields[0], "count"); + assert.strictEqual(results.rows[0][0], "1"); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - // "Callback#Service oneshot search": function(done) { - // var sid = getNextId(); - // var that = this; - // var namespace = {owner: "admin", app: "search"}; - // var splunkVersion = 6.1; // Default to pre-6.2 version - // var originalLoggerLevel = "DEBUG"; - - // Async.chain([ - // function(done) { - // // If running on Splunk 6.2+, first set the search logger level to DEBUG - // Async.chain([ - // function(done1) { - // that.service.serverInfo(done1); - // }, - // function(info, done1) { - // splunkVersion = parseFloat(info.properties().version); - // if (splunkVersion < 6.2) { - // done(); // Exit the inner Async.chain - // } - // else { - // done1(); - // } - // }, - // function(done1) { - // that.service.configurations({owner: "admin", app: "search"}).fetch(done1); - // }, - // function(confs, done1) { - // try { - // confs.item("limits").fetch(done1); - // } - // catch(e) { - // done1(e); - // } - // }, - // function(conf, done1) { - // var searchInfo = conf.item("search_info"); - // // Save this so it can be restored later - // originalLoggerLevel = searchInfo.properties()["infocsv_log_level"]; - // searchInfo.update({"infocsv_log_level": "DEBUG"}, done1); - // }, - // function(conf, done1) { - // assert.strictEqual("DEBUG", conf.properties()["infocsv_log_level"]); - // done1(); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - // function(done) { - // that.service.oneshotSearch('search index=_internal | head 1 | stats count', {id: sid}, namespace, done); - // }, - // function(results, done) { - // assert.ok(results); - // assert.ok(results.fields); - // assert.strictEqual(results.fields.length, 1); - // assert.strictEqual(results.fields[0], "count"); - // assert.ok(results.rows); - // assert.strictEqual(results.rows.length, 1); - // assert.strictEqual(results.rows[0].length, 1); - // assert.strictEqual(results.rows[0][0], "1"); - // assert.ok(results.messages[1].text.indexOf('owner="admin"')); - // assert.ok(results.messages[1].text.indexOf('app="search"')); - - // done(); - // }, - // function(done) { - // Async.chain([ - // function(done1) { - // if (splunkVersion < 6.2) { - // done(); // Exit the inner Async.chain - // } - // else { - // done1(); - // } - // }, - // function(done1) { - // that.service.configurations({owner: "admin", app: "search"}).fetch(done1); - // }, - // function(confs, done1) { - // try { - // confs.item("limits").fetch(done1); - // } - // catch(e) { - // done1(e); - // } - // }, - // function(conf, done1) { - // var searchInfo = conf.item("search_info"); - // // Restore the logger level from before - // searchInfo.update({"infocsv_log_level": originalLoggerLevel}, done1); - // }, - // function(conf, done1) { - // assert.strictEqual(originalLoggerLevel, conf.properties()["infocsv_log_level"]); - // done1(); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - - "Callback#Service search": function (done) { - var sid = getNextId(); - var service = this.service; - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { - that.service.search('search index=_internal | head 1 | stats count', { id: sid }, namespace, done); - }, - function (job, done) { - assert.strictEqual(job.sid, sid); - assert.strictEqual(job.namespace, namespace); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - job.results({}, done); - }, - function (results, job, done) { - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.fields.length, 1); - assert.strictEqual(results.fields[0], "count"); - assert.strictEqual(results.rows[0][0], "1"); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, + it("Callback#job events", function (done) { + var sid = getNextId(); + var service = this.service; + var that = this; - "Callback#Wait until job done": function (done) { - this.service.search('search index=_internal | head 1000', {}, function (err, job) { - assert.ok(!err); + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); + }, + function (job, done) { + assert.strictEqual(job.sid, sid); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + job.events({}, done); + }, + function (results, job, done) { + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.fields.length, results.rows[0].length); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - var numReadyEvents = 0; - var numProgressEvents = 0; - job.track({ period: 200 }, { - ready: function (job) { - assert.ok(job); + it("Callback#job results preview", function (done) { + var sid = getNextId(); + var service = this.service; + var that = this; - numReadyEvents++; + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1 | stats count', { id: sid }, done); }, - progress: function (job) { - assert.ok(job); - - numProgressEvents++; + function (job, done) { + assert.strictEqual(job.sid, sid); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); }, - done: function (job) { - assert.ok(job); + function (job, done) { + job.preview({}, done); + }, + function (results, job, done) { + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.fields.length, 1); + assert.strictEqual(results.fields[0], "count"); + assert.strictEqual(results.rows[0][0], "1"); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - assert.ok(numReadyEvents === 1); // all done jobs must have become ready - assert.ok(numProgressEvents >= 1); // a job that becomes ready has progress + it("Callback#job results iterator", function (done) { + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 10', {}, done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + var iterator = job.iterator("results", { pagesize: 4 }); + var hasMore = true; + var numElements = 0; + var pageSizes = []; + Async.whilst( + function () { return hasMore; }, + function (nextIteration) { + iterator.next(function (err, results, _hasMore) { + if (err) { + nextIteration(err); + return; + } + + hasMore = _hasMore; + if (hasMore) { + pageSizes.push(results.rows.length); + } + nextIteration(); + }); + }, + function (err) { + assert.deepStrictEqual(pageSizes, [4, 4, 2]); + done(err); + } + ); + } + ], + function (err) { + assert.ok(!err); done(); + } + ); + }); + + // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. + // + // + // it("Callback#Enable + disable preview", function(done) { + // var that = this; + // var sid = getNextId(); + + // var service = this.service.specialize("nobody", "sdk-app-collection"); + + // Async.chain([ + // function(done) { + // service.jobs().search('search index=_internal | head 1 | sleep 60', {id: sid}, done); + // }, + // function(job, done) { + // job.enablePreview(done); + + // }, + // function(job, done) { + // job.disablePreview(done); + // }, + // function(job, done) { + // job.cancel(done); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }); + + + // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. + // + // + // it("Callback#Pause + unpause + finalize preview", function(done) { + // var that = this; + // var sid = getNextId(); + + // var service = this.service.specialize("nobody", "sdk-app-collection"); + + // Async.chain([ + // function(done) { + // service.jobs().search('search index=_internal | head 1 | sleep 5', {id: sid}, done); + // }, + // function(job, done) { + // job.pause(done); + // }, + // function(job, done) { + // tutils.pollUntil( + // job, + // function(j) { + // return j.properties()["isPaused"]; + // }, + // 10, + // done + // ); + // }, + // function(job, done) { + // assert.ok(job.properties()["isPaused"]); + // job.unpause(done); + // }, + // function(job, done) { + // tutils.pollUntil( + // job, + // function(j) { + // return !j.properties()["isPaused"]; + // }, + // 10, + // done + // ); + // }, + // function(job, done) { + // assert.ok(!job.properties()["isPaused"]); + // job.finalize(done); + // }, + // function(job, done) { + // job.cancel(done); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }); + + it("Callback#Set TTL", function (done) { + var sid = getNextId(); + var originalTTL = 0; + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); }, - failed: function (job) { - assert.ok(job); + function (job, done) { + job.fetch(done); + }, + function (job, done) { + var ttl = job.properties()["ttl"]; + originalTTL = ttl; - assert.ok(false, "Job failed unexpectedly."); - done(); + job.setTTL(ttl * 2, done); }, - error: function (err) { - assert.ok(err); + function (job, done) { + job.fetch(done); + }, + function (job, done) { + var ttl = job.properties()["ttl"]; + assert.ok(ttl > originalTTL); + assert.ok(ttl <= (originalTTL * 2)); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - assert.ok(false, "Error while tracking job."); + // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. + // + // + // it("Callback#Set priority", function(done) { + // var sid = getNextId(); + // var originalPriority = 0; + // var that = this; + + // var service = this.service.specialize("nobody", "sdk-app-collection"); + + // Async.chain([ + // function(done) { + // service.jobs().search('search index=_internal | head 1 | sleep 5', {id: sid}, done); + // }, + // function(job, done) { + // job.track({}, { + // ready: function(job) { + // done(null, job); + // } + // }); + // }, + // function(job, done) { + // var priority = job.properties()["priority"]; + // assert.ok(priority, 5); + // job.setPriority(priority + 1, done); + // }, + // function(job, done) { + // job.fetch(done); + // }, + // function(job, done) { + // job.cancel(done); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }); + + it("Callback#Search log", function (done) { + var sid = getNextId(); + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1', { id: sid, exec_mode: "blocking" }, done); + }, + function (job, done) { + job.searchlog(done); + }, + function (log, job, done) { + assert.ok(job); + assert.ok(log); + assert.ok(log.length > 0); + assert.ok(log.split("\r\n").length > 0); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); done(); } - }); + ); }); - }, - "Callback#Wait until job failed": function (done) { - this.service.search('search index=_internal | head bogusarg', {}, function (err, job) { - if (err) { - assert.ok(!err); - done(); - return; - } + it("Callback#Search summary", function (done) { + var sid = getNextId(); + var that = this; - var numReadyEvents = 0; - var numProgressEvents = 0; - job.track({ period: 200 }, { - ready: function (job) { + Async.chain([ + function (done) { + that.service.jobs().search( + 'search index=_internal | head 1 | eval foo="bar" | fields foo', + { + id: sid, + status_buckets: 300, + rf: ["foo"] + }, + done); + }, + function (job, done) { + // Let's sleep for 2 second so + // we let the server catch up + Async.sleep(2000, function () { + job.summary({}, done); + }); + }, + function (summary, job, done) { assert.ok(job); + assert.ok(summary); + assert.strictEqual(summary.event_count, 1); + assert.strictEqual(summary.fields.foo.count, 1); + assert.strictEqual(summary.fields.foo.distinct_count, 1); + assert.ok(summary.fields.foo.is_exact, 1); + assert.strictEqual(summary.fields.foo.modes.length, 1); + assert.strictEqual(summary.fields.foo.modes[0].count, 1); + assert.strictEqual(summary.fields.foo.modes[0].value, "bar"); + assert.ok(summary.fields.foo.modes[0].is_exact); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - numReadyEvents++; + it("Callback#Search timeline", function (done) { + var sid = getNextId(); + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search( + 'search index=_internal | head 1 | eval foo="bar" | fields foo', + { + id: sid, + status_buckets: 300, + rf: ["foo"], + exec_mode: "blocking" + }, + done); + }, + function (job, done) { + job.timeline({}, done); }, - progress: function (job) { + function (timeline, job, done) { assert.ok(job); + assert.ok(timeline); + assert.strictEqual(timeline.buckets.length, 1); + assert.strictEqual(timeline.event_count, 1); + assert.strictEqual(timeline.buckets[0].available_count, 1); + assert.strictEqual(timeline.buckets[0].duration, 0.001); + assert.strictEqual(timeline.buckets[0].earliest_time_offset, timeline.buckets[0].latest_time_offset); + assert.strictEqual(timeline.buckets[0].total_count, 1); + assert.ok(timeline.buckets[0].is_finalized); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - numProgressEvents++; + it("Callback#Touch", function (done) { + var sid = getNextId(); + var that = this; + var originalTime = ""; + + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); + }, + function (job, done) { + job.fetch(done); }, - done: function (job) { + function (job, done) { assert.ok(job); + originalTime = job.properties().updated; + Async.sleep(1200, function () { job.touch(done); }); + }, + function (job, done) { + job.fetch(done); + }, + function (job, done) { + assert.ok(originalTime !== job.updated()); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - assert.ok(false, "Job became done unexpectedly."); + it("Callback#Create failure", function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + + var jobs = this.service.jobs(); + assert.throws(function () { jobs.create({ search: originalSearch, name: name, exec_mode: "oneshot" }, function () { }); }); + done(); + }); + + it("Callback#Create fails with no search string", function (done) { + var jobs = this.service.jobs(); + jobs.create( + "", {}, + function (err) { + assert.ok(err); done(); + } + ); + }); + + it("Callback#Oneshot search", function (done) { + var sid = getNextId(); + var that = this; + var originalTime = ""; + + Async.chain([ + function (done) { + that.service.jobs().oneshotSearch('search index=_internal | head 1 | stats count', { id: sid }, done); }, - failed: function (job) { - assert.ok(job); + function (results, done) { + assert.ok(results); + assert.ok(results.fields); + assert.strictEqual(results.fields.length, 1); + assert.strictEqual(results.fields[0], "count"); + assert.ok(results.rows); + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.rows[0].length, 1); + assert.strictEqual(results.rows[0][0], "1"); - assert.ok(numReadyEvents === 1); // even failed jobs become ready - assert.ok(numProgressEvents >= 1); // a job that becomes ready has progress done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("Callback#Oneshot search with no results", function (done) { + var sid = getNextId(); + var that = this; + var originalTime = ""; + + Async.chain([ + function (done) { + var query = 'search index=history MUST_NOT_EXISTABCDEF'; + that.service.jobs().oneshotSearch(query, { id: sid }, done); }, - error: function (err) { - assert.ok(err); + function (results, done) { + assert.ok(results); + assert.strictEqual(results.fields.length, 0); + assert.strictEqual(results.rows.length, 0); + assert.ok(!results.preview); - assert.ok(false, "Error while tracking job."); done(); } - }); + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + // it("Callback#Service oneshot search", function(done) { + // var sid = getNextId(); + // var that = this; + // var namespace = {owner: "admin", app: "search"}; + // var splunkVersion = 6.1; // Default to pre-6.2 version + // var originalLoggerLevel = "DEBUG"; + + // Async.chain([ + // function(done) { + // // If running on Splunk 6.2+, first set the search logger level to DEBUG + // Async.chain([ + // function(done1) { + // that.service.serverInfo(done1); + // }, + // function(info, done1) { + // splunkVersion = parseFloat(info.properties().version); + // if (splunkVersion < 6.2) { + // done(); // Exit the inner Async.chain + // } + // else { + // done1(); + // } + // }, + // function(done1) { + // that.service.configurations({owner: "admin", app: "search"}).fetch(done1); + // }, + // function(confs, done1) { + // try { + // confs.item("limits").fetch(done1); + // } + // catch(e) { + // done1(e); + // } + // }, + // function(conf, done1) { + // var searchInfo = conf.item("search_info"); + // // Save this so it can be restored later + // originalLoggerLevel = searchInfo.properties()["infocsv_log_level"]; + // searchInfo.update({"infocsv_log_level": "DEBUG"}, done1); + // }, + // function(conf, done1) { + // assert.strictEqual("DEBUG", conf.properties()["infocsv_log_level"]); + // done1(); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }, + // function(done) { + // that.service.oneshotSearch('search index=_internal | head 1 | stats count', {id: sid}, namespace, done); + // }, + // function(results, done) { + // assert.ok(results); + // assert.ok(results.fields); + // assert.strictEqual(results.fields.length, 1); + // assert.strictEqual(results.fields[0], "count"); + // assert.ok(results.rows); + // assert.strictEqual(results.rows.length, 1); + // assert.strictEqual(results.rows[0].length, 1); + // assert.strictEqual(results.rows[0][0], "1"); + // assert.ok(results.messages[1].text.indexOf('owner="admin"')); + // assert.ok(results.messages[1].text.indexOf('app="search"')); + + // done(); + // }, + // function(done) { + // Async.chain([ + // function(done1) { + // if (splunkVersion < 6.2) { + // done(); // Exit the inner Async.chain + // } + // else { + // done1(); + // } + // }, + // function(done1) { + // that.service.configurations({owner: "admin", app: "search"}).fetch(done1); + // }, + // function(confs, done1) { + // try { + // confs.item("limits").fetch(done1); + // } + // catch(e) { + // done1(e); + // } + // }, + // function(conf, done1) { + // var searchInfo = conf.item("search_info"); + // // Restore the logger level from before + // searchInfo.update({"infocsv_log_level": originalLoggerLevel}, done1); + // }, + // function(conf, done1) { + // assert.strictEqual(originalLoggerLevel, conf.properties()["infocsv_log_level"]); + // done1(); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }); + + it("Callback#Service search", function (done) { + var sid = getNextId(); + var service = this.service; + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { + that.service.search('search index=_internal | head 1 | stats count', { id: sid }, namespace, done); + }, + function (job, done) { + assert.strictEqual(job.sid, sid); + assert.strictEqual(job.namespace, namespace); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + job.results({}, done); + }, + function (results, job, done) { + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.fields.length, 1); + assert.strictEqual(results.fields[0], "count"); + assert.strictEqual(results.rows[0][0], "1"); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); }); - }, - "Callback#track() with default params and one function": function (done) { - this.service.search('search index=_internal | head 1', {}, function (err, job) { - if (err) { + it("Callback#Wait until job done", function (done) { + this.service.search('search index=_internal | head 1000', {}, function (err, job) { assert.ok(!err); - done(); - return; - } - job.track({}, function (job) { - assert.ok(job); - done(); + var numReadyEvents = 0; + var numProgressEvents = 0; + job.track({ period: 200 }, { + ready: function (job) { + assert.ok(job); + + numReadyEvents++; + }, + progress: function (job) { + assert.ok(job); + + numProgressEvents++; + }, + done: function (job) { + assert.ok(job); + + assert.ok(numReadyEvents === 1); // all done jobs must have become ready + assert.ok(numProgressEvents >= 1); // a job that becomes ready has progress + done(); + }, + failed: function (job) { + assert.ok(job); + + assert.ok(false, "Job failed unexpectedly."); + done(); + }, + error: function (err) { + assert.ok(err); + + assert.ok(false, "Error while tracking job."); + done(); + } + }); }); }); - }, - "Callback#track() should stop polling if only the ready callback is specified": function (done) { - this.service.search('search index=_internal | head 1', {}, function (err, job) { - if (err) { - assert.ok(!err); - done(); - return; - } + it("Callback#Wait until job failed", function (done) { + this.service.search('search index=_internal | head bogusarg', {}, function (err, job) { + if (err) { + assert.ok(!err); + done(); + return; + } - job.track({}, { - ready: function (job) { - assert.ok(job); - }, + var numReadyEvents = 0; + var numProgressEvents = 0; + job.track({ period: 200 }, { + ready: function (job) { + assert.ok(job); + + numReadyEvents++; + }, + progress: function (job) { + assert.ok(job); + + numProgressEvents++; + }, + done: function (job) { + assert.ok(job); + + assert.ok(false, "Job became done unexpectedly."); + done(); + }, + failed: function (job) { + assert.ok(job); + + assert.ok(numReadyEvents === 1); // even failed jobs become ready + assert.ok(numProgressEvents >= 1); // a job that becomes ready has progress + done(); + }, + error: function (err) { + assert.ok(err); + + assert.ok(false, "Error while tracking job."); + done(); + } + }); + }); + }); - _stoppedAfterReady: function (job) { + it("Callback#track() with default params and one function", function (done) { + this.service.search('search index=_internal | head 1', {}, function (err, job) { + if (err) { + assert.ok(!err); done(); + return; } + + job.track({}, function (job) { + assert.ok(job); + done(); + }); }); }); - }, - - "Callback#track() a job that is not immediately ready": function (done) { - /*jshint loopfunc:true */ - var numJobs = 20; - var numJobsLeft = numJobs; - var gotJobNotImmediatelyReady = false; - for (var i = 0; i < numJobs; i++) { - this.service.search('search index=_internal | head 10000', {}, function (err, job) { + + it("Callback#track() should stop polling if only the ready callback is specified", function (done) { + this.service.search('search index=_internal | head 1', {}, function (err, job) { if (err) { assert.ok(!err); done(); @@ -937,54 +913,80 @@ exports.setup = function (svc) { } job.track({}, { - _preready: function (job) { - gotJobNotImmediatelyReady = true; - }, - ready: function (job) { - numJobsLeft--; + assert.ok(job); + }, - if (numJobsLeft === 0) { - if (!gotJobNotImmediatelyReady) { - splunkjs.Logger.error("", "WARNING: Couldn't test code path in track() where job wasn't ready immediately."); - } - done(); - } + _stoppedAfterReady: function (job) { + done(); } }); }); - } - }, + }); - "Callback#Service.getJob() works": function (done) { - var that = this; - var sidsMatch = false; - this.service.search('search index=_internal | head 1', {}, function (err, job) { - if (err) { - assert.ok(!err); - done(); - return; + it("Callback#track() a job that is not immediately ready", function (done) { + /*jshint loopfunc:true */ + var numJobs = 20; + var numJobsLeft = numJobs; + var gotJobNotImmediatelyReady = false; + for (var i = 0; i < numJobs; i++) { + this.service.search('search index=_internal | head 10000', {}, function (err, job) { + if (err) { + assert.ok(!err); + done(); + return; + } + + job.track({}, { + _preready: function (job) { + gotJobNotImmediatelyReady = true; + }, + + ready: function (job) { + numJobsLeft--; + + if (numJobsLeft === 0) { + if (!gotJobNotImmediatelyReady) { + splunkjs.Logger.error("", "WARNING: Couldn't test code path in track() where job wasn't ready immediately."); + } + done(); + } + } + }); + }); } - var sid = job.sid; - return Async.chain([ - function (done) { - that.service.getJob(sid, done); - }, - function (innerJob, done) { - assert.strictEqual(sid, innerJob.sid); - sidsMatch = sid === innerJob.sid; - done(); - } - ], - function (err) { + }); + + it("Callback#Service.getJob() works", function (done) { + var that = this; + var sidsMatch = false; + this.service.search('search index=_internal | head 1', {}, function (err, job) { + if (err) { assert.ok(!err); - assert.ok(sidsMatch); done(); + return; } - ); + var sid = job.sid; + return Async.chain([ + function (done) { + that.service.getJob(sid, done); + }, + function (innerJob, done) { + assert.strictEqual(sid, innerJob.sid); + sidsMatch = sid === innerJob.sid; + done(); + } + ], + function (err) { + assert.ok(!err); + assert.ok(sidsMatch); + done(); + } + ); + }); }); - } - }; + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/service_tests/namespace.js b/tests_spike/service_tests/namespace.js index 54a5846f2..8f456f5c9 100644 --- a/tests_spike/service_tests/namespace.js +++ b/tests_spike/service_tests/namespace.js @@ -12,245 +12,247 @@ var getNextId = function () { }; exports.setup = function (svc) { - return { - beforeEach: function (finished) { - this.service = svc; - var that = this; - - var appName1 = "jssdk_testapp_" + getNextId(); - var appName2 = "jssdk_testapp_" + getNextId(); - - var userName1 = "jssdk_testuser_" + getNextId(); - var userName2 = "jssdk_testuser_" + getNextId(); - - var apps = this.service.apps(); - var users = this.service.users(); - - this.namespace11 = { owner: userName1, app: appName1 }; - this.namespace12 = { owner: userName1, app: appName2 }; - this.namespace21 = { owner: userName2, app: appName1 }; - this.namespace22 = { owner: userName2, app: appName2 }; - - Async.chain([ - function (done) { - apps.create({ name: appName1 }, done); - }, - function (app1, done) { - that.app1 = app1; - that.appName1 = appName1; - apps.create({ name: appName2 }, done); - }, - function (app2, done) { - that.app2 = app2; - that.appName2 = appName2; - users.create({ name: userName1, password: "abcdefg!", roles: ["user"] }, done); - }, - function (user1, done) { - that.user1 = user1; - that.userName1 = userName1; - users.create({ name: userName2, password: "abcdefg!", roles: ["user"] }, done); - }, - function (user2, done) { - that.user2 = user2; - that.userName2 = userName2; - - done(); - } - ], - function (err) { - finished(err); - } - ); - }, - - "Callback#Namespace protection": function (done) { - var searchName = "jssdk_search_" + getNextId(); - var search = "search *"; - var service = this.service; - var savedSearches11 = service.savedSearches(this.namespace11); - var savedSearches21 = service.savedSearches(this.namespace21); - - Async.chain([ - function (done) { - // Create the saved search only in the 11 namespace - savedSearches11.create({ name: searchName, search: search }, done); - }, - function (savedSearch, done) { - // Refresh the 11 saved searches - savedSearches11.fetch(done); - }, - function (savedSearches, done) { - // Refresh the 21 saved searches - savedSearches21.fetch(done); - }, - function (savedSearches, done) { - var entity11 = savedSearches11.item(searchName); - var entity21 = savedSearches21.item(searchName); - - // Make sure the saved search exists in the 11 namespace - assert.ok(entity11); - assert.strictEqual(entity11.name, searchName); - assert.strictEqual(entity11.properties().search, search); - - // Make sure the saved search doesn't exist in the 11 namespace - assert.ok(!entity21); - done(); - } - ], - function (err) { - assert.ok(!err, JSON.stringify(err)); - done(); - } - ); - }, - - "Callback#Namespace item": function (done) { - var searchName = "jssdk_search_" + getNextId(); - var search = "search *"; - var service = this.service; - - var namespace_1 = { owner: "-", app: this.appName1 }; - var namespace_nobody1 = { owner: "nobody", app: this.appName1 }; - - var savedSearches11 = service.savedSearches(this.namespace11); - var savedSearches21 = service.savedSearches(this.namespace21); - var savedSearches_1 = service.savedSearches(namespace_1); - var savedSearches_nobody1 = service.savedSearches(namespace_nobody1); - - var that = this; - Async.chain([ - function (done) { - // Create a saved search in the 11 namespace - savedSearches11.create({ name: searchName, search: search }, done); - }, - function (savedSearch, done) { - // Create a saved search in the 21 namespace - savedSearches21.create({ name: searchName, search: search }, done); - }, - function (savedSearch, done) { - // Refresh the -/1 namespace - savedSearches_1.fetch(done); - }, - function (savedSearches, done) { - // Refresh the 1/1 namespace - savedSearches11.fetch(done); - }, - function (savedSearches, done) { - // Refresh the 2/1 namespace - savedSearches21.fetch(done); - }, - function (savedSearches, done) { - var entity11 = savedSearches11.item(searchName, that.namespace11); - var entity21 = savedSearches21.item(searchName, that.namespace21); - - // Ensure that the saved search exists in the 11 namespace - assert.ok(entity11); - assert.strictEqual(entity11.name, searchName); - assert.strictEqual(entity11.properties().search, search); - assert.strictEqual(entity11.namespace.owner, that.namespace11.owner); - assert.strictEqual(entity11.namespace.app, that.namespace11.app); - - // Ensure that the saved search exists in the 21 namespace - assert.ok(entity21); - assert.strictEqual(entity21.name, searchName); - assert.strictEqual(entity21.properties().search, search); - assert.strictEqual(entity21.namespace.owner, that.namespace21.owner); - assert.strictEqual(entity21.namespace.app, that.namespace21.app); - - done(); - }, - function (done) { - // Create a saved search in the nobody/1 namespace - savedSearches_nobody1.create({ name: searchName, search: search }, done); - }, - function (savedSearch, done) { - // Refresh the 1/1 namespace - savedSearches11.fetch(done); - }, - function (savedSearches, done) { - // Refresh the 2/1 namespace - savedSearches21.fetch(done); - }, - function (savedSearches, done) { - // Ensure that we can't get the item from the generic - // namespace without specifying a namespace - try { - savedSearches_1.item(searchName); - assert.ok(false); - } catch (err) { - assert.ok(err); - } + return ( + describe("Namespace tests", () => { + beforeEach(function (finished) { + this.service = svc; + var that = this; + + var appName1 = "jssdk_testapp_" + getNextId(); + var appName2 = "jssdk_testapp_" + getNextId(); + + var userName1 = "jssdk_testuser_" + getNextId(); + var userName2 = "jssdk_testuser_" + getNextId(); + + var apps = this.service.apps(); + var users = this.service.users(); + + this.namespace11 = { owner: userName1, app: appName1 }; + this.namespace12 = { owner: userName1, app: appName2 }; + this.namespace21 = { owner: userName2, app: appName1 }; + this.namespace22 = { owner: userName2, app: appName2 }; + + Async.chain([ + function (done) { + apps.create({ name: appName1 }, done); + }, + function (app1, done) { + that.app1 = app1; + that.appName1 = appName1; + apps.create({ name: appName2 }, done); + }, + function (app2, done) { + that.app2 = app2; + that.appName2 = appName2; + users.create({ name: userName1, password: "abcdefg!", roles: ["user"] }, done); + }, + function (user1, done) { + that.user1 = user1; + that.userName1 = userName1; + users.create({ name: userName2, password: "abcdefg!", roles: ["user"] }, done); + }, + function (user2, done) { + that.user2 = user2; + that.userName2 = userName2; - // Ensure that we can't get the item using wildcard namespaces. - try { - savedSearches_1.item(searchName, { owner: '-' }); - assert.ok(false); - } catch (err) { - assert.ok(err); + done(); } - - try { - savedSearches_1.item(searchName, { app: '-' }); - assert.ok(false); - } catch (err) { - assert.ok(err); + ], + function (err) { + finished(err); } + ); + }); - try { - savedSearches_1.item(searchName, { app: '-', owner: '-' }); - assert.ok(false); - } catch (err) { - assert.ok(err); + it("Callback#Namespace protection", function (done) { + var searchName = "jssdk_search_" + getNextId(); + var search = "search *"; + var service = this.service; + var savedSearches11 = service.savedSearches(this.namespace11); + var savedSearches21 = service.savedSearches(this.namespace21); + + Async.chain([ + function (done) { + // Create the saved search only in the 11 namespace + savedSearches11.create({ name: searchName, search: search }, done); + }, + function (savedSearch, done) { + // Refresh the 11 saved searches + savedSearches11.fetch(done); + }, + function (savedSearches, done) { + // Refresh the 21 saved searches + savedSearches21.fetch(done); + }, + function (savedSearches, done) { + var entity11 = savedSearches11.item(searchName); + var entity21 = savedSearches21.item(searchName); + + // Make sure the saved search exists in the 11 namespace + assert.ok(entity11); + assert.strictEqual(entity11.name, searchName); + assert.strictEqual(entity11.properties().search, search); + + // Make sure the saved search doesn't exist in the 11 namespace + assert.ok(!entity21); + done(); } + ], + function (err) { + assert.ok(!err, JSON.stringify(err)); + done(); + } + ); + }); + + it("Callback#Namespace item", function (done) { + var searchName = "jssdk_search_" + getNextId(); + var search = "search *"; + var service = this.service; + + var namespace_1 = { owner: "-", app: this.appName1 }; + var namespace_nobody1 = { owner: "nobody", app: this.appName1 }; + + var savedSearches11 = service.savedSearches(this.namespace11); + var savedSearches21 = service.savedSearches(this.namespace21); + var savedSearches_1 = service.savedSearches(namespace_1); + var savedSearches_nobody1 = service.savedSearches(namespace_nobody1); + + var that = this; + Async.chain([ + function (done) { + // Create a saved search in the 11 namespace + savedSearches11.create({ name: searchName, search: search }, done); + }, + function (savedSearch, done) { + // Create a saved search in the 21 namespace + savedSearches21.create({ name: searchName, search: search }, done); + }, + function (savedSearch, done) { + // Refresh the -/1 namespace + savedSearches_1.fetch(done); + }, + function (savedSearches, done) { + // Refresh the 1/1 namespace + savedSearches11.fetch(done); + }, + function (savedSearches, done) { + // Refresh the 2/1 namespace + savedSearches21.fetch(done); + }, + function (savedSearches, done) { + var entity11 = savedSearches11.item(searchName, that.namespace11); + var entity21 = savedSearches21.item(searchName, that.namespace21); + + // Ensure that the saved search exists in the 11 namespace + assert.ok(entity11); + assert.strictEqual(entity11.name, searchName); + assert.strictEqual(entity11.properties().search, search); + assert.strictEqual(entity11.namespace.owner, that.namespace11.owner); + assert.strictEqual(entity11.namespace.app, that.namespace11.app); + + // Ensure that the saved search exists in the 21 namespace + assert.ok(entity21); + assert.strictEqual(entity21.name, searchName); + assert.strictEqual(entity21.properties().search, search); + assert.strictEqual(entity21.namespace.owner, that.namespace21.owner); + assert.strictEqual(entity21.namespace.app, that.namespace21.app); + + done(); + }, + function (done) { + // Create a saved search in the nobody/1 namespace + savedSearches_nobody1.create({ name: searchName, search: search }, done); + }, + function (savedSearch, done) { + // Refresh the 1/1 namespace + savedSearches11.fetch(done); + }, + function (savedSearches, done) { + // Refresh the 2/1 namespace + savedSearches21.fetch(done); + }, + function (savedSearches, done) { + // Ensure that we can't get the item from the generic + // namespace without specifying a namespace + try { + savedSearches_1.item(searchName); + assert.ok(false); + } catch (err) { + assert.ok(err); + } + + // Ensure that we can't get the item using wildcard namespaces. + try { + savedSearches_1.item(searchName, { owner: '-' }); + assert.ok(false); + } catch (err) { + assert.ok(err); + } - // Ensure we get the right entities from the -/1 namespace when we - // specify it. - var entity11 = savedSearches_1.item(searchName, that.namespace11); - var entity21 = savedSearches_1.item(searchName, that.namespace21); - - assert.ok(entity11); - assert.strictEqual(entity11.name, searchName); - assert.strictEqual(entity11.properties().search, search); - assert.strictEqual(entity11.namespace.owner, that.namespace11.owner); - assert.strictEqual(entity11.namespace.app, that.namespace11.app); - - assert.ok(entity21); - assert.strictEqual(entity21.name, searchName); - assert.strictEqual(entity21.properties().search, search); - assert.strictEqual(entity21.namespace.owner, that.namespace21.owner); - assert.strictEqual(entity21.namespace.app, that.namespace21.app); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#delete test users": function (done) { - var users = this.service.users(); - users.fetch(function (err, users) { - var userList = users.list(); - - Async.parallelEach( - userList, - function (user, idx, callback) { - if (utils.startsWith(user.name, "jssdk_")) { - user.remove(callback); - } else { - callback(); + try { + savedSearches_1.item(searchName, { app: '-' }); + assert.ok(false); + } catch (err) { + assert.ok(err); } - }, function (err) { + + try { + savedSearches_1.item(searchName, { app: '-', owner: '-' }); + assert.ok(false); + } catch (err) { + assert.ok(err); + } + + // Ensure we get the right entities from the -/1 namespace when we + // specify it. + var entity11 = savedSearches_1.item(searchName, that.namespace11); + var entity21 = savedSearches_1.item(searchName, that.namespace21); + + assert.ok(entity11); + assert.strictEqual(entity11.name, searchName); + assert.strictEqual(entity11.properties().search, search); + assert.strictEqual(entity11.namespace.owner, that.namespace11.owner); + assert.strictEqual(entity11.namespace.app, that.namespace11.app); + + assert.ok(entity21); + assert.strictEqual(entity21.name, searchName); + assert.strictEqual(entity21.properties().search, search); + assert.strictEqual(entity21.namespace.owner, that.namespace21.owner); + assert.strictEqual(entity21.namespace.app, that.namespace21.app); + + done(); + } + ], + function (err) { assert.ok(!err); done(); } ); }); - } - }; + + it("Callback#delete test users", function (done) { + var users = this.service.users(); + users.fetch(function (err, users) { + var userList = users.list(); + + Async.parallelEach( + userList, + function (user, idx, callback) { + if (utils.startsWith(user.name, "jssdk_")) { + user.remove(callback); + } else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); + } + ); + }); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests_spike/test_service.js b/tests_spike/test_service.js index 3cb5534ce..a2f2db1ce 100644 --- a/tests_spike/test_service.js +++ b/tests_spike/test_service.js @@ -16,25 +16,28 @@ exports.setup = function (svc, loggedOutSvc) { return ( - require("./service_tests/app").setup(svc), - require("./service_tests/collection").setup(svc, loggedOutSvc), - require("./service_tests/configuration").setup(svc), - require("./service_tests/datamodels").setup(svc), - require("./service_tests/endpoint").setup(svc), - require("./service_tests/entity").setup(svc, loggedOutSvc), - require("./service_tests/firedalerts").setup(svc, loggedOutSvc), - require("./service_tests/indexes").setup(svc, loggedOutSvc), - require("./service_tests/job").setup(svc), - require("./service_tests/namespace").setup(svc), - require("./service_tests/parser").setup(svc), - require("./service_tests/pivot").setup(svc), - require("./service_tests/properties").setup(svc), - require("./service_tests/savedsearch").setup(svc, loggedOutSvc), - require("./service_tests/serverinfo").setup(svc), - require("./service_tests/storagepasswords").setup(svc), - require("./service_tests/typeahead").setup(svc, loggedOutSvc), - require("./service_tests/user").setup(svc, loggedOutSvc), - require("./service_tests/view").setup(svc) + + describe("Service tests", function (done) { + require("./service_tests/app").setup(svc), + require("./service_tests/collection").setup(svc, loggedOutSvc), + require("./service_tests/configuration").setup(svc), + require("./service_tests/datamodels").setup(svc), + require("./service_tests/endpoint").setup(svc), + require("./service_tests/entity").setup(svc, loggedOutSvc), + require("./service_tests/firedalerts").setup(svc, loggedOutSvc), + require("./service_tests/indexes").setup(svc, loggedOutSvc), + require("./service_tests/job").setup(svc), + require("./service_tests/namespace").setup(svc), + require("./service_tests/parser").setup(svc), + require("./service_tests/pivot").setup(svc), + require("./service_tests/properties").setup(svc), + require("./service_tests/savedsearch").setup(svc, loggedOutSvc), + require("./service_tests/serverinfo").setup(svc), + require("./service_tests/storagepasswords").setup(svc), + require("./service_tests/typeahead").setup(svc, loggedOutSvc), + require("./service_tests/user").setup(svc, loggedOutSvc), + require("./service_tests/view").setup(svc) + }) ) }; diff --git a/tests_spike/tests.js b/tests_spike/tests.js index 96b7b8513..e7818f19c 100644 --- a/tests_spike/tests.js +++ b/tests_spike/tests.js @@ -12,7 +12,7 @@ // License for the specific language governing permissions and limitations // under the License. -const { describe } = require('mocha'); +// var { describe } = require('mocha'); var options = require('../examples/node/cmdline'); var splunkjs = require('../index'); var utils = require('../lib/utils'); @@ -71,14 +71,14 @@ describe("Server tests", function () { done(); }) - require('./modularinputs'); - require('./test_async').setup(); - require('./test_context').setup(svc); - require('./test_examples').setup(svc, cmdline.opts); - require('./test_http').setup(nonSplunkHttp); - require('./test_log').setup(); + // require('./modularinputs'); + // require('./test_async').setup(); + // require('./test_context').setup(svc); + // require('./test_examples').setup(svc, cmdline.opts); + // require('./test_http').setup(nonSplunkHttp); + // require('./test_log').setup(); require('./test_service').setup(svc, loggedOutSvc); - require('./test_utils').setup(); + // require('./test_utils').setup(); }) From adb46f3ec9336b48cd94d79a2c3b0fb8c088a067 Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Fri, 16 Jul 2021 17:43:30 +0530 Subject: [PATCH 4/7] beforeEach added --- tests_spike/service_tests/parser.js | 12 +- tests_spike/service_tests/pivot.js | 260 +++++++++--------- tests_spike/service_tests/properties.js | 4 +- tests_spike/service_tests/savedsearch.js | 116 ++++---- tests_spike/service_tests/serverinfo.js | 10 +- tests_spike/service_tests/storagepasswords.js | 52 ++-- tests_spike/service_tests/typeahead.js | 12 +- tests_spike/service_tests/user.js | 22 +- tests_spike/service_tests/view.js | 6 +- 9 files changed, 247 insertions(+), 247 deletions(-) diff --git a/tests_spike/service_tests/parser.js b/tests_spike/service_tests/parser.js index 2f64822d4..fbcaa0145 100644 --- a/tests_spike/service_tests/parser.js +++ b/tests_spike/service_tests/parser.js @@ -1,15 +1,15 @@ exports.setup = function (svc) { var assert = require('chai').assert; return ( - describe("Parsing Tests",function(){ - before(function (done) { + describe("Parsing Tests", function () { + beforeEach(function (done) { this.service = svc; done(); }); - + it("Callback#Basic parse", function (done) { var service = this.service; - + service.parse("search index=_internal | head 1", function (err, parse) { assert.ok(!err); assert.ok(parse); @@ -17,10 +17,10 @@ exports.setup = function (svc) { done(); }); }); - + it("Callback#Parse error", function (done) { var service = this.service; - + service.parse("ABCXYZ", function (err, parse) { assert.ok(err); assert.strictEqual(err.status, 400); diff --git a/tests_spike/service_tests/pivot.js b/tests_spike/service_tests/pivot.js index f3c1f6819..3a49a922e 100644 --- a/tests_spike/service_tests/pivot.js +++ b/tests_spike/service_tests/pivot.js @@ -13,8 +13,8 @@ exports.setup = function (svc) { return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); }; return ( - describe("Pivot Tests", function(){ - before(function (done) { + describe("Pivot Tests", function () { + beforeEach(function (done) { this.service = svc; this.dataModels = svc.dataModels({ owner: "nobody", app: "search" }); this.skip = false; @@ -27,7 +27,7 @@ exports.setup = function (svc) { done(err); }); }) - + it("Callback#Pivot - test constructor args", function (done) { if (this.skip) { done(); @@ -59,7 +59,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Pivot - test acceleration, then pivot", function (done) { if (this.skip) { done(); @@ -83,7 +83,7 @@ exports.setup = function (svc) { function (dataModel, done) { dataModel.objectByName("test_data"); assert.ok(dataModel); - + dataModel.acceleration.enabled = true; dataModel.acceleration.earliestTime = "-2mon"; dataModel.acceleration.cronSchedule = "0 */12 * * *"; @@ -91,25 +91,25 @@ exports.setup = function (svc) { }, function (dataModel, done) { var props = dataModel.properties(); - + assert.strictEqual(true, dataModel.isAccelerated()); assert.strictEqual(true, !!dataModel.acceleration.enabled); assert.strictEqual("-2mon", dataModel.acceleration.earliest_time); assert.strictEqual("0 */12 * * *", dataModel.acceleration.cron_schedule); - + var dataModelObject = dataModel.objectByName("test_data"); var pivotSpecification = dataModelObject.createPivotSpecification(); - + assert.strictEqual(dataModelObject.dataModel.name, pivotSpecification.accelerationNamespace); - + var name1 = "delete-me-" + getNextId(); pivotSpecification.setAccelerationJob(name1); assert.strictEqual("sid=" + name1, pivotSpecification.accelerationNamespace); - + var namespaceTemp = "delete-me-" + getNextId(); pivotSpecification.accelerationNamespace = namespaceTemp; assert.strictEqual(namespaceTemp, pivotSpecification.accelerationNamespace); - + pivotSpecification .addCellValue("test_data", "Source Value", "count") .run(done); @@ -118,13 +118,13 @@ exports.setup = function (svc) { assert.ok(job); assert.ok(pivot); assert.notStrictEqual("FAILED", job.properties().dispatchState); - + job.track({}, function (job) { assert.ok(pivot.tstatsSearch); assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); - + assert.strictEqual(pivot.tstatsSearch, job.properties().request.search); done(null, job); }); @@ -140,7 +140,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Pivot - test illegal filtering (all types)", function (done) { if (this.skip) { done(); @@ -164,9 +164,9 @@ exports.setup = function (svc) { function (dataModel, done) { var obj = dataModel.objectByName("test_data"); assert.ok(obj); - + var pivotSpecification = obj.createPivotSpecification(); - + // Boolean comparisons try { pivotSpecification.addFilter(getNextId(), "boolean", "=", true); @@ -184,7 +184,7 @@ exports.setup = function (svc) { assert.ok(e); assert.strictEqual(e.message, "Cannot add boolean filter on _time because it is of type timestamp"); } - + // String comparisons try { pivotSpecification.addFilter("has_boris", "string", "contains", "abc"); @@ -202,7 +202,7 @@ exports.setup = function (svc) { assert.ok(e); assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); } - + // IPv4 comparisons try { pivotSpecification.addFilter("has_boris", "ipv4", "startsWith", "192.168"); @@ -220,7 +220,7 @@ exports.setup = function (svc) { assert.ok(e); assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); } - + // Number comparisons try { pivotSpecification.addFilter("has_boris", "number", "atLeast", 2.3); @@ -238,7 +238,7 @@ exports.setup = function (svc) { assert.ok(e); assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); } - + // Limit filter try { pivotSpecification.addLimitFilter("has_boris", "host", "DEFAULT", 50, "count"); @@ -292,7 +292,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Pivot - test boolean filtering", function (done) { if (this.skip) { done(); @@ -316,20 +316,20 @@ exports.setup = function (svc) { function (dataModel, done) { var obj = dataModel.objectByName("test_data"); assert.ok(obj); - + var pivotSpecification = obj.createPivotSpecification(); try { pivotSpecification.addFilter("has_boris", "boolean", "=", true); assert.strictEqual(1, pivotSpecification.filters.length); - + //Test the individual parts of the filter var filter = pivotSpecification.filters[0]; - + assert.ok(filter.hasOwnProperty("fieldName")); assert.ok(filter.hasOwnProperty("type")); assert.ok(filter.hasOwnProperty("rule")); assert.ok(filter.hasOwnProperty("owner")); - + assert.strictEqual("has_boris", filter.fieldName); assert.strictEqual("boolean", filter.type); assert.strictEqual("=", filter.rule.comparator); @@ -339,7 +339,7 @@ exports.setup = function (svc) { catch (e) { assert.ok(false); } - + done(); } ], @@ -349,7 +349,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Pivot - test string filtering", function (done) { if (this.skip) { done(); @@ -373,20 +373,20 @@ exports.setup = function (svc) { function (dataModel, done) { var obj = dataModel.objectByName("test_data"); assert.ok(obj); - + var pivotSpecification = obj.createPivotSpecification(); try { pivotSpecification.addFilter("host", "string", "contains", "abc"); assert.strictEqual(1, pivotSpecification.filters.length); - + //Test the individual parts of the filter var filter = pivotSpecification.filters[0]; - + assert.ok(filter.hasOwnProperty("fieldName")); assert.ok(filter.hasOwnProperty("type")); assert.ok(filter.hasOwnProperty("rule")); assert.ok(filter.hasOwnProperty("owner")); - + assert.strictEqual("host", filter.fieldName); assert.strictEqual("string", filter.type); assert.strictEqual("contains", filter.rule.comparator); @@ -396,7 +396,7 @@ exports.setup = function (svc) { catch (e) { assert.ok(false); } - + done(); } ], @@ -406,7 +406,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Pivot - test IPv4 filtering", function (done) { if (this.skip) { done(); @@ -430,20 +430,20 @@ exports.setup = function (svc) { function (dataModel, done) { var obj = dataModel.objectByName("test_data"); assert.ok(obj); - + var pivotSpecification = obj.createPivotSpecification(); try { pivotSpecification.addFilter("hostip", "ipv4", "startsWith", "192.168"); assert.strictEqual(1, pivotSpecification.filters.length); - + //Test the individual parts of the filter var filter = pivotSpecification.filters[0]; - + assert.ok(filter.hasOwnProperty("fieldName")); assert.ok(filter.hasOwnProperty("type")); assert.ok(filter.hasOwnProperty("rule")); assert.ok(filter.hasOwnProperty("owner")); - + assert.strictEqual("hostip", filter.fieldName); assert.strictEqual("ipv4", filter.type); assert.strictEqual("startsWith", filter.rule.comparator); @@ -453,7 +453,7 @@ exports.setup = function (svc) { catch (e) { assert.ok(false); } - + done(); } ], @@ -463,7 +463,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Pivot - test number filtering", function (done) { if (this.skip) { done(); @@ -487,20 +487,20 @@ exports.setup = function (svc) { function (dataModel, done) { var obj = dataModel.objectByName("test_data"); assert.ok(obj); - + var pivotSpecification = obj.createPivotSpecification(); try { pivotSpecification.addFilter("epsilon", "number", ">=", 2.3); assert.strictEqual(1, pivotSpecification.filters.length); - + //Test the individual parts of the filter var filter = pivotSpecification.filters[0]; - + assert.ok(filter.hasOwnProperty("fieldName")); assert.ok(filter.hasOwnProperty("type")); assert.ok(filter.hasOwnProperty("rule")); assert.ok(filter.hasOwnProperty("owner")); - + assert.strictEqual("epsilon", filter.fieldName); assert.strictEqual("number", filter.type); assert.strictEqual(">=", filter.rule.comparator); @@ -510,7 +510,7 @@ exports.setup = function (svc) { catch (e) { assert.ok(false); } - + done(); } ], @@ -544,15 +544,15 @@ exports.setup = function (svc) { function (dataModel, done) { var obj = dataModel.objectByName("test_data"); assert.ok(obj); - + var pivotSpecification = obj.createPivotSpecification(); try { pivotSpecification.addLimitFilter("epsilon", "host", "ASCENDING", 500, "average"); assert.strictEqual(1, pivotSpecification.filters.length); - + //Test the individual parts of the filter var filter = pivotSpecification.filters[0]; - + assert.ok(filter.hasOwnProperty("fieldName")); assert.ok(filter.hasOwnProperty("type")); assert.ok(filter.hasOwnProperty("owner")); @@ -561,7 +561,7 @@ exports.setup = function (svc) { assert.ok(filter.hasOwnProperty("limitType")); assert.ok(filter.hasOwnProperty("limitAmount")); assert.ok(filter.hasOwnProperty("statsFn")); - + assert.strictEqual("epsilon", filter.fieldName); assert.strictEqual("number", filter.type); assert.strictEqual("test_data", filter.owner); @@ -574,7 +574,7 @@ exports.setup = function (svc) { catch (e) { assert.ok(false); } - + done(); } ], @@ -608,9 +608,9 @@ exports.setup = function (svc) { function (dataModel, done) { var obj = dataModel.objectByName("test_data"); assert.ok(obj); - + var pivotSpecification = obj.createPivotSpecification(); - + // Test error handling for row split try { pivotSpecification.addRowSplit("has_boris", "Wrong type here"); @@ -622,7 +622,7 @@ exports.setup = function (svc) { } var field = getNextId(); try { - + pivotSpecification.addRowSplit(field, "Break Me!"); assert.ok(false); } @@ -630,18 +630,18 @@ exports.setup = function (svc) { assert.ok(e); assert.strictEqual(e.message, "Did not find field " + field); } - + // Test row split, number pivotSpecification.addRowSplit("epsilon", "My Label"); assert.strictEqual(1, pivotSpecification.rows.length); - + var row = pivotSpecification.rows[0]; assert.ok(row.hasOwnProperty("fieldName")); assert.ok(row.hasOwnProperty("owner")); assert.ok(row.hasOwnProperty("type")); assert.ok(row.hasOwnProperty("label")); assert.ok(row.hasOwnProperty("display")); - + assert.strictEqual("epsilon", row.fieldName); assert.strictEqual("test_data", row.owner); assert.strictEqual("number", row.type); @@ -655,18 +655,18 @@ exports.setup = function (svc) { display: "all" }, row); - + // Test row split, string pivotSpecification.addRowSplit("host", "My Label"); assert.strictEqual(2, pivotSpecification.rows.length); - + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; assert.ok(row.hasOwnProperty("fieldName")); assert.ok(row.hasOwnProperty("owner")); assert.ok(row.hasOwnProperty("type")); assert.ok(row.hasOwnProperty("label")); assert.ok(!row.hasOwnProperty("display")); - + assert.strictEqual("host", row.fieldName); assert.strictEqual("BaseEvent", row.owner); assert.strictEqual("string", row.type); @@ -678,7 +678,7 @@ exports.setup = function (svc) { label: "My Label" }, row); - + // Test error handling on range row split try { pivotSpecification.addRangeRowSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); @@ -695,11 +695,11 @@ exports.setup = function (svc) { assert.ok(e); assert.strictEqual(e.message, "Did not find field " + field); } - + // Test range row split pivotSpecification.addRangeRowSplit("epsilon", "My Label", { start: 0, end: 100, step: 20, limit: 5 }); assert.strictEqual(3, pivotSpecification.rows.length); - + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; assert.ok(row.hasOwnProperty("fieldName")); assert.ok(row.hasOwnProperty("owner")); @@ -707,13 +707,13 @@ exports.setup = function (svc) { assert.ok(row.hasOwnProperty("label")); assert.ok(row.hasOwnProperty("display")); assert.ok(row.hasOwnProperty("ranges")); - + assert.strictEqual("epsilon", row.fieldName); assert.strictEqual("test_data", row.owner); assert.strictEqual("number", row.type); assert.strictEqual("My Label", row.label); assert.strictEqual("ranges", row.display); - + var ranges = { start: 0, end: 100, @@ -730,7 +730,7 @@ exports.setup = function (svc) { ranges: ranges }, row); - + // Test error handling on boolean row split try { pivotSpecification.addBooleanRowSplit("epsilon", "Wrong type here", "t", "f"); @@ -747,11 +747,11 @@ exports.setup = function (svc) { assert.ok(e); assert.strictEqual(e.message, "Did not find field " + field); } - + // Test boolean row split pivotSpecification.addBooleanRowSplit("has_boris", "My Label", "is_true", "is_false"); assert.strictEqual(4, pivotSpecification.rows.length); - + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; assert.ok(row.hasOwnProperty("fieldName")); assert.ok(row.hasOwnProperty("owner")); @@ -759,7 +759,7 @@ exports.setup = function (svc) { assert.ok(row.hasOwnProperty("label")); assert.ok(row.hasOwnProperty("trueLabel")); assert.ok(row.hasOwnProperty("falseLabel")); - + assert.strictEqual("has_boris", row.fieldName); assert.strictEqual("My Label", row.label); assert.strictEqual("test_data", row.owner); @@ -775,7 +775,7 @@ exports.setup = function (svc) { falseLabel: "is_false" }, row); - + // Test error handling on timestamp row split try { pivotSpecification.addTimestampRowSplit("epsilon", "Wrong type here", "some binning"); @@ -800,18 +800,18 @@ exports.setup = function (svc) { assert.ok(e); assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); } - + // Test timestamp row split pivotSpecification.addTimestampRowSplit("_time", "My Label", "day"); assert.strictEqual(5, pivotSpecification.rows.length); - + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; assert.ok(row.hasOwnProperty("fieldName")); assert.ok(row.hasOwnProperty("owner")); assert.ok(row.hasOwnProperty("type")); assert.ok(row.hasOwnProperty("label")); assert.ok(row.hasOwnProperty("period")); - + assert.strictEqual("_time", row.fieldName); assert.strictEqual("My Label", row.label); assert.strictEqual("BaseEvent", row.owner); @@ -825,7 +825,7 @@ exports.setup = function (svc) { period: "day" }, row); - + done(); } ], @@ -859,9 +859,9 @@ exports.setup = function (svc) { function (dataModel, done) { var obj = dataModel.objectByName("test_data"); assert.ok(obj); - + var pivotSpecification = obj.createPivotSpecification(); - + // Test error handling for column split try { pivotSpecification.addColumnSplit("has_boris", "Wrong type here"); @@ -873,7 +873,7 @@ exports.setup = function (svc) { } var field = getNextId(); try { - + pivotSpecification.addColumnSplit(field, "Break Me!"); assert.ok(false); } @@ -881,17 +881,17 @@ exports.setup = function (svc) { assert.ok(e); assert.strictEqual(e.message, "Did not find field " + field); } - + // Test column split, number pivotSpecification.addColumnSplit("epsilon"); assert.strictEqual(1, pivotSpecification.columns.length); - + var col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; assert.ok(col.hasOwnProperty("fieldName")); assert.ok(col.hasOwnProperty("owner")); assert.ok(col.hasOwnProperty("type")); assert.ok(col.hasOwnProperty("display")); - + assert.strictEqual("epsilon", col.fieldName); assert.strictEqual("test_data", col.owner); assert.strictEqual("number", col.type); @@ -903,17 +903,17 @@ exports.setup = function (svc) { display: "all" }, col); - + // Test column split, string pivotSpecification.addColumnSplit("host"); assert.strictEqual(2, pivotSpecification.columns.length); - + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; assert.ok(col.hasOwnProperty("fieldName")); assert.ok(col.hasOwnProperty("owner")); assert.ok(col.hasOwnProperty("type")); assert.ok(!col.hasOwnProperty("display")); - + assert.strictEqual("host", col.fieldName); assert.strictEqual("BaseEvent", col.owner); assert.strictEqual("string", col.type); @@ -923,9 +923,9 @@ exports.setup = function (svc) { type: "string" }, col); - + done(); - + // Test error handling for range column split try { pivotSpecification.addRangeColumnSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); @@ -942,18 +942,18 @@ exports.setup = function (svc) { assert.ok(e); assert.strictEqual(e.message, "Did not find field " + field); } - + // Test range column split pivotSpecification.addRangeColumnSplit("epsilon", { start: 0, end: 100, step: 20, limit: 5 }); assert.strictEqual(3, pivotSpecification.columns.length); - + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; assert.ok(col.hasOwnProperty("fieldName")); assert.ok(col.hasOwnProperty("owner")); assert.ok(col.hasOwnProperty("type")); assert.ok(col.hasOwnProperty("display")); assert.ok(col.hasOwnProperty("ranges")); - + assert.strictEqual("epsilon", col.fieldName); assert.strictEqual("test_data", col.owner); assert.strictEqual("number", col.type); @@ -973,7 +973,7 @@ exports.setup = function (svc) { ranges: ranges }, col); - + // Test error handling on boolean column split try { pivotSpecification.addBooleanColumnSplit("epsilon", "t", "f"); @@ -990,11 +990,11 @@ exports.setup = function (svc) { assert.ok(e); assert.strictEqual(e.message, "Did not find field " + field); } - + // Test boolean column split pivotSpecification.addBooleanColumnSplit("has_boris", "is_true", "is_false"); assert.strictEqual(4, pivotSpecification.columns.length); - + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; assert.ok(col.hasOwnProperty("fieldName")); assert.ok(col.hasOwnProperty("owner")); @@ -1002,7 +1002,7 @@ exports.setup = function (svc) { assert.ok(!col.hasOwnProperty("label")); assert.ok(col.hasOwnProperty("trueLabel")); assert.ok(col.hasOwnProperty("falseLabel")); - + assert.strictEqual("has_boris", col.fieldName); assert.strictEqual("test_data", col.owner); assert.strictEqual("boolean", col.type); @@ -1016,7 +1016,7 @@ exports.setup = function (svc) { falseLabel: "is_false" }, col); - + // Test error handling on timestamp column split try { pivotSpecification.addTimestampColumnSplit("epsilon", "Wrong type here"); @@ -1041,18 +1041,18 @@ exports.setup = function (svc) { assert.ok(e); assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); } - + // Test timestamp column split pivotSpecification.addTimestampColumnSplit("_time", "day"); assert.strictEqual(5, pivotSpecification.columns.length); - + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; assert.ok(col.hasOwnProperty("fieldName")); assert.ok(col.hasOwnProperty("owner")); assert.ok(col.hasOwnProperty("type")); assert.ok(!col.hasOwnProperty("label")); assert.ok(col.hasOwnProperty("period")); - + assert.strictEqual("_time", col.fieldName); assert.strictEqual("BaseEvent", col.owner); assert.strictEqual("timestamp", col.type); @@ -1096,9 +1096,9 @@ exports.setup = function (svc) { function (dataModel, done) { var obj = dataModel.objectByName("test_data"); assert.ok(obj); - + var pivotSpecification = obj.createPivotSpecification(); - + // Test error handling for cell value, string try { pivotSpecification.addCellValue("iDontExist", "Break Me!", "explosion"); @@ -1117,11 +1117,11 @@ exports.setup = function (svc) { assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + " list, distinct_values, first, last, count, or distinct_count; found stdev"); } - + // Add cell value, string pivotSpecification.addCellValue("source", "Source Value", "dc"); assert.strictEqual(1, pivotSpecification.cells.length); - + var cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; assert.ok(cell.hasOwnProperty("fieldName")); assert.ok(cell.hasOwnProperty("owner")); @@ -1129,7 +1129,7 @@ exports.setup = function (svc) { assert.ok(cell.hasOwnProperty("label")); assert.ok(cell.hasOwnProperty("value")); assert.ok(cell.hasOwnProperty("sparkline")); - + assert.strictEqual("source", cell.fieldName); assert.strictEqual("BaseEvent", cell.owner); assert.strictEqual("string", cell.type); @@ -1144,7 +1144,7 @@ exports.setup = function (svc) { value: "dc", sparkline: false }, cell); - + // Test error handling for cell value, IPv4 try { pivotSpecification.addCellValue("hostip", "Wrong Stats Function", "stdev"); @@ -1155,11 +1155,11 @@ exports.setup = function (svc) { assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + " list, distinct_values, first, last, count, or distinct_count; found stdev"); } - + // Add cell value, IPv4 pivotSpecification.addCellValue("hostip", "Source Value", "dc"); assert.strictEqual(2, pivotSpecification.cells.length); - + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; assert.ok(cell.hasOwnProperty("fieldName")); assert.ok(cell.hasOwnProperty("owner")); @@ -1167,7 +1167,7 @@ exports.setup = function (svc) { assert.ok(cell.hasOwnProperty("label")); assert.ok(cell.hasOwnProperty("value")); assert.ok(cell.hasOwnProperty("sparkline")); - + assert.strictEqual("hostip", cell.fieldName); assert.strictEqual("test_data", cell.owner); assert.strictEqual("ipv4", cell.type); @@ -1182,7 +1182,7 @@ exports.setup = function (svc) { value: "dc", sparkline: false }, cell); - + // Test error handling for cell value, boolean try { pivotSpecification.addCellValue("has_boris", "Booleans not allowed", "sum"); @@ -1192,7 +1192,7 @@ exports.setup = function (svc) { assert.ok(e); assert.strictEqual(e.message, "Cannot use boolean valued fields as cell values."); } - + // Test error handling for cell value, number try { pivotSpecification.addCellValue("epsilon", "Wrong Stats Function", "latest"); @@ -1203,11 +1203,11 @@ exports.setup = function (svc) { assert.strictEqual(e.message, "Stats function on number field must be must be one of:" + " sum, count, average, max, min, stdev, list, or distinct_values; found latest"); } - + // Add cell value, number pivotSpecification.addCellValue("epsilon", "Source Value", "average"); assert.strictEqual(3, pivotSpecification.cells.length); - + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; assert.ok(cell.hasOwnProperty("fieldName")); assert.ok(cell.hasOwnProperty("owner")); @@ -1215,7 +1215,7 @@ exports.setup = function (svc) { assert.ok(cell.hasOwnProperty("label")); assert.ok(cell.hasOwnProperty("value")); assert.ok(cell.hasOwnProperty("sparkline")); - + assert.strictEqual("epsilon", cell.fieldName); assert.strictEqual("test_data", cell.owner); assert.strictEqual("number", cell.type); @@ -1230,7 +1230,7 @@ exports.setup = function (svc) { value: "average", sparkline: false }, cell); - + // Test error handling for cell value, timestamp try { pivotSpecification.addCellValue("_time", "Wrong Stats Function", "max"); @@ -1241,11 +1241,11 @@ exports.setup = function (svc) { assert.strictEqual(e.message, "Stats function on timestamp field must be one of:" + " duration, earliest, latest, list, or distinct values; found max"); } - + // Add cell value, timestamp pivotSpecification.addCellValue("_time", "Source Value", "earliest"); assert.strictEqual(4, pivotSpecification.cells.length); - + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; assert.ok(cell.hasOwnProperty("fieldName")); assert.ok(cell.hasOwnProperty("owner")); @@ -1253,7 +1253,7 @@ exports.setup = function (svc) { assert.ok(cell.hasOwnProperty("label")); assert.ok(cell.hasOwnProperty("value")); assert.ok(cell.hasOwnProperty("sparkline")); - + assert.strictEqual("_time", cell.fieldName); assert.strictEqual("BaseEvent", cell.owner); assert.strictEqual("timestamp", cell.type); @@ -1268,7 +1268,7 @@ exports.setup = function (svc) { value: "earliest", sparkline: false }, cell); - + // Test error handling for cell value, count try { pivotSpecification.addCellValue("test_data", "Wrong Stats Function", "min"); @@ -1279,11 +1279,11 @@ exports.setup = function (svc) { assert.strictEqual(e.message, "Stats function on childcount and objectcount fields " + "must be count; found " + "min"); } - + // Add cell value, count pivotSpecification.addCellValue("test_data", "Source Value", "count"); assert.strictEqual(5, pivotSpecification.cells.length); - + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; assert.ok(cell.hasOwnProperty("fieldName")); assert.ok(cell.hasOwnProperty("owner")); @@ -1291,7 +1291,7 @@ exports.setup = function (svc) { assert.ok(cell.hasOwnProperty("label")); assert.ok(cell.hasOwnProperty("value")); assert.ok(cell.hasOwnProperty("sparkline")); - + assert.strictEqual("test_data", cell.fieldName); assert.strictEqual("test_data", cell.owner); assert.strictEqual("objectCount", cell.type); @@ -1306,7 +1306,7 @@ exports.setup = function (svc) { value: "count", sparkline: false }, cell); - + done(); } ], @@ -1340,7 +1340,7 @@ exports.setup = function (svc) { function (dataModel, done) { var obj = dataModel.objectByName("test_data"); assert.ok(obj); - + obj.createPivotSpecification().pivot(done); }, function (pivot, done) { @@ -1388,20 +1388,20 @@ exports.setup = function (svc) { adhocjob = job; assert.ok(job); pivotSpecification = obj.createPivotSpecification(); - + pivotSpecification.addBooleanRowSplit("has_boris", "Has Boris", "meep", "hilda"); pivotSpecification.addCellValue("hostip", "Distinct IPs", "count"); - + // Test setting a job pivotSpecification.setAccelerationJob(job); assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); - + // Test setting a job's SID pivotSpecification.setAccelerationJob(job.sid); assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); - + pivotSpecification.pivot(done); }, function (pivot, done) { @@ -1411,7 +1411,7 @@ exports.setup = function (svc) { // This test won't work with utils.startsWith due to the regex escaping assert.strictEqual("| tstats", pivot.tstatsSearch.match("^\\| tstats")[0]); assert.strictEqual(1, pivot.tstatsSearch.match("^\\| tstats").length); - + pivot.run(done); }, function (job, done) { @@ -1426,12 +1426,12 @@ exports.setup = function (svc) { }, function (job, done) { assert.ok("FAILED" !== job.properties().dispatchState); - + assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); // This test won't work with utils.startsWith due to the regex escaping assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); - + adhocjob.cancel(done); } ], @@ -1446,7 +1446,7 @@ exports.setup = function (svc) { // This test is here because we had a problem with fields that were supposed to be // numbers being expected as strings in Splunk 6.0. This was fixed in Splunk 6.1, and accepts // either strings or numbers. - + if (this.skip) { done(); return; @@ -1461,7 +1461,7 @@ exports.setup = function (svc) { var dm = dataModels.item("internal_audit_logs"); var obj = dm.objectByName("searches"); var pivotSpecification = obj.createPivotSpecification(); - + pivotSpecification.addRowSplit("user", "Executing user"); pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); pivotSpecification.addCellValue("search", "Search Query", "values"); @@ -1510,11 +1510,11 @@ exports.setup = function (svc) { var dm = dataModels.item("internal_audit_logs"); var obj = dm.objectByName("searches"); var pivotSpecification = obj.createPivotSpecification(); - + pivotSpecification.addRowSplit("user", "Executing user"); pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); pivotSpecification.addCellValue("search", "Search Query", "values"); - + pivotSpecification.run({}, done); }, function (job, pivot, done) { @@ -1544,7 +1544,7 @@ exports.setup = function (svc) { if (err) { assert.ok(!err); } - + var dms = dataModels.list(); Async.seriesEach( dms, diff --git a/tests_spike/service_tests/properties.js b/tests_spike/service_tests/properties.js index e4d787925..db7664e58 100644 --- a/tests_spike/service_tests/properties.js +++ b/tests_spike/service_tests/properties.js @@ -11,9 +11,9 @@ exports.setup = function (svc) { return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); }; return ( - describe("Properties Test", function(){ + describe("Properties Test", function () { - before(function (done) { + beforeEach(function (done) { this.service = svc; done(); }) diff --git a/tests_spike/service_tests/savedsearch.js b/tests_spike/service_tests/savedsearch.js index 209eed5f9..b57a12bb7 100644 --- a/tests_spike/service_tests/savedsearch.js +++ b/tests_spike/service_tests/savedsearch.js @@ -10,78 +10,78 @@ exports.setup = function (svc, loggedOutSvc) { return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); }; return ( - describe("Saved Search", function(){ - before(function (done) { + describe("Saved Search", function () { + beforeEach(function (done) { this.service = svc; this.loggedOutService = loggedOutSvc; done(); }) - + it("Callback#list", function (done) { var searches = this.service.savedSearches(); searches.fetch(function (err, searches) { var savedSearches = searches.list(); assert.ok(savedSearches.length > 0); - + for (var i = 0; i < savedSearches.length; i++) { assert.ok(savedSearches[i]); } - + done(); }); }) - + it("Callback#contains", function (done) { var searches = this.service.savedSearches(); searches.fetch(function (err, searches) { var search = searches.item("Errors in the last hour"); assert.ok(search); - + done(); }); }) - + it("Callback#suppress", function (done) { var searches = this.service.savedSearches(); searches.fetch(function (err, searches) { var search = searches.item("Errors in the last hour"); assert.ok(search); - + search.suppressInfo(function (err, info, search) { assert.ok(!err); done(); }); }); }) - + it("Callback#list limit count", function (done) { var searches = this.service.savedSearches(); searches.fetch({ count: 2 }, function (err, searches) { var savedSearches = searches.list(); assert.strictEqual(savedSearches.length, 2); - + for (var i = 0; i < savedSearches.length; i++) { assert.ok(savedSearches[i]); } - + done(); }); }) - + it("Callback#list filter", function (done) { var searches = this.service.savedSearches(); searches.fetch({ search: "Error" }, function (err, searches) { var savedSearches = searches.list(); assert.ok(savedSearches.length > 0); - + for (var i = 0; i < savedSearches.length; i++) { assert.ok(savedSearches[i]); } - + done(); }); }) - + it("Callback#list offset", function (done) { var searches = this.service.savedSearches(); searches.fetch({ offset: 2, count: 1 }, function (err, searches) { @@ -89,61 +89,61 @@ exports.setup = function (svc, loggedOutSvc) { assert.strictEqual(searches.paging().offset, 2); assert.strictEqual(searches.paging().perPage, 1); assert.strictEqual(savedSearches.length, 1); - + for (var i = 0; i < savedSearches.length; i++) { assert.ok(savedSearches[i]); } - + done(); }); }) - + it("Callback#create + modify + delete saved search", function (done) { var name = "jssdk_savedsearch"; var originalSearch = "search * | head 1"; var updatedSearch = "search * | head 10"; var updatedDescription = "description"; - + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - + Async.chain([ function (done) { searches.create({ search: originalSearch, name: name }, done); }, function (search, done) { assert.ok(search); - + assert.strictEqual(search.name, name); assert.strictEqual(search.properties().search, originalSearch); assert.ok(!search.properties().description); - + search.update({ search: updatedSearch }, done); }, function (search, done) { assert.ok(search); assert.ok(search); - + assert.strictEqual(search.name, name); assert.strictEqual(search.properties().search, updatedSearch); assert.ok(!search.properties().description); - + search.update({ description: updatedDescription }, done); }, function (search, done) { assert.ok(search); assert.ok(search); - + assert.strictEqual(search.name, name); assert.strictEqual(search.properties().search, updatedSearch); assert.strictEqual(search.properties().description, updatedDescription); - + search.fetch(done); }, function (search, done) { // Verify that we have the required fields assert.ok(search.fields().optional.length > 1); assert.ok(utils.indexOf(search.fields().optional, "disabled") > -1); - + search.remove(done); } ], @@ -153,7 +153,7 @@ exports.setup = function (svc, loggedOutSvc) { } ); }) - + it("Callback#dispatch error", function (done) { var name = "jssdk_savedsearch_" + getNextId(); var originalSearch = "search index=_internal | head 1"; @@ -167,24 +167,24 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Callback#dispatch omitting optional arguments", function (done) { var name = "jssdk_savedsearch_" + getNextId(); var originalSearch = "search index=_internal | head 1"; - + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - + Async.chain( [function (done) { searches.create({ search: originalSearch, name: name }, done); }, function (search, done) { assert.ok(search); - + assert.strictEqual(search.name, name); assert.strictEqual(search.properties().search, originalSearch); assert.ok(!search.properties().description); - + search.dispatch(done); }, function (job, search, done) { @@ -194,7 +194,7 @@ exports.setup = function (svc, loggedOutSvc) { ); done(); }) - + it("Callback#history error", function (done) { var name = "jssdk_savedsearch_" + getNextId(); var originalSearch = "search index=_internal | head 1"; @@ -208,7 +208,7 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Callback#Update error", function (done) { var name = "jssdk_savedsearch_" + getNextId(); var originalSearch = "search index=_internal | head 1"; @@ -224,35 +224,35 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Callback#oneshot requires search string", function (done) { assert.throws(function () { this.service.oneshotSearch({ name: "jssdk_oneshot_" + getNextId() }, function (err) { }); }); done(); }) - + it("Callback#Create + dispatch + history", function (done) { var name = "jssdk_savedsearch_" + getNextId(); var originalSearch = "search index=_internal | head 1"; - + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - + Async.chain( function (done) { searches.create({ search: originalSearch, name: name }, done); }, function (search, done) { assert.ok(search); - + assert.strictEqual(search.name, name); assert.strictEqual(search.properties().search, originalSearch); assert.ok(!search.properties().description); - + search.dispatch({ force_dispatch: false, "dispatch.buckets": 295 }, done); }, function (job, search, done) { assert.ok(job); assert.ok(search); - + tutils.pollUntil( job, function (j) { @@ -271,22 +271,22 @@ exports.setup = function (svc, loggedOutSvc) { assert.ok(jobs.length > 0); assert.ok(search); assert.ok(originalJob); - + var cancel = function (job) { return function (cb) { job.cancel(cb); }; }; - + var found = false; var cancellations = []; for (var i = 0; i < jobs.length; i++) { cancellations.push(cancel(jobs[i])); found = found || (jobs[i].sid === originalJob.sid); } - + assert.ok(found); - + search.remove(function (err) { if (err) { done(err); @@ -302,7 +302,7 @@ exports.setup = function (svc, loggedOutSvc) { } ); }) - + it("Callback#job events fails", function (done) { var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); job.events({}, function (err) { @@ -310,7 +310,7 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Callback#job preview fails", function (done) { var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); job.preview({}, function (err) { @@ -318,7 +318,7 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Callback#job results fails", function (done) { var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); job.results({}, function (err) { @@ -326,7 +326,7 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Callback#job searchlog fails", function (done) { var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); job.searchlog(function (err) { @@ -334,7 +334,7 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Callback#job summary fails", function (done) { var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); job.summary({}, function (err) { @@ -342,7 +342,7 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Callback#job timeline fails", function (done) { var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); job.timeline({}, function (err) { @@ -350,7 +350,7 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Callback#delete test saved searches", function (done) { var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); searches.fetch(function (err, searches) { @@ -371,7 +371,7 @@ exports.setup = function (svc, loggedOutSvc) { ); }); }) - + it("Callback#setupInfo fails", function (done) { var searches = new splunkjs.Service.Application(this.loggedOutService, "search"); searches.setupInfo(function (err, content, that) { @@ -379,7 +379,7 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Callback#setupInfo succeeds", function (done) { var app = new splunkjs.Service.Application(this.service, "sdk-app-collection"); app.setupInfo(function (err, content, app) { @@ -394,7 +394,7 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Callback#updateInfo", function (done) { var app = new splunkjs.Service.Application(this.service, "search"); app.updateInfo(function (err, info, app) { @@ -404,7 +404,7 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Callback#updateInfo failure", function (done) { var app = new splunkjs.Service.Application(this.loggedOutService, "sdk-app-collection"); app.updateInfo(function (err, info, app) { diff --git a/tests_spike/service_tests/serverinfo.js b/tests_spike/service_tests/serverinfo.js index 860bc47d8..20d833ead 100644 --- a/tests_spike/service_tests/serverinfo.js +++ b/tests_spike/service_tests/serverinfo.js @@ -2,15 +2,15 @@ exports.setup = function (svc) { var assert = require('chai').assert; return ( - describe("Server Info Test", function(){ - before(function (done) { + describe("Server Info Test", function () { + beforeEach(function (done) { this.service = svc; done(); }) - + it("Callback#Basic", function (done) { var service = this.service; - + service.serverInfo(function (err, info) { assert.ok(!err); assert.ok(info); @@ -18,7 +18,7 @@ exports.setup = function (svc) { assert.ok(info.properties().hasOwnProperty("version")); assert.ok(info.properties().hasOwnProperty("serverName")); assert.ok(info.properties().hasOwnProperty("os_version")); - + done(); }); }) diff --git a/tests_spike/service_tests/storagepasswords.js b/tests_spike/service_tests/storagepasswords.js index dfd0953e7..7802994e3 100644 --- a/tests_spike/service_tests/storagepasswords.js +++ b/tests_spike/service_tests/storagepasswords.js @@ -8,12 +8,12 @@ exports.setup = function (svc) { return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); }; return ( - describe("Storage Password Tests", function(){ - before(function (done) { + describe("Storage Password Tests", function () { + beforeEach(function (done) { this.service = svc; done(); }); - + it("Callback#Create", function (done) { var startcount = -1; var name = "delete-me-" + getNextId(); @@ -52,7 +52,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Create with backslashes", function (done) { var startcount = -1; var name = "\\delete-me-" + getNextId(); @@ -91,7 +91,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Create with slashes", function (done) { var startcount = -1; var name = "/delete-me-" + getNextId(); @@ -130,7 +130,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Create without realm", function (done) { var startcount = -1; var name = "delete-me-" + getNextId(); @@ -168,7 +168,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Create should fail without user, or realm", function (done) { var that = this; Async.chain([ @@ -185,7 +185,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Create should fail without password", function (done) { var that = this; Async.chain([ @@ -202,7 +202,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Create should fail without user, realm, or password", function (done) { var that = this; Async.chain([ @@ -219,7 +219,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Create with colons", function (done) { var startcount = -1; var name = ":delete-me-" + getNextId(); @@ -258,7 +258,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Create crazy", function (done) { var startcount = -1; var name = "delete-me-" + getNextId(); @@ -302,7 +302,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Create with unicode chars", function (done) { var startcount = -1; var name = "delete-me-" + getNextId(); @@ -346,7 +346,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Read", function (done) { var startcount = -1; var name = "delete-me-" + getNextId(); @@ -374,10 +374,10 @@ exports.setup = function (svc) { catch (e) { assert.ok(false); } - + var list = storagePasswords.list(); var found = false; - + assert.strictEqual(startcount + 1, list.length); for (var i = 0; i < list.length; i++) { if (realm + ":" + name + ":" === list[i].name) { @@ -385,7 +385,7 @@ exports.setup = function (svc) { } } assert.ok(found); - + storagePassword.remove(done); }, function (done) { @@ -402,7 +402,7 @@ exports.setup = function (svc) { } ); }) - + it("Callback#Read with slashes", function (done) { var startcount = -1; var name = "/delete-me-" + getNextId(); @@ -430,10 +430,10 @@ exports.setup = function (svc) { catch (e) { assert.ok(false); } - + var list = storagePasswords.list(); var found = false; - + assert.strictEqual(startcount + 1, list.length); for (var i = 0; i < list.length; i++) { if (realm + ":" + name + ":" === list[i].name) { @@ -441,7 +441,7 @@ exports.setup = function (svc) { } } assert.ok(found); - + storagePassword.remove(done); }, function (done) { @@ -458,7 +458,7 @@ exports.setup = function (svc) { } ); }) - + // Disabling this test because clear_password field has been removed in Splunk 8.2 // // @@ -497,7 +497,7 @@ exports.setup = function (svc) { // var list = storagePasswords.list(); // var found = false; // var index = -1; - + // assert.strictEqual(startcount + 1, list.length); // for (var i = 0; i < list.length; i ++) { // if (realm + ":" + name + ":" === list[i].name) { @@ -510,7 +510,7 @@ exports.setup = function (svc) { // } // } // assert.ok(found); - + // if (!found) { // done(new Error("Didn't find the created password")); // } @@ -532,7 +532,7 @@ exports.setup = function (svc) { // } // ); // }, - + it("Callback#Delete", function (done) { var startcount = -1; var name = "delete-me-" + getNextId(); @@ -573,7 +573,7 @@ exports.setup = function (svc) { var list = storagePasswords.list(); var found = false; var index = -1; - + assert.strictEqual(startcount + 1, list.length); for (var i = 0; i < list.length; i++) { if (realm + ":" + name + ":" === list[i].name) { @@ -586,7 +586,7 @@ exports.setup = function (svc) { } } assert.ok(found); - + if (!found) { done(new Error("Didn't find the created password")); } diff --git a/tests_spike/service_tests/typeahead.js b/tests_spike/service_tests/typeahead.js index 04b1ede4a..88687679e 100644 --- a/tests_spike/service_tests/typeahead.js +++ b/tests_spike/service_tests/typeahead.js @@ -2,13 +2,13 @@ exports.setup = function (svc, loggedOutSvc) { var assert = require('chai').assert; return ( - describe("Typeahad Tests", function(){ - before(function (done) { + describe("Typeahad Tests", function () { + beforeEach(function (done) { this.service = svc; this.loggedOutService = loggedOutSvc; done(); }) - + it("Callback#Typeahead failure", function (done) { var service = this.loggedOutService; service.typeahead("index=", 1, function (err, options) { @@ -16,10 +16,10 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Callback#Basic typeahead", function (done) { var service = this.service; - + service.typeahead("index=", 1, function (err, options) { assert.ok(!err); assert.ok(options); @@ -28,7 +28,7 @@ exports.setup = function (svc, loggedOutSvc) { done(); }); }) - + it("Typeahead with omitted optional arguments", function (done) { var service = this.service; service.typeahead("index=", function (err, options) { diff --git a/tests_spike/service_tests/user.js b/tests_spike/service_tests/user.js index 6c559986e..173f2a6a6 100644 --- a/tests_spike/service_tests/user.js +++ b/tests_spike/service_tests/user.js @@ -10,19 +10,19 @@ exports.setup = function (svc, loggedOutSvc) { return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); }; return ( - describe("User Tests", function(){ + describe("User Tests", function () { - before(function (done) { + beforeEach(function (done) { this.service = svc; this.loggedOutService = loggedOutSvc; done(); }) - after(function (done) { + afterEach(function (done) { this.service.logout(done); }) - it("Callback#CCurrent user", function (done) { + it("Callback#Current user", function (done) { var service = this.service; service.currentUser(function (err, user) { @@ -33,7 +33,7 @@ exports.setup = function (svc, loggedOutSvc) { }); }) - it("Callback#CCurrent user fails", function (done) { + it("Callback#Current user fails", function (done) { var service = this.loggedOutService; service.currentUser(function (err, user) { @@ -42,7 +42,7 @@ exports.setup = function (svc, loggedOutSvc) { }); }) - it("Callback#CList users", function (done) { + it("Callback#List users", function (done) { var service = this.service; service.users().fetch(function (err, users) { @@ -56,7 +56,7 @@ exports.setup = function (svc, loggedOutSvc) { }); }) - it("Callback#Ccreate user failure", function (done) { + it("Callback#create user failure", function (done) { this.loggedOutService.users().create( { name: "jssdk_testuser", password: "abcdefg!", roles: "user" }, function (err, response) { @@ -66,7 +66,7 @@ exports.setup = function (svc, loggedOutSvc) { ); }) - it("Callback#CCreate + update + delete user", function (done) { + it("Callback#Create + update + delete user", function (done) { var service = this.service; var name = "jssdk_testuser"; @@ -99,7 +99,7 @@ exports.setup = function (svc, loggedOutSvc) { ); }) - it("Callback#CRoles", function (done) { + it("Callback#Roles", function (done) { var service = this.service; var name = "jssdk_testuser_" + getNextId(); @@ -139,7 +139,7 @@ exports.setup = function (svc, loggedOutSvc) { ); }) - it("Callback#CPasswords", function (done) { + it("Callback#Passwords", function (done) { var service = this.service; var newService = null; var name = "jssdk_testuser_" + getNextId(); @@ -225,7 +225,7 @@ exports.setup = function (svc, loggedOutSvc) { ); }) - it("Callback#Cdelete test users", function (done) { + it("Callback#delete test users", function (done) { var users = this.service.users(); users.fetch(function (err, users) { var userList = users.list(); diff --git a/tests_spike/service_tests/view.js b/tests_spike/service_tests/view.js index 08217cac6..e73489b9c 100644 --- a/tests_spike/service_tests/view.js +++ b/tests_spike/service_tests/view.js @@ -4,9 +4,9 @@ exports.setup = function (svc) { var splunkjs = require('../../index'); var Async = splunkjs.Async; return ( - describe("Views ", function(){ - - before(function (done) { + describe("Views ", function () { + + beforeEach(function (done) { this.service = svc; done(); }) From 76f5849dc8881376d457a91965a74baf1bd106b1 Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Tue, 20 Jul 2021 14:44:16 +0530 Subject: [PATCH 5/7] Added support for node@8.17.0 --- bin/cli.js | 2 +- tests/modularinputs/index.js | 14 +- tests/modularinputs/test_event.js | 56 +- tests/modularinputs/test_input_definition.js | 27 +- tests/modularinputs/test_modularinput.js | 88 +- tests/modularinputs/test_scheme.js | 36 +- .../test_validation_definition.js | 16 +- tests/service_tests/app.js | 278 +- tests/service_tests/collection.js | 100 +- tests/service_tests/configuration.js | 394 +-- tests/service_tests/datamodels.js | 1866 +++++------ tests/service_tests/endpoint.js | 58 +- tests/service_tests/entity.js | 201 +- tests/service_tests/firedalerts.js | 486 +-- tests/service_tests/indexes.js | 757 ++--- tests/service_tests/job.js | 1802 +++++------ tests/service_tests/namespace.js | 456 +-- tests/service_tests/parser.js | 49 +- tests/service_tests/pivot.js | 2855 +++++++++-------- tests/service_tests/properties.js | 249 +- tests/service_tests/savedsearch.js | 751 +++-- tests/service_tests/serverinfo.js | 44 +- tests/service_tests/storagepasswords.js | 1189 ++++--- tests/service_tests/typeahead.js | 68 +- tests/service_tests/user.js | 435 +-- tests/service_tests/view.js | 113 +- tests/test_async.js | 988 +++--- tests/test_context.js | 214 +- tests/test_examples.js | 156 +- tests/test_http.js | 121 +- tests/test_log.js | 106 +- tests/test_service.js | 47 +- tests/test_utils.js | 426 +-- tests/tests.js | 43 +- .../data_model_expected_calculations.json | 90 - .../data/data_model_expected_constraints.json | 6 - .../data/data_model_expected_fields.json | 194 -- tests_spike/data/data_model_for_pivot.json | 336 -- .../data/data_model_with_test_objects.json | 258 -- tests_spike/data/empty_data_model.json | 5 - tests_spike/data/inheritance_test_data.json | 375 --- .../data/model_with_empty_headers.json | 5 - .../data/model_with_multiple_types.json | 604 ---- .../data/model_with_unicode_headers.json | 5 - tests_spike/data/object_with_one_search.json | 14 - .../data/object_with_two_searches.json | 22 - .../data/argument_with_defaults.xml | 5 - .../data/argument_without_defaults.xml | 7 - .../modularinputs/data/conf_with_0_inputs.xml | 8 - .../modularinputs/data/conf_with_2_inputs.xml | 29 - .../modularinputs/data/conf_with_5_inputs.xml | 55 - .../data/conf_with_invalid_inputs.xml | 15 - .../modularinputs/data/event_maximal.xml | 9 - .../modularinputs/data/event_minimal.xml | 5 - .../data/scheme_with_defaults.xml | 11 - .../data/scheme_without_defaults.xml | 24 - .../data/stream_with_five_events.xml | 47 - .../data/stream_with_one_event.xml | 11 - .../data/stream_with_two_events.xml | 20 - .../data/stream_with_two_json_events.xml | 20 - tests_spike/modularinputs/data/validation.xml | 22 - .../modularinputs/data/validation_error.xml | 1 - tests_spike/modularinputs/index.js | 27 - tests_spike/modularinputs/test_event.js | 355 -- .../modularinputs/test_input_definition.js | 132 - .../modularinputs/test_modularinput.js | 728 ----- tests_spike/modularinputs/test_scheme.js | 151 - .../test_validation_definition.js | 90 - tests_spike/modularinputs/utils.js | 147 - tests_spike/service_tests/app.js | 211 -- tests_spike/service_tests/collection.js | 102 - tests_spike/service_tests/configuration.js | 245 -- tests_spike/service_tests/datamodels.js | 1109 ------- tests_spike/service_tests/endpoint.js | 71 - tests_spike/service_tests/entity.js | 156 - tests_spike/service_tests/firedalerts.js | 310 -- tests_spike/service_tests/indexes.js | 473 --- tests_spike/service_tests/job.js | 1025 ------ tests_spike/service_tests/namespace.js | 287 -- tests_spike/service_tests/parser.js | 63 - tests_spike/service_tests/pivot.js | 1600 --------- tests_spike/service_tests/properties.js | 164 - tests_spike/service_tests/savedsearch.js | 457 --- tests_spike/service_tests/serverinfo.js | 58 - tests_spike/service_tests/storagepasswords.js | 644 ---- tests_spike/service_tests/typeahead.js | 82 - tests_spike/service_tests/user.js | 291 -- tests_spike/service_tests/view.js | 97 - tests_spike/test_async.js | 537 ---- tests_spike/test_context.js | 1106 ------- tests_spike/test_examples.js | 506 --- tests_spike/test_http.js | 314 -- tests_spike/test_log.js | 94 - tests_spike/test_service.js | 86 - tests_spike/test_utils.js | 268 -- tests_spike/tests.browser.html | 204 -- tests_spike/tests.js | 86 - tests_spike/utils.js | 53 - 98 files changed, 7269 insertions(+), 21754 deletions(-) delete mode 100644 tests_spike/data/data_model_expected_calculations.json delete mode 100644 tests_spike/data/data_model_expected_constraints.json delete mode 100644 tests_spike/data/data_model_expected_fields.json delete mode 100644 tests_spike/data/data_model_for_pivot.json delete mode 100644 tests_spike/data/data_model_with_test_objects.json delete mode 100644 tests_spike/data/empty_data_model.json delete mode 100644 tests_spike/data/inheritance_test_data.json delete mode 100644 tests_spike/data/model_with_empty_headers.json delete mode 100644 tests_spike/data/model_with_multiple_types.json delete mode 100644 tests_spike/data/model_with_unicode_headers.json delete mode 100644 tests_spike/data/object_with_one_search.json delete mode 100644 tests_spike/data/object_with_two_searches.json delete mode 100644 tests_spike/modularinputs/data/argument_with_defaults.xml delete mode 100644 tests_spike/modularinputs/data/argument_without_defaults.xml delete mode 100644 tests_spike/modularinputs/data/conf_with_0_inputs.xml delete mode 100644 tests_spike/modularinputs/data/conf_with_2_inputs.xml delete mode 100644 tests_spike/modularinputs/data/conf_with_5_inputs.xml delete mode 100644 tests_spike/modularinputs/data/conf_with_invalid_inputs.xml delete mode 100644 tests_spike/modularinputs/data/event_maximal.xml delete mode 100644 tests_spike/modularinputs/data/event_minimal.xml delete mode 100644 tests_spike/modularinputs/data/scheme_with_defaults.xml delete mode 100644 tests_spike/modularinputs/data/scheme_without_defaults.xml delete mode 100644 tests_spike/modularinputs/data/stream_with_five_events.xml delete mode 100644 tests_spike/modularinputs/data/stream_with_one_event.xml delete mode 100644 tests_spike/modularinputs/data/stream_with_two_events.xml delete mode 100644 tests_spike/modularinputs/data/stream_with_two_json_events.xml delete mode 100644 tests_spike/modularinputs/data/validation.xml delete mode 100644 tests_spike/modularinputs/data/validation_error.xml delete mode 100644 tests_spike/modularinputs/index.js delete mode 100644 tests_spike/modularinputs/test_event.js delete mode 100644 tests_spike/modularinputs/test_input_definition.js delete mode 100644 tests_spike/modularinputs/test_modularinput.js delete mode 100644 tests_spike/modularinputs/test_scheme.js delete mode 100644 tests_spike/modularinputs/test_validation_definition.js delete mode 100644 tests_spike/modularinputs/utils.js delete mode 100644 tests_spike/service_tests/app.js delete mode 100644 tests_spike/service_tests/collection.js delete mode 100644 tests_spike/service_tests/configuration.js delete mode 100644 tests_spike/service_tests/datamodels.js delete mode 100644 tests_spike/service_tests/endpoint.js delete mode 100644 tests_spike/service_tests/entity.js delete mode 100644 tests_spike/service_tests/firedalerts.js delete mode 100644 tests_spike/service_tests/indexes.js delete mode 100644 tests_spike/service_tests/job.js delete mode 100644 tests_spike/service_tests/namespace.js delete mode 100644 tests_spike/service_tests/parser.js delete mode 100644 tests_spike/service_tests/pivot.js delete mode 100644 tests_spike/service_tests/properties.js delete mode 100644 tests_spike/service_tests/savedsearch.js delete mode 100644 tests_spike/service_tests/serverinfo.js delete mode 100644 tests_spike/service_tests/storagepasswords.js delete mode 100644 tests_spike/service_tests/typeahead.js delete mode 100644 tests_spike/service_tests/user.js delete mode 100644 tests_spike/service_tests/view.js delete mode 100644 tests_spike/test_async.js delete mode 100644 tests_spike/test_context.js delete mode 100644 tests_spike/test_examples.js delete mode 100644 tests_spike/test_http.js delete mode 100644 tests_spike/test_log.js delete mode 100644 tests_spike/test_service.js delete mode 100644 tests_spike/test_utils.js delete mode 100644 tests_spike/tests.browser.html delete mode 100644 tests_spike/tests.js delete mode 100644 tests_spike/utils.js diff --git a/bin/cli.js b/bin/cli.js index a6d62549e..63c5f5fb9 100755 --- a/bin/cli.js +++ b/bin/cli.js @@ -761,7 +761,7 @@ .concat(cmdline.opts.version ? makeOption("version", cmdline.opts.version) : "") .concat(cmdline.opts.password ? makeOption("password", cmdline.opts.password) : "") .concat(cmdline.opts.reporter ? makeOption("reporter", cmdline.opts.reporter.toLowerCase()) : "") - .concat(cmdline.opts.ui ? makeOption("ui", cmdline.opts.ui) : ["--ui", "exports"]) + .concat(cmdline.opts.ui ? makeOption("ui", cmdline.opts.ui) : ["--ui", "bdd"]) .concat(cmdline.opts.timeout ? makeOption("timeout", cmdline.opts.timeout) : ["--timeout", "5000"]) .concat(cmdline.opts.grep ? makeOption("grep", cmdline.opts.grep) : "") .concat(cmdline.opts.exit ? "--exit" : "--exit") diff --git a/tests/modularinputs/index.js b/tests/modularinputs/index.js index bd0ccbf4f..78f036634 100644 --- a/tests/modularinputs/index.js +++ b/tests/modularinputs/index.js @@ -17,11 +17,11 @@ var splunkjs = require('../../index'); splunkjs.Logger.setLevel("ALL"); // // Modular input tests -module.exports = { - 'Event': require('./test_event').setup(), - 'InputDefinition': require('./test_input_definition').setup(), - 'ModularInput': require('./test_modularinput').setup(), - 'Scheme': require('./test_scheme').setup(), - 'ValidationDefinition': require('./test_validation_definition').setup(), -} +module.exports = ( + require('./test_event').setup(), + require('./test_input_definition').setup(), + require('./test_modularinput').setup(), + require('./test_scheme').setup(), + require('./test_validation_definition').setup() +) diff --git a/tests/modularinputs/test_event.js b/tests/modularinputs/test_event.js index ee27e438a..34fcceba8 100644 --- a/tests/modularinputs/test_event.js +++ b/tests/modularinputs/test_event.js @@ -57,13 +57,13 @@ exports.setup = function () { } } - return { - "Event tests": { - beforeEach: function (done) { + return ( + describe("Event tests", function () { + this.beforeEach(function (done) { done(); - }, + }); - "Event class handles times correctly - Date object": function (done) { + it("Event class handles times correctly - Date object", function (done) { var now = Date.now(); var expected = (now / 1000).toFixed(3); var found = Event.formatTime(now); @@ -80,9 +80,9 @@ exports.setup = function () { assert.equal(otherFound, otherExpected); done(); - }, + }); - "Event class handles times correctly - String": function (done) { + it("Event class handles times correctly - String", function (done) { // Test time in seconds var stringTime = "1372187084"; var expected = 1372187084.000; @@ -114,9 +114,9 @@ exports.setup = function () { assert.equal(found, expected); done(); - }, + }); - "Event class handles times correctly - Number (integer)": function (done) { + it("Event class handles times correctly - Number (integer)", function (done) { // Test time in seconds var intTime = 1372187084; var expected = 1372187084.000; @@ -142,9 +142,9 @@ exports.setup = function () { assert.equal(found, expected); done(); - }, + }); - "Event class handles times correctly - Number (float)": function (done) { + it("Event class handles times correctly - Number (float)", function (done) { // Test a perfect value var floatTime = 1372187084.424; var expected = 1372187084.424; @@ -182,9 +182,9 @@ exports.setup = function () { assert.equal(found, expected); done(); - }, + }); - "Event without enough fields throws error": function (done) { + it("Event without enough fields throws error", function (done) { try { var myEvent = new Event(); myEvent._writeTo(testUtils.getDuplexStream()); @@ -195,9 +195,9 @@ exports.setup = function () { assert.ok(e); } done(); - }, + }); - "Event with minimal config matches expected XML": function (done) { + it("Event with minimal config matches expected XML", function (done) { var out = testUtils.getDuplexStream(); var myEvent = new Event({ @@ -219,9 +219,9 @@ exports.setup = function () { assert.ok(false); } done(); - }, + }); - "Event with full config matches expected XML": function (done) { + it("Event with full config matches expected XML", function (done) { var out = testUtils.getDuplexStream(); var myEvent = new Event({ @@ -249,9 +249,9 @@ exports.setup = function () { assert.ok(false); } done(); - }, + }); - "EventWriter event writing works": function (done) { + it("EventWriter event writing works", function (done) { var out = testUtils.getDuplexStream(); var err = testUtils.getDuplexStream(); @@ -291,9 +291,9 @@ exports.setup = function () { assert.ok(false); } done(); - }, + }); - "EventWriter gets an error from invalid Event": function (done) { + it("EventWriter gets an error from invalid Event", function (done) { var out = testUtils.getDuplexStream(); var err = testUtils.getDuplexStream(); @@ -308,9 +308,9 @@ exports.setup = function () { assert.ok(utils.startsWith(ew._err._read(), Logger.WARN)); } done(); - }, + }); - "EventWriter logging works": function (done) { + it("EventWriter logging works", function (done) { var out = testUtils.getDuplexStream(); var err = testUtils.getDuplexStream(); @@ -324,9 +324,9 @@ exports.setup = function () { assert.ok(false); } done(); - }, + }); - "EventWriter XML writing works": function (done) { + it("EventWriter XML writing works", function (done) { var out = testUtils.getDuplexStream(); var err = testUtils.getDuplexStream(); @@ -344,9 +344,9 @@ exports.setup = function () { assert.ok(false); } done(); - } - } - }; + }); + }) + ) }; // Run the individual test suite diff --git a/tests/modularinputs/test_input_definition.js b/tests/modularinputs/test_input_definition.js index 68a1a7725..af44e67cb 100644 --- a/tests/modularinputs/test_input_definition.js +++ b/tests/modularinputs/test_input_definition.js @@ -25,13 +25,13 @@ exports.setup = function () { splunkjs.Logger.setLevel("ALL"); - return { - "Input Definition tests": { - beforeEach: function (done) { + return ( + describe("Input Definition tests", function (done) { + this.beforeEach(function (done) { done(); - }, + }); - "Parse produces expected result - no inputs": function (done) { + it("Parse produces expected result - no inputs", function (done) { var expected = new InputDefinition(); expected.metadata = { "server_host": "tiny", @@ -54,9 +54,9 @@ exports.setup = function () { assert.ok(false); } done(); - }, + }); - "Parse produces expected result - 2 inputs": function (done) { + it("Parse produces expected result - 2 inputs", function (done) { var expected = new InputDefinition(); expected.metadata = { "server_host": "tiny", @@ -111,9 +111,9 @@ exports.setup = function () { assert.ok(false); } done(); - }, + }); - "Parse throws an error with malformed input definition": function (done) { + it("Parse throws an error with malformed input definition", function (done) { try { InputDefinition.parse(utils.readFile(__filename, "../data/conf_with_invalid_inputs.xml")); assert.ok(false); @@ -122,11 +122,10 @@ exports.setup = function () { assert.ok(true); } done(); - } - } - }; -}; - + }); + }) + ) +} // Run the individual test suite if (module === require.cache[__filename] && !module.parent) { module.exports = exports.setup(); diff --git a/tests/modularinputs/test_modularinput.js b/tests/modularinputs/test_modularinput.js index 3fe843f0e..3c2e5f59c 100644 --- a/tests/modularinputs/test_modularinput.js +++ b/tests/modularinputs/test_modularinput.js @@ -33,13 +33,13 @@ exports.setup = function () { var TEST_SCRIPT_PATH = "__IGNORED_SCRIPT_PATH__"; - return { - "ModularInput tests": { - before: function (done) { + return ( + describe("ModularInput tests", function (done) { + this.beforeEach(function (done) { done(); - }, + }); - "ModularInputs logger works, severity: DEBUG": function (done) { + it("ModularInputs logger works, severity: DEBUG", function (done) { var err = testUtils.getDuplexStream(); try { Logger.debug("Modular Input Tests", "Something happened!", err); @@ -49,9 +49,9 @@ exports.setup = function () { assert.ok(false); } done(); - }, + }); - "ModularInputs logger works, severity: INFO": function (done) { + it("ModularInputs logger works, severity: INFO", function (done) { var err = testUtils.getDuplexStream(); try { Logger.info("Modular Input Tests", "Something happened!", err); @@ -61,9 +61,9 @@ exports.setup = function () { assert.ok(false); } done(); - }, + }); - "ModularInputs logger works, severity: WARN": function (done) { + it("ModularInputs logger works, severity: WARN", function (done) { var err = testUtils.getDuplexStream(); try { Logger.warn("Modular Input Tests", "Something happened!", err); @@ -73,9 +73,9 @@ exports.setup = function () { assert.ok(false); } done(); - }, + }); - "ModularInputs logger works, severity: ERROR": function (done) { + it("ModularInputs logger works, severity: ERROR", function (done) { var err = testUtils.getDuplexStream(); try { Logger.error("Modular Input Tests", "Something happened!", err); @@ -85,9 +85,9 @@ exports.setup = function () { assert.ok(false); } done(); - }, + }); - "ModularInputs logger works, severity: FATAL": function (done) { + it("ModularInputs logger works, severity: FATAL", function (done) { var err = testUtils.getDuplexStream(); try { Logger.fatal("Modular Input Tests", "Something happened!", err); @@ -97,9 +97,9 @@ exports.setup = function () { assert.ok(false); } done(); - }, + }); - "An error happens when a ModularInput gets bad args": function (done) { + it("An error happens when a ModularInput gets bad args", function (done) { // A script that returns a null scheme should generate no output on stdout // and an error on stderr saying that the scheme was null. @@ -126,9 +126,9 @@ exports.setup = function () { assert.strictEqual(1, scriptStatus); done(); }); - }, + }); - "An error happens when a ModularInput has a null scheme": function (done) { + it("An error happens when a ModularInput has a null scheme", function (done) { // A script that returns a null scheme should generate no output on stdout // and an error on stderr saying that the scheme was null. @@ -155,9 +155,9 @@ exports.setup = function () { assert.strictEqual(1, scriptStatus); done(); }); - }, + }); - "ModularInput properly generates Scheme": function (done) { + it("ModularInput properly generates Scheme", function (done) { // Check that a scheme generated by a script is what we expect. exports.getScheme = function () { @@ -202,9 +202,9 @@ exports.setup = function () { assert.strictEqual(0, scriptStatus); done(); }); - }, + }); - "ModularInput Input Validation succeeds": function (done) { + it("ModularInput Input Validation succeeds", function (done) { exports.getScheme = function () { return null; }; @@ -237,9 +237,9 @@ exports.setup = function () { done(); }); inStream.emit("data", Buffer.from(validationFile)); - }, + }); - "ModularInput Input Validation succeeds when validateInput is undefined": function (done) { + it("ModularInput Input Validation succeeds when validateInput is undefined", function (done) { exports.getScheme = function () { return null; }; @@ -269,9 +269,9 @@ exports.setup = function () { done(); }); inStream.emit("data", Buffer.from(validationFile)); - }, + }); - "ModularInput Input Validation times out after 30s with impartial XML": function (done) { + it("ModularInput Input Validation times out after 30s with impartial XML", function (done) { this.timeout(40000); exports.getScheme = function () { @@ -311,9 +311,9 @@ exports.setup = function () { }); // Remove the closing tag to send impartial data inStream.emit("data", Buffer.from(validationFile.replace("", ""))); - }, + }); - "ModularInput Input Validation fails": function (done) { + it("ModularInput Input Validation fails", function (done) { // Make logger noop so testoutput is cleaner var loggerErrorBackup = Logger.error; Logger.error = function () { }; @@ -368,9 +368,9 @@ exports.setup = function () { done(); }); inStream.emit("data", Buffer.from(validationFile)); - }, + }); - "ModularInput streaming events works - 2 inputs": function (done) { + it("ModularInput streaming events works - 2 inputs", function (done) { exports.getScheme = function () { return null; }; @@ -416,9 +416,9 @@ exports.setup = function () { done(); }); inStream.emit("data", Buffer.from(inputConfiguration)); - }, + }); - "ModularInput streaming events works - 5 inputs": function (done) { + it("ModularInput streaming events works - 5 inputs", function (done) { exports.getScheme = function () { return null; }; @@ -497,9 +497,9 @@ exports.setup = function () { done(); }); inStream.emit("data", Buffer.from(inputConfiguration)); - }, + }); - "ModularInput streaming events works - as object": function (done) { + it("ModularInput streaming events works - as object", function (done) { exports.getScheme = function () { return null; }; @@ -553,9 +553,9 @@ exports.setup = function () { done(); }); inStream.emit("data", Buffer.from(inputConfiguration)); - }, + }); - "ModularInput streaming events times out after 30s with impartial XML": function (done) { + it("ModularInput streaming events times out after 30s with impartial XML", function (done) { this.timeout(40000); exports.getScheme = function () { @@ -607,9 +607,9 @@ exports.setup = function () { }); // Remove the closing tag to send impartial data inStream.emit("data", Buffer.from(inputConfiguration.replace("", ""))); - }, + }); - "ModularInput streaming events times out after 30s with no data sent": function (done) { + it("ModularInput streaming events times out after 30s with no data sent", function (done) { this.timeout(40000); exports.getScheme = function () { @@ -641,9 +641,9 @@ exports.setup = function () { assert.strictEqual(1, scriptStatus); done(); }); - }, + }); - "ModularInput streaming events times out after 30s with data sent after 30s": function (done) { + it("ModularInput streaming events times out after 30s with data sent after 30s", function (done) { this.timeout(40000); exports.getScheme = function () { @@ -680,9 +680,9 @@ exports.setup = function () { assert.strictEqual("", ew._err._read()); assert.strictEqual(1, scriptStatus); }); - }, + }); - "ModularInput gets a valid Service": function (done) { + it("ModularInput gets a valid Service", function (done) { exports.getScheme = function () { return null; }; @@ -717,9 +717,9 @@ exports.setup = function () { done(); }); inStream.emit("data", Buffer.from(inputConfiguration)); - } - } - }; + }); + }) + ) }; // Run the individual test suite diff --git a/tests/modularinputs/test_scheme.js b/tests/modularinputs/test_scheme.js index c82e8cc1d..3d147753f 100644 --- a/tests/modularinputs/test_scheme.js +++ b/tests/modularinputs/test_scheme.js @@ -26,13 +26,11 @@ exports.setup = function () { var utils = ModularInput.utils; splunkjs.Logger.setLevel("ALL"); - return { - "Scheme tests": { - before: function (done) { - done(); - }, - "Generate XML from scheme with default values": function (done) { + return ( + describe("Scheme tests", function () { + + it("Generate XML from scheme with default values", function () { // Checks the Scheme generated by creating a Scheme object and setting no fields on it. // This test checks for sane defaults in the Scheme class. @@ -47,10 +45,10 @@ exports.setup = function () { assert.equal(myScheme.useSingleInstance, false); assert.equal(myScheme.streamingMode, Scheme.streamingModeXML); assert.ok(testUtils.XMLCompare(expected, constructed)); - done(); - }, + ; + }); - "Generate XML from scheme": function (done) { + it("Generate XML from scheme", function () { // Checks that the XML generated by a Scheme object with all its fields set and // some arguments added matches what we expect @@ -95,10 +93,10 @@ exports.setup = function () { var expected = ET.parse(utils.readFile(__filename, "../data/scheme_without_defaults.xml")).getroot(); assert.ok(testUtils.XMLCompare(expected, constructed)); - done(); - }, + ; + }); - "Generate XML from argument with default values": function (done) { + it("Generate XML from argument with default values", function () { // Checks that the XML produced from an Argument object that is initialized has // is what we expect. This is mostly a check of the default values. @@ -113,10 +111,10 @@ exports.setup = function () { assert.equal(myArg.requiredOnEdit, false); assert.equal(myArg.requiredOnCreate, false); assert.ok(testUtils.XMLCompare(expected, constructed)); - done(); - }, + ; + }); - "Generate XML from argument": function (done) { + it("Generate XML from argument", function () { // Checks that the XML generated by an Argument object with all possible set matches what // we expect. @@ -141,10 +139,10 @@ exports.setup = function () { var expected = ET.parse(utils.readFile(__filename, "../data/argument_without_defaults.xml")).getroot(); assert.ok(testUtils.XMLCompare(expected, constructed)); - done(); - } - } - }; + ; + }); + }) + ); }; // Run the individual test suite diff --git a/tests/modularinputs/test_validation_definition.js b/tests/modularinputs/test_validation_definition.js index 0875ab30c..658514106 100644 --- a/tests/modularinputs/test_validation_definition.js +++ b/tests/modularinputs/test_validation_definition.js @@ -24,13 +24,13 @@ exports.setup = function () { splunkjs.Logger.setLevel("ALL"); - return { - "Validation Definition tests": { - before: function (done) { + return ( + describe("Validation Definition tests", function () { + before(function (done) { done(); - }, + }); - "Parse produces expected result": function (done) { + it("Parse produces expected result", function (done) { try { var found = ValidationDefinition.parse(utils.readFile(__filename, "../data/validation.xml")); @@ -79,9 +79,9 @@ exports.setup = function () { } done(); - } - } - }; + }); + }) + ) }; // Run the individual test suite diff --git a/tests/service_tests/app.js b/tests/service_tests/app.js index 5102d1b4d..cb4e825ca 100644 --- a/tests/service_tests/app.js +++ b/tests/service_tests/app.js @@ -12,169 +12,171 @@ var getNextId = function () { exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Callback#list applications": function (done) { - var apps = this.service.apps(); - apps.fetch(function (err, apps) { - var appList = apps.list(); - assert.ok(appList.length > 0); + return ( + describe("App tests", function (done) { + beforeEach(function (done) { + this.service = svc; done(); }); - }, - "Callback#contains applications": function (done) { - var apps = this.service.apps(); - apps.fetch(function (err, apps) { - var app = apps.item("search"); - assert.ok(app); - done(); + it("Callback#list applications", function (done) { + var apps = this.service.apps(); + apps.fetch(function (err, apps) { + var appList = apps.list(); + assert.ok(appList.length > 0); + done(); + }); }); - }, - - "Callback#create + contains app": function (done) { - var name = "jssdk_testapp_" + getNextId(); - var apps = this.service.apps(); - apps.create({ name: name }, function (err, app) { - var appName = app.name; + it("Callback#contains applications", function (done) { + var apps = this.service.apps(); apps.fetch(function (err, apps) { - var entity = apps.item(appName); - assert.ok(entity); - app.remove(function () { - done(); + var app = apps.item("search"); + assert.ok(app); + done(); + }); + }); + + it("Callback#create + contains app", function (done) { + var name = "jssdk_testapp_" + getNextId(); + var apps = this.service.apps(); + + apps.create({ name: name }, function (err, app) { + var appName = app.name; + apps.fetch(function (err, apps) { + var entity = apps.item(appName); + assert.ok(entity); + app.remove(function () { + done(); + }); }); }); }); - }, - "Callback#create + modify app": function (done) { - var DESCRIPTION = "TEST DESCRIPTION"; - var VERSION = "1.1.0"; + it("Callback#create + modify app", function (done) { + var DESCRIPTION = "TEST DESCRIPTION"; + var VERSION = "1.1.0"; - var name = "jssdk_testapp_" + getNextId(); - var apps = this.service.apps(); + var name = "jssdk_testapp_" + getNextId(); + var apps = this.service.apps(); - Async.chain([ - function (callback) { - apps.create({ name: name }, callback); - }, - function (app, callback) { - assert.ok(app); - assert.strictEqual(app.name, name); - var versionMatches = app.properties().version === "1.0" || - app.properties().version === "1.0.0"; - assert.ok(versionMatches); - - app.update({ - description: DESCRIPTION, - version: VERSION - }, callback); - }, - function (app, callback) { - assert.ok(app); - var properties = app.properties(); + Async.chain([ + function (callback) { + apps.create({ name: name }, callback); + }, + function (app, callback) { + assert.ok(app); + assert.strictEqual(app.name, name); + var versionMatches = app.properties().version === "1.0" || + app.properties().version === "1.0.0"; + assert.ok(versionMatches); + + app.update({ + description: DESCRIPTION, + version: VERSION + }, callback); + }, + function (app, callback) { + assert.ok(app); + var properties = app.properties(); - assert.strictEqual(properties.description, DESCRIPTION); - assert.strictEqual(properties.version, VERSION); + assert.strictEqual(properties.description, DESCRIPTION); + assert.strictEqual(properties.version, VERSION); - app.remove(callback); - } - ], function (err) { - assert.ok(!err); - done(); + app.remove(callback); + } + ], function (err) { + assert.ok(!err); + done(); + }); }); - }, - "Callback#delete test applications": function (done) { + it("Callback#delete test applications", function (done) { - var apps = this.service.apps(); - apps.fetch(function (err, apps) { + var apps = this.service.apps(); + apps.fetch(function (err, apps) { - var appList = apps.list(); + var appList = apps.list(); - Async.parallelEach(appList, + Async.parallelEach(appList, - function (app, idx, callback) { - if (utils.startsWith(app.name, "jssdk_")) { - app.remove(callback); - } - else { - callback(); + function (app, idx, callback) { + if (utils.startsWith(app.name, "jssdk_")) { + app.remove(callback); + } + else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); } - }, function (err) { - assert.ok(!err); - done(); - } - ); + ); + }); }); - }, - - "list applications with cookies as authentication": function (done) { - this.service.serverInfo(function (err, info) { - // Cookie authentication was added in splunk 6.2 - var majorVersion = parseInt(info.properties().version.split(".")[0], 10); - var minorVersion = parseInt(info.properties().version.split(".")[1], 10); - // Skip cookie test if Splunk older than 6.2 - if (majorVersion < 6 || (majorVersion === 6 && minorVersion < 2)) { - splunkjs.Logger.log("Skipping cookie test..."); - done(); - return; - } - - var service = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - username: svc.username, - password: svc.password, - version: svc.version - }); - var service2 = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - version: svc.version - }); - - Async.chain([ - function (done) { - service.login(done); - }, - function (job, done) { - // Save the cookie store - var cookieStore = service.http._cookieStore; - // Test that there are cookies - assert.ok(!utils.isEmpty(cookieStore)); - - // Add the cookies to a service with no other authenitcation information - service2.http._cookieStore = cookieStore; - - var apps = service2.apps(); - apps.fetch(done); - }, - function (apps, done) { - var appList = apps.list(); - assert.ok(appList.length > 0); - assert.ok(!utils.isEmpty(service2.http._cookieStore)); + it("list applications with cookies as authentication", function (done) { + this.service.serverInfo(function (err, info) { + // Cookie authentication was added in splunk 6.2 + var majorVersion = parseInt(info.properties().version.split(".")[0], 10); + var minorVersion = parseInt(info.properties().version.split(".")[1], 10); + // Skip cookie test if Splunk older than 6.2 + if (majorVersion < 6 || (majorVersion === 6 && minorVersion < 2)) { + splunkjs.Logger.log("Skipping cookie test..."); done(); + return; } - ], - function (err) { - // Test that no errors were returned - assert.ok(!err); - done(); - }); - }); - } - }; + + var service = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + username: svc.username, + password: svc.password, + version: svc.version + }); + + var service2 = new splunkjs.Service( + { + scheme: svc.scheme, + host: svc.host, + port: svc.port, + version: svc.version + }); + + Async.chain([ + function (done) { + service.login(done); + }, + function (job, done) { + // Save the cookie store + var cookieStore = service.http._cookieStore; + // Test that there are cookies + assert.ok(!utils.isEmpty(cookieStore)); + + // Add the cookies to a service with no other authenitcation information + service2.http._cookieStore = cookieStore; + + var apps = service2.apps(); + apps.fetch(done); + }, + function (apps, done) { + var appList = apps.list(); + assert.ok(appList.length > 0); + assert.ok(!utils.isEmpty(service2.http._cookieStore)); + done(); + } + ], + function (err) { + // Test that no errors were returned + assert.ok(!err); + done(); + }); + }) + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/collection.js b/tests/service_tests/collection.js index ddf8f6b9a..0c5770e28 100644 --- a/tests/service_tests/collection.js +++ b/tests/service_tests/collection.js @@ -4,59 +4,61 @@ var splunkjs = require('../../index'); exports.setup = function (svc, loggedOutSvc) { - return { - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }, + return ( + describe("Collection tests", function (done) { + beforeEach(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + done(); + }); - "Methods to be overridden throw": function (done) { - var coll = new splunkjs.Service.Collection( - this.service, - "/data/indexes", - { - owner: "admin", - app: "search", - sharing: "app" - } - ); - assert.throws(function () { - coll.instantiateEntity({}); + it("Methods to be overridden throw", function (done) { + var coll = new splunkjs.Service.Collection( + this.service, + "/data/indexes", + { + owner: "admin", + app: "search", + sharing: "app" + } + ); + assert.throws(function () { + coll.instantiateEntity({}); + }); + done(); }); - done(); - }, - "Accessors work": function (done) { - var coll = new splunkjs.Service.Collection( - this.service, - "/data/indexes", - { - owner: "admin", - app: "search", - sharing: "app" - } - ); - coll._load({ links: "Hilda", updated: true }); - assert.strictEqual(coll.links(), "Hilda"); - assert.ok(coll.updated()); - done(); - }, + it("Accessors work", function (done) { + var coll = new splunkjs.Service.Collection( + this.service, + "/data/indexes", + { + owner: "admin", + app: "search", + sharing: "app" + } + ); + coll._load({ links: "Hilda", updated: true }); + assert.strictEqual(coll.links(), "Hilda"); + assert.ok(coll.updated()); + done(); + }); - "Contains throws without a good id": function (done) { - var coll = new splunkjs.Service.Collection( - this.service, - "/data/indexes", - { - owner: "admin", - app: "search", - sharing: "app" - } - ); - assert.throws(function () { coll.item(null); }); - done(); - } - }; + it("Contains throws without a good id", function (done) { + var coll = new splunkjs.Service.Collection( + this.service, + "/data/indexes", + { + owner: "admin", + app: "search", + sharing: "app" + } + ); + assert.throws(function () { coll.item(null); }); + done(); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/configuration.js b/tests/service_tests/configuration.js index 026783340..d0e6f125a 100644 --- a/tests/service_tests/configuration.js +++ b/tests/service_tests/configuration.js @@ -10,205 +10,207 @@ var getNextId = function () { exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Callback#list": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var files = props.list(); - assert.ok(files.length > 0); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#contains": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("web"); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(file.name, "web"); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#contains stanza": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("web"); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(file.name, "web"); - - var stanza = file.item("settings"); - assert.ok(stanza); - stanza.fetch(done); - }, - function (stanza, done) { - assert.ok(stanza.properties().hasOwnProperty("httpport")); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#configurations init": function (done) { - assert.throws(function () { - var confs = new splunkjs.Service.Configurations( - this.service, - { owner: "-", app: "-", sharing: "system" } - ); + return ( + describe("Configuration tests", function (done) { + beforeEach(function (done) { + this.service = svc; + done(); }); - done(); - }, - - "Callback#create file + create stanza + update stanza": function (done) { - var that = this; - var namespace = { owner: "nobody", app: "system" }; - var fileName = "jssdk_file_" + getNextId(); - var value = "barfoo_" + getNextId(); - - Async.chain([ - function (done) { - var configs = svc.configurations(namespace); - configs.fetch(done); - }, - function (configs, done) { - configs.create({ __conf: fileName }, done); - }, - function (file, done) { - if (file.item("stanza")) { - file.item("stanza").remove(); + + it("Callback#list", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var files = props.list(); + assert.ok(files.length > 0); + done(); } - file.create("stanza", done); - }, - function (stanza, done) { - stanza.update({ "jssdk_foobar": value }, done); - }, - function (stanza, done) { - assert.strictEqual(stanza.properties()["jssdk_foobar"], value); - done(); - }, - function (done) { - var file = new splunkjs.Service.ConfigurationFile(svc, fileName); - file.fetch(done); - }, - function (file, done) { - var stanza = file.item("stanza"); - assert.ok(stanza); - stanza.remove(done); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#can get default stanza": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("savedsearches"); - assert.strictEqual(namespace, file.namespace); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(namespace, file.namespace); - file.getDefaultStanza().fetch(done); - }, - function (stanza, done) { - assert.strictEqual(stanza.name, "default"); - assert.strictEqual(namespace, stanza.namespace); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#updating default stanza is noop": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - var backup = null; - var invalid = "this won't work"; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("savedsearches"); - assert.strictEqual(namespace, file.namespace); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(namespace, file.namespace); - file.getDefaultStanza().fetch(done); - }, - function (stanza, done) { - assert.ok(stanza._properties.hasOwnProperty("max_concurrent")); - assert.strictEqual(namespace, stanza.namespace); - backup = stanza._properties.max_concurrent; - stanza.update({ "max_concurrent": invalid }, done); - }, - function (stanza, done) { - assert.ok(stanza.properties().hasOwnProperty("max_concurrent")); - assert.strictEqual(stanza.properties()["max_concurrent"], backup); - assert.notStrictEqual(stanza.properties()["max_concurrent"], invalid); - stanza.fetch(done); - }, - function (stanza, done) { - assert.ok(stanza.properties().hasOwnProperty("max_concurrent")); - assert.strictEqual(stanza.properties()["max_concurrent"], backup); - assert.notStrictEqual(stanza.properties()["max_concurrent"], invalid); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); + ], + function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Callback#contains", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("web"); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(file.name, "web"); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Callback#contains stanza", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("web"); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(file.name, "web"); + + var stanza = file.item("settings"); + assert.ok(stanza); + stanza.fetch(done); + }, + function (stanza, done) { + assert.ok(stanza.properties().hasOwnProperty("httpport")); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Callback#configurations init", function (done) { + assert.throws(function () { + var confs = new splunkjs.Service.Configurations( + this.service, + { owner: "-", app: "-", sharing: "system" } + ); }); - } - }; + done(); + }); + + it("Callback#create file + create stanza + update stanza", function (done) { + var that = this; + var namespace = { owner: "nobody", app: "system" }; + var fileName = "jssdk_file_" + getNextId(); + var value = "barfoo_" + getNextId(); + + Async.chain([ + function (done) { + var configs = svc.configurations(namespace); + configs.fetch(done); + }, + function (configs, done) { + configs.create({ __conf: fileName }, done); + }, + function (file, done) { + if (file.item("stanza")) { + file.item("stanza").remove(); + } + file.create("stanza", done); + }, + function (stanza, done) { + stanza.update({ "jssdk_foobar": value }, done); + }, + function (stanza, done) { + assert.strictEqual(stanza.properties()["jssdk_foobar"], value); + done(); + }, + function (done) { + var file = new splunkjs.Service.ConfigurationFile(svc, fileName); + file.fetch(done); + }, + function (file, done) { + var stanza = file.item("stanza"); + assert.ok(stanza); + stanza.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Callback#can get default stanza", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("savedsearches"); + assert.strictEqual(namespace, file.namespace); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(namespace, file.namespace); + file.getDefaultStanza().fetch(done); + }, + function (stanza, done) { + assert.strictEqual(stanza.name, "default"); + assert.strictEqual(namespace, stanza.namespace); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }); + + it("Callback#updating default stanza is noop", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + var backup = null; + var invalid = "this won't work"; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("savedsearches"); + assert.strictEqual(namespace, file.namespace); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(namespace, file.namespace); + file.getDefaultStanza().fetch(done); + }, + function (stanza, done) { + assert.ok(stanza._properties.hasOwnProperty("max_concurrent")); + assert.strictEqual(namespace, stanza.namespace); + backup = stanza._properties.max_concurrent; + stanza.update({ "max_concurrent": invalid }, done); + }, + function (stanza, done) { + assert.ok(stanza.properties().hasOwnProperty("max_concurrent")); + assert.strictEqual(stanza.properties()["max_concurrent"], backup); + assert.notStrictEqual(stanza.properties()["max_concurrent"], invalid); + stanza.fetch(done); + }, + function (stanza, done) { + assert.ok(stanza.properties().hasOwnProperty("max_concurrent")); + assert.strictEqual(stanza.properties()["max_concurrent"], backup); + assert.notStrictEqual(stanza.properties()["max_concurrent"], invalid); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/datamodels.js b/tests/service_tests/datamodels.js index c4b8ffd73..56a3c2a16 100644 --- a/tests/service_tests/datamodels.js +++ b/tests/service_tests/datamodels.js @@ -12,1067 +12,1069 @@ var getNextId = function () { }; exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - this.dataModels = svc.dataModels(); - this.skip = false; - var that = this; - this.service.serverInfo(function (err, info) { - if (parseInt(info.properties().version.split(".")[0], 10) < 6) { - that.skip = true; - splunkjs.Logger.log("Skipping data model tests..."); - } - done(err); + return ( + describe("Datamodels test", function (done) { + beforeEach(function (done) { + this.service = svc; + this.dataModels = svc.dataModels(); + this.skip = false; + var that = this; + this.service.serverInfo(function (err, info) { + if (parseInt(info.properties().version.split(".")[0], 10) < 6) { + that.skip = true; + splunkjs.Logger.log("Skipping data model tests..."); + } + done(err); + }); }); - }, - "Callback#DataModels - fetch a built-in data model": function (done) { - if (this.skip) { - done(); - return; - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - var dm = dataModels.item("internal_audit_logs"); - // Check for the 3 objects we expect - assert.ok(dm.objectByName("Audit")); - assert.ok(dm.objectByName("searches")); - assert.ok(dm.objectByName("modify")); - - // Check for an object that shouldn't exist - assert.strictEqual(null, dm.objectByName(getNextId())); - done(); - } - ], - function (err) { - assert.ok(!err); + it("Callback#DataModels - fetch a built-in data model", function (done) { + if (this.skip) { done(); + return; } - ); - }, + var that = this; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + var dm = dataModels.item("internal_audit_logs"); + // Check for the 3 objects we expect + assert.ok(dm.objectByName("Audit")); + assert.ok(dm.objectByName("searches")); + assert.ok(dm.objectByName("modify")); + + // Check for an object that shouldn't exist + assert.strictEqual(null, dm.objectByName(getNextId())); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - create & delete an empty data model": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var initialSize; - var that = this; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - initialSize = dataModels.list().length; - dataModels.create(name, args, done); - }, - function (dataModel, done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Make sure we have 1 more data model than we started with - assert.strictEqual(initialSize + 1, dataModels.list().length); - // Delete the data model we just created, by name. - dataModels.item(name).remove(done); - }, - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Make sure we have as many data models as we started with - assert.strictEqual(initialSize, dataModels.list().length); + it("Callback#DataModels - create & delete an empty data model", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var name = "delete-me-" + getNextId(); + + var initialSize; + var that = this; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + initialSize = dataModels.list().length; + dataModels.create(name, args, done); + }, + function (dataModel, done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Make sure we have 1 more data model than we started with + assert.strictEqual(initialSize + 1, dataModels.list().length); + // Delete the data model we just created, by name. + dataModels.item(name).remove(done); + }, + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Make sure we have as many data models as we started with + assert.strictEqual(initialSize, dataModels.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - create a data model with spaces in the name, which are swapped for -'s": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me- " + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.strictEqual(name.replace(" ", "_"), dataModel.name); + it("Callback#DataModels - create a data model with spaces in the name, which are swapped for -'s", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var name = "delete-me- " + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.strictEqual(name.replace(" ", "_"), dataModel.name); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - create a data model with 0 objects": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - // Check for 0 objects before fetch - assert.strictEqual(0, dataModel.objects.length); - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Check for 0 objects after fetch - assert.strictEqual(0, dataModels.item(name).objects.length); + it("Callback#DataModels - create a data model with 0 objects", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + // Check for 0 objects before fetch + assert.strictEqual(0, dataModel.objects.length); + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Check for 0 objects after fetch + assert.strictEqual(0, dataModels.item(name).objects.length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - create a data model with 1 search object": function (done) { - if (this.skip) { - done(); - return; - } - var dataModels = this.service.dataModels(); + it("Callback#DataModels - create a data model with 1 search object", function (done) { + if (this.skip) { + done(); + return; + } + var dataModels = this.service.dataModels(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/object_with_one_search.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - // Check for 1 object before fetch - assert.strictEqual(1, dataModel.objects.length); - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Check for 1 object after fetch - assert.strictEqual(1, dataModels.item(name).objects.length); - done(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/object_with_one_search.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + // Check for 1 object before fetch + assert.strictEqual(1, dataModel.objects.length); + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Check for 1 object after fetch + assert.strictEqual(1, dataModels.item(name).objects.length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - create a data model with 2 search objects": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/object_with_two_searches.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - // Check for 2 objects before fetch - assert.strictEqual(2, dataModel.objects.length); - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Check for 2 objects after fetch - assert.strictEqual(2, dataModels.item(name).objects.length); + it("Callback#DataModels - create a data model with 2 search objects", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/object_with_two_searches.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - data model objects are created correctly": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/object_with_two_searches.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.ok(dataModel.hasObject("search1")); - assert.ok(dataModel.hasObject("search2")); - - var search1 = dataModel.objectByName("search1"); - assert.ok(search1); - assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ - search 1", search1.displayName); - - var search2 = dataModel.objectByName("search2"); - assert.ok(search2); - assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ - search 2", search2.displayName); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + // Check for 2 objects before fetch + assert.strictEqual(2, dataModel.objects.length); + that.dataModels.fetch(done); + }, + function (dataModels, done) { + // Check for 2 objects after fetch + assert.strictEqual(2, dataModels.item(name).objects.length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - data model objects are created correctly", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/object_with_two_searches.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - data model handles unicode characters": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/model_with_unicode_headers.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.strictEqual(name, dataModel.name); - assert.strictEqual("·Ä©·öô‡Øµ", dataModel.displayName); - assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ", dataModel.description); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.ok(dataModel.hasObject("search1")); + assert.ok(dataModel.hasObject("search2")); + + var search1 = dataModel.objectByName("search1"); + assert.ok(search1); + assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ - search 1", search1.displayName); + + var search2 = dataModel.objectByName("search2"); + assert.ok(search2); + assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ - search 2", search2.displayName); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - data model handles unicode characters", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/model_with_unicode_headers.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - create data model with empty headers": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/model_with_empty_headers.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.strictEqual(name, dataModel.name); - assert.strictEqual("", dataModel.displayName); - assert.strictEqual("", dataModel.description); - - // Make sure we're not getting a summary of the data model - assert.strictEqual("0", dataModel.concise); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.strictEqual(name, dataModel.name); + assert.strictEqual("·Ä©·öô‡Øµ", dataModel.displayName); + assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ", dataModel.description); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - create data model with empty headers", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/model_with_empty_headers.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test acceleration settings": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - dataModel.acceleration.enabled = true; - dataModel.acceleration.earliestTime = "-2mon"; - dataModel.acceleration.cronSchedule = "5/* * * * *"; - - assert.strictEqual(true, dataModel.isAccelerated()); - assert.strictEqual(true, dataModel.acceleration.enabled); - assert.strictEqual("-2mon", dataModel.acceleration.earliestTime); - assert.strictEqual("5/* * * * *", dataModel.acceleration.cronSchedule); - - dataModel.acceleration.enabled = false; - dataModel.acceleration.earliestTime = "-1mon"; - dataModel.acceleration.cronSchedule = "* * * * *"; - - assert.strictEqual(false, dataModel.isAccelerated()); - assert.strictEqual(false, dataModel.acceleration.enabled); - assert.strictEqual("-1mon", dataModel.acceleration.earliestTime); - assert.strictEqual("* * * * *", dataModel.acceleration.cronSchedule); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.strictEqual(name, dataModel.name); + assert.strictEqual("", dataModel.displayName); + assert.strictEqual("", dataModel.description); + + // Make sure we're not getting a summary of the data model + assert.strictEqual("0", dataModel.concise); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test acceleration settings", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model object metadata": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("event1"); - assert.ok(obj); - - assert.strictEqual("event1 ·Ä©·öô", obj.displayName); - assert.strictEqual("event1", obj.name); - assert.deepEqual(dataModel, obj.dataModel); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + dataModel.acceleration.enabled = true; + dataModel.acceleration.earliestTime = "-2mon"; + dataModel.acceleration.cronSchedule = "5/* * * * *"; + + assert.strictEqual(true, dataModel.isAccelerated()); + assert.strictEqual(true, dataModel.acceleration.enabled); + assert.strictEqual("-2mon", dataModel.acceleration.earliestTime); + assert.strictEqual("5/* * * * *", dataModel.acceleration.cronSchedule); + + dataModel.acceleration.enabled = false; + dataModel.acceleration.earliestTime = "-1mon"; + dataModel.acceleration.cronSchedule = "* * * * *"; + + assert.strictEqual(false, dataModel.isAccelerated()); + assert.strictEqual(false, dataModel.acceleration.enabled); + assert.strictEqual("-1mon", dataModel.acceleration.earliestTime); + assert.strictEqual("* * * * *", dataModel.acceleration.cronSchedule); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model object metadata", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model object parent": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("event1"); - assert.ok(obj); - assert.ok(!obj.parent()); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("event1"); + assert.ok(obj); + + assert.strictEqual("event1 ·Ä©·öô", obj.displayName); + assert.strictEqual("event1", obj.name); + assert.deepEqual(dataModel, obj.dataModel); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model object parent", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model object lineage": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("level_0"); - assert.ok(obj); - assert.strictEqual(1, obj.lineage.length); - assert.strictEqual("level_0", obj.lineage[0]); - assert.strictEqual("BaseEvent", obj.parentName); - - obj = dataModel.objectByName("level_1"); - assert.ok(obj); - assert.strictEqual(2, obj.lineage.length); - assert.deepEqual(["level_0", "level_1"], obj.lineage); - assert.strictEqual("level_0", obj.parentName); - - obj = dataModel.objectByName("level_2"); - assert.ok(obj); - assert.strictEqual(3, obj.lineage.length); - assert.deepEqual(["level_0", "level_1", "level_2"], obj.lineage); - assert.strictEqual("level_1", obj.parentName); - - // Make sure there's no extra children - assert.ok(!dataModel.objectByName("level_3")); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("event1"); + assert.ok(obj); + assert.ok(!obj.parent()); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model object lineage", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model object fields": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("level_2"); - assert.ok(obj); - - var timeField = obj.fieldByName("_time"); - assert.ok(timeField); - assert.strictEqual("timestamp", timeField.type); - assert.ok(timeField.isTimestamp()); - assert.ok(!timeField.isNumber()); - assert.ok(!timeField.isString()); - assert.ok(!timeField.isObjectcount()); - assert.ok(!timeField.isChildcount()); - assert.ok(!timeField.isIPv4()); - assert.deepEqual(["BaseEvent"], timeField.lineage); - assert.strictEqual("_time", timeField.name); - assert.strictEqual(false, timeField.required); - assert.strictEqual(false, timeField.multivalued); - assert.strictEqual(false, timeField.hidden); - assert.strictEqual(false, timeField.editable); - assert.strictEqual(null, timeField.comment); - - var lvl2 = obj.fieldByName("level_2"); - assert.strictEqual("level_2", lvl2.owner); - assert.deepEqual(["level_0", "level_1", "level_2"], lvl2.lineage); - assert.strictEqual("objectCount", lvl2.type); - assert.ok(!lvl2.isTimestamp()); - assert.ok(!lvl2.isNumber()); - assert.ok(!lvl2.isString()); - assert.ok(lvl2.isObjectcount()); - assert.ok(!lvl2.isChildcount()); - assert.ok(!lvl2.isIPv4()); - assert.strictEqual("level_2", lvl2.name); - assert.strictEqual("level 2", lvl2.displayName); - assert.strictEqual(false, lvl2.required); - assert.strictEqual(false, lvl2.multivalued); - assert.strictEqual(false, lvl2.hidden); - assert.strictEqual(false, lvl2.editable); - assert.strictEqual(null, lvl2.comment); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("level_0"); + assert.ok(obj); + assert.strictEqual(1, obj.lineage.length); + assert.strictEqual("level_0", obj.lineage[0]); + assert.strictEqual("BaseEvent", obj.parentName); + + obj = dataModel.objectByName("level_1"); + assert.ok(obj); + assert.strictEqual(2, obj.lineage.length); + assert.deepEqual(["level_0", "level_1"], obj.lineage); + assert.strictEqual("level_0", obj.parentName); + + obj = dataModel.objectByName("level_2"); + assert.ok(obj); + assert.strictEqual(3, obj.lineage.length); + assert.deepEqual(["level_0", "level_1", "level_2"], obj.lineage); + assert.strictEqual("level_1", obj.parentName); + + // Make sure there's no extra children + assert.ok(!dataModel.objectByName("level_3")); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model object fields", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model object properties": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - assert.strictEqual(5, obj.fieldNames().length); - assert.strictEqual(10, obj.allFieldNames().length); - assert.ok(obj.fieldByName("has_boris")); - assert.ok(obj.hasField("has_boris")); - assert.ok(obj.fieldByName("_time")); - assert.ok(obj.hasField("_time")); + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("level_2"); + assert.ok(obj); + + var timeField = obj.fieldByName("_time"); + assert.ok(timeField); + assert.strictEqual("timestamp", timeField.type); + assert.ok(timeField.isTimestamp()); + assert.ok(!timeField.isNumber()); + assert.ok(!timeField.isString()); + assert.ok(!timeField.isObjectcount()); + assert.ok(!timeField.isChildcount()); + assert.ok(!timeField.isIPv4()); + assert.deepEqual(["BaseEvent"], timeField.lineage); + assert.strictEqual("_time", timeField.name); + assert.strictEqual(false, timeField.required); + assert.strictEqual(false, timeField.multivalued); + assert.strictEqual(false, timeField.hidden); + assert.strictEqual(false, timeField.editable); + assert.strictEqual(null, timeField.comment); + + var lvl2 = obj.fieldByName("level_2"); + assert.strictEqual("level_2", lvl2.owner); + assert.deepEqual(["level_0", "level_1", "level_2"], lvl2.lineage); + assert.strictEqual("objectCount", lvl2.type); + assert.ok(!lvl2.isTimestamp()); + assert.ok(!lvl2.isNumber()); + assert.ok(!lvl2.isString()); + assert.ok(lvl2.isObjectcount()); + assert.ok(!lvl2.isChildcount()); + assert.ok(!lvl2.isIPv4()); + assert.strictEqual("level_2", lvl2.name); + assert.strictEqual("level 2", lvl2.displayName); + assert.strictEqual(false, lvl2.required); + assert.strictEqual(false, lvl2.multivalued); + assert.strictEqual(false, lvl2.hidden); + assert.strictEqual(false, lvl2.editable); + assert.strictEqual(null, lvl2.comment); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model object properties", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var name = "delete-me-" + getNextId(); + + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + assert.strictEqual(5, obj.fieldNames().length); + assert.strictEqual(10, obj.allFieldNames().length); + assert.ok(obj.fieldByName("has_boris")); + assert.ok(obj.hasField("has_boris")); + assert.ok(obj.fieldByName("_time")); + assert.ok(obj.hasField("_time")); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - create local acceleration job": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("level_2"); - assert.ok(obj); - - obj.createLocalAccelerationJob(null, done); - }, - function (job, done) { - assert.ok(job); - - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - assert.strictEqual("| datamodel \"" + name + "\" level_2 search | tscollect", job.properties().request.search); - job.cancel(done); + it("Callback#DataModels - create local acceleration job", function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - create local acceleration job with earliest time": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var oldNow = Date.now(); - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("level_2"); - assert.ok(obj); - obj.createLocalAccelerationJob("-1d", done); - }, - function (job, done) { - assert.ok(job); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - assert.strictEqual("| datamodel \"" + name + "\" level_2 search | tscollect", job.properties().request.search); - - // Make sure the earliest time is 1 day behind - var yesterday = new Date(Date.now() - (1000 * 60 * 60 * 24)); - var month = (yesterday.getMonth() + 1); - if (month <= 9) { - month = "0" + month; + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("level_2"); + assert.ok(obj); + + obj.createLocalAccelerationJob(null, done); + }, + function (job, done) { + assert.ok(job); + + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + assert.strictEqual("| datamodel \"" + name + "\" level_2 search | tscollect", job.properties().request.search); + job.cancel(done); } - var date = yesterday.getDate(); - if (date <= 9) { - date = "0" + date; + ], + function (err) { + assert.ok(!err); + done(); } - var expectedDate = yesterday.getFullYear() + "-" + month + "-" + date; - assert.ok(utils.startsWith(job._state.content.earliestTime, expectedDate)); + ); + }); - job.cancel(done); + it("Callback#DataModels - create local acceleration job with earliest time", function (done) { + if (this.skip) { + done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model constraints": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("event1"); - assert.ok(obj); - var constraints = obj.constraints; - assert.ok(constraints); - var onlyOne = true; - - for (var i = 0; i < constraints.length; i++) { - var constraint = constraints[i]; - assert.ok(!!onlyOne); - - assert.strictEqual("event1", constraint.owner); - assert.strictEqual("uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")", constraint.query); + var name = "delete-me-" + getNextId(); + + var obj; + var oldNow = Date.now(); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("level_2"); + assert.ok(obj); + obj.createLocalAccelerationJob("-1d", done); + }, + function (job, done) { + assert.ok(job); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + assert.strictEqual("| datamodel \"" + name + "\" level_2 search | tscollect", job.properties().request.search); + + // Make sure the earliest time is 1 day behind + var yesterday = new Date(Date.now() - (1000 * 60 * 60 * 24)); + var month = (yesterday.getMonth() + 1); + if (month <= 9) { + month = "0" + month; + } + var date = yesterday.getDate(); + if (date <= 9) { + date = "0" + date; + } + var expectedDate = yesterday.getFullYear() + "-" + month + "-" + date; + assert.ok(utils.startsWith(job._state.content.earliestTime, expectedDate)); + + job.cancel(done); } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model constraints", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - test data model calculations, and the different types": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("event1"); - assert.ok(obj); - - var calculations = obj.calculations; - assert.strictEqual(4, Object.keys(calculations).length); - assert.strictEqual(4, obj.calculationIDs().length); - - var evalCalculation = calculations["93fzsv03wa7"]; - assert.ok(evalCalculation); - assert.strictEqual("event1", evalCalculation.owner); - assert.deepEqual(["event1"], evalCalculation.lineage); - assert.strictEqual("Eval", evalCalculation.type); - assert.ok(evalCalculation.isEval()); - assert.ok(!evalCalculation.isLookup()); - assert.ok(!evalCalculation.isGeoIP()); - assert.ok(!evalCalculation.isRex()); - assert.strictEqual(null, evalCalculation.comment); - assert.strictEqual(true, evalCalculation.isEditable()); - assert.strictEqual("if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\")", evalCalculation.expression); - - assert.strictEqual(1, Object.keys(evalCalculation.outputFields).length); - assert.strictEqual(1, evalCalculation.outputFieldNames().length); - - var field = evalCalculation.outputFields["new_field"]; - assert.ok(field); - assert.strictEqual("My New Field", field.displayName); - - var lookupCalculation = calculations["sr3mc8o3mjr"]; - assert.ok(lookupCalculation); - assert.strictEqual("event1", lookupCalculation.owner); - assert.deepEqual(["event1"], lookupCalculation.lineage); - assert.strictEqual("Lookup", lookupCalculation.type); - assert.ok(lookupCalculation.isLookup()); - assert.ok(!lookupCalculation.isEval()); - assert.ok(!lookupCalculation.isGeoIP()); - assert.ok(!lookupCalculation.isRex()); - assert.strictEqual(null, lookupCalculation.comment); - assert.strictEqual(true, lookupCalculation.isEditable()); - assert.deepEqual({ lookupField: "a_lookup_field", inputField: "host" }, lookupCalculation.inputFieldMappings); - assert.strictEqual(2, Object.keys(lookupCalculation.inputFieldMappings).length); - assert.strictEqual("a_lookup_field", lookupCalculation.inputFieldMappings.lookupField); - assert.strictEqual("host", lookupCalculation.inputFieldMappings.inputField); - assert.strictEqual("dnslookup", lookupCalculation.lookupName); - - var regexpCalculation = calculations["a5v1k82ymic"]; - assert.ok(regexpCalculation); - assert.strictEqual("event1", regexpCalculation.owner); - assert.deepEqual(["event1"], regexpCalculation.lineage); - assert.strictEqual("Rex", regexpCalculation.type); - assert.ok(regexpCalculation.isRex()); - assert.ok(!regexpCalculation.isLookup()); - assert.ok(!regexpCalculation.isEval()); - assert.ok(!regexpCalculation.isGeoIP()); - assert.strictEqual(2, regexpCalculation.outputFieldNames().length); - assert.strictEqual("_raw", regexpCalculation.inputField); - assert.strictEqual(" From: (?.*) To: (?.*) ", regexpCalculation.expression); - - var geoIPCalculation = calculations["pbe9bd0rp4"]; - assert.ok(geoIPCalculation); - assert.strictEqual("event1", geoIPCalculation.owner); - assert.deepEqual(["event1"], geoIPCalculation.lineage); - assert.strictEqual("GeoIP", geoIPCalculation.type); - assert.ok(geoIPCalculation.isGeoIP()); - assert.ok(!geoIPCalculation.isLookup()); - assert.ok(!geoIPCalculation.isEval()); - assert.ok(!geoIPCalculation.isRex()); - assert.strictEqual("·Ä©·öô‡Øµ comment of pbe9bd0rp4", geoIPCalculation.comment); - assert.strictEqual(5, geoIPCalculation.outputFieldNames().length); - assert.strictEqual("output_from_reverse_hostname", geoIPCalculation.inputField); + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("event1"); + assert.ok(obj); + var constraints = obj.constraints; + assert.ok(constraints); + var onlyOne = true; + + for (var i = 0; i < constraints.length; i++) { + var constraint = constraints[i]; + assert.ok(!!onlyOne); + + assert.strictEqual("event1", constraint.owner); + assert.strictEqual("uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")", constraint.query); + } + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - test data model calculations, and the different types", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("event1"); + assert.ok(obj); + + var calculations = obj.calculations; + assert.strictEqual(4, Object.keys(calculations).length); + assert.strictEqual(4, obj.calculationIDs().length); + + var evalCalculation = calculations["93fzsv03wa7"]; + assert.ok(evalCalculation); + assert.strictEqual("event1", evalCalculation.owner); + assert.deepEqual(["event1"], evalCalculation.lineage); + assert.strictEqual("Eval", evalCalculation.type); + assert.ok(evalCalculation.isEval()); + assert.ok(!evalCalculation.isLookup()); + assert.ok(!evalCalculation.isGeoIP()); + assert.ok(!evalCalculation.isRex()); + assert.strictEqual(null, evalCalculation.comment); + assert.strictEqual(true, evalCalculation.isEditable()); + assert.strictEqual("if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\")", evalCalculation.expression); + + assert.strictEqual(1, Object.keys(evalCalculation.outputFields).length); + assert.strictEqual(1, evalCalculation.outputFieldNames().length); + + var field = evalCalculation.outputFields["new_field"]; + assert.ok(field); + assert.strictEqual("My New Field", field.displayName); + + var lookupCalculation = calculations["sr3mc8o3mjr"]; + assert.ok(lookupCalculation); + assert.strictEqual("event1", lookupCalculation.owner); + assert.deepEqual(["event1"], lookupCalculation.lineage); + assert.strictEqual("Lookup", lookupCalculation.type); + assert.ok(lookupCalculation.isLookup()); + assert.ok(!lookupCalculation.isEval()); + assert.ok(!lookupCalculation.isGeoIP()); + assert.ok(!lookupCalculation.isRex()); + assert.strictEqual(null, lookupCalculation.comment); + assert.strictEqual(true, lookupCalculation.isEditable()); + assert.deepEqual({ lookupField: "a_lookup_field", inputField: "host" }, lookupCalculation.inputFieldMappings); + assert.strictEqual(2, Object.keys(lookupCalculation.inputFieldMappings).length); + assert.strictEqual("a_lookup_field", lookupCalculation.inputFieldMappings.lookupField); + assert.strictEqual("host", lookupCalculation.inputFieldMappings.inputField); + assert.strictEqual("dnslookup", lookupCalculation.lookupName); + + var regexpCalculation = calculations["a5v1k82ymic"]; + assert.ok(regexpCalculation); + assert.strictEqual("event1", regexpCalculation.owner); + assert.deepEqual(["event1"], regexpCalculation.lineage); + assert.strictEqual("Rex", regexpCalculation.type); + assert.ok(regexpCalculation.isRex()); + assert.ok(!regexpCalculation.isLookup()); + assert.ok(!regexpCalculation.isEval()); + assert.ok(!regexpCalculation.isGeoIP()); + assert.strictEqual(2, regexpCalculation.outputFieldNames().length); + assert.strictEqual("_raw", regexpCalculation.inputField); + assert.strictEqual(" From: (?.*) To: (?.*) ", regexpCalculation.expression); + + var geoIPCalculation = calculations["pbe9bd0rp4"]; + assert.ok(geoIPCalculation); + assert.strictEqual("event1", geoIPCalculation.owner); + assert.deepEqual(["event1"], geoIPCalculation.lineage); + assert.strictEqual("GeoIP", geoIPCalculation.type); + assert.ok(geoIPCalculation.isGeoIP()); + assert.ok(!geoIPCalculation.isLookup()); + assert.ok(!geoIPCalculation.isEval()); + assert.ok(!geoIPCalculation.isRex()); + assert.strictEqual("·Ä©·öô‡Øµ comment of pbe9bd0rp4", geoIPCalculation.comment); + assert.strictEqual(5, geoIPCalculation.outputFieldNames().length); + assert.strictEqual("output_from_reverse_hostname", geoIPCalculation.inputField); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - run queries": function (done) { - if (this.skip) { - done(); - return; - } - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - var dm = dataModels.item("internal_audit_logs"); - obj = dm.objectByName("searches"); - obj.startSearch({}, "", done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - assert.strictEqual("| datamodel internal_audit_logs searches search", job.properties().request.search); - job.cancel(done); - }, - function (response, done) { - obj.startSearch({ status_buckets: 5, enable_lookups: false }, "| head 3", done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - assert.strictEqual("| datamodel internal_audit_logs searches search | head 3", job.properties().request.search); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); + it("Callback#DataModels - run queries", function (done) { + if (this.skip) { done(); + return; } - ); - }, + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + var dm = dataModels.item("internal_audit_logs"); + obj = dm.objectByName("searches"); + obj.startSearch({}, "", done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + assert.strictEqual("| datamodel internal_audit_logs searches search", job.properties().request.search); + job.cancel(done); + }, + function (response, done) { + obj.startSearch({ status_buckets: 5, enable_lookups: false }, "| head 3", done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + assert.strictEqual("| datamodel internal_audit_logs searches search | head 3", job.properties().request.search); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - "Callback#DataModels - baseSearch is parsed correctly": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/model_with_multiple_types.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("search1"); - assert.ok(obj); - assert.ok(obj instanceof splunkjs.Service.DataModelObject); - assert.strictEqual("BaseSearch", obj.parentName); - assert.ok(obj.isBaseSearch()); - assert.ok(!obj.isBaseTransaction()); - assert.strictEqual("search index=_internal | head 10", obj.baseSearch); + it("Callback#DataModels - baseSearch is parsed correctly", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/model_with_multiple_types.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#DataModels - baseTransaction is parsed correctly": function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/model_with_multiple_types.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("transaction1"); - assert.ok(obj); - assert.ok(obj instanceof splunkjs.Service.DataModelObject); - assert.strictEqual("BaseTransaction", obj.parentName); - assert.ok(obj.isBaseTransaction()); - assert.ok(!obj.isBaseSearch()); - assert.deepEqual(["event1"], obj.objectsToGroup); - assert.deepEqual(["host", "from"], obj.groupByFields); - assert.strictEqual("25s", obj.maxPause); - assert.strictEqual("100m", obj.maxSpan); + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("search1"); + assert.ok(obj); + assert.ok(obj instanceof splunkjs.Service.DataModelObject); + assert.strictEqual("BaseSearch", obj.parentName); + assert.ok(obj.isBaseSearch()); + assert.ok(!obj.isBaseTransaction()); + assert.strictEqual("search index=_internal | head 10", obj.baseSearch); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + it("Callback#DataModels - baseTransaction is parsed correctly", function (done) { + if (this.skip) { done(); + return; + } + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/model_with_multiple_types.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - } - }; + var name = "delete-me-" + getNextId(); + + var obj; + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("transaction1"); + assert.ok(obj); + assert.ok(obj instanceof splunkjs.Service.DataModelObject); + assert.strictEqual("BaseTransaction", obj.parentName); + assert.ok(obj.isBaseTransaction()); + assert.ok(!obj.isBaseSearch()); + assert.deepEqual(["event1"], obj.objectsToGroup); + assert.deepEqual(["host", "from"], obj.groupByFields); + assert.strictEqual("25s", obj.maxPause); + assert.strictEqual("100m", obj.maxSpan); + + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/endpoint.js b/tests/service_tests/endpoint.js index 369577626..f31ebcc4c 100644 --- a/tests/service_tests/endpoint.js +++ b/tests/service_tests/endpoint.js @@ -3,38 +3,40 @@ var assert = require('chai').assert; var splunkjs = require('../../index'); exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Throws on null arguments to init": function (done) { - var service = this.service; - assert.throws(function () { - var endpoint = new splunkjs.Service.Endpoint(null, "a/b"); + return ( + describe("Endpoint tests", function (done) { + beforeEach(function (done) { + this.service = svc; + done(); }); - assert.throws(function () { - var endpoint = new splunkjs.Service.Endpoint(service, null); + + it("Throws on null arguments to init", function (done) { + var service = this.service; + assert.throws(function () { + var endpoint = new splunkjs.Service.Endpoint(null, "a/b"); + }); + assert.throws(function () { + var endpoint = new splunkjs.Service.Endpoint(service, null); + }); + done(); }); - done(); - }, - "Endpoint delete on a relative path": function (done) { - var service = this.service; - var endpoint = new splunkjs.Service.Endpoint(service, "/search/jobs/12345"); - endpoint.del("search/jobs/12345", {}, function () { done(); }); - }, + it("Endpoint delete on a relative path", function (done) { + var service = this.service; + var endpoint = new splunkjs.Service.Endpoint(service, "/search/jobs/12345"); + endpoint.del("search/jobs/12345", {}, function () { done(); }); + }); - "Methods of Resource to be overridden": function (done) { - var service = this.service; - var resource = new splunkjs.Service.Resource(service, "/search/jobs/12345"); - assert.throws(function () { resource.path(); }); - assert.throws(function () { resource.fetch(); }); - assert.ok(splunkjs.Utils.isEmpty(resource.state())); - done(); - } - }; + it("Methods of Resource to be overridden", function (done) { + var service = this.service; + var resource = new splunkjs.Service.Resource(service, "/search/jobs/12345"); + assert.throws(function () { resource.path(); }); + assert.throws(function () { resource.fetch(); }); + assert.ok(splunkjs.Utils.isEmpty(resource.state())); + done(); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/entity.js b/tests/service_tests/entity.js index 52dfa6b6e..b82df1f06 100644 --- a/tests/service_tests/entity.js +++ b/tests/service_tests/entity.js @@ -10,106 +10,109 @@ var getNextId = function () { }; exports.setup = function (svc, loggedOutSvc) { - return { - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }, - - "Accessors function properly": function (done) { - var entity = new splunkjs.Service.Entity( - this.service, - "/search/jobs/12345", - { owner: "boris", app: "factory", sharing: "app" } - ); - entity._load( - { - acl: { owner: "boris", app: "factory", sharing: "app" }, - links: { link1: 35 }, - published: "meep", - author: "Hilda" - } - ); - assert.ok(entity.acl().owner === "boris"); - assert.ok(entity.acl().app === "factory"); - assert.ok(entity.acl().sharing === "app"); - assert.ok(entity.links().link1 === 35); - assert.strictEqual(entity.author(), "Hilda"); - assert.strictEqual(entity.published(), "meep"); - done(); - }, - - "Refresh throws error correctly": function (done) { - var entity = new splunkjs.Service.Entity(this.loggedOutService, "/search/jobs/12345", { owner: "boris", app: "factory", sharing: "app" }); - entity.fetch({}, function (err) { assert.ok(err); done(); }); - }, - - "Cannot update name of entity": function (done) { - var entity = new splunkjs.Service.Entity(this.service, "/search/jobs/12345", { owner: "boris", app: "factory", sharing: "app" }); - assert.throws(function () { entity.update({ name: "asdf" }); }); - done(); - }, - - "Disable throws error correctly": function (done) { - var entity = new splunkjs.Service.Entity( - this.loggedOutService, - "/search/jobs/12345", - { owner: "boris", app: "factory", sharing: "app" } - ); - entity.disable(function (err) { assert.ok(err); done(); }); - }, - - "Enable throws error correctly": function (done) { - var entity = new splunkjs.Service.Entity( - this.loggedOutService, - "/search/jobs/12345", - { owner: "boris", app: "factory", sharing: "app" } - ); - entity.enable(function (err) { assert.ok(err); done(); }); - }, - - "Does reload work?": function (done) { - var idx = new splunkjs.Service.Index( - this.service, - "data/indexes/sdk-test", - { - owner: "admin", - app: "search", - sharing: "app" - } - ); - var name = "jssdk_testapp_" + getNextId(); - var apps = this.service.apps(); - - var that = this; - Async.chain( - function (done) { - apps.create({ name: name }, done); - }, - function (app, done) { - app.reload(function (err) { + return ( + describe("Entity tests", function () { + + beforeEach(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + done(); + }); + + it("Accessors function properly", function (done) { + var entity = new splunkjs.Service.Entity( + this.service, + "/search/jobs/12345", + { owner: "boris", app: "factory", sharing: "app" } + ); + entity._load( + { + acl: { owner: "boris", app: "factory", sharing: "app" }, + links: { link1: 35 }, + published: "meep", + author: "Hilda" + } + ); + assert.ok(entity.acl().owner === "boris"); + assert.ok(entity.acl().app === "factory"); + assert.ok(entity.acl().sharing === "app"); + assert.ok(entity.links().link1 === 35); + assert.strictEqual(entity.author(), "Hilda"); + assert.strictEqual(entity.published(), "meep"); + done(); + }); + + it("Refresh throws error correctly", function (done) { + var entity = new splunkjs.Service.Entity(this.loggedOutService, "/search/jobs/12345", { owner: "boris", app: "factory", sharing: "app" }); + entity.fetch({}, function (err) { assert.ok(err); done(); }); + }); + + it("Cannot update name of entity", function (done) { + var entity = new splunkjs.Service.Entity(this.service, "/search/jobs/12345", { owner: "boris", app: "factory", sharing: "app" }); + assert.throws(function () { entity.update({ name: "asdf" }); }); + done(); + }); + + it("Disable throws error correctly", function (done) { + var entity = new splunkjs.Service.Entity( + this.loggedOutService, + "/search/jobs/12345", + { owner: "boris", app: "factory", sharing: "app" } + ); + entity.disable(function (err) { assert.ok(err); done(); }); + }); + + it("Enable throws error correctly", function (done) { + var entity = new splunkjs.Service.Entity( + this.loggedOutService, + "/search/jobs/12345", + { owner: "boris", app: "factory", sharing: "app" } + ); + entity.enable(function (err) { assert.ok(err); done(); }); + }); + + it("Does reload work?", function (done) { + var idx = new splunkjs.Service.Index( + this.service, + "data/indexes/sdk-test", + { + owner: "admin", + app: "search", + sharing: "app" + } + ); + var name = "jssdk_testapp_" + getNextId(); + var apps = this.service.apps(); + + var that = this; + Async.chain( + function (done) { + apps.create({ name: name }, done); + }, + function (app, done) { + app.reload(function (err) { + assert.ok(!err); + done(null, app); + }); + }, + function (app, done) { + var app2 = new splunkjs.Service.Application(that.loggedOutService, app.name); + app2.reload(function (err) { + assert.ok(err); + done(null, app); + }); + }, + function (app, done) { + app.remove(done); + }, + function (err) { assert.ok(!err); - done(null, app); - }); - }, - function (app, done) { - var app2 = new splunkjs.Service.Application(that.loggedOutService, app.name); - app2.reload(function (err) { - assert.ok(err); - done(null, app); - }); - }, - function (app, done) { - app.remove(done); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - } - }; + done(); + } + ); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/firedalerts.js b/tests/service_tests/firedalerts.js index 0889cd03c..dd4ddc5c9 100644 --- a/tests/service_tests/firedalerts.js +++ b/tests/service_tests/firedalerts.js @@ -11,260 +11,262 @@ var getNextId = function () { }; exports.setup = function (svc, loggedOutSvc) { - return { - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - var indexes = this.service.indexes(); - done(); - }, + return ( + describe("Fired alerts tests", () => { + beforeEach(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + var indexes = this.service.indexes(); + done(); + }); - "Callback#create + verify emptiness + delete new alert group": function (done) { + it("Callback#create + verify emptiness + delete new alert group", function (done) { - var searches = this.service.savedSearches({ owner: this.service.username }); - var name = "jssdk_savedsearch_alert_" + getNextId(); - var searchConfig = { - "name": name, - "search": "index=_internal | head 1", - "alert_type": "always", - "alert.severity": "2", - "alert.suppress": "0", - "alert.track": "1", - "dispatch.earliest_time": "-1h", - "dispatch.latest_time": "now", - "is_scheduled": "1", - "cron_schedule": "* * * * *" - }; + var searches = this.service.savedSearches({ owner: this.service.username }); + var name = "jssdk_savedsearch_alert_" + getNextId(); + var searchConfig = { + "name": name, + "search": "index=_internal | head 1", + "alert_type": "always", + "alert.severity": "2", + "alert.suppress": "0", + "alert.track": "1", + "dispatch.earliest_time": "-1h", + "dispatch.latest_time": "now", + "is_scheduled": "1", + "cron_schedule": "* * * * *" + }; - Async.chain([ - function (done) { - searches.create(searchConfig, done); - }, - function (search, done) { - assert.ok(search); - assert.strictEqual(search.alertCount(), 0); - search.history(done); - }, - function (jobs, search, done) { - assert.strictEqual(jobs.length, 0); - assert.strictEqual(search.firedAlertGroup().count(), 0); - searches.service.firedAlertGroups().fetch(Async.augment(done, search)); - }, - function (firedAlertGroups, originalSearch, done) { - assert.strictEqual(firedAlertGroups.list().indexOf(originalSearch.name), -1); - done(null, originalSearch); - }, - function (originalSearch, done) { - originalSearch.remove(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, + Async.chain([ + function (done) { + searches.create(searchConfig, done); + }, + function (search, done) { + assert.ok(search); + assert.strictEqual(search.alertCount(), 0); + search.history(done); + }, + function (jobs, search, done) { + assert.strictEqual(jobs.length, 0); + assert.strictEqual(search.firedAlertGroup().count(), 0); + searches.service.firedAlertGroups().fetch(Async.augment(done, search)); + }, + function (firedAlertGroups, originalSearch, done) { + assert.strictEqual(firedAlertGroups.list().indexOf(originalSearch.name), -1); + done(null, originalSearch); + }, + function (originalSearch, done) { + originalSearch.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - // This test is not stable, commenting it out until we figure it out - // "Callback#alert is triggered + test firedAlert entity -- FAILS INTERMITTENTLY": function(done) { - // var searches = this.service.savedSearches({owner: this.service.username}); - // var indexName = "sdk-tests-alerts"; - // var name = "jssdk_savedsearch_alert_" + getNextId(); + // This test is not stable, commenting it out until we figure it out + // it("Callback#alert is triggered + test firedAlert entity -- FAILS INTERMITTENTLY", function(done) { + // var searches = this.service.savedSearches({owner: this.service.username}); + // var indexName = "sdk-tests-alerts"; + // var name = "jssdk_savedsearch_alert_" + getNextId(); - // // Real-time search config - // var searchConfig = { - // "name": name, - // "search": "index="+indexName+" sourcetype=sdk-tests-alerts | head 1", - // "alert_type": "always", - // "alert.severity": "2", - // "alert.suppress": "0", - // "alert.track": "1", - // "dispatch.earliest_time": "rt-1s", - // "dispatch.latest_time": "rt", - // "is_scheduled": "1", - // "cron_schedule": "* * * * *" - // }; + // // Real-time search config + // var searchConfig = { + // "name": name, + // "search": "index="+indexName+" sourcetype=sdk-tests-alerts | head 1", + // "alert_type": "always", + // "alert.severity": "2", + // "alert.suppress": "0", + // "alert.track": "1", + // "dispatch.earliest_time": "rt-1s", + // "dispatch.latest_time": "rt", + // "is_scheduled": "1", + // "cron_schedule": "* * * * *" + // }; - // Async.chain([ - // function(done) { - // searches.create(searchConfig, done); - // }, - // function(search, done) { - // assert.ok(search); - // assert.strictEqual(search.alertCount(), 0); - // assert.strictEqual(search.firedAlertGroup().count(), 0); + // Async.chain([ + // function(done) { + // searches.create(searchConfig, done); + // }, + // function(search, done) { + // assert.ok(search); + // assert.strictEqual(search.alertCount(), 0); + // assert.strictEqual(search.firedAlertGroup().count(), 0); - // var indexes = search.service.indexes(); - // indexes.create(indexName, {}, function(err, index) { - // if (err && err.status !== 409) { - // done(new Error("Index creation failed for an unknown reason")); - // } - // done(null, search); - // }); - // }, - // function(originalSearch, done) { - // var indexes = originalSearch.service.indexes(); - // indexes.fetch(function(err, indexes) { - // if (err) { - // done(err); - // } - // else { - // var index = indexes.item(indexName); - // assert.ok(index); - // index.enable(Async.augment(done, originalSearch)); - // } - // }); - // }, - // function(index, originalSearch, done) { - // //Is the index enabled? - // assert.ok(!index.properties().disabled); - // //refresh the index - // index.fetch(Async.augment(done, originalSearch)); - // }, - // function(index, originalSearch, done) { - // //Store the current event count for a later comparison - // var eventCount = index.properties().totalEventCount; + // var indexes = search.service.indexes(); + // indexes.create(indexName, {}, function(err, index) { + // if (err && err.status !== 409) { + // done(new Error("Index creation failed for an unknown reason")); + // } + // done(null, search); + // }); + // }, + // function(originalSearch, done) { + // var indexes = originalSearch.service.indexes(); + // indexes.fetch(function(err, indexes) { + // if (err) { + // done(err); + // } + // else { + // var index = indexes.item(indexName); + // assert.ok(index); + // index.enable(Async.augment(done, originalSearch)); + // } + // }); + // }, + // function(index, originalSearch, done) { + // //Is the index enabled? + // assert.ok(!index.properties().disabled); + // //refresh the index + // index.fetch(Async.augment(done, originalSearch)); + // }, + // function(index, originalSearch, done) { + // //Store the current event count for a later comparison + // var eventCount = index.properties().totalEventCount; - // assert.strictEqual(index.properties().sync, 0); - // assert.ok(!index.properties().disabled); + // assert.strictEqual(index.properties().sync, 0); + // assert.ok(!index.properties().disabled); - // index.fetch(Async.augment(done, originalSearch, eventCount)); - // }, - // function(index, originalSearch, eventCount, done) { - // // submit an event - // index.submitEvent( - // "JS SDK: testing alerts", - // { - // sourcetype: "sdk-tests-alerts" - // }, - // Async.augment(done, originalSearch, eventCount) - // ); - // }, - // function(result, index, originalSearch, eventCount, done) { - // Async.sleep(1000, function(){ - // //refresh the search - // index.fetch(Async.augment(done, originalSearch, eventCount)); - // }); - // }, - // function(index, originalSearch, eventCount, done) { - // // Did the event get submitted - // assert.strictEqual(index.properties().totalEventCount, eventCount+1); - // // Refresh the search - // originalSearch.fetch(Async.augment(done, index)); - // }, - // function(originalSearch, index, done) { - // splunkjs.Logger.log("\tAlert count pre-fetch", originalSearch.alertCount()); - // var attemptNum = 1; - // var maxAttempts = 20; - // Async.whilst( - // function() { - // // When this returns false, it hits the final function in the chain - // splunkjs.Logger.log("\tFetch attempt", attemptNum, "of", maxAttempts, "alertCount", originalSearch.alertCount()); - // if (originalSearch.alertCount() !== 0) { - // return false; - // } - // else { - // attemptNum++; - // return attemptNum < maxAttempts; - // } - // }, - // function(callback) { - // Async.sleep(500, function() { - // originalSearch.fetch(callback); - // }); - // }, - // function(err) { - // splunkjs.Logger.log("Attempted fetching", attemptNum, "of", maxAttempts, "result is", originalSearch.alertCount() !== 0); - // originalSearch.fetch(Async.augment(done, index)); - // } - // ); - // }, - // function(originalSearch, index, done) { - // splunkjs.Logger.log("about to fetch"); - // splunkjs.Logger.log("SavedSearch name was: " + originalSearch.name); - // svc.firedAlertGroups({username: svc.username}).fetch(Async.augment(done, index, originalSearch)); - // }, - // function(firedAlertGroups, index, originalSearch, done) { - // Async.seriesEach( - // firedAlertGroups.list(), - // function(firedAlertGroup, innerIndex, seriescallback) { - // Async.chain([ - // function(insideChainCallback) { - // firedAlertGroup.list(insideChainCallback); - // }, - // function(firedAlerts, firedAlertGroup, insideChainCallback) { - // for(var i = 0; i < firedAlerts.length; i++) { - // var firedAlert = firedAlerts[i]; - // firedAlert.actions(); - // firedAlert.alertType(); - // firedAlert.isDigestMode(); - // firedAlert.expirationTime(); - // firedAlert.savedSearchName(); - // firedAlert.severity(); - // firedAlert.sid(); - // firedAlert.triggerTime(); - // firedAlert.triggerTimeRendered(); - // firedAlert.triggeredAlertCount(); - // } - // insideChainCallback(null); - // } - // ], - // function(err) { - // if (err) { - // seriescallback(err); - // } - // seriescallback(null); - // } - // ); - // }, - // function(err) { - // if (err) { - // done(err, originalSearch, index); - // } - // done(null, originalSearch, index); - // } - // ); - // }, - // function(originalSearch, index, done) { - // // Make sure the event count has incremented, as expected - // assert.strictEqual(originalSearch.alertCount(), 1); - // // Remove the search, especially because it's a real-time search - // originalSearch.remove(Async.augment(done, index)); - // }, - // function(index, done) { - // Async.sleep(500, function() { - // index.remove(done); - // }); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, + // index.fetch(Async.augment(done, originalSearch, eventCount)); + // }, + // function(index, originalSearch, eventCount, done) { + // // submit an event + // index.submitEvent( + // "JS SDK: testing alerts", + // { + // sourcetype: "sdk-tests-alerts" + // }, + // Async.augment(done, originalSearch, eventCount) + // ); + // }, + // function(result, index, originalSearch, eventCount, done) { + // Async.sleep(1000, function(){ + // //refresh the search + // index.fetch(Async.augment(done, originalSearch, eventCount)); + // }); + // }, + // function(index, originalSearch, eventCount, done) { + // // Did the event get submitted + // assert.strictEqual(index.properties().totalEventCount, eventCount+1); + // // Refresh the search + // originalSearch.fetch(Async.augment(done, index)); + // }, + // function(originalSearch, index, done) { + // splunkjs.Logger.log("\tAlert count pre-fetch", originalSearch.alertCount()); + // var attemptNum = 1; + // var maxAttempts = 20; + // Async.whilst( + // function() { + // // When this returns false, it hits the final function in the chain + // splunkjs.Logger.log("\tFetch attempt", attemptNum, "of", maxAttempts, "alertCount", originalSearch.alertCount()); + // if (originalSearch.alertCount() !== 0) { + // return false; + // } + // else { + // attemptNum++; + // return attemptNum < maxAttempts; + // } + // }, + // function(callback) { + // Async.sleep(500, function() { + // originalSearch.fetch(callback); + // }); + // }, + // function(err) { + // splunkjs.Logger.log("Attempted fetching", attemptNum, "of", maxAttempts, "result is", originalSearch.alertCount() !== 0); + // originalSearch.fetch(Async.augment(done, index)); + // } + // ); + // }, + // function(originalSearch, index, done) { + // splunkjs.Logger.log("about to fetch"); + // splunkjs.Logger.log("SavedSearch name was: " + originalSearch.name); + // svc.firedAlertGroups({username: svc.username}).fetch(Async.augment(done, index, originalSearch)); + // }, + // function(firedAlertGroups, index, originalSearch, done) { + // Async.seriesEach( + // firedAlertGroups.list(), + // function(firedAlertGroup, innerIndex, seriescallback) { + // Async.chain([ + // function(insideChainCallback) { + // firedAlertGroup.list(insideChainCallback); + // }, + // function(firedAlerts, firedAlertGroup, insideChainCallback) { + // for(var i = 0; i < firedAlerts.length; i++) { + // var firedAlert = firedAlerts[i]; + // firedAlert.actions(); + // firedAlert.alertType(); + // firedAlert.isDigestMode(); + // firedAlert.expirationTime(); + // firedAlert.savedSearchName(); + // firedAlert.severity(); + // firedAlert.sid(); + // firedAlert.triggerTime(); + // firedAlert.triggerTimeRendered(); + // firedAlert.triggeredAlertCount(); + // } + // insideChainCallback(null); + // } + // ], + // function(err) { + // if (err) { + // seriescallback(err); + // } + // seriescallback(null); + // } + // ); + // }, + // function(err) { + // if (err) { + // done(err, originalSearch, index); + // } + // done(null, originalSearch, index); + // } + // ); + // }, + // function(originalSearch, index, done) { + // // Make sure the event count has incremented, as expected + // assert.strictEqual(originalSearch.alertCount(), 1); + // // Remove the search, especially because it's a real-time search + // originalSearch.remove(Async.augment(done, index)); + // }, + // function(index, done) { + // Async.sleep(500, function() { + // index.remove(done); + // }); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }); - "Callback#delete all alerts": function (done) { - var namePrefix = "jssdk_savedsearch_alert_"; - var alertList = this.service.savedSearches().list(); + it("Callback#delete all alerts", function (done) { + var namePrefix = "jssdk_savedsearch_alert_"; + var alertList = this.service.savedSearches().list(); - Async.parallelEach( - alertList, - function (alert, idx, callback) { - if (utils.startsWith(alert.name, namePrefix)) { - splunkjs.Logger.log("ALERT ---", alert.name); - alert.remove(callback); - } - else { - callback(); + Async.parallelEach( + alertList, + function (alert, idx, callback) { + if (utils.startsWith(alert.name, namePrefix)) { + splunkjs.Logger.log("ALERT ---", alert.name); + alert.remove(callback); + } + else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); } - }, function (err) { - assert.ok(!err); - done(); - } - ); - } - }; + ); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/indexes.js b/tests/service_tests/indexes.js index c6327f246..e5712ba45 100644 --- a/tests/service_tests/indexes.js +++ b/tests/service_tests/indexes.js @@ -10,363 +10,397 @@ var getNextId = function () { }; exports.setup = function (svc, loggedOutSvc) { - return { - - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; + return ( + describe("Indexes tests", function (done) { + beforeEach(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; + + // Create the index for everyone to use + var name = this.indexName = "sdk-tests"; + var indexes = this.service.indexes(); + indexes.create(name, {}, function (err, index) { + if (err && err.status !== 409) { + throw new Error("Index creation failed for an unknown reason"); + } - // Create the index for everyone to use - var name = this.indexName = "sdk-tests"; - var indexes = this.service.indexes(); - indexes.create(name, {}, function (err, index) { - if (err && err.status !== 409) { - throw new Error("Index creation failed for an unknown reason"); - } + done(); + }); + }); - done(); + // it("Callback#remove index fails on Splunk 4.x", function(done) { + // var original_version = this.service.version; + // this.service.version = "4.0"; + // + // var index = this.service.indexes().item(this.indexName); + // assert.throws(function() { index.remove(function(err) {}); }); + // + // this.service.version = original_version; + // done(); + // }); + + // it("Callback#remove index", function(done) { + // var indexes = this.service.indexes(); + // + // // Must generate a private index because an index cannot + // // be recreated with the same name as a deleted index + // // for a certain period of time after the deletion. + // var salt = Math.floor(Math.random() * 65536); + // var myIndexName = this.indexName + '-' + salt; + // + // if (this.service.versionCompare("5.0") < 0) { + // splunkjs.Logger.info("", "Must be running Splunk 5.0+ for this test to work."); + // done(); + // return; + // } + // + // Async.chain([ + // function(callback) { + // indexes.create(myIndexName, {}, callback); + // }, + // function(index, callback) { + // index.remove(callback); + // }, + // function(callback) { + // var numTriesLeft = 50; + // var delayPerTry = 200; // ms + // + // Async.whilst( + // function() { return indexes.item(myIndexName) && ((numTriesLeft--) > 0); }, + // function(iterDone) { + // Async.sleep(delayPerTry, function() { indexes.fetch(iterDone); }); + // }, + // function(err) { + // if (err) { + // callback(err); + // } + // else { + // callback(numTriesLeft <= 0 ? "Timed out" : null); + // } + // } + // ); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }); + + it("Callback#list indexes", function (done) { + var indexes = this.service.indexes(); + indexes.fetch(function (err, indexes) { + var indexList = indexes.list(); + assert.ok(indexList.length > 0); + done(); + }); }); - }, - - // "Callback#remove index fails on Splunk 4.x": function(done) { - // var original_version = this.service.version; - // this.service.version = "4.0"; - // - // var index = this.service.indexes().item(this.indexName); - // assert.throws(function() { index.remove(function(err) {}); }); - // - // this.service.version = original_version; - // done(); - // }, - - // "Callback#remove index": function(done) { - // var indexes = this.service.indexes(); - // - // // Must generate a private index because an index cannot - // // be recreated with the same name as a deleted index - // // for a certain period of time after the deletion. - // var salt = Math.floor(Math.random() * 65536); - // var myIndexName = this.indexName + '-' + salt; - // - // if (this.service.versionCompare("5.0") < 0) { - // splunkjs.Logger.info("", "Must be running Splunk 5.0+ for this test to work."); - // done(); - // return; - // } - // - // Async.chain([ - // function(callback) { - // indexes.create(myIndexName, {}, callback); - // }, - // function(index, callback) { - // index.remove(callback); - // }, - // function(callback) { - // var numTriesLeft = 50; - // var delayPerTry = 200; // ms - // - // Async.whilst( - // function() { return indexes.item(myIndexName) && ((numTriesLeft--) > 0); }, - // function(iterDone) { - // Async.sleep(delayPerTry, function() { indexes.fetch(iterDone); }); - // }, - // function(err) { - // if (err) { - // callback(err); - // } - // else { - // callback(numTriesLeft <= 0 ? "Timed out" : null); - // } - // } - // ); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - - "Callback#list indexes": function (done) { - var indexes = this.service.indexes(); - indexes.fetch(function (err, indexes) { - var indexList = indexes.list(); - assert.ok(indexList.length > 0); - done(); + + it("Callback#contains index", function (done) { + var indexes = this.service.indexes(); + var indexName = this.indexName; + + indexes.fetch(function (err, indexes) { + var index = indexes.item(indexName); + assert.ok(index); + done(); + }); }); - }, - "Callback#contains index": function (done) { - var indexes = this.service.indexes(); - var indexName = this.indexName; + it("Callback#modify index", function (done) { - indexes.fetch(function (err, indexes) { - var index = indexes.item(indexName); - assert.ok(index); - done(); + var name = this.indexName; + var indexes = this.service.indexes(); + var originalSyncMeta = false; + + Async.chain([ + function (callback) { + indexes.fetch(callback); + }, + function (indexes, callback) { + var index = indexes.item(name); + assert.ok(index); + + originalSyncMeta = index.properties().syncMeta; + index.update({ + syncMeta: !originalSyncMeta + }, callback); + }, + function (index, callback) { + assert.ok(index); + var properties = index.properties(); + + assert.strictEqual(!originalSyncMeta, properties.syncMeta); + + index.update({ + syncMeta: !properties.syncMeta + }, callback); + }, + function (index, callback) { + assert.ok(index); + var properties = index.properties(); + + assert.strictEqual(originalSyncMeta, properties.syncMeta); + callback(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); }); - }, - "Callback#modify index": function (done) { + it("Callback#Enable+disable index", function (done) { - var name = this.indexName; - var indexes = this.service.indexes(); - var originalSyncMeta = false; + this.timeout(40000); + var name = this.indexName; + var indexes = this.service.indexes(); - Async.chain([ - function (callback) { - indexes.fetch(callback); - }, - function (indexes, callback) { - var index = indexes.item(name); - assert.ok(index); + Async.chain([ + function (callback) { + indexes.fetch(callback); + }, + function (indexes, callback) { + var index = indexes.item(name); + assert.ok(index); - originalSyncMeta = index.properties().syncMeta; - index.update({ - syncMeta: !originalSyncMeta - }, callback); - }, - function (index, callback) { - assert.ok(index); - var properties = index.properties(); + index.disable(callback); + }, + function (index, callback) { + Async.sleep(5000, function () { + callback(null, index); + }); + }, + function (index, callback) { + assert.ok(index); + index.fetch(callback); + }, + function (index, callback) { + assert.ok(index); + assert.ok(index.properties().disabled); - assert.strictEqual(!originalSyncMeta, properties.syncMeta); + index.enable(callback); + }, + function (index, callback) { + Async.sleep(5000, function () { + callback(null, index); + }); + }, + function (index, callback) { + assert.ok(index); + index.fetch(callback); + }, + function (index, callback) { + assert.ok(index); + assert.ok(!index.properties().disabled); - index.update({ - syncMeta: !properties.syncMeta - }, callback); - }, - function (index, callback) { - assert.ok(index); - var properties = index.properties(); - - assert.strictEqual(originalSyncMeta, properties.syncMeta); - callback(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Enable+disable index": function (done) { - - this.timeout(40000); - var name = this.indexName; - var indexes = this.service.indexes(); - - Async.chain([ - function (callback) { - indexes.fetch(callback); - }, - function (indexes, callback) { - var index = indexes.item(name); - assert.ok(index); + callback(); + } + ], + function (err) { + assert.ok(!err, JSON.stringify(err)); + done(); + } + ); + }); - index.disable(callback); - }, - function (index, callback) { - Async.sleep(5000, function () { - callback(null, index); - }); - }, - function (index, callback) { - assert.ok(index); - index.fetch(callback); - }, - function (index, callback) { - assert.ok(index); - assert.ok(index.properties().disabled); - - index.enable(callback); - }, - function (index, callback) { - Async.sleep(5000, function () { - callback(null, index); - }); - }, - function (index, callback) { - assert.ok(index); - index.fetch(callback); - }, - function (index, callback) { - assert.ok(index); - assert.ok(!index.properties().disabled); + it("Callback#Service submit event", function (done) { + var message = "Hello World -- " + getNextId(); + var sourcetype = "sdk-tests"; - callback(); - } - ], - function (err) { - assert.ok(!err, JSON.stringify(err)); - done(); - } - ); - }, - - "Callback#Service submit event": function (done) { - var message = "Hello World -- " + getNextId(); - var sourcetype = "sdk-tests"; - - var service = this.service; - var indexName = this.indexName; - Async.chain( - function (done) { - service.log(message, { sourcetype: sourcetype, index: indexName }, done); - }, - function (eventInfo, done) { - assert.ok(eventInfo); - assert.strictEqual(eventInfo.sourcetype, sourcetype); - assert.strictEqual(eventInfo.bytes, message.length); - assert.strictEqual(eventInfo.index, indexName); - - // We could poll to make sure the index has eaten up the event, - // but unfortunately this can take an unbounded amount of time. - // As such, since we got a good response, we'll just be done with it. - done(); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Service submit event, omitting optional arguments": function (done) { - var message = "Hello World -- " + getNextId(); - var sourcetype = "sdk-tests"; - - var service = this.service; - var indexName = this.indexName; - Async.chain( - function (done) { - service.log(message, done); - }, - function (eventInfo, done) { - assert.ok(eventInfo); - assert.strictEqual(eventInfo.bytes, message.length); - - // We could poll to make sure the index has eaten up the event, - // but unfortunately this can take an unbounded amount of time. - // As such, since we got a good response, we'll just be done with it. - done(); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Service submit events with multi-byte chars": function (done) { - var service = this.service; - var messages = [ - "Ummelner Straße 6", - "Ümmelner Straße 6", - "Iԉtérԉátíòлåɭìƶåtiòл", - "Intérnâtì߀лàɭíƶɑtïòл", - "ãϻét dòner turƙëy ѵ߀lù", - "ptãte ìԉ rëρrèhënԁérit ", - "ϻ߀lɭit fìɭèt ϻìǥnoԉ ɭäb߀ríѕ", - " êӽ cɦùck cüpïᏧåtåt Ꮷèѕëruлt. ", - "D߀ɭor ѵélít ìrurè, sèᏧ ѕhòr", - "t riƅѕ c߀ɰ ɭãnԁյàéɢêr drúmst", - "ícƙ. Minïm ƃàɭl tip ѕհòrt rìƃѕ,", - " ïԁ aɭïqúìρ ѕɦànƙ ρ߀rcɦéttɑ. Pìǥ", - " hãm ɦòck ìлcídíԁùԉt séԁ cüpïϻ ", - "ƙèviл láborê. Et taiɭ ѕtriρ", - " steák út üllãϻc߀ rump d߀ɭore.", - "٩(͡๏̯͡๏)۶ ٩(-̮̮̃•̃).", - "Lɑƅòré ƃrësãòlá d߀лèr ѕâlámí ", - "cíllûm ìn ѕɯìлe ϻêàtɭ߀àf dûìs ", - "ρãncettä ƅrìsƙét ԁèsêrûлt áútè", - " յòɰɭ. Lɑbòrìѕ ƙìêɭ", - "básá ԁòlòré fatƃɑck ƅêéf. Pɑѕtr", - "ämì piɢ ѕհàлƙ ùɭɭamcò ѕaû", - "ѕäǥë sɦànƙlë.", - " Cúpím ɭäƃorum drumstïcƙ jerkϒ veli", - " pïcåԉɦɑ ƙíéɭƅãsa. Alïqû", - "iρ írürë cûpíϻ, äɭìɋuâ ǥròûлd ", - "roúлᏧ toԉgüè ρàrìãtùr ", - "briѕkèt ԉostruᏧ cûɭpɑ", - " ìd còлѕèqûât làƅ߀rìs." - ]; - - var counter = 0; - Async.seriesMap( - messages, - function (val, idx, done) { - counter++; - service.log(val, done); - }, - function (err, vals) { - assert.ok(!err); - assert.strictEqual(counter, messages.length); - - // Verify that the full byte-length was sent for each message - for (var m in messages) { - assert.notStrictEqual(messages[m].length, vals[m].bytes); - try { - assert.strictEqual(Buffer.byteLength(messages[m]), vals[m].bytes); - } - catch (err) { - // Assume Buffer isn't defined, we're probably in the browser - assert.strictEqual(decodeURI(encodeURIComponent(messages[m])).length, vals[m].bytes); + var service = this.service; + var indexName = this.indexName; + Async.chain( + function (done) { + service.log(message, { sourcetype: sourcetype, index: indexName }, done); + }, + function (eventInfo, done) { + assert.ok(eventInfo); + assert.strictEqual(eventInfo.sourcetype, sourcetype); + assert.strictEqual(eventInfo.bytes, message.length); + assert.strictEqual(eventInfo.index, indexName); + + // We could poll to make sure the index has eaten up the event, + // but unfortunately this can take an unbounded amount of time. + // As such, since we got a good response, we'll just be done with it. + done(); + }, + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("Callback#Service submit event, omitting optional arguments", function (done) { + var message = "Hello World -- " + getNextId(); + var sourcetype = "sdk-tests"; + + var service = this.service; + var indexName = this.indexName; + Async.chain( + function (done) { + service.log(message, done); + }, + function (eventInfo, done) { + assert.ok(eventInfo); + assert.strictEqual(eventInfo.bytes, message.length); + + // We could poll to make sure the index has eaten up the event, + // but unfortunately this can take an unbounded amount of time. + // As such, since we got a good response, we'll just be done with it. + done(); + }, + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("Callback#Service submit events with multi-byte chars", function (done) { + var service = this.service; + var messages = [ + "Ummelner Straße 6", + "Ümmelner Straße 6", + "Iԉtérԉátíòлåɭìƶåtiòл", + "Intérnâtì߀лàɭíƶɑtïòл", + "ãϻét dòner turƙëy ѵ߀lù", + "ptãte ìԉ rëρrèhënԁérit ", + "ϻ߀lɭit fìɭèt ϻìǥnoԉ ɭäb߀ríѕ", + " êӽ cɦùck cüpïᏧåtåt Ꮷèѕëruлt. ", + "D߀ɭor ѵélít ìrurè, sèᏧ ѕhòr", + "t riƅѕ c߀ɰ ɭãnԁյàéɢêr drúmst", + "ícƙ. Minïm ƃàɭl tip ѕհòrt rìƃѕ,", + " ïԁ aɭïqúìρ ѕɦànƙ ρ߀rcɦéttɑ. Pìǥ", + " hãm ɦòck ìлcídíԁùԉt séԁ cüpïϻ ", + "ƙèviл láborê. Et taiɭ ѕtriρ", + " steák út üllãϻc߀ rump d߀ɭore.", + "٩(͡๏̯͡๏)۶ ٩(-̮̮̃•̃).", + "Lɑƅòré ƃrësãòlá d߀лèr ѕâlámí ", + "cíllûm ìn ѕɯìлe ϻêàtɭ߀àf dûìs ", + "ρãncettä ƅrìsƙét ԁèsêrûлt áútè", + " յòɰɭ. Lɑbòrìѕ ƙìêɭ", + "básá ԁòlòré fatƃɑck ƅêéf. Pɑѕtr", + "ämì piɢ ѕհàлƙ ùɭɭamcò ѕaû", + "ѕäǥë sɦànƙlë.", + " Cúpím ɭäƃorum drumstïcƙ jerkϒ veli", + " pïcåԉɦɑ ƙíéɭƅãsa. Alïqû", + "iρ írürë cûpíϻ, äɭìɋuâ ǥròûлd ", + "roúлᏧ toԉgüè ρàrìãtùr ", + "briѕkèt ԉostruᏧ cûɭpɑ", + " ìd còлѕèqûât làƅ߀rìs." + ]; + + var counter = 0; + Async.seriesMap( + messages, + function (val, idx, done) { + counter++; + service.log(val, done); + }, + function (err, vals) { + assert.ok(!err); + assert.strictEqual(counter, messages.length); + + // Verify that the full byte-length was sent for each message + for (var m in messages) { + assert.notStrictEqual(messages[m].length, vals[m].bytes); + try { + assert.strictEqual(Buffer.byteLength(messages[m]), vals[m].bytes); + } + catch (err) { + // Assume Buffer isn't defined, we're probably in the browser + assert.strictEqual(decodeURI(encodeURIComponent(messages[m])).length, vals[m].bytes); + } } + + done(); } + ); + }); - done(); - } - ); - }, - - "Callback#Service submit event, failure": function (done) { - var message = "Hello World -- " + getNextId(); - var sourcetype = "sdk-tests"; - - var service = this.loggedOutService; - var indexName = this.indexName; - Async.chain( - function (done) { - assert.ok(service); - service.log(message, done); - }, - function (err) { - assert.ok(err); - done(); - } - ); - }, - - "Callback#remove throws an error": function (done) { - var index = this.service.indexes().item("_internal"); - assert.throws(function () { - index.remove(); + it("Callback#Service submit event, failure", function (done) { + var message = "Hello World -- " + getNextId(); + var sourcetype = "sdk-tests"; + + var service = this.loggedOutService; + var indexName = this.indexName; + Async.chain( + function (done) { + assert.ok(service); + service.log(message, done); + }, + function (err) { + assert.ok(err); + done(); + } + ); + }); + + it("Callback#remove throws an error", function (done) { + var index = this.service.indexes().item("_internal"); + assert.throws(function () { + index.remove(); + }); + done(); }); - done(); - }, - - "Callback#create an index with alternate argument format": function (done) { - var indexes = this.service.indexes(); - indexes.create( - { name: "_internal" }, - function (err, newIndex) { - assert.ok(err.data.messages[0].text.match("name=_internal already exists")); - done(); - } - ); - }, - "Callback#Index submit event with omitted optional arguments": function (done) { - var message = "Hello world -- " + getNextId(); + it("Callback#create an index with alternate argument format", function (done) { + var indexes = this.service.indexes(); + indexes.create( + { name: "_internal" }, + function (err, newIndex) { + assert.ok(err.data.messages[0].text.match("name=_internal already exists")); + done(); + } + ); + }); + + it("Callback#Index submit event with omitted optional arguments", function (done) { + var message = "Hello world -- " + getNextId(); + + var indexName = this.indexName; + var indexes = this.service.indexes(); + + Async.chain( + [ + function (done) { + indexes.fetch(done); + }, + function (indexes, done) { + var index = indexes.item(indexName); + assert.ok(index); + assert.strictEqual(index.name, indexName); + index.submitEvent(message, done); + }, + function (eventInfo, index, done) { + assert.ok(eventInfo); + assert.strictEqual(eventInfo.bytes, message.length); + assert.strictEqual(eventInfo.index, indexName); + + // We could poll to make sure the index has eaten up the event, + // but unfortunately this can take an unbounded amount of time. + // As such, since we got a good response, we'll just be done with it. + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - var indexName = this.indexName; - var indexes = this.service.indexes(); + it("Callback#Index submit event", function (done) { + var message = "Hello World -- " + getNextId(); + var sourcetype = "sdk-tests"; - Async.chain( - [ + var indexName = this.indexName; + var indexes = this.service.indexes(); + Async.chain([ function (done) { indexes.fetch(done); }, @@ -374,10 +408,11 @@ exports.setup = function (svc, loggedOutSvc) { var index = indexes.item(indexName); assert.ok(index); assert.strictEqual(index.name, indexName); - index.submitEvent(message, done); + index.submitEvent(message, { sourcetype: sourcetype }, done); }, function (eventInfo, index, done) { assert.ok(eventInfo); + assert.strictEqual(eventInfo.sourcetype, sourcetype); assert.strictEqual(eventInfo.bytes, message.length); assert.strictEqual(eventInfo.index, indexName); @@ -387,48 +422,14 @@ exports.setup = function (svc, loggedOutSvc) { done(); } ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Index submit event": function (done) { - var message = "Hello World -- " + getNextId(); - var sourcetype = "sdk-tests"; - - var indexName = this.indexName; - var indexes = this.service.indexes(); - Async.chain([ - function (done) { - indexes.fetch(done); - }, - function (indexes, done) { - var index = indexes.item(indexName); - assert.ok(index); - assert.strictEqual(index.name, indexName); - index.submitEvent(message, { sourcetype: sourcetype }, done); - }, - function (eventInfo, index, done) { - assert.ok(eventInfo); - assert.strictEqual(eventInfo.sourcetype, sourcetype); - assert.strictEqual(eventInfo.bytes, message.length); - assert.strictEqual(eventInfo.index, indexName); - - // We could poll to make sure the index has eaten up the event, - // but unfortunately this can take an unbounded amount of time. - // As such, since we got a good response, we'll just be done with it. - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - } - }; + function (err) { + assert.ok(!err); + done(); + } + ); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/job.js b/tests/service_tests/job.js index 1fe303a0a..1b59d7550 100644 --- a/tests/service_tests/job.js +++ b/tests/service_tests/job.js @@ -1,935 +1,911 @@ -var assert = require('chai').assert; -var path = require("path"); +exports.setup = function (svc) { + var assert = require('chai').assert; + var path = require("path"); -var splunkjs = require('../../index'); -var tutils = require('../utils'); -const { Logger } = require('../../lib/log'); + var splunkjs = require('../../index'); + var tutils = require('../utils'); + const { Logger } = require('../../lib/log'); -var Async = splunkjs.Async; -var idCounter = 0; + var Async = splunkjs.Async; + var idCounter = 0; -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; + var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); + }; + return ( + describe("Job tests", function (done) { + beforeEach(function (done) { + this.service = svc; + done(); + }); -exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. - // - // "Callback#Create+abort job": function(done) { - // var service = this.service; - // Async.chain([ - // function(done){ - // var app_name = path.join(process.env.SPLUNK_HOME, ('/etc/apps/sdk-app-collection/build/sleep_command.tar')); - // // Fix path on Windows if $SPLUNK_HOME contains a space (ex: C:/Program%20Files/Splunk) - // app_name = app_name.replace("%20", " "); - // service.post("apps/appinstall", {update:1, name:app_name}, done); - // }, - // function(done){ - // var sid = getNextId(); - // var options = {id: sid}; - // var jobs = service.jobs({app: "sdk-app-collection"}); - // var req = jobs.oneshotSearch('search index=_internal | head 1 | sleep 10', options, function(err, job) { - // assert.ok(err); - // assert.ok(!job); - // assert.strictEqual(err.error, "abort"); - // done(); - // }); - - // Async.sleep(1000, function(){ - // req.abort(); - // }); - // } - // ], - // function(err){ - // assert.ok(!err); - // done(); - // }); - // }, - - "Callback#Create+cancel job": function (done) { - var sid = getNextId(); - this.service.jobs().search('search index=_internal | head 1', { id: sid }, function (err, job) { - assert.ok(job); - assert.strictEqual(job.sid, sid); - - job.cancel(function () { - done(); + // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. + // + // it("Callback#Create+abort job", function (done) { + // var service = this.service; + // Async.chain([ + // function (done) { + // var app_name = path.join(process.env.SPLUNK_HOME, ('/etc/apps/sdkappcollection/build/sleep_command.tar')); + // // Fix path on Windows if $SPLUNK_HOME contains a space (ex: C:/Program%20Files/Splunk) + // app_name = app_name.replace("%20", " "); + // // var app_name = "sleep_command"; + // service.post("apps/local", { update: 1, name: app_name, filename: true }, done); + // }, + // function (done) { + // var sid = getNextId(); + // var options = { id: sid }; + // var jobs = service.jobs(); + // var req = jobs.oneshotSearch('search index=_internal | head 1 | sleep 10', options, function (err, job) { + // assert.ok(err); + // assert.ok(!job); + // assert.strictEqual(err.error, "abort"); + // }); + + // Async.sleep(1000, function () { + // req.abort(); + // }); + // } + // ], + // function (err) { + // assert.ok(!err); + // done(); + // }); + // done(); + // }); + + it("Callback#Create+cancel job", function (done) { + var sid = getNextId(); + this.service.jobs().search('search index=_internal | head 1', { id: sid }, function (err, job) { + assert.ok(job); + assert.strictEqual(job.sid, sid); + + job.cancel(function () { + done(); + }); }); }); - }, - "Callback#Create job error": function (done) { - var sid = getNextId(); - this.service.jobs().search({ search: 'index=_internal | head 1', id: sid }, function (err) { - assert.ok(!!err); - done(); + it("Callback#Create job error", function (done) { + var sid = getNextId(); + this.service.jobs().search({ search: 'index=_internal | head 1', id: sid }, function (err) { + assert.ok(!!err); + done(); + }); }); - }, - "Callback#List jobs": function (done) { - this.service.jobs().fetch(function (err, jobs) { - assert.ok(!err); - assert.ok(jobs); + it("Callback#List jobs", function (done) { + this.service.jobs().fetch(function (err, jobs) { + assert.ok(!err); + assert.ok(jobs); - var jobsList = jobs.list(); - assert.ok(jobsList.length > 0); + var jobsList = jobs.list(); + assert.ok(jobsList.length > 0); - for (var i = 0; i < jobsList.length; i++) { - assert.ok(jobsList[i]); - } + for (var i = 0; i < jobsList.length; i++) { + assert.ok(jobsList[i]); + } - done(); + done(); + }); }); - }, - - "Callback#Contains job": function (done) { - var that = this; - var sid = getNextId(); - var jobs = this.service.jobs(); - jobs.search('search index=_internal | head 1', { id: sid }, function (err, job) { - assert.ok(!err); - assert.ok(job); - assert.strictEqual(job.sid, sid); + it("Callback#Contains job", function (done) { + var that = this; + var sid = getNextId(); + var jobs = this.service.jobs(); - jobs.fetch(function (err, jobs) { + jobs.search('search index=_internal | head 1', { id: sid }, function (err, job) { assert.ok(!err); - var job = jobs.item(sid); assert.ok(job); + assert.strictEqual(job.sid, sid); - job.cancel(function () { - done(); + jobs.fetch(function (err, jobs) { + assert.ok(!err); + var job = jobs.item(sid); + assert.ok(job); + + job.cancel(function () { + done(); + }); }); }); }); - }, - - "Callback#job results": function (done) { - var sid = getNextId(); - var service = this.service; - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1 | stats count', { id: sid }, done); - }, - function (job, done) { - assert.strictEqual(job.sid, sid); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - job.results({}, done); - }, - function (results, job, done) { - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.fields.length, 1); - assert.strictEqual(results.fields[0], "count"); - assert.strictEqual(results.rows[0][0], "1"); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#job events": function (done) { - var sid = getNextId(); - var service = this.service; - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); - }, - function (job, done) { - assert.strictEqual(job.sid, sid); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - job.events({}, done); - }, - function (results, job, done) { - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.fields.length, results.rows[0].length); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#job results preview": function (done) { - var sid = getNextId(); - var service = this.service; - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1 | stats count', { id: sid }, done); - }, - function (job, done) { - assert.strictEqual(job.sid, sid); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - job.preview({}, done); - }, - function (results, job, done) { - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.fields.length, 1); - assert.strictEqual(results.fields[0], "count"); - assert.strictEqual(results.rows[0][0], "1"); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#job results iterator": function (done) { - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 10', {}, done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - var iterator = job.iterator("results", { pagesize: 4 }); - var hasMore = true; - var numElements = 0; - var pageSizes = []; - Async.whilst( - function () { return hasMore; }, - function (nextIteration) { - iterator.next(function (err, results, _hasMore) { - if (err) { - nextIteration(err); - return; - } - hasMore = _hasMore; - if (hasMore) { - pageSizes.push(results.rows.length); - } - nextIteration(); - }); - }, - function (err) { - assert.deepStrictEqual(pageSizes, [4, 4, 2]); - done(err); - } - ); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. - // - // - // "Callback#Enable + disable preview": function(done) { - // var that = this; - // var sid = getNextId(); - - // var service = this.service.specialize("nobody", "sdk-app-collection"); - - // Async.chain([ - // function(done) { - // service.jobs().search('search index=_internal | head 1 | sleep 60', {id: sid}, done); - // }, - // function(job, done) { - // job.enablePreview(done); - - // }, - // function(job, done) { - // job.disablePreview(done); - // }, - // function(job, done) { - // job.cancel(done); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - - - // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. - // - // - // "Callback#Pause + unpause + finalize preview": function(done) { - // var that = this; - // var sid = getNextId(); - - // var service = this.service.specialize("nobody", "sdk-app-collection"); - - // Async.chain([ - // function(done) { - // service.jobs().search('search index=_internal | head 1 | sleep 5', {id: sid}, done); - // }, - // function(job, done) { - // job.pause(done); - // }, - // function(job, done) { - // tutils.pollUntil( - // job, - // function(j) { - // return j.properties()["isPaused"]; - // }, - // 10, - // done - // ); - // }, - // function(job, done) { - // assert.ok(job.properties()["isPaused"]); - // job.unpause(done); - // }, - // function(job, done) { - // tutils.pollUntil( - // job, - // function(j) { - // return !j.properties()["isPaused"]; - // }, - // 10, - // done - // ); - // }, - // function(job, done) { - // assert.ok(!job.properties()["isPaused"]); - // job.finalize(done); - // }, - // function(job, done) { - // job.cancel(done); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - - "Callback#Set TTL": function (done) { - var sid = getNextId(); - var originalTTL = 0; - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); - }, - function (job, done) { - job.fetch(done); - }, - function (job, done) { - var ttl = job.properties()["ttl"]; - originalTTL = ttl; - - job.setTTL(ttl * 2, done); - }, - function (job, done) { - job.fetch(done); - }, - function (job, done) { - var ttl = job.properties()["ttl"]; - assert.ok(ttl > originalTTL); - assert.ok(ttl <= (originalTTL * 2)); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. - // - // - // "Callback#Set priority": function(done) { - // var sid = getNextId(); - // var originalPriority = 0; - // var that = this; - - // var service = this.service.specialize("nobody", "sdk-app-collection"); - - // Async.chain([ - // function(done) { - // service.jobs().search('search index=_internal | head 1 | sleep 5', {id: sid}, done); - // }, - // function(job, done) { - // job.track({}, { - // ready: function(job) { - // done(null, job); - // } - // }); - // }, - // function(job, done) { - // var priority = job.properties()["priority"]; - // assert.ok(priority, 5); - // job.setPriority(priority + 1, done); - // }, - // function(job, done) { - // job.fetch(done); - // }, - // function(job, done) { - // job.cancel(done); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - - "Callback#Search log": function (done) { - var sid = getNextId(); - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1', { id: sid, exec_mode: "blocking" }, done); - }, - function (job, done) { - job.searchlog(done); - }, - function (log, job, done) { - assert.ok(job); - assert.ok(log); - assert.ok(log.length > 0); - assert.ok(log.split("\r\n").length > 0); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Search summary": function (done) { - var sid = getNextId(); - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search( - 'search index=_internal | head 1 | eval foo="bar" | fields foo', - { - id: sid, - status_buckets: 300, - rf: ["foo"] - }, - done); - }, - function (job, done) { - // Let's sleep for 2 second so - // we let the server catch up - Async.sleep(2000, function () { - job.summary({}, done); - }); - }, - function (summary, job, done) { - assert.ok(job); - assert.ok(summary); - assert.strictEqual(summary.event_count, 1); - assert.strictEqual(summary.fields.foo.count, 1); - assert.strictEqual(summary.fields.foo.distinct_count, 1); - assert.ok(summary.fields.foo.is_exact, 1); - assert.strictEqual(summary.fields.foo.modes.length, 1); - assert.strictEqual(summary.fields.foo.modes[0].count, 1); - assert.strictEqual(summary.fields.foo.modes[0].value, "bar"); - assert.ok(summary.fields.foo.modes[0].is_exact); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Search timeline": function (done) { - var sid = getNextId(); - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search( - 'search index=_internal | head 1 | eval foo="bar" | fields foo', - { - id: sid, - status_buckets: 300, - rf: ["foo"], - exec_mode: "blocking" - }, - done); - }, - function (job, done) { - job.timeline({}, done); - }, - function (timeline, job, done) { - assert.ok(job); - assert.ok(timeline); - assert.strictEqual(timeline.buckets.length, 1); - assert.strictEqual(timeline.event_count, 1); - assert.strictEqual(timeline.buckets[0].available_count, 1); - assert.strictEqual(timeline.buckets[0].duration, 0.001); - assert.strictEqual(timeline.buckets[0].earliest_time_offset, timeline.buckets[0].latest_time_offset); - assert.strictEqual(timeline.buckets[0].total_count, 1); - assert.ok(timeline.buckets[0].is_finalized); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Touch": function (done) { - var sid = getNextId(); - var that = this; - var originalTime = ""; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); - }, - function (job, done) { - job.fetch(done); - }, - function (job, done) { - assert.ok(job); - originalTime = job.properties().updated; - Async.sleep(1200, function () { job.touch(done); }); - }, - function (job, done) { - job.fetch(done); - }, - function (job, done) { - assert.ok(originalTime !== job.updated()); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create failure": function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - - var jobs = this.service.jobs(); - assert.throws(function () { jobs.create({ search: originalSearch, name: name, exec_mode: "oneshot" }, function () { }); }); - done(); - }, - - "Callback#Create fails with no search string": function (done) { - var jobs = this.service.jobs(); - jobs.create( - "", {}, - function (err) { - assert.ok(err); - done(); - } - ); - }, - - "Callback#Oneshot search": function (done) { - var sid = getNextId(); - var that = this; - var originalTime = ""; - - Async.chain([ - function (done) { - that.service.jobs().oneshotSearch('search index=_internal | head 1 | stats count', { id: sid }, done); - }, - function (results, done) { - assert.ok(results); - assert.ok(results.fields); - assert.strictEqual(results.fields.length, 1); - assert.strictEqual(results.fields[0], "count"); - assert.ok(results.rows); - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.rows[0].length, 1); - assert.strictEqual(results.rows[0][0], "1"); + it("Callback#job results", function (done) { + var sid = getNextId(); + var service = this.service; + var that = this; - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Oneshot search with no results": function (done) { - var sid = getNextId(); - var that = this; - var originalTime = ""; - - Async.chain([ - function (done) { - var query = 'search index=history MUST_NOT_EXISTABCDEF'; - that.service.jobs().oneshotSearch(query, { id: sid }, done); - }, - function (results, done) { - assert.ok(results); - assert.strictEqual(results.fields.length, 0); - assert.strictEqual(results.rows.length, 0); - assert.ok(!results.preview); + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1 | stats count', { id: sid }, done); + }, + function (job, done) { + assert.strictEqual(job.sid, sid); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + job.results({}, done); + }, + function (results, job, done) { + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.fields.length, 1); + assert.strictEqual(results.fields[0], "count"); + assert.strictEqual(results.rows[0][0], "1"); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - // "Callback#Service oneshot search": function(done) { - // var sid = getNextId(); - // var that = this; - // var namespace = {owner: "admin", app: "search"}; - // var splunkVersion = 6.1; // Default to pre-6.2 version - // var originalLoggerLevel = "DEBUG"; - - // Async.chain([ - // function(done) { - // // If running on Splunk 6.2+, first set the search logger level to DEBUG - // Async.chain([ - // function(done1) { - // that.service.serverInfo(done1); - // }, - // function(info, done1) { - // splunkVersion = parseFloat(info.properties().version); - // if (splunkVersion < 6.2) { - // done(); // Exit the inner Async.chain - // } - // else { - // done1(); - // } - // }, - // function(done1) { - // that.service.configurations({owner: "admin", app: "search"}).fetch(done1); - // }, - // function(confs, done1) { - // try { - // confs.item("limits").fetch(done1); - // } - // catch(e) { - // done1(e); - // } - // }, - // function(conf, done1) { - // var searchInfo = conf.item("search_info"); - // // Save this so it can be restored later - // originalLoggerLevel = searchInfo.properties()["infocsv_log_level"]; - // searchInfo.update({"infocsv_log_level": "DEBUG"}, done1); - // }, - // function(conf, done1) { - // assert.strictEqual("DEBUG", conf.properties()["infocsv_log_level"]); - // done1(); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - // function(done) { - // that.service.oneshotSearch('search index=_internal | head 1 | stats count', {id: sid}, namespace, done); - // }, - // function(results, done) { - // assert.ok(results); - // assert.ok(results.fields); - // assert.strictEqual(results.fields.length, 1); - // assert.strictEqual(results.fields[0], "count"); - // assert.ok(results.rows); - // assert.strictEqual(results.rows.length, 1); - // assert.strictEqual(results.rows[0].length, 1); - // assert.strictEqual(results.rows[0][0], "1"); - // assert.ok(results.messages[1].text.indexOf('owner="admin"')); - // assert.ok(results.messages[1].text.indexOf('app="search"')); - - // done(); - // }, - // function(done) { - // Async.chain([ - // function(done1) { - // if (splunkVersion < 6.2) { - // done(); // Exit the inner Async.chain - // } - // else { - // done1(); - // } - // }, - // function(done1) { - // that.service.configurations({owner: "admin", app: "search"}).fetch(done1); - // }, - // function(confs, done1) { - // try { - // confs.item("limits").fetch(done1); - // } - // catch(e) { - // done1(e); - // } - // }, - // function(conf, done1) { - // var searchInfo = conf.item("search_info"); - // // Restore the logger level from before - // searchInfo.update({"infocsv_log_level": originalLoggerLevel}, done1); - // }, - // function(conf, done1) { - // assert.strictEqual(originalLoggerLevel, conf.properties()["infocsv_log_level"]); - // done1(); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - - "Callback#Service search": function (done) { - var sid = getNextId(); - var service = this.service; - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { - that.service.search('search index=_internal | head 1 | stats count', { id: sid }, namespace, done); - }, - function (job, done) { - assert.strictEqual(job.sid, sid); - assert.strictEqual(job.namespace, namespace); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - job.results({}, done); - }, - function (results, job, done) { - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.fields.length, 1); - assert.strictEqual(results.fields[0], "count"); - assert.strictEqual(results.rows[0][0], "1"); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, + it("Callback#job events", function (done) { + var sid = getNextId(); + var service = this.service; + var that = this; - "Callback#Wait until job done": function (done) { - this.service.search('search index=_internal | head 1000', {}, function (err, job) { - assert.ok(!err); + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); + }, + function (job, done) { + assert.strictEqual(job.sid, sid); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + job.events({}, done); + }, + function (results, job, done) { + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.fields.length, results.rows[0].length); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - var numReadyEvents = 0; - var numProgressEvents = 0; - job.track({ period: 200 }, { - ready: function (job) { - assert.ok(job); + it("Callback#job results preview", function (done) { + var sid = getNextId(); + var service = this.service; + var that = this; - numReadyEvents++; + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1 | stats count', { id: sid }, done); }, - progress: function (job) { - assert.ok(job); - - numProgressEvents++; + function (job, done) { + assert.strictEqual(job.sid, sid); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); }, - done: function (job) { - assert.ok(job); + function (job, done) { + job.preview({}, done); + }, + function (results, job, done) { + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.fields.length, 1); + assert.strictEqual(results.fields[0], "count"); + assert.strictEqual(results.rows[0][0], "1"); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("Callback#job results iterator", function (done) { + var that = this; - assert.ok(numReadyEvents === 1); // all done jobs must have become ready - assert.ok(numProgressEvents >= 1); // a job that becomes ready has progress + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 10', {}, done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + var iterator = job.iterator("results", { pagesize: 4 }); + var hasMore = true; + var numElements = 0; + var pageSizes = []; + Async.whilst( + function () { return hasMore; }, + function (nextIteration) { + iterator.next(function (err, results, _hasMore) { + if (err) { + nextIteration(err); + return; + } + + hasMore = _hasMore; + if (hasMore) { + pageSizes.push(results.rows.length); + } + nextIteration(); + }); + }, + function (err) { + assert.deepStrictEqual(pageSizes, [4, 4, 2]); + done(err); + } + ); + } + ], + function (err) { + assert.ok(!err); done(); + } + ); + }); + + // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. + // + // + // it("Callback#Enable + disable preview", function (done) { + // var that = this; + // var sid = getNextId(); + + // var service = this.service.specialize("nobody", "sdkappcollection"); + + // Async.chain([ + // function (done) { + // service.jobs().search('search index=_internal | head 1 | sleep 60', { id: sid }, done); + // }, + // function (job, done) { + // job.enablePreview(done); + + // }, + // function (job, done) { + // job.disablePreview(done); + // }, + // function (job, done) { + // job.cancel(done); + // } + // ], + // function (err) { + // assert.ok(!err); + // done(); + // } + // ); + // }); + + + // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. + // + // + // it("Callback#Pause + unpause + finalize preview", function (done) { + // var that = this; + // var sid = getNextId(); + + // var service = this.service.specialize("nobody", "sdkappcollection"); + + // Async.chain([ + // function (done) { + // service.jobs().search('search index=_internal | head 1 | sleep 5', { id: sid }, done); + // }, + // function (job, done) { + // job.pause(done); + // }, + // function (job, done) { + // tutils.pollUntil( + // job, + // function (j) { + // return j.properties()["isPaused"]; + // }, + // 10, + // done + // ); + // }, + // function (job, done) { + // assert.ok(job.properties()["isPaused"]); + // job.unpause(done); + // }, + // function (job, done) { + // tutils.pollUntil( + // job, + // function (j) { + // return !j.properties()["isPaused"]; + // }, + // 10, + // done + // ); + // }, + // function (job, done) { + // assert.ok(!job.properties()["isPaused"]); + // job.finalize(done); + // }, + // function (job, done) { + // job.cancel(done); + // } + // ], + // function (err) { + // assert.ok(!err); + // done(); + // } + // ); + // }); + + it("Callback#Set TTL", function (done) { + var sid = getNextId(); + var originalTTL = 0; + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); }, - failed: function (job) { - assert.ok(job); + function (job, done) { + job.fetch(done); + }, + function (job, done) { + var ttl = job.properties()["ttl"]; + originalTTL = ttl; - assert.ok(false, "Job failed unexpectedly."); - done(); + job.setTTL(ttl * 2, done); }, - error: function (err) { - assert.ok(err); + function (job, done) { + job.fetch(done); + }, + function (job, done) { + var ttl = job.properties()["ttl"]; + assert.ok(ttl > originalTTL); + assert.ok(ttl <= (originalTTL * 2)); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - assert.ok(false, "Error while tracking job."); + // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. + // + // + // it("Callback#Set priority", function (done) { + // var sid = getNextId(); + // var originalPriority = 0; + // var that = this; + + // var service = this.service.specialize("nobody", "sdkappcollection"); + + // Async.chain([ + // function (done) { + // service.jobs().search('search index=_internal | head 1 | sleep 5', { id: sid }, done); + // }, + // function (job, done) { + // job.track({}, { + // ready: function (job) { + // done(null, job); + // } + // }); + // }, + // function (job, done) { + // var priority = job.properties()["priority"]; + // assert.ok(priority, 5); + // job.setPriority(priority + 1, done); + // }, + // function (job, done) { + // job.fetch(done); + // }, + // function (job, done) { + // job.cancel(done); + // } + // ], + // function (err) { + // assert.ok(!err); + // done(); + // } + // ); + // }); + + it("Callback#Search log", function (done) { + var sid = getNextId(); + var that = this; + + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1', { id: sid, exec_mode: "blocking" }, done); + }, + function (job, done) { + job.searchlog(done); + }, + function (log, job, done) { + assert.ok(job); + assert.ok(log); + assert.ok(log.length > 0); + assert.ok(log.split("\r\n").length > 0); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); done(); } - }); + ); }); - }, - "Callback#Wait until job failed": function (done) { - this.service.search('search index=_internal | head bogusarg', {}, function (err, job) { - if (err) { - assert.ok(!err); - done(); - return; - } + it("Callback#Search summary", function (done) { + var sid = getNextId(); + var that = this; - var numReadyEvents = 0; - var numProgressEvents = 0; - job.track({ period: 200 }, { - ready: function (job) { + Async.chain([ + function (done) { + that.service.jobs().search( + 'search index=_internal | head 1 | eval foo="bar" | fields foo', + { + id: sid, + status_buckets: 300, + rf: ["foo"] + }, + done); + }, + function (job, done) { + // Let's sleep for 2 second so + // we let the server catch up + Async.sleep(2000, function () { + job.summary({}, done); + }); + }, + function (summary, job, done) { assert.ok(job); + assert.ok(summary); + assert.strictEqual(summary.event_count, 1); + assert.strictEqual(summary.fields.foo.count, 1); + assert.strictEqual(summary.fields.foo.distinct_count, 1); + assert.ok(summary.fields.foo.is_exact, 1); + assert.strictEqual(summary.fields.foo.modes.length, 1); + assert.strictEqual(summary.fields.foo.modes[0].count, 1); + assert.strictEqual(summary.fields.foo.modes[0].value, "bar"); + assert.ok(summary.fields.foo.modes[0].is_exact); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("Callback#Search timeline", function (done) { + var sid = getNextId(); + var that = this; - numReadyEvents++; + Async.chain([ + function (done) { + that.service.jobs().search( + 'search index=_internal | head 1 | eval foo="bar" | fields foo', + { + id: sid, + status_buckets: 300, + rf: ["foo"], + exec_mode: "blocking" + }, + done); }, - progress: function (job) { + function (job, done) { + job.timeline({}, done); + }, + function (timeline, job, done) { assert.ok(job); + assert.ok(timeline); + assert.strictEqual(timeline.buckets.length, 1); + assert.strictEqual(timeline.event_count, 1); + assert.strictEqual(timeline.buckets[0].available_count, 1); + assert.strictEqual(timeline.buckets[0].duration, 0.001); + assert.strictEqual(timeline.buckets[0].earliest_time_offset, timeline.buckets[0].latest_time_offset); + assert.strictEqual(timeline.buckets[0].total_count, 1); + assert.ok(timeline.buckets[0].is_finalized); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("Callback#Touch", function (done) { + var sid = getNextId(); + var that = this; + var originalTime = ""; - numProgressEvents++; + Async.chain([ + function (done) { + that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); }, - done: function (job) { + function (job, done) { + job.fetch(done); + }, + function (job, done) { assert.ok(job); + originalTime = job.properties().updated; + Async.sleep(1200, function () { job.touch(done); }); + }, + function (job, done) { + job.fetch(done); + }, + function (job, done) { + assert.ok(originalTime !== job.updated()); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); - assert.ok(false, "Job became done unexpectedly."); + it("Callback#Create failure", function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + + var jobs = this.service.jobs(); + assert.throws(function () { jobs.create({ search: originalSearch, name: name, exec_mode: "oneshot" }, function () { }); }); + done(); + }); + + it("Callback#Create fails with no search string", function (done) { + var jobs = this.service.jobs(); + jobs.create( + "", {}, + function (err) { + assert.ok(err); done(); + } + ); + }); + + it("Callback#Oneshot search", function (done) { + var sid = getNextId(); + var that = this; + var originalTime = ""; + + Async.chain([ + function (done) { + that.service.jobs().oneshotSearch('search index=_internal | head 1 | stats count', { id: sid }, done); }, - failed: function (job) { - assert.ok(job); + function (results, done) { + assert.ok(results); + assert.ok(results.fields); + assert.strictEqual(results.fields.length, 1); + assert.strictEqual(results.fields[0], "count"); + assert.ok(results.rows); + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.rows[0].length, 1); + assert.strictEqual(results.rows[0][0], "1"); - assert.ok(numReadyEvents === 1); // even failed jobs become ready - assert.ok(numProgressEvents >= 1); // a job that becomes ready has progress done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("Callback#Oneshot search with no results", function (done) { + var sid = getNextId(); + var that = this; + var originalTime = ""; + + Async.chain([ + function (done) { + var query = 'search index=history MUST_NOT_EXISTABCDEF'; + that.service.jobs().oneshotSearch(query, { id: sid }, done); }, - error: function (err) { - assert.ok(err); + function (results, done) { + assert.ok(results); + assert.strictEqual(results.fields.length, 0); + assert.strictEqual(results.rows.length, 0); + assert.ok(!results.preview); - assert.ok(false, "Error while tracking job."); done(); } - }); + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + // it("Callback#Service oneshot search", function(done) { + // var sid = getNextId(); + // var that = this; + // var namespace = {owner: "admin", app: "search"}; + // var splunkVersion = 6.1; // Default to pre-6.2 version + // var originalLoggerLevel = "DEBUG"; + + // Async.chain([ + // function(done) { + // // If running on Splunk 6.2+, first set the search logger level to DEBUG + // Async.chain([ + // function(done1) { + // that.service.serverInfo(done1); + // }, + // function(info, done1) { + // splunkVersion = parseFloat(info.properties().version); + // if (splunkVersion < 6.2) { + // done(); // Exit the inner Async.chain + // } + // else { + // done1(); + // } + // }, + // function(done1) { + // that.service.configurations({owner: "admin", app: "search"}).fetch(done1); + // }, + // function(confs, done1) { + // try { + // confs.item("limits").fetch(done1); + // } + // catch(e) { + // done1(e); + // } + // }, + // function(conf, done1) { + // var searchInfo = conf.item("search_info"); + // // Save this so it can be restored later + // originalLoggerLevel = searchInfo.properties()["infocsv_log_level"]; + // searchInfo.update({"infocsv_log_level": "DEBUG"}, done1); + // }, + // function(conf, done1) { + // assert.strictEqual("DEBUG", conf.properties()["infocsv_log_level"]); + // done1(); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }, + // function(done) { + // that.service.oneshotSearch('search index=_internal | head 1 | stats count', {id: sid}, namespace, done); + // }, + // function(results, done) { + // assert.ok(results); + // assert.ok(results.fields); + // assert.strictEqual(results.fields.length, 1); + // assert.strictEqual(results.fields[0], "count"); + // assert.ok(results.rows); + // assert.strictEqual(results.rows.length, 1); + // assert.strictEqual(results.rows[0].length, 1); + // assert.strictEqual(results.rows[0][0], "1"); + // assert.ok(results.messages[1].text.indexOf('owner="admin"')); + // assert.ok(results.messages[1].text.indexOf('app="search"')); + + // done(); + // }, + // function(done) { + // Async.chain([ + // function(done1) { + // if (splunkVersion < 6.2) { + // done(); // Exit the inner Async.chain + // } + // else { + // done1(); + // } + // }, + // function(done1) { + // that.service.configurations({owner: "admin", app: "search"}).fetch(done1); + // }, + // function(confs, done1) { + // try { + // confs.item("limits").fetch(done1); + // } + // catch(e) { + // done1(e); + // } + // }, + // function(conf, done1) { + // var searchInfo = conf.item("search_info"); + // // Restore the logger level from before + // searchInfo.update({"infocsv_log_level": originalLoggerLevel}, done1); + // }, + // function(conf, done1) { + // assert.strictEqual(originalLoggerLevel, conf.properties()["infocsv_log_level"]); + // done1(); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }); + + it("Callback#Service search", function (done) { + var sid = getNextId(); + var service = this.service; + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { + that.service.search('search index=_internal | head 1 | stats count', { id: sid }, namespace, done); + }, + function (job, done) { + assert.strictEqual(job.sid, sid); + assert.strictEqual(job.namespace, namespace); + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + done + ); + }, + function (job, done) { + job.results({}, done); + }, + function (results, job, done) { + assert.strictEqual(results.rows.length, 1); + assert.strictEqual(results.fields.length, 1); + assert.strictEqual(results.fields[0], "count"); + assert.strictEqual(results.rows[0][0], "1"); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); }); - }, - "Callback#track() with default params and one function": function (done) { - this.service.search('search index=_internal | head 1', {}, function (err, job) { - if (err) { + it("Callback#Wait until job done", function (done) { + this.service.search('search index=_internal | head 1000', {}, function (err, job) { assert.ok(!err); - done(); - return; - } - job.track({}, function (job) { - assert.ok(job); - done(); + var numReadyEvents = 0; + var numProgressEvents = 0; + job.track({ period: 200 }, { + ready: function (job) { + assert.ok(job); + + numReadyEvents++; + }, + progress: function (job) { + assert.ok(job); + + numProgressEvents++; + }, + done: function (job) { + assert.ok(job); + + assert.ok(numReadyEvents === 1); // all done jobs must have become ready + assert.ok(numProgressEvents >= 1); // a job that becomes ready has progress + done(); + }, + failed: function (job) { + assert.ok(job); + + assert.ok(false, "Job failed unexpectedly."); + done(); + }, + error: function (err) { + assert.ok(err); + + assert.ok(false, "Error while tracking job."); + done(); + } + }); }); }); - }, - "Callback#track() should stop polling if only the ready callback is specified": function (done) { - this.service.search('search index=_internal | head 1', {}, function (err, job) { - if (err) { - assert.ok(!err); - done(); - return; - } + it("Callback#Wait until job failed", function (done) { + this.service.search('search index=_internal | head bogusarg', {}, function (err, job) { + if (err) { + assert.ok(!err); + done(); + return; + } - job.track({}, { - ready: function (job) { - assert.ok(job); - }, + var numReadyEvents = 0; + var numProgressEvents = 0; + job.track({ period: 200 }, { + ready: function (job) { + assert.ok(job); + + numReadyEvents++; + }, + progress: function (job) { + assert.ok(job); + + numProgressEvents++; + }, + done: function (job) { + assert.ok(job); - _stoppedAfterReady: function (job) { + assert.ok(false, "Job became done unexpectedly."); + done(); + }, + failed: function (job) { + assert.ok(job); + + assert.ok(numReadyEvents === 1); // even failed jobs become ready + assert.ok(numProgressEvents >= 1); // a job that becomes ready has progress + done(); + }, + error: function (err) { + assert.ok(err); + + assert.ok(false, "Error while tracking job."); + done(); + } + }); + }); + }); + + it("Callback#track() with default params and one function", function (done) { + this.service.search('search index=_internal | head 1', {}, function (err, job) { + if (err) { + assert.ok(!err); done(); + return; } + + job.track({}, function (job) { + assert.ok(job); + done(); + }); }); }); - }, - - "Callback#track() a job that is not immediately ready": function (done) { - /*jshint loopfunc:true */ - var numJobs = 20; - var numJobsLeft = numJobs; - var gotJobNotImmediatelyReady = false; - for (var i = 0; i < numJobs; i++) { - this.service.search('search index=_internal | head 10000', {}, function (err, job) { + + it("Callback#track() should stop polling if only the ready callback is specified", function (done) { + this.service.search('search index=_internal | head 1', {}, function (err, job) { if (err) { assert.ok(!err); done(); @@ -937,54 +913,80 @@ exports.setup = function (svc) { } job.track({}, { - _preready: function (job) { - gotJobNotImmediatelyReady = true; - }, - ready: function (job) { - numJobsLeft--; + assert.ok(job); + }, - if (numJobsLeft === 0) { - if (!gotJobNotImmediatelyReady) { - splunkjs.Logger.error("", "WARNING: Couldn't test code path in track() where job wasn't ready immediately."); - } - done(); - } + _stoppedAfterReady: function (job) { + done(); } }); }); - } - }, + }); - "Callback#Service.getJob() works": function (done) { - var that = this; - var sidsMatch = false; - this.service.search('search index=_internal | head 1', {}, function (err, job) { - if (err) { - assert.ok(!err); - done(); - return; + it("Callback#track() a job that is not immediately ready", function (done) { + /*jshint loopfunc:true */ + var numJobs = 20; + var numJobsLeft = numJobs; + var gotJobNotImmediatelyReady = false; + for (var i = 0; i < numJobs; i++) { + this.service.search('search index=_internal | head 10000', {}, function (err, job) { + if (err) { + assert.ok(!err); + done(); + return; + } + + job.track({}, { + _preready: function (job) { + gotJobNotImmediatelyReady = true; + }, + + ready: function (job) { + numJobsLeft--; + + if (numJobsLeft === 0) { + if (!gotJobNotImmediatelyReady) { + splunkjs.Logger.error("", "WARNING: Couldn't test code path in track() where job wasn't ready immediately."); + } + done(); + } + } + }); + }); } - var sid = job.sid; - return Async.chain([ - function (done) { - that.service.getJob(sid, done); - }, - function (innerJob, done) { - assert.strictEqual(sid, innerJob.sid); - sidsMatch = sid === innerJob.sid; - done(); - } - ], - function (err) { + }); + + it("Callback#Service.getJob() works", function (done) { + var that = this; + var sidsMatch = false; + this.service.search('search index=_internal | head 1', {}, function (err, job) { + if (err) { assert.ok(!err); - assert.ok(sidsMatch); done(); + return; } - ); + var sid = job.sid; + return Async.chain([ + function (done) { + that.service.getJob(sid, done); + }, + function (innerJob, done) { + assert.strictEqual(sid, innerJob.sid); + sidsMatch = sid === innerJob.sid; + done(); + } + ], + function (err) { + assert.ok(!err); + assert.ok(sidsMatch); + done(); + } + ); + }); }); - } - }; + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/namespace.js b/tests/service_tests/namespace.js index 54a5846f2..8f456f5c9 100644 --- a/tests/service_tests/namespace.js +++ b/tests/service_tests/namespace.js @@ -12,245 +12,247 @@ var getNextId = function () { }; exports.setup = function (svc) { - return { - beforeEach: function (finished) { - this.service = svc; - var that = this; - - var appName1 = "jssdk_testapp_" + getNextId(); - var appName2 = "jssdk_testapp_" + getNextId(); - - var userName1 = "jssdk_testuser_" + getNextId(); - var userName2 = "jssdk_testuser_" + getNextId(); - - var apps = this.service.apps(); - var users = this.service.users(); - - this.namespace11 = { owner: userName1, app: appName1 }; - this.namespace12 = { owner: userName1, app: appName2 }; - this.namespace21 = { owner: userName2, app: appName1 }; - this.namespace22 = { owner: userName2, app: appName2 }; - - Async.chain([ - function (done) { - apps.create({ name: appName1 }, done); - }, - function (app1, done) { - that.app1 = app1; - that.appName1 = appName1; - apps.create({ name: appName2 }, done); - }, - function (app2, done) { - that.app2 = app2; - that.appName2 = appName2; - users.create({ name: userName1, password: "abcdefg!", roles: ["user"] }, done); - }, - function (user1, done) { - that.user1 = user1; - that.userName1 = userName1; - users.create({ name: userName2, password: "abcdefg!", roles: ["user"] }, done); - }, - function (user2, done) { - that.user2 = user2; - that.userName2 = userName2; - - done(); - } - ], - function (err) { - finished(err); - } - ); - }, - - "Callback#Namespace protection": function (done) { - var searchName = "jssdk_search_" + getNextId(); - var search = "search *"; - var service = this.service; - var savedSearches11 = service.savedSearches(this.namespace11); - var savedSearches21 = service.savedSearches(this.namespace21); - - Async.chain([ - function (done) { - // Create the saved search only in the 11 namespace - savedSearches11.create({ name: searchName, search: search }, done); - }, - function (savedSearch, done) { - // Refresh the 11 saved searches - savedSearches11.fetch(done); - }, - function (savedSearches, done) { - // Refresh the 21 saved searches - savedSearches21.fetch(done); - }, - function (savedSearches, done) { - var entity11 = savedSearches11.item(searchName); - var entity21 = savedSearches21.item(searchName); - - // Make sure the saved search exists in the 11 namespace - assert.ok(entity11); - assert.strictEqual(entity11.name, searchName); - assert.strictEqual(entity11.properties().search, search); - - // Make sure the saved search doesn't exist in the 11 namespace - assert.ok(!entity21); - done(); - } - ], - function (err) { - assert.ok(!err, JSON.stringify(err)); - done(); - } - ); - }, - - "Callback#Namespace item": function (done) { - var searchName = "jssdk_search_" + getNextId(); - var search = "search *"; - var service = this.service; - - var namespace_1 = { owner: "-", app: this.appName1 }; - var namespace_nobody1 = { owner: "nobody", app: this.appName1 }; - - var savedSearches11 = service.savedSearches(this.namespace11); - var savedSearches21 = service.savedSearches(this.namespace21); - var savedSearches_1 = service.savedSearches(namespace_1); - var savedSearches_nobody1 = service.savedSearches(namespace_nobody1); - - var that = this; - Async.chain([ - function (done) { - // Create a saved search in the 11 namespace - savedSearches11.create({ name: searchName, search: search }, done); - }, - function (savedSearch, done) { - // Create a saved search in the 21 namespace - savedSearches21.create({ name: searchName, search: search }, done); - }, - function (savedSearch, done) { - // Refresh the -/1 namespace - savedSearches_1.fetch(done); - }, - function (savedSearches, done) { - // Refresh the 1/1 namespace - savedSearches11.fetch(done); - }, - function (savedSearches, done) { - // Refresh the 2/1 namespace - savedSearches21.fetch(done); - }, - function (savedSearches, done) { - var entity11 = savedSearches11.item(searchName, that.namespace11); - var entity21 = savedSearches21.item(searchName, that.namespace21); - - // Ensure that the saved search exists in the 11 namespace - assert.ok(entity11); - assert.strictEqual(entity11.name, searchName); - assert.strictEqual(entity11.properties().search, search); - assert.strictEqual(entity11.namespace.owner, that.namespace11.owner); - assert.strictEqual(entity11.namespace.app, that.namespace11.app); - - // Ensure that the saved search exists in the 21 namespace - assert.ok(entity21); - assert.strictEqual(entity21.name, searchName); - assert.strictEqual(entity21.properties().search, search); - assert.strictEqual(entity21.namespace.owner, that.namespace21.owner); - assert.strictEqual(entity21.namespace.app, that.namespace21.app); - - done(); - }, - function (done) { - // Create a saved search in the nobody/1 namespace - savedSearches_nobody1.create({ name: searchName, search: search }, done); - }, - function (savedSearch, done) { - // Refresh the 1/1 namespace - savedSearches11.fetch(done); - }, - function (savedSearches, done) { - // Refresh the 2/1 namespace - savedSearches21.fetch(done); - }, - function (savedSearches, done) { - // Ensure that we can't get the item from the generic - // namespace without specifying a namespace - try { - savedSearches_1.item(searchName); - assert.ok(false); - } catch (err) { - assert.ok(err); - } + return ( + describe("Namespace tests", () => { + beforeEach(function (finished) { + this.service = svc; + var that = this; + + var appName1 = "jssdk_testapp_" + getNextId(); + var appName2 = "jssdk_testapp_" + getNextId(); + + var userName1 = "jssdk_testuser_" + getNextId(); + var userName2 = "jssdk_testuser_" + getNextId(); + + var apps = this.service.apps(); + var users = this.service.users(); + + this.namespace11 = { owner: userName1, app: appName1 }; + this.namespace12 = { owner: userName1, app: appName2 }; + this.namespace21 = { owner: userName2, app: appName1 }; + this.namespace22 = { owner: userName2, app: appName2 }; + + Async.chain([ + function (done) { + apps.create({ name: appName1 }, done); + }, + function (app1, done) { + that.app1 = app1; + that.appName1 = appName1; + apps.create({ name: appName2 }, done); + }, + function (app2, done) { + that.app2 = app2; + that.appName2 = appName2; + users.create({ name: userName1, password: "abcdefg!", roles: ["user"] }, done); + }, + function (user1, done) { + that.user1 = user1; + that.userName1 = userName1; + users.create({ name: userName2, password: "abcdefg!", roles: ["user"] }, done); + }, + function (user2, done) { + that.user2 = user2; + that.userName2 = userName2; - // Ensure that we can't get the item using wildcard namespaces. - try { - savedSearches_1.item(searchName, { owner: '-' }); - assert.ok(false); - } catch (err) { - assert.ok(err); + done(); } - - try { - savedSearches_1.item(searchName, { app: '-' }); - assert.ok(false); - } catch (err) { - assert.ok(err); + ], + function (err) { + finished(err); } + ); + }); - try { - savedSearches_1.item(searchName, { app: '-', owner: '-' }); - assert.ok(false); - } catch (err) { - assert.ok(err); + it("Callback#Namespace protection", function (done) { + var searchName = "jssdk_search_" + getNextId(); + var search = "search *"; + var service = this.service; + var savedSearches11 = service.savedSearches(this.namespace11); + var savedSearches21 = service.savedSearches(this.namespace21); + + Async.chain([ + function (done) { + // Create the saved search only in the 11 namespace + savedSearches11.create({ name: searchName, search: search }, done); + }, + function (savedSearch, done) { + // Refresh the 11 saved searches + savedSearches11.fetch(done); + }, + function (savedSearches, done) { + // Refresh the 21 saved searches + savedSearches21.fetch(done); + }, + function (savedSearches, done) { + var entity11 = savedSearches11.item(searchName); + var entity21 = savedSearches21.item(searchName); + + // Make sure the saved search exists in the 11 namespace + assert.ok(entity11); + assert.strictEqual(entity11.name, searchName); + assert.strictEqual(entity11.properties().search, search); + + // Make sure the saved search doesn't exist in the 11 namespace + assert.ok(!entity21); + done(); } + ], + function (err) { + assert.ok(!err, JSON.stringify(err)); + done(); + } + ); + }); + + it("Callback#Namespace item", function (done) { + var searchName = "jssdk_search_" + getNextId(); + var search = "search *"; + var service = this.service; + + var namespace_1 = { owner: "-", app: this.appName1 }; + var namespace_nobody1 = { owner: "nobody", app: this.appName1 }; + + var savedSearches11 = service.savedSearches(this.namespace11); + var savedSearches21 = service.savedSearches(this.namespace21); + var savedSearches_1 = service.savedSearches(namespace_1); + var savedSearches_nobody1 = service.savedSearches(namespace_nobody1); + + var that = this; + Async.chain([ + function (done) { + // Create a saved search in the 11 namespace + savedSearches11.create({ name: searchName, search: search }, done); + }, + function (savedSearch, done) { + // Create a saved search in the 21 namespace + savedSearches21.create({ name: searchName, search: search }, done); + }, + function (savedSearch, done) { + // Refresh the -/1 namespace + savedSearches_1.fetch(done); + }, + function (savedSearches, done) { + // Refresh the 1/1 namespace + savedSearches11.fetch(done); + }, + function (savedSearches, done) { + // Refresh the 2/1 namespace + savedSearches21.fetch(done); + }, + function (savedSearches, done) { + var entity11 = savedSearches11.item(searchName, that.namespace11); + var entity21 = savedSearches21.item(searchName, that.namespace21); + + // Ensure that the saved search exists in the 11 namespace + assert.ok(entity11); + assert.strictEqual(entity11.name, searchName); + assert.strictEqual(entity11.properties().search, search); + assert.strictEqual(entity11.namespace.owner, that.namespace11.owner); + assert.strictEqual(entity11.namespace.app, that.namespace11.app); + + // Ensure that the saved search exists in the 21 namespace + assert.ok(entity21); + assert.strictEqual(entity21.name, searchName); + assert.strictEqual(entity21.properties().search, search); + assert.strictEqual(entity21.namespace.owner, that.namespace21.owner); + assert.strictEqual(entity21.namespace.app, that.namespace21.app); + + done(); + }, + function (done) { + // Create a saved search in the nobody/1 namespace + savedSearches_nobody1.create({ name: searchName, search: search }, done); + }, + function (savedSearch, done) { + // Refresh the 1/1 namespace + savedSearches11.fetch(done); + }, + function (savedSearches, done) { + // Refresh the 2/1 namespace + savedSearches21.fetch(done); + }, + function (savedSearches, done) { + // Ensure that we can't get the item from the generic + // namespace without specifying a namespace + try { + savedSearches_1.item(searchName); + assert.ok(false); + } catch (err) { + assert.ok(err); + } + + // Ensure that we can't get the item using wildcard namespaces. + try { + savedSearches_1.item(searchName, { owner: '-' }); + assert.ok(false); + } catch (err) { + assert.ok(err); + } - // Ensure we get the right entities from the -/1 namespace when we - // specify it. - var entity11 = savedSearches_1.item(searchName, that.namespace11); - var entity21 = savedSearches_1.item(searchName, that.namespace21); - - assert.ok(entity11); - assert.strictEqual(entity11.name, searchName); - assert.strictEqual(entity11.properties().search, search); - assert.strictEqual(entity11.namespace.owner, that.namespace11.owner); - assert.strictEqual(entity11.namespace.app, that.namespace11.app); - - assert.ok(entity21); - assert.strictEqual(entity21.name, searchName); - assert.strictEqual(entity21.properties().search, search); - assert.strictEqual(entity21.namespace.owner, that.namespace21.owner); - assert.strictEqual(entity21.namespace.app, that.namespace21.app); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#delete test users": function (done) { - var users = this.service.users(); - users.fetch(function (err, users) { - var userList = users.list(); - - Async.parallelEach( - userList, - function (user, idx, callback) { - if (utils.startsWith(user.name, "jssdk_")) { - user.remove(callback); - } else { - callback(); + try { + savedSearches_1.item(searchName, { app: '-' }); + assert.ok(false); + } catch (err) { + assert.ok(err); } - }, function (err) { + + try { + savedSearches_1.item(searchName, { app: '-', owner: '-' }); + assert.ok(false); + } catch (err) { + assert.ok(err); + } + + // Ensure we get the right entities from the -/1 namespace when we + // specify it. + var entity11 = savedSearches_1.item(searchName, that.namespace11); + var entity21 = savedSearches_1.item(searchName, that.namespace21); + + assert.ok(entity11); + assert.strictEqual(entity11.name, searchName); + assert.strictEqual(entity11.properties().search, search); + assert.strictEqual(entity11.namespace.owner, that.namespace11.owner); + assert.strictEqual(entity11.namespace.app, that.namespace11.app); + + assert.ok(entity21); + assert.strictEqual(entity21.name, searchName); + assert.strictEqual(entity21.properties().search, search); + assert.strictEqual(entity21.namespace.owner, that.namespace21.owner); + assert.strictEqual(entity21.namespace.app, that.namespace21.app); + + done(); + } + ], + function (err) { assert.ok(!err); done(); } ); }); - } - }; + + it("Callback#delete test users", function (done) { + var users = this.service.users(); + users.fetch(function (err, users) { + var userList = users.list(); + + Async.parallelEach( + userList, + function (user, idx, callback) { + if (utils.startsWith(user.name, "jssdk_")) { + user.remove(callback); + } else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); + } + ); + }); + }) + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/parser.js b/tests/service_tests/parser.js index d5dab6f86..fbcaa0145 100644 --- a/tests/service_tests/parser.js +++ b/tests/service_tests/parser.js @@ -1,33 +1,34 @@ -var assert = require('chai').assert; - exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Callback#Basic parse": function (done) { - var service = this.service; - - service.parse("search index=_internal | head 1", function (err, parse) { - assert.ok(!err); - assert.ok(parse); - assert.ok(parse.commands.length > 0); + var assert = require('chai').assert; + return ( + describe("Parsing Tests", function () { + beforeEach(function (done) { + this.service = svc; done(); }); - }, - "Callback#Parse error": function (done) { - var service = this.service; + it("Callback#Basic parse", function (done) { + var service = this.service; - service.parse("ABCXYZ", function (err, parse) { - assert.ok(err); - assert.strictEqual(err.status, 400); - done(); + service.parse("search index=_internal | head 1", function (err, parse) { + assert.ok(!err); + assert.ok(parse); + assert.ok(parse.commands.length > 0); + done(); + }); + }); + + it("Callback#Parse error", function (done) { + var service = this.service; + + service.parse("ABCXYZ", function (err, parse) { + assert.ok(err); + assert.strictEqual(err.status, 400); + done(); + }); }); - } - }; + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/pivot.js b/tests/service_tests/pivot.js index b9e5f822f..3a49a922e 100644 --- a/tests/service_tests/pivot.js +++ b/tests/service_tests/pivot.js @@ -1,1560 +1,1571 @@ -var assert = require('chai').assert; -var splunkjs = require('../../index'); -var tutils = require('../utils'); +exports.setup = function (svc) { + var assert = require('chai').assert; -var Async = splunkjs.Async; -var utils = splunkjs.Utils; -var idCounter = 0; + var splunkjs = require('../../index'); + var tutils = require('../utils'); -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; + var Async = splunkjs.Async; + var utils = splunkjs.Utils; + var idCounter = 0; -exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - this.dataModels = svc.dataModels({ owner: "nobody", app: "search" }); - this.skip = false; - var that = this; - this.service.serverInfo(function (err, info) { - if (parseInt(info.properties().version.split(".")[0], 10) < 6) { - that.skip = true; - splunkjs.Logger.log("Skipping pivot tests..."); - } - done(err); - }); - }, - - "Callback#Pivot - test constructor args": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.ok(dataModel.objectByName("test_data")); + var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); + }; + return ( + describe("Pivot Tests", function () { + beforeEach(function (done) { + this.service = svc; + this.dataModels = svc.dataModels({ owner: "nobody", app: "search" }); + this.skip = false; + var that = this; + this.service.serverInfo(function (err, info) { + if (parseInt(info.properties().version.split(".")[0], 10) < 6) { + that.skip = true; + splunkjs.Logger.log("Skipping pivot tests..."); + } + done(err); + }); + }) + + it("Callback#Pivot - test constructor args", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - - "Callback#Pivot - test acceleration, then pivot": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - dataModel.objectByName("test_data"); - assert.ok(dataModel); - - dataModel.acceleration.enabled = true; - dataModel.acceleration.earliestTime = "-2mon"; - dataModel.acceleration.cronSchedule = "0 */12 * * *"; - dataModel.update(done); - }, - function (dataModel, done) { - var props = dataModel.properties(); - - assert.strictEqual(true, dataModel.isAccelerated()); - assert.strictEqual(true, !!dataModel.acceleration.enabled); - assert.strictEqual("-2mon", dataModel.acceleration.earliest_time); - assert.strictEqual("0 */12 * * *", dataModel.acceleration.cron_schedule); - - var dataModelObject = dataModel.objectByName("test_data"); - var pivotSpecification = dataModelObject.createPivotSpecification(); - - assert.strictEqual(dataModelObject.dataModel.name, pivotSpecification.accelerationNamespace); - - var name1 = "delete-me-" + getNextId(); - pivotSpecification.setAccelerationJob(name1); - assert.strictEqual("sid=" + name1, pivotSpecification.accelerationNamespace); - - var namespaceTemp = "delete-me-" + getNextId(); - pivotSpecification.accelerationNamespace = namespaceTemp; - assert.strictEqual(namespaceTemp, pivotSpecification.accelerationNamespace); - - pivotSpecification - .addCellValue("test_data", "Source Value", "count") - .run(done); - }, - function (job, pivot, done) { - assert.ok(job); - assert.ok(pivot); - assert.notStrictEqual("FAILED", job.properties().dispatchState); - - job.track({}, function (job) { - assert.ok(pivot.tstatsSearch); - assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); - assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); - assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + assert.ok(dataModel.objectByName("test_data")); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) - assert.strictEqual(pivot.tstatsSearch, job.properties().request.search); - done(null, job); - }); - }, - function (job, done) { - assert.ok(job); + it("Callback#Pivot - test acceleration, then pivot", function (done) { + if (this.skip) { done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + dataModel.objectByName("test_data"); + assert.ok(dataModel); + + dataModel.acceleration.enabled = true; + dataModel.acceleration.earliestTime = "-2mon"; + dataModel.acceleration.cronSchedule = "0 */12 * * *"; + dataModel.update(done); + }, + function (dataModel, done) { + var props = dataModel.properties(); - "Callback#Pivot - test illegal filtering (all types)": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - - // Boolean comparisons - try { - pivotSpecification.addFilter(getNextId(), "boolean", "=", true); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); - } - try { - pivotSpecification.addFilter("_time", "boolean", "=", true); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add boolean filter on _time because it is of type timestamp"); - } + assert.strictEqual(true, dataModel.isAccelerated()); + assert.strictEqual(true, !!dataModel.acceleration.enabled); + assert.strictEqual("-2mon", dataModel.acceleration.earliest_time); + assert.strictEqual("0 */12 * * *", dataModel.acceleration.cron_schedule); - // String comparisons - try { - pivotSpecification.addFilter("has_boris", "string", "contains", "abc"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add string filter on has_boris because it is of type boolean"); - } - try { - pivotSpecification.addFilter(getNextId(), "string", "contains", "abc"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); - } + var dataModelObject = dataModel.objectByName("test_data"); + var pivotSpecification = dataModelObject.createPivotSpecification(); - // IPv4 comparisons - try { - pivotSpecification.addFilter("has_boris", "ipv4", "startsWith", "192.168"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add ipv4 filter on has_boris because it is of type boolean"); - } - try { - pivotSpecification.addFilter(getNextId(), "ipv4", "startsWith", "192.168"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); - } + assert.strictEqual(dataModelObject.dataModel.name, pivotSpecification.accelerationNamespace); - // Number comparisons - try { - pivotSpecification.addFilter("has_boris", "number", "atLeast", 2.3); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add number filter on has_boris because it is of type boolean"); - } - try { - pivotSpecification.addFilter(getNextId(), "number", "atLeast", 2.3); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); - } + var name1 = "delete-me-" + getNextId(); + pivotSpecification.setAccelerationJob(name1); + assert.strictEqual("sid=" + name1, pivotSpecification.accelerationNamespace); - // Limit filter - try { - pivotSpecification.addLimitFilter("has_boris", "host", "DEFAULT", 50, "count"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add limit filter on has_boris because it is of type boolean"); - } - try { - pivotSpecification.addLimitFilter(getNextId(), "host", "DEFAULT", 50, "count"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add limit filter on a nonexistent field."); - } - try { - pivotSpecification.addLimitFilter("source", "host", "DEFAULT", 50, "sum"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, - "Stats function for fields of type string must be COUNT or DISTINCT_COUNT; found sum"); - } - try { - pivotSpecification.addLimitFilter("epsilon", "host", "DEFAULT", 50, "duration"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, - "Stats function for fields of type number must be one of COUNT, DISTINCT_COUNT, SUM, or AVERAGE; found duration"); - } - try { - pivotSpecification.addLimitFilter("test_data", "host", "DEFAULT", 50, "list"); - assert.ok(false); + var namespaceTemp = "delete-me-" + getNextId(); + pivotSpecification.accelerationNamespace = namespaceTemp; + assert.strictEqual(namespaceTemp, pivotSpecification.accelerationNamespace); + + pivotSpecification + .addCellValue("test_data", "Source Value", "count") + .run(done); + }, + function (job, pivot, done) { + assert.ok(job); + assert.ok(pivot); + assert.notStrictEqual("FAILED", job.properties().dispatchState); + + job.track({}, function (job) { + assert.ok(pivot.tstatsSearch); + assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); + assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); + assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); + + assert.strictEqual(pivot.tstatsSearch, job.properties().request.search); + done(null, job); + }); + }, + function (job, done) { + assert.ok(job); + done(); } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, - "Stats function for fields of type object count must be COUNT; found list"); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) + + it("Callback#Pivot - test illegal filtering (all types)", function (done) { + if (this.skip) { done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); - "Callback#Pivot - test boolean filtering": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addFilter("has_boris", "boolean", "=", true); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("rule")); - assert.ok(filter.hasOwnProperty("owner")); - - assert.strictEqual("has_boris", filter.fieldName); - assert.strictEqual("boolean", filter.type); - assert.strictEqual("=", filter.rule.comparator); - assert.strictEqual(true, filter.rule.compareTo); - assert.strictEqual("test_data", filter.owner); + var pivotSpecification = obj.createPivotSpecification(); + + // Boolean comparisons + try { + pivotSpecification.addFilter(getNextId(), "boolean", "=", true); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); + } + try { + pivotSpecification.addFilter("_time", "boolean", "=", true); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add boolean filter on _time because it is of type timestamp"); + } + + // String comparisons + try { + pivotSpecification.addFilter("has_boris", "string", "contains", "abc"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add string filter on has_boris because it is of type boolean"); + } + try { + pivotSpecification.addFilter(getNextId(), "string", "contains", "abc"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); + } + + // IPv4 comparisons + try { + pivotSpecification.addFilter("has_boris", "ipv4", "startsWith", "192.168"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add ipv4 filter on has_boris because it is of type boolean"); + } + try { + pivotSpecification.addFilter(getNextId(), "ipv4", "startsWith", "192.168"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); + } + + // Number comparisons + try { + pivotSpecification.addFilter("has_boris", "number", "atLeast", 2.3); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add number filter on has_boris because it is of type boolean"); + } + try { + pivotSpecification.addFilter(getNextId(), "number", "atLeast", 2.3); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); + } + + // Limit filter + try { + pivotSpecification.addLimitFilter("has_boris", "host", "DEFAULT", 50, "count"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add limit filter on has_boris because it is of type boolean"); + } + try { + pivotSpecification.addLimitFilter(getNextId(), "host", "DEFAULT", 50, "count"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot add limit filter on a nonexistent field."); + } + try { + pivotSpecification.addLimitFilter("source", "host", "DEFAULT", 50, "sum"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, + "Stats function for fields of type string must be COUNT or DISTINCT_COUNT; found sum"); + } + try { + pivotSpecification.addLimitFilter("epsilon", "host", "DEFAULT", 50, "duration"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, + "Stats function for fields of type number must be one of COUNT, DISTINCT_COUNT, SUM, or AVERAGE; found duration"); + } + try { + pivotSpecification.addLimitFilter("test_data", "host", "DEFAULT", 50, "list"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, + "Stats function for fields of type object count must be COUNT; found list"); + } + done(); } - catch (e) { - assert.ok(false); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) + it("Callback#Pivot - test boolean filtering", function (done) { + if (this.skip) { done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addFilter("has_boris", "boolean", "=", true); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("rule")); + assert.ok(filter.hasOwnProperty("owner")); + + assert.strictEqual("has_boris", filter.fieldName); + assert.strictEqual("boolean", filter.type); + assert.strictEqual("=", filter.rule.comparator); + assert.strictEqual(true, filter.rule.compareTo); + assert.strictEqual("test_data", filter.owner); + } + catch (e) { + assert.ok(false); + } - "Callback#Pivot - test string filtering": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addFilter("host", "string", "contains", "abc"); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("rule")); - assert.ok(filter.hasOwnProperty("owner")); - - assert.strictEqual("host", filter.fieldName); - assert.strictEqual("string", filter.type); - assert.strictEqual("contains", filter.rule.comparator); - assert.strictEqual("abc", filter.rule.compareTo); - assert.strictEqual("BaseEvent", filter.owner); + done(); } - catch (e) { - assert.ok(false); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) + it("Callback#Pivot - test string filtering", function (done) { + if (this.skip) { done(); + return; } - ], - function (err) { + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addFilter("host", "string", "contains", "abc"); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("rule")); + assert.ok(filter.hasOwnProperty("owner")); + + assert.strictEqual("host", filter.fieldName); + assert.strictEqual("string", filter.type); + assert.strictEqual("contains", filter.rule.comparator); + assert.strictEqual("abc", filter.rule.compareTo); + assert.strictEqual("BaseEvent", filter.owner); + } + catch (e) { + assert.ok(false); + } - "Callback#Pivot - test IPv4 filtering": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addFilter("hostip", "ipv4", "startsWith", "192.168"); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("rule")); - assert.ok(filter.hasOwnProperty("owner")); - - assert.strictEqual("hostip", filter.fieldName); - assert.strictEqual("ipv4", filter.type); - assert.strictEqual("startsWith", filter.rule.comparator); - assert.strictEqual("192.168", filter.rule.compareTo); - assert.strictEqual("test_data", filter.owner); + done(); } - catch (e) { - assert.ok(false); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) + it("Callback#Pivot - test IPv4 filtering", function (done) { + if (this.skip) { done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addFilter("hostip", "ipv4", "startsWith", "192.168"); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("rule")); + assert.ok(filter.hasOwnProperty("owner")); + + assert.strictEqual("hostip", filter.fieldName); + assert.strictEqual("ipv4", filter.type); + assert.strictEqual("startsWith", filter.rule.comparator); + assert.strictEqual("192.168", filter.rule.compareTo); + assert.strictEqual("test_data", filter.owner); + } + catch (e) { + assert.ok(false); + } - "Callback#Pivot - test number filtering": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addFilter("epsilon", "number", ">=", 2.3); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("rule")); - assert.ok(filter.hasOwnProperty("owner")); - - assert.strictEqual("epsilon", filter.fieldName); - assert.strictEqual("number", filter.type); - assert.strictEqual(">=", filter.rule.comparator); - assert.strictEqual(2.3, filter.rule.compareTo); - assert.strictEqual("test_data", filter.owner); + done(); } - catch (e) { - assert.ok(false); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) + it("Callback#Pivot - test number filtering", function (done) { + if (this.skip) { done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - "Callback#Pivot - test limit filtering": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addLimitFilter("epsilon", "host", "ASCENDING", 500, "average"); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("owner")); - assert.ok(filter.hasOwnProperty("attributeName")); - assert.ok(filter.hasOwnProperty("attributeOwner")); - assert.ok(filter.hasOwnProperty("limitType")); - assert.ok(filter.hasOwnProperty("limitAmount")); - assert.ok(filter.hasOwnProperty("statsFn")); - - assert.strictEqual("epsilon", filter.fieldName); - assert.strictEqual("number", filter.type); - assert.strictEqual("test_data", filter.owner); - assert.strictEqual("host", filter.attributeName); - assert.strictEqual("BaseEvent", filter.attributeOwner); - assert.strictEqual("lowest", filter.limitType); - assert.strictEqual(500, filter.limitAmount); - assert.strictEqual("average", filter.statsFn); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addFilter("epsilon", "number", ">=", 2.3); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("rule")); + assert.ok(filter.hasOwnProperty("owner")); + + assert.strictEqual("epsilon", filter.fieldName); + assert.strictEqual("number", filter.type); + assert.strictEqual(">=", filter.rule.comparator); + assert.strictEqual(2.3, filter.rule.compareTo); + assert.strictEqual("test_data", filter.owner); + } + catch (e) { + assert.ok(false); + } + + done(); } - catch (e) { - assert.ok(false); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) + it("Callback#Pivot - test limit filtering", function (done) { + if (this.skip) { done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - "Callback#Pivot - test row split": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - - // Test error handling for row split - try { - pivotSpecification.addRowSplit("has_boris", "Wrong type here"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number or string."); - } - var field = getNextId(); - try { + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); + + var pivotSpecification = obj.createPivotSpecification(); + try { + pivotSpecification.addLimitFilter("epsilon", "host", "ASCENDING", 500, "average"); + assert.strictEqual(1, pivotSpecification.filters.length); + + //Test the individual parts of the filter + var filter = pivotSpecification.filters[0]; + + assert.ok(filter.hasOwnProperty("fieldName")); + assert.ok(filter.hasOwnProperty("type")); + assert.ok(filter.hasOwnProperty("owner")); + assert.ok(filter.hasOwnProperty("attributeName")); + assert.ok(filter.hasOwnProperty("attributeOwner")); + assert.ok(filter.hasOwnProperty("limitType")); + assert.ok(filter.hasOwnProperty("limitAmount")); + assert.ok(filter.hasOwnProperty("statsFn")); + + assert.strictEqual("epsilon", filter.fieldName); + assert.strictEqual("number", filter.type); + assert.strictEqual("test_data", filter.owner); + assert.strictEqual("host", filter.attributeName); + assert.strictEqual("BaseEvent", filter.attributeOwner); + assert.strictEqual("lowest", filter.limitType); + assert.strictEqual(500, filter.limitAmount); + assert.strictEqual("average", filter.statsFn); + } + catch (e) { + assert.ok(false); + } - pivotSpecification.addRowSplit(field, "Break Me!"); - assert.ok(false); + done(); } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) - // Test row split, number - pivotSpecification.addRowSplit("epsilon", "My Label"); - assert.strictEqual(1, pivotSpecification.rows.length); - - var row = pivotSpecification.rows[0]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(row.hasOwnProperty("display")); - - assert.strictEqual("epsilon", row.fieldName); - assert.strictEqual("test_data", row.owner); - assert.strictEqual("number", row.type); - assert.strictEqual("My Label", row.label); - assert.strictEqual("all", row.display); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - label: "My Label", - display: "all" - }, - row); - - // Test row split, string - pivotSpecification.addRowSplit("host", "My Label"); - assert.strictEqual(2, pivotSpecification.rows.length); - - row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(!row.hasOwnProperty("display")); - - assert.strictEqual("host", row.fieldName); - assert.strictEqual("BaseEvent", row.owner); - assert.strictEqual("string", row.type); - assert.strictEqual("My Label", row.label); - assert.deepEqual({ - fieldName: "host", - owner: "BaseEvent", - type: "string", - label: "My Label" + it("Callback#Pivot - test row split", function (done) { + if (this.skip) { + done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); + done(); + } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); }, - row); + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); - // Test error handling on range row split - try { - pivotSpecification.addRangeRowSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number."); - } - try { - pivotSpecification.addRangeRowSplit(field, "Break Me!", { start: 0, end: 100, step: 20, limit: 5 }); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } + var pivotSpecification = obj.createPivotSpecification(); - // Test range row split - pivotSpecification.addRangeRowSplit("epsilon", "My Label", { start: 0, end: 100, step: 20, limit: 5 }); - assert.strictEqual(3, pivotSpecification.rows.length); - - row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(row.hasOwnProperty("display")); - assert.ok(row.hasOwnProperty("ranges")); - - assert.strictEqual("epsilon", row.fieldName); - assert.strictEqual("test_data", row.owner); - assert.strictEqual("number", row.type); - assert.strictEqual("My Label", row.label); - assert.strictEqual("ranges", row.display); - - var ranges = { - start: 0, - end: 100, - size: 20, - maxNumberOf: 5 - }; - assert.deepEqual(ranges, row.ranges); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - label: "My Label", - display: "ranges", - ranges: ranges - }, - row); + // Test error handling for row split + try { + pivotSpecification.addRowSplit("has_boris", "Wrong type here"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number or string."); + } + var field = getNextId(); + try { - // Test error handling on boolean row split - try { - pivotSpecification.addBooleanRowSplit("epsilon", "Wrong type here", "t", "f"); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected boolean."); - } - try { - pivotSpecification.addBooleanRowSplit(field, "Break Me!", "t", "f"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } + pivotSpecification.addRowSplit(field, "Break Me!"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } - // Test boolean row split - pivotSpecification.addBooleanRowSplit("has_boris", "My Label", "is_true", "is_false"); - assert.strictEqual(4, pivotSpecification.rows.length); - - row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(row.hasOwnProperty("trueLabel")); - assert.ok(row.hasOwnProperty("falseLabel")); - - assert.strictEqual("has_boris", row.fieldName); - assert.strictEqual("My Label", row.label); - assert.strictEqual("test_data", row.owner); - assert.strictEqual("boolean", row.type); - assert.strictEqual("is_true", row.trueLabel); - assert.strictEqual("is_false", row.falseLabel); - assert.deepEqual({ - fieldName: "has_boris", - label: "My Label", - owner: "test_data", - type: "boolean", - trueLabel: "is_true", - falseLabel: "is_false" - }, - row); + // Test row split, number + pivotSpecification.addRowSplit("epsilon", "My Label"); + assert.strictEqual(1, pivotSpecification.rows.length); + + var row = pivotSpecification.rows[0]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(row.hasOwnProperty("display")); + + assert.strictEqual("epsilon", row.fieldName); + assert.strictEqual("test_data", row.owner); + assert.strictEqual("number", row.type); + assert.strictEqual("My Label", row.label); + assert.strictEqual("all", row.display); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + label: "My Label", + display: "all" + }, + row); + + // Test row split, string + pivotSpecification.addRowSplit("host", "My Label"); + assert.strictEqual(2, pivotSpecification.rows.length); + + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(!row.hasOwnProperty("display")); + + assert.strictEqual("host", row.fieldName); + assert.strictEqual("BaseEvent", row.owner); + assert.strictEqual("string", row.type); + assert.strictEqual("My Label", row.label); + assert.deepEqual({ + fieldName: "host", + owner: "BaseEvent", + type: "string", + label: "My Label" + }, + row); - // Test error handling on timestamp row split - try { - pivotSpecification.addTimestampRowSplit("epsilon", "Wrong type here", "some binning"); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected timestamp."); - } - try { - pivotSpecification.addTimestampRowSplit(field, "Break Me!", "some binning"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - try { - pivotSpecification.addTimestampRowSplit("_time", "some label", "Bogus binning value"); - assert.ok(false); + // Test error handling on range row split + try { + pivotSpecification.addRangeRowSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number."); + } + try { + pivotSpecification.addRangeRowSplit(field, "Break Me!", { start: 0, end: 100, step: 20, limit: 5 }); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test range row split + pivotSpecification.addRangeRowSplit("epsilon", "My Label", { start: 0, end: 100, step: 20, limit: 5 }); + assert.strictEqual(3, pivotSpecification.rows.length); + + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(row.hasOwnProperty("display")); + assert.ok(row.hasOwnProperty("ranges")); + + assert.strictEqual("epsilon", row.fieldName); + assert.strictEqual("test_data", row.owner); + assert.strictEqual("number", row.type); + assert.strictEqual("My Label", row.label); + assert.strictEqual("ranges", row.display); + + var ranges = { + start: 0, + end: 100, + size: 20, + maxNumberOf: 5 + }; + assert.deepEqual(ranges, row.ranges); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + label: "My Label", + display: "ranges", + ranges: ranges + }, + row); + + // Test error handling on boolean row split + try { + pivotSpecification.addBooleanRowSplit("epsilon", "Wrong type here", "t", "f"); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected boolean."); + } + try { + pivotSpecification.addBooleanRowSplit(field, "Break Me!", "t", "f"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test boolean row split + pivotSpecification.addBooleanRowSplit("has_boris", "My Label", "is_true", "is_false"); + assert.strictEqual(4, pivotSpecification.rows.length); + + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(row.hasOwnProperty("trueLabel")); + assert.ok(row.hasOwnProperty("falseLabel")); + + assert.strictEqual("has_boris", row.fieldName); + assert.strictEqual("My Label", row.label); + assert.strictEqual("test_data", row.owner); + assert.strictEqual("boolean", row.type); + assert.strictEqual("is_true", row.trueLabel); + assert.strictEqual("is_false", row.falseLabel); + assert.deepEqual({ + fieldName: "has_boris", + label: "My Label", + owner: "test_data", + type: "boolean", + trueLabel: "is_true", + falseLabel: "is_false" + }, + row); + + // Test error handling on timestamp row split + try { + pivotSpecification.addTimestampRowSplit("epsilon", "Wrong type here", "some binning"); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected timestamp."); + } + try { + pivotSpecification.addTimestampRowSplit(field, "Break Me!", "some binning"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + try { + pivotSpecification.addTimestampRowSplit("_time", "some label", "Bogus binning value"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); + } + + // Test timestamp row split + pivotSpecification.addTimestampRowSplit("_time", "My Label", "day"); + assert.strictEqual(5, pivotSpecification.rows.length); + + row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; + assert.ok(row.hasOwnProperty("fieldName")); + assert.ok(row.hasOwnProperty("owner")); + assert.ok(row.hasOwnProperty("type")); + assert.ok(row.hasOwnProperty("label")); + assert.ok(row.hasOwnProperty("period")); + + assert.strictEqual("_time", row.fieldName); + assert.strictEqual("My Label", row.label); + assert.strictEqual("BaseEvent", row.owner); + assert.strictEqual("timestamp", row.type); + assert.strictEqual("day", row.period); + assert.deepEqual({ + fieldName: "_time", + label: "My Label", + owner: "BaseEvent", + type: "timestamp", + period: "day" + }, + row); + + done(); } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) - // Test timestamp row split - pivotSpecification.addTimestampRowSplit("_time", "My Label", "day"); - assert.strictEqual(5, pivotSpecification.rows.length); - - row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(row.hasOwnProperty("period")); - - assert.strictEqual("_time", row.fieldName); - assert.strictEqual("My Label", row.label); - assert.strictEqual("BaseEvent", row.owner); - assert.strictEqual("timestamp", row.type); - assert.strictEqual("day", row.period); - assert.deepEqual({ - fieldName: "_time", - label: "My Label", - owner: "BaseEvent", - type: "timestamp", - period: "day" - }, - row); - + it("Callback#Pivot - test column split", function (done) { + if (this.skip) { done(); + return; + } + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - "Callback#Pivot - test column split": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - - // Test error handling for column split - try { - pivotSpecification.addColumnSplit("has_boris", "Wrong type here"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number or string."); - } - var field = getNextId(); - try { + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); - pivotSpecification.addColumnSplit(field, "Break Me!"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } + var pivotSpecification = obj.createPivotSpecification(); - // Test column split, number - pivotSpecification.addColumnSplit("epsilon"); - assert.strictEqual(1, pivotSpecification.columns.length); - - var col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(col.hasOwnProperty("display")); - - assert.strictEqual("epsilon", col.fieldName); - assert.strictEqual("test_data", col.owner); - assert.strictEqual("number", col.type); - assert.strictEqual("all", col.display); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - display: "all" - }, - col); - - // Test column split, string - pivotSpecification.addColumnSplit("host"); - assert.strictEqual(2, pivotSpecification.columns.length); - - col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(!col.hasOwnProperty("display")); - - assert.strictEqual("host", col.fieldName); - assert.strictEqual("BaseEvent", col.owner); - assert.strictEqual("string", col.type); - assert.deepEqual({ - fieldName: "host", - owner: "BaseEvent", - type: "string" - }, - col); + // Test error handling for column split + try { + pivotSpecification.addColumnSplit("has_boris", "Wrong type here"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number or string."); + } + var field = getNextId(); + try { - done(); + pivotSpecification.addColumnSplit(field, "Break Me!"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } - // Test error handling for range column split - try { - pivotSpecification.addRangeColumnSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number."); - } - try { - pivotSpecification.addRangeColumnSplit(field, { start: 0, end: 100, step: 20, limit: 5 }); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } + // Test column split, number + pivotSpecification.addColumnSplit("epsilon"); + assert.strictEqual(1, pivotSpecification.columns.length); + + var col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(col.hasOwnProperty("display")); + + assert.strictEqual("epsilon", col.fieldName); + assert.strictEqual("test_data", col.owner); + assert.strictEqual("number", col.type); + assert.strictEqual("all", col.display); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + display: "all" + }, + col); + + // Test column split, string + pivotSpecification.addColumnSplit("host"); + assert.strictEqual(2, pivotSpecification.columns.length); + + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(!col.hasOwnProperty("display")); + + assert.strictEqual("host", col.fieldName); + assert.strictEqual("BaseEvent", col.owner); + assert.strictEqual("string", col.type); + assert.deepEqual({ + fieldName: "host", + owner: "BaseEvent", + type: "string" + }, + col); - // Test range column split - pivotSpecification.addRangeColumnSplit("epsilon", { start: 0, end: 100, step: 20, limit: 5 }); - assert.strictEqual(3, pivotSpecification.columns.length); - - col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(col.hasOwnProperty("display")); - assert.ok(col.hasOwnProperty("ranges")); - - assert.strictEqual("epsilon", col.fieldName); - assert.strictEqual("test_data", col.owner); - assert.strictEqual("number", col.type); - assert.strictEqual("ranges", col.display); - var ranges = { - start: 0, - end: 100, - size: 20, - maxNumberOf: 5 - }; - assert.deepEqual(ranges, col.ranges); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - display: "ranges", - ranges: ranges - }, - col); + done(); - // Test error handling on boolean column split - try { - pivotSpecification.addBooleanColumnSplit("epsilon", "t", "f"); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected boolean."); - } - try { - pivotSpecification.addBooleanColumnSplit(field, "t", "f"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } + // Test error handling for range column split + try { + pivotSpecification.addRangeColumnSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number."); + } + try { + pivotSpecification.addRangeColumnSplit(field, { start: 0, end: 100, step: 20, limit: 5 }); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } - // Test boolean column split - pivotSpecification.addBooleanColumnSplit("has_boris", "is_true", "is_false"); - assert.strictEqual(4, pivotSpecification.columns.length); - - col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(!col.hasOwnProperty("label")); - assert.ok(col.hasOwnProperty("trueLabel")); - assert.ok(col.hasOwnProperty("falseLabel")); - - assert.strictEqual("has_boris", col.fieldName); - assert.strictEqual("test_data", col.owner); - assert.strictEqual("boolean", col.type); - assert.strictEqual("is_true", col.trueLabel); - assert.strictEqual("is_false", col.falseLabel); - assert.deepEqual({ - fieldName: "has_boris", - owner: "test_data", - type: "boolean", - trueLabel: "is_true", - falseLabel: "is_false" - }, - col); + // Test range column split + pivotSpecification.addRangeColumnSplit("epsilon", { start: 0, end: 100, step: 20, limit: 5 }); + assert.strictEqual(3, pivotSpecification.columns.length); + + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(col.hasOwnProperty("display")); + assert.ok(col.hasOwnProperty("ranges")); + + assert.strictEqual("epsilon", col.fieldName); + assert.strictEqual("test_data", col.owner); + assert.strictEqual("number", col.type); + assert.strictEqual("ranges", col.display); + var ranges = { + start: 0, + end: 100, + size: 20, + maxNumberOf: 5 + }; + assert.deepEqual(ranges, col.ranges); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + display: "ranges", + ranges: ranges + }, + col); - // Test error handling on timestamp column split - try { - pivotSpecification.addTimestampColumnSplit("epsilon", "Wrong type here"); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected timestamp."); - } - try { - pivotSpecification.addTimestampColumnSplit(field, "Break Me!"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - try { - pivotSpecification.addTimestampColumnSplit("_time", "Bogus binning value"); - assert.ok(false); + // Test error handling on boolean column split + try { + pivotSpecification.addBooleanColumnSplit("epsilon", "t", "f"); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected boolean."); + } + try { + pivotSpecification.addBooleanColumnSplit(field, "t", "f"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + + // Test boolean column split + pivotSpecification.addBooleanColumnSplit("has_boris", "is_true", "is_false"); + assert.strictEqual(4, pivotSpecification.columns.length); + + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(!col.hasOwnProperty("label")); + assert.ok(col.hasOwnProperty("trueLabel")); + assert.ok(col.hasOwnProperty("falseLabel")); + + assert.strictEqual("has_boris", col.fieldName); + assert.strictEqual("test_data", col.owner); + assert.strictEqual("boolean", col.type); + assert.strictEqual("is_true", col.trueLabel); + assert.strictEqual("is_false", col.falseLabel); + assert.deepEqual({ + fieldName: "has_boris", + owner: "test_data", + type: "boolean", + trueLabel: "is_true", + falseLabel: "is_false" + }, + col); + + // Test error handling on timestamp column split + try { + pivotSpecification.addTimestampColumnSplit("epsilon", "Wrong type here"); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected timestamp."); + } + try { + pivotSpecification.addTimestampColumnSplit(field, "Break Me!"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field " + field); + } + try { + pivotSpecification.addTimestampColumnSplit("_time", "Bogus binning value"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); + } + + // Test timestamp column split + pivotSpecification.addTimestampColumnSplit("_time", "day"); + assert.strictEqual(5, pivotSpecification.columns.length); + + col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; + assert.ok(col.hasOwnProperty("fieldName")); + assert.ok(col.hasOwnProperty("owner")); + assert.ok(col.hasOwnProperty("type")); + assert.ok(!col.hasOwnProperty("label")); + assert.ok(col.hasOwnProperty("period")); + + assert.strictEqual("_time", col.fieldName); + assert.strictEqual("BaseEvent", col.owner); + assert.strictEqual("timestamp", col.type); + assert.strictEqual("day", col.period); + assert.deepEqual({ + fieldName: "_time", + owner: "BaseEvent", + type: "timestamp", + period: "day" + }, + col); } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) - // Test timestamp column split - pivotSpecification.addTimestampColumnSplit("_time", "day"); - assert.strictEqual(5, pivotSpecification.columns.length); - - col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(!col.hasOwnProperty("label")); - assert.ok(col.hasOwnProperty("period")); - - assert.strictEqual("_time", col.fieldName); - assert.strictEqual("BaseEvent", col.owner); - assert.strictEqual("timestamp", col.type); - assert.strictEqual("day", col.period); - assert.deepEqual({ - fieldName: "_time", - owner: "BaseEvent", - type: "timestamp", - period: "day" - }, - col); + it("Callback#Pivot - test cell value", function (done) { + if (this.skip) { + done(); + return; } - ], - function (err) { + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); + } + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - "Callback#Pivot - test cell value": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - - // Test error handling for cell value, string - try { - pivotSpecification.addCellValue("iDontExist", "Break Me!", "explosion"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field iDontExist"); - } - try { - pivotSpecification.addCellValue("source", "Wrong Stats Function", "stdev"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + - " list, distinct_values, first, last, count, or distinct_count; found stdev"); - } + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); - // Add cell value, string - pivotSpecification.addCellValue("source", "Source Value", "dc"); - assert.strictEqual(1, pivotSpecification.cells.length); - - var cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("source", cell.fieldName); - assert.strictEqual("BaseEvent", cell.owner); - assert.strictEqual("string", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("dc", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "source", - owner: "BaseEvent", - type: "string", - label: "Source Value", - value: "dc", - sparkline: false - }, cell); - - // Test error handling for cell value, IPv4 - try { - pivotSpecification.addCellValue("hostip", "Wrong Stats Function", "stdev"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + - " list, distinct_values, first, last, count, or distinct_count; found stdev"); - } + var pivotSpecification = obj.createPivotSpecification(); - // Add cell value, IPv4 - pivotSpecification.addCellValue("hostip", "Source Value", "dc"); - assert.strictEqual(2, pivotSpecification.cells.length); - - cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("hostip", cell.fieldName); - assert.strictEqual("test_data", cell.owner); - assert.strictEqual("ipv4", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("dc", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "hostip", - owner: "test_data", - type: "ipv4", - label: "Source Value", - value: "dc", - sparkline: false - }, cell); - - // Test error handling for cell value, boolean - try { - pivotSpecification.addCellValue("has_boris", "Booleans not allowed", "sum"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot use boolean valued fields as cell values."); - } + // Test error handling for cell value, string + try { + pivotSpecification.addCellValue("iDontExist", "Break Me!", "explosion"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Did not find field iDontExist"); + } + try { + pivotSpecification.addCellValue("source", "Wrong Stats Function", "stdev"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + + " list, distinct_values, first, last, count, or distinct_count; found stdev"); + } - // Test error handling for cell value, number - try { - pivotSpecification.addCellValue("epsilon", "Wrong Stats Function", "latest"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on number field must be must be one of:" + - " sum, count, average, max, min, stdev, list, or distinct_values; found latest"); - } + // Add cell value, string + pivotSpecification.addCellValue("source", "Source Value", "dc"); + assert.strictEqual(1, pivotSpecification.cells.length); + + var cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("source", cell.fieldName); + assert.strictEqual("BaseEvent", cell.owner); + assert.strictEqual("string", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("dc", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "source", + owner: "BaseEvent", + type: "string", + label: "Source Value", + value: "dc", + sparkline: false + }, cell); + + // Test error handling for cell value, IPv4 + try { + pivotSpecification.addCellValue("hostip", "Wrong Stats Function", "stdev"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + + " list, distinct_values, first, last, count, or distinct_count; found stdev"); + } - // Add cell value, number - pivotSpecification.addCellValue("epsilon", "Source Value", "average"); - assert.strictEqual(3, pivotSpecification.cells.length); - - cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("epsilon", cell.fieldName); - assert.strictEqual("test_data", cell.owner); - assert.strictEqual("number", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("average", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - label: "Source Value", - value: "average", - sparkline: false - }, cell); - - // Test error handling for cell value, timestamp - try { - pivotSpecification.addCellValue("_time", "Wrong Stats Function", "max"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on timestamp field must be one of:" + - " duration, earliest, latest, list, or distinct values; found max"); - } + // Add cell value, IPv4 + pivotSpecification.addCellValue("hostip", "Source Value", "dc"); + assert.strictEqual(2, pivotSpecification.cells.length); + + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("hostip", cell.fieldName); + assert.strictEqual("test_data", cell.owner); + assert.strictEqual("ipv4", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("dc", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "hostip", + owner: "test_data", + type: "ipv4", + label: "Source Value", + value: "dc", + sparkline: false + }, cell); + + // Test error handling for cell value, boolean + try { + pivotSpecification.addCellValue("has_boris", "Booleans not allowed", "sum"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Cannot use boolean valued fields as cell values."); + } - // Add cell value, timestamp - pivotSpecification.addCellValue("_time", "Source Value", "earliest"); - assert.strictEqual(4, pivotSpecification.cells.length); - - cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("_time", cell.fieldName); - assert.strictEqual("BaseEvent", cell.owner); - assert.strictEqual("timestamp", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("earliest", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "_time", - owner: "BaseEvent", - type: "timestamp", - label: "Source Value", - value: "earliest", - sparkline: false - }, cell); - - // Test error handling for cell value, count - try { - pivotSpecification.addCellValue("test_data", "Wrong Stats Function", "min"); - assert.ok(false); + // Test error handling for cell value, number + try { + pivotSpecification.addCellValue("epsilon", "Wrong Stats Function", "latest"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on number field must be must be one of:" + + " sum, count, average, max, min, stdev, list, or distinct_values; found latest"); + } + + // Add cell value, number + pivotSpecification.addCellValue("epsilon", "Source Value", "average"); + assert.strictEqual(3, pivotSpecification.cells.length); + + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("epsilon", cell.fieldName); + assert.strictEqual("test_data", cell.owner); + assert.strictEqual("number", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("average", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "epsilon", + owner: "test_data", + type: "number", + label: "Source Value", + value: "average", + sparkline: false + }, cell); + + // Test error handling for cell value, timestamp + try { + pivotSpecification.addCellValue("_time", "Wrong Stats Function", "max"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on timestamp field must be one of:" + + " duration, earliest, latest, list, or distinct values; found max"); + } + + // Add cell value, timestamp + pivotSpecification.addCellValue("_time", "Source Value", "earliest"); + assert.strictEqual(4, pivotSpecification.cells.length); + + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("_time", cell.fieldName); + assert.strictEqual("BaseEvent", cell.owner); + assert.strictEqual("timestamp", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("earliest", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "_time", + owner: "BaseEvent", + type: "timestamp", + label: "Source Value", + value: "earliest", + sparkline: false + }, cell); + + // Test error handling for cell value, count + try { + pivotSpecification.addCellValue("test_data", "Wrong Stats Function", "min"); + assert.ok(false); + } + catch (e) { + assert.ok(e); + assert.strictEqual(e.message, "Stats function on childcount and objectcount fields " + + "must be count; found " + "min"); + } + + // Add cell value, count + pivotSpecification.addCellValue("test_data", "Source Value", "count"); + assert.strictEqual(5, pivotSpecification.cells.length); + + cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; + assert.ok(cell.hasOwnProperty("fieldName")); + assert.ok(cell.hasOwnProperty("owner")); + assert.ok(cell.hasOwnProperty("type")); + assert.ok(cell.hasOwnProperty("label")); + assert.ok(cell.hasOwnProperty("value")); + assert.ok(cell.hasOwnProperty("sparkline")); + + assert.strictEqual("test_data", cell.fieldName); + assert.strictEqual("test_data", cell.owner); + assert.strictEqual("objectCount", cell.type); + assert.strictEqual("Source Value", cell.label); + assert.strictEqual("count", cell.value); + assert.strictEqual(false, cell.sparkline); + assert.deepEqual({ + fieldName: "test_data", + owner: "test_data", + type: "objectCount", + label: "Source Value", + value: "count", + sparkline: false + }, cell); + + done(); } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on childcount and objectcount fields " + - "must be count; found " + "min"); + ], + function (err) { + assert.ok(!err); + done(); } + ); + }) - // Add cell value, count - pivotSpecification.addCellValue("test_data", "Source Value", "count"); - assert.strictEqual(5, pivotSpecification.cells.length); - - cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("test_data", cell.fieldName); - assert.strictEqual("test_data", cell.owner); - assert.strictEqual("objectCount", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("count", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "test_data", - owner: "test_data", - type: "objectCount", - label: "Source Value", - value: "count", - sparkline: false - }, cell); - - done(); - } - ], - function (err) { - assert.ok(!err); + it("Callback#Pivot - test pivot throws HTTP exception", function (done) { + if (this.skip) { done(); + return; } - ); - }, - "Callback#Pivot - test pivot throws HTTP exception": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - obj.createPivotSpecification().pivot(done); - }, - function (pivot, done) { - assert.ok(false); + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { - assert.ok(err); - var expectedErr = "In handler 'datamodelpivot': Error in 'PivotReport': Must have non-empty cells or non-empty rows."; - assert.ok(utils.endsWith(err.message, expectedErr)); + catch (err) { + // Fail if we can't read the file, likely to occur in the browser + assert.ok(!err); done(); } - ); - }, - "Callback#Pivot - test pivot with simple namespace": function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - var obj; - var pivotSpecification; - var adhocjob; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("test_data"); - assert.ok(obj); - obj.createLocalAccelerationJob(null, done); - }, - function (job, done) { - adhocjob = job; - assert.ok(job); - pivotSpecification = obj.createPivotSpecification(); - - pivotSpecification.addBooleanRowSplit("has_boris", "Has Boris", "meep", "hilda"); - pivotSpecification.addCellValue("hostip", "Distinct IPs", "count"); - - // Test setting a job - pivotSpecification.setAccelerationJob(job); - assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); - assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); - - // Test setting a job's SID - pivotSpecification.setAccelerationJob(job.sid); - assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); - assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); - - pivotSpecification.pivot(done); - }, - function (pivot, done) { - assert.ok(pivot.tstatsSearch); - assert.ok(pivot.tstatsSearch.length > 0); - assert.strictEqual(0, pivot.tstatsSearch.indexOf("| tstats")); - // This test won't work with utils.startsWith due to the regex escaping - assert.strictEqual("| tstats", pivot.tstatsSearch.match("^\\| tstats")[0]); - assert.strictEqual(1, pivot.tstatsSearch.match("^\\| tstats").length); - - pivot.run(done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties().isDone; - }, - 10, - done - ); - }, - function (job, done) { - assert.ok("FAILED" !== job.properties().dispatchState); + var that = this; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + var obj = dataModel.objectByName("test_data"); + assert.ok(obj); - assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); - // This test won't work with utils.startsWith due to the regex escaping - assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); - assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); + obj.createPivotSpecification().pivot(done); + }, + function (pivot, done) { + assert.ok(false); + } + ], + function (err) { + assert.ok(err); + var expectedErr = "In handler 'datamodelpivot': Error in 'PivotReport': Must have non-empty cells or non-empty rows."; + assert.ok(utils.endsWith(err.message, expectedErr)); + done(); + } + ); + }) - adhocjob.cancel(done); - } - ], - function (err) { - assert.ok(!err); + it("Callback#Pivot - test pivot with simple namespace", function (done) { + if (this.skip) { done(); + return; } - ); - }, - "Callback#Pivot - test pivot column range split": function (done) { - // This test is here because we had a problem with fields that were supposed to be - // numbers being expected as strings in Splunk 6.0. This was fixed in Splunk 6.1, and accepts - // either strings or numbers. - - if (this.skip) { - done(); - return; - } - var that = this; - var search; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - var dm = dataModels.item("internal_audit_logs"); - var obj = dm.objectByName("searches"); - var pivotSpecification = obj.createPivotSpecification(); - - pivotSpecification.addRowSplit("user", "Executing user"); - pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); - pivotSpecification.addCellValue("search", "Search Query", "values"); - pivotSpecification.pivot(done); - }, - function (pivot, done) { - // If tstats is undefined, use pivotSearch - search = pivot.tstatsSearch || pivot.pivotSearch; - pivot.run(done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties().isDone; - }, - 10, - done - ); - }, - function (job, done) { - assert.notStrictEqual("FAILED", job.properties().dispatchState); - // Make sure the job is run with the correct search query - assert.strictEqual(search, job.properties().request.search); - job.cancel(done); + var name = "delete-me-" + getNextId(); + var args; + try { + args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); } - ], - function (err) { + catch (err) { + // Fail if we can't read the file, likely to occur in the browser assert.ok(!err); done(); } - ); - }, - "Callback#Pivot - test pivot with PivotSpecification.run and Job.track": function (done) { - if (this.skip) { - done(); - return; - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - var dm = dataModels.item("internal_audit_logs"); - var obj = dm.objectByName("searches"); - var pivotSpecification = obj.createPivotSpecification(); - - pivotSpecification.addRowSplit("user", "Executing user"); - pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); - pivotSpecification.addCellValue("search", "Search Query", "values"); - - pivotSpecification.run({}, done); - }, - function (job, pivot, done) { - job.track({}, function (job) { - assert.strictEqual(pivot.tstatsSearch || pivot.pivotSearch, job.properties().request.search); - done(null, job); - }); - }, - function (job, done) { - assert.notStrictEqual("FAILED", job.properties().dispatchState); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); + var that = this; + var obj; + var pivotSpecification; + var adhocjob; + Async.chain([ + function (done) { + that.dataModels.create(name, args, done); + }, + function (dataModel, done) { + obj = dataModel.objectByName("test_data"); + assert.ok(obj); + obj.createLocalAccelerationJob(null, done); + }, + function (job, done) { + adhocjob = job; + assert.ok(job); + pivotSpecification = obj.createPivotSpecification(); + + pivotSpecification.addBooleanRowSplit("has_boris", "Has Boris", "meep", "hilda"); + pivotSpecification.addCellValue("hostip", "Distinct IPs", "count"); + + // Test setting a job + pivotSpecification.setAccelerationJob(job); + assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); + assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); + + // Test setting a job's SID + pivotSpecification.setAccelerationJob(job.sid); + assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); + assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); + + pivotSpecification.pivot(done); + }, + function (pivot, done) { + assert.ok(pivot.tstatsSearch); + assert.ok(pivot.tstatsSearch.length > 0); + assert.strictEqual(0, pivot.tstatsSearch.indexOf("| tstats")); + // This test won't work with utils.startsWith due to the regex escaping + assert.strictEqual("| tstats", pivot.tstatsSearch.match("^\\| tstats")[0]); + assert.strictEqual(1, pivot.tstatsSearch.match("^\\| tstats").length); + + pivot.run(done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties().isDone; + }, + 10, + done + ); + }, + function (job, done) { + assert.ok("FAILED" !== job.properties().dispatchState); + + assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); + // This test won't work with utils.startsWith due to the regex escaping + assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); + assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); + + adhocjob.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Pivot - test pivot column range split", function (done) { + // This test is here because we had a problem with fields that were supposed to be + // numbers being expected as strings in Splunk 6.0. This was fixed in Splunk 6.1, and accepts + // either strings or numbers. + + if (this.skip) { done(); + return; } - ); - }, - "Callback#DataModels - delete any remaining data models created by the SDK tests": function (done) { - if (this.skip) { - done(); - return; - } - svc.dataModels().fetch(function (err, dataModels) { - if (err) { - assert.ok(!err); + var that = this; + var search; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + var dm = dataModels.item("internal_audit_logs"); + var obj = dm.objectByName("searches"); + var pivotSpecification = obj.createPivotSpecification(); + + pivotSpecification.addRowSplit("user", "Executing user"); + pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); + pivotSpecification.addCellValue("search", "Search Query", "values"); + pivotSpecification.pivot(done); + }, + function (pivot, done) { + // If tstats is undefined, use pivotSearch + search = pivot.tstatsSearch || pivot.pivotSearch; + pivot.run(done); + }, + function (job, done) { + tutils.pollUntil( + job, + function (j) { + return job.properties().isDone; + }, + 10, + done + ); + }, + function (job, done) { + assert.notStrictEqual("FAILED", job.properties().dispatchState); + // Make sure the job is run with the correct search query + assert.strictEqual(search, job.properties().request.search); + job.cancel(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Pivot - test pivot with PivotSpecification.run and Job.track", function (done) { + if (this.skip) { + done(); + return; } + var that = this; + Async.chain([ + function (done) { + that.dataModels.fetch(done); + }, + function (dataModels, done) { + var dm = dataModels.item("internal_audit_logs"); + var obj = dm.objectByName("searches"); + var pivotSpecification = obj.createPivotSpecification(); - var dms = dataModels.list(); - Async.seriesEach( - dms, - function (datamodel, i, done) { - // Delete any test data models that we created - if (utils.startsWith(datamodel.name, "delete-me")) { - datamodel.remove(done); - } - else { - done(); - } + pivotSpecification.addRowSplit("user", "Executing user"); + pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); + pivotSpecification.addCellValue("search", "Search Query", "values"); + + pivotSpecification.run({}, done); }, + function (job, pivot, done) { + job.track({}, function (job) { + assert.strictEqual(pivot.tstatsSearch || pivot.pivotSearch, job.properties().request.search); + done(null, job); + }); + }, + function (job, done) { + assert.notStrictEqual("FAILED", job.properties().dispatchState); + job.cancel(done); + } + ], function (err) { assert.ok(!err); done(); } ); - }); - } - }; + }) + + it("Callback#DataModels - delete any remaining data models created by the SDK tests", function (done) { + if (this.skip) { + done(); + return; + } + svc.dataModels().fetch(function (err, dataModels) { + if (err) { + assert.ok(!err); + } + + var dms = dataModels.list(); + Async.seriesEach( + dms, + function (datamodel, i, done) { + // Delete any test data models that we created + if (utils.startsWith(datamodel.name, "delete-me")) { + datamodel.remove(done); + } + else { + done(); + } + }, + function (err) { + assert.ok(!err); + done(); + } + ); + }); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/properties.js b/tests/service_tests/properties.js index 911b5b762..db7664e58 100644 --- a/tests/service_tests/properties.js +++ b/tests/service_tests/properties.js @@ -1,131 +1,134 @@ -var assert = require('chai').assert; -var splunkjs = require('../../index'); +exports.setup = function (svc) { + var assert = require('chai').assert; -var Async = splunkjs.Async; -var idCounter = 0; + var splunkjs = require('../../index'); -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; + var Async = splunkjs.Async; + var idCounter = 0; -exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Callback#list": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { - that.service.configurations(namespace).fetch(done); - }, - function (props, done) { - var files = props.list(); - assert.ok(files.length > 0); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#item": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("web"); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(file.name, "web"); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#contains stanza": function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("web"); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(file.name, "web"); - var stanza = file.item("settings"); - assert.ok(stanza); - stanza.fetch(done); - }, - function (stanza, done) { - assert.ok(stanza.properties().hasOwnProperty("httpport")); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }, - - "Callback#create file + create stanza + update stanza": function (done) { - var that = this; - var fileName = "jssdk_file_" + getNextId(); - var value = "barfoo_" + getNextId(); - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { - var properties = that.service.configurations(namespace); - properties.fetch(done); - }, - function (properties, done) { - properties.create(fileName, done); - }, - function (file, done) { - file.create("stanza", done); - }, - function (stanza, done) { - stanza.update({ "jssdk_foobar": value }, done); - }, - function (stanza, done) { - assert.strictEqual(stanza.properties()["jssdk_foobar"], value); - done(); - }, - function (done) { - var file = new splunkjs.Service.ConfigurationFile(svc, fileName); - file.fetch(done); - }, - function (file, done) { - var stanza = file.item("stanza"); - assert.ok(stanza); - stanza.remove(done); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - } + var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); }; + return ( + describe("Properties Test", function () { + + beforeEach(function (done) { + this.service = svc; + done(); + }) + + it("Callback#list", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { + that.service.configurations(namespace).fetch(done); + }, + function (props, done) { + var files = props.list(); + assert.ok(files.length > 0); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }) + + it("Callback#item", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("web"); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(file.name, "web"); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }) + + it("Callback#contains stanza", function (done) { + var that = this; + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { that.service.configurations(namespace).fetch(done); }, + function (props, done) { + var file = props.item("web"); + assert.ok(file); + file.fetch(done); + }, + function (file, done) { + assert.strictEqual(file.name, "web"); + var stanza = file.item("settings"); + assert.ok(stanza); + stanza.fetch(done); + }, + function (stanza, done) { + assert.ok(stanza.properties().hasOwnProperty("httpport")); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }) + + it("Callback#create file + create stanza + update stanza", function (done) { + var that = this; + var fileName = "jssdk_file_" + getNextId(); + var value = "barfoo_" + getNextId(); + var namespace = { owner: "admin", app: "search" }; + + Async.chain([ + function (done) { + var properties = that.service.configurations(namespace); + properties.fetch(done); + }, + function (properties, done) { + properties.create(fileName, done); + }, + function (file, done) { + file.create("stanza", done); + }, + function (stanza, done) { + stanza.update({ "jssdk_foobar": value }, done); + }, + function (stanza, done) { + assert.strictEqual(stanza.properties()["jssdk_foobar"], value); + done(); + }, + function (done) { + var file = new splunkjs.Service.ConfigurationFile(svc, fileName); + file.fetch(done); + }, + function (file, done) { + var stanza = file.item("stanza"); + assert.ok(stanza); + stanza.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + }); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/savedsearch.js b/tests/service_tests/savedsearch.js index 075e9f47d..b7addee9f 100644 --- a/tests/service_tests/savedsearch.js +++ b/tests/service_tests/savedsearch.js @@ -1,420 +1,419 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); -var tutils = require('../utils'); - -var Async = splunkjs.Async; -var utils = splunkjs.Utils; -var idCounter = 0; - -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; exports.setup = function (svc, loggedOutSvc) { - return { - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }, - - "Callback#list": function (done) { - var searches = this.service.savedSearches(); - searches.fetch(function (err, searches) { - var savedSearches = searches.list(); - assert.ok(savedSearches.length > 0); - - for (var i = 0; i < savedSearches.length; i++) { - assert.ok(savedSearches[i]); - } - + var assert = require('chai').assert; + var splunkjs = require('../../index'); + var tutils = require('../utils'); + var Async = splunkjs.Async; + var utils = splunkjs.Utils; + var idCounter = 0; + var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); + }; + return ( + describe("Saved Search", function () { + beforeEach(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; done(); - }); - }, - - "Callback#contains": function (done) { - var searches = this.service.savedSearches(); - searches.fetch(function (err, searches) { - var search = searches.item("Errors in the last hour"); - assert.ok(search); + }) - done(); - }); - }, + it("Callback#list", function (done) { + var searches = this.service.savedSearches(); + searches.fetch(function (err, searches) { + var savedSearches = searches.list(); + assert.ok(savedSearches.length > 0); - "Callback#suppress": function (done) { - var searches = this.service.savedSearches(); - searches.fetch(function (err, searches) { - var search = searches.item("Errors in the last hour"); - assert.ok(search); + for (var i = 0; i < savedSearches.length; i++) { + assert.ok(savedSearches[i]); + } - search.suppressInfo(function (err, info, search) { - assert.ok(!err); done(); }); - }); - }, - - "Callback#list limit count": function (done) { - var searches = this.service.savedSearches(); - searches.fetch({ count: 2 }, function (err, searches) { - var savedSearches = searches.list(); - assert.strictEqual(savedSearches.length, 2); - - for (var i = 0; i < savedSearches.length; i++) { - assert.ok(savedSearches[i]); - } - - done(); - }); - }, - - "Callback#list filter": function (done) { - var searches = this.service.savedSearches(); - searches.fetch({ search: "Error" }, function (err, searches) { - var savedSearches = searches.list(); - assert.ok(savedSearches.length > 0); + }) - for (var i = 0; i < savedSearches.length; i++) { - assert.ok(savedSearches[i]); - } - - done(); - }); - }, - - "Callback#list offset": function (done) { - var searches = this.service.savedSearches(); - searches.fetch({ offset: 2, count: 1 }, function (err, searches) { - var savedSearches = searches.list(); - assert.strictEqual(searches.paging().offset, 2); - assert.strictEqual(searches.paging().perPage, 1); - assert.strictEqual(savedSearches.length, 1); - - for (var i = 0; i < savedSearches.length; i++) { - assert.ok(savedSearches[i]); - } - - done(); - }); - }, - - "Callback#create + modify + delete saved search": function (done) { - var name = "jssdk_savedsearch"; - var originalSearch = "search * | head 1"; - var updatedSearch = "search * | head 10"; - var updatedDescription = "description"; - - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - - Async.chain([ - function (done) { - searches.create({ search: originalSearch, name: name }, done); - }, - function (search, done) { + it("Callback#contains", function (done) { + var searches = this.service.savedSearches(); + searches.fetch(function (err, searches) { + var search = searches.item("Errors in the last hour"); assert.ok(search); - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, originalSearch); - assert.ok(!search.properties().description); + done(); + }); + }) - search.update({ search: updatedSearch }, done); - }, - function (search, done) { - assert.ok(search); + it("Callback#suppress", function (done) { + var searches = this.service.savedSearches(); + searches.fetch(function (err, searches) { + var search = searches.item("Errors in the last hour"); assert.ok(search); - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, updatedSearch); - assert.ok(!search.properties().description); + search.suppressInfo(function (err, info, search) { + assert.ok(!err); + done(); + }); + }); + }) - search.update({ description: updatedDescription }, done); - }, - function (search, done) { - assert.ok(search); - assert.ok(search); + it("Callback#list limit count", function (done) { + var searches = this.service.savedSearches(); + searches.fetch({ count: 2 }, function (err, searches) { + var savedSearches = searches.list(); + assert.strictEqual(savedSearches.length, 2); - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, updatedSearch); - assert.strictEqual(search.properties().description, updatedDescription); - - search.fetch(done); - }, - function (search, done) { - // Verify that we have the required fields - assert.ok(search.fields().optional.length > 1); - assert.ok(utils.indexOf(search.fields().optional, "disabled") > -1); - - search.remove(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#dispatch error": function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - var search = new splunkjs.Service.SavedSearch( - this.loggedOutService, - name, - { owner: "nobody", app: "search" } - ); - search.dispatch(function (err) { - assert.ok(err); - done(); - }); - }, + for (var i = 0; i < savedSearches.length; i++) { + assert.ok(savedSearches[i]); + } - "Callback#dispatch omitting optional arguments": function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; + done(); + }); + }) - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); + it("Callback#list filter", function (done) { + var searches = this.service.savedSearches(); + searches.fetch({ search: "Error" }, function (err, searches) { + var savedSearches = searches.list(); + assert.ok(savedSearches.length > 0); - Async.chain( - [function (done) { - searches.create({ search: originalSearch, name: name }, done); - }, - function (search, done) { - assert.ok(search); + for (var i = 0; i < savedSearches.length; i++) { + assert.ok(savedSearches[i]); + } - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, originalSearch); - assert.ok(!search.properties().description); + done(); + }); + }) + + it("Callback#list offset", function (done) { + var searches = this.service.savedSearches(); + searches.fetch({ offset: 2, count: 1 }, function (err, searches) { + var savedSearches = searches.list(); + assert.strictEqual(searches.paging().offset, 2); + assert.strictEqual(searches.paging().perPage, 1); + assert.strictEqual(savedSearches.length, 1); + + for (var i = 0; i < savedSearches.length; i++) { + assert.ok(savedSearches[i]); + } - search.dispatch(done); - }, - function (job, search, done) { - assert.ok(job); - assert.ok(search); - }] - ); - done(); - }, - - "Callback#history error": function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - var search = new splunkjs.Service.SavedSearch( - this.loggedOutService, - name, - { owner: "nobody", app: "search", sharing: "system" } - ); - search.history(function (err) { - assert.ok(err); + done(); + }); + }) + + it("Callback#create + modify + delete saved search", function (done) { + var name = "jssdk_savedsearch"; + var originalSearch = "search * | head 1"; + var updatedSearch = "search * | head 10"; + var updatedDescription = "description"; + + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdkappcollection" }); + + Async.chain([ + function (done) { + searches.create({ search: originalSearch, name: name }, done); + }, + function (search, done) { + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, originalSearch); + assert.ok(!search.properties().description); + + search.update({ search: updatedSearch }, done); + }, + function (search, done) { + assert.ok(search); + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, updatedSearch); + assert.ok(!search.properties().description); + + search.update({ description: updatedDescription }, done); + }, + function (search, done) { + assert.ok(search); + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, updatedSearch); + assert.strictEqual(search.properties().description, updatedDescription); + + search.fetch(done); + }, + function (search, done) { + // Verify that we have the required fields + assert.ok(search.fields().optional.length > 1); + assert.ok(utils.indexOf(search.fields().optional, "disabled") > -1); + + search.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#dispatch error", function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + var search = new splunkjs.Service.SavedSearch( + this.loggedOutService, + name, + { owner: "nobody", app: "search" } + ); + search.dispatch(function (err) { + assert.ok(err); + done(); + }); + }) + + it("Callback#dispatch omitting optional arguments", function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); + + Async.chain( + [function (done) { + searches.create({ search: originalSearch, name: name }, done); + }, + function (search, done) { + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, originalSearch); + assert.ok(!search.properties().description); + + search.dispatch(done); + }, + function (job, search, done) { + assert.ok(job); + assert.ok(search); + }] + ); done(); - }); - }, - - "Callback#Update error": function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - var search = new splunkjs.Service.SavedSearch( - this.loggedOutService, - name, - { owner: "nobody", app: "search", sharing: "system" } - ); - search.update( - {}, - function (err) { + }) + + it("Callback#history error", function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + var search = new splunkjs.Service.SavedSearch( + this.loggedOutService, + name, + { owner: "nobody", app: "search", sharing: "system" } + ); + search.history(function (err) { assert.ok(err); done(); }); - }, - - "Callback#oneshot requires search string": function (done) { - assert.throws(function () { this.service.oneshotSearch({ name: "jssdk_oneshot_" + getNextId() }, function (err) { }); }); - done(); - }, - - "Callback#Create + dispatch + history": function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - - Async.chain( - function (done) { - searches.create({ search: originalSearch, name: name }, done); - }, - function (search, done) { - assert.ok(search); - - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, originalSearch); - assert.ok(!search.properties().description); - - search.dispatch({ force_dispatch: false, "dispatch.buckets": 295 }, done); - }, - function (job, search, done) { - assert.ok(job); - assert.ok(search); - - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - Async.augment(done, search) - ); - }, - function (job, search, done) { - assert.strictEqual(job.properties().statusBuckets, 295); - search.history(Async.augment(done, job)); - }, - function (jobs, search, originalJob, done) { - assert.ok(jobs); - assert.ok(jobs.length > 0); - assert.ok(search); - assert.ok(originalJob); + }) + + it("Callback#Update error", function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + var search = new splunkjs.Service.SavedSearch( + this.loggedOutService, + name, + { owner: "nobody", app: "search", sharing: "system" } + ); + search.update( + {}, + function (err) { + assert.ok(err); + done(); + }); + }) - var cancel = function (job) { - return function (cb) { - job.cancel(cb); + it("Callback#oneshot requires search string", function (done) { + assert.throws(function () { this.service.oneshotSearch({ name: "jssdk_oneshot_" + getNextId() }, function (err) { }); }); + done(); + }) + + it("Callback#Create + dispatch + history", function (done) { + var name = "jssdk_savedsearch_" + getNextId(); + var originalSearch = "search index=_internal | head 1"; + + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdkappcollection" }); + + Async.chain( + function (done) { + searches.create({ search: originalSearch, name: name }, done); + }, + function (search, done) { + assert.ok(search); + + assert.strictEqual(search.name, name); + assert.strictEqual(search.properties().search, originalSearch); + assert.ok(!search.properties().description); + + search.dispatch({ force_dispatch: false, "dispatch.buckets": 295 }, done); + }, + function (job, search, done) { + assert.ok(job); + assert.ok(search); + + tutils.pollUntil( + job, + function (j) { + return job.properties()["isDone"]; + }, + 10, + Async.augment(done, search) + ); + }, + function (job, search, done) { + assert.strictEqual(job.properties().statusBuckets, 295); + search.history(Async.augment(done, job)); + }, + function (jobs, search, originalJob, done) { + assert.ok(jobs); + assert.ok(jobs.length > 0); + assert.ok(search); + assert.ok(originalJob); + + var cancel = function (job) { + return function (cb) { + job.cancel(cb); + }; }; - }; - var found = false; - var cancellations = []; - for (var i = 0; i < jobs.length; i++) { - cancellations.push(cancel(jobs[i])); - found = found || (jobs[i].sid === originalJob.sid); - } + var found = false; + var cancellations = []; + for (var i = 0; i < jobs.length; i++) { + cancellations.push(cancel(jobs[i])); + found = found || (jobs[i].sid === originalJob.sid); + } - assert.ok(found); + assert.ok(found); + + search.remove(function (err) { + if (err) { + done(err); + } + else { + Async.parallel(cancellations, done); + } + }); + }, + function (err) { + assert.ok(!err); + done(); + } + ); + }) - search.remove(function (err) { - if (err) { - done(err); - } - else { - Async.parallel(cancellations, done); - } - }); - }, - function (err) { - assert.ok(!err); + it("Callback#job events fails", function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.events({}, function (err) { + assert.ok(err); done(); - } - ); - }, - - "Callback#job events fails": function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.events({}, function (err) { - assert.ok(err); - done(); - }); - }, + }); + }) - "Callback#job preview fails": function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.preview({}, function (err) { - assert.ok(err); - done(); - }); - }, + it("Callback#job preview fails", function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.preview({}, function (err) { + assert.ok(err); + done(); + }); + }) - "Callback#job results fails": function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.results({}, function (err) { - assert.ok(err); - done(); - }); - }, + it("Callback#job results fails", function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.results({}, function (err) { + assert.ok(err); + done(); + }); + }) - "Callback#job searchlog fails": function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.searchlog(function (err) { - assert.ok(err); - done(); - }); - }, + it("Callback#job searchlog fails", function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.searchlog(function (err) { + assert.ok(err); + done(); + }); + }) - "Callback#job summary fails": function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.summary({}, function (err) { - assert.ok(err); - done(); - }); - }, + it("Callback#job summary fails", function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.summary({}, function (err) { + assert.ok(err); + done(); + }); + }) - "Callback#job timeline fails": function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.timeline({}, function (err) { - assert.ok(err); - done(); - }); - }, - - "Callback#delete test saved searches": function (done) { - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - searches.fetch(function (err, searches) { - var searchList = searches.list(); - Async.parallelEach( - searchList, - function (search, idx, callback) { - if (utils.startsWith(search.name, "jssdk_")) { - search.remove(callback); - } - else { - callback(); + it("Callback#job timeline fails", function (done) { + var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); + job.timeline({}, function (err) { + assert.ok(err); + done(); + }); + }) + + it("Callback#delete test saved searches", function (done) { + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdkappcollection" }); + searches.fetch(function (err, searches) { + var searchList = searches.list(); + Async.parallelEach( + searchList, + function (search, idx, callback) { + if (utils.startsWith(search.name, "jssdk_")) { + search.remove(callback); + } + else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); } - }, function (err) { - assert.ok(!err); - done(); + ); + }); + }) + + it("Callback#setupInfo fails", function (done) { + var searches = new splunkjs.Service.Application(this.loggedOutService, "search"); + searches.setupInfo(function (err, content, that) { + assert.ok(err); + done(); + }); + }) + + it("Callback#setupInfo succeeds", function (done) { + var app = new splunkjs.Service.Application(this.service, "sdkappcollection"); + app.setupInfo(function (err, content, app) { + // This error message was removed in modern versions of Splunk + if (err) { + assert.ok(err.data.messages[0].text.match("Setup configuration file does not")); + splunkjs.Logger.log("ERR ---", err.data.messages[0].text); } - ); - }); - }, + else { + assert.ok(app); + } + done(); + }); + }) - "Callback#setupInfo fails": function (done) { - var searches = new splunkjs.Service.Application(this.loggedOutService, "search"); - searches.setupInfo(function (err, content, that) { - assert.ok(err); - done(); - }); - }, - - "Callback#setupInfo succeeds": function (done) { - var app = new splunkjs.Service.Application(this.service, "sdk-app-collection"); - app.setupInfo(function (err, content, app) { - // This error message was removed in modern versions of Splunk - if (err) { - assert.ok(err.data.messages[0].text.match("Setup configuration file does not")); - splunkjs.Logger.log("ERR ---", err.data.messages[0].text); - } - else { + it("Callback#updateInfo", function (done) { + var app = new splunkjs.Service.Application(this.service, "search"); + app.updateInfo(function (err, info, app) { + assert.ok(!err); assert.ok(app); - } - done(); - }); - }, - - "Callback#updateInfo": function (done) { - var app = new splunkjs.Service.Application(this.service, "search"); - app.updateInfo(function (err, info, app) { - assert.ok(!err); - assert.ok(app); - assert.strictEqual(app.name, 'search'); - done(); - }); - }, + assert.strictEqual(app.name, 'search'); + done(); + }); + }) - "Callback#updateInfo failure": function (done) { - var app = new splunkjs.Service.Application(this.loggedOutService, "sdk-app-collection"); - app.updateInfo(function (err, info, app) { - assert.ok(err); - done(); - }); - } - }; + it("Callback#updateInfo failure", function (done) { + var app = new splunkjs.Service.Application(this.loggedOutService, "sdk-app-collection"); + app.updateInfo(function (err, info, app) { + assert.ok(err); + done(); + }); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/serverinfo.js b/tests/service_tests/serverinfo.js index c5d1f8d7b..20d833ead 100644 --- a/tests/service_tests/serverinfo.js +++ b/tests/service_tests/serverinfo.js @@ -1,27 +1,29 @@ -var assert = require('chai').assert; exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Callback#Basic": function (done) { - var service = this.service; - - service.serverInfo(function (err, info) { - assert.ok(!err); - assert.ok(info); - assert.strictEqual(info.name, "server-info"); - assert.ok(info.properties().hasOwnProperty("version")); - assert.ok(info.properties().hasOwnProperty("serverName")); - assert.ok(info.properties().hasOwnProperty("os_version")); - + var assert = require('chai').assert; + return ( + describe("Server Info Test", function () { + beforeEach(function (done) { + this.service = svc; done(); - }); - } - }; + }) + + it("Callback#Basic", function (done) { + var service = this.service; + + service.serverInfo(function (err, info) { + assert.ok(!err); + assert.ok(info); + assert.strictEqual(info.name, "server-info"); + assert.ok(info.properties().hasOwnProperty("version")); + assert.ok(info.properties().hasOwnProperty("serverName")); + assert.ok(info.properties().hasOwnProperty("os_version")); + + done(); + }); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/storagepasswords.js b/tests/service_tests/storagepasswords.js index b6ae37830..7802994e3 100644 --- a/tests/service_tests/storagepasswords.js +++ b/tests/service_tests/storagepasswords.js @@ -1,616 +1,615 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -var Async = splunkjs.Async; -var idCounter = 0; - -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, - - "Callback#Create": function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create with backslashes": function (done) { - var startcount = -1; - var name = "\\delete-me-" + getNextId(); - var realm = "\\delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual("\\" + realm + ":\\" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create with slashes": function (done) { - var startcount = -1; - var name = "/delete-me-" + getNextId(); - var realm = "/delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create without realm": function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual("", storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create should fail without user, or realm": function (done) { - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - storagePasswords.create({ name: null, password: "changed!" }, done); - } - ], - function (err) { - assert.ok(err); - done(); - } - ); - }, - - "Callback#Create should fail without password": function (done) { - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - storagePasswords.create({ name: "something", password: null }, done); - } - ], - function (err) { - assert.ok(err); - done(); - } - ); - }, - - "Callback#Create should fail without user, realm, or password": function (done) { - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - storagePasswords.create({ name: null, password: null }, done); - } - ], - function (err) { - assert.ok(err); - done(); - } - ); - }, - - "Callback#Create with colons": function (done) { - var startcount = -1; - var name = ":delete-me-" + getNextId(); - var realm = ":delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual("\\" + realm + ":\\" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create crazy": function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ - name: name + ":end!@#$%^&*()_+{}:|<>?", - realm: ":start::!@#$%^&*()_+{}:|<>?" + realm, - password: "changed!" - }, - done); - }, - function (storagePassword, done) { - assert.strictEqual(name + ":end!@#$%^&*()_+{}:|<>?", storagePassword.properties().username); - assert.strictEqual("\\:start\\:\\:!@#$%^&*()_+{}\\:|<>?" + realm + ":" + name + "\\:end!@#$%^&*()_+{}\\:|<>?:", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(":start::!@#$%^&*()_+{}:|<>?" + realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Create with unicode chars": function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ - name: name + ":end!@#$%^&*()_+{}:|<>?쎼 and 쎶 and <&> für", - realm: ":start::!@#$%^&*()_+{}:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm, - password: decodeURIComponent(encodeURIComponent("쎼 and 쎶 and <&> für")) - }, - done); - }, - function (storagePassword, done) { - assert.strictEqual(name + ":end!@#$%^&*()_+{}:|<>?쎼 and 쎶 and <&> für", storagePassword.properties().username); - assert.strictEqual("\\:start\\:\\:!@#$%^&*()_+{}\\:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm + ":" + name + "\\:end!@#$%^&*()_+{}\\:|<>?쎼 and 쎶 and <&> für:", storagePassword.name); - assert.strictEqual(decodeURIComponent(encodeURIComponent("쎼 and 쎶 and <&> für")), storagePassword.properties().clear_password); - assert.strictEqual(":start::!@#$%^&*()_+{}:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Read": function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - try { - assert.ok(!!storagePasswords.item(realm + ":" + name + ":")); + var assert = require('chai').assert; + var splunkjs = require('../../index'); + var Async = splunkjs.Async; + var idCounter = 0; + var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); + }; + return ( + describe("Storage Password Tests", function () { + beforeEach(function (done) { + this.service = svc; + done(); + }); + + it("Callback#Create", function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); } - catch (e) { - assert.ok(false); + ], + function (err) { + assert.ok(!err); + done(); } - - var list = storagePasswords.list(); - var found = false; - - assert.strictEqual(startcount + 1, list.length); - for (var i = 0; i < list.length; i++) { - if (realm + ":" + name + ":" === list[i].name) { - found = true; - } + ); + }) + + it("Callback#Create with backslashes", function (done) { + var startcount = -1; + var name = "\\delete-me-" + getNextId(); + var realm = "\\delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual("\\" + realm + ":\\" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); } - assert.ok(found); - - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Callback#Read with slashes": function (done) { - var startcount = -1; - var name = "/delete-me-" + getNextId(); - var realm = "/delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - try { - assert.ok(!!storagePasswords.item(realm + ":" + name + ":")); + ], + function (err) { + assert.ok(!err); + done(); } - catch (e) { - assert.ok(false); + ); + }) + + it("Callback#Create with slashes", function (done) { + var startcount = -1; + var name = "/delete-me-" + getNextId(); + var realm = "/delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); } - - var list = storagePasswords.list(); - var found = false; - - assert.strictEqual(startcount + 1, list.length); - for (var i = 0; i < list.length; i++) { - if (realm + ":" + name + ":" === list[i].name) { - found = true; - } + ], + function (err) { + assert.ok(!err); + done(); } - assert.ok(found); - - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }, + ); + }) + + it("Callback#Create without realm", function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual("", storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Create should fail without user, or realm", function (done) { + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + storagePasswords.create({ name: null, password: "changed!" }, done); + } + ], + function (err) { + assert.ok(err); + done(); + } + ); + }) + + it("Callback#Create should fail without password", function (done) { + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + storagePasswords.create({ name: "something", password: null }, done); + } + ], + function (err) { + assert.ok(err); + done(); + } + ); + }) + + it("Callback#Create should fail without user, realm, or password", function (done) { + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + storagePasswords.create({ name: null, password: null }, done); + } + ], + function (err) { + assert.ok(err); + done(); + } + ); + }) + + it("Callback#Create with colons", function (done) { + var startcount = -1; + var name = ":delete-me-" + getNextId(); + var realm = ":delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual("\\" + realm + ":\\" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Create crazy", function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ + name: name + ":end!@#$%^&*()_+{}:|<>?", + realm: ":start::!@#$%^&*()_+{}:|<>?" + realm, + password: "changed!" + }, + done); + }, + function (storagePassword, done) { + assert.strictEqual(name + ":end!@#$%^&*()_+{}:|<>?", storagePassword.properties().username); + assert.strictEqual("\\:start\\:\\:!@#$%^&*()_+{}\\:|<>?" + realm + ":" + name + "\\:end!@#$%^&*()_+{}\\:|<>?:", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(":start::!@#$%^&*()_+{}:|<>?" + realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Create with unicode chars", function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ + name: name + ":end!@#$%^&*()_+{}:|<>?쎼 and 쎶 and <&> für", + realm: ":start::!@#$%^&*()_+{}:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm, + password: decodeURIComponent(encodeURIComponent("쎼 and 쎶 and <&> für")) + }, + done); + }, + function (storagePassword, done) { + assert.strictEqual(name + ":end!@#$%^&*()_+{}:|<>?쎼 and 쎶 and <&> für", storagePassword.properties().username); + assert.strictEqual("\\:start\\:\\:!@#$%^&*()_+{}\\:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm + ":" + name + "\\:end!@#$%^&*()_+{}\\:|<>?쎼 and 쎶 and <&> für:", storagePassword.name); + assert.strictEqual(decodeURIComponent(encodeURIComponent("쎼 and 쎶 and <&> für")), storagePassword.properties().clear_password); + assert.strictEqual(":start::!@#$%^&*()_+{}:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Read", function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + try { + assert.ok(!!storagePasswords.item(realm + ":" + name + ":")); + } + catch (e) { + assert.ok(false); + } - // Disabling this test because clear_password field has been removed in Splunk 8.2 - // - // - // "Callback#Update": function(done) { - // var startcount = -1; - // var name = "delete-me-" + getNextId(); - // var realm = "delete-me-" + getNextId(); - // var that = this; - // Async.chain([ - // function(done) { - // that.service.storagePasswords().fetch(done); - // }, - // function(storagePasswords, done) { - // startcount = storagePasswords.list().length; - // storagePasswords.create({name: name, realm: realm, password: "changed!"}, done); - // }, - // function(storagePassword, done) { - // assert.strictEqual(name, storagePassword.properties().username); - // assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - // assert.strictEqual("changed!", storagePassword.properties().clear_password); - // assert.strictEqual(realm, storagePassword.properties().realm); - // that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - // }, - // function(storagePasswords, storagePassword, done) { - // assert.strictEqual(startcount + 1, storagePasswords.list().length); - // storagePassword.update({password: "changed"}, done); - // }, - // function(storagePassword, done) { - // assert.strictEqual(name, storagePassword.properties().username); - // assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - // assert.strictEqual("changed", storagePassword.properties().clear_password); - // assert.strictEqual(realm, storagePassword.properties().realm); - // that.service.storagePasswords().fetch(done); - // }, - // function(storagePasswords, done) { - // var list = storagePasswords.list(); - // var found = false; - // var index = -1; + var list = storagePasswords.list(); + var found = false; - // assert.strictEqual(startcount + 1, list.length); - // for (var i = 0; i < list.length; i ++) { - // if (realm + ":" + name + ":" === list[i].name) { - // found = true; - // index = i; - // assert.strictEqual(name, list[i].properties().username); - // assert.strictEqual(realm + ":" + name + ":", list[i].name); - // assert.strictEqual("changed", list[i].properties().clear_password); - // assert.strictEqual(realm, list[i].properties().realm); - // } - // } - // assert.ok(found); + assert.strictEqual(startcount + 1, list.length); + for (var i = 0; i < list.length; i++) { + if (realm + ":" + name + ":" === list[i].name) { + found = true; + } + } + assert.ok(found); - // if (!found) { - // done(new Error("Didn't find the created password")); - // } - // else { - // list[index].remove(done); - // } - // }, - // function(done) { - // that.service.storagePasswords().fetch(done); - // }, - // function(storagePasswords, done) { - // assert.strictEqual(startcount, storagePasswords.list().length); - // done(); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Read with slashes", function (done) { + var startcount = -1; + var name = "/delete-me-" + getNextId(); + var realm = "/delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + try { + assert.ok(!!storagePasswords.item(realm + ":" + name + ":")); + } + catch (e) { + assert.ok(false); + } - "Callback#Delete": function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - var list = storagePasswords.list(); - var found = false; - var index = -1; + var list = storagePasswords.list(); + var found = false; - assert.strictEqual(startcount + 1, list.length); - for (var i = 0; i < list.length; i++) { - if (realm + ":" + name + ":" === list[i].name) { - found = true; - index = i; - assert.strictEqual(name, list[i].properties().username); - assert.strictEqual(realm + ":" + name + ":", list[i].name); - assert.strictEqual("changed!", list[i].properties().clear_password); - assert.strictEqual(realm, list[i].properties().realm); + assert.strictEqual(startcount + 1, list.length); + for (var i = 0; i < list.length; i++) { + if (realm + ":" + name + ":" === list[i].name) { + found = true; + } } + assert.ok(found); + + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); + } + ], + function (err) { + assert.ok(!err); + done(); } - assert.ok(found); + ); + }) + + // Disabling this test because clear_password field has been removed in Splunk 8.2 + // + // + // it("Callback#Update": function(done) { + // var startcount = -1; + // var name = "delete-me-" + getNextId(); + // var realm = "delete-me-" + getNextId(); + // var that = this; + // Async.chain([ + // function(done) { + // that.service.storagePasswords().fetch(done); + // }, + // function(storagePasswords, done) { + // startcount = storagePasswords.list().length; + // storagePasswords.create({name: name, realm: realm, password: "changed!"}, done); + // }, + // function(storagePassword, done) { + // assert.strictEqual(name, storagePassword.properties().username); + // assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + // assert.strictEqual("changed!", storagePassword.properties().clear_password); + // assert.strictEqual(realm, storagePassword.properties().realm); + // that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + // }, + // function(storagePasswords, storagePassword, done) { + // assert.strictEqual(startcount + 1, storagePasswords.list().length); + // storagePassword.update({password: "changed"}, done); + // }, + // function(storagePassword, done) { + // assert.strictEqual(name, storagePassword.properties().username); + // assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + // assert.strictEqual("changed", storagePassword.properties().clear_password); + // assert.strictEqual(realm, storagePassword.properties().realm); + // that.service.storagePasswords().fetch(done); + // }, + // function(storagePasswords, done) { + // var list = storagePasswords.list(); + // var found = false; + // var index = -1; + + // assert.strictEqual(startcount + 1, list.length); + // for (var i = 0; i < list.length; i ++) { + // if (realm + ":" + name + ":" === list[i].name) { + // found = true; + // index = i; + // assert.strictEqual(name, list[i].properties().username); + // assert.strictEqual(realm + ":" + name + ":", list[i].name); + // assert.strictEqual("changed", list[i].properties().clear_password); + // assert.strictEqual(realm, list[i].properties().realm); + // } + // } + // assert.ok(found); + + // if (!found) { + // done(new Error("Didn't find the created password")); + // } + // else { + // list[index].remove(done); + // } + // }, + // function(done) { + // that.service.storagePasswords().fetch(done); + // }, + // function(storagePasswords, done) { + // assert.strictEqual(startcount, storagePasswords.list().length); + // done(); + // } + // ], + // function(err) { + // assert.ok(!err); + // done(); + // } + // ); + // }, + + it("Callback#Delete", function (done) { + var startcount = -1; + var name = "delete-me-" + getNextId(); + var realm = "delete-me-" + getNextId(); + var that = this; + Async.chain([ + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + startcount = storagePasswords.list().length; + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + assert.strictEqual(realm + ":" + name + ":", storagePassword.name); + assert.strictEqual("changed!", storagePassword.properties().clear_password); + assert.strictEqual(realm, storagePassword.properties().realm); + that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); + }, + function (storagePasswords, storagePassword, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + storagePassword.remove(done); + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); + }, + function (storagePassword, done) { + assert.strictEqual(name, storagePassword.properties().username); + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount + 1, storagePasswords.list().length); + var list = storagePasswords.list(); + var found = false; + var index = -1; + + assert.strictEqual(startcount + 1, list.length); + for (var i = 0; i < list.length; i++) { + if (realm + ":" + name + ":" === list[i].name) { + found = true; + index = i; + assert.strictEqual(name, list[i].properties().username); + assert.strictEqual(realm + ":" + name + ":", list[i].name); + assert.strictEqual("changed!", list[i].properties().clear_password); + assert.strictEqual(realm, list[i].properties().realm); + } + } + assert.ok(found); - if (!found) { - done(new Error("Didn't find the created password")); + if (!found) { + done(new Error("Didn't find the created password")); + } + else { + list[index].remove(done); + } + }, + function (done) { + that.service.storagePasswords().fetch(done); + }, + function (storagePasswords, done) { + assert.strictEqual(startcount, storagePasswords.list().length); + done(); } - else { - list[index].remove(done); + ], + function (err) { + assert.ok(!err); + done(); } - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - } - }; + ); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/typeahead.js b/tests/service_tests/typeahead.js index d7806ddc2..88687679e 100644 --- a/tests/service_tests/typeahead.js +++ b/tests/service_tests/typeahead.js @@ -1,42 +1,44 @@ -var assert = require('chai').assert; exports.setup = function (svc, loggedOutSvc) { - return { - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }, - - "Callback#Typeahead failure": function (done) { - var service = this.loggedOutService; - service.typeahead("index=", 1, function (err, options) { - assert.ok(err); + var assert = require('chai').assert; + return ( + describe("Typeahad Tests", function () { + beforeEach(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; done(); - }); - }, + }) - "Callback#Basic typeahead": function (done) { - var service = this.service; + it("Callback#Typeahead failure", function (done) { + var service = this.loggedOutService; + service.typeahead("index=", 1, function (err, options) { + assert.ok(err); + done(); + }); + }) - service.typeahead("index=", 1, function (err, options) { - assert.ok(!err); - assert.ok(options); - assert.strictEqual(options.length, 1); - assert.ok(options[0]); - done(); - }); - }, + it("Callback#Basic typeahead", function (done) { + var service = this.service; - "Typeahead with omitted optional arguments": function (done) { - var service = this.service; - service.typeahead("index=", function (err, options) { - assert.ok(!err); - assert.ok(options); - done(); - }); - } - }; + service.typeahead("index=", 1, function (err, options) { + assert.ok(!err); + assert.ok(options); + assert.strictEqual(options.length, 1); + assert.ok(options[0]); + done(); + }); + }) + + it("Typeahead with omitted optional arguments", function (done) { + var service = this.service; + service.typeahead("index=", function (err, options) { + assert.ok(!err); + assert.ok(options); + done(); + }); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/user.js b/tests/service_tests/user.js index 370f1ea9d..173f2a6a6 100644 --- a/tests/service_tests/user.js +++ b/tests/service_tests/user.js @@ -1,252 +1,253 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -var Async = splunkjs.Async; -var utils = splunkjs.Utils; -var idCounter = 0; - -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; exports.setup = function (svc, loggedOutSvc) { - return { - beforeEach: function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }, - - afterEach: function (done) { - this.service.logout(done); - }, - - "Callback#Current user": function (done) { - var service = this.service; - - service.currentUser(function (err, user) { - assert.ok(!err); - assert.ok(user); - assert.strictEqual(user.name, service.username); - done(); - }); - }, + var assert = require('chai').assert; + var splunkjs = require('../../index'); + var Async = splunkjs.Async; + var utils = splunkjs.Utils; + var idCounter = 0; - "Callback#Current user fails": function (done) { - var service = this.loggedOutService; + var getNextId = function () { + return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); + }; + return ( + describe("User Tests", function () { - service.currentUser(function (err, user) { - assert.ok(err); + beforeEach(function (done) { + this.service = svc; + this.loggedOutService = loggedOutSvc; done(); - }); - }, + }) - "Callback#List users": function (done) { - var service = this.service; + afterEach(function (done) { + this.service.logout(done); + }) - service.users().fetch(function (err, users) { - var userList = users.list(); - assert.ok(!err); - assert.ok(users); + it("Callback#Current user", function (done) { + var service = this.service; - assert.ok(userList); - assert.ok(userList.length > 0); - done(); - }); - }, - - "Callback#create user failure": function (done) { - this.loggedOutService.users().create( - { name: "jssdk_testuser", password: "abcdefg!", roles: "user" }, - function (err, response) { - assert.ok(err); - done(); - } - ); - }, - - "Callback#Create + update + delete user": function (done) { - var service = this.service; - var name = "jssdk_testuser"; - - Async.chain([ - function (done) { - service.users().create({ name: "jssdk_testuser", password: "abcdefg!", roles: "user" }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.name, name); - assert.strictEqual(user.properties().roles.length, 1); - assert.strictEqual(user.properties().roles[0], "user"); - - user.update({ realname: "JS SDK", roles: ["admin", "user"] }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.properties().realname, "JS SDK"); - assert.strictEqual(user.properties().roles.length, 2); - assert.strictEqual(user.properties().roles[0], "admin"); - assert.strictEqual(user.properties().roles[1], "user"); - - user.remove(done); - } - ], - function (err) { + service.currentUser(function (err, user) { assert.ok(!err); - done(); - } - ); - }, - - "Callback#Roles": function (done) { - var service = this.service; - var name = "jssdk_testuser_" + getNextId(); - - Async.chain([ - function (done) { - service.users().create({ name: name, password: "abcdefg!", roles: "user" }, done); - }, - function (user, done) { assert.ok(user); - assert.strictEqual(user.name, name); - assert.strictEqual(user.properties().roles.length, 1); - assert.strictEqual(user.properties().roles[0], "user"); + assert.strictEqual(user.name, service.username); + done(); + }); + }) - user.update({ roles: ["admin", "user"] }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.properties().roles.length, 2); - assert.strictEqual(user.properties().roles[0], "admin"); - assert.strictEqual(user.properties().roles[1], "user"); + it("Callback#Current user fails", function (done) { + var service = this.loggedOutService; - user.update({ roles: "user" }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.properties().roles.length, 1); - assert.strictEqual(user.properties().roles[0], "user"); - - user.update({ roles: "__unknown__" }, done); - } - ], - function (err) { + service.currentUser(function (err, user) { assert.ok(err); - assert.strictEqual(err.status, 400); done(); - } - ); - }, + }); + }) - "Callback#Passwords": function (done) { - var service = this.service; - var newService = null; - var name = "jssdk_testuser_" + getNextId(); + it("Callback#List users", function (done) { + var service = this.service; - var firstPassword = "abcdefg!"; - var secondPassword = "hijklmn!"; + service.users().fetch(function (err, users) { + var userList = users.list(); + assert.ok(!err); + assert.ok(users); - var useOldPassword = false; + assert.ok(userList); + assert.ok(userList.length > 0); + done(); + }); + }) - Async.chain([ - function (done) { - service.serverInfo(done); - }, - function (info, done) { - var versionParts = info.properties().version.split("."); + it("Callback#create user failure", function (done) { + this.loggedOutService.users().create( + { name: "jssdk_testuser", password: "abcdefg!", roles: "user" }, + function (err, response) { + assert.ok(err); + done(); + } + ); + }) + + it("Callback#Create + update + delete user", function (done) { + var service = this.service; + var name = "jssdk_testuser"; + + Async.chain([ + function (done) { + service.users().create({ name: "jssdk_testuser", password: "abcdefg!", roles: "user" }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.name, name); + assert.strictEqual(user.properties().roles.length, 1); + assert.strictEqual(user.properties().roles[0], "user"); + + user.update({ realname: "JS SDK", roles: ["admin", "user"] }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.properties().realname, "JS SDK"); + assert.strictEqual(user.properties().roles.length, 2); + assert.strictEqual(user.properties().roles[0], "admin"); + assert.strictEqual(user.properties().roles[1], "user"); + + user.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + + it("Callback#Roles", function (done) { + var service = this.service; + var name = "jssdk_testuser_" + getNextId(); + + Async.chain([ + function (done) { + service.users().create({ name: name, password: "abcdefg!", roles: "user" }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.name, name); + assert.strictEqual(user.properties().roles.length, 1); + assert.strictEqual(user.properties().roles[0], "user"); + + user.update({ roles: ["admin", "user"] }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.properties().roles.length, 2); + assert.strictEqual(user.properties().roles[0], "admin"); + assert.strictEqual(user.properties().roles[1], "user"); + + user.update({ roles: "user" }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.properties().roles.length, 1); + assert.strictEqual(user.properties().roles[0], "user"); + + user.update({ roles: "__unknown__" }, done); + } + ], + function (err) { + assert.ok(err); + assert.strictEqual(err.status, 400); + done(); + } + ); + }) - var isDevBuild = versionParts.length === 1; - var newerThan72 = (parseInt(versionParts[0], 10) > 7 || - (parseInt(versionParts[0], 10) === 7 && parseInt(versionParts[1], 10) >= 2)); + it("Callback#Passwords", function (done) { + var service = this.service; + var newService = null; + var name = "jssdk_testuser_" + getNextId(); - if (isDevBuild || newerThan72) { - useOldPassword = true; - } - done(); - }, - function (done) { - service.users().create({ name: name, password: firstPassword, roles: "user" }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.name, name); - assert.strictEqual(user.properties().roles.length, 1); - assert.strictEqual(user.properties().roles[0], "user"); - - newService = new splunkjs.Service(service.http, { - username: name, - password: firstPassword, - host: service.host, - port: service.port, - scheme: service.scheme, - version: service.version - }); - - newService.login(Async.augment(done, user)); - }, - function (success, user, done) { - assert.ok(success); - assert.ok(user); + var firstPassword = "abcdefg!"; + var secondPassword = "hijklmn!"; - var body = { - password: secondPassword - }; - if (useOldPassword) { - body['oldpassword'] = firstPassword; - } + var useOldPassword = false; - user.update(body, done); - }, - function (user, done) { - newService.login(function (err, success) { - assert.ok(err); - assert.ok(!success); + Async.chain([ + function (done) { + service.serverInfo(done); + }, + function (info, done) { + var versionParts = info.properties().version.split("."); + + var isDevBuild = versionParts.length === 1; + var newerThan72 = (parseInt(versionParts[0], 10) > 7 || + (parseInt(versionParts[0], 10) === 7 && parseInt(versionParts[1], 10) >= 2)); + + if (isDevBuild || newerThan72) { + useOldPassword = true; + } + done(); + }, + function (done) { + service.users().create({ name: name, password: firstPassword, roles: "user" }, done); + }, + function (user, done) { + assert.ok(user); + assert.strictEqual(user.name, name); + assert.strictEqual(user.properties().roles.length, 1); + assert.strictEqual(user.properties().roles[0], "user"); + + newService = new splunkjs.Service(service.http, { + username: name, + password: firstPassword, + host: service.host, + port: service.port, + scheme: service.scheme, + version: service.version + }); + + newService.login(Async.augment(done, user)); + }, + function (success, user, done) { + assert.ok(success); + assert.ok(user); var body = { - password: firstPassword + password: secondPassword }; if (useOldPassword) { - body['oldpassword'] = secondPassword; + body['oldpassword'] = firstPassword; } user.update(body, done); - }); - }, - function (user, done) { - assert.ok(user); - newService.login(done); - } - ], - function (err) { - assert.ok(!err, JSON.stringify(err)); - done(); - } - ); - }, - - "Callback#delete test users": function (done) { - var users = this.service.users(); - users.fetch(function (err, users) { - var userList = users.list(); - - Async.parallelEach( - userList, - function (user, idx, callback) { - if (utils.startsWith(user.name, "jssdk_")) { - user.remove(callback); - } - else { - callback(); - } - }, function (err) { - assert.ok(!err); + }, + function (user, done) { + newService.login(function (err, success) { + assert.ok(err); + assert.ok(!success); + + var body = { + password: firstPassword + }; + if (useOldPassword) { + body['oldpassword'] = secondPassword; + } + + user.update(body, done); + }); + }, + function (user, done) { + assert.ok(user); + newService.login(done); + } + ], + function (err) { + assert.ok(!err, JSON.stringify(err)); done(); } ); - }); - } - }; + }) + + it("Callback#delete test users", function (done) { + var users = this.service.users(); + users.fetch(function (err, users) { + var userList = users.list(); + + Async.parallelEach( + userList, + function (user, idx, callback) { + if (utils.startsWith(user.name, "jssdk_")) { + user.remove(callback); + } + else { + callback(); + } + }, function (err) { + assert.ok(!err); + done(); + } + ); + }); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/service_tests/view.js b/tests/service_tests/view.js index 907206746..7d8b97ef6 100644 --- a/tests/service_tests/view.js +++ b/tests/service_tests/view.js @@ -1,67 +1,68 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -var Async = splunkjs.Async; exports.setup = function (svc) { - return { - beforeEach: function (done) { - this.service = svc; - done(); - }, + var assert = require('chai').assert; + var splunkjs = require('../../index'); + var Async = splunkjs.Async; + return ( + describe("Views ", function () { + + beforeEach(function (done) { + this.service = svc; + done(); + }) - "Callback#List views": function (done) { - var service = this.service; + it("Callback#List views", function (done) { + var service = this.service; - service.views({ owner: "admin", app: "search" }).fetch(function (err, views) { - assert.ok(!err); - assert.ok(views); + service.views({ owner: "admin", app: "search" }).fetch(function (err, views) { + assert.ok(!err); + assert.ok(views); - var viewsList = views.list(); - assert.ok(viewsList); - assert.ok(viewsList.length > 0); + var viewsList = views.list(); + assert.ok(viewsList); + assert.ok(viewsList.length > 0); - for (var i = 0; i < viewsList.length; i++) { - assert.ok(viewsList[i]); - } + for (var i = 0; i < viewsList.length; i++) { + assert.ok(viewsList[i]); + } - done(); - }); - }, - - "Callback#Create + update + delete view": function (done) { - var service = this.service; - var name = "jssdk_testview"; - var originalData = ""; - var newData = ""; - - Async.chain([ - function (done) { - service.views({ owner: "admin", app: "sdk-app-collection" }).create({ name: name, "eai:data": originalData }, done); - }, - function (view, done) { - assert.ok(view); - - assert.strictEqual(view.name, name); - assert.strictEqual(view.properties()["eai:data"], originalData); - - view.update({ "eai:data": newData }, done); - }, - function (view, done) { - assert.ok(view); - assert.strictEqual(view.properties()["eai:data"], newData); - - view.remove(done); - } - ], - function (err) { - assert.ok(!err); done(); - } - ); - } - }; + }); + }) + + it("Callback#Create + update + delete view", function (done) { + var service = this.service; + var name = "jssdk_testview"; + var originalData = ""; + var newData = ""; + + Async.chain([ + function (done) { + service.views({ owner: "admin", app: "sdkappcollection" }).create({ name: name, "eai:data": originalData }, done); + }, + function (view, done) { + assert.ok(view); + + assert.strictEqual(view.name, name); + assert.strictEqual(view.properties()["eai:data"], originalData); + + view.update({ "eai:data": newData }, done); + }, + function (view, done) { + assert.ok(view); + assert.strictEqual(view.properties()["eai:data"], newData); + + view.remove(done); + } + ], + function (err) { + assert.ok(!err); + done(); + } + ); + }) + }) + ); }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/test_async.js b/tests/test_async.js index 4df52d904..c7b542f52 100644 --- a/tests/test_async.js +++ b/tests/test_async.js @@ -20,514 +20,518 @@ exports.setup = function () { var isBrowser = typeof "window" !== "undefined"; splunkjs.Logger.setLevel("ALL"); - return { - "While success": function (done) { - var i = 0; - Async.whilst( - function () { return i++ < 3; }, - function (done) { - Async.sleep(0, function () { done(); }); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "While success deep": function (done) { - var i = 0; - Async.whilst( - function () { return i++ < (isBrowser ? 100 : 10000); }, - function (done) { - Async.sleep(0, function () { done(); }); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "While error": function (done) { - var i = 0; - Async.whilst( - function () { return i++ < (isBrowser ? 100 : 10000); }, - function (done) { - Async.sleep(0, function () { done(i === (isBrowser ? 50 : 10000) ? 1 : null); }); - }, - function (err) { - assert.ok(err); - assert.strictEqual(err, 1); - done(); - } - ); - }, - - "Whilst sans condition is never": function (done) { - var i = false; - Async.whilst( - undefined, - function (done) { i = true; done(); }, - function (err) { - assert.strictEqual(i, false); - done(); - } - ); - }, - - "Whilst with empty body does nothing": function (done) { - var i = true; - Async.whilst( - function () { - if (i) { - i = false; - return true; + return ( + describe('Async tests', function () { + + it("While success", function (done) { + var i = 0; + Async.whilst( + function () { return i++ < 3; }, + function (done) { + Async.sleep(0, function () { done(); }); + }, + function (err) { + assert.ok(!err); + done(); } - else { - return i; + ); + }); + + it("While success deep", function (done) { + var i = 0; + Async.whilst( + function () { return i++ < (isBrowser ? 100 : 10000); }, + function (done) { + Async.sleep(0, function () { done(); }); + }, + function (err) { + assert.ok(!err); + done(); } - }, - undefined, - function (err) { - done(); - } - ); - }, - - "Parallel success": function (done) { - Async.parallel([ - function (done) { - done(null, 1); - }, - function (done) { - done(null, 2, 3); - }], - function (err, one, two) { - assert.ok(!err); - assert.strictEqual(one, 1); - assert.strictEqual(two[0], 2); - assert.strictEqual(two[1], 3); - done(); - } - ); - }, - - "Parallel success - outside of arrays": function (done) { - Async.parallel( - function (done) { done(null, 1); }, - function (done) { done(null, 2, 3); }, - function (err, one, two) { - assert.ok(!err); - assert.strictEqual(one, 1); - assert.strictEqual(two[0], 2); - assert.strictEqual(two[1], 3); - done(); - }); - }, - - "Parallel success - no reordering": function (done) { - Async.parallel([ - function (done) { - Async.sleep(1, function () { done(null, 1); }); - }, - function (done) { - done(null, 2, 3); - }], - function (err, one, two) { - assert.ok(!err); - assert.strictEqual(one, 1); - assert.strictEqual(two[0], 2); - assert.strictEqual(two[1], 3); - done(); - } - ); - }, - - "Parallel error": function (done) { - Async.parallel([ - function (done) { - done(null, 1); - }, - function (done) { - done(null, 2, 3); - }, - function (done) { - Async.sleep(0, function () { - done("ERROR"); - }); - }], - function (err, one, two) { - assert.ok(err === "ERROR"); - assert.ok(!one); - assert.ok(!two); - done(); - } - ); - }, - - "Parallel no tasks": function (done) { - Async.parallel( - [], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Series success": function (done) { - Async.series([ - function (done) { - done(null, 1); - }, - function (done) { - done(null, 2, 3); - }], - function (err, one, two) { - assert.ok(!err); - assert.strictEqual(one, 1); - assert.strictEqual(two[0], 2); - assert.strictEqual(two[1], 3); - done(); - } - ); - }, - - "Series success - outside of array": function (done) { - Async.series( - function (done) { - done(null, 1); - }, - function (done) { - done(null, 2, 3); - }, - function (err, one, two) { - assert.ok(!err); - assert.strictEqual(one, 1); - assert.strictEqual(two[0], 2); - assert.strictEqual(two[1], 3); - done(); - } - ); - }, - - "Series reordering success": function (done) { - var keeper = 0; - Async.series([ - function (done) { - Async.sleep(10, function () { - assert.strictEqual(keeper++, 0); + ); + }); + + it("While error", function (done) { + var i = 0; + Async.whilst( + function () { return i++ < (isBrowser ? 100 : 10000); }, + function (done) { + Async.sleep(0, function () { done(i === (isBrowser ? 50 : 10000) ? 1 : null); }); + }, + function (err) { + assert.ok(err); + assert.strictEqual(err, 1); + done(); + } + ); + }); + + it("Whilst sans condition is never", function (done) { + var i = false; + Async.whilst( + undefined, + function (done) { i = true; done(); }, + function (err) { + assert.strictEqual(i, false); + done(); + } + ); + }); + + it("Whilst with empty body does nothing", function (done) { + var i = true; + Async.whilst( + function () { + if (i) { + i = false; + return true; + } + else { + return i; + } + }, + undefined, + function (err) { + done(); + } + ); + }); + + it("Parallel success", function (done) { + Async.parallel([ + function (done) { done(null, 1); + }, + function (done) { + done(null, 2, 3); + }], + function (err, one, two) { + assert.ok(!err); + assert.strictEqual(one, 1); + assert.strictEqual(two[0], 2); + assert.strictEqual(two[1], 3); + done(); + } + ); + }); + + it("Parallel success - outside of arrays", function (done) { + Async.parallel( + function (done) { done(null, 1); }, + function (done) { done(null, 2, 3); }, + function (err, one, two) { + assert.ok(!err); + assert.strictEqual(one, 1); + assert.strictEqual(two[0], 2); + assert.strictEqual(two[1], 3); + done(); }); - }, - function (done) { - assert.strictEqual(keeper++, 1); - done(null, 2, 3); - }], - function (err, one, two) { - assert.ok(!err); - assert.strictEqual(keeper, 2); - assert.strictEqual(one, 1); - assert.strictEqual(two[0], 2); - assert.strictEqual(two[1], 3); - done(); - } - ); - }, - - "Series error": function (done) { - Async.series([ - function (done) { - done(null, 1); - }, - function (done) { - done("ERROR", 2, 3); - }], - function (err, one, two) { - assert.strictEqual(err, "ERROR"); - assert.ok(!one); - assert.ok(!two); - done(); - } - ); - }, - - "Series no tasks": function (done) { - Async.series( - [], - function (err) { - assert.ok(!err); - done(); - } - ); - }, - - "Parallel map success": function (done) { - Async.parallelMap( - [1, 2, 3], - function (val, idx, done) { - done(null, val + 1); - }, - function (err, vals) { - assert.ok(!err); - assert.strictEqual(vals[0], 2); - assert.strictEqual(vals[1], 3); - assert.strictEqual(vals[2], 4); - done(); - } - ); - }, - - "Parallel map reorder success": function (done) { - Async.parallelMap( - [1, 2, 3], - function (val, idx, done) { - if (val === 2) { - Async.sleep(100, function () { done(null, val + 1); }); + }); + + it("Parallel success - no reordering", function (done) { + Async.parallel([ + function (done) { + Async.sleep(1, function () { done(null, 1); }); + }, + function (done) { + done(null, 2, 3); + }], + function (err, one, two) { + assert.ok(!err); + assert.strictEqual(one, 1); + assert.strictEqual(two[0], 2); + assert.strictEqual(two[1], 3); + done(); } - else { - done(null, val + 1); + ); + }); + + it("Parallel error", function (done) { + Async.parallel([ + function (done) { + done(null, 1); + }, + function (done) { + done(null, 2, 3); + }, + function (done) { + Async.sleep(0, function () { + done("ERROR"); + }); + }], + function (err, one, two) { + assert.ok(err === "ERROR"); + assert.ok(!one); + assert.ok(!two); + done(); } - }, - function (err, vals) { - assert.strictEqual(vals[0], 2); - assert.strictEqual(vals[1], 3); - assert.strictEqual(vals[2], 4); - done(); - } - ); - }, - - "Parallel map error": function (done) { - Async.parallelMap( - [1, 2, 3], - function (val, idx, done) { - if (val === 2) { - done(5); + ); + }); + + it("Parallel no tasks", function (done) { + Async.parallel( + [], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("Series success", function (done) { + Async.series([ + function (done) { + done(null, 1); + }, + function (done) { + done(null, 2, 3); + }], + function (err, one, two) { + assert.ok(!err); + assert.strictEqual(one, 1); + assert.strictEqual(two[0], 2); + assert.strictEqual(two[1], 3); + done(); + } + ); + }); + + it("Series success - outside of array", function (done) { + Async.series( + function (done) { + done(null, 1); + }, + function (done) { + done(null, 2, 3); + }, + function (err, one, two) { + assert.ok(!err); + assert.strictEqual(one, 1); + assert.strictEqual(two[0], 2); + assert.strictEqual(two[1], 3); + done(); + } + ); + }); + + it("Series reordering success", function (done) { + var keeper = 0; + Async.series([ + function (done) { + Async.sleep(10, function () { + assert.strictEqual(keeper++, 0); + done(null, 1); + }); + }, + function (done) { + assert.strictEqual(keeper++, 1); + done(null, 2, 3); + }], + function (err, one, two) { + assert.ok(!err); + assert.strictEqual(keeper, 2); + assert.strictEqual(one, 1); + assert.strictEqual(two[0], 2); + assert.strictEqual(two[1], 3); + done(); } - else { + ); + }); + + it("Series error", function (done) { + Async.series([ + function (done) { + done(null, 1); + }, + function (done) { + done("ERROR", 2, 3); + }], + function (err, one, two) { + assert.strictEqual(err, "ERROR"); + assert.ok(!one); + assert.ok(!two); + done(); + } + ); + }); + + it("Series no tasks", function (done) { + Async.series( + [], + function (err) { + assert.ok(!err); + done(); + } + ); + }); + + it("Parallel map success", function (done) { + Async.parallelMap( + [1, 2, 3], + function (val, idx, done) { done(null, val + 1); + }, + function (err, vals) { + assert.ok(!err); + assert.strictEqual(vals[0], 2); + assert.strictEqual(vals[1], 3); + assert.strictEqual(vals[2], 4); + done(); } - }, - function (err, vals) { - assert.ok(err); - assert.ok(!vals); - assert.strictEqual(err, 5); - done(); - } - ); - }, - - "Series map success": function (done) { - var keeper = 1; - Async.seriesMap( - [1, 2, 3], - function (val, idx, done) { - assert.strictEqual(keeper++, val); - done(null, val + 1); - }, - function (err, vals) { - assert.ok(!err); - assert.strictEqual(vals[0], 2); - assert.strictEqual(vals[1], 3); - assert.strictEqual(vals[2], 4); - assert.strictEqual(vals[2], keeper); - done(); - } - ); - }, - - "Series map error": function (done) { - Async.seriesMap( - [1, 2, 3], - function (val, idx, done) { - if (val === 2) { - done(5); + ); + }); + + it("Parallel map reorder success", function (done) { + Async.parallelMap( + [1, 2, 3], + function (val, idx, done) { + if (val === 2) { + Async.sleep(100, function () { done(null, val + 1); }); + } + else { + done(null, val + 1); + } + }, + function (err, vals) { + assert.strictEqual(vals[0], 2); + assert.strictEqual(vals[1], 3); + assert.strictEqual(vals[2], 4); + done(); } - else { + ); + }); + + it("Parallel map error", function (done) { + Async.parallelMap( + [1, 2, 3], + function (val, idx, done) { + if (val === 2) { + done(5); + } + else { + done(null, val + 1); + } + }, + function (err, vals) { + assert.ok(err); + assert.ok(!vals); + assert.strictEqual(err, 5); + done(); + } + ); + }); + + it("Series map success", function (done) { + var keeper = 1; + Async.seriesMap( + [1, 2, 3], + function (val, idx, done) { + assert.strictEqual(keeper++, val); done(null, val + 1); + }, + function (err, vals) { + assert.ok(!err); + assert.strictEqual(vals[0], 2); + assert.strictEqual(vals[1], 3); + assert.strictEqual(vals[2], 4); + assert.strictEqual(vals[2], keeper); + done(); } - }, - function (err, vals) { - assert.ok(err); - assert.ok(!vals); - assert.strictEqual(err, 5); - done(); - } - ); - }, - - "Chain single success": function (done) { - Async.chain([ - function (callback) { - callback(null, 1); - }, - function (val, callback) { - callback(null, val + 1); - }, - function (val, callback) { - callback(null, val + 1); - }], - function (err, val) { - assert.ok(!err); - assert.strictEqual(val, 3); - done(); - } - ); - }, - - "Chain flat single success": function (done) { - Async.chain( - function (callback) { - callback(null, 1); - }, - function (val, callback) { - callback(null, val + 1); - }, - function (val, callback) { - callback(null, val + 1); - }, - function (err, val) { - assert.ok(!err); - assert.strictEqual(val, 3); - done(); - } - ); - }, - - "Chain flat multiple success": function (done) { - Async.chain( - function (callback) { - callback(null, 1, 2); - }, - function (val1, val2, callback) { - callback(null, val1 + 1, val2 + 1); - }, - function (val1, val2, callback) { - callback(null, val1 + 1, val2 + 1); - }, - function (err, val1, val2) { - assert.ok(!err); - assert.strictEqual(val1, 3); - assert.strictEqual(val2, 4); - done(); - } - ); - }, - - "Chain flat arity change success": function (done) { - Async.chain( - function (callback) { - callback(null, 1, 2); - }, - function (val1, val2, callback) { - callback(null, val1 + 1); - }, - function (val1, callback) { - callback(null, val1 + 1, 5); - }, - function (err, val1, val2) { - assert.ok(!err); - assert.strictEqual(val1, 3); - assert.strictEqual(val2, 5); - done(); - } - ); - }, - - "Chain error": function (done) { - Async.chain([ - function (callback) { - callback(null, 1, 2); - }, - function (val1, val2, callback) { - callback(5, val1 + 1); - }, - function (val1, callback) { - callback(null, val1 + 1, 5); - }], - function (err, val1, val2) { - assert.ok(err); - assert.ok(!val1); - assert.ok(!val2); - assert.strictEqual(err, 5); - done(); - } - ); - }, - - "Chain no tasks": function (done) { - Async.chain([], - function (err, val1, val2) { - assert.ok(!err); - assert.ok(!val1); - assert.ok(!val2); - done(); - } - ); - }, - - "Parallel each reodrder success": function (done) { - var total = 0; - Async.parallelEach( - [1, 2, 3], - function (val, idx, done) { - var go = function () { - total += val; + ); + }); + + it("Series map error", function (done) { + Async.seriesMap( + [1, 2, 3], + function (val, idx, done) { + if (val === 2) { + done(5); + } + else { + done(null, val + 1); + } + }, + function (err, vals) { + assert.ok(err); + assert.ok(!vals); + assert.strictEqual(err, 5); done(); - }; - - if (idx === 1) { - Async.sleep(100, go); } - else { - go(); + ); + }); + + it("Chain single success", function (done) { + Async.chain([ + function (callback) { + callback(null, 1); + }, + function (val, callback) { + callback(null, val + 1); + }, + function (val, callback) { + callback(null, val + 1); + }], + function (err, val) { + assert.ok(!err); + assert.strictEqual(val, 3); + done(); } - }, - function (err) { - assert.ok(!err); - assert.strictEqual(total, 6); - done(); - } - ); - }, - - "Series each success": function (done) { - var results = [1, 3, 6]; - var total = 0; - Async.seriesEach( - [1, 2, 3], - function (val, idx, done) { - total += val; - assert.strictEqual(total, results[idx]); - done(); - }, - function (err) { - assert.ok(!err); - assert.strictEqual(total, 6); + ); + }); + + it("Chain flat single success", function (done) { + Async.chain( + function (callback) { + callback(null, 1); + }, + function (val, callback) { + callback(null, val + 1); + }, + function (val, callback) { + callback(null, val + 1); + }, + function (err, val) { + assert.ok(!err); + assert.strictEqual(val, 3); + done(); + } + ); + }); + + it("Chain flat multiple success", function (done) { + Async.chain( + function (callback) { + callback(null, 1, 2); + }, + function (val1, val2, callback) { + callback(null, val1 + 1, val2 + 1); + }, + function (val1, val2, callback) { + callback(null, val1 + 1, val2 + 1); + }, + function (err, val1, val2) { + assert.ok(!err); + assert.strictEqual(val1, 3); + assert.strictEqual(val2, 4); + done(); + } + ); + }); + + it("Chain flat arity change success", function (done) { + Async.chain( + function (callback) { + callback(null, 1, 2); + }, + function (val1, val2, callback) { + callback(null, val1 + 1); + }, + function (val1, callback) { + callback(null, val1 + 1, 5); + }, + function (err, val1, val2) { + assert.ok(!err); + assert.strictEqual(val1, 3); + assert.strictEqual(val2, 5); + done(); + } + ); + }); + + it("Chain error", function (done) { + Async.chain([ + function (callback) { + callback(null, 1, 2); + }, + function (val1, val2, callback) { + callback(5, val1 + 1); + }, + function (val1, callback) { + callback(null, val1 + 1, 5); + }], + function (err, val1, val2) { + assert.ok(err); + assert.ok(!val1); + assert.ok(!val2); + assert.strictEqual(err, 5); + done(); + } + ); + }); + + it("Chain no tasks", function (done) { + Async.chain([], + function (err, val1, val2) { + assert.ok(!err); + assert.ok(!val1); + assert.ok(!val2); + done(); + } + ); + }); + + it("Parallel each reodrder success", function (done) { + var total = 0; + Async.parallelEach( + [1, 2, 3], + function (val, idx, done) { + var go = function () { + total += val; + done(); + }; + + if (idx === 1) { + Async.sleep(100, go); + } + else { + go(); + } + }, + function (err) { + assert.ok(!err); + assert.strictEqual(total, 6); + done(); + } + ); + }); + + it("Series each success", function (done) { + var results = [1, 3, 6]; + var total = 0; + Async.seriesEach( + [1, 2, 3], + function (val, idx, done) { + total += val; + assert.strictEqual(total, results[idx]); + done(); + }, + function (err) { + assert.ok(!err); + assert.strictEqual(total, 6); + done(); + } + ); + }); + + it("Augment callback", function (done) { + var callback = function (a, b) { + assert.ok(a); + assert.ok(b); + assert.strictEqual(a, 1); + assert.strictEqual(b, 2); + done(); - } - ); - }, - - "Augment callback": function (done) { - var callback = function (a, b) { - assert.ok(a); - assert.ok(b); - assert.strictEqual(a, 1); - assert.strictEqual(b, 2); - - done(); - }; - - var augmented = Async.augment(callback, 2); - augmented(1); - } - }; + }; + + var augmented = Async.augment(callback, 2); + augmented(1); + }); + + }) + ); }; // Run the individual test suite -if (module === require.cache[__filename] && !module.parent) { - module.exports = exports.setup(); -} +// if (module === require.cache[__filename] && !module.parent) { +// module.exports = exports.setup(); +// } diff --git a/tests/test_context.js b/tests/test_context.js index 7c9a71438..c1c29e08c 100644 --- a/tests/test_context.js +++ b/tests/test_context.js @@ -23,28 +23,28 @@ exports.setup = function (svc) { splunkjs.Logger.setLevel("ALL"); var isBrowser = typeof window !== "undefined"; - var suite = { - "General Context Test": { - before: function (done) { + var suite = ( + describe("General Context Test", function (done) { + before(function (done) { this.service = svc; done(); - }, + }); - "Service exists": function (done) { + it("Service exists", function (done) { assert.ok(this.service); done(); - }, + }); - "Create test search": function (done) { + it("Create test search", function (done) { // The search created here is used by several of the following tests, specifically those using get() var searchID = "DELETEME_JSSDK_UNITTEST"; this.service.post("search/jobs", { search: "search index=_internal | head 1", exec_mode: "blocking", id: searchID }, function (err, res) { assert.ok(res.data.sid); done(); }); - }, + }); - "Callback#login": function (done) { + it("Callback#login", function (done) { var newService = new splunkjs.Service(svc.http, { scheme: svc.scheme, host: svc.host, @@ -58,9 +58,9 @@ exports.setup = function (svc) { assert.ok(success); done(); }); - }, + }); - "Callback#login fail": function (done) { + it("Callback#login fail", function (done) { var newService = new splunkjs.Service(svc.http, { scheme: svc.scheme, host: svc.host, @@ -79,9 +79,9 @@ exports.setup = function (svc) { else { done(); } - }, + }); - "Callback#get": function (done) { + it("Callback#get", function (done) { this.service.get("search/jobs", { count: 1 }, function (err, res) { assert.strictEqual(res.data.paging.offset, 0); assert.ok(res.data.entry.length <= res.data.paging.total); @@ -89,17 +89,17 @@ exports.setup = function (svc) { assert.ok(res.data.entry[0].content.sid); done(); }); - }, + }); - "Callback#get error": function (done) { + it("Callback#get error", function (done) { this.service.get("search/jobs/1234_nosuchjob", {}, function (res) { assert.ok(!!res); assert.strictEqual(res.status, 404); done(); }); - }, + }); - "Callback#get autologin - success": function (done) { + it("Callback#get autologin - success", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -118,9 +118,9 @@ exports.setup = function (svc) { assert.ok(res.data.entry[0].content.sid); done(); }); - }, + }); - "Callback#get autologin - error": function (done) { + it("Callback#get autologin - error", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -137,10 +137,10 @@ exports.setup = function (svc) { assert.strictEqual(err.status, 401); done(); }); - }, + }); - "Callback#get autologin - disabled": function (done) { + it("Callback#get autologin - disabled", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -158,9 +158,9 @@ exports.setup = function (svc) { assert.strictEqual(err.status, 401); done(); }); - }, + }); - "Callback#get relogin - success": function (done) { + it("Callback#get relogin - success", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -181,9 +181,9 @@ exports.setup = function (svc) { assert.ok(res.data.entry[0].content.sid); done(); }); - }, + }); - "Callback#get relogin - error": function (done) { + it("Callback#get relogin - error", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -201,9 +201,9 @@ exports.setup = function (svc) { assert.strictEqual(err.status, 401); done(); }); - }, + }); - "Callback#post": function (done) { + it("Callback#post", function (done) { var service = this.service; this.service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { var sid = res.data.sid; @@ -216,17 +216,17 @@ exports.setup = function (svc) { ); } ); - }, + }); - "Callback#post error": function (done) { + it("Callback#post error", function (done) { this.service.post("search/jobs", { search: "index_internal | head 1" }, function (res) { assert.ok(!!res); assert.strictEqual(res.status, 400); done(); }); - }, + }); - "Callback#post autologin - success": function (done) { + it("Callback#post autologin - success", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -249,9 +249,9 @@ exports.setup = function (svc) { ); } ); - }, + }); - "Callback#post autologin - error": function (done) { + it("Callback#post autologin - error", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -268,9 +268,9 @@ exports.setup = function (svc) { assert.strictEqual(err.status, 401); done(); }); - }, + }); - "Callback#post autologin - disabled": function (done) { + it("Callback#post autologin - disabled", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -288,9 +288,9 @@ exports.setup = function (svc) { assert.strictEqual(err.status, 401); done(); }); - }, + }); - "Callback#post relogin - success": function (done) { + it("Callback#post relogin - success", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -314,9 +314,9 @@ exports.setup = function (svc) { ); } ); - }, + }); - "Callback#post relogin - error": function (done) { + it("Callback#post relogin - error", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -334,9 +334,9 @@ exports.setup = function (svc) { assert.strictEqual(err.status, 401); done(); }); - }, + }); - "Callback#delete": function (done) { + it("Callback#delete", function (done) { var service = this.service; this.service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { var sid = res.data.sid; @@ -347,17 +347,17 @@ exports.setup = function (svc) { done(); }); }); - }, + }); - "Callback#delete error": function (done) { + it("Callback#delete error", function (done) { this.service.del("search/jobs/1234_nosuchjob", {}, function (res) { assert.ok(!!res); assert.strictEqual(res.status, 404); done(); }); - }, + }); - "Callback#delete autologin - success": function (done) { + it("Callback#delete autologin - success", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -379,9 +379,9 @@ exports.setup = function (svc) { done(); }); }); - }, + }); - "Callback#delete autologin - error": function (done) { + it("Callback#delete autologin - error", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -398,9 +398,9 @@ exports.setup = function (svc) { assert.strictEqual(err.status, 401); done(); }); - }, + }); - "Callback#delete autologin - disabled": function (done) { + it("Callback#delete autologin - disabled", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -418,9 +418,9 @@ exports.setup = function (svc) { assert.strictEqual(err.status, 401); done(); }); - }, + }); - "Callback#delete relogin - success": function (done) { + it("Callback#delete relogin - success", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -443,9 +443,9 @@ exports.setup = function (svc) { done(); }); }); - }, + }); - "Callback#delete relogin - error": function (done) { + it("Callback#delete relogin - error", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -463,9 +463,9 @@ exports.setup = function (svc) { assert.strictEqual(err.status, 401); done(); }); - }, + }); - "Callback#request get": function (done) { + it("Callback#request get", function (done) { var get = { count: 1 }; var post = null; var body = null; @@ -481,9 +481,9 @@ exports.setup = function (svc) { done(); }); - }, + }); - "Callback#request post": function (done) { + it("Callback#request post", function (done) { var body = "search=" + encodeURIComponent("search index=_internal | head 1"); var headers = { "Content-Type": "application/x-www-form-urlencoded" @@ -498,9 +498,9 @@ exports.setup = function (svc) { done(); }); }); - }, + }); - "Callback#request error": function (done) { + it("Callback#request error", function (done) { this.service.request("search/jobs/1234_nosuchjob", "GET", null, null, null, { "X-TestHeader": 1 }, function (res) { assert.ok(!!res); @@ -511,9 +511,9 @@ exports.setup = function (svc) { assert.strictEqual(res.status, 404); done(); }); - }, + }); - "Callback#request autologin - success": function (done) { + it("Callback#request autologin - success", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -540,9 +540,9 @@ exports.setup = function (svc) { done(); }); - }, + }); - "Callback#request autologin - error": function (done) { + it("Callback#request autologin - error", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -562,9 +562,9 @@ exports.setup = function (svc) { assert.strictEqual(err.status, 401); done(); }); - }, + }); - "Callback#request autologin - disabled": function (done) { + it("Callback#request autologin - disabled", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -585,9 +585,9 @@ exports.setup = function (svc) { assert.strictEqual(err.status, 401); done(); }); - }, + }); - "Callback#request relogin - success": function (done) { + it("Callback#request relogin - success", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -615,9 +615,9 @@ exports.setup = function (svc) { done(); }); - }, + }); - "Callback#request relogin - error": function (done) { + it("Callback#request relogin - error", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -638,9 +638,9 @@ exports.setup = function (svc) { assert.strictEqual(err.status, 401); done(); }); - }, + }); - "Callback#abort": function (done) { + it("Callback#abort", function (done) { var req = this.service.get("search/jobs", { count: 1 }, function (err, res) { assert.ok(!res); assert.ok(err); @@ -650,9 +650,9 @@ exports.setup = function (svc) { }); req.abort(); - }, + }); - "Callback#timeout default test": function (done) { + it("Callback#timeout default test", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -669,9 +669,9 @@ exports.setup = function (svc) { assert.ok(res); done(); }); - }, + }); - "Callback#timeout timed test": function (done) { + it("Callback#timeout timed test", function (done) { var service = new splunkjs.Service( { scheme: this.service.scheme, @@ -689,7 +689,7 @@ exports.setup = function (svc) { assert.ok(res); done(); }); - }, + }); // This test is not stable, commenting it out until we figure it out // "Callback#timeout fail -- FAILS INTERMITTENTLY": function(done){ @@ -716,15 +716,15 @@ exports.setup = function (svc) { // }); // }, - "Cancel test search": function (done) { + it("Cancel test search", function (done) { // Here, the search created for several of the previous tests is terminated, it is no longer necessary var endpoint = "search/jobs/DELETEME_JSSDK_UNITTEST/control"; this.service.post(endpoint, { action: "cancel" }, function (err, res) { done(); }); - }, + }); - "fullpath gets its owner/app from the right places": function (done) { + it("fullpath gets its owner/app from the right places", function (done) { var http = tutils.DummyHttp; var ctx = new splunkjs.Context(http, { /*nothing*/ }); @@ -746,9 +746,9 @@ exports.setup = function (svc) { var ctx3 = new splunkjs.Context(http, { owner: "alpha@beta.com", app: "beta" }); assert.strictEqual(ctx3.fullpath("meep"), "/servicesNS/alpha%40beta.com/beta/meep"); done(); - }, + }); - "version check": function (done) { + it("version check", function (done) { var http = tutils.DummyHttp; var ctx; @@ -784,10 +784,11 @@ exports.setup = function (svc) { assert.ok(ctx.versionCompare("5.0") === 0); done(); - } - }, - "Cookie Tests": { - before: function (done) { + }); + }), + + describe("Cookie Tests", function (done) { + before(function (done) { this.service = svc; this.skip = false; var that = this; @@ -801,13 +802,13 @@ exports.setup = function (svc) { } done(); }); - }, + }); - tearDown: function (done) { + after(function (done) { this.service.logout(done); - }, + }); - "_getCookieString works as expected": function (done) { + it("_getCookieString works as expected", function (done) { var service = new splunkjs.Service( { scheme: svc.scheme, @@ -825,9 +826,9 @@ exports.setup = function (svc) { assert.strictEqual(cookieString, expectedCookieString); done(); - }, + }); - "login and store cookie": function (done) { + it("login and store cookie", function (done) { if (this.skip) { done(); return; @@ -852,9 +853,9 @@ exports.setup = function (svc) { assert.notStrictEqual(service.http._getCookieString(), ''); done(); }); - }, + }); - "request with cookie": function (done) { + it("request with cookie", function (done) { if (this.skip) { done(); return; @@ -904,9 +905,9 @@ exports.setup = function (svc) { done(); } ); - }, + }); - "request fails with bad cookie": function (done) { + it("request fails with bad cookie", function (done) { if (this.skip) { done(); return; @@ -931,9 +932,9 @@ exports.setup = function (svc) { assert.strictEqual(err.status, 401); done(); }); - }, + }); - "autologin with cookie": function (done) { + it("autologin with cookie", function (done) { if (this.skip) { done(); return; @@ -956,9 +957,9 @@ exports.setup = function (svc) { assert.ok(service.http._cookieStore); done(); }); - }, + }); - "login fails with no cookie and no sessionKey": function (done) { + it("login fails with no cookie and no sessionKey", function (done) { if (this.skip) { done(); return; @@ -982,9 +983,9 @@ exports.setup = function (svc) { assert.ok(err); done(); }); - }, + }); - "login with multiple cookies": function (done) { + it("login with multiple cookies", function (done) { if (this.skip) { done(); return; @@ -1039,9 +1040,9 @@ exports.setup = function (svc) { done(); } ); - }, + }); - "autologin with cookie and bad sessionKey": function (done) { + it("autologin with cookie and bad sessionKey", function (done) { if (this.skip) { done(); return; @@ -1064,9 +1065,10 @@ exports.setup = function (svc) { assert.ok(service.http._cookieStore); done(); }); - } - } - }; + }); + }) + ) + return suite; }; diff --git a/tests/test_examples.js b/tests/test_examples.js index 1c18a01d0..b3bbcde30 100644 --- a/tests/test_examples.js +++ b/tests/test_examples.js @@ -25,108 +25,108 @@ exports.setup = function (svc, opts) { splunkjs.Logger.setLevel("ALL"); - return { - "Hello World Tests": { - "Apps": function (done) { + return ( + describe("Hello World Tests", function (done) { + it("Apps", function (done) { var main = require("../examples/node/helloworld/apps").main; main(opts, done); - }, + }); - "Apps#Async": function (done) { + it("Apps#Async", function (done) { var main = require("../examples/node/helloworld/apps_async").main; main(opts, done); - }, + }); - "Pivot#Async": function (done) { + it("Pivot#Async", function (done) { var main = require("../examples/node/helloworld/pivot_async").main; main(opts, done); - }, + }); - "Fired Alerts": function (done) { + it("Fired Alerts", function (done) { var main = require("../examples/node/helloworld/firedalerts").main; main(opts, done); - }, + }); - "Fired Alerts#Async": function (done) { + it("Fired Alerts#Async", function (done) { var main = require("../examples/node/helloworld/firedalerts_async").main; main(opts, done); - }, + }); - "Fired Alerts#Create": function (done) { + it("Fired Alerts#Create", function (done) { var main = require("../examples/node/helloworld/firedalerts_create").main; main(opts, done); - }, + }); - "Fired Alerts#Delete": function (done) { + it("Fired Alerts#Delete", function (done) { var main = require("../examples/node/helloworld/firedalerts_delete").main; main(opts, done); - }, + }); - "Get Job by sid": function (done) { + it("Get Job by sid", function (done) { var main = require("../examples/node/helloworld/get_job").main; main(opts, done); - }, + }); - "Endpoint Instantiation": function (done) { + it("Endpoint Instantiation", function (done) { var main = require("../examples/node/helloworld/endpoint_instantiation").main; main(opts, done); - }, + }); - "Saved Searches": function (done) { + it("Saved Searches", function (done) { var main = require("../examples/node/helloworld/savedsearches").main; main(opts, done); - }, + }); - "Saved Searches#Async": function (done) { + it("Saved Searches#Async", function (done) { var main = require("../examples/node/helloworld/savedsearches_async").main; main(opts, done); - }, + }); - "Saved Searches#Delete": function (done) { + it("Saved Searches#Delete", function (done) { var main = require("../examples/node/helloworld/savedsearches_delete").main; main(opts, done); - }, + }); - "Saved Searches#Create": function (done) { + it("Saved Searches#Create", function (done) { var main = require("../examples/node/helloworld/savedsearches_create").main; main(opts, done); - }, + }); - "Saved Searches#Delete Again": function (done) { + it("Saved Searches#Delete Again", function (done) { var main = require("../examples/node/helloworld/savedsearches_delete").main; main(opts, done); - }, + }); - "Search#normal": function (done) { + it("Search#normal", function (done) { var main = require("../examples/node/helloworld/search_normal").main; main(opts, done); - }, + }); - "Search#blocking": function (done) { + it("Search#blocking", function (done) { var main = require("../examples/node/helloworld/search_blocking").main; main(opts, done); - }, + }); - "Search#oneshot": function (done) { + it("Search#oneshot", function (done) { var main = require("../examples/node/helloworld/search_oneshot").main; main(opts, done); - }, + }); - "Search#realtime": function (done) { + it("Search#realtime", function (done) { this.timeout(40000) var main = require("../examples/node/helloworld/search_realtime").main; main(opts, done); - }, + }); - "Logging": function (done) { + it("Logging", function (done) { var main = require("../examples/node/helloworld/log").main; main(opts, done); - } - }, + }) + }), - "Jobs Example Tests": { - beforeEach: function (done) { + describe("Jobs Example Tests", function (done) { + beforeEach(function (done) { var context = this; this.main = require("../examples/node/jobs").main; @@ -155,23 +155,23 @@ exports.setup = function (svc, opts) { }; done(); - }, + }); - "help": function (done) { + it("help", function (done) { this.run(null, null, null, function (err) { assert.ok(!!err); done(); }); - }, + }); - "List jobs": function (done) { + it("List jobs", function (done) { this.run("list", null, null, function (err) { assert.ok(!err); done(); }); - }, + }); - "Create job": function (done) { + it("Create job", function (done) { var create = { search: "search index=_internal | head 1", id: getNextId() @@ -185,9 +185,9 @@ exports.setup = function (svc, opts) { done(); }); }); - }, + }); - "Cancel job": function (done) { + it("Cancel job", function (done) { var create = { search: "search index=_internal | head 1", id: getNextId() @@ -201,9 +201,9 @@ exports.setup = function (svc, opts) { done(); }); }); - }, + }); - "List job properties": function (done) { + it("List job properties", function (done) { var create = { search: "search index=_internal | head 1", id: getNextId() @@ -220,9 +220,9 @@ exports.setup = function (svc, opts) { }); }); }); - }, + }); - "List job events": function (done) { + it("List job events", function (done) { var create = { search: "search index=_internal | head 1", id: getNextId() @@ -239,9 +239,9 @@ exports.setup = function (svc, opts) { }); }); }); - }, + }); - "List job preview": function (done) { + it("List job preview", function (done) { var create = { search: "search index=_internal | head 1", id: getNextId() @@ -258,9 +258,9 @@ exports.setup = function (svc, opts) { }); }); }); - }, + }); - "List job results": function (done) { + it("List job results", function (done) { var create = { search: "search index=_internal | head 1", id: getNextId() @@ -277,9 +277,9 @@ exports.setup = function (svc, opts) { }); }); }); - }, + }); - "List job results, by column": function (done) { + it("List job results, by column", function (done) { var create = { search: "search index=_internal | head 1", id: getNextId() @@ -296,9 +296,9 @@ exports.setup = function (svc, opts) { }); }); }); - }, + }); - "Create+list multiple jobs": function (done) { + it("Create+list multiple jobs", function (done) { var creates = []; for (var i = 0; i < 3; i++) { creates[i] = { @@ -334,11 +334,11 @@ exports.setup = function (svc, opts) { } ); - } - }, + }) + }), - "Search Example Tests": { - beforeEach: function (done) { + describe("Search Example Tests", function (done) { + beforeEach(function (done) { var context = this; this.main = require("../examples/node/search").main; @@ -367,9 +367,9 @@ exports.setup = function (svc, opts) { }; done(); - }, + }); - "Create regular search": function (done) { + it("Create regular search", function (done) { var options = { search: "search index=_internal | head 5" }; @@ -378,9 +378,9 @@ exports.setup = function (svc, opts) { assert.ok(!err); done(); }); - }, + }); - "Create regular search with verbose": function (done) { + it("Create regular search with verbose", function (done) { var options = { search: "search index=_internal | head 5" }; @@ -389,9 +389,9 @@ exports.setup = function (svc, opts) { assert.ok(!err); done(); }); - }, + }); - "Create oneshot search": function (done) { + it("Create oneshot search", function (done) { var options = { search: "search index=_internal | head 5", exec_mode: "oneshot" @@ -401,9 +401,9 @@ exports.setup = function (svc, opts) { assert.ok(!err); done(); }); - }, + }); - "Create normal search with reduced count": function (done) { + it("Create normal search with reduced count", function (done) { var options = { search: "search index=_internal | head 20", count: 10 @@ -413,8 +413,8 @@ exports.setup = function (svc, opts) { assert.ok(!err); done(); }); - } - } + }) + }) // This test is commented out because it causes a failure/hang on // Node >0.6. We need to revisit this test, so disabling it for now. @@ -469,7 +469,7 @@ exports.setup = function (svc, opts) { done(); } }*/ - }; + ) }; // Run the individual test suite diff --git a/tests/test_http.js b/tests/test_http.js index 454506051..94cbd6615 100644 --- a/tests/test_http.js +++ b/tests/test_http.js @@ -19,15 +19,14 @@ exports.setup = function (http) { splunkjs.Logger.setLevel("ALL"); - return { - - "HTTP GET Tests": { - before: function (done) { + return ( + describe("HTTP GET Tests", function (done) { + before(function (done) { this.http = http; done(); - }, + }); - "Callback#abort simple": function (done) { + it("Callback#abort simple", function (done) { var req = this.http.get("https://httpbin.org/get", {}, {}, 0, function (err, res) { assert.ok(err); assert.strictEqual(err.error, "abort"); @@ -35,9 +34,9 @@ exports.setup = function (http) { }); req.abort(); - }, + }); - "Callback#abort delay": function (done) { + it("Callback#abort delay", function (done) { var req = this.http.get("https://httpbin.org/delay/20", {}, {}, 0, function (err, res) { assert.ok(err); assert.strictEqual(err.error, "abort"); @@ -47,32 +46,32 @@ exports.setup = function (http) { splunkjs.Async.sleep(1000, function () { req.abort(); }); - }, + }); - "Callback#no args": function (done) { + it("Callback#no args", function (done) { this.http.get("https://httpbin.org/get", [], {}, 0, function (err, res) { assert.strictEqual(res.data.url, "https://httpbin.org/get"); done(); }); - }, + }); - "Callback#success success+error": function (done) { + it("Callback#success success+error", function (done) { this.http.get("https://httpbin.org/get", [], {}, 0, function (err, res) { assert.ok(!err); assert.strictEqual(res.data.url, "https://httpbin.org/get"); done(); }); - }, + }); - "Callback#error all": function (done) { + it("Callback#error all", function (done) { this.timeout(40000); this.http.get("https://httpbin.org/status/404", [], {}, 0, function (err, res) { assert.strictEqual(err.status, 404); done(); }); - }, + }); - "Callback#args": function (done) { + it("Callback#args", function (done) { this.timeout(40000); this.http.get("https://httpbin.org/get", [], { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { var args = res.data.args; @@ -83,9 +82,9 @@ exports.setup = function (http) { assert.strictEqual(res.data.url, "https://httpbin.org/get?a=1&b=2&c=1&c=2&c=3&d=a%2Fb"); done(); }); - }, + }); - "Callback#args with objects": function (done) { + it("Callback#args with objects", function (done) { this.timeout(40000); this.http.get( "https://httpbin.org/get", [], @@ -101,9 +100,9 @@ exports.setup = function (http) { done(); } ); - }, + }); - "Callback#headers": function (done) { + it("Callback#headers", function (done) { var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; this.http.get("https://httpbin.org/get", { "X-Test1": 1, "X-Test2": "a/b/c" }, {}, 0, function (err, res) { @@ -118,9 +117,9 @@ exports.setup = function (http) { assert.strictEqual(res.data.url, "https://httpbin.org/get"); done(); }); - }, + }); - "Callback#all": function (done) { + it("Callback#all", function (done) { var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; this.http.get("https://httpbin.org/get", { "X-Test1": 1, "X-Test2": "a/b/c" }, { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { @@ -140,38 +139,38 @@ exports.setup = function (http) { assert.strictEqual(res.data.url, "https://httpbin.org/get?a=1&b=2&c=1&c=2&c=3&d=a%2Fb"); done(); }); - } - }, + }); + }), - "HTTP POST Tests": { - before: function (done) { + describe("HTTP POST Tests", function (done) { + before(function (done) { this.http = http; done(); - }, + }); - "Callback#no args": function (done) { + it("Callback#no args", function (done) { this.http.post("https://httpbin.org/post", {}, {}, 0, function (err, res) { assert.strictEqual(res.data.url, "https://httpbin.org/post"); done(); }); - }, + }); - "Callback#success success+error": function (done) { + it("Callback#success success+error", function (done) { this.http.post("https://httpbin.org/post", {}, {}, 0, function (err, res) { assert.ok(!err); assert.strictEqual(res.data.url, "https://httpbin.org/post"); done(); }); - }, + }); - "Callback#error all": function (done) { + it("Callback#error all", function (done) { this.http.post("https://httpbin.org/status/405", {}, {}, 0, function (err, res) { assert.strictEqual(err.status, 405); done(); }); - }, + }); - "Callback#args": function (done) { + it("Callback#args", function (done) { this.http.post("https://httpbin.org/post", {}, { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { var args = res.data.form; assert.strictEqual(args.a, "1"); @@ -181,9 +180,9 @@ exports.setup = function (http) { assert.strictEqual(res.data.url, "https://httpbin.org/post"); done(); }); - }, + }); - "Callback#headers": function (done) { + it("Callback#headers", function (done) { var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; this.http.post("https://httpbin.org/post", { "X-Test1": 1, "X-Test2": "a/b/c" }, {}, 0, function (err, res) { @@ -197,9 +196,9 @@ exports.setup = function (http) { assert.strictEqual(res.data.url, "https://httpbin.org/post"); done(); }); - }, + }); - "Callback#all": function (done) { + it("Callback#all", function (done) { var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; this.http.post("https://httpbin.org/post", { "X-Test1": 1, "X-Test2": "a/b/c" }, { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { @@ -219,45 +218,45 @@ exports.setup = function (http) { assert.strictEqual(res.data.url, "https://httpbin.org/post"); done(); }); - } - }, + }) + }), - "HTTP DELETE Tests": { - before: function (done) { + describe("HTTP DELETE Tests", function (done) { + before(function (done) { this.http = http; done(); - }, + }); - "Callback#no args": function (done) { + it("Callback#no args", function (done) { this.http.del("https://httpbin.org/delete", [], {}, 0, function (err, res) { assert.strictEqual(res.data.url, "https://httpbin.org/delete"); done(); }); - }, + }); - "Callback#success success+error": function (done) { + it("Callback#success success+error", function (done) { this.http.del("https://httpbin.org/delete", [], {}, 0, function (err, res) { assert.ok(!err); assert.strictEqual(res.data.url, "https://httpbin.org/delete"); done(); }); - }, + }); - "Callback#error all": function (done) { + it("Callback#error all", function (done) { this.http.del("https://httpbin.org/status/405", [], {}, 0, function (err, res) { assert.strictEqual(err.status, 405); done(); }); - }, + }); - "Callback#args": function (done) { + it("Callback#args", function (done) { this.http.del("https://httpbin.org/delete", [], { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { assert.strictEqual(res.data.url, "https://httpbin.org/delete?a=1&b=2&c=1&c=2&c=3&d=a%2Fb"); done(); }); - }, + }); - "Callback#headers": function (done) { + it("Callback#headers", function (done) { var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; this.http.del("https://httpbin.org/delete", { "X-Test1": 1, "X-Test2": "a/b/c" }, {}, 0, function (err, res) { @@ -271,9 +270,9 @@ exports.setup = function (http) { assert.strictEqual(res.data.url, "https://httpbin.org/delete"); done(); }); - }, + }); - "Callback#all": function (done) { + it("Callback#all", function (done) { var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; this.http.del("https://httpbin.org/delete", { "X-Test1": 1, "X-Test2": "a/b/c" }, { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { @@ -287,23 +286,23 @@ exports.setup = function (http) { assert.strictEqual(res.data.url, "https://httpbin.org/delete?a=1&b=2&c=1&c=2&c=3&d=a%2Fb"); done(); }); - }, + }); - "Default arguments to Http work": function (done) { + it("Default arguments to Http work", function (done) { var NodeHttp = splunkjs.NodeHttp; var h = new NodeHttp(); assert.ok(h); done(); - }, + }); - "Methods of Http base class that must be overrided": function (done) { + it("Methods of Http base class that must be overrided", function (done) { var h = new splunkjs.Http(); assert.throws(function () { h.makeRequest("asdf", null, null); }); assert.throws(function () { h.parseJson("{}"); }); done(); - } - } - }; + }) + }) + ) }; // Run the individual test suite diff --git a/tests/test_log.js b/tests/test_log.js index aa0f219ac..a0bdb118e 100644 --- a/tests/test_log.js +++ b/tests/test_log.js @@ -28,62 +28,64 @@ exports.setup = function () { return {}; } else { - return { - "Default level with no environment variable": function (done) { - var oldVal = process.env.LOG_LEVEL; - delete process.env.LOG_LEVEL; - unload("log.js"); - var logger = require("../lib/log.js"); - assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.ERROR); - process.env.LOG_LEVEL = oldVal; - unload("log.js"); - done(); - }, + return ( + describe('Log tests', function () { + it("Default level with no environment variable", function (done) { + var oldVal = process.env.LOG_LEVEL; + delete process.env.LOG_LEVEL; + unload("log.js"); + var logger = require("../lib/log.js"); + assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.ERROR); + process.env.LOG_LEVEL = oldVal; + unload("log.js"); + done(); + }); - "Setting a nonexistant level default to errors": function (done) { - var oldVal = process.env.LOG_LEVEL; - process.env.LOG_LEVEL = "25"; - unload("log.js"); - var logger = require("../lib/log.js"); - assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.ERROR); - process.env.LOG_LEVEL = oldVal; - unload("log.js"); - done(); - }, + it("Setting a nonexistant level default to errors", function (done) { + var oldVal = process.env.LOG_LEVEL; + process.env.LOG_LEVEL = "25"; + unload("log.js"); + var logger = require("../lib/log.js"); + assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.ERROR); + process.env.LOG_LEVEL = oldVal; + unload("log.js"); + done(); + }); - "Setting logging level as integer works": function (done) { - var oldVal = process.env.LOG_LEVEL; - process.env.LOG_LEVEL = "3"; - unload("log.js"); - var logger = require("../lib/log.js"); - assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.INFO); - process.env.LOG_LEVEL = oldVal; - unload("log.js"); - done(); - }, + it("Setting logging level as integer works", function (done) { + var oldVal = process.env.LOG_LEVEL; + process.env.LOG_LEVEL = "3"; + unload("log.js"); + var logger = require("../lib/log.js"); + assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.INFO); + process.env.LOG_LEVEL = oldVal; + unload("log.js"); + done(); + }); - "Setting logging level as string works": function (done) { - var oldVal = process.env.LOG_LEVEL; - process.env.LOG_LEVEL = "INFO"; - unload("log.js"); - var logger = require("../lib/log.js"); - assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.INFO); - process.env.LOG_LEVEL = oldVal; - unload("log.js"); - done(); - }, + it("Setting logging level as string works", function (done) { + var oldVal = process.env.LOG_LEVEL; + process.env.LOG_LEVEL = "INFO"; + unload("log.js"); + var logger = require("../lib/log.js"); + assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.INFO); + process.env.LOG_LEVEL = oldVal; + unload("log.js"); + done(); + }); - "Setting logging level after the fact works": function (done) { - var oldVal = process.env.LOG_LEVEL; - unload("log.js"); - var logger = require("../lib/log.js"); - logger.Logger.setLevel(); - process.env.LOG_LEVEL = oldVal; - unload("log.js"); - done(); - } - }; - } + it("Setting logging level after the fact works", function (done) { + var oldVal = process.env.LOG_LEVEL; + unload("log.js"); + var logger = require("../lib/log.js"); + logger.Logger.setLevel(); + process.env.LOG_LEVEL = oldVal; + unload("log.js"); + done(); + }); + }) + ) + }; }; // Run the individual test suite diff --git a/tests/test_service.js b/tests/test_service.js index c12db8390..2ef04a32a 100644 --- a/tests/test_service.js +++ b/tests/test_service.js @@ -14,30 +14,29 @@ // under the License. exports.setup = function (svc, loggedOutSvc) { - - var suite = { - "App Tests": require("./service_tests/app").setup(svc), - "Collection tests": require("./service_tests/collection").setup(svc, loggedOutSvc), - "Configuration Tests": require("./service_tests/configuration").setup(svc), - "Data Model tests": require("./service_tests/datamodels").setup(svc), - "Endpoint Tests": require("./service_tests/endpoint").setup(svc), - "Entity tests": require("./service_tests/entity").setup(svc, loggedOutSvc), - "Fired Alerts Tests": require("./service_tests/firedalerts").setup(svc, loggedOutSvc), - "Index Tests": require("./service_tests/indexes").setup(svc, loggedOutSvc), - "Job Tests": require("./service_tests/job").setup(svc), - "Namespace Tests": require("./service_tests/namespace").setup(svc), - "Parser Tests": require("./service_tests/parser").setup(svc), - "Pivot tests": require("./service_tests/pivot").setup(svc), - "Properties Tests": require("./service_tests/properties").setup(svc), - "Saved Search Tests": require("./service_tests/savedsearch").setup(svc, loggedOutSvc), - "Server Info Tests": require("./service_tests/serverinfo").setup(svc), - "Storage Passwords Tests": require("./service_tests/storagepasswords").setup(svc), - "Typeahead Tests": require("./service_tests/typeahead").setup(svc, loggedOutSvc), - "User Tests": require("./service_tests/user").setup(svc, loggedOutSvc), - "View Tests": require("./service_tests/view").setup(svc), - }; - - return suite; + return ( + describe("Service tests", function (done) { + require("./service_tests/app").setup(svc); + require("./service_tests/collection").setup(svc, loggedOutSvc); + require("./service_tests/configuration").setup(svc); + require("./service_tests/datamodels").setup(svc); + require("./service_tests/endpoint").setup(svc); + require("./service_tests/entity").setup(svc, loggedOutSvc); + require("./service_tests/firedalerts").setup(svc, loggedOutSvc); + require("./service_tests/indexes").setup(svc, loggedOutSvc); + require("./service_tests/job").setup(svc); + require("./service_tests/namespace").setup(svc); + require("./service_tests/parser").setup(svc); + require("./service_tests/pivot").setup(svc); + require("./service_tests/properties").setup(svc); + require("./service_tests/savedsearch").setup(svc, loggedOutSvc); + require("./service_tests/serverinfo").setup(svc); + require("./service_tests/storagepasswords").setup(svc); + require("./service_tests/typeahead").setup(svc, loggedOutSvc); + require("./service_tests/user").setup(svc, loggedOutSvc); + require("./service_tests/view").setup(svc); + }) + ) }; if (module === require.cache[__filename] && !module.parent) { diff --git a/tests/test_utils.js b/tests/test_utils.js index ab550e8e3..3c5ff3484 100644 --- a/tests/test_utils.js +++ b/tests/test_utils.js @@ -19,249 +19,249 @@ exports.setup = function () { splunkjs.Logger.setLevel("ALL"); - return { - "Callback#callback to object success": function (done) { - var successfulFunction = function (callback) { - callback(null, "one", "two"); - }; + return ( + describe('Utils tests', function (done) { + it("Callback#callback to object success", function (done) { + var successfulFunction = function (callback) { + callback(null, "one", "two"); + }; - successfulFunction(function (err, one, two) { - assert.strictEqual(one, "one"); - assert.strictEqual(two, "two"); - done(); + successfulFunction(function (err, one, two) { + assert.strictEqual(one, "one"); + assert.strictEqual(two, "two"); + done(); + }); }); - }, - "Callback#callback to object error - single argument": function (done) { - var successfulFunction = function (callback) { - callback("one"); - }; + it("Callback#callback to object error - single argument", function (done) { + var successfulFunction = function (callback) { + callback("one"); + }; - successfulFunction(function (err, one, two) { - assert.strictEqual(err, "one"); - assert.ok(!one); - assert.ok(!two); - done(); + successfulFunction(function (err, one, two) { + assert.strictEqual(err, "one"); + assert.ok(!one); + assert.ok(!two); + done(); + }); }); - }, - "Callback#callback to object error - multi argument": function (done) { - var successfulFunction = function (callback) { - callback(["one", "two"]); - }; + it("Callback#callback to object error - multi argument", function (done) { + var successfulFunction = function (callback) { + callback(["one", "two"]); + }; - successfulFunction(function (err, one, two) { - assert.strictEqual(err[0], "one"); - assert.strictEqual(err[1], "two"); - assert.ok(!one); - assert.ok(!two); - done(); + successfulFunction(function (err, one, two) { + assert.strictEqual(err[0], "one"); + assert.strictEqual(err[1], "two"); + assert.ok(!one); + assert.ok(!two); + done(); + }); }); - }, - "keyOf works": function (done) { - assert.ok(splunkjs.Utils.keyOf(3, { a: 3, b: 5 })); - assert.ok(!splunkjs.Utils.keyOf(3, { a: 12, b: 6 })); - done(); - }, + it("keyOf works", function (done) { + assert.ok(splunkjs.Utils.keyOf(3, { a: 3, b: 5 })); + assert.ok(!splunkjs.Utils.keyOf(3, { a: 12, b: 6 })); + done(); + }); - "bind": function (done) { - var f; - (function () { - f = function (a) { - this.a = a; - }; - })(); - var q = {}; - var g = splunkjs.Utils.bind(q, f); - g(12); - assert.strictEqual(q.a, 12); - done(); - }, + it("bind", function (done) { + var f; + (function () { + f = function (a) { + this.a = a; + }; + })(); + var q = {}; + var g = splunkjs.Utils.bind(q, f); + g(12); + assert.strictEqual(q.a, 12); + done(); + }); - "trim": function (done) { - assert.strictEqual(splunkjs.Utils.trim(" test of something \n\r \t"), "test of something"); + it("trim", function (done) { + assert.strictEqual(splunkjs.Utils.trim(" test of something \n\r \t"), "test of something"); - var realTrim = String.prototype.trim; - String.prototype.trim = null; - assert.strictEqual(splunkjs.Utils.trim(" test of something \n\r \t"), "test of something"); - String.prototype.trim = realTrim; + var realTrim = String.prototype.trim; + String.prototype.trim = null; + assert.strictEqual(splunkjs.Utils.trim(" test of something \n\r \t"), "test of something"); + String.prototype.trim = realTrim; - done(); - }, + done(); + }); - "indexOf": function (done) { - assert.strictEqual(splunkjs.Utils.indexOf([1, 2, 3, 4, 5], 3), 2); - assert.strictEqual(splunkjs.Utils.indexOf([1, 2, 3, 4, 3], 3), 2); - assert.strictEqual(splunkjs.Utils.indexOf([1, 2, 3, 4, 5], 12), -1); - done(); - }, + it("indexOf", function (done) { + assert.strictEqual(splunkjs.Utils.indexOf([1, 2, 3, 4, 5], 3), 2); + assert.strictEqual(splunkjs.Utils.indexOf([1, 2, 3, 4, 3], 3), 2); + assert.strictEqual(splunkjs.Utils.indexOf([1, 2, 3, 4, 5], 12), -1); + done(); + }); - "contains": function (done) { - assert.ok(splunkjs.Utils.contains([1, 2, 3, 4, 5], 3)); - assert.ok(splunkjs.Utils.contains([1, 2, 3, 4, 3], 3)); - assert.ok(!splunkjs.Utils.contains([1, 2, 3, 4, 5], 12)); - done(); - }, + it("contains", function (done) { + assert.ok(splunkjs.Utils.contains([1, 2, 3, 4, 5], 3)); + assert.ok(splunkjs.Utils.contains([1, 2, 3, 4, 3], 3)); + assert.ok(!splunkjs.Utils.contains([1, 2, 3, 4, 5], 12)); + done(); + }); - "startsWith": function (done) { - assert.ok(splunkjs.Utils.startsWith("abcdefg", "abc")); - assert.ok(!splunkjs.Utils.startsWith("bcdefg", "abc")); - done(); - }, + it("startsWith", function (done) { + assert.ok(splunkjs.Utils.startsWith("abcdefg", "abc")); + assert.ok(!splunkjs.Utils.startsWith("bcdefg", "abc")); + done(); + }); - "endsWith": function (done) { - assert.ok(splunkjs.Utils.endsWith("abcdef", "def")); - assert.ok(!splunkjs.Utils.endsWith("abcdef", "bcd")); - done(); - }, + it("endsWith", function (done) { + assert.ok(splunkjs.Utils.endsWith("abcdef", "def")); + assert.ok(!splunkjs.Utils.endsWith("abcdef", "bcd")); + done(); + }); - "toArray": function (done) { - (function () { - var found = splunkjs.Utils.toArray(arguments); - var expected = [1, 2, 3, 4, 5]; - for (var i = 0; i < found.length; i++) { - assert.strictEqual(found[i], expected[i]); - } - })(1, 2, 3, 4, 5); - done(); - }, + it("toArray", function (done) { + (function () { + var found = splunkjs.Utils.toArray(arguments); + var expected = [1, 2, 3, 4, 5]; + for (var i = 0; i < found.length; i++) { + assert.strictEqual(found[i], expected[i]); + } + })(1, 2, 3, 4, 5); + done(); + }); - "isArray": function (done) { - var a = [1, 2, 3, 4, 5]; - assert.ok(splunkjs.Utils.isArray(a)); - done(); - }, + it("isArray", function (done) { + var a = [1, 2, 3, 4, 5]; + assert.ok(splunkjs.Utils.isArray(a)); + done(); + }); - "isFunction": function (done) { - assert.ok(splunkjs.Utils.isFunction(function () { })); - assert.ok(!splunkjs.Utils.isFunction(3)); - assert.ok(!splunkjs.Utils.isFunction("abc")); - assert.ok(!splunkjs.Utils.isFunction({})); - done(); - }, + it("isFunction", function (done) { + assert.ok(splunkjs.Utils.isFunction(function () { })); + assert.ok(!splunkjs.Utils.isFunction(3)); + assert.ok(!splunkjs.Utils.isFunction("abc")); + assert.ok(!splunkjs.Utils.isFunction({})); + done(); + }); - "isNumber": function (done) { - assert.ok(splunkjs.Utils.isNumber(3)); - assert.ok(splunkjs.Utils.isNumber(-2.55113e12)); - assert.ok(!splunkjs.Utils.isNumber("3")); - assert.ok(!splunkjs.Utils.isNumber({ 3: 5 })); - done(); - }, + it("isNumber", function (done) { + assert.ok(splunkjs.Utils.isNumber(3)); + assert.ok(splunkjs.Utils.isNumber(-2.55113e12)); + assert.ok(!splunkjs.Utils.isNumber("3")); + assert.ok(!splunkjs.Utils.isNumber({ 3: 5 })); + done(); + }); - "isObject": function (done) { - assert.ok(splunkjs.Utils.isObject({})); - assert.ok(!splunkjs.Utils.isObject(3)); - assert.ok(!splunkjs.Utils.isObject("3")); - done(); - }, + it("isObject", function (done) { + assert.ok(splunkjs.Utils.isObject({})); + assert.ok(!splunkjs.Utils.isObject(3)); + assert.ok(!splunkjs.Utils.isObject("3")); + done(); + }); - "isEmpty": function (done) { - assert.ok(splunkjs.Utils.isEmpty({})); - assert.ok(splunkjs.Utils.isEmpty([])); - assert.ok(splunkjs.Utils.isEmpty("")); - assert.ok(!splunkjs.Utils.isEmpty({ a: 3 })); - assert.ok(!splunkjs.Utils.isEmpty([1, 2])); - assert.ok(!splunkjs.Utils.isEmpty("abc")); - done(); - }, + it("isEmpty", function (done) { + assert.ok(splunkjs.Utils.isEmpty({})); + assert.ok(splunkjs.Utils.isEmpty([])); + assert.ok(splunkjs.Utils.isEmpty("")); + assert.ok(!splunkjs.Utils.isEmpty({ a: 3 })); + assert.ok(!splunkjs.Utils.isEmpty([1, 2])); + assert.ok(!splunkjs.Utils.isEmpty("abc")); + done(); + }); - "forEach": function (done) { - var a = [1, 2, 3, 4, 5]; - splunkjs.Utils.forEach( - a, - function (elem, index, list) { - assert.strictEqual(a[index], elem); - } - ); - var b = { 1: 2, 2: 4, 3: 6 }; - splunkjs.Utils.forEach( - b, - function (elem, key, obj) { - assert.strictEqual(b[key], elem); - } - ); - splunkjs.Utils.forEach(null, function (elem, key, obj) { }); - var c = { length: 5, 1: 12, 2: 15, 3: 8 }; - splunkjs.Utils.forEach( - c, - function (elem, key, obj) { - assert.strictEqual(c[key], elem); - } - ); - done(); - }, + it("forEach", function (done) { + var a = [1, 2, 3, 4, 5]; + splunkjs.Utils.forEach( + a, + function (elem, index, list) { + assert.strictEqual(a[index], elem); + } + ); + var b = { 1: 2, 2: 4, 3: 6 }; + splunkjs.Utils.forEach( + b, + function (elem, key, obj) { + assert.strictEqual(b[key], elem); + } + ); + splunkjs.Utils.forEach(null, function (elem, key, obj) { }); + var c = { length: 5, 1: 12, 2: 15, 3: 8 }; + splunkjs.Utils.forEach( + c, + function (elem, key, obj) { + assert.strictEqual(c[key], elem); + } + ); + done(); + }); - "extend": function (done) { - var found = splunkjs.Utils.extend({}, { a: 1, b: 2 }, { c: 3, b: 4 }); - var expected = { a: 1, b: 4, c: 3 }; - for (var k in found) { - if (found.hasOwnProperty(k)) { - assert.strictEqual(found[k], expected[k]); + it("extend", function (done) { + var found = splunkjs.Utils.extend({}, { a: 1, b: 2 }, { c: 3, b: 4 }); + var expected = { a: 1, b: 4, c: 3 }; + for (var k in found) { + if (found.hasOwnProperty(k)) { + assert.strictEqual(found[k], expected[k]); + } } - } - done(); - }, - - "clone": function (done) { - var a = { a: 1, b: 2, c: { p: 5, q: 6 } }; - var b = splunkjs.Utils.clone(a); - splunkjs.Utils.forEach(a, function (val, key, obj) { assert.strictEqual(val, b[key]); }); - a.a = 5; - assert.strictEqual(b.a, 1); - a.c.p = 4; - assert.strictEqual(b.c.p, 4); - done(); - assert.strictEqual(splunkjs.Utils.clone(3), 3); - assert.strictEqual(splunkjs.Utils.clone("asdf"), "asdf"); - var p = [1, 2, [3, 4], 3]; - var q = splunkjs.Utils.clone(p); - splunkjs.Utils.forEach(p, function (val, index, arr) { assert.strictEqual(p[index], q[index]); }); - p[0] = 3; - assert.strictEqual(q[0], 1); - p[2][0] = 7; - assert.strictEqual(q[2][0], 7); - }, + done(); + }); - "namespaceFromProperties": function (done) { - var a = splunkjs.Utils.namespaceFromProperties( - { - acl: { - owner: "boris", - app: "factory", - sharing: "system", - other: 3 - }, - more: 12 - } - ); - splunkjs.Utils.forEach( - a, - function (val, key, obj) { - assert.ok((key === "owner" && val === "boris") || - (key === "app" && val === "factory") || - (key === "sharing" && val === "system")); - } - ); - done(); - }, + it("clone", function (done) { + var a = { a: 1, b: 2, c: { p: 5, q: 6 } }; + var b = splunkjs.Utils.clone(a); + splunkjs.Utils.forEach(a, function (val, key, obj) { assert.strictEqual(val, b[key]); }); + a.a = 5; + assert.strictEqual(b.a, 1); + a.c.p = 4; + assert.strictEqual(b.c.p, 4); + done(); + assert.strictEqual(splunkjs.Utils.clone(3), 3); + assert.strictEqual(splunkjs.Utils.clone("asdf"), "asdf"); + var p = [1, 2, [3, 4], 3]; + var q = splunkjs.Utils.clone(p); + splunkjs.Utils.forEach(p, function (val, index, arr) { assert.strictEqual(p[index], q[index]); }); + p[0] = 3; + assert.strictEqual(q[0], 1); + p[2][0] = 7; + assert.strictEqual(q[2][0], 7); + }); - "namespaceFromProperties - bad data": function (done) { - var undefinedProps; - var a = splunkjs.Utils.namespaceFromProperties(undefinedProps); - assert.strictEqual(a.owner, ''); - assert.strictEqual(a.app, ''); - assert.strictEqual(a.sharing, ''); + it("namespaceFromProperties", function (done) { + var a = splunkjs.Utils.namespaceFromProperties( + { + acl: { + owner: "boris", + app: "factory", + sharing: "system", + other: 3 + }, + more: 12 + }); + splunkjs.Utils.forEach( + a, + function (val, key, obj) { + assert.ok((key === "owner" && val === "boris") || + (key === "app" && val === "factory") || + (key === "sharing" && val === "system")); + } + ); + done(); + }); - var b = splunkjs.Utils.namespaceFromProperties(undefinedProps); - assert.strictEqual(b.owner, ''); - assert.strictEqual(b.app, ''); - assert.strictEqual(b.sharing, ''); - done(); - } - }; -}; + it("namespaceFromProperties - bad data", function (done) { + var undefinedProps; + var a = splunkjs.Utils.namespaceFromProperties(undefinedProps); + assert.strictEqual(a.owner, ''); + assert.strictEqual(a.app, ''); + assert.strictEqual(a.sharing, ''); + var b = splunkjs.Utils.namespaceFromProperties(undefinedProps); + assert.strictEqual(b.owner, ''); + assert.strictEqual(b.app, ''); + assert.strictEqual(b.sharing, ''); + done(); + }); + }) + ); +} // Run the individual test suite if (module === require.cache[__filename] && !module.parent) { module.exports = exports.setup(); diff --git a/tests/tests.js b/tests/tests.js index a0a12d736..ea3865def 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -12,6 +12,7 @@ // License for the specific language governing permissions and limitations // under the License. +var describe = require('mocha').describe; var options = require('../examples/node/cmdline'); var splunkjs = require('../index'); var utils = require('../lib/utils'); @@ -59,23 +60,27 @@ var loggedOutSvc = new splunkjs.Service({ version: cmdline.opts.version }); -// Exports tests on a successful login -module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } +describe("Server tests", function () { + + this.beforeAll(function (done) { + svc.login(function (err, success) { + if (err || !success) { + throw new Error("Login failed - not running tests", err || ""); + } + }); + done(); + }) + + require('./modularinputs'); + require('./test_async').setup(); + require('./test_context').setup(svc); + require('./test_examples').setup(svc, cmdline.opts); + require('./test_http').setup(nonSplunkHttp); + require('./test_log').setup(); + require('./test_service').setup(svc, loggedOutSvc); + require('./test_utils').setup(); +}) + + + - var tests = { - 'Modular input tests': require('./modularinputs'), - 'Async tests': require('./test_async').setup(), - 'Context tests': require('./test_context').setup(svc), - 'Example tests': require('./test_examples').setup(svc, cmdline.opts), - 'HTTP tests': require('./test_http').setup(nonSplunkHttp), - 'Log tests': require('./test_log').setup(), - 'Service tests': require('./test_service').setup(svc, loggedOutSvc), - 'Utils tests': require('./test_utils').setup() - } - return resolve(tests); - }); -}); diff --git a/tests_spike/data/data_model_expected_calculations.json b/tests_spike/data/data_model_expected_calculations.json deleted file mode 100644 index 9b94b7c3e..000000000 --- a/tests_spike/data/data_model_expected_calculations.json +++ /dev/null @@ -1,90 +0,0 @@ -[ - { - "outputFields": [ - { - "fieldName": "is_realtime", - "owner": "Audit.searches", - "type": "boolean", - "required": false, - "multivalue": false, - "hidden": false, - "editable": true, - "displayName": "Realtime?", - "comment": "", - "fieldSearch": "" - } - ], - "calculationID": "42on2o5518vbzkt9", - "owner": "Audit.searches", - "editable": true, - "comment": "", - "calculationType": "Eval", - "expression": "case(is_realtime == 0, \"false\", is_realtime == 1, \"true\", is_realtime == \"N/A\", \"false\")" - }, - { - "outputFields": [ - { - "fieldName": "search_id", - "owner": "Audit.searches", - "type": "string", - "required": false, - "multivalue": false, - "hidden": false, - "editable": true, - "displayName": "search_id", - "comment": "", - "fieldSearch": "" - } - ], - "calculationID": "i69cygcgck5wxw29", - "owner": "Audit.searches", - "editable": true, - "comment": "", - "calculationType": "Eval", - "expression": "replace(search_id,\"'\",\"\")" - }, - { - "outputFields": [ - { - "fieldName": "search", - "owner": "Audit.searches", - "type": "string", - "required": false, - "multivalue": false, - "hidden": false, - "editable": true, - "displayName": "search", - "comment": "", - "fieldSearch": "" - } - ], - "calculationID": "8q76efc4bulerk9", - "owner": "Audit.searches", - "editable": true, - "comment": "", - "calculationType": "Eval", - "expression": "replace(search,\"'\",\"\")" - }, - { - "outputFields": [ - { - "fieldName": "search_type", - "owner": "Audit.searches", - "type": "string", - "required": false, - "multivalue": false, - "hidden": false, - "editable": true, - "displayName": "search type", - "comment": "", - "fieldSearch": "" - } - ], - "calculationID": "lnnoqwo7qi8p8pvi", - "owner": "Audit.searches", - "editable": true, - "comment": "", - "calculationType": "Eval", - "expression": "case((id LIKE \"DM_%\" OR savedsearch_name LIKE \"_ACCELERATE_DM%\"), \"dm_acceleration\", search_id LIKE \"scheduler%\", \"scheduled\", search_id LIKE \"rt%\", \"realtime\", search_id LIKE \"subsearch%\", \"subsearch\", (search_id LIKE \"SummaryDirector%\" OR search_id LIKE \"summarize_SummaryDirector%\"), \"summary_director\", 1=1, \"adhoc\") " - } -] \ No newline at end of file diff --git a/tests_spike/data/data_model_expected_constraints.json b/tests_spike/data/data_model_expected_constraints.json deleted file mode 100644 index 22976d4c4..000000000 --- a/tests_spike/data/data_model_expected_constraints.json +++ /dev/null @@ -1,6 +0,0 @@ -[ - { - "search": "index=_audit", - "owner": "Audit" - } -] \ No newline at end of file diff --git a/tests_spike/data/data_model_expected_fields.json b/tests_spike/data/data_model_expected_fields.json deleted file mode 100644 index 41d39675d..000000000 --- a/tests_spike/data/data_model_expected_fields.json +++ /dev/null @@ -1,194 +0,0 @@ -[ - { - "fieldName": "action", - "owner": "Audit", - "type": "string", - "required": false, - "multivalue": false, - "hidden": false, - "editable": true, - "displayName": "action", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "info", - "owner": "Audit", - "type": "string", - "required": false, - "multivalue": false, - "hidden": false, - "editable": true, - "displayName": "info", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "object", - "owner": "Audit", - "type": "string", - "required": false, - "multivalue": false, - "hidden": true, - "editable": true, - "displayName": "object", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "operation", - "owner": "Audit", - "type": "string", - "required": false, - "multivalue": false, - "hidden": true, - "editable": true, - "displayName": "operation", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "path", - "owner": "Audit", - "type": "string", - "required": false, - "multivalue": false, - "hidden": true, - "editable": true, - "displayName": "path", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "user", - "owner": "Audit", - "type": "string", - "required": false, - "multivalue": false, - "hidden": false, - "editable": true, - "displayName": "user", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "exec_time", - "owner": "Audit", - "type": "number", - "required": false, - "multivalue": false, - "hidden": true, - "editable": true, - "displayName": "execution time", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "result_count", - "owner": "Audit", - "type": "number", - "required": false, - "multivalue": false, - "hidden": true, - "editable": true, - "displayName": "result count", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "savedsearch_name", - "owner": "Audit", - "type": "string", - "required": false, - "multivalue": false, - "hidden": true, - "editable": true, - "displayName": "savedsearch name", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "scan_count", - "owner": "Audit", - "type": "number", - "required": false, - "multivalue": false, - "hidden": true, - "editable": true, - "displayName": "scan count", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "total_run_time", - "owner": "Audit", - "type": "number", - "required": false, - "multivalue": false, - "hidden": true, - "editable": true, - "displayName": "total run time", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "_time", - "owner": "BaseEvent", - "type": "timestamp", - "required": false, - "multivalue": false, - "hidden": false, - "editable": false, - "displayName": "_time", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "host", - "owner": "BaseEvent", - "type": "string", - "required": false, - "multivalue": false, - "hidden": false, - "editable": false, - "displayName": "host", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "source", - "owner": "BaseEvent", - "type": "string", - "required": false, - "multivalue": false, - "hidden": false, - "editable": false, - "displayName": "source", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "sourcetype", - "owner": "BaseEvent", - "type": "string", - "required": false, - "multivalue": false, - "hidden": false, - "editable": false, - "displayName": "sourcetype", - "comment": "", - "fieldSearch": "" - }, - { - "fieldName": "Audit", - "owner": "Audit", - "type": "objectCount", - "required": false, - "multivalue": false, - "hidden": false, - "editable": false, - "displayName": "Audit", - "comment": "", - "fieldSearch": "" - } -] \ No newline at end of file diff --git a/tests_spike/data/data_model_for_pivot.json b/tests_spike/data/data_model_for_pivot.json deleted file mode 100644 index c4c84d168..000000000 --- a/tests_spike/data/data_model_for_pivot.json +++ /dev/null @@ -1,336 +0,0 @@ -{ - "displayName":"pivot test data", - "description":"", - "modelName":"pivot_test_data", - "objectSummary":{ - "Transaction-Based":0, - "Interfaces":0, - "Interface Implementations":0, - "Search-Based":0, - "Event-Based":2 - }, - "objects":[ - { - "fields":[ - { - "editable":false, - "fieldSearch":"", - "fieldName":"_time", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"BaseEvent", - "comment":"", - "type":"timestamp", - "displayName":"_time" - }, - { - "editable":false, - "fieldSearch":"", - "fieldName":"host", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"BaseEvent", - "comment":"", - "type":"string", - "displayName":"host" - }, - { - "editable":false, - "fieldSearch":"", - "fieldName":"source", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"BaseEvent", - "comment":"", - "type":"string", - "displayName":"source" - }, - { - "editable":false, - "fieldSearch":"", - "fieldName":"sourcetype", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"BaseEvent", - "comment":"", - "type":"string", - "displayName":"sourcetype" - }, - { - "editable":false, - "fieldSearch":"", - "fieldName":"test_data", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"test_data", - "comment":"", - "type":"objectCount", - "displayName":"test data" - } - ], - "objectSearchNoFields":"| rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\", \"is_child\" AS \"test_data.is_child\", \"is_not_child\" AS \"test_data.is_not_child\" | rename \"test_data.has_boris\" AS \"has_boris\", \"test_data.hostip\" AS \"hostip\", \"test_data.epsilon\" AS \"epsilon\", \"test_data.is_child\" AS \"is_child\", \"test_data.is_not_child\" AS \"is_not_child\" | eval \"has_boris\"=if(boris != null, \"true\", \"false\") | eval \"hostip\"=\"129.0.0.1\" | eval \"epsilon\"=25 | eval \"is_child\"=if(searchmatch(\"\"),1,0) | eval \"is_not_child\"=if(searchmatch(\"NOT( )\"),1,0) | rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\", \"is_child\" AS \"test_data.is_child\", \"is_not_child\" AS \"test_data.is_not_child\"", - "constraints":[ - - ], - "displayName":"test data", - "previewSearch":" | eval \"has_boris\"=if(boris != null, \"true\", \"false\") | eval \"hostip\"=\"129.0.0.1\" | eval \"epsilon\"=25", - "objectSearch":"| rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\", \"is_child\" AS \"test_data.is_child\", \"is_not_child\" AS \"test_data.is_not_child\" | rename \"test_data.has_boris\" AS \"has_boris\", \"test_data.hostip\" AS \"hostip\", \"test_data.epsilon\" AS \"epsilon\", \"test_data.is_child\" AS \"is_child\", \"test_data.is_not_child\" AS \"is_not_child\" | eval \"has_boris\"=if(boris != null, \"true\", \"false\") | eval \"hostip\"=\"129.0.0.1\" | eval \"epsilon\"=25 | eval \"is_child\"=if(searchmatch(\"\"),1,0) | eval \"is_not_child\"=if(searchmatch(\"NOT( )\"),1,0) | rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\", \"is_child\" AS \"test_data.is_child\", \"is_not_child\" AS \"test_data.is_not_child\" | fields \"_time\", \"host\", \"source\", \"sourcetype\", \"test_data.has_boris\", \"test_data.hostip\", \"test_data.epsilon\", \"test_data.is_child\", \"test_data.is_not_child\"", - "objectName":"test_data", - "calculations":[ - { - "editable":true, - "outputFields":[ - { - "editable":true, - "fieldSearch":"", - "fieldName":"has_boris", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"test_data", - "comment":"", - "type":"boolean", - "displayName":"has_boris" - } - ], - "owner":"test_data", - "comment":"", - "calculationID":"2f8rvff3gsm", - "expression":"if(boris != null, \"true\", \"false\")", - "calculationType":"Eval" - }, - { - "editable":true, - "outputFields":[ - { - "editable":true, - "fieldSearch":"", - "fieldName":"hostip", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"test_data", - "comment":"", - "type":"ipv4", - "displayName":"hostip" - } - ], - "owner":"test_data", - "comment":"", - "calculationID":"bs7krya32co", - "expression":"129.0.0.1", - "calculationType":"Eval" - }, - { - "editable":true, - "outputFields":[ - { - "editable":true, - "fieldSearch":"", - "fieldName":"epsilon", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"test_data", - "comment":"", - "type":"number", - "displayName":"epsilon" - } - ], - "owner":"test_data", - "comment":"", - "calculationID":"bsbno65h5v", - "expression":"25", - "calculationType":"Eval" - }, - { - "editable":false, - "outputFields":[ - { - "editable":false, - "fieldSearch":"", - "fieldName":"is_child", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"test_data", - "comment":"", - "type":"childCount", - "displayName":"is_child" - } - ], - "owner":"test_data", - "comment":"", - "calculationID":"ec9664b60b8de96cd9d7a0114e89e358d1620c19", - "expression":"if(searchmatch(\"\"),1,0)", - "calculationType":"Eval" - }, - { - "editable":false, - "outputFields":[ - { - "editable":false, - "fieldSearch":"", - "fieldName":"is_not_child", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"test_data", - "comment":"", - "type":"childCount", - "displayName":"is_not_child" - } - ], - "owner":"test_data", - "comment":"", - "calculationID":"64f71e104ac3b7cdbf665046891b79adb58ddf6d", - "expression":"if(searchmatch(\"NOT( )\"),1,0)", - "calculationType":"Eval" - } - ], - "autoextractSearch":"", - "comment":"", - "parentName":"BaseEvent", - "children":[ - "child" - ], - "lineage":"test_data", - "tsidxNamespace":"" - }, - { - "fields":[ - { - "editable":false, - "fieldSearch":"", - "fieldName":"_time", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"BaseEvent", - "comment":"", - "type":"timestamp", - "displayName":"_time" - }, - { - "editable":false, - "fieldSearch":"", - "fieldName":"host", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"BaseEvent", - "comment":"", - "type":"string", - "displayName":"host" - }, - { - "editable":false, - "fieldSearch":"", - "fieldName":"source", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"BaseEvent", - "comment":"", - "type":"string", - "displayName":"source" - }, - { - "editable":false, - "fieldSearch":"", - "fieldName":"sourcetype", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"BaseEvent", - "comment":"", - "type":"string", - "displayName":"sourcetype" - }, - { - "editable":false, - "fieldSearch":"", - "fieldName":"child", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"test_data.child", - "comment":"", - "type":"objectCount", - "displayName":"child" - } - ], - "objectSearchNoFields":"| rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\" | rename \"test_data.has_boris\" AS \"has_boris\", \"test_data.hostip\" AS \"hostip\", \"test_data.epsilon\" AS \"epsilon\" | eval \"has_boris\"=if(boris != null, \"true\", \"false\") | eval \"hostip\"=\"129.0.0.1\" | eval \"epsilon\"=25 | rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\"", - "constraints":[ - - ], - "displayName":"child", - "previewSearch":" | eval \"has_boris\"=if(boris != null, \"true\", \"false\") | eval \"hostip\"=\"129.0.0.1\" | eval \"epsilon\"=25", - "objectSearch":"| rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\" | rename \"test_data.has_boris\" AS \"has_boris\", \"test_data.hostip\" AS \"hostip\", \"test_data.epsilon\" AS \"epsilon\" | eval \"has_boris\"=if(boris != null, \"true\", \"false\") | eval \"hostip\"=\"129.0.0.1\" | eval \"epsilon\"=25 | rename \"has_boris\" AS \"test_data.has_boris\", \"hostip\" AS \"test_data.hostip\", \"epsilon\" AS \"test_data.epsilon\" | fields \"_time\", \"host\", \"source\", \"sourcetype\", \"test_data.has_boris\", \"test_data.hostip\", \"test_data.epsilon\"", - "objectName":"child", - "calculations":[ - { - "editable":true, - "outputFields":[ - { - "editable":true, - "fieldSearch":"", - "fieldName":"hostip", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"test_data", - "comment":"", - "type":"ipv4", - "displayName":"hostip" - } - ], - "owner":"test_data", - "comment":"", - "calculationID":"bs7krya32co", - "expression":"129.0.0.1", - "calculationType":"Eval" - }, - { - "editable":true, - "outputFields":[ - { - "editable":true, - "fieldSearch":"", - "fieldName":"epsilon", - "required":false, - "multivalue":false, - "hidden":false, - "owner":"test_data", - "comment":"", - "type":"number", - "displayName":"epsilon" - } - ], - "owner":"test_data", - "comment":"", - "calculationID":"bsbno65h5v", - "expression":"25", - "calculationType":"Eval" - } - ], - "autoextractSearch":"", - "comment":"", - "parentName":"test_data", - "children":[ - - ], - "lineage":"test_data.child", - "tsidxNamespace":"" - } - ], - "objectNameList":[ - "test_data", - "child" - ] -} \ No newline at end of file diff --git a/tests_spike/data/data_model_with_test_objects.json b/tests_spike/data/data_model_with_test_objects.json deleted file mode 100644 index 5d3971fa7..000000000 --- a/tests_spike/data/data_model_with_test_objects.json +++ /dev/null @@ -1,258 +0,0 @@ -{ - "objects":[ - { - "objectName":"event1", - "comment":"·Ä©·öô‡Øµ comment on event1", - "autoextractSearch":" (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) ", - "calculations":[ - { - "owner":"event1", - "calculationID":"93fzsv03wa7", - "outputFields":[ - { - "owner":"event1", - "type":"string", - "hidden":true, - "fieldSearch":"new_field=* ", - "fieldName":"new_field", - "multivalue":false, - "displayName":"My New Field", - "editable":true, - "required":true, - "comment":"" - } - ], - "comment":"", - "editable":true, - "calculationType":"Eval", - "expression":"if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\")" - }, - { - "owner":"event1", - "calculationID":"sr3mc8o3mjr", - "outputFields":[ - { - "multivalue":false, - "hidden":false, - "fieldName":"output_from_reverse_hostname", - "type":"ipv4", - "owner":"event1", - "comment":"", - "fieldSearch":"output_from_reverse_hostname=* ", - "editable":true, - "lookupOutputFieldName":"reverse_hostname", - "displayName":"\u0bf5aad", - "required":true - } - ], - "comment":"", - "editable":true, - "lookupName":"dnslookup", - "inputField":"host", - "calculationType":"Lookup", - "lookupField":"a_lookup_field" - }, - { - "owner":"event1", - "calculationID":"a5v1k82ymic", - "outputFields":[ - { - "owner":"event1", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"from", - "multivalue":false, - "displayName":"from", - "editable":true, - "required":false, - "comment":"" - }, - { - "owner":"event1", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"to", - "multivalue":false, - "displayName":"to", - "editable":true, - "required":false, - "comment":"" - } - ], - "comment":"", - "editable":true, - "inputField":"_raw", - "calculationType":"Rex", - "expression":" From: (?.*) To: (?.*) " - }, - { - "owner":"event1", - "calculationID":"pbe9bd0rp4", - "outputFields":[ - { - "multivalue":false, - "hidden":false, - "fieldName":"output_from_reverse_hostname_lon", - "type":"number", - "owner":"event1", - "comment":"", - "fieldSearch":"output_from_reverse_hostname_lon=* ", - "editable":true, - "lookupOutputFieldName":"lon", - "displayName":"output_from_reverse_hostname_lon", - "required":true - }, - { - "multivalue":false, - "hidden":false, - "fieldName":"output_from_reverse_hostname_lat", - "type":"number", - "owner":"event1", - "comment":"", - "fieldSearch":"output_from_reverse_hostname_lat=* ", - "editable":true, - "lookupOutputFieldName":"lat", - "displayName":"output_from_reverse_hostname_lat", - "required":true - }, - { - "multivalue":false, - "hidden":false, - "fieldName":"output_from_reverse_hostname_City", - "type":"string", - "owner":"event1", - "comment":"", - "fieldSearch":"output_from_reverse_hostname_City=* ", - "editable":true, - "lookupOutputFieldName":"City", - "displayName":"output_from_reverse_hostname_City", - "required":true - }, - { - "multivalue":false, - "hidden":false, - "fieldName":"output_from_reverse_hostname_Region", - "type":"string", - "owner":"event1", - "comment":"", - "fieldSearch":"output_from_reverse_hostname_Region=* ", - "editable":true, - "lookupOutputFieldName":"Region", - "displayName":"output_from_reverse_hostname_Region", - "required":true - }, - { - "multivalue":false, - "hidden":false, - "fieldName":"output_from_reverse_hostname_Country", - "type":"string", - "owner":"event1", - "comment":"", - "fieldSearch":"output_from_reverse_hostname_Country=* ", - "editable":true, - "lookupOutputFieldName":"Country", - "displayName":"output_from_reverse_hostname_Country", - "required":true - } - ], - "comment":"·Ä©·öô‡Øµ comment of pbe9bd0rp4", - "editable":true, - "inputField":"output_from_reverse_hostname", - "calculationType":"GeoIP" - } - ], - "previewSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* ", - "children":[ - - ], - "objectSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\" | rename \"event1.new_field\" AS \"new_field\", \"event1.output_from_reverse_hostname\" AS \"output_from_reverse_hostname\", \"event1.from\" AS \"from\", \"event1.to\" AS \"to\", \"event1.output_from_reverse_hostname_lon\" AS \"output_from_reverse_hostname_lon\", \"event1.output_from_reverse_hostname_lat\" AS \"output_from_reverse_hostname_lat\", \"event1.output_from_reverse_hostname_City\" AS \"output_from_reverse_hostname_City\", \"event1.output_from_reverse_hostname_Region\" AS \"output_from_reverse_hostname_Region\", \"event1.output_from_reverse_hostname_Country\" AS \"output_from_reverse_hostname_Country\" | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\" | fields \"_time\", \"host\", \"source\", \"sourcetype\", \"event1.new_field\", \"event1.output_from_reverse_hostname\", \"event1.from\", \"event1.to\", \"event1.output_from_reverse_hostname_lon\", \"event1.output_from_reverse_hostname_lat\", \"event1.output_from_reverse_hostname_City\", \"event1.output_from_reverse_hostname_Region\", \"event1.output_from_reverse_hostname_Country\"", - "constraints":[ - { - "owner":"event1", - "search":"uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")" - } - ], - "lineage":"event1", - "tsidxNamespace":"", - "displayName":"event1 ·Ä©·öô", - "fields":[ - { - "owner":"BaseEvent", - "type":"timestamp", - "hidden":false, - "fieldSearch":"", - "fieldName":"_time", - "multivalue":false, - "displayName":"_time", - "editable":false, - "required":false, - "comment":"" - }, - { - "owner":"BaseEvent", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"host", - "multivalue":false, - "displayName":"host", - "editable":false, - "required":false, - "comment":"" - }, - { - "owner":"BaseEvent", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"source", - "multivalue":false, - "displayName":"source", - "editable":false, - "required":false, - "comment":"" - }, - { - "owner":"BaseEvent", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"sourcetype", - "multivalue":false, - "displayName":"sourcetype", - "editable":false, - "required":false, - "comment":"" - }, - { - "owner":"event1", - "type":"objectCount", - "hidden":false, - "fieldSearch":"", - "fieldName":"event1", - "multivalue":false, - "displayName":"event1", - "editable":false, - "required":false, - "comment":"" - } - ], - "parentName":"BaseEvent", - "objectSearchNoFields":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\" | rename \"event1.new_field\" AS \"new_field\", \"event1.output_from_reverse_hostname\" AS \"output_from_reverse_hostname\", \"event1.from\" AS \"from\", \"event1.to\" AS \"to\", \"event1.output_from_reverse_hostname_lon\" AS \"output_from_reverse_hostname_lon\", \"event1.output_from_reverse_hostname_lat\" AS \"output_from_reverse_hostname_lat\", \"event1.output_from_reverse_hostname_City\" AS \"output_from_reverse_hostname_City\", \"event1.output_from_reverse_hostname_Region\" AS \"output_from_reverse_hostname_Region\", \"event1.output_from_reverse_hostname_Country\" AS \"output_from_reverse_hostname_Country\" | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\"" - } - ], - "displayName":"\u0bf5\u0bf1\u0bf0\u0bef - search 1", - "objectSummary":{ - "Event-Based":1, - "Search-Based":0, - "Transaction-Based":0, - "Interfaces":0, - "Interface Implementations":0 - }, - "description":"A description", - "objectNameList":[ - "event1" - ] -} \ No newline at end of file diff --git a/tests_spike/data/empty_data_model.json b/tests_spike/data/empty_data_model.json deleted file mode 100644 index ad6cad47f..000000000 --- a/tests_spike/data/empty_data_model.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "description":"Empty model", - "displayName":"A human readable name", - "objects": [] -} \ No newline at end of file diff --git a/tests_spike/data/inheritance_test_data.json b/tests_spike/data/inheritance_test_data.json deleted file mode 100644 index 31fa34cd0..000000000 --- a/tests_spike/data/inheritance_test_data.json +++ /dev/null @@ -1,375 +0,0 @@ -{ - "objects":[ - { - "objectSearch":" | search (boris=hilda) | rename \"is_level_1\" AS \"level_0.is_level_1\", \"is_not_level_1\" AS \"level_0.is_not_level_1\" | rename \"level_0.is_level_1\" AS \"is_level_1\", \"level_0.is_not_level_1\" AS \"is_not_level_1\" | eval \"is_level_1\"=if(searchmatch(\" (natasha=meep) \"),1,0) | eval \"is_not_level_1\"=if(searchmatch(\"NOT( (natasha=meep) )\"),1,0) | rename \"is_level_1\" AS \"level_0.is_level_1\", \"is_not_level_1\" AS \"level_0.is_not_level_1\" | fields \"_time\", \"host\", \"source\", \"sourcetype\", \"level_0.is_level_1\", \"level_0.is_not_level_1\"", - "constraints":[ - { - "owner":"level_0", - "search":"boris=hilda" - } - ], - "lineage":"level_0", - "objectName":"level_0", - "displayName":"level 0", - "autoextractSearch":" (boris=hilda) ", - "calculations":[ - { - "owner":"level_0", - "calculationID":"5d76326e6a312efd4630317be0a7212cb99a9c14", - "expression":"if(searchmatch(\" (natasha=meep) \"),1,0)", - "editable":false, - "calculationType":"Eval", - "outputFields":[ - { - "owner":"level_0", - "type":"childCount", - "hidden":false, - "fieldSearch":"", - "fieldName":"is_level_1", - "displayName":"is_level_1", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - } - ], - "comment":"" - }, - { - "owner":"level_0", - "calculationID":"8c7a163a740a9c27dd2a99b70e45fa7bd1e3ee9b", - "expression":"if(searchmatch(\"NOT( (natasha=meep) )\"),1,0)", - "editable":false, - "calculationType":"Eval", - "outputFields":[ - { - "owner":"level_0", - "type":"childCount", - "hidden":false, - "fieldSearch":"", - "fieldName":"is_not_level_1", - "displayName":"is_not_level_1", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - } - ], - "comment":"" - } - ], - "previewSearch":" | search (boris=hilda) ", - "objectSearchNoFields":" | search (boris=hilda) | rename \"is_level_1\" AS \"level_0.is_level_1\", \"is_not_level_1\" AS \"level_0.is_not_level_1\" | rename \"level_0.is_level_1\" AS \"is_level_1\", \"level_0.is_not_level_1\" AS \"is_not_level_1\" | eval \"is_level_1\"=if(searchmatch(\" (natasha=meep) \"),1,0) | eval \"is_not_level_1\"=if(searchmatch(\"NOT( (natasha=meep) )\"),1,0) | rename \"is_level_1\" AS \"level_0.is_level_1\", \"is_not_level_1\" AS \"level_0.is_not_level_1\"", - "tsidxNamespace":"", - "comment":"", - "fields":[ - { - "owner":"BaseEvent", - "type":"timestamp", - "hidden":false, - "fieldSearch":"", - "fieldName":"_time", - "displayName":"_time", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - }, - { - "owner":"BaseEvent", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"host", - "displayName":"host", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - }, - { - "owner":"BaseEvent", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"source", - "displayName":"source", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - }, - { - "owner":"BaseEvent", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"sourcetype", - "displayName":"sourcetype", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - }, - { - "owner":"level_0", - "type":"objectCount", - "hidden":false, - "fieldSearch":"", - "fieldName":"level_0", - "displayName":"level 0", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - } - ], - "parentName":"BaseEvent", - "children":[ - "level_1" - ] - }, - { - "objectSearch":" | search (boris=hilda) | rename \"is_level_2\" AS \"level_0.level_1.is_level_2\", \"is_not_level_2\" AS \"level_0.level_1.is_not_level_2\" | rename \"level_0.level_1.is_level_2\" AS \"is_level_2\", \"level_0.level_1.is_not_level_2\" AS \"is_not_level_2\" | search (natasha=meep) | eval \"is_level_2\"=if(searchmatch(\" (prr=4) \"),1,0) | eval \"is_not_level_2\"=if(searchmatch(\"NOT( (prr=4) )\"),1,0) | rename \"is_level_2\" AS \"level_0.level_1.is_level_2\", \"is_not_level_2\" AS \"level_0.level_1.is_not_level_2\" | fields \"_time\", \"host\", \"source\", \"sourcetype\", \"level_0.level_1.is_level_2\", \"level_0.level_1.is_not_level_2\"", - "constraints":[ - { - "owner":"level_0", - "search":"boris=hilda" - }, - { - "owner":"level_0.level_1", - "search":"natasha=meep" - } - ], - "lineage":"level_0.level_1", - "objectName":"level_1", - "displayName":"level 1", - "autoextractSearch":" (boris=hilda) ", - "calculations":[ - { - "owner":"level_0.level_1", - "calculationID":"3077412e0686c92fe9f1bbf6ae58e8c6daf98cfd", - "expression":"if(searchmatch(\" (prr=4) \"),1,0)", - "editable":false, - "calculationType":"Eval", - "outputFields":[ - { - "owner":"level_0.level_1", - "type":"childCount", - "hidden":false, - "fieldSearch":"", - "fieldName":"is_level_2", - "displayName":"is_level_2", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - } - ], - "comment":"" - }, - { - "owner":"level_0.level_1", - "calculationID":"4a30d30bca031a36e4fde3de802c5b60f9efde95", - "expression":"if(searchmatch(\"NOT( (prr=4) )\"),1,0)", - "editable":false, - "calculationType":"Eval", - "outputFields":[ - { - "owner":"level_0.level_1", - "type":"childCount", - "hidden":false, - "fieldSearch":"", - "fieldName":"is_not_level_2", - "displayName":"is_not_level_2", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - } - ], - "comment":"" - } - ], - "previewSearch":" | search (boris=hilda) (natasha=meep) ", - "objectSearchNoFields":" | search (boris=hilda) | rename \"is_level_2\" AS \"level_0.level_1.is_level_2\", \"is_not_level_2\" AS \"level_0.level_1.is_not_level_2\" | rename \"level_0.level_1.is_level_2\" AS \"is_level_2\", \"level_0.level_1.is_not_level_2\" AS \"is_not_level_2\" | search (natasha=meep) | eval \"is_level_2\"=if(searchmatch(\" (prr=4) \"),1,0) | eval \"is_not_level_2\"=if(searchmatch(\"NOT( (prr=4) )\"),1,0) | rename \"is_level_2\" AS \"level_0.level_1.is_level_2\", \"is_not_level_2\" AS \"level_0.level_1.is_not_level_2\"", - "tsidxNamespace":"", - "comment":"", - "fields":[ - { - "owner":"BaseEvent", - "type":"timestamp", - "hidden":false, - "fieldSearch":"", - "fieldName":"_time", - "displayName":"_time", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - }, - { - "owner":"BaseEvent", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"host", - "displayName":"host", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - }, - { - "owner":"BaseEvent", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"source", - "displayName":"source", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - }, - { - "owner":"BaseEvent", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"sourcetype", - "displayName":"sourcetype", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - }, - { - "owner":"level_0.level_1", - "type":"objectCount", - "hidden":false, - "fieldSearch":"", - "fieldName":"level_1", - "displayName":"level 1", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - } - ], - "parentName":"level_0", - "children":[ - "level_2" - ] - }, - { - "objectSearch":" | search (boris=hilda) (natasha=meep) (prr=4) | fields \"_time\", \"host\", \"source\", \"sourcetype\"", - "constraints":[ - { - "owner":"level_0", - "search":"boris=hilda" - }, - { - "owner":"level_0.level_1", - "search":"natasha=meep" - }, - { - "owner":"level_0.level_1.level_2", - "search":"prr=4" - } - ], - "lineage":"level_0.level_1.level_2", - "objectName":"level_2", - "displayName":"level 2", - "autoextractSearch":" (boris=hilda) ", - "calculations":[ - - ], - "previewSearch":" | search (boris=hilda) (natasha=meep) (prr=4) ", - "objectSearchNoFields":" | search (boris=hilda) (natasha=meep) (prr=4) ", - "tsidxNamespace":"", - "comment":"", - "fields":[ - { - "owner":"BaseEvent", - "type":"timestamp", - "hidden":false, - "fieldSearch":"", - "fieldName":"_time", - "displayName":"_time", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - }, - { - "owner":"BaseEvent", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"host", - "displayName":"host", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - }, - { - "owner":"BaseEvent", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"source", - "displayName":"source", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - }, - { - "owner":"BaseEvent", - "type":"string", - "hidden":false, - "fieldSearch":"", - "fieldName":"sourcetype", - "displayName":"sourcetype", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - }, - { - "owner":"level_0.level_1.level_2", - "type":"objectCount", - "hidden":false, - "fieldSearch":"", - "fieldName":"level_2", - "displayName":"level 2", - "editable":false, - "comment":"", - "required":false, - "multivalue":false - } - ], - "parentName":"level_1", - "children":[ - - ] - } - ], - "displayName":"inheritance test", - "objectSummary":{ - "Event-Based":3, - "Search-Based":0, - "Transaction-Based":0, - "Interfaces":0, - "Interface Implementations":0 - }, - "modelName":"inheritance_test", - "description":"Data model description to test lineages.", - "objectNameList":[ - "level_0", - "level_1", - "level_2" - ] -} \ No newline at end of file diff --git a/tests_spike/data/model_with_empty_headers.json b/tests_spike/data/model_with_empty_headers.json deleted file mode 100644 index 296b754d7..000000000 --- a/tests_spike/data/model_with_empty_headers.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "displayName": "", - "description": "", - "objects": [] -} \ No newline at end of file diff --git a/tests_spike/data/model_with_multiple_types.json b/tests_spike/data/model_with_multiple_types.json deleted file mode 100644 index 5200f6da9..000000000 --- a/tests_spike/data/model_with_multiple_types.json +++ /dev/null @@ -1,604 +0,0 @@ -{ - "objectNameList":[ - "event1", - "transaction1", - "search1", - "subsearch" - ], - "objectSummary":{ - "Search-Based":2, - "Transaction-Based":1, - "Event-Based":1, - "Interfaces":0, - "Interface Implementations":0 - }, - "displayName":"\u0bf5\u0bf1\u0bf0\u0bef - search 1", - "description":"A description", - "modelName":"search1", - "objects":[ - { - "constraints":[ - { - "search":"uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")", - "owner":"event1" - } - ], - "tsidxNamespace":"", - "objectSearchNoFields":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\" | rename \"event1.new_field\" AS \"new_field\", \"event1.output_from_reverse_hostname\" AS \"output_from_reverse_hostname\", \"event1.from\" AS \"from\", \"event1.to\" AS \"to\", \"event1.output_from_reverse_hostname_lon\" AS \"output_from_reverse_hostname_lon\", \"event1.output_from_reverse_hostname_lat\" AS \"output_from_reverse_hostname_lat\", \"event1.output_from_reverse_hostname_City\" AS \"output_from_reverse_hostname_City\", \"event1.output_from_reverse_hostname_Region\" AS \"output_from_reverse_hostname_Region\", \"event1.output_from_reverse_hostname_Country\" AS \"output_from_reverse_hostname_Country\" | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\"", - "objectSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\" | rename \"event1.new_field\" AS \"new_field\", \"event1.output_from_reverse_hostname\" AS \"output_from_reverse_hostname\", \"event1.from\" AS \"from\", \"event1.to\" AS \"to\", \"event1.output_from_reverse_hostname_lon\" AS \"output_from_reverse_hostname_lon\", \"event1.output_from_reverse_hostname_lat\" AS \"output_from_reverse_hostname_lat\", \"event1.output_from_reverse_hostname_City\" AS \"output_from_reverse_hostname_City\", \"event1.output_from_reverse_hostname_Region\" AS \"output_from_reverse_hostname_Region\", \"event1.output_from_reverse_hostname_Country\" AS \"output_from_reverse_hostname_Country\" | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | rename \"new_field\" AS \"event1.new_field\", \"output_from_reverse_hostname\" AS \"event1.output_from_reverse_hostname\", \"from\" AS \"event1.from\", \"to\" AS \"event1.to\", \"output_from_reverse_hostname_lon\" AS \"event1.output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\" AS \"event1.output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\" AS \"event1.output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\" AS \"event1.output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\" AS \"event1.output_from_reverse_hostname_Country\" | fields \"_time\", \"host\", \"source\", \"sourcetype\", \"event1.new_field\", \"event1.output_from_reverse_hostname\", \"event1.from\", \"event1.to\", \"event1.output_from_reverse_hostname_lon\", \"event1.output_from_reverse_hostname_lat\", \"event1.output_from_reverse_hostname_City\", \"event1.output_from_reverse_hostname_Region\", \"event1.output_from_reverse_hostname_Country\"", - "calculations":[ - { - "expression":"if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\")", - "outputFields":[ - { - "multivalue":false, - "type":"string", - "comment":"", - "required":true, - "editable":true, - "hidden":true, - "fieldName":"new_field", - "displayName":"My New Field", - "owner":"event1", - "fieldSearch":"new_field=* " - } - ], - "comment":"", - "calculationID":"93fzsv03wa7", - "editable":true, - "calculationType":"Eval", - "owner":"event1" - }, - { - "lookupField":"a_lookup_field", - "outputFields":[ - { - "editable":true, - "multivalue":false, - "lookupOutputFieldName":"reverse_hostname", - "fieldSearch":"output_from_reverse_hostname=* ", - "required":true, - "hidden":false, - "comment":"", - "displayName":"\u0bf5aad", - "fieldName":"output_from_reverse_hostname", - "type":"ipv4", - "owner":"event1" - } - ], - "comment":"", - "calculationID":"sr3mc8o3mjr", - "editable":true, - "lookupName":"dnslookup", - "inputField":"host", - "calculationType":"Lookup", - "owner":"event1" - }, - { - "expression":" From: (?.*) To: (?.*) ", - "outputFields":[ - { - "multivalue":false, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"from", - "displayName":"from", - "owner":"event1", - "fieldSearch":"" - }, - { - "multivalue":false, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"to", - "displayName":"to", - "owner":"event1", - "fieldSearch":"" - } - ], - "comment":"", - "calculationID":"a5v1k82ymic", - "editable":true, - "inputField":"_raw", - "calculationType":"Rex", - "owner":"event1" - }, - { - "outputFields":[ - { - "editable":true, - "multivalue":false, - "lookupOutputFieldName":"lon", - "fieldSearch":"output_from_reverse_hostname_lon=* ", - "required":true, - "hidden":false, - "comment":"", - "displayName":"output_from_reverse_hostname_lon", - "fieldName":"output_from_reverse_hostname_lon", - "type":"number", - "owner":"event1" - }, - { - "editable":true, - "multivalue":false, - "lookupOutputFieldName":"lat", - "fieldSearch":"output_from_reverse_hostname_lat=* ", - "required":true, - "hidden":false, - "comment":"", - "displayName":"output_from_reverse_hostname_lat", - "fieldName":"output_from_reverse_hostname_lat", - "type":"number", - "owner":"event1" - }, - { - "editable":true, - "multivalue":false, - "lookupOutputFieldName":"City", - "fieldSearch":"output_from_reverse_hostname_City=* ", - "required":true, - "hidden":false, - "comment":"", - "displayName":"output_from_reverse_hostname_City", - "fieldName":"output_from_reverse_hostname_City", - "type":"string", - "owner":"event1" - }, - { - "editable":true, - "multivalue":false, - "lookupOutputFieldName":"Region", - "fieldSearch":"output_from_reverse_hostname_Region=* ", - "required":true, - "hidden":false, - "comment":"", - "displayName":"output_from_reverse_hostname_Region", - "fieldName":"output_from_reverse_hostname_Region", - "type":"string", - "owner":"event1" - }, - { - "editable":true, - "multivalue":false, - "lookupOutputFieldName":"Country", - "fieldSearch":"output_from_reverse_hostname_Country=* ", - "required":true, - "hidden":false, - "comment":"", - "displayName":"output_from_reverse_hostname_Country", - "fieldName":"output_from_reverse_hostname_Country", - "type":"string", - "owner":"event1" - } - ], - "comment":"", - "calculationID":"pbe9bd0rp4", - "editable":true, - "inputField":"output_from_reverse_hostname", - "calculationType":"GeoIP", - "owner":"event1" - } - ], - "children":[ - - ], - "previewSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* ", - "comment":"", - "fields":[ - { - "multivalue":false, - "type":"timestamp", - "comment":"", - "required":false, - "editable":false, - "hidden":false, - "fieldName":"_time", - "displayName":"_time", - "owner":"BaseEvent", - "fieldSearch":"" - }, - { - "multivalue":false, - "type":"string", - "comment":"", - "required":false, - "editable":false, - "hidden":false, - "fieldName":"host", - "displayName":"host", - "owner":"BaseEvent", - "fieldSearch":"" - }, - { - "multivalue":false, - "type":"string", - "comment":"", - "required":false, - "editable":false, - "hidden":false, - "fieldName":"source", - "displayName":"source", - "owner":"BaseEvent", - "fieldSearch":"" - }, - { - "multivalue":false, - "type":"string", - "comment":"", - "required":false, - "editable":false, - "hidden":false, - "fieldName":"sourcetype", - "displayName":"sourcetype", - "owner":"BaseEvent", - "fieldSearch":"" - }, - { - "multivalue":false, - "type":"objectCount", - "comment":"", - "required":false, - "editable":false, - "hidden":false, - "fieldName":"event1", - "displayName":"event1", - "owner":"event1", - "fieldSearch":"" - } - ], - "objectName":"event1", - "displayName":"event1", - "parentName":"BaseEvent", - "lineage":"event1", - "autoextractSearch":" (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) " - }, - { - "constraints":[ - - ], - "objectsToGroup":[ - "event1" - ], - "tsidxNamespace":"", - "objectSearchNoFields":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | transaction mvlist=t keepevicted=f maxspan=100m maxpause=25s host from | search *", - "transactionMaxPause":"25s", - "groupByFields":[ - "host", - "from" - ], - "objectSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | transaction mvlist=t keepevicted=f maxspan=100m maxpause=25s host from | search * | fields \"eventcount\", \"duration\", \"_time\", \"host\", \"source\", \"sourcetype\", \"new_field\", \"output_from_reverse_hostname\", \"from\", \"to\", \"output_from_reverse_hostname_lon\", \"output_from_reverse_hostname_lat\", \"output_from_reverse_hostname_City\", \"output_from_reverse_hostname_Region\", \"output_from_reverse_hostname_Country\"", - "calculations":[ - - ], - "children":[ - - ], - "previewSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | head 10000 | transaction keepevicted=f maxspan=100m maxpause=25s host from | search *", - "comment":"", - "fields":[ - { - "multivalue":false, - "type":"number", - "comment":"", - "required":true, - "editable":false, - "hidden":false, - "fieldName":"eventcount", - "displayName":"eventcount", - "owner":"BaseEventSet", - "fieldSearch":"eventcount=* " - }, - { - "multivalue":false, - "type":"number", - "comment":"", - "required":true, - "editable":false, - "hidden":false, - "fieldName":"duration", - "displayName":"duration", - "owner":"BaseEventSet", - "fieldSearch":"duration=* " - }, - { - "multivalue":false, - "type":"timestamp", - "comment":"", - "required":true, - "editable":false, - "hidden":false, - "fieldName":"_time", - "displayName":"_time", - "owner":"BaseEventSet", - "fieldSearch":"_time=* " - }, - { - "multivalue":true, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"host", - "displayName":"host", - "owner":"BaseTransaction", - "fieldSearch":"" - }, - { - "multivalue":true, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"source", - "displayName":"source", - "owner":"BaseTransaction", - "fieldSearch":"" - }, - { - "multivalue":true, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"sourcetype", - "displayName":"sourcetype", - "owner":"BaseTransaction", - "fieldSearch":"" - }, - { - "multivalue":true, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"new_field", - "displayName":"new_field", - "owner":"BaseTransaction", - "fieldSearch":"" - }, - { - "multivalue":true, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"output_from_reverse_hostname", - "displayName":"output_from_reverse_hostname", - "owner":"BaseTransaction", - "fieldSearch":"" - }, - { - "multivalue":true, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"from", - "displayName":"from", - "owner":"BaseTransaction", - "fieldSearch":"" - }, - { - "multivalue":true, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"to", - "displayName":"to", - "owner":"BaseTransaction", - "fieldSearch":"" - }, - { - "multivalue":true, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"output_from_reverse_hostname_lon", - "displayName":"output_from_reverse_hostname_lon", - "owner":"BaseTransaction", - "fieldSearch":"" - }, - { - "multivalue":true, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"output_from_reverse_hostname_lat", - "displayName":"output_from_reverse_hostname_lat", - "owner":"BaseTransaction", - "fieldSearch":"" - }, - { - "multivalue":true, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"output_from_reverse_hostname_City", - "displayName":"output_from_reverse_hostname_City", - "owner":"BaseTransaction", - "fieldSearch":"" - }, - { - "multivalue":true, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"output_from_reverse_hostname_Region", - "displayName":"output_from_reverse_hostname_Region", - "owner":"BaseTransaction", - "fieldSearch":"" - }, - { - "multivalue":true, - "type":"string", - "comment":"", - "required":false, - "editable":true, - "hidden":false, - "fieldName":"output_from_reverse_hostname_Country", - "displayName":"output_from_reverse_hostname_Country", - "owner":"BaseTransaction", - "fieldSearch":"" - }, - { - "multivalue":false, - "type":"objectCount", - "comment":"", - "required":false, - "editable":false, - "hidden":false, - "fieldName":"transaction1", - "displayName":"transaction1", - "owner":"transaction1", - "fieldSearch":"" - } - ], - "objectName":"transaction1", - "transactionMaxTimeSpan":"100m", - "displayName":"transaction1", - "parentName":"BaseTransaction", - "lineage":"transaction1", - "autoextractSearch":" | search (uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")) | eval \"new_field\"=if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\") | lookup dnslookup a_lookup_field AS host OUTPUT reverse_hostname AS output_from_reverse_hostname | rex field=_raw \" From: (?.*) To: (?.*) \" max_match=1 | iplocation \"output_from_reverse_hostname\" prefix=output_from_reverse_hostname_ | search new_field=* output_from_reverse_hostname=* output_from_reverse_hostname_lon=* output_from_reverse_hostname_lat=* output_from_reverse_hostname_City=* output_from_reverse_hostname_Region=* output_from_reverse_hostname_Country=* | transaction mvlist=t keepevicted=f maxspan=100m maxpause=25s host from | search *" - }, - { - "constraints":[ - - ], - "tsidxNamespace":"", - "objectSearchNoFields":"| search search index=_internal | head 10| rename \"is_subsearch\" AS \"search1.is_subsearch\", \"is_not_subsearch\" AS \"search1.is_not_subsearch\" | rename \"search1.is_subsearch\" AS \"is_subsearch\", \"search1.is_not_subsearch\" AS \"is_not_subsearch\" | eval \"is_subsearch\"=if(searchmatch(\" (boris=meep) \"),1,0) | eval \"is_not_subsearch\"=if(searchmatch(\"NOT( (boris=meep) )\"),1,0) | rename \"is_subsearch\" AS \"search1.is_subsearch\", \"is_not_subsearch\" AS \"search1.is_not_subsearch\"", - "objectSearch":"| search search index=_internal | head 10| rename \"is_subsearch\" AS \"search1.is_subsearch\", \"is_not_subsearch\" AS \"search1.is_not_subsearch\" | rename \"search1.is_subsearch\" AS \"is_subsearch\", \"search1.is_not_subsearch\" AS \"is_not_subsearch\" | eval \"is_subsearch\"=if(searchmatch(\" (boris=meep) \"),1,0) | eval \"is_not_subsearch\"=if(searchmatch(\"NOT( (boris=meep) )\"),1,0) | rename \"is_subsearch\" AS \"search1.is_subsearch\", \"is_not_subsearch\" AS \"search1.is_not_subsearch\" | fields \"search1.is_subsearch\", \"search1.is_not_subsearch\"", - "calculations":[ - { - "expression":"if(searchmatch(\" (boris=meep) \"),1,0)", - "outputFields":[ - { - "multivalue":false, - "type":"childCount", - "comment":"", - "required":false, - "editable":false, - "hidden":false, - "fieldName":"is_subsearch", - "displayName":"is_subsearch", - "owner":"search1", - "fieldSearch":"" - } - ], - "comment":"", - "calculationID":"0ed17fcd0954d6299d64bf4e1556514229b61fa8", - "editable":false, - "calculationType":"Eval", - "owner":"search1" - }, - { - "expression":"if(searchmatch(\"NOT( (boris=meep) )\"),1,0)", - "outputFields":[ - { - "multivalue":false, - "type":"childCount", - "comment":"", - "required":false, - "editable":false, - "hidden":false, - "fieldName":"is_not_subsearch", - "displayName":"is_not_subsearch", - "owner":"search1", - "fieldSearch":"" - } - ], - "comment":"", - "calculationID":"ce565b44f7e01bb1ea9afb742f5bb361f94e39b2", - "editable":false, - "calculationType":"Eval", - "owner":"search1" - } - ], - "children":[ - "subsearch" - ], - "previewSearch":"| search search index=_internal | head 10", - "comment":"", - "fields":[ - { - "multivalue":false, - "type":"objectCount", - "comment":"", - "required":false, - "editable":false, - "hidden":false, - "fieldName":"search1", - "displayName":"search1", - "owner":"search1", - "fieldSearch":"" - } - ], - "objectName":"search1", - "displayName":"search1", - "baseSearch":"search index=_internal | head 10", - "parentName":"BaseSearch", - "lineage":"search1", - "autoextractSearch":"| search search index=_internal | head 10" - }, - { - "constraints":[ - { - "search":"boris=meep", - "owner":"search1.subsearch" - } - ], - "tsidxNamespace":"", - "objectSearchNoFields":"| search search index=_internal | head 10 | search (boris=meep) ", - "objectSearch":"| search search index=_internal | head 10 | search (boris=meep) ", - "calculations":[ - - ], - "children":[ - - ], - "previewSearch":"| search search index=_internal | head 10 | search (boris=meep) ", - "comment":"", - "fields":[ - { - "multivalue":false, - "type":"objectCount", - "comment":"", - "required":false, - "editable":false, - "hidden":false, - "fieldName":"subsearch", - "displayName":"subsearch", - "owner":"search1.subsearch", - "fieldSearch":"" - } - ], - "objectName":"subsearch", - "displayName":"subsearch", - "baseSearch":"search index=_internal | head 10", - "parentName":"search1", - "lineage":"search1.subsearch", - "autoextractSearch":"| search search index=_internal | head 10" - } - ] -} \ No newline at end of file diff --git a/tests_spike/data/model_with_unicode_headers.json b/tests_spike/data/model_with_unicode_headers.json deleted file mode 100644 index 88ba67d32..000000000 --- a/tests_spike/data/model_with_unicode_headers.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "displayName": "·Ä©·öô‡Øµ", - "description": "‡Øµ‡Ø±‡Ø∞‡ØØ", - "objects": [] -} \ No newline at end of file diff --git a/tests_spike/data/object_with_one_search.json b/tests_spike/data/object_with_one_search.json deleted file mode 100644 index 8eff7775c..000000000 --- a/tests_spike/data/object_with_one_search.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "displayName": "·Ä©·öô‡Øµ", - "description": "‡Øµ‡Ø±‡Ø∞‡ØØ", - "objects": [ - { - "objectName": "search1", - "displayName": "‡Øµ‡Ø±‡Ø∞‡ØØ - search 1", - "parentName": "BaseEvent", - "fields": [], - "calculations": [], - "constraints": [] - } - ] -} \ No newline at end of file diff --git a/tests_spike/data/object_with_two_searches.json b/tests_spike/data/object_with_two_searches.json deleted file mode 100644 index ccc6ae66d..000000000 --- a/tests_spike/data/object_with_two_searches.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "displayName": "·Ä©·öô‡Øµ 2", - "description": "‡Øµ‡Ø±‡Ø∞‡ØØ", - "objects": [ - { - "objectName": "search1", - "displayName": "‡Øµ‡Ø±‡Ø∞‡ØØ - search 1", - "parentName": "BaseEvent", - "fields": [], - "calculations": [], - "constraints": [] - }, - { - "objectName": "search2", - "displayName": "‡Øµ‡Ø±‡Ø∞‡ØØ - search 2", - "parentName": "BaseEvent", - "fields": [], - "calculations": [], - "constraints": [] - } - ] -} \ No newline at end of file diff --git a/tests_spike/modularinputs/data/argument_with_defaults.xml b/tests_spike/modularinputs/data/argument_with_defaults.xml deleted file mode 100644 index 56a2e3dff..000000000 --- a/tests_spike/modularinputs/data/argument_with_defaults.xml +++ /dev/null @@ -1,5 +0,0 @@ - - string - false - false - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/argument_without_defaults.xml b/tests_spike/modularinputs/data/argument_without_defaults.xml deleted file mode 100644 index 5560186ea..000000000 --- a/tests_spike/modularinputs/data/argument_without_defaults.xml +++ /dev/null @@ -1,7 +0,0 @@ - - 쎼 and 쎶 and <&> für - is_pos_int('some_name') - boolean - true - true - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/conf_with_0_inputs.xml b/tests_spike/modularinputs/data/conf_with_0_inputs.xml deleted file mode 100644 index 4530a8b06..000000000 --- a/tests_spike/modularinputs/data/conf_with_0_inputs.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - tiny - https://127.0.0.1:8089 - /some/dir - 123102983109283019283 - - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/conf_with_2_inputs.xml b/tests_spike/modularinputs/data/conf_with_2_inputs.xml deleted file mode 100644 index 99299a631..000000000 --- a/tests_spike/modularinputs/data/conf_with_2_inputs.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - tiny - https://127.0.0.1:8089 - /some/dir - 123102983109283019283 - - - value1 - value2 - 0 - default - - - value11 - value22 - 0 - default - - value1 - value2 - - - value3 - value4 - - - - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/conf_with_5_inputs.xml b/tests_spike/modularinputs/data/conf_with_5_inputs.xml deleted file mode 100644 index 89309de8a..000000000 --- a/tests_spike/modularinputs/data/conf_with_5_inputs.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - tiny - https://127.0.0.1:8089 - /some/dir - 123102983109283019283 - - - value1 - value2 - 0 - default - - - value11 - value22 - 0 - default - - value1 - value2 - - - value3 - value4 - - - - value1 - value2 - 0 - default - - - value11 - value22 - 0 - default - - value1 - value2 - - - value3 - value4 - - - - value1 - value2 - 0 - default - - - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/conf_with_invalid_inputs.xml b/tests_spike/modularinputs/data/conf_with_invalid_inputs.xml deleted file mode 100644 index 879257f62..000000000 --- a/tests_spike/modularinputs/data/conf_with_invalid_inputs.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - tiny - https://127.0.0.1:8089 - /opt/splunk/var/lib/splunk/modinputs - 123102983109283019283 - - - value1 - value2 - 0 - default - - - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/event_maximal.xml b/tests_spike/modularinputs/data/event_maximal.xml deleted file mode 100644 index ba94e1e0f..000000000 --- a/tests_spike/modularinputs/data/event_maximal.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - hilda - misc - main - localhost - This is a test of the emergency broadcast system. - - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/event_minimal.xml b/tests_spike/modularinputs/data/event_minimal.xml deleted file mode 100644 index 7b743a385..000000000 --- a/tests_spike/modularinputs/data/event_minimal.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - This is a test of the emergency broadcast system. - - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/scheme_with_defaults.xml b/tests_spike/modularinputs/data/scheme_with_defaults.xml deleted file mode 100644 index 0a17ac7e0..000000000 --- a/tests_spike/modularinputs/data/scheme_with_defaults.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - abcd - true - false - xml - - - - - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/scheme_without_defaults.xml b/tests_spike/modularinputs/data/scheme_without_defaults.xml deleted file mode 100644 index ef48af5fa..000000000 --- a/tests_spike/modularinputs/data/scheme_without_defaults.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - abcd - 쎼 and 쎶 and <&> für - false - true - simple - - - - string - false - false - - - 쎼 and 쎶 and <&> für - is_pos_int('some_name') - number - true - true - - - - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/stream_with_five_events.xml b/tests_spike/modularinputs/data/stream_with_five_events.xml deleted file mode 100644 index 35963c47f..000000000 --- a/tests_spike/modularinputs/data/stream_with_five_events.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - hilda - misc - main - localhost - This is a test of the emergency broadcast system. 1 - - - - - hilda - misc - main - localhost - This is a test of the emergency broadcast system. 2 - - - - - hilda - misc - main - localhost - This is a test of the emergency broadcast system. 3 - - - - - hilda - misc - main - localhost - This is a test of the emergency broadcast system. 4 - - - - - hilda - misc - main - localhost - This is a test of the emergency broadcast system. 5 - - - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/stream_with_one_event.xml b/tests_spike/modularinputs/data/stream_with_one_event.xml deleted file mode 100644 index 91572cadb..000000000 --- a/tests_spike/modularinputs/data/stream_with_one_event.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - hilda - misc - main - localhost - This is a test of the emergency broadcast system. - - - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/stream_with_two_events.xml b/tests_spike/modularinputs/data/stream_with_two_events.xml deleted file mode 100644 index 977c710cc..000000000 --- a/tests_spike/modularinputs/data/stream_with_two_events.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - hilda - misc - main - localhost - This is a test of the emergency broadcast system. - - - - - hilda - misc - main - localhost - This is a test of the emergency broadcast system. - - - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/stream_with_two_json_events.xml b/tests_spike/modularinputs/data/stream_with_two_json_events.xml deleted file mode 100644 index e466f249b..000000000 --- a/tests_spike/modularinputs/data/stream_with_two_json_events.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - hilda - misc - main - localhost - {"some":"json"} - - - - - hilda - misc - main - localhost - {"some":"json object"} - - - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/validation.xml b/tests_spike/modularinputs/data/validation.xml deleted file mode 100644 index b1341ee33..000000000 --- a/tests_spike/modularinputs/data/validation.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - tiny - https://127.0.0.1:8089 - /opt/splunk/var/lib/splunk/modinputs - 123102983109283019283 - - - value1 - value2 - 0 - default - - value1 - value2 - - - value3 - value4 - - - \ No newline at end of file diff --git a/tests_spike/modularinputs/data/validation_error.xml b/tests_spike/modularinputs/data/validation_error.xml deleted file mode 100644 index e119300e0..000000000 --- a/tests_spike/modularinputs/data/validation_error.xml +++ /dev/null @@ -1 +0,0 @@ -Big fat validation error! \ No newline at end of file diff --git a/tests_spike/modularinputs/index.js b/tests_spike/modularinputs/index.js deleted file mode 100644 index 78f036634..000000000 --- a/tests_spike/modularinputs/index.js +++ /dev/null @@ -1,27 +0,0 @@ - -// Copyright 2014 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. - -var splunkjs = require('../../index'); -splunkjs.Logger.setLevel("ALL"); - -// // Modular input tests -module.exports = ( - require('./test_event').setup(), - require('./test_input_definition').setup(), - require('./test_modularinput').setup(), - require('./test_scheme').setup(), - require('./test_validation_definition').setup() -) - diff --git a/tests_spike/modularinputs/test_event.js b/tests_spike/modularinputs/test_event.js deleted file mode 100644 index 34fcceba8..000000000 --- a/tests_spike/modularinputs/test_event.js +++ /dev/null @@ -1,355 +0,0 @@ - -// Copyright 2014 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. - -var assert = require('chai').assert; -var ET = require("elementtree"); - -var splunkjs = require('../../index'); -var testUtils = require("./utils"); - -exports.setup = function () { - var ModularInput = splunkjs.ModularInputs; - var Logger = splunkjs.ModularInputs.Logger; - var Event = ModularInput.Event; - var EventWriter = ModularInput.EventWriter; - var utils = ModularInput.utils; - - splunkjs.Logger.setLevel("ALL"); - - function compareEvents(expected, found) { - assert.ok(testUtils.XMLCompare(expected, found)); - assert.equal(expected.tag.trim(), found.tag.trim()); - assert.equal(expected.text.trim(), found.text.trim()); - assert.equal(expected.tail, found.tail); - assert.equal(expected.attrib.stanza, found.attrib.stanza); - assert.equal(expected.attrib.unbroken, found.attrib.unbroken); - assert.equal(expected._children.length, found._children.length); - if (expected._children.length > 0) { - testChildren(expected, found); - } - } - - function testChildren(expected, found) { - // Sort the children by tag name - var expectedChildren = testUtils.sortByKey(expected._children, "tag"); - var foundChildren = testUtils.sortByKey(found._children, "tag"); - - for (var i = 0; i < foundChildren.length; i++) { - var f = foundChildren[i]; - var ex = expectedChildren[i]; - assert.equal(ex.tag.trim(), f.tag.trim()); - assert.equal(ex.text.trim(), f.text.trim()); - assert.equal(ex.tail.trim(), f.tail.trim()); - assert.deepEqual(ex.attrib, f.attrib); - assert.equal(ex._children.length, f._children.length); - } - } - - return ( - describe("Event tests", function () { - this.beforeEach(function (done) { - done(); - }); - - it("Event class handles times correctly - Date object", function (done) { - var now = Date.now(); - var expected = (now / 1000).toFixed(3); - var found = Event.formatTime(now); - assert.equal(found, expected); - - var old = new Date(1372187084); - var oldExpected = (1372187084000 / 1000).toFixed(3); - var oldFound = Event.formatTime(old); - assert.equal(oldFound, oldExpected); - - var other = Date.parse("2014-04-11T19:41:32Z"); - var otherExpected = (1397245292000 / 1000).toFixed(3); - var otherFound = Event.formatTime(other); - assert.equal(otherFound, otherExpected); - - done(); - }); - - it("Event class handles times correctly - String", function (done) { - // Test time in seconds - var stringTime = "1372187084"; - var expected = 1372187084.000; - var found = Event.formatTime(stringTime); - assert.equal(found, expected); - - // Test a super small time, 4 seconds since the epoch - var tinyStringTime = "4"; - expected = 4.000; - found = Event.formatTime(tinyStringTime); - assert.equal(found, expected); - - // Test the time in milliseconds - var milliStringTime = "1372187084000"; - expected = 1372187084.000; - found = Event.formatTime(milliStringTime); - assert.equal(found, expected); - - // Test a huge integer value, just get the first 14 digits - var hugeStringTime = "13721870840001234"; - expected = 1372187084.000; - found = Event.formatTime(hugeStringTime); - assert.equal(found, expected); - - // Test a value starting with zeros - var leadingZeroStringTime = "000000000137218.442"; - expected = 137218.442; - found = Event.formatTime(leadingZeroStringTime); - assert.equal(found, expected); - - done(); - }); - - it("Event class handles times correctly - Number (integer)", function (done) { - // Test time in seconds - var intTime = 1372187084; - var expected = 1372187084.000; - var found = Event.formatTime(intTime); - assert.equal(found, expected); - - // Test a super small time, 4 seconds since the epoch - var tinyIntTime = 4; - expected = 4.000; - found = Event.formatTime(tinyIntTime); - assert.equal(found, expected); - - // Test the time in milliseconds - var milliIntTime = 1372187084000; - expected = 1372187084.000; - found = Event.formatTime(milliIntTime); - assert.equal(found, expected); - - // Test a huge integer value, just get the first 14 digits - var hugeIntTime = 13721870840001234; - expected = 1372187084.000; - found = Event.formatTime(hugeIntTime); - assert.equal(found, expected); - - done(); - }); - - it("Event class handles times correctly - Number (float)", function (done) { - // Test a perfect value - var floatTime = 1372187084.424; - var expected = 1372187084.424; - var found = Event.formatTime(floatTime); - assert.equal(found, expected); - - // Test a really long decimal value - var longDecimalFloatTime = 1372187084.424242425350823423423; - expected = 1372187084.424; - found = Event.formatTime(longDecimalFloatTime); - assert.equal(found, expected); - - // Test a date far into the future - var crazyFloatTime = 13721874084.424242425350823423423; - expected = 13721874084.420; - found = Event.formatTime(crazyFloatTime); - assert.equal(found, expected); - - // Test a really really far into the future - var crazyFloatTime2 = 1372187084555.424242425350823423423; - expected = 1372187084555.000; - found = Event.formatTime(crazyFloatTime2); - assert.equal(found, expected); - - // Test a slightly crazy value - var crazyFloatTime3 = 137218.424242425350823423423; - expected = 137218.424; - found = Event.formatTime(crazyFloatTime3); - assert.equal(found, expected); - - // Test a tiny value - var crazyFloatTime5 = 4.001234235; - expected = 4.001; - found = Event.formatTime(crazyFloatTime5); - assert.equal(found, expected); - - done(); - }); - - it("Event without enough fields throws error", function (done) { - try { - var myEvent = new Event(); - myEvent._writeTo(testUtils.getDuplexStream()); - assert.ok(false); // This should not execute if an error is thrown by `Event._writeTo` - } - catch (e) { - assert.equal(e.message, "Events must have at least the data field set to be written to XML."); - assert.ok(e); - } - done(); - }); - - it("Event with minimal config matches expected XML", function (done) { - var out = testUtils.getDuplexStream(); - - var myEvent = new Event({ - data: "This is a test of the emergency broadcast system.", - stanza: "fubar", - time: 1372187084.000 - }); - - var expectedEvent = utils.readFile(__filename, "../data/event_minimal.xml"); - - try { - myEvent._writeTo(out); - var found = ET.parse(out._read()).getroot(); - var expected = ET.parse(expectedEvent).getroot(); - compareEvents(expected, found); - } - catch (e) { - Logger.error("", "Something happened!", e); - assert.ok(false); - } - done(); - }); - - it("Event with full config matches expected XML", function (done) { - var out = testUtils.getDuplexStream(); - - var myEvent = new Event({ - data: "This is a test of the emergency broadcast system.", - stanza: "fubar", - time: 1372274622.493, - host: "localhost", - index: "main", - source: "hilda", - sourcetype: "misc", - done: true, - unbroken: true - }); - - var expectedEvent = utils.readFile(__filename, "../data/event_maximal.xml"); - - try { - myEvent._writeTo(out); - var found = ET.parse(out._read()).getroot(); - var expected = ET.parse(expectedEvent).getroot(); - assert.ok(testUtils.XMLCompare(expected, found)); - compareEvents(expected, found); - } - catch (e) { - assert.ok(false); - } - done(); - }); - - it("EventWriter event writing works", function (done) { - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - - var myEvent = new Event({ - data: "This is a test of the emergency broadcast system.", - stanza: "fubar", - time: 1372275124.466, - host: "localhost", - index: "main", - source: "hilda", - sourcetype: "misc", - done: true, - unbroken: true - }); - - var expectedOne = utils.readFile(__filename, "../data/stream_with_one_event.xml"); - var expectedTwo = utils.readFile(__filename, "../data/stream_with_two_events.xml"); - - var ew = new EventWriter(out, err); - - try { - ew.writeEvent(myEvent); - var found = ET.parse(ew._out._read() + "").getroot(); - var expected = ET.parse(expectedOne).getroot(); - assert.ok(testUtils.XMLCompare(expected, found)); - compareEvents(expected, found); - - ew.writeEvent(myEvent); - ew.close(); - - found = ET.parse(ew._out._read()).getroot(); - expected = ET.parse(expectedTwo).getroot(); - assert.ok(testUtils.XMLCompare(expected, found)); - compareEvents(expected, found); - } - catch (e) { - assert.ok(false); - } - done(); - }); - - it("EventWriter gets an error from invalid Event", function (done) { - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - - var ew = new EventWriter(out, err); - - try { - ew.writeEvent(new Event()); - assert.ok(false); // This should not execute if an error is thrown by `EventWriter.writeEvent` - } - catch (e) { - assert.ok(e); - assert.ok(utils.startsWith(ew._err._read(), Logger.WARN)); - } - done(); - }); - - it("EventWriter logging works", function (done) { - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - - var ew = new EventWriter(out, err); - - try { - Logger.error("", "Something happened!", err); - assert.ok(utils.startsWith(ew._err._read(), Logger.ERROR)); - } - catch (e) { - assert.ok(false); - } - done(); - }); - - it("EventWriter XML writing works", function (done) { - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - - var ew = new EventWriter(out, err); - - var expected = ET.parse(utils.readFile(__filename, "../data/event_minimal.xml")).getroot(); - - try { - ew.writeXMLDocument(expected); - var found = ET.parse(ew._out._read()).getroot(); - assert.ok(testUtils.XMLCompare(expected, found)); - compareEvents(expected, found); - } - catch (e) { - assert.ok(false); - } - done(); - }); - }) - ) -}; - -// Run the individual test suite -if (module === require.cache[__filename] && !module.parent) { - module.exports = exports.setup(); -} diff --git a/tests_spike/modularinputs/test_input_definition.js b/tests_spike/modularinputs/test_input_definition.js deleted file mode 100644 index af44e67cb..000000000 --- a/tests_spike/modularinputs/test_input_definition.js +++ /dev/null @@ -1,132 +0,0 @@ - -// Copyright 2014 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. - -var assert = require('chai').assert; - -const { Logger } = require("../../lib/log"); -var splunkjs = require('../../index'); - -exports.setup = function () { - var ModularInputs = splunkjs.ModularInputs; - var InputDefinition = ModularInputs.InputDefinition; - var utils = ModularInputs.utils; - - splunkjs.Logger.setLevel("ALL"); - - return ( - describe("Input Definition tests", function (done) { - this.beforeEach(function (done) { - done(); - }); - - it("Parse produces expected result - no inputs", function (done) { - var expected = new InputDefinition(); - expected.metadata = { - "server_host": "tiny", - "server_uri": "https://127.0.0.1:8089", - "checkpoint_dir": "/some/dir", - "session_key": "123102983109283019283" - }; - - try { - var found = InputDefinition.parse(utils.readFile(__filename, "../data/conf_with_0_inputs.xml")); - - assert.equal(found.metadata["server_host"], expected.metadata["server_host"]); - assert.equal(found.metadata["server_uri"], expected.metadata["server_uri"]); - assert.equal(found.metadata["checkpoint_dir"], expected.metadata["checkpoint_dir"]); - assert.equal(found.metadata["session_key"], expected.metadata["session_key"]); - assert.deepEqual(found, expected); - } - catch (e) { - Logger.info(JSON.stringify(e)); - assert.ok(false); - } - done(); - }); - - it("Parse produces expected result - 2 inputs", function (done) { - var expected = new InputDefinition(); - expected.metadata = { - "server_host": "tiny", - "server_uri": "https://127.0.0.1:8089", - "checkpoint_dir": "/some/dir", - "session_key": "123102983109283019283" - }; - expected.inputs["foobar://aaa"] = { - "param1": "value1", - "param2": "value2", - "disabled": "0", - "index": "default" - }; - expected.inputs["foobar://bbb"] = { - "param1": "value11", - "param2": "value22", - "disabled": "0", - "index": "default", - "multiValue": ["value1", "value2"], - "multiValue2": ["value3", "value4"] - }; - - try { - var found = InputDefinition.parse(utils.readFile(__filename, "../data/conf_with_2_inputs.xml")); - - assert.equal(found.metadata["server_host"], expected.metadata["server_host"]); - assert.equal(found.metadata["server_uri"], expected.metadata["server_uri"]); - assert.equal(found.metadata["checkpoint_dir"], expected.metadata["checkpoint_dir"]); - assert.equal(found.metadata["session_key"], expected.metadata["session_key"]); - - assert.deepEqual(found.inputs["foobar://bbb"], expected.inputs["foobar://bbb"]); - assert.equal(found.inputs["foobar://bbb"]["param1"], expected.inputs["foobar://bbb"]["param1"]); - assert.equal(found.inputs["foobar://bbb"]["param2"], expected.inputs["foobar://bbb"]["param2"]); - assert.equal(found.inputs["foobar://bbb"]["disabled"], expected.inputs["foobar://bbb"]["disabled"]); - assert.equal(found.inputs["foobar://bbb"]["index"], expected.inputs["foobar://bbb"]["index"]); - - assert.deepEqual(found.inputs["foobar://bbb"], expected.inputs["foobar://bbb"]); - assert.equal(found.inputs["foobar://bbb"]["param1"], expected.inputs["foobar://bbb"]["param1"]); - assert.equal(found.inputs["foobar://bbb"]["param2"], expected.inputs["foobar://bbb"]["param2"]); - assert.equal(found.inputs["foobar://bbb"]["disabled"], expected.inputs["foobar://bbb"]["disabled"]); - assert.equal(found.inputs["foobar://bbb"]["index"], expected.inputs["foobar://bbb"]["index"]); - assert.deepEqual(found.inputs["foobar://bbb"]["multiValue"], expected.inputs["foobar://bbb"]["multiValue"]); - assert.equal(found.inputs["foobar://bbb"]["multiValue"][0], expected.inputs["foobar://bbb"]["multiValue"][0]); - assert.equal(found.inputs["foobar://bbb"]["multiValue"][1], expected.inputs["foobar://bbb"]["multiValue"][1]); - assert.deepEqual(found.inputs["foobar://bbb"]["multiValue2"], expected.inputs["foobar://bbb"]["multiValue2"]); - assert.equal(found.inputs["foobar://bbb"]["multiValue2"][0], expected.inputs["foobar://bbb"]["multiValue2"][0]); - assert.equal(found.inputs["foobar://bbb"]["multiValue2"][1], expected.inputs["foobar://bbb"]["multiValue2"][1]); - - assert.deepEqual(found, expected); - } - catch (e) { - assert.ok(false); - } - done(); - }); - - it("Parse throws an error with malformed input definition", function (done) { - try { - InputDefinition.parse(utils.readFile(__filename, "../data/conf_with_invalid_inputs.xml")); - assert.ok(false); - } - catch (e) { - assert.ok(true); - } - done(); - }); - }) - ) -} -// Run the individual test suite -if (module === require.cache[__filename] && !module.parent) { - module.exports = exports.setup(); -} diff --git a/tests_spike/modularinputs/test_modularinput.js b/tests_spike/modularinputs/test_modularinput.js deleted file mode 100644 index 3c2e5f59c..000000000 --- a/tests_spike/modularinputs/test_modularinput.js +++ /dev/null @@ -1,728 +0,0 @@ - -// Copyright 2014 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. - -var assert = require('chai').assert; -var ET = require("elementtree"); - -var splunkjs = require("../../index"); -var testUtils = require("./utils"); - -exports.setup = function () { - var ModularInputs = splunkjs.ModularInputs; - var Logger = ModularInputs.Logger; - var ModularInput = ModularInputs.ModularInput; - var Event = ModularInputs.Event; - var EventWriter = ModularInputs.EventWriter; - var Scheme = ModularInputs.Scheme; - var Argument = ModularInputs.Argument; - var utils = ModularInputs.utils; - - splunkjs.Logger.setLevel("ALL"); - - var TEST_SCRIPT_PATH = "__IGNORED_SCRIPT_PATH__"; - - return ( - describe("ModularInput tests", function (done) { - this.beforeEach(function (done) { - done(); - }); - - it("ModularInputs logger works, severity: DEBUG", function (done) { - var err = testUtils.getDuplexStream(); - try { - Logger.debug("Modular Input Tests", "Something happened!", err); - assert.ok(utils.startsWith(err._read(), Logger.DEBUG)); - } - catch (e) { - assert.ok(false); - } - done(); - }); - - it("ModularInputs logger works, severity: INFO", function (done) { - var err = testUtils.getDuplexStream(); - try { - Logger.info("Modular Input Tests", "Something happened!", err); - assert.ok(utils.startsWith(err._read(), Logger.INFO)); - } - catch (e) { - assert.ok(false); - } - done(); - }); - - it("ModularInputs logger works, severity: WARN", function (done) { - var err = testUtils.getDuplexStream(); - try { - Logger.warn("Modular Input Tests", "Something happened!", err); - assert.ok(utils.startsWith(err._read(), Logger.WARN)); - } - catch (e) { - assert.ok(false); - } - done(); - }); - - it("ModularInputs logger works, severity: ERROR", function (done) { - var err = testUtils.getDuplexStream(); - try { - Logger.error("Modular Input Tests", "Something happened!", err); - assert.ok(utils.startsWith(err._read(), Logger.ERROR)); - } - catch (e) { - assert.ok(false); - } - done(); - }); - - it("ModularInputs logger works, severity: FATAL", function (done) { - var err = testUtils.getDuplexStream(); - try { - Logger.fatal("Modular Input Tests", "Something happened!", err); - assert.ok(utils.startsWith(err._read(), Logger.FATAL)); - } - catch (e) { - assert.ok(false); - } - done(); - }); - - it("An error happens when a ModularInput gets bad args", function (done) { - // A script that returns a null scheme should generate no output on stdout - // and an error on stderr saying that the scheme was null. - - exports.getScheme = function () { - return null; - }; - - exports.streamEvents = function () { - // Not used - return null; - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var inStream = testUtils.getReadableStream(); - - var args = [TEST_SCRIPT_PATH, "foobar"]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - var error = ew._err._read(); - - assert.ok(utils.startsWith(error, "ERROR Modular input Invalid arguments to modular input script:")); - assert.strictEqual(1, scriptStatus); - done(); - }); - }); - - it("An error happens when a ModularInput has a null scheme", function (done) { - // A script that returns a null scheme should generate no output on stdout - // and an error on stderr saying that the scheme was null. - - exports.getScheme = function () { - return null; - }; - - exports.streamEvents = function () { - // Not used - return null; - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var inStream = testUtils.getReadableStream(); - - var args = [TEST_SCRIPT_PATH, "--scheme"]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - var error = ew._err._read(); - - assert.strictEqual(error, "FATAL Modular input script returned a null scheme.\n"); - assert.strictEqual(1, scriptStatus); - done(); - }); - }); - - it("ModularInput properly generates Scheme", function (done) { - // Check that a scheme generated by a script is what we expect. - - exports.getScheme = function () { - var scheme = new Scheme("abcd"); - scheme.description = "\uC3BC and \uC3B6 and <&> f\u00FCr"; - scheme.streamingMode = Scheme.streamingModeSimple; - scheme.useExternalValidation = false; - scheme.useSingleInstance = true; - - var arg1 = new Argument("arg1"); - scheme.addArgument(arg1); - - var arg2 = new Argument("arg2"); - arg2.description = "\uC3BC and \uC3B6 and <&> f\u00FCr"; - arg2.dataType = Argument.dataTypeNumber; - arg2.requiredOnCreate = true; - arg2.requiredOnEdit = true; - arg2.validation = "is_pos_int('some_name')"; - scheme.addArgument(arg2); - - return scheme; - }; - - exports.streamEvents = function () { - // Not used - return null; - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var inStream = testUtils.getReadableStream(); - - var args = [TEST_SCRIPT_PATH, "--scheme"]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - var expected = utils.readFile(__filename, "../data/scheme_without_defaults.xml"); - var output = ew._out._read(); - - assert.ok(testUtils.XMLCompare(ET.parse(expected), ET.parse(output))); - assert.strictEqual("", ew._err._read()); - assert.strictEqual(0, scriptStatus); - done(); - }); - }); - - it("ModularInput Input Validation succeeds", function (done) { - exports.getScheme = function () { - return null; - }; - - exports.validateInput = function (definition, done) { - // Always succeed - done(); - }; - - exports.streamEvents = function () { - // not used - return; - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var validationFile = utils.readFile(__filename, "../data/validation.xml"); - - var inStream = testUtils.getReadableStream(); - - var args = [TEST_SCRIPT_PATH, "--validate-arguments"]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - assert.ok(!err); - - assert.strictEqual("", ew._out._read()); - assert.strictEqual("", ew._err._read()); - assert.strictEqual(0, scriptStatus); - done(); - }); - inStream.emit("data", Buffer.from(validationFile)); - }); - - it("ModularInput Input Validation succeeds when validateInput is undefined", function (done) { - exports.getScheme = function () { - return null; - }; - - exports.validateInput = undefined; - - exports.streamEvents = function () { - // not used - return; - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var validationFile = utils.readFile(__filename, "../data/validation.xml"); - - var inStream = testUtils.getReadableStream(); - - var args = [TEST_SCRIPT_PATH, "--validate-arguments"]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - assert.ok(!err); - - assert.strictEqual("", ew._out._read()); - assert.strictEqual("", ew._err._read()); - assert.strictEqual(0, scriptStatus); - done(); - }); - inStream.emit("data", Buffer.from(validationFile)); - }); - - it("ModularInput Input Validation times out after 30s with impartial XML", function (done) { - - this.timeout(40000); - exports.getScheme = function () { - return null; - }; - - exports.validateInput = function () { - return; - }; - exports.validateInput = undefined; - - exports.streamEvents = function () { - // not used - return; - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var validationFile = utils.readFile(__filename, "../data/validation.xml"); - - var inStream = testUtils.getReadableStream(); - - var startTime = Date.now(); - - var args = [TEST_SCRIPT_PATH, "--validate-arguments"]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - assert.ok(err); - assert.strictEqual("Receiving validation definition prior to validating timed out.", err.message); - - assert.ok(Date.now() - startTime >= 30000); // Make sure it times out only after 30 seconds - assert.strictEqual("", ew._out._read()); - assert.strictEqual("", ew._err._read()); - assert.strictEqual(1, scriptStatus); - done(); - }); - // Remove the closing tag to send impartial data - inStream.emit("data", Buffer.from(validationFile.replace("", ""))); - }); - - it("ModularInput Input Validation fails", function (done) { - // Make logger noop so testoutput is cleaner - var loggerErrorBackup = Logger.error; - Logger.error = function () { }; - - exports.getScheme = function () { - return null; - }; - - exports.validateInput = function (definition, done) { - done(new Error("Big fat validation error!")); - }; - - exports.streamEvents = function () { - // not used - return; - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var inStream = testUtils.getReadableStream(); - - var validationFile = utils.readFile(__filename, "../data/validation.xml"); - - var args = [TEST_SCRIPT_PATH, "--validate-arguments"]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - assert.ok(err); - var output = ew._out._read(); - - var expected = ET.parse(utils.readFile(__filename, "../data/validation_error.xml")).getroot(); - var found = ET.parse(output).getroot(); - - assert.strictEqual(expected.tag, found.tag); - assert.strictEqual(expected.text.trim(), found.text.trim()); - assert.strictEqual(expected.tail, found.tail); - assert.strictEqual(expected.getchildren().length, found.getchildren().length); - - var expectedChildren = expected.getchildren(); - var foundChildren = found.getchildren(); - for (var i = 0; i < expectedChildren.length; i++) { - var expectedchild = expectedChildren[i]; - var foundChild = foundChildren[i]; - assert.strictEqual(expectedchild.tag, foundChild.tag); - assert.strictEqual(expectedchild.text.trim(), foundChild.text.trim()); - assert.strictEqual(expectedchild.tail, foundChild.tail); - } - - assert.ok(testUtils.XMLCompare(expected, found)); - assert.strictEqual("", ew._err._read()); - assert.strictEqual(1, scriptStatus); - done(); - }); - inStream.emit("data", Buffer.from(validationFile)); - }); - - it("ModularInput streaming events works - 2 inputs", function (done) { - exports.getScheme = function () { - return null; - }; - - exports.streamEvents = function (name, input, eventWriter, callback) { - var myEvent = new Event({ - data: "This is a test of the emergency broadcast system.", - stanza: "fubar", - time: 1372275124.466, - host: "localhost", - index: "main", - source: "hilda", - sourcetype: "misc", - done: true, - unbroken: true - }); - - try { - eventWriter.writeEvent(myEvent); - callback(null); - } - catch (e) { - callback(e); - } - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var inStream = testUtils.getReadableStream(); - - var inputConfiguration = utils.readFile(__filename, "../data/conf_with_2_inputs.xml"); - - var args = [TEST_SCRIPT_PATH]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - assert.ok(!err); - - var expected = utils.readFile(__filename, "../data/stream_with_two_events.xml"); - var found = ew._out._read(); - assert.ok(testUtils.XMLCompare(ET.parse(expected).getroot(), ET.parse(found).getroot())); - assert.strictEqual(0, scriptStatus); - done(); - }); - inStream.emit("data", Buffer.from(inputConfiguration)); - }); - - it("ModularInput streaming events works - 5 inputs", function (done) { - exports.getScheme = function () { - return null; - }; - - var num = 1; - exports.streamEvents = function (name, input, eventWriter, callback) { - var myEvent = new Event({ - data: "This is a test of the emergency broadcast system. " + num, - stanza: "fubar", - time: 1372275124.466, - host: "localhost", - index: "main", - source: "hilda", - sourcetype: "misc", - done: true, - unbroken: true - }); - - try { - eventWriter.writeEvent(myEvent); - num++; - callback(null); - } - catch (e) { - callback(e); - } - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var inStream = testUtils.getReadableStream(); - - var inputConfiguration = utils.readFile(__filename, "../data/conf_with_5_inputs.xml"); - - var args = [TEST_SCRIPT_PATH]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - assert.ok(!err); - - var expected = utils.readFile(__filename, "../data/stream_with_five_events.xml"); - var found = ew._out._read(); - - var expectedChildren = ET.parse(expected).getroot().getchildren(); - var foundChildren = ET.parse(found).getroot().getchildren(); - - // Loop through instead of comparing to hardcoded XML, since - // streamEvents() will be called several times in parallel - // and the events MAY not get streamed in the order they're sent. - var totalFound = 0; - // We're expecting 5 events to have data ending in a different value between 1 and 5 - for (var i = 1; i <= 5; i++) { - // Iterate over the individual events - for (var c = 0; c < foundChildren.length; c++) { - // Iterate over the tags of the current event - var tags = foundChildren[c].getchildren(); - for (var t = 0; t < tags.length; t++) { - // When we find the tag, read the text and check if it ends with the current value we're looking for - // between 1 and 5 - if (tags[t].tag === "data") { - if (tags[t].text.indexOf("This is a test of the emergency broadcast system. " + i) >= 0) { - totalFound++; - i++; - } - } - } - } - } - - assert.equal(5, totalFound); // Did we find as many events as we expected? - assert.equal(5, expectedChildren.length); - assert.equal(expectedChildren.length, foundChildren.length); - - assert.ok(testUtils.XMLCompare(ET.parse(expected).getroot(), ET.parse(found).getroot())); - assert.strictEqual(0, scriptStatus); - done(); - }); - inStream.emit("data", Buffer.from(inputConfiguration)); - }); - - it("ModularInput streaming events works - as object", function (done) { - exports.getScheme = function () { - return null; - }; - - var asObject = false; - exports.streamEvents = function (name, input, eventWriter, callback) { - var myEvent = new Event({ - data: "{\"some\":\"json\"}", - stanza: "fubar", - time: 1372275124.466, - host: "localhost", - index: "main", - source: "hilda", - sourcetype: "misc", - done: true, - unbroken: true - }); - - if (asObject) { - myEvent.data = { some: "json object" }; // Write a JS object - } - - try { - eventWriter.writeEvent(myEvent); - asObject = true; - callback(null); - } - catch (e) { - callback(e); - } - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var inStream = testUtils.getReadableStream(); - - var inputConfiguration = utils.readFile(__filename, "../data/conf_with_2_inputs.xml"); - - var args = [TEST_SCRIPT_PATH]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - assert.ok(!err); - - var expected = utils.readFile(__filename, "../data/stream_with_two_json_events.xml"); - var found = ew._out._read(); - - assert.ok(asObject); - assert.ok(testUtils.XMLCompare(ET.parse(expected).getroot(), ET.parse(found).getroot())); - assert.strictEqual(0, scriptStatus); - done(); - }); - inStream.emit("data", Buffer.from(inputConfiguration)); - }); - - it("ModularInput streaming events times out after 30s with impartial XML", function (done) { - - this.timeout(40000); - exports.getScheme = function () { - return null; - }; - - exports.streamEvents = function (name, input, eventWriter, callback) { - var myEvent = new Event({ - data: "This is a test of the emergency broadcast system.", - stanza: "fubar", - time: 1372275124.466, - host: "localhost", - index: "main", - source: "hilda", - sourcetype: "misc", - done: true, - unbroken: true - }); - - try { - eventWriter.writeEvent(myEvent); - callback(null); - } - catch (e) { - callback(e); - } - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var inStream = testUtils.getReadableStream(); - - var inputConfiguration = utils.readFile(__filename, "../data/conf_with_2_inputs.xml"); - - var startTime = Date.now(); - - var args = [TEST_SCRIPT_PATH]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - assert.ok(err); - assert.strictEqual("Receiving input definitions prior to streaming timed out.", err.message); - - assert.ok(Date.now() - startTime >= 30000); // Make sure it times out only after 30 seconds - assert.strictEqual("", ew._out._read()); - assert.strictEqual("", ew._err._read()); - assert.strictEqual(1, scriptStatus); - done(); - }); - // Remove the closing tag to send impartial data - inStream.emit("data", Buffer.from(inputConfiguration.replace("", ""))); - }); - - it("ModularInput streaming events times out after 30s with no data sent", function (done) { - - this.timeout(40000); - exports.getScheme = function () { - return null; - }; - - exports.streamEvents = function (name, input, eventWriter, callback) { - return; - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var inStream = testUtils.getReadableStream(); - - var inputConfiguration = utils.readFile(__filename, "../data/conf_with_2_inputs.xml"); - - var startTime = Date.now(); - - var args = [TEST_SCRIPT_PATH]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - assert.ok(err); - assert.strictEqual("Receiving input definitions prior to streaming timed out.", err.message); - - assert.ok(Date.now() - startTime >= 30000); // Make sure it times out only after 30 seconds - assert.strictEqual("", ew._out._read()); - assert.strictEqual("", ew._err._read()); - assert.strictEqual(1, scriptStatus); - done(); - }); - }); - - it("ModularInput streaming events times out after 30s with data sent after 30s", function (done) { - - this.timeout(40000); - exports.getScheme = function () { - return null; - }; - - exports.streamEvents = function (name, input, eventWriter, callback) { - return; - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var inStream = testUtils.getReadableStream(); - - var inputConfiguration = utils.readFile(__filename, "../data/conf_with_2_inputs.xml"); - - var startTime = Date.now(); - - // Emit the data 1.5 seconds after the timeout threshold - setTimeout(function () { - inStream.emit("data", Buffer.from(inputConfiguration)); - done(); - }, 32000); - - var args = [TEST_SCRIPT_PATH]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - assert.ok(err); - assert.strictEqual("Receiving input definitions prior to streaming timed out.", err.message); - - assert.ok(Date.now() - startTime >= 30000); // Make sure it times out only after 30 seconds - assert.strictEqual("", ew._out._read()); - assert.strictEqual("", ew._err._read()); - assert.strictEqual(1, scriptStatus); - }); - }); - - it("ModularInput gets a valid Service", function (done) { - exports.getScheme = function () { - return null; - }; - - exports.validateInput = function (definition) { - return null; - }; - - exports.streamEvents = function (name, input, eventWriter, callback) { - var service = ModularInput.service(); - - assert.ok(service instanceof splunkjs.Service); - assert.strictEqual(service.prefix, this._inputDefinition.metadata["server_uri"]); - callback(null); - }; - - var out = testUtils.getDuplexStream(); - var err = testUtils.getDuplexStream(); - var ew = new EventWriter(out, err); - - var inStream = testUtils.getReadableStream(); - - var inputConfiguration = utils.readFile(__filename, "../data/conf_with_2_inputs.xml"); - - assert.ok(utils.isUndefined(ModularInput._service)); - - var args = [TEST_SCRIPT_PATH]; - ModularInput.runScript(exports, args, ew, inStream, function (err, scriptStatus) { - assert.ok(!err); - assert.strictEqual("", ew._err._read()); - assert.strictEqual(0, scriptStatus); - done(); - }); - inStream.emit("data", Buffer.from(inputConfiguration)); - }); - }) - ) -}; - -// Run the individual test suite -if (module === require.cache[__filename] && !module.parent) { - module.exports = exports.setup(); -} diff --git a/tests_spike/modularinputs/test_scheme.js b/tests_spike/modularinputs/test_scheme.js deleted file mode 100644 index 3d147753f..000000000 --- a/tests_spike/modularinputs/test_scheme.js +++ /dev/null @@ -1,151 +0,0 @@ - -// Copyright 2014 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. - -var assert = require('chai').assert; -var ET = require("elementtree"); - -var splunkjs = require('../../index'); -var testUtils = require("./utils"); - -exports.setup = function () { - var ModularInput = splunkjs.ModularInputs; - var Scheme = ModularInput.Scheme; - var Argument = ModularInput.Argument; - var utils = ModularInput.utils; - - splunkjs.Logger.setLevel("ALL"); - - return ( - describe("Scheme tests", function () { - - it("Generate XML from scheme with default values", function () { - // Checks the Scheme generated by creating a Scheme object and setting no fields on it. - // This test checks for sane defaults in the Scheme class. - - var myScheme = new Scheme("abcd"); - - var constructed = myScheme.toXML(); - var expected = ET.parse(utils.readFile(__filename, "../data/scheme_with_defaults.xml")).getroot(); - - assert.equal(myScheme.title, "abcd"); - assert.equal(myScheme.description, null); - assert.equal(myScheme.useExternalValidation, true); - assert.equal(myScheme.useSingleInstance, false); - assert.equal(myScheme.streamingMode, Scheme.streamingModeXML); - assert.ok(testUtils.XMLCompare(expected, constructed)); - ; - }); - - it("Generate XML from scheme", function () { - // Checks that the XML generated by a Scheme object with all its fields set and - // some arguments added matches what we expect - - var myScheme = new Scheme("abcd"); - myScheme.description = "쎼 and 쎶 and <&> für"; - myScheme.streamingMode = Scheme.streamingModeSimple; - myScheme.useExternalValidation = false; - myScheme.useSingleInstance = true; - - assert.equal(myScheme.title, "abcd"); - assert.equal(myScheme.description, "쎼 and 쎶 and <&> für"); - assert.equal(myScheme.streamingMode, Scheme.streamingModeSimple); - assert.equal(myScheme.useExternalValidation, false); - assert.equal(myScheme.useSingleInstance, true); - - var arg1 = new Argument({ - name: "arg1" - }); - myScheme.addArgument(arg1); - - assert.equal(myScheme.args[0].name, arg1.name); - assert.equal(myScheme.args[0].requiredOnEdit, arg1.requiredOnEdit); - assert.equal(myScheme.args[0].requiredOnCreate, arg1.requiredOnCreate); - - var arg2 = new Argument({ - name: "arg2", - description: "쎼 and 쎶 and <&> für", - validation: "is_pos_int('some_name')", - dataType: Argument.dataTypeNumber, - requiredOnEdit: true, - requiredOnCreate: true - }); - myScheme.addArgument(arg2); - - assert.equal(myScheme.args[1].name, arg2.name); - assert.equal(myScheme.args[1].requiredOnEdit, arg2.requiredOnEdit); - assert.equal(myScheme.args[1].requiredOnCreate, arg2.requiredOnCreate); - - assert.equal(myScheme.args.length, 2); - - var constructed = myScheme.toXML(); - var expected = ET.parse(utils.readFile(__filename, "../data/scheme_without_defaults.xml")).getroot(); - - assert.ok(testUtils.XMLCompare(expected, constructed)); - ; - }); - - it("Generate XML from argument with default values", function () { - // Checks that the XML produced from an Argument object that is initialized has - // is what we expect. This is mostly a check of the default values. - - var myArg = new Argument({ name: "some_name" }); - - var root = ET.Element(""); - var constructed = myArg.addToDocument(root); - - var expected = ET.parse(utils.readFile(__filename, "../data/argument_with_defaults.xml")).getroot(); - - assert.equal(myArg.name, "some_name"); - assert.equal(myArg.requiredOnEdit, false); - assert.equal(myArg.requiredOnCreate, false); - assert.ok(testUtils.XMLCompare(expected, constructed)); - ; - }); - - it("Generate XML from argument", function () { - // Checks that the XML generated by an Argument object with all possible set matches what - // we expect. - - var myArg = new Argument({ - name: "some_name", - description: "쎼 and 쎶 and <&> für", - validation: "is_pos_int('some_name')", - dataType: Argument.dataTypeBoolean, - requiredOnEdit: true, - requiredOnCreate: true - }); - - assert.equal(myArg.name, "some_name"); - assert.equal(myArg.description, "쎼 and 쎶 and <&> für"); - assert.equal(myArg.validation, "is_pos_int('some_name')"); - assert.equal(myArg.dataType, Argument.dataTypeBoolean); - assert.equal(myArg.requiredOnEdit, true); - assert.equal(myArg.requiredOnCreate, true); - - var root = ET.Element(""); - var constructed = myArg.addToDocument(root); - - var expected = ET.parse(utils.readFile(__filename, "../data/argument_without_defaults.xml")).getroot(); - assert.ok(testUtils.XMLCompare(expected, constructed)); - ; - }); - }) - ); -}; - -// Run the individual test suite -if (module === require.cache[__filename] && !module.parent) { - module.exports = exports.setup(); -} diff --git a/tests_spike/modularinputs/test_validation_definition.js b/tests_spike/modularinputs/test_validation_definition.js deleted file mode 100644 index 658514106..000000000 --- a/tests_spike/modularinputs/test_validation_definition.js +++ /dev/null @@ -1,90 +0,0 @@ - -// Copyright 2014 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. - -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -exports.setup = function () { - var ModularInputs = splunkjs.ModularInputs; - var ValidationDefinition = ModularInputs.ValidationDefinition; - var utils = ModularInputs.utils; - - splunkjs.Logger.setLevel("ALL"); - - return ( - describe("Validation Definition tests", function () { - before(function (done) { - done(); - }); - - it("Parse produces expected result", function (done) { - try { - var found = ValidationDefinition.parse(utils.readFile(__filename, "../data/validation.xml")); - - var expected = new ValidationDefinition(); - expected.metadata = { - "server_host": "tiny", - "server_uri": "https://127.0.0.1:8089", - "checkpoint_dir": "/opt/splunk/var/lib/splunk/modinputs", - "session_key": "123102983109283019283", - "name": "aaa" - }; - expected.parameters = { - "param1": "value1", - "param2": "value2", - "disabled": "0", - "index": "default", - "multiValue": ["value1", "value2"], - "multiValue2": ["value3", "value4"] - }; - - assert.deepEqual(found.metadata, expected.metadata); - assert.equal(found.metadata["server_host"], expected.metadata["server_host"]); - assert.equal(found.metadata["server_uri"], expected.metadata["server_uri"]); - assert.equal(found.metadata["checkpoint_dir"], expected.metadata["checkpoint_dir"]); - assert.equal(found.metadata["session_key"], expected.metadata["session_key"]); - assert.equal(found.metadata["name"], expected.metadata["name"]); - - assert.deepEqual(found.parameters, expected.parameters); - assert.equal(found.parameters["param1"], expected.parameters["param1"]); - assert.equal(found.parameters["param2"], expected.parameters["param2"]); - assert.equal(found.parameters["disabled"], expected.parameters["disabled"]); - assert.equal(found.parameters["index"], expected.parameters["index"]); - - assert.deepEqual(found.parameters["multiValue"], expected.parameters["multiValue"]); - assert.equal(found.parameters["multiValue"][0], expected.parameters["multiValue"][0]); - assert.equal(found.parameters["multiValue"][1], expected.parameters["multiValue"][1]); - - assert.deepEqual(found.parameters["multiValue2"], expected.parameters["multiValue2"]); - assert.equal(found.parameters["multiValue2"][0], expected.parameters["multiValue2"][0]); - assert.equal(found.parameters["multiValue2"][1], expected.parameters["multiValue2"][1]); - - assert.deepEqual(found, expected); - } - catch (e) { - assert.ok(!e, JSON.stringify(e)); - } - - done(); - }); - }) - ) -}; - -// Run the individual test suite -if (module === require.cache[__filename] && !module.parent) { - module.exports = exports.setup(); -} diff --git a/tests_spike/modularinputs/utils.js b/tests_spike/modularinputs/utils.js deleted file mode 100644 index cbc1094e6..000000000 --- a/tests_spike/modularinputs/utils.js +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2014 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. - -(function () { - "use strict"; - var Stream = require("readable-stream"); - var utils = require("../../lib/utils"); // Grab the SDK utils - var root = exports || this; - - root.getDuplexStream = function () { - var duplex = new Stream.Duplex(); - duplex.data = ""; - duplex._write = function (chunk, enc, next) { - this.data += chunk.toString(); - next(); - }; - duplex._read = function () { - return this.data; - }; - return duplex; - }; - - root.getReadableStream = function () { - var readable = new Stream.Readable(); - readable.data = ""; - readable._read = function () { - return this.data; - }; - return readable; - }; - - /** - * Takes an array of objects, and sorts the array by the values of each - * object at the specified key. - * - * @param {Array} an array of objects. - * @param {String} the key to sort by. - * @return {Boolean} true if they are equal, else false - */ - root.sortByKey = function (array, key) { - return array.sort(function (a, b) { - var x = a[key]; var y = b[key]; - return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - }); - }; - - /** - * Takes two XML documents represented by `Elementtree` objects and - * checks whether their children are equal. - * - * @param {Object} an `Elementtree` object. - * @param {Object} an `Elementtree` object. - * @return {Boolean} true if their children are equal, else false - */ - root.XMLCompareChildren = function (expected, found) { - if (expected.len !== found.len) { - return false; - } - - // If there's no children to compare, we're done - if (!expected._children && !found._children) { - return true; - } - - var expectedChildren = expected.getchildren().sort(); - var foundChildren = found.getchildren().sort(); - - // Check if all of expected's children are equal to all of found's children - for (var i = 0; i < expectedChildren.length; i++) { - if (!root.XMLCompare(expectedChildren[i], foundChildren[i])) { - return false; - } - } - - return true; - }; - - /** - * Takes two XML documents represented by `Elementtree` objects and - * checks whether they are equal. - * - * @param {Object} an `Elementtree` object. - * @param {Object} an `Elementtree` object. - * @return {Boolean} true if they are equal, else false - */ - root.XMLCompare = function (expected, found) { - // They're equal if they're the same. - if (expected === found) { - return true; - } - - // Compare the attributes. - if (typeof expected.items !== typeof found.items) { - return false; - } - if (found.items && expected.items) { - var expectedItems = expected.items().sort(); - var foundItems = expected.items().sort(); - - if (expectedItems.length !== foundItems.length) { - return false; - } - else { - for (var i = 0; i < foundItems.length; i++) { - if (foundItems[i] && expectedItems[i]) { - var f = foundItems[i]; - var e = expectedItems[i]; - - for (var j = 0; j < e.length; j++) { - if (f[j] !== e[j]) { - return false; - } - } - } - else { - return false; - } - } - } - } - - // Compare their children - if (!root.XMLCompareChildren(expected, found)) { - return false; - } - - // Compare the root level elements. - if (!expected.text || utils.trim(expected.text) === "" && - !found.text || utils.trim(found.text) === "") { - return true; - } - else { - return (expected.tag === found.tag && expected.text === found.text); - } - }; -})(); diff --git a/tests_spike/service_tests/app.js b/tests_spike/service_tests/app.js deleted file mode 100644 index cb4e825ca..000000000 --- a/tests_spike/service_tests/app.js +++ /dev/null @@ -1,211 +0,0 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -var Async = splunkjs.Async; -var utils = splunkjs.Utils; -var idCounter = 0; - -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; - -exports.setup = function (svc) { - - return ( - describe("App tests", function (done) { - beforeEach(function (done) { - this.service = svc; - done(); - }); - - it("Callback#list applications", function (done) { - var apps = this.service.apps(); - apps.fetch(function (err, apps) { - var appList = apps.list(); - assert.ok(appList.length > 0); - done(); - }); - }); - - it("Callback#contains applications", function (done) { - var apps = this.service.apps(); - apps.fetch(function (err, apps) { - var app = apps.item("search"); - assert.ok(app); - done(); - }); - }); - - it("Callback#create + contains app", function (done) { - var name = "jssdk_testapp_" + getNextId(); - var apps = this.service.apps(); - - apps.create({ name: name }, function (err, app) { - var appName = app.name; - apps.fetch(function (err, apps) { - var entity = apps.item(appName); - assert.ok(entity); - app.remove(function () { - done(); - }); - }); - }); - }); - - it("Callback#create + modify app", function (done) { - var DESCRIPTION = "TEST DESCRIPTION"; - var VERSION = "1.1.0"; - - var name = "jssdk_testapp_" + getNextId(); - var apps = this.service.apps(); - - Async.chain([ - function (callback) { - apps.create({ name: name }, callback); - }, - function (app, callback) { - assert.ok(app); - assert.strictEqual(app.name, name); - var versionMatches = app.properties().version === "1.0" || - app.properties().version === "1.0.0"; - assert.ok(versionMatches); - - app.update({ - description: DESCRIPTION, - version: VERSION - }, callback); - }, - function (app, callback) { - assert.ok(app); - var properties = app.properties(); - - assert.strictEqual(properties.description, DESCRIPTION); - assert.strictEqual(properties.version, VERSION); - - app.remove(callback); - } - ], function (err) { - assert.ok(!err); - done(); - }); - }); - - it("Callback#delete test applications", function (done) { - - var apps = this.service.apps(); - apps.fetch(function (err, apps) { - - var appList = apps.list(); - - Async.parallelEach(appList, - - function (app, idx, callback) { - if (utils.startsWith(app.name, "jssdk_")) { - app.remove(callback); - } - else { - callback(); - } - }, function (err) { - assert.ok(!err); - done(); - } - ); - }); - }); - - it("list applications with cookies as authentication", function (done) { - this.service.serverInfo(function (err, info) { - // Cookie authentication was added in splunk 6.2 - var majorVersion = parseInt(info.properties().version.split(".")[0], 10); - var minorVersion = parseInt(info.properties().version.split(".")[1], 10); - // Skip cookie test if Splunk older than 6.2 - if (majorVersion < 6 || (majorVersion === 6 && minorVersion < 2)) { - splunkjs.Logger.log("Skipping cookie test..."); - done(); - return; - } - - var service = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - username: svc.username, - password: svc.password, - version: svc.version - }); - - var service2 = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - version: svc.version - }); - - Async.chain([ - function (done) { - service.login(done); - }, - function (job, done) { - // Save the cookie store - var cookieStore = service.http._cookieStore; - // Test that there are cookies - assert.ok(!utils.isEmpty(cookieStore)); - - // Add the cookies to a service with no other authenitcation information - service2.http._cookieStore = cookieStore; - - var apps = service2.apps(); - apps.fetch(done); - }, - function (apps, done) { - var appList = apps.list(); - assert.ok(appList.length > 0); - assert.ok(!utils.isEmpty(service2.http._cookieStore)); - done(); - } - ], - function (err) { - // Test that no errors were returned - assert.ok(!err); - done(); - }); - }) - }) - }) - ) -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc)); - }); - }); -} diff --git a/tests_spike/service_tests/collection.js b/tests_spike/service_tests/collection.js deleted file mode 100644 index 0c5770e28..000000000 --- a/tests_spike/service_tests/collection.js +++ /dev/null @@ -1,102 +0,0 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -exports.setup = function (svc, loggedOutSvc) { - - return ( - describe("Collection tests", function (done) { - beforeEach(function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }); - - it("Methods to be overridden throw", function (done) { - var coll = new splunkjs.Service.Collection( - this.service, - "/data/indexes", - { - owner: "admin", - app: "search", - sharing: "app" - } - ); - assert.throws(function () { - coll.instantiateEntity({}); - }); - done(); - }); - - it("Accessors work", function (done) { - var coll = new splunkjs.Service.Collection( - this.service, - "/data/indexes", - { - owner: "admin", - app: "search", - sharing: "app" - } - ); - coll._load({ links: "Hilda", updated: true }); - assert.strictEqual(coll.links(), "Hilda"); - assert.ok(coll.updated()); - done(); - }); - - it("Contains throws without a good id", function (done) { - var coll = new splunkjs.Service.Collection( - this.service, - "/data/indexes", - { - owner: "admin", - app: "search", - sharing: "app" - } - ); - assert.throws(function () { coll.item(null); }); - done(); - }) - }) - ) -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - var loggedOutSvc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password + 'wrong', - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc, loggedOutSvc)); - }); - }); -} diff --git a/tests_spike/service_tests/configuration.js b/tests_spike/service_tests/configuration.js deleted file mode 100644 index d0e6f125a..000000000 --- a/tests_spike/service_tests/configuration.js +++ /dev/null @@ -1,245 +0,0 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -var Async = splunkjs.Async; -var idCounter = 0; -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; - -exports.setup = function (svc) { - - return ( - describe("Configuration tests", function (done) { - beforeEach(function (done) { - this.service = svc; - done(); - }); - - it("Callback#list", function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var files = props.list(); - assert.ok(files.length > 0); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }); - - it("Callback#contains", function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("web"); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(file.name, "web"); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }); - - it("Callback#contains stanza", function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("web"); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(file.name, "web"); - - var stanza = file.item("settings"); - assert.ok(stanza); - stanza.fetch(done); - }, - function (stanza, done) { - assert.ok(stanza.properties().hasOwnProperty("httpport")); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }); - - it("Callback#configurations init", function (done) { - assert.throws(function () { - var confs = new splunkjs.Service.Configurations( - this.service, - { owner: "-", app: "-", sharing: "system" } - ); - }); - done(); - }); - - it("Callback#create file + create stanza + update stanza", function (done) { - var that = this; - var namespace = { owner: "nobody", app: "system" }; - var fileName = "jssdk_file_" + getNextId(); - var value = "barfoo_" + getNextId(); - - Async.chain([ - function (done) { - var configs = svc.configurations(namespace); - configs.fetch(done); - }, - function (configs, done) { - configs.create({ __conf: fileName }, done); - }, - function (file, done) { - if (file.item("stanza")) { - file.item("stanza").remove(); - } - file.create("stanza", done); - }, - function (stanza, done) { - stanza.update({ "jssdk_foobar": value }, done); - }, - function (stanza, done) { - assert.strictEqual(stanza.properties()["jssdk_foobar"], value); - done(); - }, - function (done) { - var file = new splunkjs.Service.ConfigurationFile(svc, fileName); - file.fetch(done); - }, - function (file, done) { - var stanza = file.item("stanza"); - assert.ok(stanza); - stanza.remove(done); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }); - - it("Callback#can get default stanza", function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("savedsearches"); - assert.strictEqual(namespace, file.namespace); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(namespace, file.namespace); - file.getDefaultStanza().fetch(done); - }, - function (stanza, done) { - assert.strictEqual(stanza.name, "default"); - assert.strictEqual(namespace, stanza.namespace); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }); - - it("Callback#updating default stanza is noop", function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - var backup = null; - var invalid = "this won't work"; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("savedsearches"); - assert.strictEqual(namespace, file.namespace); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(namespace, file.namespace); - file.getDefaultStanza().fetch(done); - }, - function (stanza, done) { - assert.ok(stanza._properties.hasOwnProperty("max_concurrent")); - assert.strictEqual(namespace, stanza.namespace); - backup = stanza._properties.max_concurrent; - stanza.update({ "max_concurrent": invalid }, done); - }, - function (stanza, done) { - assert.ok(stanza.properties().hasOwnProperty("max_concurrent")); - assert.strictEqual(stanza.properties()["max_concurrent"], backup); - assert.notStrictEqual(stanza.properties()["max_concurrent"], invalid); - stanza.fetch(done); - }, - function (stanza, done) { - assert.ok(stanza.properties().hasOwnProperty("max_concurrent")); - assert.strictEqual(stanza.properties()["max_concurrent"], backup); - assert.notStrictEqual(stanza.properties()["max_concurrent"], invalid); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }) - }) - ) -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc)); - }); - }); -} diff --git a/tests_spike/service_tests/datamodels.js b/tests_spike/service_tests/datamodels.js deleted file mode 100644 index 56a3c2a16..000000000 --- a/tests_spike/service_tests/datamodels.js +++ /dev/null @@ -1,1109 +0,0 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); -var tutils = require('../utils'); - -var Async = splunkjs.Async; -var utils = splunkjs.Utils; - -var idCounter = 0; -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; - -exports.setup = function (svc) { - return ( - describe("Datamodels test", function (done) { - beforeEach(function (done) { - this.service = svc; - this.dataModels = svc.dataModels(); - this.skip = false; - var that = this; - this.service.serverInfo(function (err, info) { - if (parseInt(info.properties().version.split(".")[0], 10) < 6) { - that.skip = true; - splunkjs.Logger.log("Skipping data model tests..."); - } - done(err); - }); - }); - - it("Callback#DataModels - fetch a built-in data model", function (done) { - if (this.skip) { - done(); - return; - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - var dm = dataModels.item("internal_audit_logs"); - // Check for the 3 objects we expect - assert.ok(dm.objectByName("Audit")); - assert.ok(dm.objectByName("searches")); - assert.ok(dm.objectByName("modify")); - - // Check for an object that shouldn't exist - assert.strictEqual(null, dm.objectByName(getNextId())); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - create & delete an empty data model", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var initialSize; - var that = this; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - initialSize = dataModels.list().length; - dataModels.create(name, args, done); - }, - function (dataModel, done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Make sure we have 1 more data model than we started with - assert.strictEqual(initialSize + 1, dataModels.list().length); - // Delete the data model we just created, by name. - dataModels.item(name).remove(done); - }, - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Make sure we have as many data models as we started with - assert.strictEqual(initialSize, dataModels.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - create a data model with spaces in the name, which are swapped for -'s", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me- " + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.strictEqual(name.replace(" ", "_"), dataModel.name); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - create a data model with 0 objects", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/empty_data_model.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - // Check for 0 objects before fetch - assert.strictEqual(0, dataModel.objects.length); - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Check for 0 objects after fetch - assert.strictEqual(0, dataModels.item(name).objects.length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - create a data model with 1 search object", function (done) { - if (this.skip) { - done(); - return; - } - var dataModels = this.service.dataModels(); - - - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/object_with_one_search.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - // Check for 1 object before fetch - assert.strictEqual(1, dataModel.objects.length); - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Check for 1 object after fetch - assert.strictEqual(1, dataModels.item(name).objects.length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - create a data model with 2 search objects", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/object_with_two_searches.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - // Check for 2 objects before fetch - assert.strictEqual(2, dataModel.objects.length); - that.dataModels.fetch(done); - }, - function (dataModels, done) { - // Check for 2 objects after fetch - assert.strictEqual(2, dataModels.item(name).objects.length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - data model objects are created correctly", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/object_with_two_searches.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.ok(dataModel.hasObject("search1")); - assert.ok(dataModel.hasObject("search2")); - - var search1 = dataModel.objectByName("search1"); - assert.ok(search1); - assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ - search 1", search1.displayName); - - var search2 = dataModel.objectByName("search2"); - assert.ok(search2); - assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ - search 2", search2.displayName); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - data model handles unicode characters", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/model_with_unicode_headers.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.strictEqual(name, dataModel.name); - assert.strictEqual("·Ä©·öô‡Øµ", dataModel.displayName); - assert.strictEqual("‡Øµ‡Ø±‡Ø∞‡ØØ", dataModel.description); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - create data model with empty headers", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/model_with_empty_headers.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.strictEqual(name, dataModel.name); - assert.strictEqual("", dataModel.displayName); - assert.strictEqual("", dataModel.description); - - // Make sure we're not getting a summary of the data model - assert.strictEqual("0", dataModel.concise); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - test acceleration settings", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - dataModel.acceleration.enabled = true; - dataModel.acceleration.earliestTime = "-2mon"; - dataModel.acceleration.cronSchedule = "5/* * * * *"; - - assert.strictEqual(true, dataModel.isAccelerated()); - assert.strictEqual(true, dataModel.acceleration.enabled); - assert.strictEqual("-2mon", dataModel.acceleration.earliestTime); - assert.strictEqual("5/* * * * *", dataModel.acceleration.cronSchedule); - - dataModel.acceleration.enabled = false; - dataModel.acceleration.earliestTime = "-1mon"; - dataModel.acceleration.cronSchedule = "* * * * *"; - - assert.strictEqual(false, dataModel.isAccelerated()); - assert.strictEqual(false, dataModel.acceleration.enabled); - assert.strictEqual("-1mon", dataModel.acceleration.earliestTime); - assert.strictEqual("* * * * *", dataModel.acceleration.cronSchedule); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - test data model object metadata", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("event1"); - assert.ok(obj); - - assert.strictEqual("event1 ·Ä©·öô", obj.displayName); - assert.strictEqual("event1", obj.name); - assert.deepEqual(dataModel, obj.dataModel); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - test data model object parent", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("event1"); - assert.ok(obj); - assert.ok(!obj.parent()); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - test data model object lineage", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("level_0"); - assert.ok(obj); - assert.strictEqual(1, obj.lineage.length); - assert.strictEqual("level_0", obj.lineage[0]); - assert.strictEqual("BaseEvent", obj.parentName); - - obj = dataModel.objectByName("level_1"); - assert.ok(obj); - assert.strictEqual(2, obj.lineage.length); - assert.deepEqual(["level_0", "level_1"], obj.lineage); - assert.strictEqual("level_0", obj.parentName); - - obj = dataModel.objectByName("level_2"); - assert.ok(obj); - assert.strictEqual(3, obj.lineage.length); - assert.deepEqual(["level_0", "level_1", "level_2"], obj.lineage); - assert.strictEqual("level_1", obj.parentName); - - // Make sure there's no extra children - assert.ok(!dataModel.objectByName("level_3")); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - test data model object fields", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("level_2"); - assert.ok(obj); - - var timeField = obj.fieldByName("_time"); - assert.ok(timeField); - assert.strictEqual("timestamp", timeField.type); - assert.ok(timeField.isTimestamp()); - assert.ok(!timeField.isNumber()); - assert.ok(!timeField.isString()); - assert.ok(!timeField.isObjectcount()); - assert.ok(!timeField.isChildcount()); - assert.ok(!timeField.isIPv4()); - assert.deepEqual(["BaseEvent"], timeField.lineage); - assert.strictEqual("_time", timeField.name); - assert.strictEqual(false, timeField.required); - assert.strictEqual(false, timeField.multivalued); - assert.strictEqual(false, timeField.hidden); - assert.strictEqual(false, timeField.editable); - assert.strictEqual(null, timeField.comment); - - var lvl2 = obj.fieldByName("level_2"); - assert.strictEqual("level_2", lvl2.owner); - assert.deepEqual(["level_0", "level_1", "level_2"], lvl2.lineage); - assert.strictEqual("objectCount", lvl2.type); - assert.ok(!lvl2.isTimestamp()); - assert.ok(!lvl2.isNumber()); - assert.ok(!lvl2.isString()); - assert.ok(lvl2.isObjectcount()); - assert.ok(!lvl2.isChildcount()); - assert.ok(!lvl2.isIPv4()); - assert.strictEqual("level_2", lvl2.name); - assert.strictEqual("level 2", lvl2.displayName); - assert.strictEqual(false, lvl2.required); - assert.strictEqual(false, lvl2.multivalued); - assert.strictEqual(false, lvl2.hidden); - assert.strictEqual(false, lvl2.editable); - assert.strictEqual(null, lvl2.comment); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - test data model object properties", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - assert.strictEqual(5, obj.fieldNames().length); - assert.strictEqual(10, obj.allFieldNames().length); - assert.ok(obj.fieldByName("has_boris")); - assert.ok(obj.hasField("has_boris")); - assert.ok(obj.fieldByName("_time")); - assert.ok(obj.hasField("_time")); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - create local acceleration job", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("level_2"); - assert.ok(obj); - - obj.createLocalAccelerationJob(null, done); - }, - function (job, done) { - assert.ok(job); - - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - assert.strictEqual("| datamodel \"" + name + "\" level_2 search | tscollect", job.properties().request.search); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - create local acceleration job with earliest time", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/inheritance_test_data.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var oldNow = Date.now(); - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("level_2"); - assert.ok(obj); - obj.createLocalAccelerationJob("-1d", done); - }, - function (job, done) { - assert.ok(job); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - assert.strictEqual("| datamodel \"" + name + "\" level_2 search | tscollect", job.properties().request.search); - - // Make sure the earliest time is 1 day behind - var yesterday = new Date(Date.now() - (1000 * 60 * 60 * 24)); - var month = (yesterday.getMonth() + 1); - if (month <= 9) { - month = "0" + month; - } - var date = yesterday.getDate(); - if (date <= 9) { - date = "0" + date; - } - var expectedDate = yesterday.getFullYear() + "-" + month + "-" + date; - assert.ok(utils.startsWith(job._state.content.earliestTime, expectedDate)); - - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - test data model constraints", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("event1"); - assert.ok(obj); - var constraints = obj.constraints; - assert.ok(constraints); - var onlyOne = true; - - for (var i = 0; i < constraints.length; i++) { - var constraint = constraints[i]; - assert.ok(!!onlyOne); - - assert.strictEqual("event1", constraint.owner); - assert.strictEqual("uri=\"*.php\" OR uri=\"*.py\"\nNOT (referer=null OR referer=\"-\")", constraint.query); - } - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - test data model calculations, and the different types", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_with_test_objects.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("event1"); - assert.ok(obj); - - var calculations = obj.calculations; - assert.strictEqual(4, Object.keys(calculations).length); - assert.strictEqual(4, obj.calculationIDs().length); - - var evalCalculation = calculations["93fzsv03wa7"]; - assert.ok(evalCalculation); - assert.strictEqual("event1", evalCalculation.owner); - assert.deepEqual(["event1"], evalCalculation.lineage); - assert.strictEqual("Eval", evalCalculation.type); - assert.ok(evalCalculation.isEval()); - assert.ok(!evalCalculation.isLookup()); - assert.ok(!evalCalculation.isGeoIP()); - assert.ok(!evalCalculation.isRex()); - assert.strictEqual(null, evalCalculation.comment); - assert.strictEqual(true, evalCalculation.isEditable()); - assert.strictEqual("if(cidrmatch(\"192.0.0.0/16\", clientip), \"local\", \"other\")", evalCalculation.expression); - - assert.strictEqual(1, Object.keys(evalCalculation.outputFields).length); - assert.strictEqual(1, evalCalculation.outputFieldNames().length); - - var field = evalCalculation.outputFields["new_field"]; - assert.ok(field); - assert.strictEqual("My New Field", field.displayName); - - var lookupCalculation = calculations["sr3mc8o3mjr"]; - assert.ok(lookupCalculation); - assert.strictEqual("event1", lookupCalculation.owner); - assert.deepEqual(["event1"], lookupCalculation.lineage); - assert.strictEqual("Lookup", lookupCalculation.type); - assert.ok(lookupCalculation.isLookup()); - assert.ok(!lookupCalculation.isEval()); - assert.ok(!lookupCalculation.isGeoIP()); - assert.ok(!lookupCalculation.isRex()); - assert.strictEqual(null, lookupCalculation.comment); - assert.strictEqual(true, lookupCalculation.isEditable()); - assert.deepEqual({ lookupField: "a_lookup_field", inputField: "host" }, lookupCalculation.inputFieldMappings); - assert.strictEqual(2, Object.keys(lookupCalculation.inputFieldMappings).length); - assert.strictEqual("a_lookup_field", lookupCalculation.inputFieldMappings.lookupField); - assert.strictEqual("host", lookupCalculation.inputFieldMappings.inputField); - assert.strictEqual("dnslookup", lookupCalculation.lookupName); - - var regexpCalculation = calculations["a5v1k82ymic"]; - assert.ok(regexpCalculation); - assert.strictEqual("event1", regexpCalculation.owner); - assert.deepEqual(["event1"], regexpCalculation.lineage); - assert.strictEqual("Rex", regexpCalculation.type); - assert.ok(regexpCalculation.isRex()); - assert.ok(!regexpCalculation.isLookup()); - assert.ok(!regexpCalculation.isEval()); - assert.ok(!regexpCalculation.isGeoIP()); - assert.strictEqual(2, regexpCalculation.outputFieldNames().length); - assert.strictEqual("_raw", regexpCalculation.inputField); - assert.strictEqual(" From: (?.*) To: (?.*) ", regexpCalculation.expression); - - var geoIPCalculation = calculations["pbe9bd0rp4"]; - assert.ok(geoIPCalculation); - assert.strictEqual("event1", geoIPCalculation.owner); - assert.deepEqual(["event1"], geoIPCalculation.lineage); - assert.strictEqual("GeoIP", geoIPCalculation.type); - assert.ok(geoIPCalculation.isGeoIP()); - assert.ok(!geoIPCalculation.isLookup()); - assert.ok(!geoIPCalculation.isEval()); - assert.ok(!geoIPCalculation.isRex()); - assert.strictEqual("·Ä©·öô‡Øµ comment of pbe9bd0rp4", geoIPCalculation.comment); - assert.strictEqual(5, geoIPCalculation.outputFieldNames().length); - assert.strictEqual("output_from_reverse_hostname", geoIPCalculation.inputField); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - run queries", function (done) { - if (this.skip) { - done(); - return; - } - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - var dm = dataModels.item("internal_audit_logs"); - obj = dm.objectByName("searches"); - obj.startSearch({}, "", done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - assert.strictEqual("| datamodel internal_audit_logs searches search", job.properties().request.search); - job.cancel(done); - }, - function (response, done) { - obj.startSearch({ status_buckets: 5, enable_lookups: false }, "| head 3", done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - assert.strictEqual("| datamodel internal_audit_logs searches search | head 3", job.properties().request.search); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - baseSearch is parsed correctly", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/model_with_multiple_types.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("search1"); - assert.ok(obj); - assert.ok(obj instanceof splunkjs.Service.DataModelObject); - assert.strictEqual("BaseSearch", obj.parentName); - assert.ok(obj.isBaseSearch()); - assert.ok(!obj.isBaseTransaction()); - assert.strictEqual("search index=_internal | head 10", obj.baseSearch); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#DataModels - baseTransaction is parsed correctly", function (done) { - if (this.skip) { - done(); - return; - } - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/model_with_multiple_types.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var name = "delete-me-" + getNextId(); - - var obj; - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("transaction1"); - assert.ok(obj); - assert.ok(obj instanceof splunkjs.Service.DataModelObject); - assert.strictEqual("BaseTransaction", obj.parentName); - assert.ok(obj.isBaseTransaction()); - assert.ok(!obj.isBaseSearch()); - assert.deepEqual(["event1"], obj.objectsToGroup); - assert.deepEqual(["host", "from"], obj.groupByFields); - assert.strictEqual("25s", obj.maxPause); - assert.strictEqual("100m", obj.maxSpan); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - }) - ) -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc)); - }); - }); -} diff --git a/tests_spike/service_tests/endpoint.js b/tests_spike/service_tests/endpoint.js deleted file mode 100644 index f31ebcc4c..000000000 --- a/tests_spike/service_tests/endpoint.js +++ /dev/null @@ -1,71 +0,0 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -exports.setup = function (svc) { - return ( - describe("Endpoint tests", function (done) { - beforeEach(function (done) { - this.service = svc; - done(); - }); - - it("Throws on null arguments to init", function (done) { - var service = this.service; - assert.throws(function () { - var endpoint = new splunkjs.Service.Endpoint(null, "a/b"); - }); - assert.throws(function () { - var endpoint = new splunkjs.Service.Endpoint(service, null); - }); - done(); - }); - - it("Endpoint delete on a relative path", function (done) { - var service = this.service; - var endpoint = new splunkjs.Service.Endpoint(service, "/search/jobs/12345"); - endpoint.del("search/jobs/12345", {}, function () { done(); }); - }); - - it("Methods of Resource to be overridden", function (done) { - var service = this.service; - var resource = new splunkjs.Service.Resource(service, "/search/jobs/12345"); - assert.throws(function () { resource.path(); }); - assert.throws(function () { resource.fetch(); }); - assert.ok(splunkjs.Utils.isEmpty(resource.state())); - done(); - }) - }) - ) -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc)); - }); - }); -} diff --git a/tests_spike/service_tests/entity.js b/tests_spike/service_tests/entity.js deleted file mode 100644 index b82df1f06..000000000 --- a/tests_spike/service_tests/entity.js +++ /dev/null @@ -1,156 +0,0 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -var Async = splunkjs.Async; -var idCounter = 0; - -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; - -exports.setup = function (svc, loggedOutSvc) { - return ( - describe("Entity tests", function () { - - beforeEach(function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }); - - it("Accessors function properly", function (done) { - var entity = new splunkjs.Service.Entity( - this.service, - "/search/jobs/12345", - { owner: "boris", app: "factory", sharing: "app" } - ); - entity._load( - { - acl: { owner: "boris", app: "factory", sharing: "app" }, - links: { link1: 35 }, - published: "meep", - author: "Hilda" - } - ); - assert.ok(entity.acl().owner === "boris"); - assert.ok(entity.acl().app === "factory"); - assert.ok(entity.acl().sharing === "app"); - assert.ok(entity.links().link1 === 35); - assert.strictEqual(entity.author(), "Hilda"); - assert.strictEqual(entity.published(), "meep"); - done(); - }); - - it("Refresh throws error correctly", function (done) { - var entity = new splunkjs.Service.Entity(this.loggedOutService, "/search/jobs/12345", { owner: "boris", app: "factory", sharing: "app" }); - entity.fetch({}, function (err) { assert.ok(err); done(); }); - }); - - it("Cannot update name of entity", function (done) { - var entity = new splunkjs.Service.Entity(this.service, "/search/jobs/12345", { owner: "boris", app: "factory", sharing: "app" }); - assert.throws(function () { entity.update({ name: "asdf" }); }); - done(); - }); - - it("Disable throws error correctly", function (done) { - var entity = new splunkjs.Service.Entity( - this.loggedOutService, - "/search/jobs/12345", - { owner: "boris", app: "factory", sharing: "app" } - ); - entity.disable(function (err) { assert.ok(err); done(); }); - }); - - it("Enable throws error correctly", function (done) { - var entity = new splunkjs.Service.Entity( - this.loggedOutService, - "/search/jobs/12345", - { owner: "boris", app: "factory", sharing: "app" } - ); - entity.enable(function (err) { assert.ok(err); done(); }); - }); - - it("Does reload work?", function (done) { - var idx = new splunkjs.Service.Index( - this.service, - "data/indexes/sdk-test", - { - owner: "admin", - app: "search", - sharing: "app" - } - ); - var name = "jssdk_testapp_" + getNextId(); - var apps = this.service.apps(); - - var that = this; - Async.chain( - function (done) { - apps.create({ name: name }, done); - }, - function (app, done) { - app.reload(function (err) { - assert.ok(!err); - done(null, app); - }); - }, - function (app, done) { - var app2 = new splunkjs.Service.Application(that.loggedOutService, app.name); - app2.reload(function (err) { - assert.ok(err); - done(null, app); - }); - }, - function (app, done) { - app.remove(done); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - }) - }) - ) -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - var loggedOutSvc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password + 'wrong', - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc, loggedOutSvc)); - }); - }); -} diff --git a/tests_spike/service_tests/firedalerts.js b/tests_spike/service_tests/firedalerts.js deleted file mode 100644 index dd4ddc5c9..000000000 --- a/tests_spike/service_tests/firedalerts.js +++ /dev/null @@ -1,310 +0,0 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -var Async = splunkjs.Async; -var utils = splunkjs.Utils; -var idCounter = 0; - -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; - -exports.setup = function (svc, loggedOutSvc) { - return ( - describe("Fired alerts tests", () => { - beforeEach(function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - var indexes = this.service.indexes(); - done(); - }); - - it("Callback#create + verify emptiness + delete new alert group", function (done) { - - var searches = this.service.savedSearches({ owner: this.service.username }); - var name = "jssdk_savedsearch_alert_" + getNextId(); - var searchConfig = { - "name": name, - "search": "index=_internal | head 1", - "alert_type": "always", - "alert.severity": "2", - "alert.suppress": "0", - "alert.track": "1", - "dispatch.earliest_time": "-1h", - "dispatch.latest_time": "now", - "is_scheduled": "1", - "cron_schedule": "* * * * *" - }; - - Async.chain([ - function (done) { - searches.create(searchConfig, done); - }, - function (search, done) { - assert.ok(search); - assert.strictEqual(search.alertCount(), 0); - search.history(done); - }, - function (jobs, search, done) { - assert.strictEqual(jobs.length, 0); - assert.strictEqual(search.firedAlertGroup().count(), 0); - searches.service.firedAlertGroups().fetch(Async.augment(done, search)); - }, - function (firedAlertGroups, originalSearch, done) { - assert.strictEqual(firedAlertGroups.list().indexOf(originalSearch.name), -1); - done(null, originalSearch); - }, - function (originalSearch, done) { - originalSearch.remove(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - // This test is not stable, commenting it out until we figure it out - // it("Callback#alert is triggered + test firedAlert entity -- FAILS INTERMITTENTLY", function(done) { - // var searches = this.service.savedSearches({owner: this.service.username}); - // var indexName = "sdk-tests-alerts"; - // var name = "jssdk_savedsearch_alert_" + getNextId(); - - // // Real-time search config - // var searchConfig = { - // "name": name, - // "search": "index="+indexName+" sourcetype=sdk-tests-alerts | head 1", - // "alert_type": "always", - // "alert.severity": "2", - // "alert.suppress": "0", - // "alert.track": "1", - // "dispatch.earliest_time": "rt-1s", - // "dispatch.latest_time": "rt", - // "is_scheduled": "1", - // "cron_schedule": "* * * * *" - // }; - - // Async.chain([ - // function(done) { - // searches.create(searchConfig, done); - // }, - // function(search, done) { - // assert.ok(search); - // assert.strictEqual(search.alertCount(), 0); - // assert.strictEqual(search.firedAlertGroup().count(), 0); - - // var indexes = search.service.indexes(); - // indexes.create(indexName, {}, function(err, index) { - // if (err && err.status !== 409) { - // done(new Error("Index creation failed for an unknown reason")); - // } - // done(null, search); - // }); - // }, - // function(originalSearch, done) { - // var indexes = originalSearch.service.indexes(); - // indexes.fetch(function(err, indexes) { - // if (err) { - // done(err); - // } - // else { - // var index = indexes.item(indexName); - // assert.ok(index); - // index.enable(Async.augment(done, originalSearch)); - // } - // }); - // }, - // function(index, originalSearch, done) { - // //Is the index enabled? - // assert.ok(!index.properties().disabled); - // //refresh the index - // index.fetch(Async.augment(done, originalSearch)); - // }, - // function(index, originalSearch, done) { - // //Store the current event count for a later comparison - // var eventCount = index.properties().totalEventCount; - - // assert.strictEqual(index.properties().sync, 0); - // assert.ok(!index.properties().disabled); - - // index.fetch(Async.augment(done, originalSearch, eventCount)); - // }, - // function(index, originalSearch, eventCount, done) { - // // submit an event - // index.submitEvent( - // "JS SDK: testing alerts", - // { - // sourcetype: "sdk-tests-alerts" - // }, - // Async.augment(done, originalSearch, eventCount) - // ); - // }, - // function(result, index, originalSearch, eventCount, done) { - // Async.sleep(1000, function(){ - // //refresh the search - // index.fetch(Async.augment(done, originalSearch, eventCount)); - // }); - // }, - // function(index, originalSearch, eventCount, done) { - // // Did the event get submitted - // assert.strictEqual(index.properties().totalEventCount, eventCount+1); - // // Refresh the search - // originalSearch.fetch(Async.augment(done, index)); - // }, - // function(originalSearch, index, done) { - // splunkjs.Logger.log("\tAlert count pre-fetch", originalSearch.alertCount()); - // var attemptNum = 1; - // var maxAttempts = 20; - // Async.whilst( - // function() { - // // When this returns false, it hits the final function in the chain - // splunkjs.Logger.log("\tFetch attempt", attemptNum, "of", maxAttempts, "alertCount", originalSearch.alertCount()); - // if (originalSearch.alertCount() !== 0) { - // return false; - // } - // else { - // attemptNum++; - // return attemptNum < maxAttempts; - // } - // }, - // function(callback) { - // Async.sleep(500, function() { - // originalSearch.fetch(callback); - // }); - // }, - // function(err) { - // splunkjs.Logger.log("Attempted fetching", attemptNum, "of", maxAttempts, "result is", originalSearch.alertCount() !== 0); - // originalSearch.fetch(Async.augment(done, index)); - // } - // ); - // }, - // function(originalSearch, index, done) { - // splunkjs.Logger.log("about to fetch"); - // splunkjs.Logger.log("SavedSearch name was: " + originalSearch.name); - // svc.firedAlertGroups({username: svc.username}).fetch(Async.augment(done, index, originalSearch)); - // }, - // function(firedAlertGroups, index, originalSearch, done) { - // Async.seriesEach( - // firedAlertGroups.list(), - // function(firedAlertGroup, innerIndex, seriescallback) { - // Async.chain([ - // function(insideChainCallback) { - // firedAlertGroup.list(insideChainCallback); - // }, - // function(firedAlerts, firedAlertGroup, insideChainCallback) { - // for(var i = 0; i < firedAlerts.length; i++) { - // var firedAlert = firedAlerts[i]; - // firedAlert.actions(); - // firedAlert.alertType(); - // firedAlert.isDigestMode(); - // firedAlert.expirationTime(); - // firedAlert.savedSearchName(); - // firedAlert.severity(); - // firedAlert.sid(); - // firedAlert.triggerTime(); - // firedAlert.triggerTimeRendered(); - // firedAlert.triggeredAlertCount(); - // } - // insideChainCallback(null); - // } - // ], - // function(err) { - // if (err) { - // seriescallback(err); - // } - // seriescallback(null); - // } - // ); - // }, - // function(err) { - // if (err) { - // done(err, originalSearch, index); - // } - // done(null, originalSearch, index); - // } - // ); - // }, - // function(originalSearch, index, done) { - // // Make sure the event count has incremented, as expected - // assert.strictEqual(originalSearch.alertCount(), 1); - // // Remove the search, especially because it's a real-time search - // originalSearch.remove(Async.augment(done, index)); - // }, - // function(index, done) { - // Async.sleep(500, function() { - // index.remove(done); - // }); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }); - - it("Callback#delete all alerts", function (done) { - var namePrefix = "jssdk_savedsearch_alert_"; - var alertList = this.service.savedSearches().list(); - - Async.parallelEach( - alertList, - function (alert, idx, callback) { - if (utils.startsWith(alert.name, namePrefix)) { - splunkjs.Logger.log("ALERT ---", alert.name); - alert.remove(callback); - } - else { - callback(); - } - }, function (err) { - assert.ok(!err); - done(); - } - ); - }) - }) - ) -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - var loggedOutSvc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password + 'wrong', - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc, loggedOutSvc)); - }); - }); -} diff --git a/tests_spike/service_tests/indexes.js b/tests_spike/service_tests/indexes.js deleted file mode 100644 index e5712ba45..000000000 --- a/tests_spike/service_tests/indexes.js +++ /dev/null @@ -1,473 +0,0 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); - -var Async = splunkjs.Async; -var idCounter = 0; - -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; - -exports.setup = function (svc, loggedOutSvc) { - return ( - describe("Indexes tests", function (done) { - beforeEach(function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - - // Create the index for everyone to use - var name = this.indexName = "sdk-tests"; - var indexes = this.service.indexes(); - indexes.create(name, {}, function (err, index) { - if (err && err.status !== 409) { - throw new Error("Index creation failed for an unknown reason"); - } - - done(); - }); - }); - - // it("Callback#remove index fails on Splunk 4.x", function(done) { - // var original_version = this.service.version; - // this.service.version = "4.0"; - // - // var index = this.service.indexes().item(this.indexName); - // assert.throws(function() { index.remove(function(err) {}); }); - // - // this.service.version = original_version; - // done(); - // }); - - // it("Callback#remove index", function(done) { - // var indexes = this.service.indexes(); - // - // // Must generate a private index because an index cannot - // // be recreated with the same name as a deleted index - // // for a certain period of time after the deletion. - // var salt = Math.floor(Math.random() * 65536); - // var myIndexName = this.indexName + '-' + salt; - // - // if (this.service.versionCompare("5.0") < 0) { - // splunkjs.Logger.info("", "Must be running Splunk 5.0+ for this test to work."); - // done(); - // return; - // } - // - // Async.chain([ - // function(callback) { - // indexes.create(myIndexName, {}, callback); - // }, - // function(index, callback) { - // index.remove(callback); - // }, - // function(callback) { - // var numTriesLeft = 50; - // var delayPerTry = 200; // ms - // - // Async.whilst( - // function() { return indexes.item(myIndexName) && ((numTriesLeft--) > 0); }, - // function(iterDone) { - // Async.sleep(delayPerTry, function() { indexes.fetch(iterDone); }); - // }, - // function(err) { - // if (err) { - // callback(err); - // } - // else { - // callback(numTriesLeft <= 0 ? "Timed out" : null); - // } - // } - // ); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }); - - it("Callback#list indexes", function (done) { - var indexes = this.service.indexes(); - indexes.fetch(function (err, indexes) { - var indexList = indexes.list(); - assert.ok(indexList.length > 0); - done(); - }); - }); - - it("Callback#contains index", function (done) { - var indexes = this.service.indexes(); - var indexName = this.indexName; - - indexes.fetch(function (err, indexes) { - var index = indexes.item(indexName); - assert.ok(index); - done(); - }); - }); - - it("Callback#modify index", function (done) { - - var name = this.indexName; - var indexes = this.service.indexes(); - var originalSyncMeta = false; - - Async.chain([ - function (callback) { - indexes.fetch(callback); - }, - function (indexes, callback) { - var index = indexes.item(name); - assert.ok(index); - - originalSyncMeta = index.properties().syncMeta; - index.update({ - syncMeta: !originalSyncMeta - }, callback); - }, - function (index, callback) { - assert.ok(index); - var properties = index.properties(); - - assert.strictEqual(!originalSyncMeta, properties.syncMeta); - - index.update({ - syncMeta: !properties.syncMeta - }, callback); - }, - function (index, callback) { - assert.ok(index); - var properties = index.properties(); - - assert.strictEqual(originalSyncMeta, properties.syncMeta); - callback(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#Enable+disable index", function (done) { - - this.timeout(40000); - var name = this.indexName; - var indexes = this.service.indexes(); - - Async.chain([ - function (callback) { - indexes.fetch(callback); - }, - function (indexes, callback) { - var index = indexes.item(name); - assert.ok(index); - - index.disable(callback); - }, - function (index, callback) { - Async.sleep(5000, function () { - callback(null, index); - }); - }, - function (index, callback) { - assert.ok(index); - index.fetch(callback); - }, - function (index, callback) { - assert.ok(index); - assert.ok(index.properties().disabled); - - index.enable(callback); - }, - function (index, callback) { - Async.sleep(5000, function () { - callback(null, index); - }); - }, - function (index, callback) { - assert.ok(index); - index.fetch(callback); - }, - function (index, callback) { - assert.ok(index); - assert.ok(!index.properties().disabled); - - callback(); - } - ], - function (err) { - assert.ok(!err, JSON.stringify(err)); - done(); - } - ); - }); - - it("Callback#Service submit event", function (done) { - var message = "Hello World -- " + getNextId(); - var sourcetype = "sdk-tests"; - - var service = this.service; - var indexName = this.indexName; - Async.chain( - function (done) { - service.log(message, { sourcetype: sourcetype, index: indexName }, done); - }, - function (eventInfo, done) { - assert.ok(eventInfo); - assert.strictEqual(eventInfo.sourcetype, sourcetype); - assert.strictEqual(eventInfo.bytes, message.length); - assert.strictEqual(eventInfo.index, indexName); - - // We could poll to make sure the index has eaten up the event, - // but unfortunately this can take an unbounded amount of time. - // As such, since we got a good response, we'll just be done with it. - done(); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#Service submit event, omitting optional arguments", function (done) { - var message = "Hello World -- " + getNextId(); - var sourcetype = "sdk-tests"; - - var service = this.service; - var indexName = this.indexName; - Async.chain( - function (done) { - service.log(message, done); - }, - function (eventInfo, done) { - assert.ok(eventInfo); - assert.strictEqual(eventInfo.bytes, message.length); - - // We could poll to make sure the index has eaten up the event, - // but unfortunately this can take an unbounded amount of time. - // As such, since we got a good response, we'll just be done with it. - done(); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#Service submit events with multi-byte chars", function (done) { - var service = this.service; - var messages = [ - "Ummelner Straße 6", - "Ümmelner Straße 6", - "Iԉtérԉátíòлåɭìƶåtiòл", - "Intérnâtì߀лàɭíƶɑtïòл", - "ãϻét dòner turƙëy ѵ߀lù", - "ptãte ìԉ rëρrèhënԁérit ", - "ϻ߀lɭit fìɭèt ϻìǥnoԉ ɭäb߀ríѕ", - " êӽ cɦùck cüpïᏧåtåt Ꮷèѕëruлt. ", - "D߀ɭor ѵélít ìrurè, sèᏧ ѕhòr", - "t riƅѕ c߀ɰ ɭãnԁյàéɢêr drúmst", - "ícƙ. Minïm ƃàɭl tip ѕհòrt rìƃѕ,", - " ïԁ aɭïqúìρ ѕɦànƙ ρ߀rcɦéttɑ. Pìǥ", - " hãm ɦòck ìлcídíԁùԉt séԁ cüpïϻ ", - "ƙèviл láborê. Et taiɭ ѕtriρ", - " steák út üllãϻc߀ rump d߀ɭore.", - "٩(͡๏̯͡๏)۶ ٩(-̮̮̃•̃).", - "Lɑƅòré ƃrësãòlá d߀лèr ѕâlámí ", - "cíllûm ìn ѕɯìлe ϻêàtɭ߀àf dûìs ", - "ρãncettä ƅrìsƙét ԁèsêrûлt áútè", - " յòɰɭ. Lɑbòrìѕ ƙìêɭ", - "básá ԁòlòré fatƃɑck ƅêéf. Pɑѕtr", - "ämì piɢ ѕհàлƙ ùɭɭamcò ѕaû", - "ѕäǥë sɦànƙlë.", - " Cúpím ɭäƃorum drumstïcƙ jerkϒ veli", - " pïcåԉɦɑ ƙíéɭƅãsa. Alïqû", - "iρ írürë cûpíϻ, äɭìɋuâ ǥròûлd ", - "roúлᏧ toԉgüè ρàrìãtùr ", - "briѕkèt ԉostruᏧ cûɭpɑ", - " ìd còлѕèqûât làƅ߀rìs." - ]; - - var counter = 0; - Async.seriesMap( - messages, - function (val, idx, done) { - counter++; - service.log(val, done); - }, - function (err, vals) { - assert.ok(!err); - assert.strictEqual(counter, messages.length); - - // Verify that the full byte-length was sent for each message - for (var m in messages) { - assert.notStrictEqual(messages[m].length, vals[m].bytes); - try { - assert.strictEqual(Buffer.byteLength(messages[m]), vals[m].bytes); - } - catch (err) { - // Assume Buffer isn't defined, we're probably in the browser - assert.strictEqual(decodeURI(encodeURIComponent(messages[m])).length, vals[m].bytes); - } - } - - done(); - } - ); - }); - - it("Callback#Service submit event, failure", function (done) { - var message = "Hello World -- " + getNextId(); - var sourcetype = "sdk-tests"; - - var service = this.loggedOutService; - var indexName = this.indexName; - Async.chain( - function (done) { - assert.ok(service); - service.log(message, done); - }, - function (err) { - assert.ok(err); - done(); - } - ); - }); - - it("Callback#remove throws an error", function (done) { - var index = this.service.indexes().item("_internal"); - assert.throws(function () { - index.remove(); - }); - done(); - }); - - it("Callback#create an index with alternate argument format", function (done) { - var indexes = this.service.indexes(); - indexes.create( - { name: "_internal" }, - function (err, newIndex) { - assert.ok(err.data.messages[0].text.match("name=_internal already exists")); - done(); - } - ); - }); - - it("Callback#Index submit event with omitted optional arguments", function (done) { - var message = "Hello world -- " + getNextId(); - - var indexName = this.indexName; - var indexes = this.service.indexes(); - - Async.chain( - [ - function (done) { - indexes.fetch(done); - }, - function (indexes, done) { - var index = indexes.item(indexName); - assert.ok(index); - assert.strictEqual(index.name, indexName); - index.submitEvent(message, done); - }, - function (eventInfo, index, done) { - assert.ok(eventInfo); - assert.strictEqual(eventInfo.bytes, message.length); - assert.strictEqual(eventInfo.index, indexName); - - // We could poll to make sure the index has eaten up the event, - // but unfortunately this can take an unbounded amount of time. - // As such, since we got a good response, we'll just be done with it. - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#Index submit event", function (done) { - var message = "Hello World -- " + getNextId(); - var sourcetype = "sdk-tests"; - - var indexName = this.indexName; - var indexes = this.service.indexes(); - Async.chain([ - function (done) { - indexes.fetch(done); - }, - function (indexes, done) { - var index = indexes.item(indexName); - assert.ok(index); - assert.strictEqual(index.name, indexName); - index.submitEvent(message, { sourcetype: sourcetype }, done); - }, - function (eventInfo, index, done) { - assert.ok(eventInfo); - assert.strictEqual(eventInfo.sourcetype, sourcetype); - assert.strictEqual(eventInfo.bytes, message.length); - assert.strictEqual(eventInfo.index, indexName); - - // We could poll to make sure the index has eaten up the event, - // but unfortunately this can take an unbounded amount of time. - // As such, since we got a good response, we'll just be done with it. - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - }) - ) -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - var loggedOutSvc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password + 'wrong', - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc, loggedOutSvc)); - }); - }); -} diff --git a/tests_spike/service_tests/job.js b/tests_spike/service_tests/job.js deleted file mode 100644 index 0af5fb3e1..000000000 --- a/tests_spike/service_tests/job.js +++ /dev/null @@ -1,1025 +0,0 @@ -var assert = require('chai').assert; -var path = require("path"); - -var splunkjs = require('../../index'); -var tutils = require('../utils'); -const { Logger } = require('../../lib/log'); - -var Async = splunkjs.Async; -var idCounter = 0; - -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; - -exports.setup = function (svc) { - return ( - describe("Job tests", function (done) { - beforeEach(function (done) { - this.service = svc; - done(); - }); - - // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. - // - // it("Callback#Create+abort job", function(done) { - // var service = this.service; - // Async.chain([ - // function(done){ - // var app_name = path.join(process.env.SPLUNK_HOME, ('/etc/apps/sdk-app-collection/build/sleep_command.tar')); - // // Fix path on Windows if $SPLUNK_HOME contains a space (ex: C:/Program%20Files/Splunk) - // app_name = app_name.replace("%20", " "); - // service.post("apps/appinstall", {update:1, name:app_name}, done); - // }, - // function(done){ - // var sid = getNextId(); - // var options = {id: sid}; - // var jobs = service.jobs({app: "sdk-app-collection"}); - // var req = jobs.oneshotSearch('search index=_internal | head 1 | sleep 10', options, function(err, job) { - // assert.ok(err); - // assert.ok(!job); - // assert.strictEqual(err.error, "abort"); - // done(); - // }); - - // Async.sleep(1000, function(){ - // req.abort(); - // }); - // } - // ], - // function(err){ - // assert.ok(!err); - // done(); - // }); - // }); - - it("Callback#Create+cancel job", function (done) { - var sid = getNextId(); - this.service.jobs().search('search index=_internal | head 1', { id: sid }, function (err, job) { - assert.ok(job); - assert.strictEqual(job.sid, sid); - - job.cancel(function () { - done(); - }); - }); - }); - - it("Callback#Create job error", function (done) { - var sid = getNextId(); - this.service.jobs().search({ search: 'index=_internal | head 1', id: sid }, function (err) { - assert.ok(!!err); - done(); - }); - }); - - it("Callback#List jobs", function (done) { - this.service.jobs().fetch(function (err, jobs) { - assert.ok(!err); - assert.ok(jobs); - - var jobsList = jobs.list(); - assert.ok(jobsList.length > 0); - - for (var i = 0; i < jobsList.length; i++) { - assert.ok(jobsList[i]); - } - - done(); - }); - }); - - it("Callback#Contains job", function (done) { - var that = this; - var sid = getNextId(); - var jobs = this.service.jobs(); - - jobs.search('search index=_internal | head 1', { id: sid }, function (err, job) { - assert.ok(!err); - assert.ok(job); - assert.strictEqual(job.sid, sid); - - jobs.fetch(function (err, jobs) { - assert.ok(!err); - var job = jobs.item(sid); - assert.ok(job); - - job.cancel(function () { - done(); - }); - }); - }); - }); - - it("Callback#job results", function (done) { - var sid = getNextId(); - var service = this.service; - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1 | stats count', { id: sid }, done); - }, - function (job, done) { - assert.strictEqual(job.sid, sid); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - job.results({}, done); - }, - function (results, job, done) { - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.fields.length, 1); - assert.strictEqual(results.fields[0], "count"); - assert.strictEqual(results.rows[0][0], "1"); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#job events", function (done) { - var sid = getNextId(); - var service = this.service; - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); - }, - function (job, done) { - assert.strictEqual(job.sid, sid); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - job.events({}, done); - }, - function (results, job, done) { - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.fields.length, results.rows[0].length); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#job results preview", function (done) { - var sid = getNextId(); - var service = this.service; - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1 | stats count', { id: sid }, done); - }, - function (job, done) { - assert.strictEqual(job.sid, sid); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - job.preview({}, done); - }, - function (results, job, done) { - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.fields.length, 1); - assert.strictEqual(results.fields[0], "count"); - assert.strictEqual(results.rows[0][0], "1"); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#job results iterator", function (done) { - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 10', {}, done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - var iterator = job.iterator("results", { pagesize: 4 }); - var hasMore = true; - var numElements = 0; - var pageSizes = []; - Async.whilst( - function () { return hasMore; }, - function (nextIteration) { - iterator.next(function (err, results, _hasMore) { - if (err) { - nextIteration(err); - return; - } - - hasMore = _hasMore; - if (hasMore) { - pageSizes.push(results.rows.length); - } - nextIteration(); - }); - }, - function (err) { - assert.deepStrictEqual(pageSizes, [4, 4, 2]); - done(err); - } - ); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. - // - // - // it("Callback#Enable + disable preview", function(done) { - // var that = this; - // var sid = getNextId(); - - // var service = this.service.specialize("nobody", "sdk-app-collection"); - - // Async.chain([ - // function(done) { - // service.jobs().search('search index=_internal | head 1 | sleep 60', {id: sid}, done); - // }, - // function(job, done) { - // job.enablePreview(done); - - // }, - // function(job, done) { - // job.disablePreview(done); - // }, - // function(job, done) { - // job.cancel(done); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }); - - - // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. - // - // - // it("Callback#Pause + unpause + finalize preview", function(done) { - // var that = this; - // var sid = getNextId(); - - // var service = this.service.specialize("nobody", "sdk-app-collection"); - - // Async.chain([ - // function(done) { - // service.jobs().search('search index=_internal | head 1 | sleep 5', {id: sid}, done); - // }, - // function(job, done) { - // job.pause(done); - // }, - // function(job, done) { - // tutils.pollUntil( - // job, - // function(j) { - // return j.properties()["isPaused"]; - // }, - // 10, - // done - // ); - // }, - // function(job, done) { - // assert.ok(job.properties()["isPaused"]); - // job.unpause(done); - // }, - // function(job, done) { - // tutils.pollUntil( - // job, - // function(j) { - // return !j.properties()["isPaused"]; - // }, - // 10, - // done - // ); - // }, - // function(job, done) { - // assert.ok(!job.properties()["isPaused"]); - // job.finalize(done); - // }, - // function(job, done) { - // job.cancel(done); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }); - - it("Callback#Set TTL", function (done) { - var sid = getNextId(); - var originalTTL = 0; - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); - }, - function (job, done) { - job.fetch(done); - }, - function (job, done) { - var ttl = job.properties()["ttl"]; - originalTTL = ttl; - - job.setTTL(ttl * 2, done); - }, - function (job, done) { - job.fetch(done); - }, - function (job, done) { - var ttl = job.properties()["ttl"]; - assert.ok(ttl > originalTTL); - assert.ok(ttl <= (originalTTL * 2)); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - // Disabling this test because apps/appinstall endpoint is deprecated in Splunk 8.2. - // - // - // it("Callback#Set priority", function(done) { - // var sid = getNextId(); - // var originalPriority = 0; - // var that = this; - - // var service = this.service.specialize("nobody", "sdk-app-collection"); - - // Async.chain([ - // function(done) { - // service.jobs().search('search index=_internal | head 1 | sleep 5', {id: sid}, done); - // }, - // function(job, done) { - // job.track({}, { - // ready: function(job) { - // done(null, job); - // } - // }); - // }, - // function(job, done) { - // var priority = job.properties()["priority"]; - // assert.ok(priority, 5); - // job.setPriority(priority + 1, done); - // }, - // function(job, done) { - // job.fetch(done); - // }, - // function(job, done) { - // job.cancel(done); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }); - - it("Callback#Search log", function (done) { - var sid = getNextId(); - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1', { id: sid, exec_mode: "blocking" }, done); - }, - function (job, done) { - job.searchlog(done); - }, - function (log, job, done) { - assert.ok(job); - assert.ok(log); - assert.ok(log.length > 0); - assert.ok(log.split("\r\n").length > 0); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#Search summary", function (done) { - var sid = getNextId(); - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search( - 'search index=_internal | head 1 | eval foo="bar" | fields foo', - { - id: sid, - status_buckets: 300, - rf: ["foo"] - }, - done); - }, - function (job, done) { - // Let's sleep for 2 second so - // we let the server catch up - Async.sleep(2000, function () { - job.summary({}, done); - }); - }, - function (summary, job, done) { - assert.ok(job); - assert.ok(summary); - assert.strictEqual(summary.event_count, 1); - assert.strictEqual(summary.fields.foo.count, 1); - assert.strictEqual(summary.fields.foo.distinct_count, 1); - assert.ok(summary.fields.foo.is_exact, 1); - assert.strictEqual(summary.fields.foo.modes.length, 1); - assert.strictEqual(summary.fields.foo.modes[0].count, 1); - assert.strictEqual(summary.fields.foo.modes[0].value, "bar"); - assert.ok(summary.fields.foo.modes[0].is_exact); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#Search timeline", function (done) { - var sid = getNextId(); - var that = this; - - Async.chain([ - function (done) { - that.service.jobs().search( - 'search index=_internal | head 1 | eval foo="bar" | fields foo', - { - id: sid, - status_buckets: 300, - rf: ["foo"], - exec_mode: "blocking" - }, - done); - }, - function (job, done) { - job.timeline({}, done); - }, - function (timeline, job, done) { - assert.ok(job); - assert.ok(timeline); - assert.strictEqual(timeline.buckets.length, 1); - assert.strictEqual(timeline.event_count, 1); - assert.strictEqual(timeline.buckets[0].available_count, 1); - assert.strictEqual(timeline.buckets[0].duration, 0.001); - assert.strictEqual(timeline.buckets[0].earliest_time_offset, timeline.buckets[0].latest_time_offset); - assert.strictEqual(timeline.buckets[0].total_count, 1); - assert.ok(timeline.buckets[0].is_finalized); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#Touch", function (done) { - var sid = getNextId(); - var that = this; - var originalTime = ""; - - Async.chain([ - function (done) { - that.service.jobs().search('search index=_internal | head 1', { id: sid }, done); - }, - function (job, done) { - job.fetch(done); - }, - function (job, done) { - assert.ok(job); - originalTime = job.properties().updated; - Async.sleep(1200, function () { job.touch(done); }); - }, - function (job, done) { - job.fetch(done); - }, - function (job, done) { - assert.ok(originalTime !== job.updated()); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#Create failure", function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - - var jobs = this.service.jobs(); - assert.throws(function () { jobs.create({ search: originalSearch, name: name, exec_mode: "oneshot" }, function () { }); }); - done(); - }); - - it("Callback#Create fails with no search string", function (done) { - var jobs = this.service.jobs(); - jobs.create( - "", {}, - function (err) { - assert.ok(err); - done(); - } - ); - }); - - it("Callback#Oneshot search", function (done) { - var sid = getNextId(); - var that = this; - var originalTime = ""; - - Async.chain([ - function (done) { - that.service.jobs().oneshotSearch('search index=_internal | head 1 | stats count', { id: sid }, done); - }, - function (results, done) { - assert.ok(results); - assert.ok(results.fields); - assert.strictEqual(results.fields.length, 1); - assert.strictEqual(results.fields[0], "count"); - assert.ok(results.rows); - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.rows[0].length, 1); - assert.strictEqual(results.rows[0][0], "1"); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#Oneshot search with no results", function (done) { - var sid = getNextId(); - var that = this; - var originalTime = ""; - - Async.chain([ - function (done) { - var query = 'search index=history MUST_NOT_EXISTABCDEF'; - that.service.jobs().oneshotSearch(query, { id: sid }, done); - }, - function (results, done) { - assert.ok(results); - assert.strictEqual(results.fields.length, 0); - assert.strictEqual(results.rows.length, 0); - assert.ok(!results.preview); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - // it("Callback#Service oneshot search", function(done) { - // var sid = getNextId(); - // var that = this; - // var namespace = {owner: "admin", app: "search"}; - // var splunkVersion = 6.1; // Default to pre-6.2 version - // var originalLoggerLevel = "DEBUG"; - - // Async.chain([ - // function(done) { - // // If running on Splunk 6.2+, first set the search logger level to DEBUG - // Async.chain([ - // function(done1) { - // that.service.serverInfo(done1); - // }, - // function(info, done1) { - // splunkVersion = parseFloat(info.properties().version); - // if (splunkVersion < 6.2) { - // done(); // Exit the inner Async.chain - // } - // else { - // done1(); - // } - // }, - // function(done1) { - // that.service.configurations({owner: "admin", app: "search"}).fetch(done1); - // }, - // function(confs, done1) { - // try { - // confs.item("limits").fetch(done1); - // } - // catch(e) { - // done1(e); - // } - // }, - // function(conf, done1) { - // var searchInfo = conf.item("search_info"); - // // Save this so it can be restored later - // originalLoggerLevel = searchInfo.properties()["infocsv_log_level"]; - // searchInfo.update({"infocsv_log_level": "DEBUG"}, done1); - // }, - // function(conf, done1) { - // assert.strictEqual("DEBUG", conf.properties()["infocsv_log_level"]); - // done1(); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - // function(done) { - // that.service.oneshotSearch('search index=_internal | head 1 | stats count', {id: sid}, namespace, done); - // }, - // function(results, done) { - // assert.ok(results); - // assert.ok(results.fields); - // assert.strictEqual(results.fields.length, 1); - // assert.strictEqual(results.fields[0], "count"); - // assert.ok(results.rows); - // assert.strictEqual(results.rows.length, 1); - // assert.strictEqual(results.rows[0].length, 1); - // assert.strictEqual(results.rows[0][0], "1"); - // assert.ok(results.messages[1].text.indexOf('owner="admin"')); - // assert.ok(results.messages[1].text.indexOf('app="search"')); - - // done(); - // }, - // function(done) { - // Async.chain([ - // function(done1) { - // if (splunkVersion < 6.2) { - // done(); // Exit the inner Async.chain - // } - // else { - // done1(); - // } - // }, - // function(done1) { - // that.service.configurations({owner: "admin", app: "search"}).fetch(done1); - // }, - // function(confs, done1) { - // try { - // confs.item("limits").fetch(done1); - // } - // catch(e) { - // done1(e); - // } - // }, - // function(conf, done1) { - // var searchInfo = conf.item("search_info"); - // // Restore the logger level from before - // searchInfo.update({"infocsv_log_level": originalLoggerLevel}, done1); - // }, - // function(conf, done1) { - // assert.strictEqual(originalLoggerLevel, conf.properties()["infocsv_log_level"]); - // done1(); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }); - - it("Callback#Service search", function (done) { - var sid = getNextId(); - var service = this.service; - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { - that.service.search('search index=_internal | head 1 | stats count', { id: sid }, namespace, done); - }, - function (job, done) { - assert.strictEqual(job.sid, sid); - assert.strictEqual(job.namespace, namespace); - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - done - ); - }, - function (job, done) { - job.results({}, done); - }, - function (results, job, done) { - assert.strictEqual(results.rows.length, 1); - assert.strictEqual(results.fields.length, 1); - assert.strictEqual(results.fields[0], "count"); - assert.strictEqual(results.rows[0][0], "1"); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#Wait until job done", function (done) { - this.service.search('search index=_internal | head 1000', {}, function (err, job) { - assert.ok(!err); - - var numReadyEvents = 0; - var numProgressEvents = 0; - job.track({ period: 200 }, { - ready: function (job) { - assert.ok(job); - - numReadyEvents++; - }, - progress: function (job) { - assert.ok(job); - - numProgressEvents++; - }, - done: function (job) { - assert.ok(job); - - assert.ok(numReadyEvents === 1); // all done jobs must have become ready - assert.ok(numProgressEvents >= 1); // a job that becomes ready has progress - done(); - }, - failed: function (job) { - assert.ok(job); - - assert.ok(false, "Job failed unexpectedly."); - done(); - }, - error: function (err) { - assert.ok(err); - - assert.ok(false, "Error while tracking job."); - done(); - } - }); - }); - }); - - it("Callback#Wait until job failed", function (done) { - this.service.search('search index=_internal | head bogusarg', {}, function (err, job) { - if (err) { - assert.ok(!err); - done(); - return; - } - - var numReadyEvents = 0; - var numProgressEvents = 0; - job.track({ period: 200 }, { - ready: function (job) { - assert.ok(job); - - numReadyEvents++; - }, - progress: function (job) { - assert.ok(job); - - numProgressEvents++; - }, - done: function (job) { - assert.ok(job); - - assert.ok(false, "Job became done unexpectedly."); - done(); - }, - failed: function (job) { - assert.ok(job); - - assert.ok(numReadyEvents === 1); // even failed jobs become ready - assert.ok(numProgressEvents >= 1); // a job that becomes ready has progress - done(); - }, - error: function (err) { - assert.ok(err); - - assert.ok(false, "Error while tracking job."); - done(); - } - }); - }); - }); - - it("Callback#track() with default params and one function", function (done) { - this.service.search('search index=_internal | head 1', {}, function (err, job) { - if (err) { - assert.ok(!err); - done(); - return; - } - - job.track({}, function (job) { - assert.ok(job); - done(); - }); - }); - }); - - it("Callback#track() should stop polling if only the ready callback is specified", function (done) { - this.service.search('search index=_internal | head 1', {}, function (err, job) { - if (err) { - assert.ok(!err); - done(); - return; - } - - job.track({}, { - ready: function (job) { - assert.ok(job); - }, - - _stoppedAfterReady: function (job) { - done(); - } - }); - }); - }); - - it("Callback#track() a job that is not immediately ready", function (done) { - /*jshint loopfunc:true */ - var numJobs = 20; - var numJobsLeft = numJobs; - var gotJobNotImmediatelyReady = false; - for (var i = 0; i < numJobs; i++) { - this.service.search('search index=_internal | head 10000', {}, function (err, job) { - if (err) { - assert.ok(!err); - done(); - return; - } - - job.track({}, { - _preready: function (job) { - gotJobNotImmediatelyReady = true; - }, - - ready: function (job) { - numJobsLeft--; - - if (numJobsLeft === 0) { - if (!gotJobNotImmediatelyReady) { - splunkjs.Logger.error("", "WARNING: Couldn't test code path in track() where job wasn't ready immediately."); - } - done(); - } - } - }); - }); - } - }); - - it("Callback#Service.getJob() works", function (done) { - var that = this; - var sidsMatch = false; - this.service.search('search index=_internal | head 1', {}, function (err, job) { - if (err) { - assert.ok(!err); - done(); - return; - } - var sid = job.sid; - return Async.chain([ - function (done) { - that.service.getJob(sid, done); - }, - function (innerJob, done) { - assert.strictEqual(sid, innerJob.sid); - sidsMatch = sid === innerJob.sid; - done(); - } - ], - function (err) { - assert.ok(!err); - assert.ok(sidsMatch); - done(); - } - ); - }); - }); - }) - ) -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - if (!process.env.SPLUNK_HOME) { - throw new Error("$PATH variable SPLUNK_HOME is not set. Please export SPLUNK_HOME to the splunk instance."); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc)); - }); - }); -} diff --git a/tests_spike/service_tests/namespace.js b/tests_spike/service_tests/namespace.js deleted file mode 100644 index 8f456f5c9..000000000 --- a/tests_spike/service_tests/namespace.js +++ /dev/null @@ -1,287 +0,0 @@ -var assert = require('chai').assert; - -var splunkjs = require('../../index'); -const { Logger } = require('../../lib/log'); - -var Async = splunkjs.Async; -var utils = splunkjs.Utils; -var idCounter = 0; - -var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); -}; - -exports.setup = function (svc) { - return ( - describe("Namespace tests", () => { - beforeEach(function (finished) { - this.service = svc; - var that = this; - - var appName1 = "jssdk_testapp_" + getNextId(); - var appName2 = "jssdk_testapp_" + getNextId(); - - var userName1 = "jssdk_testuser_" + getNextId(); - var userName2 = "jssdk_testuser_" + getNextId(); - - var apps = this.service.apps(); - var users = this.service.users(); - - this.namespace11 = { owner: userName1, app: appName1 }; - this.namespace12 = { owner: userName1, app: appName2 }; - this.namespace21 = { owner: userName2, app: appName1 }; - this.namespace22 = { owner: userName2, app: appName2 }; - - Async.chain([ - function (done) { - apps.create({ name: appName1 }, done); - }, - function (app1, done) { - that.app1 = app1; - that.appName1 = appName1; - apps.create({ name: appName2 }, done); - }, - function (app2, done) { - that.app2 = app2; - that.appName2 = appName2; - users.create({ name: userName1, password: "abcdefg!", roles: ["user"] }, done); - }, - function (user1, done) { - that.user1 = user1; - that.userName1 = userName1; - users.create({ name: userName2, password: "abcdefg!", roles: ["user"] }, done); - }, - function (user2, done) { - that.user2 = user2; - that.userName2 = userName2; - - done(); - } - ], - function (err) { - finished(err); - } - ); - }); - - it("Callback#Namespace protection", function (done) { - var searchName = "jssdk_search_" + getNextId(); - var search = "search *"; - var service = this.service; - var savedSearches11 = service.savedSearches(this.namespace11); - var savedSearches21 = service.savedSearches(this.namespace21); - - Async.chain([ - function (done) { - // Create the saved search only in the 11 namespace - savedSearches11.create({ name: searchName, search: search }, done); - }, - function (savedSearch, done) { - // Refresh the 11 saved searches - savedSearches11.fetch(done); - }, - function (savedSearches, done) { - // Refresh the 21 saved searches - savedSearches21.fetch(done); - }, - function (savedSearches, done) { - var entity11 = savedSearches11.item(searchName); - var entity21 = savedSearches21.item(searchName); - - // Make sure the saved search exists in the 11 namespace - assert.ok(entity11); - assert.strictEqual(entity11.name, searchName); - assert.strictEqual(entity11.properties().search, search); - - // Make sure the saved search doesn't exist in the 11 namespace - assert.ok(!entity21); - done(); - } - ], - function (err) { - assert.ok(!err, JSON.stringify(err)); - done(); - } - ); - }); - - it("Callback#Namespace item", function (done) { - var searchName = "jssdk_search_" + getNextId(); - var search = "search *"; - var service = this.service; - - var namespace_1 = { owner: "-", app: this.appName1 }; - var namespace_nobody1 = { owner: "nobody", app: this.appName1 }; - - var savedSearches11 = service.savedSearches(this.namespace11); - var savedSearches21 = service.savedSearches(this.namespace21); - var savedSearches_1 = service.savedSearches(namespace_1); - var savedSearches_nobody1 = service.savedSearches(namespace_nobody1); - - var that = this; - Async.chain([ - function (done) { - // Create a saved search in the 11 namespace - savedSearches11.create({ name: searchName, search: search }, done); - }, - function (savedSearch, done) { - // Create a saved search in the 21 namespace - savedSearches21.create({ name: searchName, search: search }, done); - }, - function (savedSearch, done) { - // Refresh the -/1 namespace - savedSearches_1.fetch(done); - }, - function (savedSearches, done) { - // Refresh the 1/1 namespace - savedSearches11.fetch(done); - }, - function (savedSearches, done) { - // Refresh the 2/1 namespace - savedSearches21.fetch(done); - }, - function (savedSearches, done) { - var entity11 = savedSearches11.item(searchName, that.namespace11); - var entity21 = savedSearches21.item(searchName, that.namespace21); - - // Ensure that the saved search exists in the 11 namespace - assert.ok(entity11); - assert.strictEqual(entity11.name, searchName); - assert.strictEqual(entity11.properties().search, search); - assert.strictEqual(entity11.namespace.owner, that.namespace11.owner); - assert.strictEqual(entity11.namespace.app, that.namespace11.app); - - // Ensure that the saved search exists in the 21 namespace - assert.ok(entity21); - assert.strictEqual(entity21.name, searchName); - assert.strictEqual(entity21.properties().search, search); - assert.strictEqual(entity21.namespace.owner, that.namespace21.owner); - assert.strictEqual(entity21.namespace.app, that.namespace21.app); - - done(); - }, - function (done) { - // Create a saved search in the nobody/1 namespace - savedSearches_nobody1.create({ name: searchName, search: search }, done); - }, - function (savedSearch, done) { - // Refresh the 1/1 namespace - savedSearches11.fetch(done); - }, - function (savedSearches, done) { - // Refresh the 2/1 namespace - savedSearches21.fetch(done); - }, - function (savedSearches, done) { - // Ensure that we can't get the item from the generic - // namespace without specifying a namespace - try { - savedSearches_1.item(searchName); - assert.ok(false); - } catch (err) { - assert.ok(err); - } - - // Ensure that we can't get the item using wildcard namespaces. - try { - savedSearches_1.item(searchName, { owner: '-' }); - assert.ok(false); - } catch (err) { - assert.ok(err); - } - - try { - savedSearches_1.item(searchName, { app: '-' }); - assert.ok(false); - } catch (err) { - assert.ok(err); - } - - try { - savedSearches_1.item(searchName, { app: '-', owner: '-' }); - assert.ok(false); - } catch (err) { - assert.ok(err); - } - - // Ensure we get the right entities from the -/1 namespace when we - // specify it. - var entity11 = savedSearches_1.item(searchName, that.namespace11); - var entity21 = savedSearches_1.item(searchName, that.namespace21); - - assert.ok(entity11); - assert.strictEqual(entity11.name, searchName); - assert.strictEqual(entity11.properties().search, search); - assert.strictEqual(entity11.namespace.owner, that.namespace11.owner); - assert.strictEqual(entity11.namespace.app, that.namespace11.app); - - assert.ok(entity21); - assert.strictEqual(entity21.name, searchName); - assert.strictEqual(entity21.properties().search, search); - assert.strictEqual(entity21.namespace.owner, that.namespace21.owner); - assert.strictEqual(entity21.namespace.app, that.namespace21.app); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Callback#delete test users", function (done) { - var users = this.service.users(); - users.fetch(function (err, users) { - var userList = users.list(); - - Async.parallelEach( - userList, - function (user, idx, callback) { - if (utils.startsWith(user.name, "jssdk_")) { - user.remove(callback); - } else { - callback(); - } - }, function (err) { - assert.ok(!err); - done(); - } - ); - }); - }) - }) - ) -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc)); - }); - }); -} diff --git a/tests_spike/service_tests/parser.js b/tests_spike/service_tests/parser.js deleted file mode 100644 index fbcaa0145..000000000 --- a/tests_spike/service_tests/parser.js +++ /dev/null @@ -1,63 +0,0 @@ -exports.setup = function (svc) { - var assert = require('chai').assert; - return ( - describe("Parsing Tests", function () { - beforeEach(function (done) { - this.service = svc; - done(); - }); - - it("Callback#Basic parse", function (done) { - var service = this.service; - - service.parse("search index=_internal | head 1", function (err, parse) { - assert.ok(!err); - assert.ok(parse); - assert.ok(parse.commands.length > 0); - done(); - }); - }); - - it("Callback#Parse error", function (done) { - var service = this.service; - - service.parse("ABCXYZ", function (err, parse) { - assert.ok(err); - assert.strictEqual(err.status, 400); - done(); - }); - }); - }) - ); -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc)); - }); - }); -} diff --git a/tests_spike/service_tests/pivot.js b/tests_spike/service_tests/pivot.js deleted file mode 100644 index 3a49a922e..000000000 --- a/tests_spike/service_tests/pivot.js +++ /dev/null @@ -1,1600 +0,0 @@ - -exports.setup = function (svc) { - var assert = require('chai').assert; - - var splunkjs = require('../../index'); - var tutils = require('../utils'); - - var Async = splunkjs.Async; - var utils = splunkjs.Utils; - var idCounter = 0; - - var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); - }; - return ( - describe("Pivot Tests", function () { - beforeEach(function (done) { - this.service = svc; - this.dataModels = svc.dataModels({ owner: "nobody", app: "search" }); - this.skip = false; - var that = this; - this.service.serverInfo(function (err, info) { - if (parseInt(info.properties().version.split(".")[0], 10) < 6) { - that.skip = true; - splunkjs.Logger.log("Skipping pivot tests..."); - } - done(err); - }); - }) - - it("Callback#Pivot - test constructor args", function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - assert.ok(dataModel.objectByName("test_data")); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Pivot - test acceleration, then pivot", function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - dataModel.objectByName("test_data"); - assert.ok(dataModel); - - dataModel.acceleration.enabled = true; - dataModel.acceleration.earliestTime = "-2mon"; - dataModel.acceleration.cronSchedule = "0 */12 * * *"; - dataModel.update(done); - }, - function (dataModel, done) { - var props = dataModel.properties(); - - assert.strictEqual(true, dataModel.isAccelerated()); - assert.strictEqual(true, !!dataModel.acceleration.enabled); - assert.strictEqual("-2mon", dataModel.acceleration.earliest_time); - assert.strictEqual("0 */12 * * *", dataModel.acceleration.cron_schedule); - - var dataModelObject = dataModel.objectByName("test_data"); - var pivotSpecification = dataModelObject.createPivotSpecification(); - - assert.strictEqual(dataModelObject.dataModel.name, pivotSpecification.accelerationNamespace); - - var name1 = "delete-me-" + getNextId(); - pivotSpecification.setAccelerationJob(name1); - assert.strictEqual("sid=" + name1, pivotSpecification.accelerationNamespace); - - var namespaceTemp = "delete-me-" + getNextId(); - pivotSpecification.accelerationNamespace = namespaceTemp; - assert.strictEqual(namespaceTemp, pivotSpecification.accelerationNamespace); - - pivotSpecification - .addCellValue("test_data", "Source Value", "count") - .run(done); - }, - function (job, pivot, done) { - assert.ok(job); - assert.ok(pivot); - assert.notStrictEqual("FAILED", job.properties().dispatchState); - - job.track({}, function (job) { - assert.ok(pivot.tstatsSearch); - assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); - assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); - assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); - - assert.strictEqual(pivot.tstatsSearch, job.properties().request.search); - done(null, job); - }); - }, - function (job, done) { - assert.ok(job); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Pivot - test illegal filtering (all types)", function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - - // Boolean comparisons - try { - pivotSpecification.addFilter(getNextId(), "boolean", "=", true); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); - } - try { - pivotSpecification.addFilter("_time", "boolean", "=", true); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add boolean filter on _time because it is of type timestamp"); - } - - // String comparisons - try { - pivotSpecification.addFilter("has_boris", "string", "contains", "abc"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add string filter on has_boris because it is of type boolean"); - } - try { - pivotSpecification.addFilter(getNextId(), "string", "contains", "abc"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); - } - - // IPv4 comparisons - try { - pivotSpecification.addFilter("has_boris", "ipv4", "startsWith", "192.168"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add ipv4 filter on has_boris because it is of type boolean"); - } - try { - pivotSpecification.addFilter(getNextId(), "ipv4", "startsWith", "192.168"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); - } - - // Number comparisons - try { - pivotSpecification.addFilter("has_boris", "number", "atLeast", 2.3); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add number filter on has_boris because it is of type boolean"); - } - try { - pivotSpecification.addFilter(getNextId(), "number", "atLeast", 2.3); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add filter on a nonexistent field."); - } - - // Limit filter - try { - pivotSpecification.addLimitFilter("has_boris", "host", "DEFAULT", 50, "count"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add limit filter on has_boris because it is of type boolean"); - } - try { - pivotSpecification.addLimitFilter(getNextId(), "host", "DEFAULT", 50, "count"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot add limit filter on a nonexistent field."); - } - try { - pivotSpecification.addLimitFilter("source", "host", "DEFAULT", 50, "sum"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, - "Stats function for fields of type string must be COUNT or DISTINCT_COUNT; found sum"); - } - try { - pivotSpecification.addLimitFilter("epsilon", "host", "DEFAULT", 50, "duration"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, - "Stats function for fields of type number must be one of COUNT, DISTINCT_COUNT, SUM, or AVERAGE; found duration"); - } - try { - pivotSpecification.addLimitFilter("test_data", "host", "DEFAULT", 50, "list"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, - "Stats function for fields of type object count must be COUNT; found list"); - } - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Pivot - test boolean filtering", function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addFilter("has_boris", "boolean", "=", true); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("rule")); - assert.ok(filter.hasOwnProperty("owner")); - - assert.strictEqual("has_boris", filter.fieldName); - assert.strictEqual("boolean", filter.type); - assert.strictEqual("=", filter.rule.comparator); - assert.strictEqual(true, filter.rule.compareTo); - assert.strictEqual("test_data", filter.owner); - } - catch (e) { - assert.ok(false); - } - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Pivot - test string filtering", function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addFilter("host", "string", "contains", "abc"); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("rule")); - assert.ok(filter.hasOwnProperty("owner")); - - assert.strictEqual("host", filter.fieldName); - assert.strictEqual("string", filter.type); - assert.strictEqual("contains", filter.rule.comparator); - assert.strictEqual("abc", filter.rule.compareTo); - assert.strictEqual("BaseEvent", filter.owner); - } - catch (e) { - assert.ok(false); - } - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Pivot - test IPv4 filtering", function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addFilter("hostip", "ipv4", "startsWith", "192.168"); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("rule")); - assert.ok(filter.hasOwnProperty("owner")); - - assert.strictEqual("hostip", filter.fieldName); - assert.strictEqual("ipv4", filter.type); - assert.strictEqual("startsWith", filter.rule.comparator); - assert.strictEqual("192.168", filter.rule.compareTo); - assert.strictEqual("test_data", filter.owner); - } - catch (e) { - assert.ok(false); - } - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Pivot - test number filtering", function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addFilter("epsilon", "number", ">=", 2.3); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("rule")); - assert.ok(filter.hasOwnProperty("owner")); - - assert.strictEqual("epsilon", filter.fieldName); - assert.strictEqual("number", filter.type); - assert.strictEqual(">=", filter.rule.comparator); - assert.strictEqual(2.3, filter.rule.compareTo); - assert.strictEqual("test_data", filter.owner); - } - catch (e) { - assert.ok(false); - } - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Pivot - test limit filtering", function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - try { - pivotSpecification.addLimitFilter("epsilon", "host", "ASCENDING", 500, "average"); - assert.strictEqual(1, pivotSpecification.filters.length); - - //Test the individual parts of the filter - var filter = pivotSpecification.filters[0]; - - assert.ok(filter.hasOwnProperty("fieldName")); - assert.ok(filter.hasOwnProperty("type")); - assert.ok(filter.hasOwnProperty("owner")); - assert.ok(filter.hasOwnProperty("attributeName")); - assert.ok(filter.hasOwnProperty("attributeOwner")); - assert.ok(filter.hasOwnProperty("limitType")); - assert.ok(filter.hasOwnProperty("limitAmount")); - assert.ok(filter.hasOwnProperty("statsFn")); - - assert.strictEqual("epsilon", filter.fieldName); - assert.strictEqual("number", filter.type); - assert.strictEqual("test_data", filter.owner); - assert.strictEqual("host", filter.attributeName); - assert.strictEqual("BaseEvent", filter.attributeOwner); - assert.strictEqual("lowest", filter.limitType); - assert.strictEqual(500, filter.limitAmount); - assert.strictEqual("average", filter.statsFn); - } - catch (e) { - assert.ok(false); - } - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Pivot - test row split", function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - - // Test error handling for row split - try { - pivotSpecification.addRowSplit("has_boris", "Wrong type here"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number or string."); - } - var field = getNextId(); - try { - - pivotSpecification.addRowSplit(field, "Break Me!"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - - // Test row split, number - pivotSpecification.addRowSplit("epsilon", "My Label"); - assert.strictEqual(1, pivotSpecification.rows.length); - - var row = pivotSpecification.rows[0]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(row.hasOwnProperty("display")); - - assert.strictEqual("epsilon", row.fieldName); - assert.strictEqual("test_data", row.owner); - assert.strictEqual("number", row.type); - assert.strictEqual("My Label", row.label); - assert.strictEqual("all", row.display); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - label: "My Label", - display: "all" - }, - row); - - // Test row split, string - pivotSpecification.addRowSplit("host", "My Label"); - assert.strictEqual(2, pivotSpecification.rows.length); - - row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(!row.hasOwnProperty("display")); - - assert.strictEqual("host", row.fieldName); - assert.strictEqual("BaseEvent", row.owner); - assert.strictEqual("string", row.type); - assert.strictEqual("My Label", row.label); - assert.deepEqual({ - fieldName: "host", - owner: "BaseEvent", - type: "string", - label: "My Label" - }, - row); - - // Test error handling on range row split - try { - pivotSpecification.addRangeRowSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number."); - } - try { - pivotSpecification.addRangeRowSplit(field, "Break Me!", { start: 0, end: 100, step: 20, limit: 5 }); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - - // Test range row split - pivotSpecification.addRangeRowSplit("epsilon", "My Label", { start: 0, end: 100, step: 20, limit: 5 }); - assert.strictEqual(3, pivotSpecification.rows.length); - - row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(row.hasOwnProperty("display")); - assert.ok(row.hasOwnProperty("ranges")); - - assert.strictEqual("epsilon", row.fieldName); - assert.strictEqual("test_data", row.owner); - assert.strictEqual("number", row.type); - assert.strictEqual("My Label", row.label); - assert.strictEqual("ranges", row.display); - - var ranges = { - start: 0, - end: 100, - size: 20, - maxNumberOf: 5 - }; - assert.deepEqual(ranges, row.ranges); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - label: "My Label", - display: "ranges", - ranges: ranges - }, - row); - - // Test error handling on boolean row split - try { - pivotSpecification.addBooleanRowSplit("epsilon", "Wrong type here", "t", "f"); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected boolean."); - } - try { - pivotSpecification.addBooleanRowSplit(field, "Break Me!", "t", "f"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - - // Test boolean row split - pivotSpecification.addBooleanRowSplit("has_boris", "My Label", "is_true", "is_false"); - assert.strictEqual(4, pivotSpecification.rows.length); - - row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(row.hasOwnProperty("trueLabel")); - assert.ok(row.hasOwnProperty("falseLabel")); - - assert.strictEqual("has_boris", row.fieldName); - assert.strictEqual("My Label", row.label); - assert.strictEqual("test_data", row.owner); - assert.strictEqual("boolean", row.type); - assert.strictEqual("is_true", row.trueLabel); - assert.strictEqual("is_false", row.falseLabel); - assert.deepEqual({ - fieldName: "has_boris", - label: "My Label", - owner: "test_data", - type: "boolean", - trueLabel: "is_true", - falseLabel: "is_false" - }, - row); - - // Test error handling on timestamp row split - try { - pivotSpecification.addTimestampRowSplit("epsilon", "Wrong type here", "some binning"); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected timestamp."); - } - try { - pivotSpecification.addTimestampRowSplit(field, "Break Me!", "some binning"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - try { - pivotSpecification.addTimestampRowSplit("_time", "some label", "Bogus binning value"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); - } - - // Test timestamp row split - pivotSpecification.addTimestampRowSplit("_time", "My Label", "day"); - assert.strictEqual(5, pivotSpecification.rows.length); - - row = pivotSpecification.rows[pivotSpecification.rows.length - 1]; - assert.ok(row.hasOwnProperty("fieldName")); - assert.ok(row.hasOwnProperty("owner")); - assert.ok(row.hasOwnProperty("type")); - assert.ok(row.hasOwnProperty("label")); - assert.ok(row.hasOwnProperty("period")); - - assert.strictEqual("_time", row.fieldName); - assert.strictEqual("My Label", row.label); - assert.strictEqual("BaseEvent", row.owner); - assert.strictEqual("timestamp", row.type); - assert.strictEqual("day", row.period); - assert.deepEqual({ - fieldName: "_time", - label: "My Label", - owner: "BaseEvent", - type: "timestamp", - period: "day" - }, - row); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Pivot - test column split", function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - - // Test error handling for column split - try { - pivotSpecification.addColumnSplit("has_boris", "Wrong type here"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number or string."); - } - var field = getNextId(); - try { - - pivotSpecification.addColumnSplit(field, "Break Me!"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - - // Test column split, number - pivotSpecification.addColumnSplit("epsilon"); - assert.strictEqual(1, pivotSpecification.columns.length); - - var col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(col.hasOwnProperty("display")); - - assert.strictEqual("epsilon", col.fieldName); - assert.strictEqual("test_data", col.owner); - assert.strictEqual("number", col.type); - assert.strictEqual("all", col.display); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - display: "all" - }, - col); - - // Test column split, string - pivotSpecification.addColumnSplit("host"); - assert.strictEqual(2, pivotSpecification.columns.length); - - col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(!col.hasOwnProperty("display")); - - assert.strictEqual("host", col.fieldName); - assert.strictEqual("BaseEvent", col.owner); - assert.strictEqual("string", col.type); - assert.deepEqual({ - fieldName: "host", - owner: "BaseEvent", - type: "string" - }, - col); - - done(); - - // Test error handling for range column split - try { - pivotSpecification.addRangeColumnSplit("has_boris", "Wrong type here", { start: 0, end: 100, step: 20, limit: 5 }); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("has_boris").type + ", expected number."); - } - try { - pivotSpecification.addRangeColumnSplit(field, { start: 0, end: 100, step: 20, limit: 5 }); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - - // Test range column split - pivotSpecification.addRangeColumnSplit("epsilon", { start: 0, end: 100, step: 20, limit: 5 }); - assert.strictEqual(3, pivotSpecification.columns.length); - - col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(col.hasOwnProperty("display")); - assert.ok(col.hasOwnProperty("ranges")); - - assert.strictEqual("epsilon", col.fieldName); - assert.strictEqual("test_data", col.owner); - assert.strictEqual("number", col.type); - assert.strictEqual("ranges", col.display); - var ranges = { - start: 0, - end: 100, - size: 20, - maxNumberOf: 5 - }; - assert.deepEqual(ranges, col.ranges); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - display: "ranges", - ranges: ranges - }, - col); - - // Test error handling on boolean column split - try { - pivotSpecification.addBooleanColumnSplit("epsilon", "t", "f"); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected boolean."); - } - try { - pivotSpecification.addBooleanColumnSplit(field, "t", "f"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - - // Test boolean column split - pivotSpecification.addBooleanColumnSplit("has_boris", "is_true", "is_false"); - assert.strictEqual(4, pivotSpecification.columns.length); - - col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(!col.hasOwnProperty("label")); - assert.ok(col.hasOwnProperty("trueLabel")); - assert.ok(col.hasOwnProperty("falseLabel")); - - assert.strictEqual("has_boris", col.fieldName); - assert.strictEqual("test_data", col.owner); - assert.strictEqual("boolean", col.type); - assert.strictEqual("is_true", col.trueLabel); - assert.strictEqual("is_false", col.falseLabel); - assert.deepEqual({ - fieldName: "has_boris", - owner: "test_data", - type: "boolean", - trueLabel: "is_true", - falseLabel: "is_false" - }, - col); - - // Test error handling on timestamp column split - try { - pivotSpecification.addTimestampColumnSplit("epsilon", "Wrong type here"); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Field was of type " + obj.fieldByName("epsilon").type + ", expected timestamp."); - } - try { - pivotSpecification.addTimestampColumnSplit(field, "Break Me!"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field " + field); - } - try { - pivotSpecification.addTimestampColumnSplit("_time", "Bogus binning value"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Invalid binning Bogus binning value found. Valid values are: " + pivotSpecification._binning.join(", ")); - } - - // Test timestamp column split - pivotSpecification.addTimestampColumnSplit("_time", "day"); - assert.strictEqual(5, pivotSpecification.columns.length); - - col = pivotSpecification.columns[pivotSpecification.columns.length - 1]; - assert.ok(col.hasOwnProperty("fieldName")); - assert.ok(col.hasOwnProperty("owner")); - assert.ok(col.hasOwnProperty("type")); - assert.ok(!col.hasOwnProperty("label")); - assert.ok(col.hasOwnProperty("period")); - - assert.strictEqual("_time", col.fieldName); - assert.strictEqual("BaseEvent", col.owner); - assert.strictEqual("timestamp", col.type); - assert.strictEqual("day", col.period); - assert.deepEqual({ - fieldName: "_time", - owner: "BaseEvent", - type: "timestamp", - period: "day" - }, - col); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Pivot - test cell value", function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - var pivotSpecification = obj.createPivotSpecification(); - - // Test error handling for cell value, string - try { - pivotSpecification.addCellValue("iDontExist", "Break Me!", "explosion"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Did not find field iDontExist"); - } - try { - pivotSpecification.addCellValue("source", "Wrong Stats Function", "stdev"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + - " list, distinct_values, first, last, count, or distinct_count; found stdev"); - } - - // Add cell value, string - pivotSpecification.addCellValue("source", "Source Value", "dc"); - assert.strictEqual(1, pivotSpecification.cells.length); - - var cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("source", cell.fieldName); - assert.strictEqual("BaseEvent", cell.owner); - assert.strictEqual("string", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("dc", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "source", - owner: "BaseEvent", - type: "string", - label: "Source Value", - value: "dc", - sparkline: false - }, cell); - - // Test error handling for cell value, IPv4 - try { - pivotSpecification.addCellValue("hostip", "Wrong Stats Function", "stdev"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on string and IPv4 fields must be one of:" + - " list, distinct_values, first, last, count, or distinct_count; found stdev"); - } - - // Add cell value, IPv4 - pivotSpecification.addCellValue("hostip", "Source Value", "dc"); - assert.strictEqual(2, pivotSpecification.cells.length); - - cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("hostip", cell.fieldName); - assert.strictEqual("test_data", cell.owner); - assert.strictEqual("ipv4", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("dc", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "hostip", - owner: "test_data", - type: "ipv4", - label: "Source Value", - value: "dc", - sparkline: false - }, cell); - - // Test error handling for cell value, boolean - try { - pivotSpecification.addCellValue("has_boris", "Booleans not allowed", "sum"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Cannot use boolean valued fields as cell values."); - } - - // Test error handling for cell value, number - try { - pivotSpecification.addCellValue("epsilon", "Wrong Stats Function", "latest"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on number field must be must be one of:" + - " sum, count, average, max, min, stdev, list, or distinct_values; found latest"); - } - - // Add cell value, number - pivotSpecification.addCellValue("epsilon", "Source Value", "average"); - assert.strictEqual(3, pivotSpecification.cells.length); - - cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("epsilon", cell.fieldName); - assert.strictEqual("test_data", cell.owner); - assert.strictEqual("number", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("average", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "epsilon", - owner: "test_data", - type: "number", - label: "Source Value", - value: "average", - sparkline: false - }, cell); - - // Test error handling for cell value, timestamp - try { - pivotSpecification.addCellValue("_time", "Wrong Stats Function", "max"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on timestamp field must be one of:" + - " duration, earliest, latest, list, or distinct values; found max"); - } - - // Add cell value, timestamp - pivotSpecification.addCellValue("_time", "Source Value", "earliest"); - assert.strictEqual(4, pivotSpecification.cells.length); - - cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("_time", cell.fieldName); - assert.strictEqual("BaseEvent", cell.owner); - assert.strictEqual("timestamp", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("earliest", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "_time", - owner: "BaseEvent", - type: "timestamp", - label: "Source Value", - value: "earliest", - sparkline: false - }, cell); - - // Test error handling for cell value, count - try { - pivotSpecification.addCellValue("test_data", "Wrong Stats Function", "min"); - assert.ok(false); - } - catch (e) { - assert.ok(e); - assert.strictEqual(e.message, "Stats function on childcount and objectcount fields " + - "must be count; found " + "min"); - } - - // Add cell value, count - pivotSpecification.addCellValue("test_data", "Source Value", "count"); - assert.strictEqual(5, pivotSpecification.cells.length); - - cell = pivotSpecification.cells[pivotSpecification.cells.length - 1]; - assert.ok(cell.hasOwnProperty("fieldName")); - assert.ok(cell.hasOwnProperty("owner")); - assert.ok(cell.hasOwnProperty("type")); - assert.ok(cell.hasOwnProperty("label")); - assert.ok(cell.hasOwnProperty("value")); - assert.ok(cell.hasOwnProperty("sparkline")); - - assert.strictEqual("test_data", cell.fieldName); - assert.strictEqual("test_data", cell.owner); - assert.strictEqual("objectCount", cell.type); - assert.strictEqual("Source Value", cell.label); - assert.strictEqual("count", cell.value); - assert.strictEqual(false, cell.sparkline); - assert.deepEqual({ - fieldName: "test_data", - owner: "test_data", - type: "objectCount", - label: "Source Value", - value: "count", - sparkline: false - }, cell); - - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Pivot - test pivot throws HTTP exception", function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - var obj = dataModel.objectByName("test_data"); - assert.ok(obj); - - obj.createPivotSpecification().pivot(done); - }, - function (pivot, done) { - assert.ok(false); - } - ], - function (err) { - assert.ok(err); - var expectedErr = "In handler 'datamodelpivot': Error in 'PivotReport': Must have non-empty cells or non-empty rows."; - assert.ok(utils.endsWith(err.message, expectedErr)); - done(); - } - ); - }) - - it("Callback#Pivot - test pivot with simple namespace", function (done) { - if (this.skip) { - done(); - return; - } - var name = "delete-me-" + getNextId(); - var args; - try { - args = JSON.parse(utils.readFile(__filename, "../../data/data_model_for_pivot.json")); - } - catch (err) { - // Fail if we can't read the file, likely to occur in the browser - assert.ok(!err); - done(); - } - var that = this; - var obj; - var pivotSpecification; - var adhocjob; - Async.chain([ - function (done) { - that.dataModels.create(name, args, done); - }, - function (dataModel, done) { - obj = dataModel.objectByName("test_data"); - assert.ok(obj); - obj.createLocalAccelerationJob(null, done); - }, - function (job, done) { - adhocjob = job; - assert.ok(job); - pivotSpecification = obj.createPivotSpecification(); - - pivotSpecification.addBooleanRowSplit("has_boris", "Has Boris", "meep", "hilda"); - pivotSpecification.addCellValue("hostip", "Distinct IPs", "count"); - - // Test setting a job - pivotSpecification.setAccelerationJob(job); - assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); - assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); - - // Test setting a job's SID - pivotSpecification.setAccelerationJob(job.sid); - assert.strictEqual("string", typeof pivotSpecification.accelerationNamespace); - assert.strictEqual("sid=" + job.sid, pivotSpecification.accelerationNamespace); - - pivotSpecification.pivot(done); - }, - function (pivot, done) { - assert.ok(pivot.tstatsSearch); - assert.ok(pivot.tstatsSearch.length > 0); - assert.strictEqual(0, pivot.tstatsSearch.indexOf("| tstats")); - // This test won't work with utils.startsWith due to the regex escaping - assert.strictEqual("| tstats", pivot.tstatsSearch.match("^\\| tstats")[0]); - assert.strictEqual(1, pivot.tstatsSearch.match("^\\| tstats").length); - - pivot.run(done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties().isDone; - }, - 10, - done - ); - }, - function (job, done) { - assert.ok("FAILED" !== job.properties().dispatchState); - - assert.strictEqual(0, job.properties().request.search.indexOf("| tstats")); - // This test won't work with utils.startsWith due to the regex escaping - assert.strictEqual("| tstats", job.properties().request.search.match("^\\| tstats")[0]); - assert.strictEqual(1, job.properties().request.search.match("^\\| tstats").length); - - adhocjob.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Pivot - test pivot column range split", function (done) { - // This test is here because we had a problem with fields that were supposed to be - // numbers being expected as strings in Splunk 6.0. This was fixed in Splunk 6.1, and accepts - // either strings or numbers. - - if (this.skip) { - done(); - return; - } - var that = this; - var search; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - var dm = dataModels.item("internal_audit_logs"); - var obj = dm.objectByName("searches"); - var pivotSpecification = obj.createPivotSpecification(); - - pivotSpecification.addRowSplit("user", "Executing user"); - pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); - pivotSpecification.addCellValue("search", "Search Query", "values"); - pivotSpecification.pivot(done); - }, - function (pivot, done) { - // If tstats is undefined, use pivotSearch - search = pivot.tstatsSearch || pivot.pivotSearch; - pivot.run(done); - }, - function (job, done) { - tutils.pollUntil( - job, - function (j) { - return job.properties().isDone; - }, - 10, - done - ); - }, - function (job, done) { - assert.notStrictEqual("FAILED", job.properties().dispatchState); - // Make sure the job is run with the correct search query - assert.strictEqual(search, job.properties().request.search); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Pivot - test pivot with PivotSpecification.run and Job.track", function (done) { - if (this.skip) { - done(); - return; - } - var that = this; - Async.chain([ - function (done) { - that.dataModels.fetch(done); - }, - function (dataModels, done) { - var dm = dataModels.item("internal_audit_logs"); - var obj = dm.objectByName("searches"); - var pivotSpecification = obj.createPivotSpecification(); - - pivotSpecification.addRowSplit("user", "Executing user"); - pivotSpecification.addRangeColumnSplit("exec_time", { start: 0, end: 12, step: 5, limit: 4 }); - pivotSpecification.addCellValue("search", "Search Query", "values"); - - pivotSpecification.run({}, done); - }, - function (job, pivot, done) { - job.track({}, function (job) { - assert.strictEqual(pivot.tstatsSearch || pivot.pivotSearch, job.properties().request.search); - done(null, job); - }); - }, - function (job, done) { - assert.notStrictEqual("FAILED", job.properties().dispatchState); - job.cancel(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#DataModels - delete any remaining data models created by the SDK tests", function (done) { - if (this.skip) { - done(); - return; - } - svc.dataModels().fetch(function (err, dataModels) { - if (err) { - assert.ok(!err); - } - - var dms = dataModels.list(); - Async.seriesEach( - dms, - function (datamodel, i, done) { - // Delete any test data models that we created - if (utils.startsWith(datamodel.name, "delete-me")) { - datamodel.remove(done); - } - else { - done(); - } - }, - function (err) { - assert.ok(!err); - done(); - } - ); - }); - }) - }) - ); -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc)); - }); - }); -} diff --git a/tests_spike/service_tests/properties.js b/tests_spike/service_tests/properties.js deleted file mode 100644 index db7664e58..000000000 --- a/tests_spike/service_tests/properties.js +++ /dev/null @@ -1,164 +0,0 @@ - -exports.setup = function (svc) { - var assert = require('chai').assert; - - var splunkjs = require('../../index'); - - var Async = splunkjs.Async; - var idCounter = 0; - - var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); - }; - return ( - describe("Properties Test", function () { - - beforeEach(function (done) { - this.service = svc; - done(); - }) - - it("Callback#list", function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { - that.service.configurations(namespace).fetch(done); - }, - function (props, done) { - var files = props.list(); - assert.ok(files.length > 0); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }) - - it("Callback#item", function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("web"); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(file.name, "web"); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }) - - it("Callback#contains stanza", function (done) { - var that = this; - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { that.service.configurations(namespace).fetch(done); }, - function (props, done) { - var file = props.item("web"); - assert.ok(file); - file.fetch(done); - }, - function (file, done) { - assert.strictEqual(file.name, "web"); - var stanza = file.item("settings"); - assert.ok(stanza); - stanza.fetch(done); - }, - function (stanza, done) { - assert.ok(stanza.properties().hasOwnProperty("httpport")); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }) - - it("Callback#create file + create stanza + update stanza", function (done) { - var that = this; - var fileName = "jssdk_file_" + getNextId(); - var value = "barfoo_" + getNextId(); - var namespace = { owner: "admin", app: "search" }; - - Async.chain([ - function (done) { - var properties = that.service.configurations(namespace); - properties.fetch(done); - }, - function (properties, done) { - properties.create(fileName, done); - }, - function (file, done) { - file.create("stanza", done); - }, - function (stanza, done) { - stanza.update({ "jssdk_foobar": value }, done); - }, - function (stanza, done) { - assert.strictEqual(stanza.properties()["jssdk_foobar"], value); - done(); - }, - function (done) { - var file = new splunkjs.Service.ConfigurationFile(svc, fileName); - file.fetch(done); - }, - function (file, done) { - var stanza = file.item("stanza"); - assert.ok(stanza); - stanza.remove(done); - } - ], - function (err) { - assert.ok(!err); - done(); - }); - }) - }) - ); -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc)); - }); - }); -} - diff --git a/tests_spike/service_tests/savedsearch.js b/tests_spike/service_tests/savedsearch.js deleted file mode 100644 index b57a12bb7..000000000 --- a/tests_spike/service_tests/savedsearch.js +++ /dev/null @@ -1,457 +0,0 @@ - -exports.setup = function (svc, loggedOutSvc) { - var assert = require('chai').assert; - var splunkjs = require('../../index'); - var tutils = require('../utils'); - var Async = splunkjs.Async; - var utils = splunkjs.Utils; - var idCounter = 0; - var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); - }; - return ( - describe("Saved Search", function () { - beforeEach(function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }) - - it("Callback#list", function (done) { - var searches = this.service.savedSearches(); - searches.fetch(function (err, searches) { - var savedSearches = searches.list(); - assert.ok(savedSearches.length > 0); - - for (var i = 0; i < savedSearches.length; i++) { - assert.ok(savedSearches[i]); - } - - done(); - }); - }) - - it("Callback#contains", function (done) { - var searches = this.service.savedSearches(); - searches.fetch(function (err, searches) { - var search = searches.item("Errors in the last hour"); - assert.ok(search); - - done(); - }); - }) - - it("Callback#suppress", function (done) { - var searches = this.service.savedSearches(); - searches.fetch(function (err, searches) { - var search = searches.item("Errors in the last hour"); - assert.ok(search); - - search.suppressInfo(function (err, info, search) { - assert.ok(!err); - done(); - }); - }); - }) - - it("Callback#list limit count", function (done) { - var searches = this.service.savedSearches(); - searches.fetch({ count: 2 }, function (err, searches) { - var savedSearches = searches.list(); - assert.strictEqual(savedSearches.length, 2); - - for (var i = 0; i < savedSearches.length; i++) { - assert.ok(savedSearches[i]); - } - - done(); - }); - }) - - it("Callback#list filter", function (done) { - var searches = this.service.savedSearches(); - searches.fetch({ search: "Error" }, function (err, searches) { - var savedSearches = searches.list(); - assert.ok(savedSearches.length > 0); - - for (var i = 0; i < savedSearches.length; i++) { - assert.ok(savedSearches[i]); - } - - done(); - }); - }) - - it("Callback#list offset", function (done) { - var searches = this.service.savedSearches(); - searches.fetch({ offset: 2, count: 1 }, function (err, searches) { - var savedSearches = searches.list(); - assert.strictEqual(searches.paging().offset, 2); - assert.strictEqual(searches.paging().perPage, 1); - assert.strictEqual(savedSearches.length, 1); - - for (var i = 0; i < savedSearches.length; i++) { - assert.ok(savedSearches[i]); - } - - done(); - }); - }) - - it("Callback#create + modify + delete saved search", function (done) { - var name = "jssdk_savedsearch"; - var originalSearch = "search * | head 1"; - var updatedSearch = "search * | head 10"; - var updatedDescription = "description"; - - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - - Async.chain([ - function (done) { - searches.create({ search: originalSearch, name: name }, done); - }, - function (search, done) { - assert.ok(search); - - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, originalSearch); - assert.ok(!search.properties().description); - - search.update({ search: updatedSearch }, done); - }, - function (search, done) { - assert.ok(search); - assert.ok(search); - - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, updatedSearch); - assert.ok(!search.properties().description); - - search.update({ description: updatedDescription }, done); - }, - function (search, done) { - assert.ok(search); - assert.ok(search); - - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, updatedSearch); - assert.strictEqual(search.properties().description, updatedDescription); - - search.fetch(done); - }, - function (search, done) { - // Verify that we have the required fields - assert.ok(search.fields().optional.length > 1); - assert.ok(utils.indexOf(search.fields().optional, "disabled") > -1); - - search.remove(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#dispatch error", function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - var search = new splunkjs.Service.SavedSearch( - this.loggedOutService, - name, - { owner: "nobody", app: "search" } - ); - search.dispatch(function (err) { - assert.ok(err); - done(); - }); - }) - - it("Callback#dispatch omitting optional arguments", function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - - Async.chain( - [function (done) { - searches.create({ search: originalSearch, name: name }, done); - }, - function (search, done) { - assert.ok(search); - - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, originalSearch); - assert.ok(!search.properties().description); - - search.dispatch(done); - }, - function (job, search, done) { - assert.ok(job); - assert.ok(search); - }] - ); - done(); - }) - - it("Callback#history error", function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - var search = new splunkjs.Service.SavedSearch( - this.loggedOutService, - name, - { owner: "nobody", app: "search", sharing: "system" } - ); - search.history(function (err) { - assert.ok(err); - done(); - }); - }) - - it("Callback#Update error", function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - var search = new splunkjs.Service.SavedSearch( - this.loggedOutService, - name, - { owner: "nobody", app: "search", sharing: "system" } - ); - search.update( - {}, - function (err) { - assert.ok(err); - done(); - }); - }) - - it("Callback#oneshot requires search string", function (done) { - assert.throws(function () { this.service.oneshotSearch({ name: "jssdk_oneshot_" + getNextId() }, function (err) { }); }); - done(); - }) - - it("Callback#Create + dispatch + history", function (done) { - var name = "jssdk_savedsearch_" + getNextId(); - var originalSearch = "search index=_internal | head 1"; - - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - - Async.chain( - function (done) { - searches.create({ search: originalSearch, name: name }, done); - }, - function (search, done) { - assert.ok(search); - - assert.strictEqual(search.name, name); - assert.strictEqual(search.properties().search, originalSearch); - assert.ok(!search.properties().description); - - search.dispatch({ force_dispatch: false, "dispatch.buckets": 295 }, done); - }, - function (job, search, done) { - assert.ok(job); - assert.ok(search); - - tutils.pollUntil( - job, - function (j) { - return job.properties()["isDone"]; - }, - 10, - Async.augment(done, search) - ); - }, - function (job, search, done) { - assert.strictEqual(job.properties().statusBuckets, 295); - search.history(Async.augment(done, job)); - }, - function (jobs, search, originalJob, done) { - assert.ok(jobs); - assert.ok(jobs.length > 0); - assert.ok(search); - assert.ok(originalJob); - - var cancel = function (job) { - return function (cb) { - job.cancel(cb); - }; - }; - - var found = false; - var cancellations = []; - for (var i = 0; i < jobs.length; i++) { - cancellations.push(cancel(jobs[i])); - found = found || (jobs[i].sid === originalJob.sid); - } - - assert.ok(found); - - search.remove(function (err) { - if (err) { - done(err); - } - else { - Async.parallel(cancellations, done); - } - }); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#job events fails", function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.events({}, function (err) { - assert.ok(err); - done(); - }); - }) - - it("Callback#job preview fails", function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.preview({}, function (err) { - assert.ok(err); - done(); - }); - }) - - it("Callback#job results fails", function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.results({}, function (err) { - assert.ok(err); - done(); - }); - }) - - it("Callback#job searchlog fails", function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.searchlog(function (err) { - assert.ok(err); - done(); - }); - }) - - it("Callback#job summary fails", function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.summary({}, function (err) { - assert.ok(err); - done(); - }); - }) - - it("Callback#job timeline fails", function (done) { - var job = new splunkjs.Service.Job(this.loggedOutService, "abc", {}); - job.timeline({}, function (err) { - assert.ok(err); - done(); - }); - }) - - it("Callback#delete test saved searches", function (done) { - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); - searches.fetch(function (err, searches) { - var searchList = searches.list(); - Async.parallelEach( - searchList, - function (search, idx, callback) { - if (utils.startsWith(search.name, "jssdk_")) { - search.remove(callback); - } - else { - callback(); - } - }, function (err) { - assert.ok(!err); - done(); - } - ); - }); - }) - - it("Callback#setupInfo fails", function (done) { - var searches = new splunkjs.Service.Application(this.loggedOutService, "search"); - searches.setupInfo(function (err, content, that) { - assert.ok(err); - done(); - }); - }) - - it("Callback#setupInfo succeeds", function (done) { - var app = new splunkjs.Service.Application(this.service, "sdk-app-collection"); - app.setupInfo(function (err, content, app) { - // This error message was removed in modern versions of Splunk - if (err) { - assert.ok(err.data.messages[0].text.match("Setup configuration file does not")); - splunkjs.Logger.log("ERR ---", err.data.messages[0].text); - } - else { - assert.ok(app); - } - done(); - }); - }) - - it("Callback#updateInfo", function (done) { - var app = new splunkjs.Service.Application(this.service, "search"); - app.updateInfo(function (err, info, app) { - assert.ok(!err); - assert.ok(app); - assert.strictEqual(app.name, 'search'); - done(); - }); - }) - - it("Callback#updateInfo failure", function (done) { - var app = new splunkjs.Service.Application(this.loggedOutService, "sdk-app-collection"); - app.updateInfo(function (err, info, app) { - assert.ok(err); - done(); - }); - }) - }) - ); -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - var loggedOutSvc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password + 'wrong', - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc, loggedOutSvc)); - }); - }); -} diff --git a/tests_spike/service_tests/serverinfo.js b/tests_spike/service_tests/serverinfo.js deleted file mode 100644 index 20d833ead..000000000 --- a/tests_spike/service_tests/serverinfo.js +++ /dev/null @@ -1,58 +0,0 @@ - -exports.setup = function (svc) { - var assert = require('chai').assert; - return ( - describe("Server Info Test", function () { - beforeEach(function (done) { - this.service = svc; - done(); - }) - - it("Callback#Basic", function (done) { - var service = this.service; - - service.serverInfo(function (err, info) { - assert.ok(!err); - assert.ok(info); - assert.strictEqual(info.name, "server-info"); - assert.ok(info.properties().hasOwnProperty("version")); - assert.ok(info.properties().hasOwnProperty("serverName")); - assert.ok(info.properties().hasOwnProperty("os_version")); - - done(); - }); - }) - }) - ); -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc)); - }); - }); -} diff --git a/tests_spike/service_tests/storagepasswords.js b/tests_spike/service_tests/storagepasswords.js deleted file mode 100644 index 7802994e3..000000000 --- a/tests_spike/service_tests/storagepasswords.js +++ /dev/null @@ -1,644 +0,0 @@ - -exports.setup = function (svc) { - var assert = require('chai').assert; - var splunkjs = require('../../index'); - var Async = splunkjs.Async; - var idCounter = 0; - var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); - }; - return ( - describe("Storage Password Tests", function () { - beforeEach(function (done) { - this.service = svc; - done(); - }); - - it("Callback#Create", function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Create with backslashes", function (done) { - var startcount = -1; - var name = "\\delete-me-" + getNextId(); - var realm = "\\delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual("\\" + realm + ":\\" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Create with slashes", function (done) { - var startcount = -1; - var name = "/delete-me-" + getNextId(); - var realm = "/delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Create without realm", function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual("", storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Create should fail without user, or realm", function (done) { - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - storagePasswords.create({ name: null, password: "changed!" }, done); - } - ], - function (err) { - assert.ok(err); - done(); - } - ); - }) - - it("Callback#Create should fail without password", function (done) { - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - storagePasswords.create({ name: "something", password: null }, done); - } - ], - function (err) { - assert.ok(err); - done(); - } - ); - }) - - it("Callback#Create should fail without user, realm, or password", function (done) { - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - storagePasswords.create({ name: null, password: null }, done); - } - ], - function (err) { - assert.ok(err); - done(); - } - ); - }) - - it("Callback#Create with colons", function (done) { - var startcount = -1; - var name = ":delete-me-" + getNextId(); - var realm = ":delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual("\\" + realm + ":\\" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Create crazy", function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ - name: name + ":end!@#$%^&*()_+{}:|<>?", - realm: ":start::!@#$%^&*()_+{}:|<>?" + realm, - password: "changed!" - }, - done); - }, - function (storagePassword, done) { - assert.strictEqual(name + ":end!@#$%^&*()_+{}:|<>?", storagePassword.properties().username); - assert.strictEqual("\\:start\\:\\:!@#$%^&*()_+{}\\:|<>?" + realm + ":" + name + "\\:end!@#$%^&*()_+{}\\:|<>?:", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(":start::!@#$%^&*()_+{}:|<>?" + realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Create with unicode chars", function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ - name: name + ":end!@#$%^&*()_+{}:|<>?쎼 and 쎶 and <&> für", - realm: ":start::!@#$%^&*()_+{}:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm, - password: decodeURIComponent(encodeURIComponent("쎼 and 쎶 and <&> für")) - }, - done); - }, - function (storagePassword, done) { - assert.strictEqual(name + ":end!@#$%^&*()_+{}:|<>?쎼 and 쎶 and <&> für", storagePassword.properties().username); - assert.strictEqual("\\:start\\:\\:!@#$%^&*()_+{}\\:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm + ":" + name + "\\:end!@#$%^&*()_+{}\\:|<>?쎼 and 쎶 and <&> für:", storagePassword.name); - assert.strictEqual(decodeURIComponent(encodeURIComponent("쎼 and 쎶 and <&> für")), storagePassword.properties().clear_password); - assert.strictEqual(":start::!@#$%^&*()_+{}:|<>?" + encodeURIComponent("쎼 and 쎶 and <&> für") + realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Read", function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - try { - assert.ok(!!storagePasswords.item(realm + ":" + name + ":")); - } - catch (e) { - assert.ok(false); - } - - var list = storagePasswords.list(); - var found = false; - - assert.strictEqual(startcount + 1, list.length); - for (var i = 0; i < list.length; i++) { - if (realm + ":" + name + ":" === list[i].name) { - found = true; - } - } - assert.ok(found); - - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Read with slashes", function (done) { - var startcount = -1; - var name = "/delete-me-" + getNextId(); - var realm = "/delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - try { - assert.ok(!!storagePasswords.item(realm + ":" + name + ":")); - } - catch (e) { - assert.ok(false); - } - - var list = storagePasswords.list(); - var found = false; - - assert.strictEqual(startcount + 1, list.length); - for (var i = 0; i < list.length; i++) { - if (realm + ":" + name + ":" === list[i].name) { - found = true; - } - } - assert.ok(found); - - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - // Disabling this test because clear_password field has been removed in Splunk 8.2 - // - // - // it("Callback#Update": function(done) { - // var startcount = -1; - // var name = "delete-me-" + getNextId(); - // var realm = "delete-me-" + getNextId(); - // var that = this; - // Async.chain([ - // function(done) { - // that.service.storagePasswords().fetch(done); - // }, - // function(storagePasswords, done) { - // startcount = storagePasswords.list().length; - // storagePasswords.create({name: name, realm: realm, password: "changed!"}, done); - // }, - // function(storagePassword, done) { - // assert.strictEqual(name, storagePassword.properties().username); - // assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - // assert.strictEqual("changed!", storagePassword.properties().clear_password); - // assert.strictEqual(realm, storagePassword.properties().realm); - // that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - // }, - // function(storagePasswords, storagePassword, done) { - // assert.strictEqual(startcount + 1, storagePasswords.list().length); - // storagePassword.update({password: "changed"}, done); - // }, - // function(storagePassword, done) { - // assert.strictEqual(name, storagePassword.properties().username); - // assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - // assert.strictEqual("changed", storagePassword.properties().clear_password); - // assert.strictEqual(realm, storagePassword.properties().realm); - // that.service.storagePasswords().fetch(done); - // }, - // function(storagePasswords, done) { - // var list = storagePasswords.list(); - // var found = false; - // var index = -1; - - // assert.strictEqual(startcount + 1, list.length); - // for (var i = 0; i < list.length; i ++) { - // if (realm + ":" + name + ":" === list[i].name) { - // found = true; - // index = i; - // assert.strictEqual(name, list[i].properties().username); - // assert.strictEqual(realm + ":" + name + ":", list[i].name); - // assert.strictEqual("changed", list[i].properties().clear_password); - // assert.strictEqual(realm, list[i].properties().realm); - // } - // } - // assert.ok(found); - - // if (!found) { - // done(new Error("Didn't find the created password")); - // } - // else { - // list[index].remove(done); - // } - // }, - // function(done) { - // that.service.storagePasswords().fetch(done); - // }, - // function(storagePasswords, done) { - // assert.strictEqual(startcount, storagePasswords.list().length); - // done(); - // } - // ], - // function(err) { - // assert.ok(!err); - // done(); - // } - // ); - // }, - - it("Callback#Delete", function (done) { - var startcount = -1; - var name = "delete-me-" + getNextId(); - var realm = "delete-me-" + getNextId(); - var that = this; - Async.chain([ - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - startcount = storagePasswords.list().length; - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - assert.strictEqual(realm + ":" + name + ":", storagePassword.name); - assert.strictEqual("changed!", storagePassword.properties().clear_password); - assert.strictEqual(realm, storagePassword.properties().realm); - that.service.storagePasswords().fetch(Async.augment(done, storagePassword)); - }, - function (storagePasswords, storagePassword, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - storagePassword.remove(done); - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - storagePasswords.create({ name: name, realm: realm, password: "changed!" }, done); - }, - function (storagePassword, done) { - assert.strictEqual(name, storagePassword.properties().username); - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount + 1, storagePasswords.list().length); - var list = storagePasswords.list(); - var found = false; - var index = -1; - - assert.strictEqual(startcount + 1, list.length); - for (var i = 0; i < list.length; i++) { - if (realm + ":" + name + ":" === list[i].name) { - found = true; - index = i; - assert.strictEqual(name, list[i].properties().username); - assert.strictEqual(realm + ":" + name + ":", list[i].name); - assert.strictEqual("changed!", list[i].properties().clear_password); - assert.strictEqual(realm, list[i].properties().realm); - } - } - assert.ok(found); - - if (!found) { - done(new Error("Didn't find the created password")); - } - else { - list[index].remove(done); - } - }, - function (done) { - that.service.storagePasswords().fetch(done); - }, - function (storagePasswords, done) { - assert.strictEqual(startcount, storagePasswords.list().length); - done(); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - }) - ); -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc)); - }); - }); -} diff --git a/tests_spike/service_tests/typeahead.js b/tests_spike/service_tests/typeahead.js deleted file mode 100644 index 88687679e..000000000 --- a/tests_spike/service_tests/typeahead.js +++ /dev/null @@ -1,82 +0,0 @@ - -exports.setup = function (svc, loggedOutSvc) { - var assert = require('chai').assert; - return ( - describe("Typeahad Tests", function () { - beforeEach(function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }) - - it("Callback#Typeahead failure", function (done) { - var service = this.loggedOutService; - service.typeahead("index=", 1, function (err, options) { - assert.ok(err); - done(); - }); - }) - - it("Callback#Basic typeahead", function (done) { - var service = this.service; - - service.typeahead("index=", 1, function (err, options) { - assert.ok(!err); - assert.ok(options); - assert.strictEqual(options.length, 1); - assert.ok(options[0]); - done(); - }); - }) - - it("Typeahead with omitted optional arguments", function (done) { - var service = this.service; - service.typeahead("index=", function (err, options) { - assert.ok(!err); - assert.ok(options); - done(); - }); - }) - }) - ); -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - var loggedOutSvc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password + 'wrong', - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc, loggedOutSvc)); - }); - }); -} diff --git a/tests_spike/service_tests/user.js b/tests_spike/service_tests/user.js deleted file mode 100644 index 173f2a6a6..000000000 --- a/tests_spike/service_tests/user.js +++ /dev/null @@ -1,291 +0,0 @@ - -exports.setup = function (svc, loggedOutSvc) { - var assert = require('chai').assert; - var splunkjs = require('../../index'); - var Async = splunkjs.Async; - var utils = splunkjs.Utils; - var idCounter = 0; - - var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); - }; - return ( - describe("User Tests", function () { - - beforeEach(function (done) { - this.service = svc; - this.loggedOutService = loggedOutSvc; - done(); - }) - - afterEach(function (done) { - this.service.logout(done); - }) - - it("Callback#Current user", function (done) { - var service = this.service; - - service.currentUser(function (err, user) { - assert.ok(!err); - assert.ok(user); - assert.strictEqual(user.name, service.username); - done(); - }); - }) - - it("Callback#Current user fails", function (done) { - var service = this.loggedOutService; - - service.currentUser(function (err, user) { - assert.ok(err); - done(); - }); - }) - - it("Callback#List users", function (done) { - var service = this.service; - - service.users().fetch(function (err, users) { - var userList = users.list(); - assert.ok(!err); - assert.ok(users); - - assert.ok(userList); - assert.ok(userList.length > 0); - done(); - }); - }) - - it("Callback#create user failure", function (done) { - this.loggedOutService.users().create( - { name: "jssdk_testuser", password: "abcdefg!", roles: "user" }, - function (err, response) { - assert.ok(err); - done(); - } - ); - }) - - it("Callback#Create + update + delete user", function (done) { - var service = this.service; - var name = "jssdk_testuser"; - - Async.chain([ - function (done) { - service.users().create({ name: "jssdk_testuser", password: "abcdefg!", roles: "user" }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.name, name); - assert.strictEqual(user.properties().roles.length, 1); - assert.strictEqual(user.properties().roles[0], "user"); - - user.update({ realname: "JS SDK", roles: ["admin", "user"] }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.properties().realname, "JS SDK"); - assert.strictEqual(user.properties().roles.length, 2); - assert.strictEqual(user.properties().roles[0], "admin"); - assert.strictEqual(user.properties().roles[1], "user"); - - user.remove(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - - it("Callback#Roles", function (done) { - var service = this.service; - var name = "jssdk_testuser_" + getNextId(); - - Async.chain([ - function (done) { - service.users().create({ name: name, password: "abcdefg!", roles: "user" }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.name, name); - assert.strictEqual(user.properties().roles.length, 1); - assert.strictEqual(user.properties().roles[0], "user"); - - user.update({ roles: ["admin", "user"] }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.properties().roles.length, 2); - assert.strictEqual(user.properties().roles[0], "admin"); - assert.strictEqual(user.properties().roles[1], "user"); - - user.update({ roles: "user" }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.properties().roles.length, 1); - assert.strictEqual(user.properties().roles[0], "user"); - - user.update({ roles: "__unknown__" }, done); - } - ], - function (err) { - assert.ok(err); - assert.strictEqual(err.status, 400); - done(); - } - ); - }) - - it("Callback#Passwords", function (done) { - var service = this.service; - var newService = null; - var name = "jssdk_testuser_" + getNextId(); - - var firstPassword = "abcdefg!"; - var secondPassword = "hijklmn!"; - - var useOldPassword = false; - - Async.chain([ - function (done) { - service.serverInfo(done); - }, - function (info, done) { - var versionParts = info.properties().version.split("."); - - var isDevBuild = versionParts.length === 1; - var newerThan72 = (parseInt(versionParts[0], 10) > 7 || - (parseInt(versionParts[0], 10) === 7 && parseInt(versionParts[1], 10) >= 2)); - - if (isDevBuild || newerThan72) { - useOldPassword = true; - } - done(); - }, - function (done) { - service.users().create({ name: name, password: firstPassword, roles: "user" }, done); - }, - function (user, done) { - assert.ok(user); - assert.strictEqual(user.name, name); - assert.strictEqual(user.properties().roles.length, 1); - assert.strictEqual(user.properties().roles[0], "user"); - - newService = new splunkjs.Service(service.http, { - username: name, - password: firstPassword, - host: service.host, - port: service.port, - scheme: service.scheme, - version: service.version - }); - - newService.login(Async.augment(done, user)); - }, - function (success, user, done) { - assert.ok(success); - assert.ok(user); - - var body = { - password: secondPassword - }; - if (useOldPassword) { - body['oldpassword'] = firstPassword; - } - - user.update(body, done); - }, - function (user, done) { - newService.login(function (err, success) { - assert.ok(err); - assert.ok(!success); - - var body = { - password: firstPassword - }; - if (useOldPassword) { - body['oldpassword'] = secondPassword; - } - - user.update(body, done); - }); - }, - function (user, done) { - assert.ok(user); - newService.login(done); - } - ], - function (err) { - assert.ok(!err, JSON.stringify(err)); - done(); - } - ); - }) - - it("Callback#delete test users", function (done) { - var users = this.service.users(); - users.fetch(function (err, users) { - var userList = users.list(); - - Async.parallelEach( - userList, - function (user, idx, callback) { - if (utils.startsWith(user.name, "jssdk_")) { - user.remove(callback); - } - else { - callback(); - } - }, function (err) { - assert.ok(!err); - done(); - } - ); - }); - }) - }) - ); -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - var loggedOutSvc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password + 'wrong', - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc, loggedOutSvc)); - }); - }); -} diff --git a/tests_spike/service_tests/view.js b/tests_spike/service_tests/view.js deleted file mode 100644 index e73489b9c..000000000 --- a/tests_spike/service_tests/view.js +++ /dev/null @@ -1,97 +0,0 @@ - -exports.setup = function (svc) { - var assert = require('chai').assert; - var splunkjs = require('../../index'); - var Async = splunkjs.Async; - return ( - describe("Views ", function () { - - beforeEach(function (done) { - this.service = svc; - done(); - }) - - it("Callback#List views", function (done) { - var service = this.service; - - service.views({ owner: "admin", app: "search" }).fetch(function (err, views) { - assert.ok(!err); - assert.ok(views); - - var viewsList = views.list(); - assert.ok(viewsList); - assert.ok(viewsList.length > 0); - - for (var i = 0; i < viewsList.length; i++) { - assert.ok(viewsList[i]); - } - - done(); - }); - }) - - it("Callback#Create + update + delete view", function (done) { - var service = this.service; - var name = "jssdk_testview"; - var originalData = ""; - var newData = ""; - - Async.chain([ - function (done) { - service.views({ owner: "admin", app: "sdk-app-collection" }).create({ name: name, "eai:data": originalData }, done); - }, - function (view, done) { - assert.ok(view); - - assert.strictEqual(view.name, name); - assert.strictEqual(view.properties()["eai:data"], originalData); - - view.update({ "eai:data": newData }, done); - }, - function (view, done) { - assert.ok(view); - assert.strictEqual(view.properties()["eai:data"], newData); - - view.remove(done); - } - ], - function (err) { - assert.ok(!err); - done(); - } - ); - }) - }) - ); -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../../index'); - var options = require('../../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc)); - }); - }); -} diff --git a/tests_spike/test_async.js b/tests_spike/test_async.js deleted file mode 100644 index c7b542f52..000000000 --- a/tests_spike/test_async.js +++ /dev/null @@ -1,537 +0,0 @@ - -// Copyright 2011 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. - -exports.setup = function () { - var assert = require('chai').assert; - var splunkjs = require('../index'); - var Async = splunkjs.Async; - var isBrowser = typeof "window" !== "undefined"; - splunkjs.Logger.setLevel("ALL"); - - return ( - describe('Async tests', function () { - - it("While success", function (done) { - var i = 0; - Async.whilst( - function () { return i++ < 3; }, - function (done) { - Async.sleep(0, function () { done(); }); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("While success deep", function (done) { - var i = 0; - Async.whilst( - function () { return i++ < (isBrowser ? 100 : 10000); }, - function (done) { - Async.sleep(0, function () { done(); }); - }, - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("While error", function (done) { - var i = 0; - Async.whilst( - function () { return i++ < (isBrowser ? 100 : 10000); }, - function (done) { - Async.sleep(0, function () { done(i === (isBrowser ? 50 : 10000) ? 1 : null); }); - }, - function (err) { - assert.ok(err); - assert.strictEqual(err, 1); - done(); - } - ); - }); - - it("Whilst sans condition is never", function (done) { - var i = false; - Async.whilst( - undefined, - function (done) { i = true; done(); }, - function (err) { - assert.strictEqual(i, false); - done(); - } - ); - }); - - it("Whilst with empty body does nothing", function (done) { - var i = true; - Async.whilst( - function () { - if (i) { - i = false; - return true; - } - else { - return i; - } - }, - undefined, - function (err) { - done(); - } - ); - }); - - it("Parallel success", function (done) { - Async.parallel([ - function (done) { - done(null, 1); - }, - function (done) { - done(null, 2, 3); - }], - function (err, one, two) { - assert.ok(!err); - assert.strictEqual(one, 1); - assert.strictEqual(two[0], 2); - assert.strictEqual(two[1], 3); - done(); - } - ); - }); - - it("Parallel success - outside of arrays", function (done) { - Async.parallel( - function (done) { done(null, 1); }, - function (done) { done(null, 2, 3); }, - function (err, one, two) { - assert.ok(!err); - assert.strictEqual(one, 1); - assert.strictEqual(two[0], 2); - assert.strictEqual(two[1], 3); - done(); - }); - }); - - it("Parallel success - no reordering", function (done) { - Async.parallel([ - function (done) { - Async.sleep(1, function () { done(null, 1); }); - }, - function (done) { - done(null, 2, 3); - }], - function (err, one, two) { - assert.ok(!err); - assert.strictEqual(one, 1); - assert.strictEqual(two[0], 2); - assert.strictEqual(two[1], 3); - done(); - } - ); - }); - - it("Parallel error", function (done) { - Async.parallel([ - function (done) { - done(null, 1); - }, - function (done) { - done(null, 2, 3); - }, - function (done) { - Async.sleep(0, function () { - done("ERROR"); - }); - }], - function (err, one, two) { - assert.ok(err === "ERROR"); - assert.ok(!one); - assert.ok(!two); - done(); - } - ); - }); - - it("Parallel no tasks", function (done) { - Async.parallel( - [], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Series success", function (done) { - Async.series([ - function (done) { - done(null, 1); - }, - function (done) { - done(null, 2, 3); - }], - function (err, one, two) { - assert.ok(!err); - assert.strictEqual(one, 1); - assert.strictEqual(two[0], 2); - assert.strictEqual(two[1], 3); - done(); - } - ); - }); - - it("Series success - outside of array", function (done) { - Async.series( - function (done) { - done(null, 1); - }, - function (done) { - done(null, 2, 3); - }, - function (err, one, two) { - assert.ok(!err); - assert.strictEqual(one, 1); - assert.strictEqual(two[0], 2); - assert.strictEqual(two[1], 3); - done(); - } - ); - }); - - it("Series reordering success", function (done) { - var keeper = 0; - Async.series([ - function (done) { - Async.sleep(10, function () { - assert.strictEqual(keeper++, 0); - done(null, 1); - }); - }, - function (done) { - assert.strictEqual(keeper++, 1); - done(null, 2, 3); - }], - function (err, one, two) { - assert.ok(!err); - assert.strictEqual(keeper, 2); - assert.strictEqual(one, 1); - assert.strictEqual(two[0], 2); - assert.strictEqual(two[1], 3); - done(); - } - ); - }); - - it("Series error", function (done) { - Async.series([ - function (done) { - done(null, 1); - }, - function (done) { - done("ERROR", 2, 3); - }], - function (err, one, two) { - assert.strictEqual(err, "ERROR"); - assert.ok(!one); - assert.ok(!two); - done(); - } - ); - }); - - it("Series no tasks", function (done) { - Async.series( - [], - function (err) { - assert.ok(!err); - done(); - } - ); - }); - - it("Parallel map success", function (done) { - Async.parallelMap( - [1, 2, 3], - function (val, idx, done) { - done(null, val + 1); - }, - function (err, vals) { - assert.ok(!err); - assert.strictEqual(vals[0], 2); - assert.strictEqual(vals[1], 3); - assert.strictEqual(vals[2], 4); - done(); - } - ); - }); - - it("Parallel map reorder success", function (done) { - Async.parallelMap( - [1, 2, 3], - function (val, idx, done) { - if (val === 2) { - Async.sleep(100, function () { done(null, val + 1); }); - } - else { - done(null, val + 1); - } - }, - function (err, vals) { - assert.strictEqual(vals[0], 2); - assert.strictEqual(vals[1], 3); - assert.strictEqual(vals[2], 4); - done(); - } - ); - }); - - it("Parallel map error", function (done) { - Async.parallelMap( - [1, 2, 3], - function (val, idx, done) { - if (val === 2) { - done(5); - } - else { - done(null, val + 1); - } - }, - function (err, vals) { - assert.ok(err); - assert.ok(!vals); - assert.strictEqual(err, 5); - done(); - } - ); - }); - - it("Series map success", function (done) { - var keeper = 1; - Async.seriesMap( - [1, 2, 3], - function (val, idx, done) { - assert.strictEqual(keeper++, val); - done(null, val + 1); - }, - function (err, vals) { - assert.ok(!err); - assert.strictEqual(vals[0], 2); - assert.strictEqual(vals[1], 3); - assert.strictEqual(vals[2], 4); - assert.strictEqual(vals[2], keeper); - done(); - } - ); - }); - - it("Series map error", function (done) { - Async.seriesMap( - [1, 2, 3], - function (val, idx, done) { - if (val === 2) { - done(5); - } - else { - done(null, val + 1); - } - }, - function (err, vals) { - assert.ok(err); - assert.ok(!vals); - assert.strictEqual(err, 5); - done(); - } - ); - }); - - it("Chain single success", function (done) { - Async.chain([ - function (callback) { - callback(null, 1); - }, - function (val, callback) { - callback(null, val + 1); - }, - function (val, callback) { - callback(null, val + 1); - }], - function (err, val) { - assert.ok(!err); - assert.strictEqual(val, 3); - done(); - } - ); - }); - - it("Chain flat single success", function (done) { - Async.chain( - function (callback) { - callback(null, 1); - }, - function (val, callback) { - callback(null, val + 1); - }, - function (val, callback) { - callback(null, val + 1); - }, - function (err, val) { - assert.ok(!err); - assert.strictEqual(val, 3); - done(); - } - ); - }); - - it("Chain flat multiple success", function (done) { - Async.chain( - function (callback) { - callback(null, 1, 2); - }, - function (val1, val2, callback) { - callback(null, val1 + 1, val2 + 1); - }, - function (val1, val2, callback) { - callback(null, val1 + 1, val2 + 1); - }, - function (err, val1, val2) { - assert.ok(!err); - assert.strictEqual(val1, 3); - assert.strictEqual(val2, 4); - done(); - } - ); - }); - - it("Chain flat arity change success", function (done) { - Async.chain( - function (callback) { - callback(null, 1, 2); - }, - function (val1, val2, callback) { - callback(null, val1 + 1); - }, - function (val1, callback) { - callback(null, val1 + 1, 5); - }, - function (err, val1, val2) { - assert.ok(!err); - assert.strictEqual(val1, 3); - assert.strictEqual(val2, 5); - done(); - } - ); - }); - - it("Chain error", function (done) { - Async.chain([ - function (callback) { - callback(null, 1, 2); - }, - function (val1, val2, callback) { - callback(5, val1 + 1); - }, - function (val1, callback) { - callback(null, val1 + 1, 5); - }], - function (err, val1, val2) { - assert.ok(err); - assert.ok(!val1); - assert.ok(!val2); - assert.strictEqual(err, 5); - done(); - } - ); - }); - - it("Chain no tasks", function (done) { - Async.chain([], - function (err, val1, val2) { - assert.ok(!err); - assert.ok(!val1); - assert.ok(!val2); - done(); - } - ); - }); - - it("Parallel each reodrder success", function (done) { - var total = 0; - Async.parallelEach( - [1, 2, 3], - function (val, idx, done) { - var go = function () { - total += val; - done(); - }; - - if (idx === 1) { - Async.sleep(100, go); - } - else { - go(); - } - }, - function (err) { - assert.ok(!err); - assert.strictEqual(total, 6); - done(); - } - ); - }); - - it("Series each success", function (done) { - var results = [1, 3, 6]; - var total = 0; - Async.seriesEach( - [1, 2, 3], - function (val, idx, done) { - total += val; - assert.strictEqual(total, results[idx]); - done(); - }, - function (err) { - assert.ok(!err); - assert.strictEqual(total, 6); - done(); - } - ); - }); - - it("Augment callback", function (done) { - var callback = function (a, b) { - assert.ok(a); - assert.ok(b); - assert.strictEqual(a, 1); - assert.strictEqual(b, 2); - - done(); - }; - - var augmented = Async.augment(callback, 2); - augmented(1); - }); - - }) - ); -}; - -// Run the individual test suite -// if (module === require.cache[__filename] && !module.parent) { -// module.exports = exports.setup(); -// } diff --git a/tests_spike/test_context.js b/tests_spike/test_context.js deleted file mode 100644 index c1c29e08c..000000000 --- a/tests_spike/test_context.js +++ /dev/null @@ -1,1106 +0,0 @@ - -// Copyright 2011 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. - -exports.setup = function (svc) { - var splunkjs = require('../index'); - var tutils = require('./utils'); - var Async = splunkjs.Async; - var utils = splunkjs.Utils; - var assert = require('chai').assert; - - splunkjs.Logger.setLevel("ALL"); - var isBrowser = typeof window !== "undefined"; - - var suite = ( - describe("General Context Test", function (done) { - before(function (done) { - this.service = svc; - done(); - }); - - it("Service exists", function (done) { - assert.ok(this.service); - done(); - }); - - it("Create test search", function (done) { - // The search created here is used by several of the following tests, specifically those using get() - var searchID = "DELETEME_JSSDK_UNITTEST"; - this.service.post("search/jobs", { search: "search index=_internal | head 1", exec_mode: "blocking", id: searchID }, function (err, res) { - assert.ok(res.data.sid); - done(); - }); - }); - - it("Callback#login", function (done) { - var newService = new splunkjs.Service(svc.http, { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - username: svc.username, - password: svc.password, - version: svc.version - }); - - newService.login(function (err, success) { - assert.ok(success); - done(); - }); - }); - - it("Callback#login fail", function (done) { - var newService = new splunkjs.Service(svc.http, { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - username: svc.username, - password: svc.password + "wrong_password", - version: svc.version - }); - if (!isBrowser) { - newService.login(function (err, success) { - assert.ok(err); - assert.ok(!success); - done(); - }); - } - else { - done(); - } - }); - - it("Callback#get", function (done) { - this.service.get("search/jobs", { count: 1 }, function (err, res) { - assert.strictEqual(res.data.paging.offset, 0); - assert.ok(res.data.entry.length <= res.data.paging.total); - assert.strictEqual(res.data.entry.length, 1); - assert.ok(res.data.entry[0].content.sid); - done(); - }); - }); - - it("Callback#get error", function (done) { - this.service.get("search/jobs/1234_nosuchjob", {}, function (res) { - assert.ok(!!res); - assert.strictEqual(res.status, 404); - done(); - }); - }); - - it("Callback#get autologin - success", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - version: svc.version - } - ); - - service.get("search/jobs", { count: 1 }, function (err, res) { - assert.strictEqual(res.data.paging.offset, 0); - assert.ok(res.data.entry.length <= res.data.paging.total); - assert.strictEqual(res.data.entry.length, 1); - assert.ok(res.data.entry[0].content.sid); - done(); - }); - }); - - it("Callback#get autologin - error", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password + "ABC", - version: svc.version - } - ); - - service.get("search/jobs", { count: 1 }, function (err, res) { - assert.ok(err); - assert.strictEqual(err.status, 401); - done(); - }); - }); - - - it("Callback#get autologin - disabled", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - autologin: false, - version: svc.version - } - ); - - service.get("search/jobs", { count: 1 }, function (err, res) { - assert.ok(err); - assert.strictEqual(err.status, 401); - done(); - }); - }); - - it("Callback#get relogin - success", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - sessionKey: "ABCDEF-not-real", - version: svc.version - } - ); - - service.get("search/jobs", { count: 1 }, function (err, res) { - assert.ok(!err); - assert.strictEqual(res.data.paging.offset, 0); - assert.ok(res.data.entry.length <= res.data.paging.total); - assert.strictEqual(res.data.entry.length, 1); - assert.ok(res.data.entry[0].content.sid); - done(); - }); - }); - - it("Callback#get relogin - error", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password + "ABC", - sessionKey: "ABCDEF-not-real", - version: svc.version - } - ); - - service.get("search/jobs", { count: 1 }, function (err, res) { - assert.ok(err); - assert.strictEqual(err.status, 401); - done(); - }); - }); - - it("Callback#post", function (done) { - var service = this.service; - this.service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { - var sid = res.data.sid; - assert.ok(sid); - - var endpoint = "search/jobs/" + sid + "/control"; - service.post(endpoint, { action: "cancel" }, function (err, res) { - done(); - } - ); - } - ); - }); - - it("Callback#post error", function (done) { - this.service.post("search/jobs", { search: "index_internal | head 1" }, function (res) { - assert.ok(!!res); - assert.strictEqual(res.status, 400); - done(); - }); - }); - - it("Callback#post autologin - success", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - version: svc.version - } - ); - - service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { - var sid = res.data.sid; - assert.ok(sid); - - var endpoint = "search/jobs/" + sid + "/control"; - service.post(endpoint, { action: "cancel" }, function (err, res) { - done(); - } - ); - } - ); - }); - - it("Callback#post autologin - error", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password + "ABC", - version: svc.version - } - ); - - service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { - assert.ok(err); - assert.strictEqual(err.status, 401); - done(); - }); - }); - - it("Callback#post autologin - disabled", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - autologin: false, - version: svc.version - } - ); - - service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { - assert.ok(err); - assert.strictEqual(err.status, 401); - done(); - }); - }); - - it("Callback#post relogin - success", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - sessionKey: "ABCDEF-not-real", - version: svc.version - } - ); - - service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { - var sid = res.data.sid; - assert.ok(sid); - - var endpoint = "search/jobs/" + sid + "/control"; - service.post(endpoint, { action: "cancel" }, function (err, res) { - done(); - } - ); - } - ); - }); - - it("Callback#post relogin - error", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password + "ABC", - sessionKey: "ABCDEF-not-real", - version: svc.version - } - ); - - service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { - assert.ok(err); - assert.strictEqual(err.status, 401); - done(); - }); - }); - - it("Callback#delete", function (done) { - var service = this.service; - this.service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { - var sid = res.data.sid; - assert.ok(sid); - - var endpoint = "search/jobs/" + sid; - service.del(endpoint, {}, function (err, res) { - done(); - }); - }); - }); - - it("Callback#delete error", function (done) { - this.service.del("search/jobs/1234_nosuchjob", {}, function (res) { - assert.ok(!!res); - assert.strictEqual(res.status, 404); - done(); - }); - }); - - it("Callback#delete autologin - success", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - version: svc.version - } - ); - - service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { - var sid = res.data.sid; - assert.ok(sid); - - service.sessionKey = null; - var endpoint = "search/jobs/" + sid; - service.del(endpoint, {}, function (err, res) { - done(); - }); - }); - }); - - it("Callback#delete autologin - error", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password + "ABC", - version: svc.version - } - ); - - service.del("search/jobs/NO_SUCH_SID", {}, function (err, res) { - assert.ok(err); - assert.strictEqual(err.status, 401); - done(); - }); - }); - - it("Callback#delete autologin - disabled", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - autologin: false, - version: svc.version - } - ); - - service.del("search/jobs/NO_SUCH_SID", {}, function (err, res) { - assert.ok(err); - assert.strictEqual(err.status, 401); - done(); - }); - }); - - it("Callback#delete relogin - success", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - sessionKey: "ABCDEF-not-real", - version: svc.version - } - ); - - service.post("search/jobs", { search: "search index=_internal | head 1" }, function (err, res) { - var sid = res.data.sid; - assert.ok(sid); - - service.sessionKey = "ABCDEF-not-real"; - var endpoint = "search/jobs/" + sid; - service.del(endpoint, {}, function (err, res) { - done(); - }); - }); - }); - - it("Callback#delete relogin - error", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password + "ABC", - sessionKey: "ABCDEF-not-real", - version: svc.version - } - ); - - service.del("search/jobs/NO_SUCH_SID", {}, function (err, res) { - assert.ok(err); - assert.strictEqual(err.status, 401); - done(); - }); - }); - - it("Callback#request get", function (done) { - var get = { count: 1 }; - var post = null; - var body = null; - this.service.request("search/jobs", "GET", get, post, body, { "X-TestHeader": 1 }, function (err, res) { - assert.strictEqual(res.data.paging.offset, 0); - assert.ok(res.data.entry.length <= res.data.paging.total); - assert.strictEqual(res.data.entry.length, 1); - assert.ok(res.data.entry[0].content.sid); - - if (res.response.request) { - assert.strictEqual(res.response.request.headers["X-TestHeader"], 1); - } - - done(); - }); - }); - - it("Callback#request post", function (done) { - var body = "search=" + encodeURIComponent("search index=_internal | head 1"); - var headers = { - "Content-Type": "application/x-www-form-urlencoded" - }; - var service = this.service; - this.service.request("search/jobs", "POST", null, null, body, headers, function (err, res) { - var sid = res.data.sid; - assert.ok(sid); - - var endpoint = "search/jobs/" + sid + "/control"; - service.post(endpoint, { action: "cancel" }, function (err, res) { - done(); - }); - }); - }); - - it("Callback#request error", function (done) { - this.service.request("search/jobs/1234_nosuchjob", "GET", null, null, null, { "X-TestHeader": 1 }, function (res) { - assert.ok(!!res); - - if (res.response.request) { - assert.strictEqual(res.response.request.headers["X-TestHeader"], 1); - } - - assert.strictEqual(res.status, 404); - done(); - }); - }); - - it("Callback#request autologin - success", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - version: svc.version - } - ); - - var get = { count: 1 }; - var post = null; - var body = null; - service.request("search/jobs", "GET", get, post, body, { "X-TestHeader": 1 }, function (err, res) { - assert.strictEqual(res.data.paging.offset, 0); - assert.ok(res.data.entry.length <= res.data.paging.total); - assert.strictEqual(res.data.entry.length, 1); - assert.ok(res.data.entry[0].content.sid); - - if (res.response.request) { - assert.strictEqual(res.response.request.headers["X-TestHeader"], 1); - } - - done(); - }); - }); - - it("Callback#request autologin - error", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password + "ABC", - version: svc.version - } - ); - - var get = { count: 1 }; - var post = null; - var body = null; - service.request("search/jobs", "GET", get, post, body, { "X-TestHeader": 1 }, function (err, res) { - assert.ok(err); - assert.strictEqual(err.status, 401); - done(); - }); - }); - - it("Callback#request autologin - disabled", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - autologin: false, - version: svc.version - } - ); - - var get = { count: 1 }; - var post = null; - var body = null; - service.request("search/jobs", "GET", get, post, body, { "X-TestHeader": 1 }, function (err, res) { - assert.ok(err); - assert.strictEqual(err.status, 401); - done(); - }); - }); - - it("Callback#request relogin - success", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - sessionKey: "ABCDEF-not-real", - version: svc.version - } - ); - - var get = { count: 1 }; - var post = null; - var body = null; - service.request("search/jobs", "GET", get, post, body, { "X-TestHeader": 1 }, function (err, res) { - assert.strictEqual(res.data.paging.offset, 0); - assert.ok(res.data.entry.length <= res.data.paging.total); - assert.strictEqual(res.data.entry.length, 1); - assert.ok(res.data.entry[0].content.sid); - - if (res.response.request) { - assert.strictEqual(res.response.request.headers["X-TestHeader"], 1); - } - - done(); - }); - }); - - it("Callback#request relogin - error", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password + "ABC", - sessionKey: "ABCDEF-not-real", - version: svc.version - } - ); - - var get = { count: 1 }; - var post = null; - var body = null; - service.request("search/jobs", "GET", get, post, body, { "X-TestHeader": 1 }, function (err, res) { - assert.ok(err); - assert.strictEqual(err.status, 401); - done(); - }); - }); - - it("Callback#abort", function (done) { - var req = this.service.get("search/jobs", { count: 1 }, function (err, res) { - assert.ok(!res); - assert.ok(err); - assert.strictEqual(err.error, "abort"); - assert.strictEqual(err.status, "abort"); - done(); - }); - - req.abort(); - }); - - it("Callback#timeout default test", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - version: svc.version - } - ); - - assert.strictEqual(0, service.timeout); - service.request("search/jobs", "GET", { count: 1 }, null, null, { "X-TestHeader": 1 }, function (err, res) { - assert.ok(res); - done(); - }); - }); - - it("Callback#timeout timed test", function (done) { - var service = new splunkjs.Service( - { - scheme: this.service.scheme, - host: this.service.host, - port: this.service.port, - username: this.service.username, - password: this.service.password, - version: svc.version, - timeout: 10000 - } - ); - - assert.strictEqual(service.timeout, 10000); - service.request("search/jobs", "GET", { count: 1 }, null, null, { "X-TestHeader": 1 }, function (err, res) { - assert.ok(res); - done(); - }); - }); - - // This test is not stable, commenting it out until we figure it out - // "Callback#timeout fail -- FAILS INTERMITTENTLY": function(done){ - // var service = new splunkjs.Service( - // { - // scheme: this.service.scheme, - // host: this.service.host, - // port: this.service.port, - // username: this.service.username, - // password: this.service.password, - // version: svc.version, - // timeout: 3000 - // } - // ); - - // // Having a timeout of 3 seconds, a max_time of 5 seconds with a blocking mode and searching realtime should involve a timeout error. - // service.get("search/jobs/export", {search:"search index=_internal", timeout:2, max_time:5, search_mode:"realtime", exec_mode:"blocking"}, function(err, res){ - // assert.ok(err); - // // Prevent test suite from erroring out if `err` is null, just fail the test - // if (err) { - // assert.strictEqual(err.status, 600); - // } - // done(); - // }); - // }, - - it("Cancel test search", function (done) { - // Here, the search created for several of the previous tests is terminated, it is no longer necessary - var endpoint = "search/jobs/DELETEME_JSSDK_UNITTEST/control"; - this.service.post(endpoint, { action: "cancel" }, function (err, res) { - done(); - }); - }); - - it("fullpath gets its owner/app from the right places", function (done) { - var http = tutils.DummyHttp; - var ctx = new splunkjs.Context(http, { /*nothing*/ }); - - // Absolute paths are unchanged - assert.strictEqual(ctx.fullpath("/a/b/c"), "/a/b/c"); - // Fall through to /services if there is no app - assert.strictEqual(ctx.fullpath("meep"), "/services/meep"); - // Are username and app set properly? - var ctx2 = new splunkjs.Context(http, { owner: "alpha", app: "beta" }); - assert.strictEqual(ctx2.fullpath("meep"), "/servicesNS/alpha/beta/meep"); - assert.strictEqual(ctx2.fullpath("meep", { owner: "boris" }), "/servicesNS/boris/beta/meep"); - assert.strictEqual(ctx2.fullpath("meep", { app: "factory" }), "/servicesNS/alpha/factory/meep"); - assert.strictEqual(ctx2.fullpath("meep", { owner: "boris", app: "factory" }), "/servicesNS/boris/factory/meep"); - // Sharing settings - assert.strictEqual(ctx2.fullpath("meep", { sharing: "app" }), "/servicesNS/nobody/beta/meep"); - assert.strictEqual(ctx2.fullpath("meep", { sharing: "global" }), "/servicesNS/nobody/beta/meep"); - assert.strictEqual(ctx2.fullpath("meep", { sharing: "system" }), "/servicesNS/nobody/system/meep"); - // Do special characters get encoded? - var ctx3 = new splunkjs.Context(http, { owner: "alpha@beta.com", app: "beta" }); - assert.strictEqual(ctx3.fullpath("meep"), "/servicesNS/alpha%40beta.com/beta/meep"); - done(); - }); - - it("version check", function (done) { - var http = tutils.DummyHttp; - var ctx; - - ctx = new splunkjs.Context(http, { "version": "4.0" }); - assert.ok(ctx.version === "4.0"); - - ctx = new splunkjs.Context(http, { "version": "4.0" }); - assert.ok(ctx.versionCompare("5.0") === -1); - ctx = new splunkjs.Context(http, { "version": "4" }); - assert.ok(ctx.versionCompare("5.0") === -1); - ctx = new splunkjs.Context(http, { "version": "4.0" }); - assert.ok(ctx.versionCompare("5") === -1); - ctx = new splunkjs.Context(http, { "version": "4.1" }); - assert.ok(ctx.versionCompare("4.9") === -1); - - ctx = new splunkjs.Context(http, { "version": "4.0" }); - assert.ok(ctx.versionCompare("4.0") === 0); - ctx = new splunkjs.Context(http, { "version": "4" }); - assert.ok(ctx.versionCompare("4.0") === 0); - ctx = new splunkjs.Context(http, { "version": "4.0" }); - assert.ok(ctx.versionCompare("4") === 0); - - ctx = new splunkjs.Context(http, { "version": "5.0" }); - assert.ok(ctx.versionCompare("4.0") === 1); - ctx = new splunkjs.Context(http, { "version": "5.0" }); - assert.ok(ctx.versionCompare("4") === 1); - ctx = new splunkjs.Context(http, { "version": "5" }); - assert.ok(ctx.versionCompare("4.0") === 1); - ctx = new splunkjs.Context(http, { "version": "4.9" }); - assert.ok(ctx.versionCompare("4.1") === 1); - - ctx = new splunkjs.Context(http, { /*nothing*/ }); - assert.ok(ctx.versionCompare("5.0") === 0); - - done(); - }); - }), - - describe("Cookie Tests", function (done) { - before(function (done) { - this.service = svc; - this.skip = false; - var that = this; - svc.serverInfo(function (err, info) { - var majorVersion = parseInt(info.properties().version.split(".")[0], 10); - var minorVersion = parseInt(info.properties().version.split(".")[1], 10); - // Skip cookie tests if Splunk older than 6.2 - if (majorVersion < 6 || (majorVersion === 6 && minorVersion < 2)) { - that.skip = true; - splunkjs.Logger.log("Skipping cookie tests..."); - } - done(); - }); - }); - - after(function (done) { - this.service.logout(done); - }); - - it("_getCookieString works as expected", function (done) { - var service = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port - }); - - service.http._cookieStore = { - 'cookie': 'format', - 'another': 'one' - }; - - var expectedCookieString = 'cookie=format; another=one; '; - var cookieString = service.http._getCookieString(); - - assert.strictEqual(cookieString, expectedCookieString); - done(); - }); - - it("login and store cookie", function (done) { - if (this.skip) { - done(); - return; - } - var service = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - username: svc.username, - password: svc.password, - version: svc.version - }); - - // Check that there are no cookies - assert.ok(utils.isEmpty(service.http._cookieStore)); - - - service.login(function (err, success) { - // Check that cookies were saved - assert.ok(!utils.isEmpty(service.http._cookieStore)); - assert.notStrictEqual(service.http._getCookieString(), ''); - done(); - }); - }); - - it("request with cookie", function (done) { - if (this.skip) { - done(); - return; - } - var service = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - username: svc.username, - password: svc.password, - version: svc.version - }); - // Create another service to put valid cookie into, give no other authentication information - var service2 = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - version: svc.version - }); - - // Login to service to get a valid cookie - Async.chain([ - function (done) { - service.login(done); - }, - function (job, done) { - // Save the cookie store - var cookieStore = service.http._cookieStore; - // Test that there are cookies - assert.ok(!utils.isEmpty(cookieStore)); - // Add the cookies to a service with no other authentication information - service2.http._cookieStore = cookieStore; - // Make a request that requires authentication - service2.get("search/jobs", { count: 1 }, done); - }, - function (res, done) { - // Test that a response was returned - assert.ok(res); - done(); - } - ], - function (err) { - // Test that no errors were returned - assert.ok(!err); - done(); - } - ); - }); - - it("request fails with bad cookie", function (done) { - if (this.skip) { - done(); - return; - } - // Create a service with no login information - var service = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - version: svc.version - }); - - // Put a bad cookie into the service - service.http._cookieStore = { "bad": "cookie" }; - - // Try requesting something that requires authentication - service.get("search/jobs", { count: 1 }, function (err, res) { - // Test if an error is returned - assert.ok(err); - // Check that it is an unauthorized error - assert.strictEqual(err.status, 401); - done(); - }); - }); - - it("autologin with cookie", function (done) { - if (this.skip) { - done(); - return; - } - var service = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - username: svc.username, - password: svc.password, - version: svc.version - }); - - // Test if service has no cookies - assert.ok(utils.isEmpty(service.http._cookieStore)); - - service.get("search/jobs", { count: 1 }, function (err, res) { - // Test if service now has a cookie - assert.ok(service.http._cookieStore); - done(); - }); - }); - - it("login fails with no cookie and no sessionKey", function (done) { - if (this.skip) { - done(); - return; - } - var service = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - version: svc.version - }); - - // Test there is no authentication information - assert.ok(utils.isEmpty(service.http._cookieStore)); - assert.strictEqual(service.sessionKey, ''); - assert.ok(!service.username); - assert.ok(!service.password); - - service.get("search/jobs", { count: 1 }, function (err, res) { - // Test if an error is returned - assert.ok(err); - done(); - }); - }); - - it("login with multiple cookies", function (done) { - if (this.skip) { - done(); - return; - } - var service = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - username: svc.username, - password: svc.password, - version: svc.version - }); - // Create another service to put valid cookie into, give no other authentication information - var service2 = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, - port: svc.port, - version: svc.version - }); - - // Login to service to get a valid cookie - Async.chain([ - function (done) { - service.login(done); - }, - function (job, done) { - // Save the cookie store - var cookieStore = service.http._cookieStore; - // Test that there are cookies - assert.ok(!utils.isEmpty(cookieStore)); - - // Add a bad cookie to the cookieStore - cookieStore['bad'] = 'cookie'; - - // Add the cookies to a service with no other authenitcation information - service2.http._cookieStore = cookieStore; - - // Make a request that requires authentication - service2.get("search/jobs", { count: 1 }, done); - }, - function (res, done) { - // Test that a response was returned - assert.ok(res); - done(); - } - ], - function (err) { - // Test that no errors were returned - assert.ok(!err); - done(); - } - ); - }); - - it("autologin with cookie and bad sessionKey", function (done) { - if (this.skip) { - done(); - return; - } - var service = new splunkjs.Service( - { - scheme: svc.scheme, - host: svc.host, port: svc.port, - username: svc.username, - password: svc.password, - sessionKey: 'ABC-BADKEY', - version: svc.version - }); - - // Test if service has no cookies - assert.ok(utils.isEmpty(service.http._cookieStore)); - - service.get("search/jobs", { count: 1 }, function (err, res) { - // Test if service now has a cookie - assert.ok(service.http._cookieStore); - done(); - }); - }); - }) - ) - - return suite; -}; - -// Run the individual test suite -if (module === require.cache[__filename] && !module.parent) { - - var options = require('../examples/node/cmdline'); - var splunkjs = require('../index'); - - var cmdline = new options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc)); - }); - }); -} diff --git a/tests_spike/test_examples.js b/tests_spike/test_examples.js deleted file mode 100644 index b3bbcde30..000000000 --- a/tests_spike/test_examples.js +++ /dev/null @@ -1,506 +0,0 @@ -// Copyright 2011 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. - -exports.setup = function (svc, opts) { - var assert = require('chai').assert; - var splunkjs = require('../index'); - var Async = splunkjs.Async; - var idCounter = 0; - var argv = ["program", "script"]; - - var getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); - }; - - splunkjs.Logger.setLevel("ALL"); - - return ( - describe("Hello World Tests", function (done) { - it("Apps", function (done) { - var main = require("../examples/node/helloworld/apps").main; - main(opts, done); - }); - - it("Apps#Async", function (done) { - var main = require("../examples/node/helloworld/apps_async").main; - main(opts, done); - }); - - it("Pivot#Async", function (done) { - var main = require("../examples/node/helloworld/pivot_async").main; - main(opts, done); - }); - - it("Fired Alerts", function (done) { - var main = require("../examples/node/helloworld/firedalerts").main; - main(opts, done); - }); - - it("Fired Alerts#Async", function (done) { - var main = require("../examples/node/helloworld/firedalerts_async").main; - main(opts, done); - }); - - it("Fired Alerts#Create", function (done) { - var main = require("../examples/node/helloworld/firedalerts_create").main; - main(opts, done); - }); - - it("Fired Alerts#Delete", function (done) { - var main = require("../examples/node/helloworld/firedalerts_delete").main; - main(opts, done); - }); - - it("Get Job by sid", function (done) { - var main = require("../examples/node/helloworld/get_job").main; - main(opts, done); - }); - - it("Endpoint Instantiation", function (done) { - var main = require("../examples/node/helloworld/endpoint_instantiation").main; - main(opts, done); - }); - - it("Saved Searches", function (done) { - var main = require("../examples/node/helloworld/savedsearches").main; - main(opts, done); - }); - - it("Saved Searches#Async", function (done) { - var main = require("../examples/node/helloworld/savedsearches_async").main; - main(opts, done); - }); - - it("Saved Searches#Delete", function (done) { - var main = require("../examples/node/helloworld/savedsearches_delete").main; - main(opts, done); - }); - - it("Saved Searches#Create", function (done) { - var main = require("../examples/node/helloworld/savedsearches_create").main; - main(opts, done); - }); - - it("Saved Searches#Delete Again", function (done) { - var main = require("../examples/node/helloworld/savedsearches_delete").main; - main(opts, done); - }); - - it("Search#normal", function (done) { - var main = require("../examples/node/helloworld/search_normal").main; - main(opts, done); - }); - - it("Search#blocking", function (done) { - var main = require("../examples/node/helloworld/search_blocking").main; - main(opts, done); - }); - - it("Search#oneshot", function (done) { - var main = require("../examples/node/helloworld/search_oneshot").main; - main(opts, done); - }); - - it("Search#realtime", function (done) { - - this.timeout(40000) - var main = require("../examples/node/helloworld/search_realtime").main; - main(opts, done); - }); - - it("Logging", function (done) { - var main = require("../examples/node/helloworld/log").main; - main(opts, done); - }) - }), - - describe("Jobs Example Tests", function (done) { - beforeEach(function (done) { - var context = this; - - this.main = require("../examples/node/jobs").main; - this.run = function (command, args, options, callback) { - var combinedArgs = argv.slice(); - if (command) { - combinedArgs.push(command); - } - - if (args) { - for (var i = 0; i < args.length; i++) { - combinedArgs.push(args[i]); - } - } - - if (options) { - for (var key in options) { - if (options.hasOwnProperty(key)) { - combinedArgs.push("--" + key); - combinedArgs.push(options[key]); - } - } - } - - return context.main(combinedArgs, callback); - }; - - done(); - }); - - it("help", function (done) { - this.run(null, null, null, function (err) { - assert.ok(!!err); - done(); - }); - }); - - it("List jobs", function (done) { - this.run("list", null, null, function (err) { - assert.ok(!err); - done(); - }); - }); - - it("Create job", function (done) { - var create = { - search: "search index=_internal | head 1", - id: getNextId() - }; - - var context = this; - context.run("create", [], create, function (err) { - assert.ok(!err); - context.run("cancel", [create.id], null, function (err) { - assert.ok(!err); - done(); - }); - }); - }); - - it("Cancel job", function (done) { - var create = { - search: "search index=_internal | head 1", - id: getNextId() - }; - - var context = this; - context.run("create", [], create, function (err) { - assert.ok(!err); - context.run("cancel", [create.id], null, function (err) { - assert.ok(!err); - done(); - }); - }); - }); - - it("List job properties", function (done) { - var create = { - search: "search index=_internal | head 1", - id: getNextId() - }; - - var context = this; - context.run("create", [], create, function (err) { - assert.ok(!err); - context.run("list", [create.id], null, function (err) { - assert.ok(!err); - context.run("cancel", [create.id], null, function (err) { - assert.ok(!err); - done(); - }); - }); - }); - }); - - it("List job events", function (done) { - var create = { - search: "search index=_internal | head 1", - id: getNextId() - }; - - var context = this; - context.run("create", [], create, function (err) { - assert.ok(!err); - context.run("events", [create.id], null, function (err) { - assert.ok(!err); - context.run("cancel", [create.id], null, function (err) { - assert.ok(!err); - done(); - }); - }); - }); - }); - - it("List job preview", function (done) { - var create = { - search: "search index=_internal | head 1", - id: getNextId() - }; - - var context = this; - context.run("create", [], create, function (err) { - assert.ok(!err); - context.run("preview", [create.id], null, function (err) { - assert.ok(!err); - context.run("cancel", [create.id], null, function (err) { - assert.ok(!err); - done(); - }); - }); - }); - }); - - it("List job results", function (done) { - var create = { - search: "search index=_internal | head 1", - id: getNextId() - }; - - var context = this; - context.run("create", [], create, function (err) { - assert.ok(!err); - context.run("results", [create.id], null, function (err) { - assert.ok(!err); - context.run("cancel", [create.id], null, function (err) { - assert.ok(!err); - done(); - }); - }); - }); - }); - - it("List job results, by column", function (done) { - var create = { - search: "search index=_internal | head 1", - id: getNextId() - }; - - var context = this; - context.run("create", [], create, function (err) { - assert.ok(!err); - context.run("results", [create.id], { output_mode: "json_cols" }, function (err) { - assert.ok(!err); - context.run("cancel", [create.id], null, function (err) { - assert.ok(!err); - done(); - }); - }); - }); - }); - - it("Create+list multiple jobs", function (done) { - var creates = []; - for (var i = 0; i < 3; i++) { - creates[i] = { - search: "search index=_internal | head 1", - id: getNextId() - }; - } - var sids = creates.map(function (create) { return create.id; }); - - var context = this; - Async.parallelMap( - creates, - function (create, idx, done) { - context.run("create", [], create, function (err, job) { - assert.ok(!err); - assert.ok(job); - assert.strictEqual(job.sid, create.id); - done(null, job); - }); - }, - function (err, created) { - for (var i = 0; i < created.length; i++) { - assert.strictEqual(creates[i].id, created[i].sid); - } - - context.run("list", sids, null, function (err) { - assert.ok(!err); - context.run("cancel", sids, null, function (err) { - assert.ok(!err); - done(); - }); - }); - - } - ); - }) - }), - - describe("Search Example Tests", function (done) { - beforeEach(function (done) { - var context = this; - - this.main = require("../examples/node/search").main; - this.run = function (command, args, options, callback) { - var combinedArgs = argv.slice(); - if (command) { - combinedArgs.push(command); - } - - if (args) { - for (var i = 0; i < args.length; i++) { - combinedArgs.push(args[i]); - } - } - - if (options) { - for (var key in options) { - if (options.hasOwnProperty(key)) { - combinedArgs.push("--" + key); - combinedArgs.push(options[key]); - } - } - } - - return context.main(combinedArgs, callback); - }; - - done(); - }); - - it("Create regular search", function (done) { - var options = { - search: "search index=_internal | head 5" - }; - - this.run(null, null, options, function (err) { - assert.ok(!err); - done(); - }); - }); - - it("Create regular search with verbose", function (done) { - var options = { - search: "search index=_internal | head 5" - }; - - this.run(null, ["--verbose"], options, function (err) { - assert.ok(!err); - done(); - }); - }); - - it("Create oneshot search", function (done) { - var options = { - search: "search index=_internal | head 5", - exec_mode: "oneshot" - }; - - this.run(null, ["--verbose"], options, function (err) { - assert.ok(!err); - done(); - }); - }); - - it("Create normal search with reduced count", function (done) { - var options = { - search: "search index=_internal | head 20", - count: 10 - }; - - this.run(null, ["--verbose"], options, function (err) { - assert.ok(!err); - done(); - }); - }) - }) - - // This test is commented out because it causes a failure/hang on - // Node >0.6. We need to revisit this test, so disabling it for now. - /*"Results Example Tests": { - - "Parse row results": function(done) { - var main = require("../examples/node/results").main; - - svc.search( - "search index=_internal | head 1 | stats count by sourcetype", - {exec_mode: "blocking"}, - function(err, job) { - assert.ok(!err); - job.results({output_mode: "json_rows"}, function(err, results) { - assert.ok(!err); - process.stdin.emit("data", JSON.stringify(results)); - process.stdin.emit("end"); - }); - } - ); - - main([], function(err) { - assert.ok(!err); - done(); - }); - }, - - "Parse column results": function(done) { - var main = require("../examples/node/results").main; - - svc.search( - "search index=_internal | head 10 | stats count by sourcetype", - {exec_mode: "blocking"}, - function(err, job) { - assert.ok(!err); - job.results({output_mode: "json_cols"}, function(err, results) { - assert.ok(!err); - process.stdin.emit("data", JSON.stringify(results)); - process.stdin.emit("end"); - }); - } - ); - - main([], function(err) { - assert.ok(!err); - done(); - }); - }, - - "Close stdin": function(done) { - process.stdin.destroy(); - done(); - } - }*/ - ) -}; - -// Run the individual test suite -if (module === require.cache[__filename] && !module.parent) { - - var splunkjs = require('../index'); - var options = require('../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc, cmdline.opts)); - }); - }); -} diff --git a/tests_spike/test_http.js b/tests_spike/test_http.js deleted file mode 100644 index 94cbd6615..000000000 --- a/tests_spike/test_http.js +++ /dev/null @@ -1,314 +0,0 @@ - -// Copyright 2011 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. - -exports.setup = function (http) { - var assert = require('chai').assert; - var splunkjs = require('../index'); - - splunkjs.Logger.setLevel("ALL"); - - return ( - describe("HTTP GET Tests", function (done) { - before(function (done) { - this.http = http; - done(); - }); - - it("Callback#abort simple", function (done) { - var req = this.http.get("https://httpbin.org/get", {}, {}, 0, function (err, res) { - assert.ok(err); - assert.strictEqual(err.error, "abort"); - done(); - }); - - req.abort(); - }); - - it("Callback#abort delay", function (done) { - var req = this.http.get("https://httpbin.org/delay/20", {}, {}, 0, function (err, res) { - assert.ok(err); - assert.strictEqual(err.error, "abort"); - done(); - }); - - splunkjs.Async.sleep(1000, function () { - req.abort(); - }); - }); - - it("Callback#no args", function (done) { - this.http.get("https://httpbin.org/get", [], {}, 0, function (err, res) { - assert.strictEqual(res.data.url, "https://httpbin.org/get"); - done(); - }); - }); - - it("Callback#success success+error", function (done) { - this.http.get("https://httpbin.org/get", [], {}, 0, function (err, res) { - assert.ok(!err); - assert.strictEqual(res.data.url, "https://httpbin.org/get"); - done(); - }); - }); - - it("Callback#error all", function (done) { - this.timeout(40000); - this.http.get("https://httpbin.org/status/404", [], {}, 0, function (err, res) { - assert.strictEqual(err.status, 404); - done(); - }); - }); - - it("Callback#args", function (done) { - this.timeout(40000); - this.http.get("https://httpbin.org/get", [], { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { - var args = res.data.args; - assert.strictEqual(args.a, "1"); - assert.strictEqual(args.b, "2"); - assert.deepEqual(args.c, ["1", "2", "3"]); - assert.strictEqual(args.d, "a/b"); - assert.strictEqual(res.data.url, "https://httpbin.org/get?a=1&b=2&c=1&c=2&c=3&d=a%2Fb"); - done(); - }); - }); - - it("Callback#args with objects", function (done) { - this.timeout(40000); - this.http.get( - "https://httpbin.org/get", [], - { a: 1, b: { c: "ab", d: 12 } }, 0, - function (err, res) { - var args = res.data.args; - assert.strictEqual(args.a, "1"); - assert.deepEqual(args.b, ["ab", "12"]); - assert.strictEqual( - res.data.url, - "https://httpbin.org/get?a=1&b=ab&b=12" - ); - done(); - } - ); - }); - - it("Callback#headers", function (done) { - var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; - - this.http.get("https://httpbin.org/get", { "X-Test1": 1, "X-Test2": "a/b/c" }, {}, 0, function (err, res) { - var returnedHeaders = res.data.headers; - for (var headerName in headers) { - if (headers.hasOwnProperty(headerName)) { - // We have to make the header values into strings - assert.strictEqual(headers[headerName] + "", returnedHeaders[headerName]); - } - } - - assert.strictEqual(res.data.url, "https://httpbin.org/get"); - done(); - }); - }); - - it("Callback#all", function (done) { - var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; - - this.http.get("https://httpbin.org/get", { "X-Test1": 1, "X-Test2": "a/b/c" }, { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { - var returnedHeaders = res.data.headers; - for (var headerName in headers) { - if (headers.hasOwnProperty(headerName)) { - // We have to make the header values into strings - assert.strictEqual(headers[headerName] + "", returnedHeaders[headerName]); - } - } - - var args = res.data.args; - assert.strictEqual(args.a, "1"); - assert.strictEqual(args.b, "2"); - assert.deepEqual(args.c, ["1", "2", "3"]); - assert.strictEqual(args.d, "a/b"); - assert.strictEqual(res.data.url, "https://httpbin.org/get?a=1&b=2&c=1&c=2&c=3&d=a%2Fb"); - done(); - }); - }); - }), - - describe("HTTP POST Tests", function (done) { - before(function (done) { - this.http = http; - done(); - }); - - it("Callback#no args", function (done) { - this.http.post("https://httpbin.org/post", {}, {}, 0, function (err, res) { - assert.strictEqual(res.data.url, "https://httpbin.org/post"); - done(); - }); - }); - - it("Callback#success success+error", function (done) { - this.http.post("https://httpbin.org/post", {}, {}, 0, function (err, res) { - assert.ok(!err); - assert.strictEqual(res.data.url, "https://httpbin.org/post"); - done(); - }); - }); - - it("Callback#error all", function (done) { - this.http.post("https://httpbin.org/status/405", {}, {}, 0, function (err, res) { - assert.strictEqual(err.status, 405); - done(); - }); - }); - - it("Callback#args", function (done) { - this.http.post("https://httpbin.org/post", {}, { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { - var args = res.data.form; - assert.strictEqual(args.a, "1"); - assert.strictEqual(args.b, "2"); - assert.deepStrictEqual(args.c, ["1", "2", "3"]); - assert.strictEqual(args.d, "a/b"); - assert.strictEqual(res.data.url, "https://httpbin.org/post"); - done(); - }); - }); - - it("Callback#headers", function (done) { - var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; - - this.http.post("https://httpbin.org/post", { "X-Test1": 1, "X-Test2": "a/b/c" }, {}, 0, function (err, res) { - var returnedHeaders = res.data.headers; - for (var headerName in headers) { - if (headers.hasOwnProperty(headerName)) { - // We have to make the header values into strings - assert.strictEqual(headers[headerName] + "", returnedHeaders[headerName]); - } - } - assert.strictEqual(res.data.url, "https://httpbin.org/post"); - done(); - }); - }); - - it("Callback#all", function (done) { - var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; - - this.http.post("https://httpbin.org/post", { "X-Test1": 1, "X-Test2": "a/b/c" }, { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { - var returnedHeaders = res.data.headers; - for (var headerName in headers) { - if (headers.hasOwnProperty(headerName)) { - // We have to make the header values into strings - assert.strictEqual(headers[headerName] + "", returnedHeaders[headerName]); - } - } - - var args = res.data.form; - assert.strictEqual(args.a, "1"); - assert.strictEqual(args.b, "2"); - assert.deepStrictEqual(args.c, ["1", "2", "3"]); - assert.strictEqual(args.d, "a/b"); - assert.strictEqual(res.data.url, "https://httpbin.org/post"); - done(); - }); - }) - }), - - describe("HTTP DELETE Tests", function (done) { - before(function (done) { - this.http = http; - done(); - }); - - it("Callback#no args", function (done) { - this.http.del("https://httpbin.org/delete", [], {}, 0, function (err, res) { - assert.strictEqual(res.data.url, "https://httpbin.org/delete"); - done(); - }); - }); - - it("Callback#success success+error", function (done) { - this.http.del("https://httpbin.org/delete", [], {}, 0, function (err, res) { - assert.ok(!err); - assert.strictEqual(res.data.url, "https://httpbin.org/delete"); - done(); - }); - }); - - it("Callback#error all", function (done) { - this.http.del("https://httpbin.org/status/405", [], {}, 0, function (err, res) { - assert.strictEqual(err.status, 405); - done(); - }); - }); - - it("Callback#args", function (done) { - this.http.del("https://httpbin.org/delete", [], { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { - assert.strictEqual(res.data.url, "https://httpbin.org/delete?a=1&b=2&c=1&c=2&c=3&d=a%2Fb"); - done(); - }); - }); - - it("Callback#headers", function (done) { - var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; - - this.http.del("https://httpbin.org/delete", { "X-Test1": 1, "X-Test2": "a/b/c" }, {}, 0, function (err, res) { - var returnedHeaders = res.data.headers; - for (var headerName in headers) { - if (headers.hasOwnProperty(headerName)) { - // We have to make the header values into strings - assert.strictEqual(headers[headerName] + "", returnedHeaders[headerName]); - } - } - assert.strictEqual(res.data.url, "https://httpbin.org/delete"); - done(); - }); - }); - - it("Callback#all", function (done) { - var headers = { "X-Test1": 1, "X-Test2": "a/b/c" }; - - this.http.del("https://httpbin.org/delete", { "X-Test1": 1, "X-Test2": "a/b/c" }, { a: 1, b: 2, c: [1, 2, 3], d: "a/b" }, 0, function (err, res) { - var returnedHeaders = res.data.headers; - for (var headerName in headers) { - if (headers.hasOwnProperty(headerName)) { - // We have to make the header values into strings - assert.strictEqual(headers[headerName] + "", returnedHeaders[headerName]); - } - } - assert.strictEqual(res.data.url, "https://httpbin.org/delete?a=1&b=2&c=1&c=2&c=3&d=a%2Fb"); - done(); - }); - }); - - it("Default arguments to Http work", function (done) { - var NodeHttp = splunkjs.NodeHttp; - var h = new NodeHttp(); - assert.ok(h); - done(); - }); - - it("Methods of Http base class that must be overrided", function (done) { - var h = new splunkjs.Http(); - assert.throws(function () { h.makeRequest("asdf", null, null); }); - assert.throws(function () { h.parseJson("{}"); }); - done(); - }) - }) - ) -}; - -// Run the individual test suite -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../index'); - var http = new splunkjs.NodeHttp(); - - module.exports = exports.setup(http); -} diff --git a/tests_spike/test_log.js b/tests_spike/test_log.js deleted file mode 100644 index a0bdb118e..000000000 --- a/tests_spike/test_log.js +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2011 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. - -exports.setup = function () { - var assert = require('chai').assert; - var isBrowser = typeof window !== "undefined"; - - var unload = function (name) { - for (var k in require.cache) { - if (require.cache[k] && k.match(name + "$")) { - delete require.cache[k]; - } - } - }; - - if (isBrowser) { - return {}; - } - else { - return ( - describe('Log tests', function () { - it("Default level with no environment variable", function (done) { - var oldVal = process.env.LOG_LEVEL; - delete process.env.LOG_LEVEL; - unload("log.js"); - var logger = require("../lib/log.js"); - assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.ERROR); - process.env.LOG_LEVEL = oldVal; - unload("log.js"); - done(); - }); - - it("Setting a nonexistant level default to errors", function (done) { - var oldVal = process.env.LOG_LEVEL; - process.env.LOG_LEVEL = "25"; - unload("log.js"); - var logger = require("../lib/log.js"); - assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.ERROR); - process.env.LOG_LEVEL = oldVal; - unload("log.js"); - done(); - }); - - it("Setting logging level as integer works", function (done) { - var oldVal = process.env.LOG_LEVEL; - process.env.LOG_LEVEL = "3"; - unload("log.js"); - var logger = require("../lib/log.js"); - assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.INFO); - process.env.LOG_LEVEL = oldVal; - unload("log.js"); - done(); - }); - - it("Setting logging level as string works", function (done) { - var oldVal = process.env.LOG_LEVEL; - process.env.LOG_LEVEL = "INFO"; - unload("log.js"); - var logger = require("../lib/log.js"); - assert.equal(process.env.LOG_LEVEL, logger.Logger.levels.INFO); - process.env.LOG_LEVEL = oldVal; - unload("log.js"); - done(); - }); - - it("Setting logging level after the fact works", function (done) { - var oldVal = process.env.LOG_LEVEL; - unload("log.js"); - var logger = require("../lib/log.js"); - logger.Logger.setLevel(); - process.env.LOG_LEVEL = oldVal; - unload("log.js"); - done(); - }); - }) - ) - }; -}; - -// Run the individual test suite -if (module === require.cache[__filename] && !module.parent) { - module.exports = exports.setup(); -} diff --git a/tests_spike/test_service.js b/tests_spike/test_service.js deleted file mode 100644 index a2f2db1ce..000000000 --- a/tests_spike/test_service.js +++ /dev/null @@ -1,86 +0,0 @@ - -// Copyright 2011 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. - -exports.setup = function (svc, loggedOutSvc) { - - return ( - - describe("Service tests", function (done) { - require("./service_tests/app").setup(svc), - require("./service_tests/collection").setup(svc, loggedOutSvc), - require("./service_tests/configuration").setup(svc), - require("./service_tests/datamodels").setup(svc), - require("./service_tests/endpoint").setup(svc), - require("./service_tests/entity").setup(svc, loggedOutSvc), - require("./service_tests/firedalerts").setup(svc, loggedOutSvc), - require("./service_tests/indexes").setup(svc, loggedOutSvc), - require("./service_tests/job").setup(svc), - require("./service_tests/namespace").setup(svc), - require("./service_tests/parser").setup(svc), - require("./service_tests/pivot").setup(svc), - require("./service_tests/properties").setup(svc), - require("./service_tests/savedsearch").setup(svc, loggedOutSvc), - require("./service_tests/serverinfo").setup(svc), - require("./service_tests/storagepasswords").setup(svc), - require("./service_tests/typeahead").setup(svc, loggedOutSvc), - require("./service_tests/user").setup(svc, loggedOutSvc), - require("./service_tests/view").setup(svc) - }) - ) -}; - -if (module === require.cache[__filename] && !module.parent) { - var splunkjs = require('../index'); - var options = require('../examples/node/cmdline'); - - var cmdline = options.create().parse(process.argv); - - // If there is no command line, we should return - if (!cmdline) { - throw new Error("Error in parsing command line parameters"); - } - - if (!process.env.SPLUNK_HOME) { - throw new Error("$PATH variable SPLUNK_HOME is not set. Please export SPLUNK_HOME to the splunk instance."); - } - - var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version - }); - - var loggedOutSvc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password + 'wrong', - version: cmdline.opts.version - }); - - // Exports tests on a successful login - module.exports = new Promise((resolve, reject) => { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - return resolve(exports.setup(svc, loggedOutSvc)); - }); - }); -} diff --git a/tests_spike/test_utils.js b/tests_spike/test_utils.js deleted file mode 100644 index 3c5ff3484..000000000 --- a/tests_spike/test_utils.js +++ /dev/null @@ -1,268 +0,0 @@ - -// Copyright 2011 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. - -exports.setup = function () { - var splunkjs = require('../index'); - var assert = require('chai').assert; - - splunkjs.Logger.setLevel("ALL"); - - return ( - describe('Utils tests', function (done) { - it("Callback#callback to object success", function (done) { - var successfulFunction = function (callback) { - callback(null, "one", "two"); - }; - - successfulFunction(function (err, one, two) { - assert.strictEqual(one, "one"); - assert.strictEqual(two, "two"); - done(); - }); - }); - - it("Callback#callback to object error - single argument", function (done) { - var successfulFunction = function (callback) { - callback("one"); - }; - - successfulFunction(function (err, one, two) { - assert.strictEqual(err, "one"); - assert.ok(!one); - assert.ok(!two); - done(); - }); - }); - - it("Callback#callback to object error - multi argument", function (done) { - var successfulFunction = function (callback) { - callback(["one", "two"]); - }; - - successfulFunction(function (err, one, two) { - assert.strictEqual(err[0], "one"); - assert.strictEqual(err[1], "two"); - assert.ok(!one); - assert.ok(!two); - done(); - }); - }); - - it("keyOf works", function (done) { - assert.ok(splunkjs.Utils.keyOf(3, { a: 3, b: 5 })); - assert.ok(!splunkjs.Utils.keyOf(3, { a: 12, b: 6 })); - done(); - }); - - it("bind", function (done) { - var f; - (function () { - f = function (a) { - this.a = a; - }; - })(); - var q = {}; - var g = splunkjs.Utils.bind(q, f); - g(12); - assert.strictEqual(q.a, 12); - done(); - }); - - it("trim", function (done) { - assert.strictEqual(splunkjs.Utils.trim(" test of something \n\r \t"), "test of something"); - - var realTrim = String.prototype.trim; - String.prototype.trim = null; - assert.strictEqual(splunkjs.Utils.trim(" test of something \n\r \t"), "test of something"); - String.prototype.trim = realTrim; - - done(); - }); - - it("indexOf", function (done) { - assert.strictEqual(splunkjs.Utils.indexOf([1, 2, 3, 4, 5], 3), 2); - assert.strictEqual(splunkjs.Utils.indexOf([1, 2, 3, 4, 3], 3), 2); - assert.strictEqual(splunkjs.Utils.indexOf([1, 2, 3, 4, 5], 12), -1); - done(); - }); - - it("contains", function (done) { - assert.ok(splunkjs.Utils.contains([1, 2, 3, 4, 5], 3)); - assert.ok(splunkjs.Utils.contains([1, 2, 3, 4, 3], 3)); - assert.ok(!splunkjs.Utils.contains([1, 2, 3, 4, 5], 12)); - done(); - }); - - it("startsWith", function (done) { - assert.ok(splunkjs.Utils.startsWith("abcdefg", "abc")); - assert.ok(!splunkjs.Utils.startsWith("bcdefg", "abc")); - done(); - }); - - it("endsWith", function (done) { - assert.ok(splunkjs.Utils.endsWith("abcdef", "def")); - assert.ok(!splunkjs.Utils.endsWith("abcdef", "bcd")); - done(); - }); - - it("toArray", function (done) { - (function () { - var found = splunkjs.Utils.toArray(arguments); - var expected = [1, 2, 3, 4, 5]; - for (var i = 0; i < found.length; i++) { - assert.strictEqual(found[i], expected[i]); - } - })(1, 2, 3, 4, 5); - done(); - }); - - it("isArray", function (done) { - var a = [1, 2, 3, 4, 5]; - assert.ok(splunkjs.Utils.isArray(a)); - done(); - }); - - it("isFunction", function (done) { - assert.ok(splunkjs.Utils.isFunction(function () { })); - assert.ok(!splunkjs.Utils.isFunction(3)); - assert.ok(!splunkjs.Utils.isFunction("abc")); - assert.ok(!splunkjs.Utils.isFunction({})); - done(); - }); - - it("isNumber", function (done) { - assert.ok(splunkjs.Utils.isNumber(3)); - assert.ok(splunkjs.Utils.isNumber(-2.55113e12)); - assert.ok(!splunkjs.Utils.isNumber("3")); - assert.ok(!splunkjs.Utils.isNumber({ 3: 5 })); - done(); - }); - - it("isObject", function (done) { - assert.ok(splunkjs.Utils.isObject({})); - assert.ok(!splunkjs.Utils.isObject(3)); - assert.ok(!splunkjs.Utils.isObject("3")); - done(); - }); - - it("isEmpty", function (done) { - assert.ok(splunkjs.Utils.isEmpty({})); - assert.ok(splunkjs.Utils.isEmpty([])); - assert.ok(splunkjs.Utils.isEmpty("")); - assert.ok(!splunkjs.Utils.isEmpty({ a: 3 })); - assert.ok(!splunkjs.Utils.isEmpty([1, 2])); - assert.ok(!splunkjs.Utils.isEmpty("abc")); - done(); - }); - - it("forEach", function (done) { - var a = [1, 2, 3, 4, 5]; - splunkjs.Utils.forEach( - a, - function (elem, index, list) { - assert.strictEqual(a[index], elem); - } - ); - var b = { 1: 2, 2: 4, 3: 6 }; - splunkjs.Utils.forEach( - b, - function (elem, key, obj) { - assert.strictEqual(b[key], elem); - } - ); - splunkjs.Utils.forEach(null, function (elem, key, obj) { }); - var c = { length: 5, 1: 12, 2: 15, 3: 8 }; - splunkjs.Utils.forEach( - c, - function (elem, key, obj) { - assert.strictEqual(c[key], elem); - } - ); - done(); - }); - - it("extend", function (done) { - var found = splunkjs.Utils.extend({}, { a: 1, b: 2 }, { c: 3, b: 4 }); - var expected = { a: 1, b: 4, c: 3 }; - for (var k in found) { - if (found.hasOwnProperty(k)) { - assert.strictEqual(found[k], expected[k]); - } - } - done(); - }); - - it("clone", function (done) { - var a = { a: 1, b: 2, c: { p: 5, q: 6 } }; - var b = splunkjs.Utils.clone(a); - splunkjs.Utils.forEach(a, function (val, key, obj) { assert.strictEqual(val, b[key]); }); - a.a = 5; - assert.strictEqual(b.a, 1); - a.c.p = 4; - assert.strictEqual(b.c.p, 4); - done(); - assert.strictEqual(splunkjs.Utils.clone(3), 3); - assert.strictEqual(splunkjs.Utils.clone("asdf"), "asdf"); - var p = [1, 2, [3, 4], 3]; - var q = splunkjs.Utils.clone(p); - splunkjs.Utils.forEach(p, function (val, index, arr) { assert.strictEqual(p[index], q[index]); }); - p[0] = 3; - assert.strictEqual(q[0], 1); - p[2][0] = 7; - assert.strictEqual(q[2][0], 7); - }); - - it("namespaceFromProperties", function (done) { - var a = splunkjs.Utils.namespaceFromProperties( - { - acl: { - owner: "boris", - app: "factory", - sharing: "system", - other: 3 - }, - more: 12 - }); - splunkjs.Utils.forEach( - a, - function (val, key, obj) { - assert.ok((key === "owner" && val === "boris") || - (key === "app" && val === "factory") || - (key === "sharing" && val === "system")); - } - ); - done(); - }); - - it("namespaceFromProperties - bad data", function (done) { - var undefinedProps; - var a = splunkjs.Utils.namespaceFromProperties(undefinedProps); - assert.strictEqual(a.owner, ''); - assert.strictEqual(a.app, ''); - assert.strictEqual(a.sharing, ''); - - var b = splunkjs.Utils.namespaceFromProperties(undefinedProps); - assert.strictEqual(b.owner, ''); - assert.strictEqual(b.app, ''); - assert.strictEqual(b.sharing, ''); - done(); - }); - }) - ); -} -// Run the individual test suite -if (module === require.cache[__filename] && !module.parent) { - module.exports = exports.setup(); -} diff --git a/tests_spike/tests.browser.html b/tests_spike/tests.browser.html deleted file mode 100644 index 54298b018..000000000 --- a/tests_spike/tests.browser.html +++ /dev/null @@ -1,204 +0,0 @@ - - - - Splunk SDK Browser Tests - - - - - - - - - - - -
-

Splunk SDK Browser Test Suite

-
-
-

Scheme

- -
-
-

Host

- -
-
-

Port

- -
-
-

Username

- -
-
-

Password

- -
-
-

Version

- -
-
-

 

- Run -
-
-
-
- - \ No newline at end of file diff --git a/tests_spike/tests.js b/tests_spike/tests.js deleted file mode 100644 index e7818f19c..000000000 --- a/tests_spike/tests.js +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2011 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. - -// var { describe } = require('mocha'); -var options = require('../examples/node/cmdline'); -var splunkjs = require('../index'); -var utils = require('../lib/utils'); -var NodeHttp = splunkjs.NodeHttp; - -var parser = new options.create(); - -// If we found the --quiet flag, remove it -var quiet = utils.contains(process.argv, "--quiet"); -if (quiet) { - splunkjs.Logger.setLevel("NONE"); - var quietIndex = utils.keyOf("--quiet", process.argv); - process.argv.splice(quietIndex, 1); -} -else { - splunkjs.Logger.setLevel("ALL"); -} - -// If $SPLUNK_HOME isn't set, abort the tests -if (!Object.prototype.hasOwnProperty.call(process.env, "SPLUNK_HOME")) { - console.error("$SPLUNK_HOME is not set, aborting tests."); - return; -} - -// Do the normal parsing -var cmdline = parser.parse(process.argv); - -var nonSplunkHttp = new NodeHttp(false); - -var svc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password, - version: cmdline.opts.version -}); - -var loggedOutSvc = new splunkjs.Service({ - scheme: cmdline.opts.scheme, - host: cmdline.opts.host, - port: cmdline.opts.port, - username: cmdline.opts.username, - password: cmdline.opts.password + 'wrong', - version: cmdline.opts.version -}); - -describe("Server tests", function () { - - this.beforeAll(function (done) { - svc.login(function (err, success) { - if (err || !success) { - throw new Error("Login failed - not running tests", err || ""); - } - }); - done(); - }) - - // require('./modularinputs'); - // require('./test_async').setup(); - // require('./test_context').setup(svc); - // require('./test_examples').setup(svc, cmdline.opts); - // require('./test_http').setup(nonSplunkHttp); - // require('./test_log').setup(); - require('./test_service').setup(svc, loggedOutSvc); - // require('./test_utils').setup(); -}) - - - - diff --git a/tests_spike/utils.js b/tests_spike/utils.js deleted file mode 100644 index 3d9018f90..000000000 --- a/tests_spike/utils.js +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2011 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. - -(function () { - "use strict"; - var Async = require('../lib/async'); - var assert = require('chai').assert; - - var root = exports || this; - - root.pollUntil = function (obj, condition, iterations, callback) { - callback = callback || function () { }; - - var i = 0; - Async.whilst( - function () { return !condition(obj) && (i++ < iterations); }, - function (done) { - Async.sleep(500, function () { - obj.fetch(done); - }); - }, - function (err) { - callback(err, obj); - } - ); - }; - - // Minimal Http implementation that is designed to pass the tests - // done by Context.init(), but nothing more. - root.DummyHttp = { - // Required by Context.init() - _setSplunkVersion: function (version) { - // nothing - } - }; - - var idCounter = 0; - root.getNextId = function () { - return "id" + (idCounter++) + "_" + ((new Date()).valueOf()); - }; - -})(); From 6939be810d58df51c37cb8e3df508333a3efb889 Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Tue, 20 Jul 2021 14:46:16 +0530 Subject: [PATCH 6/7] Update mocha-test.yml --- .github/workflows/mocha-test.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/workflows/mocha-test.yml b/.github/workflows/mocha-test.yml index 4edbf7fd3..1a8b91cb0 100644 --- a/.github/workflows/mocha-test.yml +++ b/.github/workflows/mocha-test.yml @@ -5,17 +5,18 @@ on: [push, pull_request] jobs: build: runs-on: ${{ matrix.os }} - + strategy: matrix: os: - ubuntu-latest node: - 14 + - 8.17.0 splunk-version: - "8.0" - - "latest" - + - "latest" + services: splunk: image: splunk/splunk:${{matrix.splunk-version}} @@ -28,15 +29,15 @@ jobs: - 8000:8000 - 8088:8088 - 8089:8089 - + steps: - uses: actions/checkout@v2 - + - name: Use node ${{ matrix.node }} uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - + - name: Create .splunkrc file run: | cd ~ @@ -46,10 +47,10 @@ jobs: echo password=changed! >> .splunkrc echo scheme=https >> .splunkrc echo version=${{ matrix.splunk }} >> .splunkrc - + - name: Run npm install run: npm install - + - name: Run server tests run: make test env: From 7eac86bbd1572200c268f6e01f94023951249bd6 Mon Sep 17 00:00:00 2001 From: vmalaviya Date: Tue, 20 Jul 2021 14:57:15 +0530 Subject: [PATCH 7/7] Changes reverted fro sdk-app-collection --- tests/service_tests/savedsearch.js | 8 ++++---- tests/service_tests/view.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/service_tests/savedsearch.js b/tests/service_tests/savedsearch.js index b7addee9f..b57a12bb7 100644 --- a/tests/service_tests/savedsearch.js +++ b/tests/service_tests/savedsearch.js @@ -104,7 +104,7 @@ exports.setup = function (svc, loggedOutSvc) { var updatedSearch = "search * | head 10"; var updatedDescription = "description"; - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdkappcollection" }); + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); Async.chain([ function (done) { @@ -234,7 +234,7 @@ exports.setup = function (svc, loggedOutSvc) { var name = "jssdk_savedsearch_" + getNextId(); var originalSearch = "search index=_internal | head 1"; - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdkappcollection" }); + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); Async.chain( function (done) { @@ -352,7 +352,7 @@ exports.setup = function (svc, loggedOutSvc) { }) it("Callback#delete test saved searches", function (done) { - var searches = this.service.savedSearches({ owner: this.service.username, app: "sdkappcollection" }); + var searches = this.service.savedSearches({ owner: this.service.username, app: "sdk-app-collection" }); searches.fetch(function (err, searches) { var searchList = searches.list(); Async.parallelEach( @@ -381,7 +381,7 @@ exports.setup = function (svc, loggedOutSvc) { }) it("Callback#setupInfo succeeds", function (done) { - var app = new splunkjs.Service.Application(this.service, "sdkappcollection"); + var app = new splunkjs.Service.Application(this.service, "sdk-app-collection"); app.setupInfo(function (err, content, app) { // This error message was removed in modern versions of Splunk if (err) { diff --git a/tests/service_tests/view.js b/tests/service_tests/view.js index 7d8b97ef6..e73489b9c 100644 --- a/tests/service_tests/view.js +++ b/tests/service_tests/view.js @@ -38,7 +38,7 @@ exports.setup = function (svc) { Async.chain([ function (done) { - service.views({ owner: "admin", app: "sdkappcollection" }).create({ name: name, "eai:data": originalData }, done); + service.views({ owner: "admin", app: "sdk-app-collection" }).create({ name: name, "eai:data": originalData }, done); }, function (view, done) { assert.ok(view);