|
| 1 | +#!/usr/bin/env bash |
| 2 | +set -euo pipefail |
| 3 | + |
| 4 | +PW_IMAGE="mcr.microsoft.com/playwright:v1.52.0-jammy" |
| 5 | +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" |
| 6 | +PW_PREFIX=( |
| 7 | + docker run --rm |
| 8 | + --network cacti-syslog-e2e_default |
| 9 | + --ipc=host |
| 10 | + -v "${ROOT_DIR}/tests/e2e/playwright:/work" |
| 11 | + -w /work |
| 12 | +) |
| 13 | + |
| 14 | +pass_count=0 |
| 15 | + |
| 16 | +db_scalar() { |
| 17 | + docker exec cacti_db mariadb -N -B -ucacti -pcacti cacti -e "$1" |
| 18 | +} |
| 19 | + |
| 20 | +db_exec() { |
| 21 | + docker exec cacti_db mariadb -ucacti -pcacti cacti -e "$1" >/dev/null |
| 22 | +} |
| 23 | + |
| 24 | +browser_check() { |
| 25 | + local page_path="$1" |
| 26 | + local expect_title="$2" |
| 27 | + local expect_text="$3" |
| 28 | + local expect_text_2="${4:-}" |
| 29 | + local expect_text_3="${5:-}" |
| 30 | + |
| 31 | + "${PW_PREFIX[@]}" \ |
| 32 | + -e "PAGE_PATH=${page_path}" \ |
| 33 | + -e "EXPECT_TITLE=${expect_title}" \ |
| 34 | + -e "EXPECT_TEXT=${expect_text}" \ |
| 35 | + -e "EXPECT_TEXT_2=${expect_text_2}" \ |
| 36 | + -e "EXPECT_TEXT_3=${expect_text_3}" \ |
| 37 | + "$PW_IMAGE" \ |
| 38 | + node browser-check.js >/dev/null |
| 39 | +} |
| 40 | + |
| 41 | +run_test() { |
| 42 | + local name="$1" |
| 43 | + shift |
| 44 | + echo "TEST ${name}" |
| 45 | + "$@" |
| 46 | + pass_count=$((pass_count + 1)) |
| 47 | + echo "PASS ${name}" |
| 48 | +} |
| 49 | + |
| 50 | +assert_equals() { |
| 51 | + local actual="$1" |
| 52 | + local expected="$2" |
| 53 | + local label="$3" |
| 54 | + |
| 55 | + if [[ "$actual" != "$expected" ]]; then |
| 56 | + echo "FAIL ${label}: expected '${expected}', got '${actual}'" >&2 |
| 57 | + exit 1 |
| 58 | + fi |
| 59 | +} |
| 60 | + |
| 61 | +normalize_admin() { |
| 62 | + docker exec cacti_web php -r 'require "include/global.php"; $hash = password_hash("Admin123!", PASSWORD_BCRYPT); db_execute_prepared("UPDATE user_auth SET password = ?, must_change_password = \"\", password_change = \"\" WHERE username = \"admin\"", [$hash]);' >/dev/null |
| 63 | +} |
| 64 | + |
| 65 | +reset_syslog_data() { |
| 66 | + db_exec "TRUNCATE syslog_incoming; TRUNCATE syslog; TRUNCATE syslog_removed; TRUNCATE syslog_statistics; TRUNCATE syslog_hosts; TRUNCATE syslog_programs; TRUNCATE syslog_host_facilities; DELETE FROM syslog_remove;" |
| 67 | +} |
| 68 | + |
| 69 | +seed_incoming() { |
| 70 | + local host="$1" |
| 71 | + local program="$2" |
| 72 | + local message="$3" |
| 73 | + db_exec "INSERT INTO syslog_incoming (facility_id, priority_id, program, logtime, host, message) VALUES (1, 6, '${program}', NOW(), '${host}', '${message}')" |
| 74 | +} |
| 75 | + |
| 76 | +run_processor() { |
| 77 | + docker exec cacti_web php /var/www/html/cacti/plugins/syslog/syslog_process.php --debug >/dev/null |
| 78 | +} |
| 79 | + |
| 80 | +test_login_console() { |
| 81 | + browser_check "index.php" "Console" "Main Console" "Logged in as admin" |
| 82 | +} |
| 83 | + |
| 84 | +test_syslog_empty_page() { |
| 85 | + reset_syslog_data |
| 86 | + browser_check "plugins/syslog/syslog.php" "Console > Syslog" "No Syslog Messages" "Unprocessed Messages: 0" |
| 87 | +} |
| 88 | + |
| 89 | +test_alerts_page() { |
| 90 | + browser_check "plugins/syslog/syslog_alerts.php" "Console > Syslog Alerts" "No Syslog Alerts Defined" |
| 91 | +} |
| 92 | + |
| 93 | +test_removal_page() { |
| 94 | + browser_check "plugins/syslog/syslog_removal.php" "Console > Syslog Removal" "No Syslog Removal Rules Defined" |
| 95 | +} |
| 96 | + |
| 97 | +test_reports_page() { |
| 98 | + browser_check "plugins/syslog/syslog_reports.php" "Console > Syslog Reports" "No Syslog Reports Defined" |
| 99 | +} |
| 100 | + |
| 101 | +test_plain_ingest_to_main() { |
| 102 | + seed_incoming "e2e-host-1" "e2e-prog-1" "E2E-TOKEN-ONE plain ingest" |
| 103 | + run_processor |
| 104 | + assert_equals "$(db_scalar "SELECT COUNT(*) FROM syslog_incoming")" "0" "incoming queue should be drained" |
| 105 | + assert_equals "$(db_scalar "SELECT COUNT(*) FROM syslog WHERE message = 'E2E-TOKEN-ONE plain ingest'")" "1" "plain message should land in syslog" |
| 106 | +} |
| 107 | + |
| 108 | +test_plain_ingest_normalization() { |
| 109 | + assert_equals "$(db_scalar "SELECT COUNT(*) FROM syslog_hosts WHERE host = 'e2e-host-1'")" "1" "host should be normalized" |
| 110 | + assert_equals "$(db_scalar "SELECT COUNT(*) FROM syslog_programs WHERE program = 'e2e-prog-1'")" "1" "program should be normalized" |
| 111 | +} |
| 112 | + |
| 113 | +test_plain_ingest_visible_in_ui() { |
| 114 | + browser_check "plugins/syslog/syslog.php?rfilter=E2E-TOKEN-ONE" "Console > Syslog" "E2E-TOKEN-ONE" "e2e-host-1" "e2e-prog-1" |
| 115 | +} |
| 116 | + |
| 117 | +test_second_ingest_accumulates() { |
| 118 | + seed_incoming "e2e-host-2" "e2e-prog-2" "E2E-TOKEN-TWO second ingest" |
| 119 | + run_processor |
| 120 | + assert_equals "$(db_scalar "SELECT COUNT(*) FROM syslog")" "2" "two processed records should exist" |
| 121 | + assert_equals "$(db_scalar "SELECT COUNT(*) FROM syslog_hosts WHERE host = 'e2e-host-2'")" "1" "second host should be normalized" |
| 122 | + assert_equals "$(db_scalar "SELECT COUNT(*) FROM syslog_programs WHERE program = 'e2e-prog-2'")" "1" "second program should be normalized" |
| 123 | +} |
| 124 | + |
| 125 | +test_second_ingest_visible_in_ui() { |
| 126 | + browser_check "plugins/syslog/syslog.php?rfilter=E2E-TOKEN-TWO" "Console > Syslog" "E2E-TOKEN-TWO" "e2e-host-2" "e2e-prog-2" |
| 127 | +} |
| 128 | + |
| 129 | +normalize_admin |
| 130 | + |
| 131 | +run_test "1 login console" test_login_console |
| 132 | +run_test "2 syslog empty page" test_syslog_empty_page |
| 133 | +run_test "3 alerts page" test_alerts_page |
| 134 | +run_test "4 removal page" test_removal_page |
| 135 | +run_test "5 reports page" test_reports_page |
| 136 | +run_test "6 plain ingest to main" test_plain_ingest_to_main |
| 137 | +run_test "7 plain ingest normalization" test_plain_ingest_normalization |
| 138 | +run_test "8 plain ingest visible in ui" test_plain_ingest_visible_in_ui |
| 139 | +run_test "9 second ingest accumulates" test_second_ingest_accumulates |
| 140 | +run_test "10 second ingest visible in ui" test_second_ingest_visible_in_ui |
| 141 | + |
| 142 | +echo "ALL PASS ${pass_count}" |
0 commit comments