@joystick.js/db-canary 0.0.0-canary.2209
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.build/getFilesToBuild.js +26 -0
- package/.build/getPlatformSafeFilePath.js +6 -0
- package/.build/getPlatformSafePath.js +6 -0
- package/.build/index.js +88 -0
- package/.build/isWindows.js +3 -0
- package/API_KEY +1 -0
- package/README.md +1821 -0
- package/data/data.mdb +0 -0
- package/data/lock.mdb +0 -0
- package/dist/client/database.js +1 -0
- package/dist/client/index.js +1 -0
- package/dist/server/cluster/index.js +1 -0
- package/dist/server/cluster/master.js +20 -0
- package/dist/server/cluster/worker.js +1 -0
- package/dist/server/index.js +1 -0
- package/dist/server/lib/api_key_manager.js +9 -0
- package/dist/server/lib/auth_manager.js +1 -0
- package/dist/server/lib/auto_index_manager.js +1 -0
- package/dist/server/lib/backup_manager.js +1 -0
- package/dist/server/lib/connection_manager.js +1 -0
- package/dist/server/lib/disk_utils.js +2 -0
- package/dist/server/lib/http_server.js +405 -0
- package/dist/server/lib/index_manager.js +1 -0
- package/dist/server/lib/load_settings.js +1 -0
- package/dist/server/lib/logger.js +1 -0
- package/dist/server/lib/op_types.js +1 -0
- package/dist/server/lib/operation_dispatcher.js +1 -0
- package/dist/server/lib/operations/admin.js +1 -0
- package/dist/server/lib/operations/bulk_write.js +1 -0
- package/dist/server/lib/operations/create_index.js +1 -0
- package/dist/server/lib/operations/delete_one.js +1 -0
- package/dist/server/lib/operations/drop_index.js +1 -0
- package/dist/server/lib/operations/find.js +1 -0
- package/dist/server/lib/operations/find_one.js +1 -0
- package/dist/server/lib/operations/get_indexes.js +1 -0
- package/dist/server/lib/operations/insert_one.js +1 -0
- package/dist/server/lib/operations/update_one.js +1 -0
- package/dist/server/lib/performance_monitor.js +1 -0
- package/dist/server/lib/query_engine.js +1 -0
- package/dist/server/lib/recovery_manager.js +1 -0
- package/dist/server/lib/replication_manager.js +1 -0
- package/dist/server/lib/safe_json_parse.js +1 -0
- package/dist/server/lib/send_response.js +1 -0
- package/dist/server/lib/tcp_protocol.js +1 -0
- package/dist/server/lib/write_forwarder.js +1 -0
- package/dist/server/lib/write_queue.js +1 -0
- package/increment_version.js +3 -0
- package/logs/.013e15b54597d05db4b4b53ecc37b10c92a72927-audit.json +20 -0
- package/logs/.02de550a67ea0f5961faa2dfd458a4d06f59ebd1-audit.json +20 -0
- package/logs/.03494ba24eb3c72214b4068a77d54b8993bee651-audit.json +20 -0
- package/logs/.06309ec60b339be1259a7993dd09c732f8907fbc-audit.json +20 -0
- package/logs/.0663a04dcfa17285661e5e1b8cfa51f41523b210-audit.json +20 -0
- package/logs/.0f06e6c4c9b824622729e13927587479e5060391-audit.json +20 -0
- package/logs/.16ccf58682ecb22b3e3ec63f0da1b7fe9be56528-audit.json +20 -0
- package/logs/.1fa1a5d02f496474b1ab473524c65c984146a9ad-audit.json +20 -0
- package/logs/.2223c0ae3bea6f0d62c62b1d319cc8634856abb7-audit.json +20 -0
- package/logs/.23dc79ffda3e083665e6f5993f59397adcbf4a46-audit.json +20 -0
- package/logs/.28104f49b03906b189eefd1cd462cb46c3c0af22-audit.json +20 -0
- package/logs/.29cdbf13808abe6a0ce70ee2f2efdd680ce3fd8e-audit.json +20 -0
- package/logs/.2a9889afd071f77f41f5170d08703a0afca866b7-audit.json +20 -0
- package/logs/.2acec3d1940a2bbed487528b703ee5948959a599-audit.json +20 -0
- package/logs/.2fb60ff326338c02bfedbcd0e936444e4a216750-audit.json +20 -0
- package/logs/.318fc7a19530d76a345f030f7cad00dda15300e7-audit.json +20 -0
- package/logs/.3cf27043e19085f908cedc7701e6d013463208ee-audit.json +25 -0
- package/logs/.3d90d785415817fc443402843b7c95f8371adc9b-audit.json +20 -0
- package/logs/.4074bca620375f72966fc52dfd439577727671e5-audit.json +20 -0
- package/logs/.40eecf018417ea80a70ea8ec7a3cc9406bc6334b-audit.json +20 -0
- package/logs/.50e974f1ef7c365fca6a1251b2e2c2252914cb5e-audit.json +20 -0
- package/logs/.52cb7d9e4223cf26ba36006ac26b949a97c7923c-audit.json +20 -0
- package/logs/.54befcdb84c15aad980705a31bcc9f555c3577ab-audit.json +20 -0
- package/logs/.57dfb70e22eddb84db2e3c0ceeefac5c0b9baffa-audit.json +20 -0
- package/logs/.5f0b24705a1eaad4eca4968f2d86f91b3f9be683-audit.json +20 -0
- package/logs/.61ba98fdda7db58576b382fee07904e5db1169d6-audit.json +20 -0
- package/logs/.6235017727ef6b199d569a99d6aa8c8e80a1b475-audit.json +20 -0
- package/logs/.63db16193699219489d218a1ddea5dde3750cae4-audit.json +20 -0
- package/logs/.64fb67dfe14149c9eef728d79bf30a54da809c60-audit.json +20 -0
- package/logs/.669137453368987c1f311b5345342527afb54e50-audit.json +20 -0
- package/logs/.7a71f8c89ea28ae266d356aeff6306e876a30fbb-audit.json +20 -0
- package/logs/.7afbaa90fe9dc3a7d682676f9bb79f9a1b1fd9a6-audit.json +20 -0
- package/logs/.7ca29e322cd05327035de850099e7610864f2347-audit.json +20 -0
- package/logs/.83335ab3347e449dae03455a110aaf7f120d4802-audit.json +20 -0
- package/logs/.8c2487b5fd445d2c8e5c483c80b9fa99bbf1ca58-audit.json +20 -0
- package/logs/.8c8b9dc386922c9f3b4c13251af7052aac1d24c0-audit.json +20 -0
- package/logs/.8d6155d94640c4863301ae0fee5e4e7372a21446-audit.json +20 -0
- package/logs/.944a3119a243deea7c8270d5d9e582bb1d0eaa10-audit.json +20 -0
- package/logs/.9816a845c30fb2909f3b26a23eeb3538ebcad5db-audit.json +20 -0
- package/logs/.9dc08784e38b865488177c26d4af5934555e0323-audit.json +20 -0
- package/logs/.9dd27d2e0e454ac0a37600206d1cac5493b0d7ee-audit.json +20 -0
- package/logs/.a3d486feeac7654c59b547de96600e8849a06d4f-audit.json +20 -0
- package/logs/.a5b811f4def22250f86cc18870d7c4573625df22-audit.json +20 -0
- package/logs/.a61648eb5f830e0b6f508ac35e4f8f629d2ad4c7-audit.json +20 -0
- package/logs/.a89016d507045771b4b5a65656944a9c0f1e528b-audit.json +20 -0
- package/logs/.a99bee160a1c590be959af46bacc02724803f691-audit.json +20 -0
- package/logs/.ada7906d6243fd7da802f03d86c4ae5dd9df6236-audit.json +20 -0
- package/logs/.b518339ee942143b6af983af167f5bbb6983b4de-audit.json +20 -0
- package/logs/.b51b124b166d53c9519017856ea610d61d65fabe-audit.json +20 -0
- package/logs/.b7a6aee19f58e55633d5e4a3709041c47dfff975-audit.json +20 -0
- package/logs/.bd7a8a6ba9c55d557a4867ab53f02e3ec2e1553d-audit.json +20 -0
- package/logs/.c1435dafe453b169d6392b25065f3cf4ab6fbb21-audit.json +20 -0
- package/logs/.c17e1ce043109f77dc2f0e2aa290a9d1ed842c03-audit.json +20 -0
- package/logs/.ca62637ce9540e5a38a2fbedb2115febb6ad308a-audit.json +15 -0
- package/logs/.ccee67b9c176967f8977071409a41f5cb5cd6ad4-audit.json +20 -0
- package/logs/.db24043417ea79a6f14cd947476399e53930b48d-audit.json +20 -0
- package/logs/.e0f12acccb57829f5f33712bb2e2607ecd808147-audit.json +20 -0
- package/logs/.e9b6cc33d0bbd2e644c4e2bf44d177f850016557-audit.json +20 -0
- package/logs/.f15291d434808e3bdca7963ccd2e73893be027e6-audit.json +20 -0
- package/logs/.f4bdf9e21ef84f8a3fae3ffb32bbc39275991351-audit.json +15 -0
- package/logs/.fbac3aefac1e81b4230df5aa50667cb90d51024f-audit.json +20 -0
- package/logs/.fcfd495c0a9169db243f4a4f21878ee02b76413c-audit.json +20 -0
- package/logs/admin-2025-09-12.log +580 -0
- package/logs/admin-2025-09-15.log +283 -0
- package/logs/admin-error-2025-09-12.log +22 -0
- package/logs/admin-error-2025-09-15.log +10 -0
- package/logs/api_key_manager-2025-09-12.log +658 -0
- package/logs/api_key_manager-2025-09-15.log +295 -0
- package/logs/api_key_manager-error-2025-09-12.log +0 -0
- package/logs/api_key_manager-error-2025-09-15.log +0 -0
- package/logs/auth_manager-2025-09-12.log +4432 -0
- package/logs/auth_manager-2025-09-15.log +2000 -0
- package/logs/auth_manager-error-2025-09-12.log +11 -0
- package/logs/auth_manager-error-2025-09-15.log +5 -0
- package/logs/auto_index_manager-2025-09-12.log +84 -0
- package/logs/auto_index_manager-2025-09-15.log +45 -0
- package/logs/auto_index_manager-error-2025-09-12.log +6 -0
- package/logs/auto_index_manager-error-2025-09-15.log +0 -0
- package/logs/backup_manager-2025-09-12.log +198 -0
- package/logs/backup_manager-2025-09-15.log +90 -0
- package/logs/backup_manager-error-2025-09-12.log +198 -0
- package/logs/backup_manager-error-2025-09-15.log +90 -0
- package/logs/bulk_write-2025-09-12.log +66 -0
- package/logs/bulk_write-2025-09-15.log +38 -0
- package/logs/bulk_write-error-2025-09-12.log +0 -0
- package/logs/bulk_write-error-2025-09-15.log +0 -0
- package/logs/connection_manager-2025-09-12.log +2412 -0
- package/logs/connection_manager-2025-09-15.log +1132 -0
- package/logs/connection_manager-error-2025-09-12.log +0 -0
- package/logs/connection_manager-error-2025-09-15.log +0 -0
- package/logs/create_index-2025-09-12.log +302 -0
- package/logs/create_index-2025-09-15.log +158 -0
- package/logs/create_index-error-2025-09-12.log +30 -0
- package/logs/create_index-error-2025-09-15.log +13 -0
- package/logs/delete_one-2025-09-12.log +73 -0
- package/logs/delete_one-2025-09-15.log +43 -0
- package/logs/delete_one-error-2025-09-12.log +0 -0
- package/logs/delete_one-error-2025-09-15.log +0 -0
- package/logs/disk_utils-2025-09-12.log +4954 -0
- package/logs/disk_utils-2025-09-15.log +2446 -0
- package/logs/disk_utils-error-2025-09-12.log +0 -0
- package/logs/disk_utils-error-2025-09-15.log +0 -0
- package/logs/drop_index-2025-09-12.log +41 -0
- package/logs/drop_index-2025-09-15.log +23 -0
- package/logs/drop_index-error-2025-09-12.log +11 -0
- package/logs/drop_index-error-2025-09-15.log +5 -0
- package/logs/find-2025-09-12.log +1050 -0
- package/logs/find-2025-09-15.log +592 -0
- package/logs/find-error-2025-09-12.log +1 -0
- package/logs/find-error-2025-09-15.log +0 -0
- package/logs/find_one-2025-09-12.log +425 -0
- package/logs/find_one-2025-09-15.log +264 -0
- package/logs/find_one-error-2025-09-12.log +5 -0
- package/logs/find_one-error-2025-09-15.log +0 -0
- package/logs/get_indexes-2025-09-12.log +84 -0
- package/logs/get_indexes-2025-09-15.log +56 -0
- package/logs/get_indexes-error-2025-09-12.log +6 -0
- package/logs/get_indexes-error-2025-09-15.log +0 -0
- package/logs/http_server-2025-09-12.log +2772 -0
- package/logs/http_server-2025-09-15.log +1276 -0
- package/logs/http_server-error-2025-09-12.log +212 -0
- package/logs/http_server-error-2025-09-15.log +44 -0
- package/logs/index_manager-2025-09-12.log +5031 -0
- package/logs/index_manager-2025-09-15.log +2909 -0
- package/logs/index_manager-error-2025-09-12.log +80 -0
- package/logs/index_manager-error-2025-09-15.log +38 -0
- package/logs/insert_one-2025-09-12.log +2181 -0
- package/logs/insert_one-2025-09-15.log +1293 -0
- package/logs/insert_one-error-2025-09-12.log +0 -0
- package/logs/insert_one-error-2025-09-15.log +0 -0
- package/logs/master-2025-09-12.log +1882 -0
- package/logs/master-2025-09-15.log +910 -0
- package/logs/master-error-2025-09-12.log +80 -0
- package/logs/master-error-2025-09-15.log +0 -0
- package/logs/operation_dispatcher-2025-09-12.log +751 -0
- package/logs/operation_dispatcher-2025-09-15.log +359 -0
- package/logs/operation_dispatcher-error-2025-09-12.log +33 -0
- package/logs/operation_dispatcher-error-2025-09-15.log +11 -0
- package/logs/performance_monitor-2025-09-12.log +14889 -0
- package/logs/performance_monitor-2025-09-15.log +6803 -0
- package/logs/performance_monitor-error-2025-09-12.log +0 -0
- package/logs/performance_monitor-error-2025-09-15.log +0 -0
- package/logs/query_engine-2025-09-12.log +5310 -0
- package/logs/query_engine-2025-09-15.log +2639 -0
- package/logs/query_engine-error-2025-09-12.log +0 -0
- package/logs/query_engine-error-2025-09-15.log +0 -0
- package/logs/recovery_manager-2025-09-12.log +462 -0
- package/logs/recovery_manager-2025-09-15.log +210 -0
- package/logs/recovery_manager-error-2025-09-12.log +22 -0
- package/logs/recovery_manager-error-2025-09-15.log +10 -0
- package/logs/replication-2025-09-12.log +1923 -0
- package/logs/replication-2025-09-15.log +917 -0
- package/logs/replication-error-2025-09-12.log +33 -0
- package/logs/replication-error-2025-09-15.log +15 -0
- package/logs/server-2025-09-12.log +2601 -0
- package/logs/server-2025-09-15.log +1191 -0
- package/logs/server-error-2025-09-12.log +0 -0
- package/logs/server-error-2025-09-15.log +0 -0
- package/logs/tcp_protocol-2025-09-12.log +22 -0
- package/logs/tcp_protocol-2025-09-15.log +10 -0
- package/logs/tcp_protocol-error-2025-09-12.log +22 -0
- package/logs/tcp_protocol-error-2025-09-15.log +10 -0
- package/logs/test-2025-09-12.log +0 -0
- package/logs/test-2025-09-15.log +0 -0
- package/logs/test-error-2025-09-12.log +0 -0
- package/logs/test-error-2025-09-15.log +0 -0
- package/logs/update_one-2025-09-12.log +173 -0
- package/logs/update_one-2025-09-15.log +118 -0
- package/logs/update_one-error-2025-09-12.log +0 -0
- package/logs/update_one-error-2025-09-15.log +0 -0
- package/logs/worker-2025-09-12.log +1457 -0
- package/logs/worker-2025-09-15.log +695 -0
- package/logs/worker-error-2025-09-12.log +0 -0
- package/logs/worker-error-2025-09-15.log +0 -0
- package/logs/write_forwarder-2025-09-12.log +1956 -0
- package/logs/write_forwarder-2025-09-15.log +932 -0
- package/logs/write_forwarder-error-2025-09-12.log +66 -0
- package/logs/write_forwarder-error-2025-09-15.log +30 -0
- package/logs/write_queue-2025-09-12.log +612 -0
- package/logs/write_queue-2025-09-15.log +301 -0
- package/logs/write_queue-error-2025-09-12.log +184 -0
- package/logs/write_queue-error-2025-09-15.log +83 -0
- package/package.json +48 -0
- package/prompts/01-core-infrastructure.md +56 -0
- package/prompts/02-secondary-indexing.md +65 -0
- package/prompts/03-write-serialization.md +63 -0
- package/prompts/04-enhanced-authentication.md +75 -0
- package/prompts/05-comprehensive-admin-operations.md +75 -0
- package/prompts/06-backup-and-restore-system.md +106 -0
- package/prompts/07-production-safety-features.md +107 -0
- package/prompts/08-tcp-client-library.md +121 -0
- package/prompts/09-api-method-chaining.md +134 -0
- package/prompts/10-automatic-index-creation.md +223 -0
- package/prompts/11-operation-naming-consistency.md +268 -0
- package/prompts/12-tcp-replication-system.md +333 -0
- package/prompts/13-master-read-write-operations.md +57 -0
- package/prompts/14-index-upsert-operations.md +68 -0
- package/prompts/15-client-api-return-types.md +81 -0
- package/prompts/16-server-setup-ui.md +97 -0
- package/prompts/17-emergency-password-change.md +108 -0
- package/prompts/18-joystick-framework-integration.md +116 -0
- package/prompts/19-api-key-authentication-system.md +137 -0
- package/prompts/20-configurable-server-port.md +105 -0
- package/prompts/21-multi-database-support.md +161 -0
- package/prompts/FULL_TEXT_SEARCH.md +293 -0
- package/prompts/PROMPTS.md +158 -0
- package/prompts/README.md +221 -0
- package/prompts/TYPESCRIPT_GENERATION.md +179 -0
- package/src/client/database.js +166 -0
- package/src/client/index.js +752 -0
- package/src/server/cluster/index.js +53 -0
- package/src/server/cluster/master.js +774 -0
- package/src/server/cluster/worker.js +537 -0
- package/src/server/index.js +540 -0
- package/src/server/lib/api_key_manager.js +473 -0
- package/src/server/lib/auth_manager.js +375 -0
- package/src/server/lib/auto_index_manager.js +681 -0
- package/src/server/lib/backup_manager.js +650 -0
- package/src/server/lib/connection_manager.js +218 -0
- package/src/server/lib/disk_utils.js +118 -0
- package/src/server/lib/http_server.js +1165 -0
- package/src/server/lib/index_manager.js +756 -0
- package/src/server/lib/load_settings.js +143 -0
- package/src/server/lib/logger.js +135 -0
- package/src/server/lib/op_types.js +29 -0
- package/src/server/lib/operation_dispatcher.js +268 -0
- package/src/server/lib/operations/admin.js +808 -0
- package/src/server/lib/operations/bulk_write.js +367 -0
- package/src/server/lib/operations/create_index.js +68 -0
- package/src/server/lib/operations/delete_one.js +114 -0
- package/src/server/lib/operations/drop_index.js +58 -0
- package/src/server/lib/operations/find.js +340 -0
- package/src/server/lib/operations/find_one.js +319 -0
- package/src/server/lib/operations/get_indexes.js +52 -0
- package/src/server/lib/operations/insert_one.js +113 -0
- package/src/server/lib/operations/update_one.js +225 -0
- package/src/server/lib/performance_monitor.js +313 -0
- package/src/server/lib/query_engine.js +243 -0
- package/src/server/lib/recovery_manager.js +388 -0
- package/src/server/lib/replication_manager.js +727 -0
- package/src/server/lib/safe_json_parse.js +21 -0
- package/src/server/lib/send_response.js +47 -0
- package/src/server/lib/tcp_protocol.js +130 -0
- package/src/server/lib/write_forwarder.js +636 -0
- package/src/server/lib/write_queue.js +335 -0
- package/test_data/data.mdb +0 -0
- package/test_data/lock.mdb +0 -0
- package/tests/client/index.test.js +1232 -0
- package/tests/server/cluster/cluster.test.js +248 -0
- package/tests/server/cluster/master_read_write_operations.test.js +577 -0
- package/tests/server/index.test.js +651 -0
- package/tests/server/integration/authentication_integration.test.js +294 -0
- package/tests/server/integration/auto_indexing_integration.test.js +268 -0
- package/tests/server/integration/backup_integration.test.js +513 -0
- package/tests/server/integration/indexing_integration.test.js +126 -0
- package/tests/server/integration/production_safety_integration.test.js +358 -0
- package/tests/server/integration/replication_integration.test.js +227 -0
- package/tests/server/integration/write_serialization_integration.test.js +246 -0
- package/tests/server/lib/api_key_manager.test.js +516 -0
- package/tests/server/lib/auth_manager.test.js +317 -0
- package/tests/server/lib/auto_index_manager.test.js +275 -0
- package/tests/server/lib/backup_manager.test.js +238 -0
- package/tests/server/lib/connection_manager.test.js +221 -0
- package/tests/server/lib/disk_utils.test.js +63 -0
- package/tests/server/lib/http_server.test.js +389 -0
- package/tests/server/lib/index_manager.test.js +301 -0
- package/tests/server/lib/load_settings.test.js +107 -0
- package/tests/server/lib/load_settings_port_config.test.js +243 -0
- package/tests/server/lib/logger.test.js +282 -0
- package/tests/server/lib/operations/admin.test.js +638 -0
- package/tests/server/lib/operations/bulk_write.test.js +128 -0
- package/tests/server/lib/operations/create_index.test.js +138 -0
- package/tests/server/lib/operations/delete_one.test.js +52 -0
- package/tests/server/lib/operations/drop_index.test.js +72 -0
- package/tests/server/lib/operations/find.test.js +93 -0
- package/tests/server/lib/operations/find_one.test.js +91 -0
- package/tests/server/lib/operations/get_indexes.test.js +87 -0
- package/tests/server/lib/operations/insert_one.test.js +42 -0
- package/tests/server/lib/operations/update_one.test.js +89 -0
- package/tests/server/lib/performance_monitor.test.js +185 -0
- package/tests/server/lib/query_engine.test.js +46 -0
- package/tests/server/lib/recovery_manager.test.js +414 -0
- package/tests/server/lib/replication_manager.test.js +202 -0
- package/tests/server/lib/safe_json_parse.test.js +45 -0
- package/tests/server/lib/send_response.test.js +155 -0
- package/tests/server/lib/tcp_protocol.test.js +169 -0
- package/tests/server/lib/write_forwarder.test.js +258 -0
- package/tests/server/lib/write_queue.test.js +255 -0
- package/tsconfig.json +30 -0
- package/types/client/index.d.ts +447 -0
- package/types/server/cluster/index.d.ts +28 -0
- package/types/server/cluster/master.d.ts +115 -0
- package/types/server/cluster/worker.d.ts +1 -0
- package/types/server/lib/auth_manager.d.ts +13 -0
- package/types/server/lib/backup_manager.d.ts +43 -0
- package/types/server/lib/connection_manager.d.ts +15 -0
- package/types/server/lib/disk_utils.d.ts +3 -0
- package/types/server/lib/index_manager.d.ts +24 -0
- package/types/server/lib/load_settings.d.ts +4 -0
- package/types/server/lib/logger.d.ts +44 -0
- package/types/server/lib/op_types.d.ts +6 -0
- package/types/server/lib/performance_monitor.d.ts +68 -0
- package/types/server/lib/query_engine.d.ts +10 -0
- package/types/server/lib/safe_json_parse.d.ts +7 -0
- package/types/server/lib/send_response.d.ts +3 -0
- package/types/server/lib/tcp_protocol.d.ts +12 -0
- package/types/server/lib/write_queue.d.ts +2 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import sinon from 'sinon';
|
|
3
|
+
import {
|
|
4
|
+
get_s3_client,
|
|
5
|
+
test_s3_connection,
|
|
6
|
+
create_backup,
|
|
7
|
+
list_backups,
|
|
8
|
+
restore_backup,
|
|
9
|
+
cleanup_old_backups,
|
|
10
|
+
start_backup_schedule,
|
|
11
|
+
stop_backup_schedule
|
|
12
|
+
} from '../../../src/server/lib/backup_manager.js';
|
|
13
|
+
|
|
14
|
+
test.beforeEach(t => {
|
|
15
|
+
// Mock settings
|
|
16
|
+
t.context.mock_settings = {
|
|
17
|
+
s3: {
|
|
18
|
+
bucket: 'test-bucket',
|
|
19
|
+
region: 'us-east-1',
|
|
20
|
+
access_key: 'test-access-key',
|
|
21
|
+
secret_key: 'test-secret-key',
|
|
22
|
+
endpoint: 'https://s3.amazonaws.com'
|
|
23
|
+
},
|
|
24
|
+
backup_schedule: 'hourly'
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// Mock get_settings
|
|
28
|
+
t.context.get_settings_stub = sinon.stub();
|
|
29
|
+
t.context.get_settings_stub.returns(t.context.mock_settings);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test.afterEach(t => {
|
|
33
|
+
sinon.restore();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('get_s3_client - should initialize S3 client with correct config', t => {
|
|
37
|
+
// This test would need proper mocking of get_settings
|
|
38
|
+
// For now, test that it throws without settings
|
|
39
|
+
t.throws(() => {
|
|
40
|
+
get_s3_client();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('get_s3_client - should throw error when S3 config missing', t => {
|
|
45
|
+
const settings_without_s3 = { port: 1983 };
|
|
46
|
+
|
|
47
|
+
t.throws(() => {
|
|
48
|
+
// This would need proper mocking of get_settings
|
|
49
|
+
get_s3_client();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('get_s3_client - should throw error when required S3 fields missing', t => {
|
|
54
|
+
const incomplete_s3_settings = {
|
|
55
|
+
s3: {
|
|
56
|
+
bucket: 'test-bucket',
|
|
57
|
+
region: 'us-east-1'
|
|
58
|
+
// Missing access_key and secret_key
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
t.throws(() => {
|
|
63
|
+
get_s3_client();
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('test_s3_connection - should test S3 connection successfully', async t => {
|
|
68
|
+
// This test would need proper S3 mocking
|
|
69
|
+
// For now, we'll test the error case
|
|
70
|
+
|
|
71
|
+
await t.throwsAsync(async () => {
|
|
72
|
+
await test_s3_connection();
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test('create_backup - should create backup with proper filename format', async t => {
|
|
77
|
+
// Mock dependencies
|
|
78
|
+
const fs_mock = {
|
|
79
|
+
mkdir: sinon.stub().resolves(),
|
|
80
|
+
rm: sinon.stub().resolves(),
|
|
81
|
+
unlinkSync: sinon.stub(),
|
|
82
|
+
statSync: sinon.stub().returns({ size: 1024 }),
|
|
83
|
+
createReadStream: sinon.stub()
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const spawn_mock = sinon.stub().returns({
|
|
87
|
+
stdout: { on: sinon.stub() },
|
|
88
|
+
stderr: { on: sinon.stub() },
|
|
89
|
+
on: sinon.stub().callsArgWith(1, 0) // Exit code 0
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// This test would need extensive mocking
|
|
93
|
+
await t.throwsAsync(async () => {
|
|
94
|
+
await create_backup();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test('list_backups - should return empty list when no backups exist', async t => {
|
|
99
|
+
// Mock S3 response with no contents
|
|
100
|
+
await t.throwsAsync(async () => {
|
|
101
|
+
await list_backups();
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test('restore_backup - should restore backup successfully', async t => {
|
|
106
|
+
const backup_filename = 'joystickdb-backup-2025-08-31T12-00-00.tar.gz';
|
|
107
|
+
|
|
108
|
+
await t.throwsAsync(async () => {
|
|
109
|
+
await restore_backup(backup_filename);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test('cleanup_old_backups - should delete old backups according to retention policy', async t => {
|
|
114
|
+
await t.throwsAsync(async () => {
|
|
115
|
+
await cleanup_old_backups();
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('start_backup_schedule - should start backup scheduling when S3 configured', t => {
|
|
120
|
+
// Mock timer functions
|
|
121
|
+
const setInterval_stub = sinon.stub(global, 'setInterval');
|
|
122
|
+
|
|
123
|
+
start_backup_schedule();
|
|
124
|
+
|
|
125
|
+
// This would need proper settings mocking
|
|
126
|
+
t.pass();
|
|
127
|
+
|
|
128
|
+
setInterval_stub.restore();
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test('stop_backup_schedule - should stop backup scheduling', t => {
|
|
132
|
+
const clearInterval_stub = sinon.stub(global, 'clearInterval');
|
|
133
|
+
|
|
134
|
+
stop_backup_schedule();
|
|
135
|
+
|
|
136
|
+
t.pass();
|
|
137
|
+
|
|
138
|
+
clearInterval_stub.restore();
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test('backup filename format - should match expected pattern', t => {
|
|
142
|
+
const timestamp = '2025-08-31T12-00-00-000Z';
|
|
143
|
+
const expected_filename = `joystickdb-backup-${timestamp}.tar.gz`;
|
|
144
|
+
|
|
145
|
+
t.regex(expected_filename, /^joystickdb-backup-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}.*\.tar\.gz$/);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test('backup retention policy - should keep correct number of backups', t => {
|
|
149
|
+
const now = new Date('2025-08-31T12:00:00Z');
|
|
150
|
+
|
|
151
|
+
// Mock backups with different ages
|
|
152
|
+
const backups = [
|
|
153
|
+
{ filename: 'backup-1.tar.gz', last_modified: new Date(now.getTime() - 1 * 60 * 60 * 1000).toISOString() }, // 1 hour ago
|
|
154
|
+
{ filename: 'backup-2.tar.gz', last_modified: new Date(now.getTime() - 25 * 60 * 60 * 1000).toISOString() }, // 25 hours ago
|
|
155
|
+
{ filename: 'backup-3.tar.gz', last_modified: new Date(now.getTime() - 31 * 24 * 60 * 60 * 1000).toISOString() } // 31 days ago
|
|
156
|
+
];
|
|
157
|
+
|
|
158
|
+
// Test retention logic
|
|
159
|
+
const one_hour = 60 * 60 * 1000;
|
|
160
|
+
const one_day = 24 * one_hour;
|
|
161
|
+
|
|
162
|
+
const hourly_backups = [];
|
|
163
|
+
const daily_backups = [];
|
|
164
|
+
const to_delete = [];
|
|
165
|
+
|
|
166
|
+
for (const backup of backups) {
|
|
167
|
+
const backup_date = new Date(backup.last_modified);
|
|
168
|
+
const age_ms = now - backup_date;
|
|
169
|
+
|
|
170
|
+
if (age_ms <= 24 * one_hour) {
|
|
171
|
+
hourly_backups.push(backup);
|
|
172
|
+
} else if (age_ms <= 30 * one_day) {
|
|
173
|
+
daily_backups.push(backup);
|
|
174
|
+
} else {
|
|
175
|
+
to_delete.push(backup);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
t.is(hourly_backups.length, 1);
|
|
180
|
+
t.is(daily_backups.length, 1);
|
|
181
|
+
t.is(to_delete.length, 1);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test('S3 endpoint configuration - should handle custom endpoints', t => {
|
|
185
|
+
const custom_endpoint_settings = {
|
|
186
|
+
s3: {
|
|
187
|
+
bucket: 'test-bucket',
|
|
188
|
+
region: 'us-east-1',
|
|
189
|
+
access_key: 'test-key',
|
|
190
|
+
secret_key: 'test-secret',
|
|
191
|
+
endpoint: 'https://minio.example.com'
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
// Test that custom endpoint is different from default
|
|
196
|
+
const default_endpoint = `https://s3.${custom_endpoint_settings.s3.region}.amazonaws.com`;
|
|
197
|
+
t.not(custom_endpoint_settings.s3.endpoint, default_endpoint);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
test('backup checksum calculation - should generate SHA256 hash', async t => {
|
|
201
|
+
// Test that crypto module is available and can create hash
|
|
202
|
+
const crypto = await import('crypto');
|
|
203
|
+
|
|
204
|
+
// Test actual hash creation (without stubbing ES module)
|
|
205
|
+
const hash = crypto.createHash('sha256');
|
|
206
|
+
hash.update('test data');
|
|
207
|
+
const result = hash.digest('hex');
|
|
208
|
+
|
|
209
|
+
t.is(typeof result, 'string');
|
|
210
|
+
t.is(result.length, 64); // SHA256 hex string is 64 characters
|
|
211
|
+
t.regex(result, /^[a-f0-9]{64}$/); // Should be lowercase hex
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
test('backup scheduling intervals - should use correct intervals', t => {
|
|
215
|
+
const schedules = {
|
|
216
|
+
hourly: 60 * 60 * 1000,
|
|
217
|
+
daily: 24 * 60 * 60 * 1000,
|
|
218
|
+
weekly: 7 * 24 * 60 * 60 * 1000
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
t.is(schedules.hourly, 3600000);
|
|
222
|
+
t.is(schedules.daily, 86400000);
|
|
223
|
+
t.is(schedules.weekly, 604800000);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
test('error handling - should handle S3 connection failures gracefully', async t => {
|
|
227
|
+
// Test error handling without actual S3 connection
|
|
228
|
+
await t.throwsAsync(async () => {
|
|
229
|
+
await test_s3_connection();
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
test('temporary file cleanup - should clean up files on failure', async t => {
|
|
234
|
+
// Test that temporary files are cleaned up even when operations fail
|
|
235
|
+
await t.throwsAsync(async () => {
|
|
236
|
+
await create_backup();
|
|
237
|
+
});
|
|
238
|
+
});
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import sinon from 'sinon';
|
|
3
|
+
import { create_connection_manager } from '../../../src/server/lib/connection_manager.js';
|
|
4
|
+
|
|
5
|
+
test.beforeEach((t) => {
|
|
6
|
+
t.context.clock = sinon.useFakeTimers();
|
|
7
|
+
t.context.mock_socket = {
|
|
8
|
+
id: 'test_socket_1',
|
|
9
|
+
destroy: sinon.stub()
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test.afterEach((t) => {
|
|
14
|
+
t.context.clock.restore();
|
|
15
|
+
sinon.restore();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test('create_connection_manager - should create manager with default options', (t) => {
|
|
19
|
+
const manager = create_connection_manager();
|
|
20
|
+
const stats = manager.get_stats();
|
|
21
|
+
|
|
22
|
+
t.is(stats.total_connections, 0);
|
|
23
|
+
t.is(stats.max_connections, 1000);
|
|
24
|
+
t.is(stats.idle_timeout_ms, 10 * 60 * 1000);
|
|
25
|
+
t.is(stats.request_timeout_ms, 5 * 1000);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('create_connection_manager - should create manager with custom options', (t) => {
|
|
29
|
+
const options = {
|
|
30
|
+
max_connections: 500,
|
|
31
|
+
idle_timeout: 5 * 60 * 1000,
|
|
32
|
+
request_timeout: 3 * 1000
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const manager = create_connection_manager(options);
|
|
36
|
+
const stats = manager.get_stats();
|
|
37
|
+
|
|
38
|
+
t.is(stats.max_connections, 500);
|
|
39
|
+
t.is(stats.idle_timeout_ms, 5 * 60 * 1000);
|
|
40
|
+
t.is(stats.request_timeout_ms, 3 * 1000);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test('add_connection - should add connection successfully', (t) => {
|
|
44
|
+
const manager = create_connection_manager();
|
|
45
|
+
const result = manager.add_connection(t.context.mock_socket);
|
|
46
|
+
|
|
47
|
+
t.true(result);
|
|
48
|
+
|
|
49
|
+
const stats = manager.get_stats();
|
|
50
|
+
t.is(stats.total_connections, 1);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('add_connection - should reject connection when limit reached', (t) => {
|
|
54
|
+
const manager = create_connection_manager({ max_connections: 1 });
|
|
55
|
+
|
|
56
|
+
const socket_1 = { id: 'socket_1', destroy: sinon.stub() };
|
|
57
|
+
const socket_2 = { id: 'socket_2', destroy: sinon.stub() };
|
|
58
|
+
|
|
59
|
+
const result_1 = manager.add_connection(socket_1);
|
|
60
|
+
const result_2 = manager.add_connection(socket_2);
|
|
61
|
+
|
|
62
|
+
t.true(result_1);
|
|
63
|
+
t.false(result_2);
|
|
64
|
+
t.true(socket_2.destroy.calledOnce);
|
|
65
|
+
|
|
66
|
+
const stats = manager.get_stats();
|
|
67
|
+
t.is(stats.total_connections, 1);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('remove_connection - should remove connection', (t) => {
|
|
71
|
+
const manager = create_connection_manager();
|
|
72
|
+
manager.add_connection(t.context.mock_socket);
|
|
73
|
+
|
|
74
|
+
let stats = manager.get_stats();
|
|
75
|
+
t.is(stats.total_connections, 1);
|
|
76
|
+
|
|
77
|
+
manager.remove_connection(t.context.mock_socket.id);
|
|
78
|
+
|
|
79
|
+
stats = manager.get_stats();
|
|
80
|
+
t.is(stats.total_connections, 0);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('remove_connection - should handle non-existent connection', (t) => {
|
|
84
|
+
const manager = create_connection_manager();
|
|
85
|
+
|
|
86
|
+
t.notThrows(() => {
|
|
87
|
+
manager.remove_connection('non_existent_id');
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('update_activity - should update connection activity', (t) => {
|
|
92
|
+
const manager = create_connection_manager();
|
|
93
|
+
manager.add_connection(t.context.mock_socket);
|
|
94
|
+
|
|
95
|
+
t.context.clock.tick(5000);
|
|
96
|
+
|
|
97
|
+
t.notThrows(() => {
|
|
98
|
+
manager.update_activity(t.context.mock_socket.id);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test('update_activity - should handle non-existent connection', (t) => {
|
|
103
|
+
const manager = create_connection_manager();
|
|
104
|
+
|
|
105
|
+
t.notThrows(() => {
|
|
106
|
+
manager.update_activity('non_existent_id');
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test('idle timeout - should destroy connection after idle timeout', (t) => {
|
|
111
|
+
const manager = create_connection_manager({ idle_timeout: 1000 });
|
|
112
|
+
manager.add_connection(t.context.mock_socket);
|
|
113
|
+
|
|
114
|
+
let stats = manager.get_stats();
|
|
115
|
+
t.is(stats.total_connections, 1);
|
|
116
|
+
|
|
117
|
+
t.context.clock.tick(1001);
|
|
118
|
+
|
|
119
|
+
t.true(t.context.mock_socket.destroy.calledOnce);
|
|
120
|
+
|
|
121
|
+
stats = manager.get_stats();
|
|
122
|
+
t.is(stats.total_connections, 0);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test('idle timeout - should reset timer on activity', (t) => {
|
|
126
|
+
const manager = create_connection_manager({ idle_timeout: 1000 });
|
|
127
|
+
manager.add_connection(t.context.mock_socket);
|
|
128
|
+
|
|
129
|
+
t.context.clock.tick(500);
|
|
130
|
+
manager.update_activity(t.context.mock_socket.id);
|
|
131
|
+
|
|
132
|
+
t.context.clock.tick(500);
|
|
133
|
+
t.false(t.context.mock_socket.destroy.called);
|
|
134
|
+
|
|
135
|
+
t.context.clock.tick(501);
|
|
136
|
+
t.true(t.context.mock_socket.destroy.calledOnce);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test('create_request_timeout - should create timeout that destroys connection', (t) => {
|
|
140
|
+
const manager = create_connection_manager({ request_timeout: 1000 });
|
|
141
|
+
manager.add_connection(t.context.mock_socket);
|
|
142
|
+
|
|
143
|
+
const timeout = manager.create_request_timeout(t.context.mock_socket.id, 'test_op');
|
|
144
|
+
|
|
145
|
+
t.context.clock.tick(1001);
|
|
146
|
+
|
|
147
|
+
t.true(t.context.mock_socket.destroy.calledOnce);
|
|
148
|
+
|
|
149
|
+
clearTimeout(timeout);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test('create_request_timeout - should handle non-existent connection', (t) => {
|
|
153
|
+
const manager = create_connection_manager({ request_timeout: 1000 });
|
|
154
|
+
|
|
155
|
+
const timeout = manager.create_request_timeout('non_existent_id', 'test_op');
|
|
156
|
+
|
|
157
|
+
t.context.clock.tick(1001);
|
|
158
|
+
|
|
159
|
+
clearTimeout(timeout);
|
|
160
|
+
t.pass();
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test('get_stats - should return accurate statistics', (t) => {
|
|
164
|
+
const manager = create_connection_manager();
|
|
165
|
+
|
|
166
|
+
const socket_1 = { id: 'socket_1', destroy: sinon.stub() };
|
|
167
|
+
const socket_2 = { id: 'socket_2', destroy: sinon.stub() };
|
|
168
|
+
|
|
169
|
+
manager.add_connection(socket_1);
|
|
170
|
+
manager.update_activity(socket_1.id);
|
|
171
|
+
manager.update_activity(socket_1.id);
|
|
172
|
+
|
|
173
|
+
t.context.clock.tick(1000);
|
|
174
|
+
|
|
175
|
+
manager.add_connection(socket_2);
|
|
176
|
+
manager.update_activity(socket_2.id);
|
|
177
|
+
|
|
178
|
+
const stats = manager.get_stats();
|
|
179
|
+
|
|
180
|
+
t.is(stats.total_connections, 2);
|
|
181
|
+
t.is(stats.total_requests, 3);
|
|
182
|
+
t.is(stats.oldest_connection_age_ms, 1000);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test('get_stats - should handle empty connections', (t) => {
|
|
186
|
+
const manager = create_connection_manager();
|
|
187
|
+
const stats = manager.get_stats();
|
|
188
|
+
|
|
189
|
+
t.is(stats.total_connections, 0);
|
|
190
|
+
t.is(stats.total_requests, 0);
|
|
191
|
+
t.is(stats.oldest_connection_age_ms, 0);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
test('shutdown - should destroy all connections', (t) => {
|
|
195
|
+
const manager = create_connection_manager();
|
|
196
|
+
|
|
197
|
+
const socket_1 = { id: 'socket_1', destroy: sinon.stub() };
|
|
198
|
+
const socket_2 = { id: 'socket_2', destroy: sinon.stub() };
|
|
199
|
+
|
|
200
|
+
manager.add_connection(socket_1);
|
|
201
|
+
manager.add_connection(socket_2);
|
|
202
|
+
|
|
203
|
+
let stats = manager.get_stats();
|
|
204
|
+
t.is(stats.total_connections, 2);
|
|
205
|
+
|
|
206
|
+
manager.shutdown();
|
|
207
|
+
|
|
208
|
+
t.true(socket_1.destroy.calledOnce);
|
|
209
|
+
t.true(socket_2.destroy.calledOnce);
|
|
210
|
+
|
|
211
|
+
stats = manager.get_stats();
|
|
212
|
+
t.is(stats.total_connections, 0);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
test('shutdown - should handle empty connections', (t) => {
|
|
216
|
+
const manager = create_connection_manager();
|
|
217
|
+
|
|
218
|
+
t.notThrows(() => {
|
|
219
|
+
manager.shutdown();
|
|
220
|
+
});
|
|
221
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { should_grow_map_size } from '../../../src/server/lib/disk_utils.js';
|
|
3
|
+
|
|
4
|
+
test('should_grow_map_size - should return new size when usage exceeds 80%', (t) => {
|
|
5
|
+
const current_size = 1000;
|
|
6
|
+
const used_size = 850;
|
|
7
|
+
const disk_size = 10000;
|
|
8
|
+
|
|
9
|
+
const result = should_grow_map_size(current_size, used_size, disk_size);
|
|
10
|
+
|
|
11
|
+
t.is(result, 2000);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test('should_grow_map_size - should return null when usage is below 80%', (t) => {
|
|
15
|
+
const current_size = 1000;
|
|
16
|
+
const used_size = 700;
|
|
17
|
+
const disk_size = 10000;
|
|
18
|
+
|
|
19
|
+
const result = should_grow_map_size(current_size, used_size, disk_size);
|
|
20
|
+
|
|
21
|
+
t.is(result, null);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('should_grow_map_size - should cap at 80% of disk size', (t) => {
|
|
25
|
+
const current_size = 1000;
|
|
26
|
+
const used_size = 850;
|
|
27
|
+
const disk_size = 1500;
|
|
28
|
+
|
|
29
|
+
const result = should_grow_map_size(current_size, used_size, disk_size);
|
|
30
|
+
const expected_max = Math.floor(1500 * 0.8);
|
|
31
|
+
|
|
32
|
+
t.is(result, expected_max);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('should_grow_map_size - should return null if already at max', (t) => {
|
|
36
|
+
const disk_size = 1000;
|
|
37
|
+
const current_size = Math.floor(disk_size * 0.8);
|
|
38
|
+
const used_size = current_size * 0.9;
|
|
39
|
+
|
|
40
|
+
const result = should_grow_map_size(current_size, used_size, disk_size);
|
|
41
|
+
|
|
42
|
+
t.is(result, null);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('should_grow_map_size - should handle edge case with zero usage', (t) => {
|
|
46
|
+
const current_size = 1000;
|
|
47
|
+
const used_size = 0;
|
|
48
|
+
const disk_size = 10000;
|
|
49
|
+
|
|
50
|
+
const result = should_grow_map_size(current_size, used_size, disk_size);
|
|
51
|
+
|
|
52
|
+
t.is(result, null);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('should_grow_map_size - should handle exact 80% usage threshold', (t) => {
|
|
56
|
+
const current_size = 1000;
|
|
57
|
+
const used_size = 800;
|
|
58
|
+
const disk_size = 10000;
|
|
59
|
+
|
|
60
|
+
const result = should_grow_map_size(current_size, used_size, disk_size);
|
|
61
|
+
|
|
62
|
+
t.is(result, 2000);
|
|
63
|
+
});
|