secubox-openwrt/luci-app-system-hub/tests/test-profiles.sh

274 lines
8.4 KiB
Bash
Executable File

#!/bin/sh
# System Hub Diagnostic Profiles - Unit Tests
# Tests RPCD backend functions in isolation
. /lib/functions.sh
. /usr/share/libubox/jshn.sh
# Test counters
TESTS_PASSED=0
TESTS_FAILED=0
TEST_NAME=""
# Color codes for output
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# Assert functions
assert_equals() {
local expected="$1"
local actual="$2"
local test_name="$3"
if [ "$expected" = "$actual" ]; then
echo -e "${GREEN}✅ PASS${NC}: $test_name"
TESTS_PASSED=$((TESTS_PASSED + 1))
return 0
else
echo -e "${RED}❌ FAIL${NC}: $test_name"
echo " Expected: $expected"
echo " Actual: $actual"
TESTS_FAILED=$((TESTS_FAILED + 1))
return 1
fi
}
assert_contains() {
local haystack="$1"
local needle="$2"
local test_name="$3"
if echo "$haystack" | grep -q "$needle"; then
echo -e "${GREEN}✅ PASS${NC}: $test_name"
TESTS_PASSED=$((TESTS_PASSED + 1))
return 0
else
echo -e "${RED}❌ FAIL${NC}: $test_name"
echo " Expected to find: $needle"
echo " In: $haystack"
TESTS_FAILED=$((TESTS_FAILED + 1))
return 1
fi
}
assert_json_valid() {
local json="$1"
local test_name="$2"
if echo "$json" | jsonfilter -e '@' >/dev/null 2>&1; then
echo -e "${GREEN}✅ PASS${NC}: $test_name"
TESTS_PASSED=$((TESTS_PASSED + 1))
return 0
else
echo -e "${RED}❌ FAIL${NC}: $test_name"
echo " Invalid JSON: $json"
TESTS_FAILED=$((TESTS_FAILED + 1))
return 1
fi
}
# Test 1: Profile listing returns valid JSON
test_list_profiles_json() {
echo ""
echo "TEST 1: list_diagnostic_profiles returns valid JSON"
echo "=================================================="
local result=$(ubus call luci.system-hub list_diagnostic_profiles 2>&1)
assert_json_valid "$result" "list_diagnostic_profiles returns valid JSON"
}
# Test 2: At least 5 profiles returned
test_list_profiles_count() {
echo ""
echo "TEST 2: At least 5 profiles available"
echo "======================================"
local result=$(ubus call luci.system-hub list_diagnostic_profiles 2>&1)
local count=$(echo "$result" | jsonfilter -e '@.profiles[*]' 2>/dev/null | wc -l)
if [ "$count" -ge 5 ]; then
assert_equals "5" "$count" "At least 5 profiles returned (found $count)"
else
assert_equals "5" "$count" "At least 5 profiles returned"
fi
}
# Test 3: Profile names are correct
test_profile_names() {
echo ""
echo "TEST 3: Profile names are correct"
echo "=================================="
local result=$(ubus call luci.system-hub list_diagnostic_profiles 2>&1)
assert_contains "$result" "network-issues" "Contains network-issues profile"
assert_contains "$result" "performance-problems" "Contains performance-problems profile"
assert_contains "$result" "security-audit" "Contains security-audit profile"
assert_contains "$result" "wifi-problems" "Contains wifi-problems profile"
assert_contains "$result" "full-diagnostic" "Contains full-diagnostic profile"
}
# Test 4: Get specific profile - network-issues
test_get_profile_network() {
echo ""
echo "TEST 4: Get network-issues profile"
echo "==================================="
local result=$(ubus call luci.system-hub get_diagnostic_profile '{"name":"network-issues"}' 2>&1)
assert_json_valid "$result" "get_diagnostic_profile returns valid JSON"
local name=$(echo "$result" | jsonfilter -e '@.name' 2>/dev/null)
assert_equals "network-issues" "$name" "Profile name is network-issues"
local tests=$(echo "$result" | jsonfilter -e '@.tests' 2>/dev/null)
assert_contains "$tests" "connectivity" "Profile contains connectivity test"
assert_contains "$tests" "dns" "Profile contains dns test"
local include_logs=$(echo "$result" | jsonfilter -e '@.include_logs' 2>/dev/null)
assert_equals "1" "$include_logs" "Profile includes logs"
}
# Test 5: Get specific profile - performance-problems
test_get_profile_performance() {
echo ""
echo "TEST 5: Get performance-problems profile"
echo "========================================="
local result=$(ubus call luci.system-hub get_diagnostic_profile '{"name":"performance-problems"}' 2>&1)
local name=$(echo "$result" | jsonfilter -e '@.name' 2>/dev/null)
assert_equals "performance-problems" "$name" "Profile name is performance-problems"
local include_config=$(echo "$result" | jsonfilter -e '@.include_config' 2>/dev/null)
assert_equals "0" "$include_config" "Performance profile does not include config"
}
# Test 6: Get invalid profile
test_get_profile_invalid() {
echo ""
echo "TEST 6: Get invalid profile returns error"
echo "=========================================="
local result=$(ubus call luci.system-hub get_diagnostic_profile '{"name":"invalid-profile"}' 2>&1)
assert_json_valid "$result" "Invalid profile returns valid JSON error"
assert_contains "$result" "error" "Response contains error field"
}
# Test 7: Collect diagnostics with profile
test_collect_with_profile() {
echo ""
echo "TEST 7: Collect diagnostics with profile"
echo "========================================="
local result=$(ubus call luci.system-hub collect_diagnostics '{"profile":"network-issues"}' 2>&1)
assert_json_valid "$result" "collect_diagnostics with profile returns valid JSON"
local success=$(echo "$result" | jsonfilter -e '@.success' 2>/dev/null)
assert_equals "true" "$success" "Diagnostic collection succeeds"
local filename=$(echo "$result" | jsonfilter -e '@.file' 2>/dev/null)
assert_contains "$filename" "network-issues" "Archive filename contains profile name"
# Cleanup
if [ -n "$filename" ]; then
rm -f "/tmp/system-hub/diagnostics/$filename"
fi
}
# Test 8: Profile filename format
test_profile_filename_format() {
echo ""
echo "TEST 8: Profile filename format is correct"
echo "==========================================="
local result=$(ubus call luci.system-hub collect_diagnostics '{"profile":"security-audit"}' 2>&1)
local filename=$(echo "$result" | jsonfilter -e '@.file' 2>/dev/null)
# Format should be: diagnostics-{hostname}-{profile}-{timestamp}.tar.gz
assert_contains "$filename" "security-audit" "Filename contains profile name"
assert_contains "$filename" ".tar.gz" "Filename has .tar.gz extension"
assert_contains "$filename" "diagnostics-" "Filename starts with diagnostics-"
# Cleanup
if [ -n "$filename" ]; then
rm -f "/tmp/system-hub/diagnostics/$filename"
fi
}
# Test 9: Profile overrides flags
test_profile_overrides_flags() {
echo ""
echo "TEST 9: Profile overrides individual flags"
echo "==========================================="
# Performance profile has include_config=0
local result=$(ubus call luci.system-hub collect_diagnostics '{"profile":"performance-problems","include_config":1}' 2>&1)
local success=$(echo "$result" | jsonfilter -e '@.success' 2>/dev/null)
assert_equals "true" "$success" "Collection with profile override succeeds"
local filename=$(echo "$result" | jsonfilter -e '@.file' 2>/dev/null)
assert_contains "$filename" "performance-problems" "Filename contains profile name"
# Cleanup
if [ -n "$filename" ]; then
rm -f "/tmp/system-hub/diagnostics/$filename"
fi
}
# Test 10: All profiles can be retrieved
test_all_profiles_retrievable() {
echo ""
echo "TEST 10: All 5 profiles can be retrieved individually"
echo "======================================================"
local profiles="network-issues performance-problems security-audit wifi-problems full-diagnostic"
for profile in $profiles; do
local result=$(ubus call luci.system-hub get_diagnostic_profile "{\"name\":\"$profile\"}" 2>&1)
local name=$(echo "$result" | jsonfilter -e '@.name' 2>/dev/null)
assert_equals "$profile" "$name" "Profile $profile can be retrieved"
done
}
# Run all tests
echo "========================================"
echo "System Hub Diagnostic Profiles Unit Tests"
echo "========================================"
echo "Starting test run at $(date)"
echo ""
test_list_profiles_json
test_list_profiles_count
test_profile_names
test_get_profile_network
test_get_profile_performance
test_get_profile_invalid
test_collect_with_profile
test_profile_filename_format
test_profile_overrides_flags
test_all_profiles_retrievable
# Summary
echo ""
echo "========================================"
echo "Test Results Summary"
echo "========================================"
echo -e "${GREEN}Passed: $TESTS_PASSED${NC}"
echo -e "${RED}Failed: $TESTS_FAILED${NC}"
echo "Total: $((TESTS_PASSED + TESTS_FAILED))"
echo ""
if [ $TESTS_FAILED -eq 0 ]; then
echo -e "${GREEN}✅ All tests passed!${NC}"
exit 0
else
echo -e "${RED}❌ Some tests failed${NC}"
exit 1
fi