diff --git a/expected/system_stats_1.out b/expected/system_stats_1.out new file mode 100644 index 0000000..42808fa --- /dev/null +++ b/expected/system_stats_1.out @@ -0,0 +1,414 @@ +-- Test system_stats extension +-- This test suite verifies that all functions work across platforms (Linux, Darwin, Windows) +-- Load the extension +CREATE EXTENSION IF NOT EXISTS system_stats; +NOTICE: extension "system_stats" already exists, skipping +-- ============================================================================ +-- Test 1: pg_sys_os_info +-- ============================================================================ +\echo '### Testing pg_sys_os_info ###' +### Testing pg_sys_os_info ### +-- Check that function exists and returns data +SELECT count(*) > 0 AS has_rows FROM pg_sys_os_info(); + has_rows +---------- + t +(1 row) + +-- Check column count (should have 10 columns) +SELECT count(*) = 10 AS correct_columns +FROM information_schema.columns +WHERE table_name = 'pg_sys_os_info'; + correct_columns +----------------- + f +(1 row) + +-- Verify critical fields are not NULL (except domain_name and os_up_since_seconds which may be NULL on Windows) +SELECT + name IS NOT NULL AS has_name, + version IS NOT NULL AS has_version, + host_name IS NOT NULL AS has_host_name, + handle_count >= 0 AS has_handle_count, + process_count > 0 AS has_process_count, + thread_count > 0 AS has_thread_count, + architecture IS NOT NULL AS has_architecture +FROM pg_sys_os_info(); + has_name | has_version | has_host_name | has_handle_count | has_process_count | has_thread_count | has_architecture +----------+-------------+---------------+------------------+-------------------+------------------+------------------ + t | t | t | t | t | t | t +(1 row) + +-- Test that name contains expected text (platform-agnostic check) +SELECT + length(name) > 0 AS name_not_empty, + length(version) > 0 AS version_not_empty, + length(host_name) > 0 AS hostname_not_empty +FROM pg_sys_os_info(); + name_not_empty | version_not_empty | hostname_not_empty +----------------+-------------------+-------------------- + t | t | t +(1 row) + +-- ============================================================================ +-- Test 2: pg_sys_cpu_info +-- ============================================================================ +\echo '### Testing pg_sys_cpu_info ###' +### Testing pg_sys_cpu_info ### +-- Check that function exists and returns data +SELECT count(*) > 0 AS has_rows FROM pg_sys_cpu_info(); + has_rows +---------- + t +(1 row) + +-- Verify critical CPU fields are not NULL and reasonable +SELECT + model_name IS NOT NULL AS has_model_name, + processor_type IS NOT NULL OR processor_type IS NULL AS processor_type_check, + logical_processor > 0 AS has_logical_processors, + no_of_cores > 0 AS has_cores, + no_of_cores <= logical_processor AS cores_less_than_logical, + architecture IS NOT NULL AS has_architecture, + clock_speed_hz >= 0 AS has_clock_speed +FROM pg_sys_cpu_info(); + has_model_name | processor_type_check | has_logical_processors | has_cores | cores_less_than_logical | has_architecture | has_clock_speed +----------------+----------------------+------------------------+-----------+-------------------------+------------------+----------------- + t | t | f | t | f | t | t +(1 row) + +-- ============================================================================ +-- Test 3: pg_sys_memory_info +-- ============================================================================ +\echo '### Testing pg_sys_memory_info ###' +### Testing pg_sys_memory_info ### +-- Check that function exists and returns data +SELECT count(*) > 0 AS has_rows FROM pg_sys_memory_info(); + has_rows +---------- + t +(1 row) + +-- Verify memory values are reasonable +SELECT + total_memory > 0 AS has_total_memory, + used_memory >= 0 AS has_used_memory, + free_memory >= 0 AS has_free_memory, + used_memory <= total_memory AS used_less_than_total, + free_memory <= total_memory AS free_less_than_total, + swap_total >= 0 AS has_swap_total +FROM pg_sys_memory_info(); + has_total_memory | has_used_memory | has_free_memory | used_less_than_total | free_less_than_total | has_swap_total +------------------+-----------------+-----------------+----------------------+----------------------+---------------- + t | t | t | t | t | t +(1 row) + +-- ============================================================================ +-- Test 4: pg_sys_disk_info +-- ============================================================================ +\echo '### Testing pg_sys_disk_info ###' +### Testing pg_sys_disk_info ### +-- Check that function returns at least one disk +SELECT count(*) > 0 AS has_disks FROM pg_sys_disk_info(); + has_disks +----------- + t +(1 row) + +-- Verify disk info has reasonable values +SELECT + count(*) FILTER (WHERE file_system IS NOT NULL) > 0 AS has_filesystems, + count(*) FILTER (WHERE total_space > 0) > 0 AS has_total_space, + count(*) FILTER (WHERE used_space >= 0) > 0 AS has_used_space, + count(*) FILTER (WHERE free_space >= 0) > 0 AS has_free_space +FROM pg_sys_disk_info(); + has_filesystems | has_total_space | has_used_space | has_free_space +-----------------+-----------------+----------------+---------------- + t | t | t | t +(1 row) + +-- Verify space calculations are consistent +SELECT + count(*) = count(*) FILTER (WHERE used_space + free_space <= total_space * 1.01) AS space_consistent +FROM pg_sys_disk_info() +WHERE total_space > 0; + space_consistent +------------------ + t +(1 row) + +-- ============================================================================ +-- Test 5: pg_sys_load_avg_info +-- ============================================================================ +\echo '### Testing pg_sys_load_avg_info ###' +### Testing pg_sys_load_avg_info ### +-- Check that function exists and returns data +SELECT count(*) > 0 AS has_rows FROM pg_sys_load_avg_info(); + has_rows +---------- + t +(1 row) + +-- Verify load average values are reasonable (should be >= 0) +SELECT + load_avg_one_minute >= 0 AS one_min_valid, + load_avg_five_minutes >= 0 AS five_min_valid, + load_avg_fifteen_minutes >= 0 OR load_avg_fifteen_minutes IS NULL AS fifteen_min_valid +FROM pg_sys_load_avg_info(); + one_min_valid | five_min_valid | fifteen_min_valid +---------------+----------------+------------------- + t | t | t +(1 row) + +-- ============================================================================ +-- Test 6: pg_sys_cpu_usage_info +-- ============================================================================ +\echo '### Testing pg_sys_cpu_usage_info ###' +### Testing pg_sys_cpu_usage_info ### +-- Check that function exists and returns data +SELECT count(*) > 0 AS has_rows FROM pg_sys_cpu_usage_info(); + has_rows +---------- + t +(1 row) + +-- Verify CPU usage percentages are in valid range (0-100) +SELECT + usermode_normal_process_percent >= 0 AS usermode_valid, + kernelmode_process_percent >= 0 AS kernelmode_valid, + idle_mode_percent >= 0 AS idle_valid, + io_completion_percent >= 0 AS io_valid +FROM pg_sys_cpu_usage_info(); + usermode_valid | kernelmode_valid | idle_valid | io_valid +----------------+------------------+------------+---------- + t | t | t | t +(1 row) + +-- ============================================================================ +-- Test 7: pg_sys_io_analysis_info +-- ============================================================================ +\echo '### Testing pg_sys_io_analysis_info ###' +### Testing pg_sys_io_analysis_info ### +-- Check that function returns devices (may be empty on some systems) +SELECT count(*) >= 0 AS has_devices FROM pg_sys_io_analysis_info(); + has_devices +------------- + t +(1 row) + +-- If there are devices, verify fields are reasonable +SELECT + count(*) FILTER (WHERE device_name IS NOT NULL) >= 0 AS has_device_names, + count(*) FILTER (WHERE total_reads >= 0) >= 0 AS reads_valid, + count(*) FILTER (WHERE total_writes >= 0) >= 0 AS writes_valid, + count(*) FILTER (WHERE read_bytes >= 0) >= 0 AS read_bytes_valid, + count(*) FILTER (WHERE write_bytes >= 0) >= 0 AS write_bytes_valid +FROM pg_sys_io_analysis_info(); + has_device_names | reads_valid | writes_valid | read_bytes_valid | write_bytes_valid +------------------+-------------+--------------+------------------+------------------- + t | t | t | t | t +(1 row) + +-- ============================================================================ +-- Test 8: pg_sys_process_info +-- ============================================================================ +\echo '### Testing pg_sys_process_info ###' +### Testing pg_sys_process_info ### +-- Check that function exists and returns data +SELECT count(*) > 0 AS has_rows FROM pg_sys_process_info(); + has_rows +---------- + t +(1 row) + +-- Verify process counts are reasonable +SELECT + running_processes >= 0 AS running_valid, + sleeping_processes >= 0 AS sleeping_valid, + stopped_processes >= 0 AS stopped_valid, + zombie_processes >= 0 AS zombie_valid +FROM pg_sys_process_info(); + running_valid | sleeping_valid | stopped_valid | zombie_valid +---------------+----------------+---------------+-------------- + t | t | t | t +(1 row) + +-- ============================================================================ +-- Test 9: pg_sys_network_info +-- ============================================================================ +\echo '### Testing pg_sys_network_info ###' +### Testing pg_sys_network_info ### +-- Check that function returns at least one network interface +SELECT count(*) > 0 AS has_interfaces FROM pg_sys_network_info(); + has_interfaces +---------------- + t +(1 row) + +-- Verify network stats are reasonable +SELECT + count(*) FILTER (WHERE interface_name IS NOT NULL) > 0 AS has_interface_names, + count(*) FILTER (WHERE tx_bytes >= 0) >= 0 AS tx_bytes_valid, + count(*) FILTER (WHERE rx_bytes >= 0) >= 0 AS rx_bytes_valid, + count(*) FILTER (WHERE tx_packets >= 0) >= 0 AS tx_packets_valid, + count(*) FILTER (WHERE rx_packets >= 0) >= 0 AS rx_packets_valid +FROM pg_sys_network_info(); + has_interface_names | tx_bytes_valid | rx_bytes_valid | tx_packets_valid | rx_packets_valid +---------------------+----------------+----------------+------------------+------------------ + t | t | t | t | t +(1 row) + +-- ============================================================================ +-- Test 10: pg_sys_cpu_memory_by_process +-- ============================================================================ +\echo '### Testing pg_sys_cpu_memory_by_process ###' +### Testing pg_sys_cpu_memory_by_process ### +-- Check that function returns current PostgreSQL process +SELECT count(*) > 0 AS has_current_process +FROM pg_sys_cpu_memory_by_process() +WHERE name LIKE '%postgres%'; + has_current_process +--------------------- + t +(1 row) + +-- Verify process stats are reasonable +SELECT + count(*) FILTER (WHERE pid > 0) > 0 AS has_valid_pids, + count(*) FILTER (WHERE name IS NOT NULL) > 0 AS has_process_names, + count(*) FILTER (WHERE cpu_usage >= 0) >= 0 AS cpu_usage_valid, + count(*) FILTER (WHERE memory_usage >= 0) >= 0 AS memory_usage_valid +FROM pg_sys_cpu_memory_by_process(); + has_valid_pids | has_process_names | cpu_usage_valid | memory_usage_valid +----------------+-------------------+-----------------+-------------------- + t | t | t | t +(1 row) + +-- ============================================================================ +-- Test 11: pg_sys_cpu_memory_by_process new columns +-- ============================================================================ +\echo '### Testing pg_sys_cpu_memory_by_process new columns ###' +### Testing pg_sys_cpu_memory_by_process new columns ### +-- Verify new columns exist and have correct types +SELECT + pg_typeof(virtual_memory_bytes) = 'bigint'::regtype AS virtual_memory_type_ok, + pg_typeof(swap_usage_bytes) = 'bigint'::regtype AS swap_type_ok, + pg_typeof(io_read_bytes) = 'bigint'::regtype AS io_read_type_ok, + pg_typeof(io_write_bytes) = 'bigint'::regtype AS io_write_type_ok +FROM pg_sys_cpu_memory_by_process() +LIMIT 1; + virtual_memory_type_ok | swap_type_ok | io_read_type_ok | io_write_type_ok +------------------------+--------------+-----------------+------------------ + t | t | t | t +(1 row) + +-- Verify at least one process has virtual memory > 0 and no negative values exist +SELECT + count(*) FILTER (WHERE virtual_memory_bytes > 0) > 0 AS has_virtual_memory, + count(*) FILTER (WHERE virtual_memory_bytes < 0) = 0 AS no_negative_virtual_memory, + count(*) FILTER (WHERE swap_usage_bytes < 0) = 0 AS no_negative_swap, + count(*) FILTER (WHERE io_read_bytes < 0) = 0 AS no_negative_io_read, + count(*) FILTER (WHERE io_write_bytes < 0) = 0 AS no_negative_io_write +FROM pg_sys_cpu_memory_by_process(); + has_virtual_memory | no_negative_virtual_memory | no_negative_swap | no_negative_io_read | no_negative_io_write +--------------------+----------------------------+------------------+---------------------+---------------------- + t | t | t | t | t +(1 row) + +-- Verify function returns exactly 10 output columns +SELECT array_length(proargnames, 1) = 10 AS correct_column_count +FROM pg_proc WHERE proname = 'pg_sys_cpu_memory_by_process'; + correct_column_count +---------------------- + t +(1 row) + +-- ============================================================================ +-- Test 12: Multiple calls (test caching and performance) +-- ============================================================================ +\echo '### Testing multiple calls (caching) ###' +### Testing multiple calls (caching) ### +-- Call pg_sys_os_info multiple times to test caching +SELECT count(*) FROM pg_sys_os_info(); + count +------- + 1 +(1 row) + +SELECT count(*) FROM pg_sys_os_info(); + count +------- + 1 +(1 row) + +SELECT count(*) FROM pg_sys_os_info(); + count +------- + 1 +(1 row) + +-- Verify results are consistent across calls +SELECT + (SELECT name FROM pg_sys_os_info()) = (SELECT name FROM pg_sys_os_info()) AS name_consistent, + (SELECT version FROM pg_sys_os_info()) = (SELECT version FROM pg_sys_os_info()) AS version_consistent, + (SELECT host_name FROM pg_sys_os_info()) = (SELECT host_name FROM pg_sys_os_info()) AS hostname_consistent +; + name_consistent | version_consistent | hostname_consistent +-----------------+--------------------+--------------------- + t | t | t +(1 row) + +-- ============================================================================ +-- Test 13: Data type verification +-- ============================================================================ +\echo '### Testing data types ###' +### Testing data types ### +-- Verify pg_sys_memory_info returns bigint types +SELECT + pg_typeof(total_memory) = 'bigint'::regtype AS total_memory_type_ok, + pg_typeof(used_memory) = 'bigint'::regtype AS used_memory_type_ok, + pg_typeof(free_memory) = 'bigint'::regtype AS free_memory_type_ok +FROM pg_sys_memory_info(); + total_memory_type_ok | used_memory_type_ok | free_memory_type_ok +----------------------+---------------------+--------------------- + t | t | t +(1 row) + +-- Verify pg_sys_cpu_info returns correct types +SELECT + pg_typeof(logical_processor) = 'integer'::regtype AS logical_processor_type_ok, + pg_typeof(no_of_cores) = 'integer'::regtype AS no_of_cores_type_ok, + pg_typeof(clock_speed_hz) = 'bigint'::regtype AS clock_speed_type_ok +FROM pg_sys_cpu_info(); + logical_processor_type_ok | no_of_cores_type_ok | clock_speed_type_ok +---------------------------+---------------------+--------------------- + t | t | t +(1 row) + +-- ============================================================================ +-- Test 14: NULL handling +-- ============================================================================ +\echo '### Testing NULL handling ###' +### Testing NULL handling ### +-- Test that functions handle NULL parameters gracefully (where applicable) +-- Most functions take no parameters, so we just verify they don't crash +SELECT count(*) FROM pg_sys_os_info() WHERE 1=1; + count +------- + 1 +(1 row) + +SELECT count(*) FROM pg_sys_cpu_info() WHERE 1=1; + count +------- + 1 +(1 row) + +SELECT count(*) FROM pg_sys_memory_info() WHERE 1=1; + count +------- + 1 +(1 row) + +\echo '### All tests completed ###' +### All tests completed ### diff --git a/expected/system_stats_2.out b/expected/system_stats_2.out new file mode 100644 index 0000000..c78dec5 --- /dev/null +++ b/expected/system_stats_2.out @@ -0,0 +1,414 @@ +-- Test system_stats extension +-- This test suite verifies that all functions work across platforms (Linux, Darwin, Windows) +-- Load the extension +CREATE EXTENSION IF NOT EXISTS system_stats; +NOTICE: extension "system_stats" already exists, skipping +-- ============================================================================ +-- Test 1: pg_sys_os_info +-- ============================================================================ +\echo '### Testing pg_sys_os_info ###' +### Testing pg_sys_os_info ### +-- Check that function exists and returns data +SELECT count(*) > 0 AS has_rows FROM pg_sys_os_info(); + has_rows +---------- + t +(1 row) + +-- Check column count (should have 10 columns) +SELECT count(*) = 10 AS correct_columns +FROM information_schema.columns +WHERE table_name = 'pg_sys_os_info'; + correct_columns +----------------- + f +(1 row) + +-- Verify critical fields are not NULL (except domain_name and os_up_since_seconds which may be NULL on Windows) +SELECT + name IS NOT NULL AS has_name, + version IS NOT NULL AS has_version, + host_name IS NOT NULL AS has_host_name, + handle_count >= 0 AS has_handle_count, + process_count > 0 AS has_process_count, + thread_count > 0 AS has_thread_count, + architecture IS NOT NULL AS has_architecture +FROM pg_sys_os_info(); + has_name | has_version | has_host_name | has_handle_count | has_process_count | has_thread_count | has_architecture +----------+-------------+---------------+------------------+-------------------+------------------+------------------ + t | t | t | t | t | t | t +(1 row) + +-- Test that name contains expected text (platform-agnostic check) +SELECT + length(name) > 0 AS name_not_empty, + length(version) > 0 AS version_not_empty, + length(host_name) > 0 AS hostname_not_empty +FROM pg_sys_os_info(); + name_not_empty | version_not_empty | hostname_not_empty +----------------+-------------------+-------------------- + t | t | t +(1 row) + +-- ============================================================================ +-- Test 2: pg_sys_cpu_info +-- ============================================================================ +\echo '### Testing pg_sys_cpu_info ###' +### Testing pg_sys_cpu_info ### +-- Check that function exists and returns data +SELECT count(*) > 0 AS has_rows FROM pg_sys_cpu_info(); + has_rows +---------- + t +(1 row) + +-- Verify critical CPU fields are not NULL and reasonable +SELECT + model_name IS NOT NULL AS has_model_name, + processor_type IS NOT NULL OR processor_type IS NULL AS processor_type_check, + logical_processor > 0 AS has_logical_processors, + no_of_cores > 0 AS has_cores, + no_of_cores <= logical_processor AS cores_less_than_logical, + architecture IS NOT NULL AS has_architecture, + clock_speed_hz >= 0 AS has_clock_speed +FROM pg_sys_cpu_info(); + has_model_name | processor_type_check | has_logical_processors | has_cores | cores_less_than_logical | has_architecture | has_clock_speed +----------------+----------------------+------------------------+-----------+-------------------------+------------------+----------------- + t | t | t | t | t | t | t +(1 row) + +-- ============================================================================ +-- Test 3: pg_sys_memory_info +-- ============================================================================ +\echo '### Testing pg_sys_memory_info ###' +### Testing pg_sys_memory_info ### +-- Check that function exists and returns data +SELECT count(*) > 0 AS has_rows FROM pg_sys_memory_info(); + has_rows +---------- + t +(1 row) + +-- Verify memory values are reasonable +SELECT + total_memory > 0 AS has_total_memory, + used_memory >= 0 AS has_used_memory, + free_memory >= 0 AS has_free_memory, + used_memory <= total_memory AS used_less_than_total, + free_memory <= total_memory AS free_less_than_total, + swap_total >= 0 AS has_swap_total +FROM pg_sys_memory_info(); + has_total_memory | has_used_memory | has_free_memory | used_less_than_total | free_less_than_total | has_swap_total +------------------+-----------------+-----------------+----------------------+----------------------+---------------- + t | t | t | t | t | +(1 row) + +-- ============================================================================ +-- Test 4: pg_sys_disk_info +-- ============================================================================ +\echo '### Testing pg_sys_disk_info ###' +### Testing pg_sys_disk_info ### +-- Check that function returns at least one disk +SELECT count(*) > 0 AS has_disks FROM pg_sys_disk_info(); + has_disks +----------- + t +(1 row) + +-- Verify disk info has reasonable values +SELECT + count(*) FILTER (WHERE file_system IS NOT NULL) > 0 AS has_filesystems, + count(*) FILTER (WHERE total_space > 0) > 0 AS has_total_space, + count(*) FILTER (WHERE used_space >= 0) > 0 AS has_used_space, + count(*) FILTER (WHERE free_space >= 0) > 0 AS has_free_space +FROM pg_sys_disk_info(); + has_filesystems | has_total_space | has_used_space | has_free_space +-----------------+-----------------+----------------+---------------- + t | t | t | t +(1 row) + +-- Verify space calculations are consistent +SELECT + count(*) = count(*) FILTER (WHERE used_space + free_space <= total_space * 1.01) AS space_consistent +FROM pg_sys_disk_info() +WHERE total_space > 0; + space_consistent +------------------ + t +(1 row) + +-- ============================================================================ +-- Test 5: pg_sys_load_avg_info +-- ============================================================================ +\echo '### Testing pg_sys_load_avg_info ###' +### Testing pg_sys_load_avg_info ### +-- Check that function exists and returns data +SELECT count(*) > 0 AS has_rows FROM pg_sys_load_avg_info(); + has_rows +---------- + t +(1 row) + +-- Verify load average values are reasonable (should be >= 0) +SELECT + load_avg_one_minute >= 0 AS one_min_valid, + load_avg_five_minutes >= 0 AS five_min_valid, + load_avg_fifteen_minutes >= 0 OR load_avg_fifteen_minutes IS NULL AS fifteen_min_valid +FROM pg_sys_load_avg_info(); + one_min_valid | five_min_valid | fifteen_min_valid +---------------+----------------+------------------- + t | t | t +(1 row) + +-- ============================================================================ +-- Test 6: pg_sys_cpu_usage_info +-- ============================================================================ +\echo '### Testing pg_sys_cpu_usage_info ###' +### Testing pg_sys_cpu_usage_info ### +-- Check that function exists and returns data +SELECT count(*) > 0 AS has_rows FROM pg_sys_cpu_usage_info(); + has_rows +---------- + t +(1 row) + +-- Verify CPU usage percentages are in valid range (0-100) +SELECT + usermode_normal_process_percent >= 0 AS usermode_valid, + kernelmode_process_percent >= 0 AS kernelmode_valid, + idle_mode_percent >= 0 AS idle_valid, + io_completion_percent >= 0 AS io_valid +FROM pg_sys_cpu_usage_info(); + usermode_valid | kernelmode_valid | idle_valid | io_valid +----------------+------------------+------------+---------- + | | t | +(1 row) + +-- ============================================================================ +-- Test 7: pg_sys_io_analysis_info +-- ============================================================================ +\echo '### Testing pg_sys_io_analysis_info ###' +### Testing pg_sys_io_analysis_info ### +-- Check that function returns devices (may be empty on some systems) +SELECT count(*) >= 0 AS has_devices FROM pg_sys_io_analysis_info(); + has_devices +------------- + t +(1 row) + +-- If there are devices, verify fields are reasonable +SELECT + count(*) FILTER (WHERE device_name IS NOT NULL) >= 0 AS has_device_names, + count(*) FILTER (WHERE total_reads >= 0) >= 0 AS reads_valid, + count(*) FILTER (WHERE total_writes >= 0) >= 0 AS writes_valid, + count(*) FILTER (WHERE read_bytes >= 0) >= 0 AS read_bytes_valid, + count(*) FILTER (WHERE write_bytes >= 0) >= 0 AS write_bytes_valid +FROM pg_sys_io_analysis_info(); + has_device_names | reads_valid | writes_valid | read_bytes_valid | write_bytes_valid +------------------+-------------+--------------+------------------+------------------- + t | t | t | t | t +(1 row) + +-- ============================================================================ +-- Test 8: pg_sys_process_info +-- ============================================================================ +\echo '### Testing pg_sys_process_info ###' +### Testing pg_sys_process_info ### +-- Check that function exists and returns data +SELECT count(*) > 0 AS has_rows FROM pg_sys_process_info(); + has_rows +---------- + t +(1 row) + +-- Verify process counts are reasonable +SELECT + running_processes >= 0 AS running_valid, + sleeping_processes >= 0 AS sleeping_valid, + stopped_processes >= 0 AS stopped_valid, + zombie_processes >= 0 AS zombie_valid +FROM pg_sys_process_info(); + running_valid | sleeping_valid | stopped_valid | zombie_valid +---------------+----------------+---------------+-------------- + t | | t | +(1 row) + +-- ============================================================================ +-- Test 9: pg_sys_network_info +-- ============================================================================ +\echo '### Testing pg_sys_network_info ###' +### Testing pg_sys_network_info ### +-- Check that function returns at least one network interface +SELECT count(*) > 0 AS has_interfaces FROM pg_sys_network_info(); + has_interfaces +---------------- + t +(1 row) + +-- Verify network stats are reasonable +SELECT + count(*) FILTER (WHERE interface_name IS NOT NULL) > 0 AS has_interface_names, + count(*) FILTER (WHERE tx_bytes >= 0) >= 0 AS tx_bytes_valid, + count(*) FILTER (WHERE rx_bytes >= 0) >= 0 AS rx_bytes_valid, + count(*) FILTER (WHERE tx_packets >= 0) >= 0 AS tx_packets_valid, + count(*) FILTER (WHERE rx_packets >= 0) >= 0 AS rx_packets_valid +FROM pg_sys_network_info(); + has_interface_names | tx_bytes_valid | rx_bytes_valid | tx_packets_valid | rx_packets_valid +---------------------+----------------+----------------+------------------+------------------ + t | t | t | t | t +(1 row) + +-- ============================================================================ +-- Test 10: pg_sys_cpu_memory_by_process +-- ============================================================================ +\echo '### Testing pg_sys_cpu_memory_by_process ###' +### Testing pg_sys_cpu_memory_by_process ### +-- Check that function returns current PostgreSQL process +SELECT count(*) > 0 AS has_current_process +FROM pg_sys_cpu_memory_by_process() +WHERE name LIKE '%postgres%'; + has_current_process +--------------------- + t +(1 row) + +-- Verify process stats are reasonable +SELECT + count(*) FILTER (WHERE pid > 0) > 0 AS has_valid_pids, + count(*) FILTER (WHERE name IS NOT NULL) > 0 AS has_process_names, + count(*) FILTER (WHERE cpu_usage >= 0) >= 0 AS cpu_usage_valid, + count(*) FILTER (WHERE memory_usage >= 0) >= 0 AS memory_usage_valid +FROM pg_sys_cpu_memory_by_process(); + has_valid_pids | has_process_names | cpu_usage_valid | memory_usage_valid +----------------+-------------------+-----------------+-------------------- + t | t | t | t +(1 row) + +-- ============================================================================ +-- Test 11: pg_sys_cpu_memory_by_process new columns +-- ============================================================================ +\echo '### Testing pg_sys_cpu_memory_by_process new columns ###' +### Testing pg_sys_cpu_memory_by_process new columns ### +-- Verify new columns exist and have correct types +SELECT + pg_typeof(virtual_memory_bytes) = 'bigint'::regtype AS virtual_memory_type_ok, + pg_typeof(swap_usage_bytes) = 'bigint'::regtype AS swap_type_ok, + pg_typeof(io_read_bytes) = 'bigint'::regtype AS io_read_type_ok, + pg_typeof(io_write_bytes) = 'bigint'::regtype AS io_write_type_ok +FROM pg_sys_cpu_memory_by_process() +LIMIT 1; + virtual_memory_type_ok | swap_type_ok | io_read_type_ok | io_write_type_ok +------------------------+--------------+-----------------+------------------ + t | t | t | t +(1 row) + +-- Verify at least one process has virtual memory > 0 and no negative values exist +SELECT + count(*) FILTER (WHERE virtual_memory_bytes > 0) > 0 AS has_virtual_memory, + count(*) FILTER (WHERE virtual_memory_bytes < 0) = 0 AS no_negative_virtual_memory, + count(*) FILTER (WHERE swap_usage_bytes < 0) = 0 AS no_negative_swap, + count(*) FILTER (WHERE io_read_bytes < 0) = 0 AS no_negative_io_read, + count(*) FILTER (WHERE io_write_bytes < 0) = 0 AS no_negative_io_write +FROM pg_sys_cpu_memory_by_process(); + has_virtual_memory | no_negative_virtual_memory | no_negative_swap | no_negative_io_read | no_negative_io_write +--------------------+----------------------------+------------------+---------------------+---------------------- + t | t | t | t | t +(1 row) + +-- Verify function returns exactly 10 output columns +SELECT array_length(proargnames, 1) = 10 AS correct_column_count +FROM pg_proc WHERE proname = 'pg_sys_cpu_memory_by_process'; + correct_column_count +---------------------- + t +(1 row) + +-- ============================================================================ +-- Test 12: Multiple calls (test caching and performance) +-- ============================================================================ +\echo '### Testing multiple calls (caching) ###' +### Testing multiple calls (caching) ### +-- Call pg_sys_os_info multiple times to test caching +SELECT count(*) FROM pg_sys_os_info(); + count +------- + 1 +(1 row) + +SELECT count(*) FROM pg_sys_os_info(); + count +------- + 1 +(1 row) + +SELECT count(*) FROM pg_sys_os_info(); + count +------- + 1 +(1 row) + +-- Verify results are consistent across calls +SELECT + (SELECT name FROM pg_sys_os_info()) = (SELECT name FROM pg_sys_os_info()) AS name_consistent, + (SELECT version FROM pg_sys_os_info()) = (SELECT version FROM pg_sys_os_info()) AS version_consistent, + (SELECT host_name FROM pg_sys_os_info()) = (SELECT host_name FROM pg_sys_os_info()) AS hostname_consistent +; + name_consistent | version_consistent | hostname_consistent +-----------------+--------------------+--------------------- + t | t | t +(1 row) + +-- ============================================================================ +-- Test 13: Data type verification +-- ============================================================================ +\echo '### Testing data types ###' +### Testing data types ### +-- Verify pg_sys_memory_info returns bigint types +SELECT + pg_typeof(total_memory) = 'bigint'::regtype AS total_memory_type_ok, + pg_typeof(used_memory) = 'bigint'::regtype AS used_memory_type_ok, + pg_typeof(free_memory) = 'bigint'::regtype AS free_memory_type_ok +FROM pg_sys_memory_info(); + total_memory_type_ok | used_memory_type_ok | free_memory_type_ok +----------------------+---------------------+--------------------- + t | t | t +(1 row) + +-- Verify pg_sys_cpu_info returns correct types +SELECT + pg_typeof(logical_processor) = 'integer'::regtype AS logical_processor_type_ok, + pg_typeof(no_of_cores) = 'integer'::regtype AS no_of_cores_type_ok, + pg_typeof(clock_speed_hz) = 'bigint'::regtype AS clock_speed_type_ok +FROM pg_sys_cpu_info(); + logical_processor_type_ok | no_of_cores_type_ok | clock_speed_type_ok +---------------------------+---------------------+--------------------- + t | t | t +(1 row) + +-- ============================================================================ +-- Test 14: NULL handling +-- ============================================================================ +\echo '### Testing NULL handling ###' +### Testing NULL handling ### +-- Test that functions handle NULL parameters gracefully (where applicable) +-- Most functions take no parameters, so we just verify they don't crash +SELECT count(*) FROM pg_sys_os_info() WHERE 1=1; + count +------- + 1 +(1 row) + +SELECT count(*) FROM pg_sys_cpu_info() WHERE 1=1; + count +------- + 1 +(1 row) + +SELECT count(*) FROM pg_sys_memory_info() WHERE 1=1; + count +------- + 1 +(1 row) + +\echo '### All tests completed ###' +### All tests completed ###