=== RUN TestResetPasswordCommand_Succeeds --- PASS: TestResetPasswordCommand_Succeeds (0.14s) PASS ok github.com/Wikid82/charon/backend/cmd/api (cached) === RUN TestSeedMain_Smoke {"level":"info","msg":"✓ Database migrated successfully","time":"2025-12-12T19:01:35Z"} {"level":"info","msg":"✓ Created remote server: Local Docker Registry (localhost:5000)","server":"Local Docker Registry","time":"2025-12-12T19:01:35Z"} {"level":"info","msg":"✓ Created remote server: Development API Server (192.168.1.100:8080)","server":"Development API Server","time":"2025-12-12T19:01:35Z"} {"level":"info","msg":"✓ Created remote server: Staging Web App (staging.internal:3000)","server":"Staging Web App","time":"2025-12-12T19:01:35Z"} {"level":"info","msg":"✓ Created remote server: Database Admin (localhost:8081)","server":"Database Admin","time":"2025-12-12T19:01:35Z"} {"host":"app.local.dev","level":"info","msg":"✓ Created proxy host: app.local.dev -\u003e http://localhost:3000","time":"2025-12-12T19:01:35Z"} {"host":"api.local.dev","level":"info","msg":"✓ Created proxy host: api.local.dev -\u003e http://192.168.1.100:8080","time":"2025-12-12T19:01:35Z"} {"host":"docker.local.dev","level":"info","msg":"✓ Created proxy host: docker.local.dev -\u003e http://localhost:5000","time":"2025-12-12T19:01:35Z"} {"level":"info","msg":"✓ Created setting: app_name = Charon","setting":"app_name","time":"2025-12-12T19:01:35Z"} {"level":"info","msg":"✓ Created setting: default_scheme = http","setting":"default_scheme","time":"2025-12-12T19:01:35Z"} {"level":"info","msg":"✓ Created setting: enable_ssl_by_default = false","setting":"enable_ssl_by_default","time":"2025-12-12T19:01:35Z"} 2025/12/12 19:01:35 /projects/Charon/backend/cmd/seed/main.go:218 record not found [0.135ms] [rows:0] SELECT * FROM `users` WHERE email = "admin@localhost" ORDER BY `users`.`id` LIMIT 1 {"level":"info","msg":"✓ Created default user: admin@localhost","time":"2025-12-12T19:01:35Z","user":"admin@localhost"} {"level":"info","msg":"\n✓ Database seeding completed successfully!","time":"2025-12-12T19:01:35Z"} {"level":"info","msg":" You can now start the application and see sample data.","time":"2025-12-12T19:01:35Z"} --- PASS: TestSeedMain_Smoke (0.19s) PASS ok github.com/Wikid82/charon/backend/cmd/seed (cached) ? github.com/Wikid82/charon/backend/integration [no test files] === RUN TestAccessListHandler_SetGeoIPService --- PASS: TestAccessListHandler_SetGeoIPService (0.00s) === RUN TestAccessListHandler_SetGeoIPService_Nil --- PASS: TestAccessListHandler_SetGeoIPService_Nil (0.00s) === RUN TestAccessListHandler_Get_InvalidID --- PASS: TestAccessListHandler_Get_InvalidID (0.00s) === RUN TestAccessListHandler_Update_InvalidID --- PASS: TestAccessListHandler_Update_InvalidID (0.00s) === RUN TestAccessListHandler_Update_InvalidJSON --- PASS: TestAccessListHandler_Update_InvalidJSON (0.00s) === RUN TestAccessListHandler_Delete_InvalidID --- PASS: TestAccessListHandler_Delete_InvalidID (0.00s) === RUN TestAccessListHandler_TestIP_InvalidID --- PASS: TestAccessListHandler_TestIP_InvalidID (0.00s) === RUN TestAccessListHandler_TestIP_MissingIPAddress --- PASS: TestAccessListHandler_TestIP_MissingIPAddress (0.00s) === RUN TestAccessListHandler_List_DBError 2025/12/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:129 no such table: access_lists [0.105ms] [rows:0] SELECT * FROM `access_lists` ORDER BY updated_at desc --- PASS: TestAccessListHandler_List_DBError (0.00s) === RUN TestAccessListHandler_Get_DBError 2025/12/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:105 no such table: access_lists [0.095ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 1 ORDER BY `access_lists`.`id` LIMIT 1 --- PASS: TestAccessListHandler_Get_DBError (0.00s) === RUN TestAccessListHandler_Delete_InternalError 2025/12/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:162 no such table: proxy_hosts [0.329ms] [rows:0] SELECT count(*) FROM `proxy_hosts` WHERE access_list_id = 1 --- PASS: TestAccessListHandler_Delete_InternalError (0.00s) === RUN TestAccessListHandler_Update_InvalidType --- PASS: TestAccessListHandler_Update_InvalidType (0.00s) === RUN TestAccessListHandler_Create_InvalidJSON --- PASS: TestAccessListHandler_Create_InvalidJSON (0.00s) === RUN TestAccessListHandler_TestIP_Blacklist --- PASS: TestAccessListHandler_TestIP_Blacklist (0.00s) === RUN TestAccessListHandler_TestIP_GeoWhitelist --- PASS: TestAccessListHandler_TestIP_GeoWhitelist (0.01s) === RUN TestAccessListHandler_TestIP_LocalNetworkOnly --- PASS: TestAccessListHandler_TestIP_LocalNetworkOnly (0.00s) === RUN TestAccessListHandler_TestIP_InternalError 2025/12/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:105 no such table: access_lists [0.104ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 1 ORDER BY `access_lists`.`id` LIMIT 1 --- PASS: TestAccessListHandler_TestIP_InternalError (0.00s) === RUN TestAccessListHandler_Create === RUN TestAccessListHandler_Create/create_whitelist_successfully === RUN TestAccessListHandler_Create/create_geo_whitelist_successfully === RUN TestAccessListHandler_Create/create_local_network_only === RUN TestAccessListHandler_Create/fail_with_invalid_type === RUN TestAccessListHandler_Create/fail_with_missing_name --- PASS: TestAccessListHandler_Create (0.00s) --- PASS: TestAccessListHandler_Create/create_whitelist_successfully (0.00s) --- PASS: TestAccessListHandler_Create/create_geo_whitelist_successfully (0.00s) --- PASS: TestAccessListHandler_Create/create_local_network_only (0.00s) --- PASS: TestAccessListHandler_Create/fail_with_invalid_type (0.00s) --- PASS: TestAccessListHandler_Create/fail_with_missing_name (0.00s) === RUN TestAccessListHandler_List --- PASS: TestAccessListHandler_List (0.00s) === RUN TestAccessListHandler_Get === RUN TestAccessListHandler_Get/get_existing_ACL === RUN TestAccessListHandler_Get/get_non-existent_ACL 2025/12/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:105 record not found [0.026ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 9999 ORDER BY `access_lists`.`id` LIMIT 1 --- PASS: TestAccessListHandler_Get (0.00s) --- PASS: TestAccessListHandler_Get/get_existing_ACL (0.00s) --- PASS: TestAccessListHandler_Get/get_non-existent_ACL (0.00s) === RUN TestAccessListHandler_Update === RUN TestAccessListHandler_Update/update_successfully === RUN TestAccessListHandler_Update/update_non-existent_ACL 2025/12/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:105 record not found [0.029ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 9999 ORDER BY `access_lists`.`id` LIMIT 1 --- PASS: TestAccessListHandler_Update (0.00s) --- PASS: TestAccessListHandler_Update/update_successfully (0.00s) --- PASS: TestAccessListHandler_Update/update_non-existent_ACL (0.00s) === RUN TestAccessListHandler_Delete === RUN TestAccessListHandler_Delete/delete_successfully === RUN TestAccessListHandler_Delete/fail_to_delete_ACL_in_use === RUN TestAccessListHandler_Delete/delete_non-existent_ACL --- PASS: TestAccessListHandler_Delete (0.00s) --- PASS: TestAccessListHandler_Delete/delete_successfully (0.00s) --- PASS: TestAccessListHandler_Delete/fail_to_delete_ACL_in_use (0.00s) --- PASS: TestAccessListHandler_Delete/delete_non-existent_ACL (0.00s) === RUN TestAccessListHandler_TestIP === RUN TestAccessListHandler_TestIP/test_IP_in_whitelist === RUN TestAccessListHandler_TestIP/test_IP_not_in_whitelist === RUN TestAccessListHandler_TestIP/test_invalid_IP === RUN TestAccessListHandler_TestIP/test_non-existent_ACL 2025/12/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:105 record not found [0.022ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 9999 ORDER BY `access_lists`.`id` LIMIT 1 --- PASS: TestAccessListHandler_TestIP (0.00s) --- PASS: TestAccessListHandler_TestIP/test_IP_in_whitelist (0.00s) --- PASS: TestAccessListHandler_TestIP/test_IP_not_in_whitelist (0.00s) --- PASS: TestAccessListHandler_TestIP/test_invalid_IP (0.00s) --- PASS: TestAccessListHandler_TestIP/test_non-existent_ACL (0.00s) === RUN TestAccessListHandler_GetTemplates --- PASS: TestAccessListHandler_GetTemplates (0.00s) === RUN TestImportHandler_Commit_InvalidJSON --- PASS: TestImportHandler_Commit_InvalidJSON (0.00s) === RUN TestImportHandler_Commit_InvalidSessionUUID 2025/12/12 19:05:33 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found [0.048ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "passwd" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1 --- PASS: TestImportHandler_Commit_InvalidSessionUUID (0.00s) === RUN TestImportHandler_Commit_SessionNotFound 2025/12/12 19:05:33 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found [0.061ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "nonexistent-session" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1 --- PASS: TestImportHandler_Commit_SessionNotFound (0.00s) === RUN TestRemoteServerHandler_TestConnection_Unreachable --- PASS: TestRemoteServerHandler_TestConnection_Unreachable (5.01s) === RUN TestSecurityHandler_GetConfig_InternalError 2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:37 no such table: security_configs [0.041ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_GetConfig_InternalError (0.00s) === RUN TestSecurityHandler_UpdateConfig_ApplyCaddyError 2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.032ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "test" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_UpdateConfig_ApplyCaddyError (0.00s) === RUN TestSecurityHandler_GenerateBreakGlass_Error 2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:121 no such table: security_configs [0.079ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_GenerateBreakGlass_Error (0.06s) === RUN TestSecurityHandler_ListDecisions_Error 2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:178 no such table: security_decisions [0.018ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc LIMIT 50 --- PASS: TestSecurityHandler_ListDecisions_Error (0.00s) === RUN TestSecurityHandler_ListRuleSets_Error 2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:243 no such table: security_rule_sets [0.010ms] [rows:0] SELECT * FROM `security_rule_sets` --- PASS: TestSecurityHandler_ListRuleSets_Error (0.00s) === RUN TestSecurityHandler_UpsertRuleSet_Error 2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:212 no such table: security_rule_sets [0.015ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "test-ruleset" ORDER BY `security_rule_sets`.`id` LIMIT 1 --- PASS: TestSecurityHandler_UpsertRuleSet_Error (0.00s) === RUN TestSecurityHandler_CreateDecision_LogError 2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:168 no such table: security_decisions [0.042ms] [rows:0] INSERT INTO `security_decisions` (`uuid`,`source`,`action`,`ip`,`host`,`rule_id`,`details`,`created_at`) VALUES ("98eeedc9-a1f0-4dbf-b3a2-6558ed7ed345","manual","ban","192.168.1.1","","","","2025-12-12 19:05:38.782") RETURNING `id` --- PASS: TestSecurityHandler_CreateDecision_LogError (0.00s) === RUN TestSecurityHandler_DeleteRuleSet_Error 2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:234 no such table: security_rule_sets [0.015ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE `security_rule_sets`.`id` = 999 ORDER BY `security_rule_sets`.`id` LIMIT 1 --- PASS: TestSecurityHandler_DeleteRuleSet_Error (0.00s) === RUN TestCrowdsec_ImportConfig_EmptyUpload --- PASS: TestCrowdsec_ImportConfig_EmptyUpload (0.00s) === RUN TestBackupHandler_List_DBError --- PASS: TestBackupHandler_List_DBError (0.00s) === RUN TestImportHandler_UploadMulti_InvalidJSON --- PASS: TestImportHandler_UploadMulti_InvalidJSON (0.00s) === RUN TestImportHandler_UploadMulti_MissingCaddyfile --- PASS: TestImportHandler_UploadMulti_MissingCaddyfile (0.00s) === RUN TestImportHandler_UploadMulti_EmptyContent --- PASS: TestImportHandler_UploadMulti_EmptyContent (0.00s) === RUN TestImportHandler_UploadMulti_PathTraversal --- PASS: TestImportHandler_UploadMulti_PathTraversal (0.00s) === RUN TestLogsHandler_Download_PathTraversal --- PASS: TestLogsHandler_Download_PathTraversal (0.00s) === RUN TestLogsHandler_Download_NotFound --- PASS: TestLogsHandler_Download_NotFound (0.00s) === RUN TestLogsHandler_Download_Success --- PASS: TestLogsHandler_Download_Success (0.00s) === RUN TestImportHandler_Upload_InvalidJSON time="2025-12-12T19:05:38Z" level=error msg="Import Upload: failed to bind JSON" error="invalid character 'o' in literal null (expecting 'u')" --- PASS: TestImportHandler_Upload_InvalidJSON (0.00s) === RUN TestImportHandler_Upload_EmptyContent time="2025-12-12T19:05:38Z" level=error msg="Import Upload: failed to bind JSON" error="Key: 'Content' Error:Field validation for 'Content' failed on the 'required' tag" --- PASS: TestImportHandler_Upload_EmptyContent (0.00s) === RUN TestBackupHandler_List_ServiceError --- PASS: TestBackupHandler_List_ServiceError (0.00s) === RUN TestBackupHandler_Delete_PathTraversal --- PASS: TestBackupHandler_Delete_PathTraversal (0.00s) === RUN TestBackupHandler_Delete_InternalError2 --- PASS: TestBackupHandler_Delete_InternalError2 (0.00s) === RUN TestRemoteServerHandler_TestConnection_NotFound2 2025/12/12 19:05:38 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found [0.025ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "nonexistent-uuid" ORDER BY `remote_servers`.`id` LIMIT 1 --- PASS: TestRemoteServerHandler_TestConnection_NotFound2 (0.00s) === RUN TestRemoteServerHandler_TestConnectionCustom_Unreachable2 --- PASS: TestRemoteServerHandler_TestConnectionCustom_Unreachable2 (5.00s) === RUN TestAuthHandler_Register_InvalidJSON --- PASS: TestAuthHandler_Register_InvalidJSON (0.00s) === RUN TestHealthHandler_Basic --- PASS: TestHealthHandler_Basic (0.00s) === RUN TestBackupHandler_Create_Error time="2025-12-12T19:05:43Z" level=error msg="Failed to create backup" action=create_backup error="database file not found: /tmp/TestBackupHandler_Create_Error2570738469/001/data/charon.db" --- PASS: TestBackupHandler_Create_Error (0.00s) === RUN TestSettingsHandler_GetSettings_Error 2025/12/12 19:05:43 /projects/Charon/backend/internal/api/handlers/settings_handler.go:28 no such table: settings [0.016ms] [rows:0] SELECT * FROM `settings` --- PASS: TestSettingsHandler_GetSettings_Error (0.00s) === RUN TestSettingsHandler_UpdateSetting_InvalidJSON --- PASS: TestSettingsHandler_UpdateSetting_InvalidJSON (0.00s) === RUN TestRemoteServerHandler_TestConnection_Reachable --- PASS: TestRemoteServerHandler_TestConnection_Reachable (0.00s) === RUN TestRemoteServerHandler_TestConnection_EmptyHost --- PASS: TestRemoteServerHandler_TestConnection_EmptyHost (0.00s) === RUN TestImportHandler_UploadMulti_ValidCaddyfile time="2025-12-12T19:05:43Z" level=error msg="Import UploadMulti: import failed" error="caddy adapt failed: exec: \"caddy\": executable file not found in $PATH (output: )" mainCaddyfile=Caddyfile preview="example.com { reverse_proxy localhost:8080 }" --- PASS: TestImportHandler_UploadMulti_ValidCaddyfile (0.00s) === RUN TestImportHandler_UploadMulti_SubdirFile time="2025-12-12T19:05:43Z" level=error msg="Import UploadMulti: import failed" error="caddy adapt failed: exec: \"caddy\": executable file not found in $PATH (output: )" mainCaddyfile=Caddyfile preview="import sites/*" --- PASS: TestImportHandler_UploadMulti_SubdirFile (0.00s) === RUN TestAuthHandler_Login --- PASS: TestAuthHandler_Login (0.14s) === RUN TestSetSecureCookie_HTTPS_Strict --- PASS: TestSetSecureCookie_HTTPS_Strict (0.00s) === RUN TestSetSecureCookie_HTTP_Lax --- PASS: TestSetSecureCookie_HTTP_Lax (0.00s) === RUN TestAuthHandler_Login_Errors 2025/12/12 19:05:43 /projects/Charon/backend/internal/services/auth_service.go:64 record not found [0.047ms] [rows:0] SELECT * FROM `users` WHERE email = "nonexistent@example.com" ORDER BY `users`.`id` LIMIT 1 --- PASS: TestAuthHandler_Login_Errors (0.00s) === RUN TestAuthHandler_Register --- PASS: TestAuthHandler_Register (0.07s) === RUN TestAuthHandler_Register_Duplicate 2025/12/12 19:05:44 /projects/Charon/backend/internal/services/auth_service.go:54 UNIQUE constraint failed: users.email [0.303ms] [rows:0] INSERT INTO `users` (`uuid`,`email`,`api_key`,`password_hash`,`name`,`role`,`enabled`,`failed_login_attempts`,`locked_until`,`last_login`,`invite_token`,`invite_expires`,`invited_at`,`invited_by`,`invite_status`,`permission_mode`,`created_at`,`updated_at`) VALUES ("2066b858-15a5-4e3e-a247-328d64408a45","dup@example.com","028e52ea-4eb3-4c1b-b7bd-eab0e113c993","$2a$10$mS9P7qy/pHxKUm7VnmiQhOnc8.OMl/z51Ods7bxSp4CCylswN2nlK","Dup User","user",true,0,NULL,NULL,"",NULL,NULL,NULL,"","allow_all","2025-12-12 19:05:44.028","2025-12-12 19:05:44.028") RETURNING `id` --- PASS: TestAuthHandler_Register_Duplicate (0.07s) === RUN TestAuthHandler_Logout --- PASS: TestAuthHandler_Logout (0.00s) === RUN TestAuthHandler_Me --- PASS: TestAuthHandler_Me (0.00s) === RUN TestAuthHandler_Me_NotFound 2025/12/12 19:05:44 /projects/Charon/backend/internal/services/auth_service.go:147 record not found [0.044ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1 --- PASS: TestAuthHandler_Me_NotFound (0.00s) === RUN TestAuthHandler_ChangePassword --- PASS: TestAuthHandler_ChangePassword (0.26s) === RUN TestAuthHandler_ChangePassword_WrongOld --- PASS: TestAuthHandler_ChangePassword_WrongOld (0.13s) === RUN TestAuthHandler_ChangePassword_Errors --- PASS: TestAuthHandler_ChangePassword_Errors (0.00s) === RUN TestNewAuthHandlerWithDB --- PASS: TestNewAuthHandlerWithDB (0.00s) === RUN TestAuthHandler_Verify_NoCookie --- PASS: TestAuthHandler_Verify_NoCookie (0.00s) === RUN TestAuthHandler_Verify_InvalidToken --- PASS: TestAuthHandler_Verify_InvalidToken (0.00s) === RUN TestAuthHandler_Verify_ValidToken --- PASS: TestAuthHandler_Verify_ValidToken (0.08s) === RUN TestAuthHandler_Verify_BearerToken --- PASS: TestAuthHandler_Verify_BearerToken (0.07s) === RUN TestAuthHandler_Verify_DisabledUser --- PASS: TestAuthHandler_Verify_DisabledUser (0.07s) === RUN TestAuthHandler_Verify_ForwardAuthDenied --- PASS: TestAuthHandler_Verify_ForwardAuthDenied (0.07s) === RUN TestAuthHandler_VerifyStatus_NotAuthenticated --- PASS: TestAuthHandler_VerifyStatus_NotAuthenticated (0.00s) === RUN TestAuthHandler_VerifyStatus_InvalidToken --- PASS: TestAuthHandler_VerifyStatus_InvalidToken (0.00s) === RUN TestAuthHandler_VerifyStatus_Authenticated --- PASS: TestAuthHandler_VerifyStatus_Authenticated (0.07s) === RUN TestAuthHandler_VerifyStatus_DisabledUser --- PASS: TestAuthHandler_VerifyStatus_DisabledUser (0.07s) === RUN TestAuthHandler_GetAccessibleHosts_Unauthorized --- PASS: TestAuthHandler_GetAccessibleHosts_Unauthorized (0.00s) === RUN TestAuthHandler_GetAccessibleHosts_AllowAll --- PASS: TestAuthHandler_GetAccessibleHosts_AllowAll (0.00s) === RUN TestAuthHandler_GetAccessibleHosts_DenyAll --- PASS: TestAuthHandler_GetAccessibleHosts_DenyAll (0.00s) === RUN TestAuthHandler_GetAccessibleHosts_PermittedHosts --- PASS: TestAuthHandler_GetAccessibleHosts_PermittedHosts (0.01s) === RUN TestAuthHandler_GetAccessibleHosts_UserNotFound 2025/12/12 19:05:44 /projects/Charon/backend/internal/api/handlers/auth_handler.go:334 record not found [0.047ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 99999 ORDER BY `users`.`id` LIMIT 1 --- PASS: TestAuthHandler_GetAccessibleHosts_UserNotFound (0.00s) === RUN TestAuthHandler_CheckHostAccess_Unauthorized --- PASS: TestAuthHandler_CheckHostAccess_Unauthorized (0.00s) === RUN TestAuthHandler_CheckHostAccess_InvalidHostID --- PASS: TestAuthHandler_CheckHostAccess_InvalidHostID (0.00s) === RUN TestAuthHandler_CheckHostAccess_Allowed --- PASS: TestAuthHandler_CheckHostAccess_Allowed (0.00s) === RUN TestAuthHandler_CheckHostAccess_Denied --- PASS: TestAuthHandler_CheckHostAccess_Denied (0.00s) === RUN TestBackupHandlerSanitizesFilename --- PASS: TestBackupHandlerSanitizesFilename (0.00s) === RUN TestBackupLifecycle --- PASS: TestBackupLifecycle (0.00s) === RUN TestBackupHandler_Errors --- PASS: TestBackupHandler_Errors (0.00s) === RUN TestBackupHandler_List_Success --- PASS: TestBackupHandler_List_Success (0.00s) === RUN TestBackupHandler_Create_Success --- PASS: TestBackupHandler_Create_Success (0.00s) === RUN TestBackupHandler_Download_Success --- PASS: TestBackupHandler_Download_Success (0.00s) === RUN TestBackupHandler_PathTraversal --- PASS: TestBackupHandler_PathTraversal (0.00s) === RUN TestBackupHandler_Download_InvalidPath --- PASS: TestBackupHandler_Download_InvalidPath (0.00s) === RUN TestBackupHandler_Create_ServiceError --- PASS: TestBackupHandler_Create_ServiceError (0.00s) === RUN TestBackupHandler_Delete_InternalError --- PASS: TestBackupHandler_Delete_InternalError (0.00s) === RUN TestBackupHandler_Restore_InternalError --- PASS: TestBackupHandler_Restore_InternalError (0.00s) === RUN TestCertificateHandler_List_DBError 2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:198 no such table: ssl_certificates [0.166ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE provider LIKE "letsencrypt%" 2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:226 no such table: ssl_certificates [0.013ms] [rows:0] SELECT * FROM `ssl_certificates` 2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:226 no such table: ssl_certificates [0.009ms] [rows:0] SELECT * FROM `ssl_certificates` --- PASS: TestCertificateHandler_List_DBError (0.00s) === RUN TestCertificateHandler_Delete_InvalidID 2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:198 no such table: ssl_certificates [0.024ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE provider LIKE "letsencrypt%" 2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:226 no such table: ssl_certificates [0.009ms] [rows:0] SELECT * FROM `ssl_certificates` --- PASS: TestCertificateHandler_Delete_InvalidID (0.00s) === RUN TestCertificateHandler_Delete_NotFound 2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:410 record not found [0.061ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE `ssl_certificates`.`id` = 9999 ORDER BY `ssl_certificates`.`id` LIMIT 1 --- PASS: TestCertificateHandler_Delete_NotFound (0.00s) === RUN TestCertificateHandler_Delete_NoBackupService 2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:198 no such table: ssl_certificates [0.209ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE provider LIKE "letsencrypt%" 2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:226 no such table: ssl_certificates [0.012ms] [rows:0] SELECT * FROM `ssl_certificates` --- PASS: TestCertificateHandler_Delete_NoBackupService (0.20s) === RUN TestCertificateHandler_Delete_CheckUsageDBError 2025/12/12 19:05:45 /projects/Charon/backend/internal/services/certificate_service.go:392 no such table: proxy_hosts [0.799ms] [rows:0] SELECT count(*) FROM `proxy_hosts` WHERE certificate_id = 1 --- PASS: TestCertificateHandler_Delete_CheckUsageDBError (0.00s) === RUN TestCertificateHandler_List_WithCertificates 2025/12/12 19:05:45 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.411ms] [rows:0] SELECT * FROM `proxy_hosts` --- PASS: TestCertificateHandler_List_WithCertificates (0.00s) === RUN TestCertificateHandler_Delete_RequiresAuth --- PASS: TestCertificateHandler_Delete_RequiresAuth (0.00s) === RUN TestCertificateHandler_List_RequiresAuth --- PASS: TestCertificateHandler_List_RequiresAuth (0.00s) === RUN TestCertificateHandler_Upload_RequiresAuth --- PASS: TestCertificateHandler_Upload_RequiresAuth (0.00s) === RUN TestCertificateHandler_Delete_DiskSpaceCheck --- PASS: TestCertificateHandler_Delete_DiskSpaceCheck (0.00s) === RUN TestCertificateHandler_Delete_NotificationRateLimiting --- PASS: TestCertificateHandler_Delete_NotificationRateLimiting (0.00s) === RUN TestDeleteCertificate_InUse --- PASS: TestDeleteCertificate_InUse (0.00s) === RUN TestDeleteCertificate_CreatesBackup 2025/12/12 19:05:45 /projects/Charon/backend/internal/services/certificate_service.go:441 database table is locked: ssl_certificates [0.059ms] [rows:0] DELETE FROM `ssl_certificates` WHERE id = 1 certificate_handler_test.go:125: expected 200 OK, got 500, body={"error":"failed to delete certificate"} --- FAIL: TestDeleteCertificate_CreatesBackup (0.00s) === RUN TestDeleteCertificate_BackupFailure --- PASS: TestDeleteCertificate_BackupFailure (0.00s) === RUN TestDeleteCertificate_InUse_NoBackup --- PASS: TestDeleteCertificate_InUse_NoBackup (0.00s) === RUN TestCertificateHandler_List --- PASS: TestCertificateHandler_List (0.00s) === RUN TestCertificateHandler_Upload_MissingName --- PASS: TestCertificateHandler_Upload_MissingName (0.00s) === RUN TestCertificateHandler_Upload_MissingCertFile --- PASS: TestCertificateHandler_Upload_MissingCertFile (0.00s) === RUN TestCertificateHandler_Upload_MissingKeyFile --- PASS: TestCertificateHandler_Upload_MissingKeyFile (0.00s) === RUN TestCertificateHandler_Upload_Success --- PASS: TestCertificateHandler_Upload_Success (0.05s) === RUN TestBackupHandlerQuick --- PASS: TestBackupHandlerQuick (0.00s) === RUN TestListPresetsShowsCachedStatus --- PASS: TestListPresetsShowsCachedStatus (0.37s) === RUN TestCacheKeyPersistence --- PASS: TestCacheKeyPersistence (0.00s) === RUN TestListDecisions_Success --- PASS: TestListDecisions_Success (0.00s) === RUN TestListDecisions_EmptyList --- PASS: TestListDecisions_EmptyList (0.00s) === RUN TestListDecisions_CscliError --- PASS: TestListDecisions_CscliError (0.00s) === RUN TestListDecisions_InvalidJSON --- PASS: TestListDecisions_InvalidJSON (0.00s) === RUN TestBanIP_Success --- PASS: TestBanIP_Success (0.00s) === RUN TestBanIP_DefaultDuration --- PASS: TestBanIP_DefaultDuration (0.00s) === RUN TestBanIP_MissingIP --- PASS: TestBanIP_MissingIP (0.00s) === RUN TestBanIP_EmptyIP --- PASS: TestBanIP_EmptyIP (0.00s) === RUN TestBanIP_CscliError --- PASS: TestBanIP_CscliError (0.00s) === RUN TestUnbanIP_Success --- PASS: TestUnbanIP_Success (0.00s) === RUN TestUnbanIP_CscliError --- PASS: TestUnbanIP_CscliError (0.00s) === RUN TestListDecisions_MultipleDecisions --- PASS: TestListDecisions_MultipleDecisions (0.00s) === RUN TestBanIP_InvalidJSON --- PASS: TestBanIP_InvalidJSON (0.00s) === RUN TestDefaultCrowdsecExecutorPidFile --- PASS: TestDefaultCrowdsecExecutorPidFile (0.00s) === RUN TestDefaultCrowdsecExecutorStartStatusStop --- PASS: TestDefaultCrowdsecExecutorStartStatusStop (0.20s) === RUN TestDefaultCrowdsecExecutor_Status_NoPidFile --- PASS: TestDefaultCrowdsecExecutor_Status_NoPidFile (0.00s) === RUN TestDefaultCrowdsecExecutor_Status_InvalidPid --- PASS: TestDefaultCrowdsecExecutor_Status_InvalidPid (0.00s) === RUN TestDefaultCrowdsecExecutor_Status_NonExistentProcess --- PASS: TestDefaultCrowdsecExecutor_Status_NonExistentProcess (0.00s) === RUN TestDefaultCrowdsecExecutor_Stop_NoPidFile --- PASS: TestDefaultCrowdsecExecutor_Stop_NoPidFile (0.00s) === RUN TestDefaultCrowdsecExecutor_Stop_InvalidPid --- PASS: TestDefaultCrowdsecExecutor_Stop_InvalidPid (0.00s) === RUN TestDefaultCrowdsecExecutor_Stop_NonExistentProcess --- PASS: TestDefaultCrowdsecExecutor_Stop_NonExistentProcess (0.00s) === RUN TestDefaultCrowdsecExecutor_Start_InvalidBinary --- PASS: TestDefaultCrowdsecExecutor_Start_InvalidBinary (0.00s) === RUN TestCrowdsec_Start_Error --- PASS: TestCrowdsec_Start_Error (0.00s) === RUN TestCrowdsec_Stop_Error --- PASS: TestCrowdsec_Stop_Error (0.00s) === RUN TestCrowdsec_Status_Error --- PASS: TestCrowdsec_Status_Error (0.00s) === RUN TestCrowdsec_ReadFile_MissingPath --- PASS: TestCrowdsec_ReadFile_MissingPath (0.00s) === RUN TestCrowdsec_ReadFile_PathTraversal --- PASS: TestCrowdsec_ReadFile_PathTraversal (0.00s) === RUN TestCrowdsec_ReadFile_NotFound --- PASS: TestCrowdsec_ReadFile_NotFound (0.00s) === RUN TestCrowdsec_WriteFile_InvalidPayload --- PASS: TestCrowdsec_WriteFile_InvalidPayload (0.00s) === RUN TestCrowdsec_WriteFile_MissingPath --- PASS: TestCrowdsec_WriteFile_MissingPath (0.00s) === RUN TestCrowdsec_WriteFile_PathTraversal --- PASS: TestCrowdsec_WriteFile_PathTraversal (0.00s) === RUN TestCrowdsec_ExportConfig_NotFound --- PASS: TestCrowdsec_ExportConfig_NotFound (0.00s) === RUN TestCrowdsec_ListFiles_EmptyDir --- PASS: TestCrowdsec_ListFiles_EmptyDir (0.00s) === RUN TestCrowdsec_ListFiles_NonExistent --- PASS: TestCrowdsec_ListFiles_NonExistent (0.00s) === RUN TestCrowdsec_ImportConfig_NoFile --- PASS: TestCrowdsec_ImportConfig_NoFile (0.00s) === RUN TestCrowdsec_ReadFile_NestedPath --- PASS: TestCrowdsec_ReadFile_NestedPath (0.00s) === RUN TestCrowdsec_WriteFile_Success --- PASS: TestCrowdsec_WriteFile_Success (0.00s) === RUN TestCrowdsec_ListPresets_Disabled --- PASS: TestCrowdsec_ListPresets_Disabled (0.00s) === RUN TestCrowdsec_ListPresets_Success --- PASS: TestCrowdsec_ListPresets_Success (0.19s) === RUN TestCrowdsec_PullPreset_Validation --- PASS: TestCrowdsec_PullPreset_Validation (0.00s) === RUN TestCrowdsec_ApplyPreset_Validation --- PASS: TestCrowdsec_ApplyPreset_Validation (0.00s) === RUN TestCrowdsecEndpoints --- PASS: TestCrowdsecEndpoints (0.00s) === RUN TestImportConfig --- PASS: TestImportConfig (0.00s) === RUN TestImportCreatesBackup --- PASS: TestImportCreatesBackup (0.00s) === RUN TestExportConfig --- PASS: TestExportConfig (0.00s) === RUN TestListAndReadFile --- PASS: TestListAndReadFile (0.00s) === RUN TestExportConfigStreamsArchive --- PASS: TestExportConfigStreamsArchive (0.00s) === RUN TestWriteFileCreatesBackup --- PASS: TestWriteFileCreatesBackup (0.00s) === RUN TestListPresetsCerberusDisabled --- PASS: TestListPresetsCerberusDisabled (0.00s) === RUN TestReadFileInvalidPath --- PASS: TestReadFileInvalidPath (0.00s) === RUN TestWriteFileInvalidPath --- PASS: TestWriteFileInvalidPath (0.00s) === RUN TestWriteFileMissingPath --- PASS: TestWriteFileMissingPath (0.00s) === RUN TestWriteFileInvalidPayload --- PASS: TestWriteFileInvalidPayload (0.00s) === RUN TestImportConfigRequiresFile --- PASS: TestImportConfigRequiresFile (0.00s) === RUN TestImportConfigRejectsEmptyUpload --- PASS: TestImportConfigRejectsEmptyUpload (0.00s) === RUN TestListFilesMissingDir --- PASS: TestListFilesMissingDir (0.00s) === RUN TestListFilesReturnsEntries --- PASS: TestListFilesReturnsEntries (0.00s) === RUN TestIsCerberusEnabledFromDB --- PASS: TestIsCerberusEnabledFromDB (0.00s) === RUN TestIsCerberusEnabledInvalidEnv --- PASS: TestIsCerberusEnabledInvalidEnv (0.00s) === RUN TestIsCerberusEnabledLegacyEnv --- PASS: TestIsCerberusEnabledLegacyEnv (0.00s) === RUN TestConsoleEnrollDisabled --- PASS: TestConsoleEnrollDisabled (0.00s) === RUN TestConsoleEnrollServiceUnavailable --- PASS: TestConsoleEnrollServiceUnavailable (0.00s) === RUN TestConsoleEnrollInvalidPayload --- PASS: TestConsoleEnrollInvalidPayload (0.00s) === RUN TestConsoleEnrollSuccess 2025/12/12 19:05:46 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found [0.056ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/services/security_service.go:195 no such table: security_audits [0.077ms] [rows:0] INSERT INTO `security_audits` (`uuid`,`actor`,`action`,`details`,`created_at`) VALUES ("6331bcc9-8eb8-427c-8839-ea8b70681f2f","unknown","crowdsec_console_enroll_succeeded","status=enrolled tenant=my-tenant agent=test-agent correlation_id=35cd7e38-b6e0-4cae-9db1-1b9a0e0b3790","2025-12-12 19:05:46.084") RETURNING `id` --- PASS: TestConsoleEnrollSuccess (0.00s) === RUN TestConsoleEnrollMissingAgentName 2025/12/12 19:05:46 /projects/Charon/backend/internal/services/security_service.go:195 no such table: security_audits [0.128ms] [rows:0] INSERT INTO `security_audits` (`uuid`,`actor`,`action`,`details`,`created_at`) VALUES ("67c730e1-fbe5-418e-ac88-16b135d4a3dd","unknown","crowdsec_console_enroll_failed","status= tenant= agent= correlation_id=","2025-12-12 19:05:46.085") RETURNING `id` --- PASS: TestConsoleEnrollMissingAgentName (0.00s) === RUN TestConsoleStatusDisabled --- PASS: TestConsoleStatusDisabled (0.00s) === RUN TestConsoleStatusServiceUnavailable --- PASS: TestConsoleStatusServiceUnavailable (0.00s) === RUN TestConsoleStatusSuccess 2025/12/12 19:05:46 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found [0.032ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1 --- PASS: TestConsoleStatusSuccess (0.00s) === RUN TestConsoleStatusAfterEnroll 2025/12/12 19:05:46 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found [0.051ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/services/security_service.go:195 no such table: security_audits [0.127ms] [rows:0] INSERT INTO `security_audits` (`uuid`,`actor`,`action`,`details`,`created_at`) VALUES ("bcef394b-34a9-4834-9336-2f211122795a","unknown","crowdsec_console_enroll_succeeded","status=enrolled tenant= agent=test-agent correlation_id=30e6cca4-d985-4900-8711-eb46782b995a","2025-12-12 19:05:46.089") RETURNING `id` --- PASS: TestConsoleStatusAfterEnroll (0.00s) === RUN TestIsConsoleEnrollmentEnabledFromDB --- PASS: TestIsConsoleEnrollmentEnabledFromDB (0.00s) === RUN TestIsConsoleEnrollmentDisabledFromDB --- PASS: TestIsConsoleEnrollmentDisabledFromDB (0.00s) === RUN TestIsConsoleEnrollmentEnabledFromEnv --- PASS: TestIsConsoleEnrollmentEnabledFromEnv (0.00s) === RUN TestIsConsoleEnrollmentDisabledFromEnv --- PASS: TestIsConsoleEnrollmentDisabledFromEnv (0.00s) === RUN TestIsConsoleEnrollmentInvalidEnv --- PASS: TestIsConsoleEnrollmentInvalidEnv (0.00s) === RUN TestIsConsoleEnrollmentDefaultDisabled --- PASS: TestIsConsoleEnrollmentDefaultDisabled (0.00s) === RUN TestIsConsoleEnrollmentDBTrueVariants === RUN TestIsConsoleEnrollmentDBTrueVariants/true === RUN TestIsConsoleEnrollmentDBTrueVariants/TRUE === RUN TestIsConsoleEnrollmentDBTrueVariants/True === RUN TestIsConsoleEnrollmentDBTrueVariants/1 === RUN TestIsConsoleEnrollmentDBTrueVariants/yes === RUN TestIsConsoleEnrollmentDBTrueVariants/YES === RUN TestIsConsoleEnrollmentDBTrueVariants/false === RUN TestIsConsoleEnrollmentDBTrueVariants/FALSE === RUN TestIsConsoleEnrollmentDBTrueVariants/0 === RUN TestIsConsoleEnrollmentDBTrueVariants/no --- PASS: TestIsConsoleEnrollmentDBTrueVariants (0.01s) --- PASS: TestIsConsoleEnrollmentDBTrueVariants/true (0.00s) --- PASS: TestIsConsoleEnrollmentDBTrueVariants/TRUE (0.00s) --- PASS: TestIsConsoleEnrollmentDBTrueVariants/True (0.00s) --- PASS: TestIsConsoleEnrollmentDBTrueVariants/1 (0.00s) --- PASS: TestIsConsoleEnrollmentDBTrueVariants/yes (0.00s) --- PASS: TestIsConsoleEnrollmentDBTrueVariants/YES (0.00s) --- PASS: TestIsConsoleEnrollmentDBTrueVariants/false (0.00s) --- PASS: TestIsConsoleEnrollmentDBTrueVariants/FALSE (0.00s) --- PASS: TestIsConsoleEnrollmentDBTrueVariants/0 (0.00s) --- PASS: TestIsConsoleEnrollmentDBTrueVariants/no (0.00s) === RUN TestActorFromContextWithUserID --- PASS: TestActorFromContextWithUserID (0.00s) === RUN TestActorFromContextWithNumericUserID --- PASS: TestActorFromContextWithNumericUserID (0.00s) === RUN TestActorFromContextNoUser --- PASS: TestActorFromContextNoUser (0.00s) === RUN TestTTLRemainingSeconds --- PASS: TestTTLRemainingSeconds (0.00s) === RUN TestTTLRemainingSecondsExpired --- PASS: TestTTLRemainingSecondsExpired (0.00s) === RUN TestTTLRemainingSecondsZeroTime --- PASS: TestTTLRemainingSecondsZeroTime (0.00s) === RUN TestTTLRemainingSecondsZeroTTL --- PASS: TestTTLRemainingSecondsZeroTTL (0.00s) === RUN TestHubEndpointsNil --- PASS: TestHubEndpointsNil (0.00s) === RUN TestHubEndpointsDeduplicates --- PASS: TestHubEndpointsDeduplicates (0.00s) === RUN TestHubEndpointsMultiple --- PASS: TestHubEndpointsMultiple (0.00s) === RUN TestHubEndpointsSkipsEmpty --- PASS: TestHubEndpointsSkipsEmpty (0.00s) === RUN TestGetLAPIDecisions_FallbackToCscli --- PASS: TestGetLAPIDecisions_FallbackToCscli (0.00s) === RUN TestGetLAPIDecisions_EmptyResponse --- PASS: TestGetLAPIDecisions_EmptyResponse (0.00s) === RUN TestCheckLAPIHealth_Handler --- PASS: TestCheckLAPIHealth_Handler (0.00s) === RUN TestGetLAPIKey_FromEnv --- PASS: TestGetLAPIKey_FromEnv (0.00s) === RUN TestGetLAPIKey_Empty --- PASS: TestGetLAPIKey_Empty (0.00s) === RUN TestListPresetsIncludesCacheAndIndex --- PASS: TestListPresetsIncludesCacheAndIndex (0.00s) === RUN TestPullPresetHandlerSuccess --- PASS: TestPullPresetHandlerSuccess (0.00s) === RUN TestApplyPresetHandlerAudits --- PASS: TestApplyPresetHandlerAudits (0.01s) === RUN TestPullPresetHandlerHubError --- PASS: TestPullPresetHandlerHubError (0.00s) === RUN TestPullPresetHandlerTimeout --- PASS: TestPullPresetHandlerTimeout (0.00s) === RUN TestGetCachedPresetNotFound --- PASS: TestGetCachedPresetNotFound (0.00s) === RUN TestGetCachedPresetServiceUnavailable --- PASS: TestGetCachedPresetServiceUnavailable (0.00s) === RUN TestApplyPresetHandlerBackupFailure --- PASS: TestApplyPresetHandlerBackupFailure (0.00s) === RUN TestListPresetsMergesCuratedAndHub --- PASS: TestListPresetsMergesCuratedAndHub (0.00s) === RUN TestGetCachedPresetSuccess --- PASS: TestGetCachedPresetSuccess (0.00s) === RUN TestGetCachedPresetSlugRequired --- PASS: TestGetCachedPresetSlugRequired (0.00s) === RUN TestGetCachedPresetPreviewError --- PASS: TestGetCachedPresetPreviewError (0.00s) === RUN TestPullCuratedPresetSkipsHub --- PASS: TestPullCuratedPresetSkipsHub (0.00s) === RUN TestApplyCuratedPresetSkipsHub --- PASS: TestApplyCuratedPresetSkipsHub (0.00s) === RUN TestPullThenApplyIntegration crowdsec_pull_apply_integration_test.go:67: User pulls preset crowdsec_pull_apply_integration_test.go:83: Pull succeeded, cache_key: test/preset-1765566346 crowdsec_pull_apply_integration_test.go:90: Cache verified, slug: test/preset crowdsec_pull_apply_integration_test.go:93: User applies preset 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/crowdsec_handler.go:725 no such table: crowdsec_preset_events [0.106ms] [rows:0] INSERT INTO `crowdsec_preset_events` (`slug`,`action`,`status`,`cache_key`,`backup_path`,`error`,`created_at`,`updated_at`) VALUES ("test/preset","apply","applied","test/preset-1765566346","/tmp/TestPullThenApplyIntegration3897446452/002.backup.20251212-190546","","2025-12-12 19:05:46.133","2025-12-12 19:05:46.133") RETURNING `id` crowdsec_pull_apply_integration_test.go:109: Apply succeeded, backup: /tmp/TestPullThenApplyIntegration3897446452/002.backup.20251212-190546 --- PASS: TestPullThenApplyIntegration (0.00s) === RUN TestApplyWithoutPullReturnsProperError crowdsec_pull_apply_integration_test.go:138: User tries to apply preset without pulling first 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/crowdsec_handler.go:695 no such table: crowdsec_preset_events [0.178ms] [rows:0] INSERT INTO `crowdsec_preset_events` (`slug`,`action`,`status`,`cache_key`,`backup_path`,`error`,`created_at`,`updated_at`) VALUES ("test/preset","apply","failed","","/tmp/TestApplyWithoutPullReturnsProperError3560971172/002.backup.20251212-190546","load cache for test/preset: load cache for test/preset: cache miss: refresh cache: fetch hub index: http://test.hub/api/index.json: http://test.hub/api/index.json (status 500) https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json: https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 500) https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json: https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 500) https://hub-data.crowdsec.net/api/index.json: https://hub-data.crowdsec.net/api/index.json (status 500)","2025-12-12 19:05:46.134","2025-12-12 19:05:46.134") RETURNING `id` crowdsec_pull_apply_integration_test.go:154: Proper error message returned: Preset cache missing or expired. Pull the preset again, then retry apply. --- PASS: TestApplyWithoutPullReturnsProperError (0.00s) === RUN TestApplyRollbackWhenCacheMissingAndRepullFails 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/crowdsec_handler.go:695 no such table: crowdsec_preset_events [0.099ms] [rows:0] INSERT INTO `crowdsec_preset_events` (`slug`,`action`,`status`,`cache_key`,`backup_path`,`error`,`created_at`,`updated_at`) VALUES ("missing/preset","apply","failed","","/tmp/TestApplyRollbackWhenCacheMissingAndRepullFails4135574716/002/crowdsec.backup.20251212-190546","load cache for missing/preset: load cache for missing/preset: cache miss: refresh cache: fetch hub index: http://test.hub/api/index.json: http://test.hub/api/index.json (status 500) https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json: https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 500) https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json: https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 500) https://hub-data.crowdsec.net/api/index.json: https://hub-data.crowdsec.net/api/index.json (status 500)","2025-12-12 19:05:46.136","2025-12-12 19:05:46.136") RETURNING `id` --- PASS: TestApplyRollbackWhenCacheMissingAndRepullFails (0.00s) === RUN TestDockerHandler_ListContainers --- PASS: TestDockerHandler_ListContainers (0.00s) === RUN TestDockerHandler_ListContainers_NonExistentServerID 2025/12/12 19:05:46 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found [0.027ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent-uuid" ORDER BY `remote_servers`.`id` LIMIT 1 --- PASS: TestDockerHandler_ListContainers_NonExistentServerID (0.00s) === RUN TestDockerHandler_ListContainers_WithServerID --- PASS: TestDockerHandler_ListContainers_WithServerID (0.00s) === RUN TestDockerHandler_ListContainers_WithHostQuery --- PASS: TestDockerHandler_ListContainers_WithHostQuery (0.00s) === RUN TestDockerHandler_RegisterRoutes --- PASS: TestDockerHandler_RegisterRoutes (0.00s) === RUN TestDockerHandler_NewDockerHandler --- PASS: TestDockerHandler_NewDockerHandler (0.00s) === RUN TestDomainLifecycle --- PASS: TestDomainLifecycle (0.00s) === RUN TestDomainErrors --- PASS: TestDomainErrors (0.00s) === RUN TestDomainDelete_NotFound 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/domain_handler.go:73 record not found [0.038ms] [rows:0] SELECT * FROM `domains` WHERE uuid = "nonexistent-uuid" AND `domains`.`deleted_at` IS NULL ORDER BY `domains`.`id` LIMIT 1 --- PASS: TestDomainDelete_NotFound (0.00s) === RUN TestDomainCreate_Duplicate 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/domain_handler.go:49 UNIQUE constraint failed: domains.name [0.087ms] [rows:0] INSERT INTO `domains` (`uuid`,`name`,`created_at`,`updated_at`,`deleted_at`) VALUES ("30ded0b1-7423-4851-95fb-9c48e4a9bb59","duplicate.com","2025-12-12 19:05:46.158","2025-12-12 19:05:46.158",NULL) RETURNING `id` --- PASS: TestDomainCreate_Duplicate (0.00s) === RUN TestDomainList_Empty --- PASS: TestDomainList_Empty (0.00s) === RUN TestDomainCreate_LongName --- PASS: TestDomainCreate_LongName (0.00s) === RUN TestFeatureFlagsHandler_GetFlags_DBPrecedence 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestFeatureFlagsHandler_GetFlags_DBPrecedence (0.00s) === RUN TestFeatureFlagsHandler_GetFlags_EnvFallback 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.031ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.036ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.031ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestFeatureFlagsHandler_GetFlags_EnvFallback (0.00s) === RUN TestFeatureFlagsHandler_GetFlags_EnvShortForm 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.032ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestFeatureFlagsHandler_GetFlags_EnvShortForm (0.00s) === RUN TestFeatureFlagsHandler_GetFlags_EnvNumeric 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestFeatureFlagsHandler_GetFlags_EnvNumeric (0.00s) === RUN TestFeatureFlagsHandler_GetFlags_DefaultTrue 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.047ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestFeatureFlagsHandler_GetFlags_DefaultTrue (0.00s) === RUN TestFeatureFlagsHandler_GetFlags_AllDefaultFlagsPresent 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestFeatureFlagsHandler_GetFlags_AllDefaultFlagsPresent (0.00s) === RUN TestFeatureFlagsHandler_UpdateFlags_Success --- PASS: TestFeatureFlagsHandler_UpdateFlags_Success (0.00s) === RUN TestFeatureFlagsHandler_UpdateFlags_Upsert --- PASS: TestFeatureFlagsHandler_UpdateFlags_Upsert (0.00s) === RUN TestFeatureFlagsHandler_UpdateFlags_InvalidJSON --- PASS: TestFeatureFlagsHandler_UpdateFlags_InvalidJSON (0.00s) === RUN TestFeatureFlagsHandler_UpdateFlags_OnlyAllowedKeys 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler_coverage_test.go:296 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.invalid.key" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestFeatureFlagsHandler_UpdateFlags_OnlyAllowedKeys (0.00s) === RUN TestFeatureFlagsHandler_UpdateFlags_EmptyPayload --- PASS: TestFeatureFlagsHandler_UpdateFlags_EmptyPayload (0.00s) === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/lowercase_true 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.034ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/uppercase_TRUE 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.040ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/mixed_case_True 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/numeric_1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.035ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/yes 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.044ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/YES_uppercase 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.055ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/lowercase_false 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.038ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/numeric_0 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/no 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/empty_string 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/random_string 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.362ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.047ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/whitespace_padded_true 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.030ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.030ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/whitespace_padded_false 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.031ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants (0.01s) --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/lowercase_true (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/uppercase_TRUE (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/mixed_case_True (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/numeric_1 (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/yes (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/YES_uppercase (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/lowercase_false (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/numeric_0 (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/no (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/empty_string (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/random_string (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/whitespace_padded_true (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/whitespace_padded_false (0.00s) === RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants === RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/true_string 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.047ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/TRUE_uppercase 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/1_numeric 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/false_string 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/FALSE_uppercase 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/0_numeric 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 === RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/invalid_value_defaults_to_numeric_check 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/true_string (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/TRUE_uppercase (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/1_numeric (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/false_string (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/FALSE_uppercase (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/0_numeric (0.00s) --- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/invalid_value_defaults_to_numeric_check (0.00s) === RUN TestFeatureFlagsHandler_UpdateFlags_BoolValues === RUN TestFeatureFlagsHandler_UpdateFlags_BoolValues/true === RUN TestFeatureFlagsHandler_UpdateFlags_BoolValues/false --- PASS: TestFeatureFlagsHandler_UpdateFlags_BoolValues (0.00s) --- PASS: TestFeatureFlagsHandler_UpdateFlags_BoolValues/true (0.00s) --- PASS: TestFeatureFlagsHandler_UpdateFlags_BoolValues/false (0.00s) === RUN TestFeatureFlagsHandler_NewFeatureFlagsHandler --- PASS: TestFeatureFlagsHandler_NewFeatureFlagsHandler (0.00s) === RUN TestFeatureFlags_GetAndUpdate 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.030ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.053ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestFeatureFlags_GetAndUpdate (0.00s) === RUN TestFeatureFlags_EnvFallback 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 no such table: settings [0.056ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 no such table: settings [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 no such table: settings [0.005ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestFeatureFlags_EnvFallback (0.00s) === RUN TestHealthHandler --- PASS: TestHealthHandler (0.00s) === RUN TestGetLocalIP health_handler_test.go:36: getLocalIP returned: "217.15.170.144" --- PASS: TestGetLocalIP (0.00s) === RUN TestIsSafePathUnderBase --- PASS: TestIsSafePathUnderBase (0.00s) === RUN TestImportUploadSanitizesFilename --- PASS: TestImportUploadSanitizesFilename (0.00s) === RUN TestLogsHandler_Read_FilterBySearch --- PASS: TestLogsHandler_Read_FilterBySearch (0.00s) === RUN TestLogsHandler_Read_FilterByHost --- PASS: TestLogsHandler_Read_FilterByHost (0.00s) === RUN TestLogsHandler_Read_FilterByLevel --- PASS: TestLogsHandler_Read_FilterByLevel (0.00s) === RUN TestLogsHandler_Read_FilterByStatus --- PASS: TestLogsHandler_Read_FilterByStatus (0.00s) === RUN TestLogsHandler_Read_SortAsc --- PASS: TestLogsHandler_Read_SortAsc (0.00s) === RUN TestLogsHandler_List_DirectoryIsFile --- PASS: TestLogsHandler_List_DirectoryIsFile (0.00s) === RUN TestLogsHandler_Download_TempFileError --- PASS: TestLogsHandler_Download_TempFileError (0.00s) === RUN TestLogsLifecycle --- PASS: TestLogsLifecycle (0.00s) === RUN TestLogsHandler_PathTraversal --- PASS: TestLogsHandler_PathTraversal (0.00s) === RUN TestLogsWebSocketHandler_SuccessfulConnection --- PASS: TestLogsWebSocketHandler_SuccessfulConnection (0.00s) === RUN TestLogsWebSocketHandler_ReceiveLogEntries --- PASS: TestLogsWebSocketHandler_ReceiveLogEntries (0.00s) === RUN TestLogsWebSocketHandler_LevelFilter --- PASS: TestLogsWebSocketHandler_LevelFilter (0.15s) === RUN TestLogsWebSocketHandler_SourceFilter --- PASS: TestLogsWebSocketHandler_SourceFilter (0.00s) === RUN TestLogsWebSocketHandler_CombinedFilters --- PASS: TestLogsWebSocketHandler_CombinedFilters (0.00s) === RUN TestLogsWebSocketHandler_CaseInsensitiveFilters --- PASS: TestLogsWebSocketHandler_CaseInsensitiveFilters (0.00s) === RUN TestLogsWebSocketHandler_UpgradeFailure --- PASS: TestLogsWebSocketHandler_UpgradeFailure (0.00s) === RUN TestLogsWebSocketHandler_ClientDisconnect --- PASS: TestLogsWebSocketHandler_ClientDisconnect (0.02s) === RUN TestLogsWebSocketHandler_ChannelClosed --- PASS: TestLogsWebSocketHandler_ChannelClosed (0.00s) === RUN TestLogsWebSocketHandler_MultipleConnections --- PASS: TestLogsWebSocketHandler_MultipleConnections (0.00s) === RUN TestLogsWebSocketHandler_HighVolumeLogging --- PASS: TestLogsWebSocketHandler_HighVolumeLogging (0.02s) === RUN TestLogsWebSocketHandler_EmptyLogFields --- PASS: TestLogsWebSocketHandler_EmptyLogFields (0.00s) === RUN TestLogsWebSocketHandler_SubscriberIDUniqueness --- PASS: TestLogsWebSocketHandler_SubscriberIDUniqueness (0.00s) === RUN TestLogsWebSocketHandler_WithRealLogger --- PASS: TestLogsWebSocketHandler_WithRealLogger (0.00s) === RUN TestLogsWebSocketHandler_ConnectionLifecycle --- PASS: TestLogsWebSocketHandler_ConnectionLifecycle (0.00s) === RUN TestDomainHandler_List_Error 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/domain_handler.go:28 no such table: domains [0.030ms] [rows:0] SELECT * FROM `domains` WHERE `domains`.`deleted_at` IS NULL ORDER BY name asc --- PASS: TestDomainHandler_List_Error (0.00s) === RUN TestDomainHandler_Create_InvalidJSON --- PASS: TestDomainHandler_Create_InvalidJSON (0.00s) === RUN TestDomainHandler_Create_DBError 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/domain_handler.go:49 no such table: domains [0.068ms] [rows:0] INSERT INTO `domains` (`uuid`,`name`,`created_at`,`updated_at`,`deleted_at`) VALUES ("078a32f2-b134-4709-9687-40e22ddc4715","example.com","2025-12-12 19:05:46.4","2025-12-12 19:05:46.4",NULL) RETURNING `id` --- PASS: TestDomainHandler_Create_DBError (0.00s) === RUN TestDomainHandler_Delete_Error 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/domain_handler.go:73 no such table: domains [0.027ms] [rows:0] SELECT * FROM `domains` WHERE uuid = "test-id" AND `domains`.`deleted_at` IS NULL ORDER BY `domains`.`id` LIMIT 1 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/domain_handler.go:88 no such table: domains [0.065ms] [rows:0] UPDATE `domains` SET `deleted_at`="2025-12-12 19:05:46.401" WHERE uuid = "test-id" AND `domains`.`deleted_at` IS NULL --- PASS: TestDomainHandler_Delete_Error (0.00s) === RUN TestRemoteServerHandler_List_Error 2025/12/12 19:05:46 /projects/Charon/backend/internal/services/remoteserver_service.go:92 no such table: remote_servers [0.018ms] [rows:0] SELECT * FROM `remote_servers` ORDER BY name ASC --- PASS: TestRemoteServerHandler_List_Error (0.00s) === RUN TestRemoteServerHandler_List_EnabledOnly 2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/misc_coverage_test.go:131 UNIQUE constraint failed: remote_servers.uuid [0.041ms] [rows:0] INSERT INTO `remote_servers` (`uuid`,`name`,`provider`,`host`,`port`,`scheme`,`tags`,`description`,`enabled`,`last_checked`,`reachable`,`created_at`,`updated_at`) VALUES ("","Server2","","localhost",22,"","","",true,NULL,false,"2025-12-12 19:05:46.402","2025-12-12 19:05:46.402") RETURNING `id` --- PASS: TestRemoteServerHandler_List_EnabledOnly (0.00s) === RUN TestRemoteServerHandler_Update_NotFound 2025/12/12 19:05:46 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found [0.022ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "nonexistent" ORDER BY `remote_servers`.`id` LIMIT 1 --- PASS: TestRemoteServerHandler_Update_NotFound (0.00s) === RUN TestRemoteServerHandler_Update_InvalidJSON --- PASS: TestRemoteServerHandler_Update_InvalidJSON (0.00s) === RUN TestRemoteServerHandler_TestConnection_NotFound 2025/12/12 19:05:46 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found [0.021ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "nonexistent" ORDER BY `remote_servers`.`id` LIMIT 1 --- PASS: TestRemoteServerHandler_TestConnection_NotFound (0.00s) === RUN TestRemoteServerHandler_TestConnectionCustom_InvalidJSON --- PASS: TestRemoteServerHandler_TestConnectionCustom_InvalidJSON (0.00s) === RUN TestRemoteServerHandler_TestConnectionCustom_Unreachable --- PASS: TestRemoteServerHandler_TestConnectionCustom_Unreachable (5.00s) === RUN TestUptimeHandler_List_Error 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/uptime_service.go:863 no such table: uptime_monitors [0.020ms] [rows:0] SELECT * FROM `uptime_monitors` ORDER BY name ASC --- PASS: TestUptimeHandler_List_Error (0.00s) === RUN TestUptimeHandler_GetHistory_Error 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/uptime_service.go:877 no such table: uptime_heartbeats [0.038ms] [rows:0] SELECT * FROM `uptime_heartbeats` WHERE monitor_id = "test-id" ORDER BY created_at desc LIMIT 50 --- PASS: TestUptimeHandler_GetHistory_Error (0.00s) === RUN TestUptimeHandler_Update_InvalidJSON --- PASS: TestUptimeHandler_Update_InvalidJSON (0.00s) === RUN TestUptimeHandler_Sync_Error 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/uptime_service.go:105 no such table: proxy_hosts [0.271ms] [rows:0] SELECT * FROM `proxy_hosts` --- PASS: TestUptimeHandler_Sync_Error (0.00s) === RUN TestUptimeHandler_Delete_Error 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/uptime_service.go:911 no such table: uptime_monitors [0.012ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "test-id" ORDER BY `uptime_monitors`.`id` LIMIT 1 --- PASS: TestUptimeHandler_Delete_Error (0.00s) === RUN TestUptimeHandler_CheckMonitor_NotFound 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/uptime_service.go:869 record not found [0.032ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "nonexistent" ORDER BY `uptime_monitors`.`id` LIMIT 1 --- PASS: TestUptimeHandler_CheckMonitor_NotFound (0.00s) === RUN TestNotificationHandler_List_Error 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:66 no such table: notifications [0.011ms] [rows:0] SELECT * FROM `notifications` ORDER BY created_at desc --- PASS: TestNotificationHandler_List_Error (0.00s) === RUN TestNotificationHandler_List_UnreadOnly --- PASS: TestNotificationHandler_List_UnreadOnly (0.00s) === RUN TestNotificationHandler_MarkAsRead_Error 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:71 no such table: notifications [0.039ms] [rows:0] UPDATE `notifications` SET `read`=true WHERE id = "test-id" --- PASS: TestNotificationHandler_MarkAsRead_Error (0.00s) === RUN TestNotificationHandler_MarkAllAsRead_Error 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:75 no such table: notifications [0.031ms] [rows:0] UPDATE `notifications` SET `read`=true WHERE read = false --- PASS: TestNotificationHandler_MarkAllAsRead_Error (0.00s) === RUN TestNotificationProviderHandler_List_Error 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:455 no such table: notification_providers [0.013ms] [rows:0] SELECT * FROM `notification_providers` --- PASS: TestNotificationProviderHandler_List_Error (0.00s) === RUN TestNotificationProviderHandler_Create_InvalidJSON --- PASS: TestNotificationProviderHandler_Create_InvalidJSON (0.00s) === RUN TestNotificationProviderHandler_Create_DBError 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:468 no such table: notification_providers [0.058ms] [rows:0] INSERT INTO `notification_providers` (`id`,`name`,`type`,`url`,`config`,`template`,`enabled`,`notify_proxy_hosts`,`notify_remote_servers`,`notify_domains`,`notify_certs`,`notify_uptime`,`created_at`,`updated_at`) VALUES ("513248aa-8301-4798-8a21-c87b3eaef859","Test","webhook","https://example.com","","minimal",false,true,true,true,true,true,"2025-12-12 19:05:51.418","2025-12-12 19:05:51.418") --- PASS: TestNotificationProviderHandler_Create_DBError (0.00s) === RUN TestNotificationProviderHandler_Create_InvalidTemplate --- PASS: TestNotificationProviderHandler_Create_InvalidTemplate (0.00s) === RUN TestNotificationProviderHandler_Update_InvalidJSON --- PASS: TestNotificationProviderHandler_Update_InvalidJSON (0.00s) === RUN TestNotificationProviderHandler_Update_InvalidTemplate --- PASS: TestNotificationProviderHandler_Update_InvalidTemplate (0.00s) === RUN TestNotificationProviderHandler_Update_DBError 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:479 no such table: notification_providers [0.068ms] [rows:0] UPDATE `notification_providers` SET `name`="Test",`type`="webhook",`url`="https://example.com",`config`="",`template`="minimal",`enabled`=false,`notify_proxy_hosts`=false,`notify_remote_servers`=false,`notify_domains`=false,`notify_certs`=false,`notify_uptime`=false,`created_at`="0000-00-00 00:00:00",`updated_at`="2025-12-12 19:05:51.422" WHERE `id` = "test-id" --- PASS: TestNotificationProviderHandler_Update_DBError (0.00s) === RUN TestNotificationProviderHandler_Delete_Error 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:483 no such table: notification_providers [0.032ms] [rows:0] DELETE FROM `notification_providers` WHERE id = "test-id" --- PASS: TestNotificationProviderHandler_Delete_Error (0.00s) === RUN TestNotificationProviderHandler_Test_InvalidJSON --- PASS: TestNotificationProviderHandler_Test_InvalidJSON (0.00s) === RUN TestNotificationProviderHandler_Templates --- PASS: TestNotificationProviderHandler_Templates (0.00s) === RUN TestNotificationProviderHandler_Preview_InvalidJSON --- PASS: TestNotificationProviderHandler_Preview_InvalidJSON (0.00s) === RUN TestNotificationProviderHandler_Preview_WithData --- PASS: TestNotificationProviderHandler_Preview_WithData (0.00s) === RUN TestNotificationProviderHandler_Preview_InvalidTemplate --- PASS: TestNotificationProviderHandler_Preview_InvalidTemplate (0.00s) === RUN TestNotificationTemplateHandler_List_Error 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:375 no such table: notification_templates [0.019ms] [rows:0] SELECT * FROM `notification_templates` ORDER BY created_at desc --- PASS: TestNotificationTemplateHandler_List_Error (0.00s) === RUN TestNotificationTemplateHandler_Create_BadJSON --- PASS: TestNotificationTemplateHandler_Create_BadJSON (0.00s) === RUN TestNotificationTemplateHandler_Create_DBError 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:392 no such table: notification_templates [0.040ms] [rows:0] INSERT INTO `notification_templates` (`id`,`name`,`description`,`config`,`template`,`created_at`,`updated_at`) VALUES ("ca832d3a-64c5-42a4-8c75-b389bf4048ff","Test","","{""test"": true}","minimal","2025-12-12 19:05:51.429","2025-12-12 19:05:51.429") --- PASS: TestNotificationTemplateHandler_Create_DBError (0.00s) === RUN TestNotificationTemplateHandler_Update_BadJSON --- PASS: TestNotificationTemplateHandler_Update_BadJSON (0.00s) === RUN TestNotificationTemplateHandler_Update_DBError 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:397 no such table: notification_templates [0.037ms] [rows:0] UPDATE `notification_templates` SET `name`="Test",`description`="",`config`="{""test"": true}",`template`="",`created_at`="0000-00-00 00:00:00",`updated_at`="2025-12-12 19:05:51.431" WHERE `id` = "test-id" --- PASS: TestNotificationTemplateHandler_Update_DBError (0.00s) === RUN TestNotificationTemplateHandler_Delete_Error 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:402 no such table: notification_templates [0.029ms] [rows:0] DELETE FROM `notification_templates` WHERE id = "test-id" --- PASS: TestNotificationTemplateHandler_Delete_Error (0.00s) === RUN TestNotificationTemplateHandler_Preview_BadJSON --- PASS: TestNotificationTemplateHandler_Preview_BadJSON (0.00s) === RUN TestNotificationTemplateHandler_Preview_TemplateNotFound 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:384 record not found [0.022ms] [rows:0] SELECT * FROM `notification_templates` WHERE id = "nonexistent" ORDER BY `notification_templates`.`id` LIMIT 1 --- PASS: TestNotificationTemplateHandler_Preview_TemplateNotFound (0.00s) === RUN TestNotificationTemplateHandler_Preview_WithStoredTemplate --- PASS: TestNotificationTemplateHandler_Preview_WithStoredTemplate (0.00s) === RUN TestNotificationTemplateHandler_Preview_InvalidTemplate --- PASS: TestNotificationTemplateHandler_Preview_InvalidTemplate (0.00s) === RUN TestNotificationTemplateHandler_CRUDAndPreview --- PASS: TestNotificationTemplateHandler_CRUDAndPreview (0.00s) === RUN TestNotificationTemplateHandler_Create_InvalidJSON --- PASS: TestNotificationTemplateHandler_Create_InvalidJSON (0.00s) === RUN TestNotificationTemplateHandler_Update_InvalidJSON --- PASS: TestNotificationTemplateHandler_Update_InvalidJSON (0.00s) === RUN TestNotificationTemplateHandler_Preview_InvalidJSON --- PASS: TestNotificationTemplateHandler_Preview_InvalidJSON (0.00s) === RUN TestPerf_GetStatus_AssertThreshold perf_assert_test.go:107: GetStatus avg=0.045ms p95=0.085ms max=1.550ms --- PASS: TestPerf_GetStatus_AssertThreshold (0.02s) === RUN TestPerf_GetStatus_Parallel_AssertThreshold perf_assert_test.go:150: GetStatus Parallel avg=0.067ms p95=0.135ms max=3.510ms --- PASS: TestPerf_GetStatus_Parallel_AssertThreshold (0.02s) === RUN TestPerf_ListDecisions_AssertThreshold perf_assert_test.go:179: ListDecisions avg=0.863ms p95=1.108ms max=3.795ms --- PASS: TestPerf_ListDecisions_AssertThreshold (0.22s) === RUN TestProxyHostLifecycle 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/proxyhost_service.go:112 record not found [0.039ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "f4e8da5e-4668-40da-95b8-db6151890005" ORDER BY `proxy_hosts`.`id` LIMIT 1 --- PASS: TestProxyHostLifecycle (0.00s) === RUN TestProxyHostDelete_WithUptimeCleanup 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:82 no such table: notification_providers [0.132ms] [rows:0] SELECT * FROM `notification_providers` WHERE enabled = true 2025/12/12 19:05:51 /projects/Charon/backend/internal/api/handlers/proxy_host_handler_test.go:141 record not found [0.047ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "ph-delete-1" ORDER BY `proxy_hosts`.`id` LIMIT 1 --- PASS: TestProxyHostDelete_WithUptimeCleanup (0.00s) === RUN TestProxyHostErrors 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.029ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.106ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.012ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.055ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.045ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/proxyhost_service.go:112 record not found [0.030ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "non-existent-uuid" ORDER BY `proxy_hosts`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/proxyhost_service.go:112 record not found [0.022ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "non-existent-uuid" ORDER BY `proxy_hosts`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.015ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.010ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.014ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/proxyhost_service.go:112 record not found [0.044ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "non-existent-uuid" ORDER BY `proxy_hosts`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.009ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.009ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.010ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.004ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestProxyHostErrors (0.01s) === RUN TestProxyHostValidation --- PASS: TestProxyHostValidation (0.00s) === RUN TestProxyHostCreate_AdvancedConfig_InvalidJSON --- PASS: TestProxyHostCreate_AdvancedConfig_InvalidJSON (0.00s) === RUN TestProxyHostCreate_AdvancedConfig_Normalization --- PASS: TestProxyHostCreate_AdvancedConfig_Normalization (0.00s) === RUN TestProxyHostUpdate_CertificateID_Null --- PASS: TestProxyHostUpdate_CertificateID_Null (0.00s) === RUN TestProxyHostConnection --- PASS: TestProxyHostConnection (0.00s) === RUN TestProxyHostHandler_List_Error 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/proxyhost_service.go:121 sql: database is closed [0.009ms] [rows:0] SELECT * FROM `proxy_hosts` ORDER BY updated_at desc --- PASS: TestProxyHostHandler_List_Error (0.00s) === RUN TestProxyHostWithCaddyIntegration 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.026ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.134ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.033ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.026ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.015ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.060ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.051ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:82 no such table: notification_providers [0.122ms] [rows:0] SELECT * FROM `notification_providers` WHERE enabled = true 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.008ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.008ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.006ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.007ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.006ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.005ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.005ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.014ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:82 no such table: notification_providers [0.016ms] [rows:0] SELECT * FROM `notification_providers` WHERE enabled = true --- PASS: TestProxyHostWithCaddyIntegration (0.01s) === RUN TestProxyHostHandler_BulkUpdateACL_Success --- PASS: TestProxyHostHandler_BulkUpdateACL_Success (0.00s) === RUN TestProxyHostHandler_BulkUpdateACL_RemoveACL --- PASS: TestProxyHostHandler_BulkUpdateACL_RemoveACL (0.00s) === RUN TestProxyHostHandler_BulkUpdateACL_PartialFailure 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/proxyhost_service.go:112 record not found [0.024ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "422c0cc1-e09e-4e7f-8ba4-6c678835580a" ORDER BY `proxy_hosts`.`id` LIMIT 1 --- PASS: TestProxyHostHandler_BulkUpdateACL_PartialFailure (0.00s) === RUN TestProxyHostHandler_BulkUpdateACL_EmptyUUIDs --- PASS: TestProxyHostHandler_BulkUpdateACL_EmptyUUIDs (0.00s) === RUN TestProxyHostHandler_BulkUpdateACL_InvalidJSON --- PASS: TestProxyHostHandler_BulkUpdateACL_InvalidJSON (0.00s) === RUN TestProxyHostUpdate_AdvancedConfig_ClearAndBackup --- PASS: TestProxyHostUpdate_AdvancedConfig_ClearAndBackup (0.00s) === RUN TestProxyHostUpdate_AdvancedConfig_InvalidJSON --- PASS: TestProxyHostUpdate_AdvancedConfig_InvalidJSON (0.00s) === RUN TestProxyHostUpdate_SetCertificateID --- PASS: TestProxyHostUpdate_SetCertificateID (0.00s) === RUN TestProxyHostUpdate_AdvancedConfig_SetBackup --- PASS: TestProxyHostUpdate_AdvancedConfig_SetBackup (0.00s) === RUN TestProxyHostUpdate_ForwardPort_StringValue --- PASS: TestProxyHostUpdate_ForwardPort_StringValue (0.00s) === RUN TestProxyHostUpdate_Locations_InvalidPayload --- PASS: TestProxyHostUpdate_Locations_InvalidPayload (0.00s) === RUN TestProxyHostUpdate_SetBooleansAndApplication --- PASS: TestProxyHostUpdate_SetBooleansAndApplication (0.00s) === RUN TestProxyHostUpdate_Locations_Replace --- PASS: TestProxyHostUpdate_Locations_Replace (0.00s) === RUN TestProxyHostCreate_WithCertificateAndLocations --- PASS: TestProxyHostCreate_WithCertificateAndLocations (0.00s) === RUN TestSanitizeForLog --- PASS: TestSanitizeForLog (0.00s) === RUN TestSecurityHandler_GetGeoIPStatus_NotInitialized --- PASS: TestSecurityHandler_GetGeoIPStatus_NotInitialized (0.00s) === RUN TestSecurityHandler_GetGeoIPStatus_Initialized_NotLoaded --- PASS: TestSecurityHandler_GetGeoIPStatus_Initialized_NotLoaded (0.00s) === RUN TestSecurityHandler_ReloadGeoIP_NotInitialized --- PASS: TestSecurityHandler_ReloadGeoIP_NotInitialized (0.00s) === RUN TestSecurityHandler_ReloadGeoIP_LoadError time="2025-12-12T19:05:51Z" level=error msg="Failed to reload GeoIP database" error="open : no such file or directory" --- PASS: TestSecurityHandler_ReloadGeoIP_LoadError (0.00s) === RUN TestSecurityHandler_LookupGeoIP_MissingIPAddress --- PASS: TestSecurityHandler_LookupGeoIP_MissingIPAddress (0.00s) === RUN TestSecurityHandler_LookupGeoIP_ServiceUnavailable --- PASS: TestSecurityHandler_LookupGeoIP_ServiceUnavailable (0.00s) === RUN TestSecurityHandler_GetConfigAndUpdateConfig 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/security_service.go:37 record not found [0.033ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.038ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_GetConfigAndUpdateConfig (0.00s) === RUN TestSecurityHandler_GetStatus_SQLInjection --- PASS: TestSecurityHandler_GetStatus_SQLInjection (0.00s) === RUN TestSecurityHandler_CreateDecision_SQLInjection === RUN TestSecurityHandler_CreateDecision_SQLInjection/payload_0 === RUN TestSecurityHandler_CreateDecision_SQLInjection/payload_1 === RUN TestSecurityHandler_CreateDecision_SQLInjection/payload_2 === RUN TestSecurityHandler_CreateDecision_SQLInjection/payload_3 --- PASS: TestSecurityHandler_CreateDecision_SQLInjection (0.00s) --- PASS: TestSecurityHandler_CreateDecision_SQLInjection/payload_0 (0.00s) --- PASS: TestSecurityHandler_CreateDecision_SQLInjection/payload_1 (0.00s) --- PASS: TestSecurityHandler_CreateDecision_SQLInjection/payload_2 (0.00s) --- PASS: TestSecurityHandler_CreateDecision_SQLInjection/payload_3 (0.00s) === RUN TestSecurityHandler_UpsertRuleSet_MassivePayload --- PASS: TestSecurityHandler_UpsertRuleSet_MassivePayload (0.05s) === RUN TestSecurityHandler_UpsertRuleSet_EmptyName --- PASS: TestSecurityHandler_UpsertRuleSet_EmptyName (0.00s) === RUN TestSecurityHandler_CreateDecision_EmptyFields === RUN TestSecurityHandler_CreateDecision_EmptyFields/empty_ip === RUN TestSecurityHandler_CreateDecision_EmptyFields/empty_action === RUN TestSecurityHandler_CreateDecision_EmptyFields/both_empty === RUN TestSecurityHandler_CreateDecision_EmptyFields/valid --- PASS: TestSecurityHandler_CreateDecision_EmptyFields (0.00s) --- PASS: TestSecurityHandler_CreateDecision_EmptyFields/empty_ip (0.00s) --- PASS: TestSecurityHandler_CreateDecision_EmptyFields/empty_action (0.00s) --- PASS: TestSecurityHandler_CreateDecision_EmptyFields/both_empty (0.00s) --- PASS: TestSecurityHandler_CreateDecision_EmptyFields/valid (0.00s) === RUN TestSecurityHandler_GetStatus_SettingsOverride --- PASS: TestSecurityHandler_GetStatus_SettingsOverride (0.00s) === RUN TestSecurityHandler_GetStatus_DisabledViaSettings --- PASS: TestSecurityHandler_GetStatus_DisabledViaSettings (0.00s) === RUN TestSecurityAudit_DeleteRuleSet_InvalidID === RUN TestSecurityAudit_DeleteRuleSet_InvalidID/empty_id === RUN TestSecurityAudit_DeleteRuleSet_InvalidID/non_numeric === RUN TestSecurityAudit_DeleteRuleSet_InvalidID/negative === RUN TestSecurityAudit_DeleteRuleSet_InvalidID/sql_injection === RUN TestSecurityAudit_DeleteRuleSet_InvalidID/not_found --- PASS: TestSecurityAudit_DeleteRuleSet_InvalidID (0.00s) --- PASS: TestSecurityAudit_DeleteRuleSet_InvalidID/empty_id (0.00s) --- PASS: TestSecurityAudit_DeleteRuleSet_InvalidID/non_numeric (0.00s) --- PASS: TestSecurityAudit_DeleteRuleSet_InvalidID/negative (0.00s) --- PASS: TestSecurityAudit_DeleteRuleSet_InvalidID/sql_injection (0.00s) --- PASS: TestSecurityAudit_DeleteRuleSet_InvalidID/not_found (0.00s) === RUN TestSecurityHandler_UpsertRuleSet_XSSInContent --- PASS: TestSecurityHandler_UpsertRuleSet_XSSInContent (0.00s) === RUN TestSecurityHandler_UpdateConfig_RateLimitBounds === RUN TestSecurityHandler_UpdateConfig_RateLimitBounds/valid_limits === RUN TestSecurityHandler_UpdateConfig_RateLimitBounds/zero_requests === RUN TestSecurityHandler_UpdateConfig_RateLimitBounds/negative_burst === RUN TestSecurityHandler_UpdateConfig_RateLimitBounds/huge_values --- PASS: TestSecurityHandler_UpdateConfig_RateLimitBounds (0.00s) --- PASS: TestSecurityHandler_UpdateConfig_RateLimitBounds/valid_limits (0.00s) --- PASS: TestSecurityHandler_UpdateConfig_RateLimitBounds/zero_requests (0.00s) --- PASS: TestSecurityHandler_UpdateConfig_RateLimitBounds/negative_burst (0.00s) --- PASS: TestSecurityHandler_UpdateConfig_RateLimitBounds/huge_values (0.00s) === RUN TestSecurityHandler_GetStatus_NilDB --- PASS: TestSecurityHandler_GetStatus_NilDB (0.00s) === RUN TestSecurityHandler_Enable_WithoutWhitelist --- PASS: TestSecurityHandler_Enable_WithoutWhitelist (0.00s) === RUN TestSecurityHandler_Disable_RequiresToken --- PASS: TestSecurityHandler_Disable_RequiresToken (0.00s) === RUN TestSecurityHandler_GetStatus_CrowdSecModeValidation === RUN TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_remote === RUN TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_external === RUN TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_cloud === RUN TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_api === RUN TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_../../../etc/passwd --- PASS: TestSecurityHandler_GetStatus_CrowdSecModeValidation (0.00s) --- PASS: TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_remote (0.00s) --- PASS: TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_external (0.00s) --- PASS: TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_cloud (0.00s) --- PASS: TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_api (0.00s) --- PASS: TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_../../../etc/passwd (0.00s) === RUN TestSecurityHandler_GetStatus_Clean --- PASS: TestSecurityHandler_GetStatus_Clean (0.00s) === RUN TestSecurityHandler_Cerberus_DBOverride 2025/12/12 19:05:51 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found [0.138ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_Cerberus_DBOverride (0.00s) === RUN TestSecurityHandler_ACL_DBOverride 2025/12/12 19:05:51 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found [0.025ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 security_handler_clean_test.go:119: Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_clean_test.go:119 Error: Not equal: expected: true actual : false Test: TestSecurityHandler_ACL_DBOverride --- FAIL: TestSecurityHandler_ACL_DBOverride (0.00s) === RUN TestSecurityHandler_GenerateBreakGlass_ReturnsToken 2025/12/12 19:05:51 /projects/Charon/backend/internal/services/security_service.go:121 record not found [0.131ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_GenerateBreakGlass_ReturnsToken (0.06s) === RUN TestSecurityHandler_ACL_DisabledWhenCerberusOff 2025/12/12 19:05:51 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found [0.070ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_ACL_DisabledWhenCerberusOff (0.00s) === RUN TestSecurityHandler_CrowdSec_Mode_DBOverride 2025/12/12 19:05:51 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found [0.054ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 security_handler_clean_test.go:196: Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_clean_test.go:196 Error: Not equal: expected: "local" actual : "disabled" Diff: --- Expected +++ Actual @@ -1 +1 @@ -local +disabled Test: TestSecurityHandler_CrowdSec_Mode_DBOverride --- FAIL: TestSecurityHandler_CrowdSec_Mode_DBOverride (0.00s) === RUN TestSecurityHandler_CrowdSec_ExternalMappedToDisabled_DBOverride 2025/12/12 19:05:51 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found [0.063ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_CrowdSec_ExternalMappedToDisabled_DBOverride (0.00s) === RUN TestSecurityHandler_ExternalModeMappedToDisabled --- PASS: TestSecurityHandler_ExternalModeMappedToDisabled (0.00s) === RUN TestSecurityHandler_Enable_Disable_WithAdminWhitelistAndToken --- PASS: TestSecurityHandler_Enable_Disable_WithAdminWhitelistAndToken (0.12s) === RUN TestSecurityHandler_UpdateConfig_Success 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.029ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_UpdateConfig_Success (0.00s) === RUN TestSecurityHandler_UpdateConfig_DefaultName 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.044ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_UpdateConfig_DefaultName (0.00s) === RUN TestSecurityHandler_UpdateConfig_InvalidPayload --- PASS: TestSecurityHandler_UpdateConfig_InvalidPayload (0.00s) === RUN TestSecurityHandler_GetConfig_Success --- PASS: TestSecurityHandler_GetConfig_Success (0.00s) === RUN TestSecurityHandler_GetConfig_NotFound 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found [0.022ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_GetConfig_NotFound (0.00s) === RUN TestSecurityHandler_ListDecisions_Success --- PASS: TestSecurityHandler_ListDecisions_Success (0.00s) === RUN TestSecurityHandler_ListDecisions_WithLimit --- PASS: TestSecurityHandler_ListDecisions_WithLimit (0.00s) === RUN TestSecurityHandler_CreateDecision_Success --- PASS: TestSecurityHandler_CreateDecision_Success (0.00s) === RUN TestSecurityHandler_CreateDecision_MissingIP --- PASS: TestSecurityHandler_CreateDecision_MissingIP (0.00s) === RUN TestSecurityHandler_CreateDecision_MissingAction --- PASS: TestSecurityHandler_CreateDecision_MissingAction (0.00s) === RUN TestSecurityHandler_CreateDecision_InvalidPayload --- PASS: TestSecurityHandler_CreateDecision_InvalidPayload (0.00s) === RUN TestSecurityHandler_ListRuleSets_Success --- PASS: TestSecurityHandler_ListRuleSets_Success (0.00s) === RUN TestSecurityHandler_UpsertRuleSet_Success 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:212 record not found [0.037ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "test-ruleset" ORDER BY `security_rule_sets`.`id` LIMIT 1 --- PASS: TestSecurityHandler_UpsertRuleSet_Success (0.00s) === RUN TestSecurityHandler_UpsertRuleSet_MissingName --- PASS: TestSecurityHandler_UpsertRuleSet_MissingName (0.00s) === RUN TestSecurityHandler_UpsertRuleSet_InvalidPayload --- PASS: TestSecurityHandler_UpsertRuleSet_InvalidPayload (0.00s) === RUN TestSecurityHandler_DeleteRuleSet_Success --- PASS: TestSecurityHandler_DeleteRuleSet_Success (0.00s) === RUN TestSecurityHandler_DeleteRuleSet_NotFound 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:234 record not found [0.018ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE `security_rule_sets`.`id` = 999 ORDER BY `security_rule_sets`.`id` LIMIT 1 --- PASS: TestSecurityHandler_DeleteRuleSet_NotFound (0.00s) === RUN TestSecurityHandler_DeleteRuleSet_InvalidID --- PASS: TestSecurityHandler_DeleteRuleSet_InvalidID (0.00s) === RUN TestSecurityHandler_DeleteRuleSet_EmptyID --- PASS: TestSecurityHandler_DeleteRuleSet_EmptyID (0.00s) === RUN TestSecurityHandler_Enable_NoConfigNoWhitelist 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found [0.083ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.126ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_Enable_NoConfigNoWhitelist (0.00s) === RUN TestSecurityHandler_Enable_WithWhitelist --- PASS: TestSecurityHandler_Enable_WithWhitelist (0.00s) === RUN TestSecurityHandler_Enable_IPNotInWhitelist --- PASS: TestSecurityHandler_Enable_IPNotInWhitelist (0.00s) === RUN TestSecurityHandler_Enable_WithValidBreakGlassToken --- PASS: TestSecurityHandler_Enable_WithValidBreakGlassToken (0.12s) === RUN TestSecurityHandler_Enable_WithInvalidBreakGlassToken --- PASS: TestSecurityHandler_Enable_WithInvalidBreakGlassToken (0.00s) === RUN TestSecurityHandler_Disable_FromLocalhost --- PASS: TestSecurityHandler_Disable_FromLocalhost (0.00s) === RUN TestSecurityHandler_Disable_FromRemoteWithToken --- PASS: TestSecurityHandler_Disable_FromRemoteWithToken (0.12s) === RUN TestSecurityHandler_Disable_FromRemoteNoToken --- PASS: TestSecurityHandler_Disable_FromRemoteNoToken (0.00s) === RUN TestSecurityHandler_Disable_FromRemoteInvalidToken --- PASS: TestSecurityHandler_Disable_FromRemoteInvalidToken (0.00s) === RUN TestSecurityHandler_GenerateBreakGlass_NoConfig 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:121 record not found [0.137ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_GenerateBreakGlass_NoConfig (0.06s) === RUN TestSecurityHandler_Disable_FromIPv6Localhost --- PASS: TestSecurityHandler_Disable_FromIPv6Localhost (0.00s) === RUN TestSecurityHandler_Enable_WithCIDRWhitelist --- PASS: TestSecurityHandler_Enable_WithCIDRWhitelist (0.00s) === RUN TestSecurityHandler_Enable_WithExactIPWhitelist --- PASS: TestSecurityHandler_Enable_WithExactIPWhitelist (0.00s) === RUN TestSecurityHandler_GetStatus_Fixed === RUN TestSecurityHandler_GetStatus_Fixed/All_Disabled === RUN TestSecurityHandler_GetStatus_Fixed/All_Enabled --- PASS: TestSecurityHandler_GetStatus_Fixed (0.00s) --- PASS: TestSecurityHandler_GetStatus_Fixed/All_Disabled (0.00s) --- PASS: TestSecurityHandler_GetStatus_Fixed/All_Enabled (0.00s) === RUN TestSecurityHandler_CreateAndListDecisionAndRulesets 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:212 record not found [0.062ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "owasp-crs" ORDER BY `security_rule_sets`.`id` LIMIT 1 --- PASS: TestSecurityHandler_CreateAndListDecisionAndRulesets (0.07s) === RUN TestSecurityHandler_UpsertDeleteTriggersApplyConfig 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:212 record not found [0.045ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "owasp-crs" ORDER BY `security_rule_sets`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.063ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestSecurityHandler_UpsertDeleteTriggersApplyConfig (0.01s) === RUN TestSecurityHandler_GetStatus_RespectsSettingsTable === RUN TestSecurityHandler_GetStatus_RespectsSettingsTable/WAF_enabled_via_settings_overrides_disabled_config 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found [0.114ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 security_handler_settings_test.go:145: Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:145 Error: Not equal: expected: true actual : false Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/WAF_enabled_via_settings_overrides_disabled_config Messages: WAF enabled mismatch === RUN TestSecurityHandler_GetStatus_RespectsSettingsTable/Rate_Limit_enabled_via_settings_overrides_disabled_config 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found [0.039ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 security_handler_settings_test.go:149: Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:149 Error: Not equal: expected: true actual : false Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/Rate_Limit_enabled_via_settings_overrides_disabled_config Messages: Rate Limit enabled mismatch === RUN TestSecurityHandler_GetStatus_RespectsSettingsTable/CrowdSec_enabled_via_settings_overrides_disabled_config 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found [0.037ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 security_handler_settings_test.go:153: Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:153 Error: Not equal: expected: true actual : false Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/CrowdSec_enabled_via_settings_overrides_disabled_config Messages: CrowdSec enabled mismatch === RUN TestSecurityHandler_GetStatus_RespectsSettingsTable/All_modules_enabled_via_settings 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found [0.032ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 security_handler_settings_test.go:145: Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:145 Error: Not equal: expected: true actual : false Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/All_modules_enabled_via_settings Messages: WAF enabled mismatch security_handler_settings_test.go:149: Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:149 Error: Not equal: expected: true actual : false Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/All_modules_enabled_via_settings Messages: Rate Limit enabled mismatch security_handler_settings_test.go:153: Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:153 Error: Not equal: expected: true actual : false Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/All_modules_enabled_via_settings Messages: CrowdSec enabled mismatch === RUN TestSecurityHandler_GetStatus_RespectsSettingsTable/WAF_disabled_via_settings_overrides_enabled_config 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found [0.033ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 === RUN TestSecurityHandler_GetStatus_RespectsSettingsTable/No_settings_-_falls_back_to_config_(enabled) 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found [0.029ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 security_handler_settings_test.go:145: Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:145 Error: Not equal: expected: true actual : false Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/No_settings_-_falls_back_to_config_(enabled) Messages: WAF enabled mismatch security_handler_settings_test.go:149: Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:149 Error: Not equal: expected: true actual : false Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/No_settings_-_falls_back_to_config_(enabled) Messages: Rate Limit enabled mismatch security_handler_settings_test.go:153: Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:153 Error: Not equal: expected: true actual : false Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/No_settings_-_falls_back_to_config_(enabled) Messages: CrowdSec enabled mismatch --- FAIL: TestSecurityHandler_GetStatus_RespectsSettingsTable (0.01s) --- FAIL: TestSecurityHandler_GetStatus_RespectsSettingsTable/WAF_enabled_via_settings_overrides_disabled_config (0.00s) --- FAIL: TestSecurityHandler_GetStatus_RespectsSettingsTable/Rate_Limit_enabled_via_settings_overrides_disabled_config (0.00s) --- FAIL: TestSecurityHandler_GetStatus_RespectsSettingsTable/CrowdSec_enabled_via_settings_overrides_disabled_config (0.00s) --- FAIL: TestSecurityHandler_GetStatus_RespectsSettingsTable/All_modules_enabled_via_settings (0.00s) --- PASS: TestSecurityHandler_GetStatus_RespectsSettingsTable/WAF_disabled_via_settings_overrides_enabled_config (0.00s) --- FAIL: TestSecurityHandler_GetStatus_RespectsSettingsTable/No_settings_-_falls_back_to_config_(enabled) (0.00s) === RUN TestSecurityHandler_GetStatus_WAFModeFromSettings 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found [0.049ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 security_handler_settings_test.go:187: Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:187 Error: Should be true Test: TestSecurityHandler_GetStatus_WAFModeFromSettings --- FAIL: TestSecurityHandler_GetStatus_WAFModeFromSettings (0.01s) === RUN TestSecurityHandler_GetStatus_RateLimitModeFromSettings 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found [0.041ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 security_handler_settings_test.go:218: Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:218 Error: Should be true Test: TestSecurityHandler_GetStatus_RateLimitModeFromSettings --- FAIL: TestSecurityHandler_GetStatus_RateLimitModeFromSettings (0.00s) === RUN TestSecurityHandler_GetWAFExclusions_Empty 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found [0.034ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_GetWAFExclusions_Empty (0.00s) === RUN TestSecurityHandler_GetWAFExclusions_WithExclusions --- PASS: TestSecurityHandler_GetWAFExclusions_WithExclusions (0.00s) === RUN TestSecurityHandler_GetWAFExclusions_InvalidJSON time="2025-12-12T19:05:52Z" level=warning msg="Failed to parse WAF exclusions" error="invalid character 'i' looking for beginning of value" --- PASS: TestSecurityHandler_GetWAFExclusions_InvalidJSON (0.00s) === RUN TestSecurityHandler_AddWAFExclusion_Success 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found [0.036ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.026ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_AddWAFExclusion_Success (0.00s) === RUN TestSecurityHandler_AddWAFExclusion_WithTarget 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found [0.023ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.024ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_AddWAFExclusion_WithTarget (0.00s) === RUN TestSecurityHandler_AddWAFExclusion_ToExistingConfig --- PASS: TestSecurityHandler_AddWAFExclusion_ToExistingConfig (0.00s) === RUN TestSecurityHandler_AddWAFExclusion_Duplicate --- PASS: TestSecurityHandler_AddWAFExclusion_Duplicate (0.00s) === RUN TestSecurityHandler_AddWAFExclusion_DuplicateWithDifferentTarget --- PASS: TestSecurityHandler_AddWAFExclusion_DuplicateWithDifferentTarget (0.00s) === RUN TestSecurityHandler_AddWAFExclusion_MissingRuleID --- PASS: TestSecurityHandler_AddWAFExclusion_MissingRuleID (0.00s) === RUN TestSecurityHandler_AddWAFExclusion_InvalidRuleID --- PASS: TestSecurityHandler_AddWAFExclusion_InvalidRuleID (0.00s) === RUN TestSecurityHandler_AddWAFExclusion_NegativeRuleID --- PASS: TestSecurityHandler_AddWAFExclusion_NegativeRuleID (0.00s) === RUN TestSecurityHandler_AddWAFExclusion_InvalidPayload --- PASS: TestSecurityHandler_AddWAFExclusion_InvalidPayload (0.00s) === RUN TestSecurityHandler_DeleteWAFExclusion_Success --- PASS: TestSecurityHandler_DeleteWAFExclusion_Success (0.00s) === RUN TestSecurityHandler_DeleteWAFExclusion_WithTarget --- PASS: TestSecurityHandler_DeleteWAFExclusion_WithTarget (0.00s) === RUN TestSecurityHandler_DeleteWAFExclusion_NotFound --- PASS: TestSecurityHandler_DeleteWAFExclusion_NotFound (0.00s) === RUN TestSecurityHandler_DeleteWAFExclusion_NoConfig 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found [0.041ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_DeleteWAFExclusion_NoConfig (0.00s) === RUN TestSecurityHandler_DeleteWAFExclusion_InvalidRuleID --- PASS: TestSecurityHandler_DeleteWAFExclusion_InvalidRuleID (0.00s) === RUN TestSecurityHandler_DeleteWAFExclusion_ZeroRuleID --- PASS: TestSecurityHandler_DeleteWAFExclusion_ZeroRuleID (0.00s) === RUN TestSecurityHandler_DeleteWAFExclusion_NegativeRuleID --- PASS: TestSecurityHandler_DeleteWAFExclusion_NegativeRuleID (0.00s) === RUN TestSecurityHandler_WAFExclusion_FullWorkflow 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found [0.026ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found [0.025ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.024ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityHandler_WAFExclusion_FullWorkflow (0.00s) === RUN TestProxyHost_WAFDisabled_DefaultFalse --- PASS: TestProxyHost_WAFDisabled_DefaultFalse (0.00s) === RUN TestProxyHost_WAFDisabled_SetTrue --- PASS: TestProxyHost_WAFDisabled_SetTrue (0.00s) === RUN TestSecurityConfig_WAFParanoiaLevel_Default --- PASS: TestSecurityConfig_WAFParanoiaLevel_Default (0.00s) === RUN TestSecurityConfig_WAFParanoiaLevel_CustomValue --- PASS: TestSecurityConfig_WAFParanoiaLevel_CustomValue (0.00s) === RUN TestSecurityConfig_WAFExclusions_Empty --- PASS: TestSecurityConfig_WAFExclusions_Empty (0.00s) === RUN TestSecurityConfig_WAFExclusions_JSONArray --- PASS: TestSecurityConfig_WAFExclusions_JSONArray (0.00s) === RUN TestSecurityNotificationHandler_GetSettings 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_notification_service.go:29 record not found [0.018ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestSecurityNotificationHandler_GetSettings (0.00s) === RUN TestSecurityNotificationHandler_UpdateSettings 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found [0.026ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestSecurityNotificationHandler_UpdateSettings (0.00s) === RUN TestSecurityNotificationHandler_InvalidLevel --- PASS: TestSecurityNotificationHandler_InvalidLevel (0.00s) === RUN TestSecurityNotificationHandler_UpdateSettings_InvalidJSON --- PASS: TestSecurityNotificationHandler_UpdateSettings_InvalidJSON (0.00s) === RUN TestSecurityNotificationHandler_UpdateSettings_ValidLevels 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found [0.029ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestSecurityNotificationHandler_UpdateSettings_ValidLevels (0.00s) === RUN TestSecurityNotificationHandler_GetSettings_DatabaseError 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_notification_service.go:29 sql: database is closed [0.004ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestSecurityNotificationHandler_GetSettings_DatabaseError (0.00s) === RUN TestSecurityNotificationHandler_GetSettings_EmptySettings 2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_notification_service.go:29 record not found [0.018ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestSecurityNotificationHandler_GetSettings_EmptySettings (0.00s) === RUN TestSecurityHandler_GetRateLimitPresets --- PASS: TestSecurityHandler_GetRateLimitPresets (0.00s) === RUN TestSecurityHandler_GetRateLimitPresets_StandardPreset --- PASS: TestSecurityHandler_GetRateLimitPresets_StandardPreset (0.00s) === RUN TestSecurityHandler_GetRateLimitPresets_LoginPreset --- PASS: TestSecurityHandler_GetRateLimitPresets_LoginPreset (0.00s) === RUN TestGetClientIPHeadersAndRemoteAddr --- PASS: TestGetClientIPHeadersAndRemoteAddr (0.00s) === RUN TestGetMyIPHandler === RUN TestGetMyIPHandler/with_CF_header === RUN TestGetMyIPHandler/with_X-Forwarded-For_header === RUN TestGetMyIPHandler/with_X-Real-IP_header === RUN TestGetMyIPHandler/direct_connection --- PASS: TestGetMyIPHandler (0.00s) --- PASS: TestGetMyIPHandler/with_CF_header (0.00s) --- PASS: TestGetMyIPHandler/with_X-Forwarded-For_header (0.00s) --- PASS: TestGetMyIPHandler/with_X-Real-IP_header (0.00s) --- PASS: TestGetMyIPHandler/direct_connection (0.00s) === RUN TestUpdateHandler_Check --- PASS: TestUpdateHandler_Check (0.00s) === RUN TestUserHandler_GetSetupStatus_Error 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:55 no such table: users [0.018ms] [rows:0] SELECT count(*) FROM `users` --- PASS: TestUserHandler_GetSetupStatus_Error (0.00s) === RUN TestUserHandler_Setup_CheckStatusError 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:75 no such table: users [0.018ms] [rows:0] SELECT count(*) FROM `users` --- PASS: TestUserHandler_Setup_CheckStatusError (0.00s) === RUN TestUserHandler_Setup_AlreadyCompleted --- PASS: TestUserHandler_Setup_AlreadyCompleted (0.06s) === RUN TestUserHandler_Setup_InvalidJSON --- PASS: TestUserHandler_Setup_InvalidJSON (0.00s) === RUN TestUserHandler_RegenerateAPIKey_Unauthorized --- PASS: TestUserHandler_RegenerateAPIKey_Unauthorized (0.00s) === RUN TestUserHandler_RegenerateAPIKey_DBError 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:152 no such table: users [0.056ms] [rows:0] UPDATE `users` SET `api_key`="b8c75043-8fe9-4819-acaa-a65bc2a5d020",`updated_at`="2025-12-12 19:05:52.585" WHERE id = 1 --- PASS: TestUserHandler_RegenerateAPIKey_DBError (0.00s) === RUN TestUserHandler_GetProfile_Unauthorized --- PASS: TestUserHandler_GetProfile_Unauthorized (0.00s) === RUN TestUserHandler_GetProfile_NotFound 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:169 record not found [0.031ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 9999 ORDER BY `users`.`id` LIMIT 1 --- PASS: TestUserHandler_GetProfile_NotFound (0.00s) === RUN TestUserHandler_UpdateProfile_Unauthorized --- PASS: TestUserHandler_UpdateProfile_Unauthorized (0.00s) === RUN TestUserHandler_UpdateProfile_InvalidJSON --- PASS: TestUserHandler_UpdateProfile_InvalidJSON (0.00s) === RUN TestUserHandler_UpdateProfile_UserNotFound 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:205 record not found [0.043ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 9999 ORDER BY `users`.`id` LIMIT 1 --- PASS: TestUserHandler_UpdateProfile_UserNotFound (0.00s) === RUN TestUserHandler_UpdateProfile_EmailConflict --- PASS: TestUserHandler_UpdateProfile_EmailConflict (0.12s) === RUN TestUserHandler_UpdateProfile_EmailChangeNoPassword --- PASS: TestUserHandler_UpdateProfile_EmailChangeNoPassword (0.06s) === RUN TestUserHandler_UpdateProfile_WrongPassword --- PASS: TestUserHandler_UpdateProfile_WrongPassword (0.12s) === RUN TestUserHandler_GetSetupStatus --- PASS: TestUserHandler_GetSetupStatus (0.00s) === RUN TestUserHandler_Setup --- PASS: TestUserHandler_Setup (0.06s) === RUN TestUserHandler_Setup_DBError --- PASS: TestUserHandler_Setup_DBError (0.00s) === RUN TestUserHandler_RegenerateAPIKey --- PASS: TestUserHandler_RegenerateAPIKey (0.00s) === RUN TestUserHandler_GetProfile --- PASS: TestUserHandler_GetProfile (0.00s) === RUN TestUserHandler_RegisterRoutes --- PASS: TestUserHandler_RegisterRoutes (0.00s) === RUN TestUserHandler_Errors 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:169 record not found [0.025ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 99999 ORDER BY `users`.`id` LIMIT 1 2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:152 no such table: users [0.048ms] [rows:0] UPDATE `users` SET `api_key`="5ecabc02-1821-4ec6-bd8c-1b217bc10aa4",`updated_at`="2025-12-12 19:05:52.978" WHERE id = 99999 --- PASS: TestUserHandler_Errors (0.00s) === RUN TestUserHandler_UpdateProfile === RUN TestUserHandler_UpdateProfile/Success_Name_Only === RUN TestUserHandler_UpdateProfile/Success_Email_Change === RUN TestUserHandler_UpdateProfile/Fail_Email_Change_No_Password === RUN TestUserHandler_UpdateProfile/Fail_Email_Change_Wrong_Password === RUN TestUserHandler_UpdateProfile/Fail_Email_In_Use --- PASS: TestUserHandler_UpdateProfile (0.19s) --- PASS: TestUserHandler_UpdateProfile/Success_Name_Only (0.00s) --- PASS: TestUserHandler_UpdateProfile/Success_Email_Change (0.06s) --- PASS: TestUserHandler_UpdateProfile/Fail_Email_Change_No_Password (0.00s) --- PASS: TestUserHandler_UpdateProfile/Fail_Email_Change_Wrong_Password (0.06s) --- PASS: TestUserHandler_UpdateProfile/Fail_Email_In_Use (0.00s) === RUN TestUserHandler_UpdateProfile_Errors 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:205 record not found [0.040ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1 --- PASS: TestUserHandler_UpdateProfile_Errors (0.00s) === RUN TestUserHandler_ListUsers_NonAdmin --- PASS: TestUserHandler_ListUsers_NonAdmin (0.00s) === RUN TestUserHandler_ListUsers_Admin --- PASS: TestUserHandler_ListUsers_Admin (0.00s) === RUN TestUserHandler_CreateUser_NonAdmin --- PASS: TestUserHandler_CreateUser_NonAdmin (0.00s) === RUN TestUserHandler_CreateUser_Admin --- PASS: TestUserHandler_CreateUser_Admin (0.07s) === RUN TestUserHandler_CreateUser_InvalidJSON --- PASS: TestUserHandler_CreateUser_InvalidJSON (0.00s) === RUN TestUserHandler_CreateUser_DuplicateEmail --- PASS: TestUserHandler_CreateUser_DuplicateEmail (0.00s) === RUN TestUserHandler_CreateUser_WithPermittedHosts --- PASS: TestUserHandler_CreateUser_WithPermittedHosts (0.06s) === RUN TestUserHandler_GetUser_NonAdmin --- PASS: TestUserHandler_GetUser_NonAdmin (0.00s) === RUN TestUserHandler_GetUser_InvalidID --- PASS: TestUserHandler_GetUser_InvalidID (0.00s) === RUN TestUserHandler_GetUser_NotFound 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:540 record not found [0.031ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1 --- PASS: TestUserHandler_GetUser_NotFound (0.00s) === RUN TestUserHandler_GetUser_Success --- PASS: TestUserHandler_GetUser_Success (0.00s) === RUN TestUserHandler_UpdateUser_NonAdmin --- PASS: TestUserHandler_UpdateUser_NonAdmin (0.00s) === RUN TestUserHandler_UpdateUser_InvalidID --- PASS: TestUserHandler_UpdateUser_InvalidID (0.00s) === RUN TestUserHandler_UpdateUser_InvalidJSON --- PASS: TestUserHandler_UpdateUser_InvalidJSON (0.00s) === RUN TestUserHandler_UpdateUser_NotFound 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:592 record not found [0.026ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1 --- PASS: TestUserHandler_UpdateUser_NotFound (0.00s) === RUN TestUserHandler_UpdateUser_Success --- PASS: TestUserHandler_UpdateUser_Success (0.00s) === RUN TestUserHandler_DeleteUser_NonAdmin --- PASS: TestUserHandler_DeleteUser_NonAdmin (0.00s) === RUN TestUserHandler_DeleteUser_InvalidID --- PASS: TestUserHandler_DeleteUser_InvalidID (0.00s) === RUN TestUserHandler_DeleteUser_NotFound 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:662 record not found [0.025ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1 --- PASS: TestUserHandler_DeleteUser_NotFound (0.00s) === RUN TestUserHandler_DeleteUser_Success --- PASS: TestUserHandler_DeleteUser_Success (0.00s) === RUN TestUserHandler_DeleteUser_CannotDeleteSelf --- PASS: TestUserHandler_DeleteUser_CannotDeleteSelf (0.00s) === RUN TestUserHandler_UpdateUserPermissions_NonAdmin --- PASS: TestUserHandler_UpdateUserPermissions_NonAdmin (0.00s) === RUN TestUserHandler_UpdateUserPermissions_InvalidID --- PASS: TestUserHandler_UpdateUserPermissions_InvalidID (0.00s) === RUN TestUserHandler_UpdateUserPermissions_InvalidJSON --- PASS: TestUserHandler_UpdateUserPermissions_InvalidJSON (0.00s) === RUN TestUserHandler_UpdateUserPermissions_NotFound 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:703 record not found [0.025ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1 --- PASS: TestUserHandler_UpdateUserPermissions_NotFound (0.00s) === RUN TestUserHandler_UpdateUserPermissions_Success --- PASS: TestUserHandler_UpdateUserPermissions_Success (0.00s) === RUN TestUserHandler_ValidateInvite_MissingToken --- PASS: TestUserHandler_ValidateInvite_MissingToken (0.00s) === RUN TestUserHandler_ValidateInvite_InvalidToken 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:752 record not found [0.035ms] [rows:0] SELECT * FROM `users` WHERE invite_token = "invalidtoken" ORDER BY `users`.`id` LIMIT 1 --- PASS: TestUserHandler_ValidateInvite_InvalidToken (0.00s) === RUN TestUserHandler_ValidateInvite_ExpiredToken --- PASS: TestUserHandler_ValidateInvite_ExpiredToken (0.00s) === RUN TestUserHandler_ValidateInvite_AlreadyAccepted --- PASS: TestUserHandler_ValidateInvite_AlreadyAccepted (0.00s) === RUN TestUserHandler_ValidateInvite_Success --- PASS: TestUserHandler_ValidateInvite_Success (0.00s) === RUN TestUserHandler_AcceptInvite_InvalidJSON --- PASS: TestUserHandler_AcceptInvite_InvalidJSON (0.00s) === RUN TestUserHandler_AcceptInvite_InvalidToken 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:791 record not found [0.051ms] [rows:0] SELECT * FROM `users` WHERE invite_token = "invalidtoken" ORDER BY `users`.`id` LIMIT 1 --- PASS: TestUserHandler_AcceptInvite_InvalidToken (0.00s) === RUN TestUserHandler_AcceptInvite_Success --- PASS: TestUserHandler_AcceptInvite_Success (0.06s) === RUN TestGenerateSecureToken --- PASS: TestGenerateSecureToken (0.00s) === RUN TestUserHandler_InviteUser_NonAdmin --- PASS: TestUserHandler_InviteUser_NonAdmin (0.00s) === RUN TestUserHandler_InviteUser_InvalidJSON --- PASS: TestUserHandler_InviteUser_InvalidJSON (0.00s) === RUN TestUserHandler_InviteUser_DuplicateEmail --- PASS: TestUserHandler_InviteUser_DuplicateEmail (0.00s) === RUN TestUserHandler_InviteUser_Success 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:420 record not found [0.041ms] [rows:0] SELECT * FROM `users` WHERE email = "newinvite@example.com" ORDER BY `users`.`id` LIMIT 1 --- PASS: TestUserHandler_InviteUser_Success (0.00s) === RUN TestUserHandler_InviteUser_WithPermittedHosts 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:420 record not found [0.029ms] [rows:0] SELECT * FROM `users` WHERE email = "invitee-perms@example.com" ORDER BY `users`.`id` LIMIT 1 --- PASS: TestUserHandler_InviteUser_WithPermittedHosts (0.00s) === RUN TestGetBaseURL --- PASS: TestGetBaseURL (0.00s) === RUN TestGetAppName 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:518 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "app_name" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestGetAppName (0.00s) === RUN TestUserHandler_AcceptInvite_ExpiredToken --- PASS: TestUserHandler_AcceptInvite_ExpiredToken (0.00s) === RUN TestUserHandler_AcceptInvite_AlreadyAccepted --- PASS: TestUserHandler_AcceptInvite_AlreadyAccepted (0.00s) === RUN TestUserLoginAfterEmailChange --- PASS: TestUserLoginAfterEmailChange (0.30s) === RUN TestRemoteServerHandler_List --- PASS: TestRemoteServerHandler_List (0.00s) === RUN TestRemoteServerHandler_Create --- PASS: TestRemoteServerHandler_Create (0.00s) === RUN TestRemoteServerHandler_TestConnection --- PASS: TestRemoteServerHandler_TestConnection (0.00s) === RUN TestRemoteServerHandler_Get --- PASS: TestRemoteServerHandler_Get (0.00s) === RUN TestRemoteServerHandler_Update --- PASS: TestRemoteServerHandler_Update (0.00s) === RUN TestRemoteServerHandler_Delete 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found [0.029ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "21ab604b-2f0a-4078-8012-f3165c662e99" ORDER BY `remote_servers`.`id` LIMIT 1 --- PASS: TestRemoteServerHandler_Delete (0.00s) === RUN TestProxyHostHandler_List --- PASS: TestProxyHostHandler_List (0.00s) === RUN TestProxyHostHandler_Create --- PASS: TestProxyHostHandler_Create (0.00s) === RUN TestProxyHostHandler_PartialUpdate_DoesNotWipeFields --- PASS: TestProxyHostHandler_PartialUpdate_DoesNotWipeFields (0.00s) === RUN TestHealthHandler --- PASS: TestHealthHandler (0.00s) === RUN TestRemoteServerHandler_Errors 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found [0.033ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent" ORDER BY `remote_servers`.`id` LIMIT 1 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found [0.019ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent" ORDER BY `remote_servers`.`id` LIMIT 1 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found [0.014ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent" ORDER BY `remote_servers`.`id` LIMIT 1 --- PASS: TestRemoteServerHandler_Errors (0.00s) === RUN TestImportHandler_GetStatus 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:60 record not found [0.093ms] [rows:0] SELECT * FROM `import_sessions` WHERE status IN ("pending","reviewing") ORDER BY created_at DESC,`import_sessions`.`id` LIMIT 1 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:60 record not found [0.051ms] [rows:0] SELECT * FROM `import_sessions` WHERE status IN ("pending","reviewing") ORDER BY created_at DESC,`import_sessions`.`id` LIMIT 1 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:70 record not found [0.026ms] [rows:0] SELECT * FROM `import_sessions` WHERE source_file = "/tmp/TestImportHandler_GetStatus3246735047/001/mounted.caddyfile" AND status = "committed" ORDER BY committed_at DESC,`import_sessions`.`id` LIMIT 1 --- PASS: TestImportHandler_GetStatus (0.00s) === RUN TestImportHandler_GetPreview 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:122 record not found [0.102ms] [rows:0] SELECT * FROM `import_sessions` WHERE status IN ("pending","reviewing") ORDER BY created_at DESC,`import_sessions`.`id` LIMIT 1 --- PASS: TestImportHandler_GetPreview (0.00s) === RUN TestImportHandler_Cancel --- PASS: TestImportHandler_Cancel (0.00s) === RUN TestImportHandler_Commit --- PASS: TestImportHandler_Commit (0.00s) === RUN TestImportHandler_Upload --- PASS: TestImportHandler_Upload (0.00s) === RUN TestImportHandler_GetPreview_WithContent --- PASS: TestImportHandler_GetPreview_WithContent (0.00s) === RUN TestImportHandler_Commit_Errors 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found [0.036ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "non-existent" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1 --- PASS: TestImportHandler_Commit_Errors (0.00s) === RUN TestImportHandler_Cancel_Errors 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:734 record not found [0.033ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "non-existent" ORDER BY `import_sessions`.`id` LIMIT 1 --- PASS: TestImportHandler_Cancel_Errors (0.00s) === RUN TestCheckMountedImport --- PASS: TestCheckMountedImport (0.00s) === RUN TestImportHandler_Upload_Failure --- PASS: TestImportHandler_Upload_Failure (0.00s) === RUN TestImportHandler_Upload_Conflict --- PASS: TestImportHandler_Upload_Conflict (0.01s) === RUN TestImportHandler_GetPreview_BackupContent --- PASS: TestImportHandler_GetPreview_BackupContent (0.00s) === RUN TestImportHandler_RegisterRoutes 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:60 record not found [0.092ms] [rows:0] SELECT * FROM `import_sessions` WHERE status IN ("pending","reviewing") ORDER BY created_at DESC,`import_sessions`.`id` LIMIT 1 --- PASS: TestImportHandler_RegisterRoutes (0.00s) === RUN TestImportHandler_GetPreview_TransientMount 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:122 record not found [0.148ms] [rows:0] SELECT * FROM `import_sessions` WHERE status IN ("pending","reviewing") ORDER BY created_at DESC,`import_sessions`.`id` LIMIT 1 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:167 record not found [0.042ms] [rows:0] SELECT * FROM `import_sessions` WHERE source_file = "/tmp/TestImportHandler_GetPreview_TransientMount3464543619/001/mounted.caddyfile" AND status = "committed" ORDER BY committed_at DESC,`import_sessions`.`id` LIMIT 1 --- PASS: TestImportHandler_GetPreview_TransientMount (0.00s) === RUN TestImportHandler_Commit_TransientUpload 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found [0.036ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "06368b2d-5607-4012-9972-7646e877fc61" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1 --- PASS: TestImportHandler_Commit_TransientUpload (0.01s) === RUN TestImportHandler_Commit_TransientMount 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found [0.045ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "00e915f7-0eb9-4b38-9d1a-8bd2d7f138d6" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1 --- PASS: TestImportHandler_Commit_TransientMount (0.01s) === RUN TestImportHandler_Cancel_TransientUpload 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:734 record not found [0.071ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "7c49c0f2-9908-4546-8a9c-d3c47c4c9860" ORDER BY `import_sessions`.`id` LIMIT 1 --- PASS: TestImportHandler_Cancel_TransientUpload (0.01s) === RUN TestImportHandler_Errors 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found [0.036ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "non-existent" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:734 record not found [0.039ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "non-existent" ORDER BY `import_sessions`.`id` LIMIT 1 --- PASS: TestImportHandler_Errors (0.00s) === RUN TestImportHandler_DetectImports === RUN TestImportHandler_DetectImports/no_imports === RUN TestImportHandler_DetectImports/single_import === RUN TestImportHandler_DetectImports/multiple_imports === RUN TestImportHandler_DetectImports/import_with_comment --- PASS: TestImportHandler_DetectImports (0.00s) --- PASS: TestImportHandler_DetectImports/no_imports (0.00s) --- PASS: TestImportHandler_DetectImports/single_import (0.00s) --- PASS: TestImportHandler_DetectImports/multiple_imports (0.00s) --- PASS: TestImportHandler_DetectImports/import_with_comment (0.00s) === RUN TestImportHandler_DetectImports_InvalidJSON --- PASS: TestImportHandler_DetectImports_InvalidJSON (0.00s) === RUN TestImportHandler_UploadMulti === RUN TestImportHandler_UploadMulti/single_Caddyfile === RUN TestImportHandler_UploadMulti/Caddyfile_with_site_files === RUN TestImportHandler_UploadMulti/missing_Caddyfile === RUN TestImportHandler_UploadMulti/path_traversal_in_filename === RUN TestImportHandler_UploadMulti/empty_file_content --- PASS: TestImportHandler_UploadMulti (0.01s) --- PASS: TestImportHandler_UploadMulti/single_Caddyfile (0.01s) --- PASS: TestImportHandler_UploadMulti/Caddyfile_with_site_files (0.00s) --- PASS: TestImportHandler_UploadMulti/missing_Caddyfile (0.00s) --- PASS: TestImportHandler_UploadMulti/path_traversal_in_filename (0.00s) --- PASS: TestImportHandler_UploadMulti/empty_file_content (0.00s) === RUN TestNotificationHandler_List --- PASS: TestNotificationHandler_List (0.00s) === RUN TestNotificationHandler_MarkAsRead --- PASS: TestNotificationHandler_MarkAsRead (0.00s) === RUN TestNotificationHandler_MarkAllAsRead --- PASS: TestNotificationHandler_MarkAllAsRead (0.00s) === RUN TestNotificationHandler_MarkAllAsRead_Error --- PASS: TestNotificationHandler_MarkAllAsRead_Error (0.00s) === RUN TestNotificationHandler_DBError --- PASS: TestNotificationHandler_DBError (0.00s) === RUN TestNotificationProviderHandler_CRUD [GIN] 2025/12/12 - 19:05:53 | 201 | 71.971µs | | POST "/api/v1/notifications/providers" [GIN] 2025/12/12 - 19:05:53 | 200 | 46.98µs | | GET "/api/v1/notifications/providers" [GIN] 2025/12/12 - 19:05:53 | 200 | 70.04µs | | PUT "/api/v1/notifications/providers/75de70f2-fff3-42d4-b47a-1fdea69c41aa" [GIN] 2025/12/12 - 19:05:53 | 200 | 32.96µs | | DELETE "/api/v1/notifications/providers/75de70f2-fff3-42d4-b47a-1fdea69c41aa" --- PASS: TestNotificationProviderHandler_CRUD (0.00s) === RUN TestNotificationProviderHandler_Templates [GIN] 2025/12/12 - 19:05:53 | 200 | 10.81µs | | GET "/api/v1/notifications/templates" --- PASS: TestNotificationProviderHandler_Templates (0.00s) === RUN TestNotificationProviderHandler_Test [GIN] 2025/12/12 - 19:05:53 | 400 | 80.19µs | | POST "/api/v1/notifications/providers/test" --- PASS: TestNotificationProviderHandler_Test (0.00s) === RUN TestNotificationProviderHandler_Errors [GIN] 2025/12/12 - 19:05:53 | 400 | 5.739µs | | POST "/api/v1/notifications/providers" [GIN] 2025/12/12 - 19:05:53 | 400 | 2.42µs | | PUT "/api/v1/notifications/providers/123" [GIN] 2025/12/12 - 19:05:53 | 400 | 2.57µs | | POST "/api/v1/notifications/providers/test" --- PASS: TestNotificationProviderHandler_Errors (0.00s) === RUN TestNotificationProviderHandler_InvalidCustomTemplate_Rejects [GIN] 2025/12/12 - 19:05:53 | 400 | 35.72µs | | POST "/api/v1/notifications/providers" [GIN] 2025/12/12 - 19:05:53 | 201 | 66.25µs | | POST "/api/v1/notifications/providers" [GIN] 2025/12/12 - 19:05:53 | 400 | 16.03µs | | PUT "/api/v1/notifications/providers/a0f9d3bf-98ac-497f-a92f-b6e4ff002230" --- PASS: TestNotificationProviderHandler_InvalidCustomTemplate_Rejects (0.00s) === RUN TestNotificationProviderHandler_Preview [GIN] 2025/12/12 - 19:05:53 | 200 | 61.36µs | | POST "/api/v1/notifications/providers/preview" [GIN] 2025/12/12 - 19:05:53 | 400 | 28.06µs | | POST "/api/v1/notifications/providers/preview" --- PASS: TestNotificationProviderHandler_Preview (0.00s) === RUN TestRemoteServerHandler_TestConnectionCustom [GIN] 2025/12/12 - 19:05:53 | 200 | 229.651µs | | POST "/api/v1/remote-servers/test" --- PASS: TestRemoteServerHandler_TestConnectionCustom (0.00s) === RUN TestRemoteServerHandler_FullCRUD [GIN] 2025/12/12 - 19:05:53 | 201 | 368.301µs | | POST "/api/v1/remote-servers" [GIN] 2025/12/12 - 19:05:53 | 200 | 64.74µs | | GET "/api/v1/remote-servers" [GIN] 2025/12/12 - 19:05:53 | 200 | 56.361µs | | GET "/api/v1/remote-servers/fc00458b-7fd6-4d4e-b956-5d9c9485d12a" [GIN] 2025/12/12 - 19:05:53 | 200 | 296.59µs | | PUT "/api/v1/remote-servers/fc00458b-7fd6-4d4e-b956-5d9c9485d12a" [GIN] 2025/12/12 - 19:05:53 | 204 | 144.94µs | | DELETE "/api/v1/remote-servers/fc00458b-7fd6-4d4e-b956-5d9c9485d12a" [GIN] 2025/12/12 - 19:05:53 | 400 | 5.6µs | | POST "/api/v1/remote-servers" 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found [0.037ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent-uuid" ORDER BY `remote_servers`.`id` LIMIT 1 [GIN] 2025/12/12 - 19:05:53 | 404 | 88.54µs | | PUT "/api/v1/remote-servers/non-existent-uuid" 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found [0.029ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent-uuid" ORDER BY `remote_servers`.`id` LIMIT 1 [GIN] 2025/12/12 - 19:05:53 | 404 | 51.22µs | | DELETE "/api/v1/remote-servers/non-existent-uuid" --- PASS: TestRemoteServerHandler_FullCRUD (0.00s) === RUN TestSettingsHandler_GetSettings --- PASS: TestSettingsHandler_GetSettings (0.00s) === RUN TestSettingsHandler_UpdateSettings --- PASS: TestSettingsHandler_UpdateSettings (0.00s) === RUN TestSettingsHandler_Errors --- PASS: TestSettingsHandler_Errors (0.00s) === RUN TestSettingsHandler_GetSMTPConfig --- PASS: TestSettingsHandler_GetSMTPConfig (0.00s) === RUN TestSettingsHandler_GetSMTPConfig_Empty --- PASS: TestSettingsHandler_GetSMTPConfig_Empty (0.00s) === RUN TestSettingsHandler_GetSMTPConfig_DatabaseError 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:46 sql: database is closed [0.007ms] [rows:0] SELECT * FROM `settings` WHERE category = "smtp" --- PASS: TestSettingsHandler_GetSMTPConfig_DatabaseError (0.00s) === RUN TestSettingsHandler_UpdateSMTPConfig_NonAdmin --- PASS: TestSettingsHandler_UpdateSMTPConfig_NonAdmin (0.00s) === RUN TestSettingsHandler_UpdateSMTPConfig_InvalidJSON --- PASS: TestSettingsHandler_UpdateSMTPConfig_InvalidJSON (0.00s) === RUN TestSettingsHandler_UpdateSMTPConfig_Success 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_host" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found [0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_port" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_username" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_password" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_from_address" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_encryption" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestSettingsHandler_UpdateSMTPConfig_Success (0.00s) === RUN TestSettingsHandler_UpdateSMTPConfig_KeepExistingPassword 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_username" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestSettingsHandler_UpdateSMTPConfig_KeepExistingPassword (0.00s) === RUN TestSettingsHandler_TestSMTPConfig_NonAdmin --- PASS: TestSettingsHandler_TestSMTPConfig_NonAdmin (0.00s) === RUN TestSettingsHandler_TestSMTPConfig_NotConfigured --- PASS: TestSettingsHandler_TestSMTPConfig_NotConfigured (0.00s) === RUN TestSettingsHandler_SendTestEmail_NonAdmin --- PASS: TestSettingsHandler_SendTestEmail_NonAdmin (0.00s) === RUN TestSettingsHandler_SendTestEmail_InvalidJSON --- PASS: TestSettingsHandler_SendTestEmail_InvalidJSON (0.00s) === RUN TestSettingsHandler_SendTestEmail_NotConfigured --- PASS: TestSettingsHandler_SendTestEmail_NotConfigured (0.00s) === RUN TestMaskPassword --- PASS: TestMaskPassword (0.00s) === RUN TestUptimeHandler_List [GIN] 2025/12/12 - 19:05:53 | 200 | 141.91µs | | GET "/api/v1/uptime" --- PASS: TestUptimeHandler_List (0.00s) === RUN TestUptimeHandler_GetHistory [GIN] 2025/12/12 - 19:05:53 | 200 | 85.09µs | | GET "/api/v1/uptime/monitor-1/history" --- PASS: TestUptimeHandler_GetHistory (0.00s) === RUN TestUptimeHandler_CheckMonitor [GIN] 2025/12/12 - 19:05:53 | 200 | 54.289µs | | POST "/api/v1/uptime/check-mon-1/check" --- PASS: TestUptimeHandler_CheckMonitor (0.00s) === RUN TestUptimeHandler_CheckMonitor_NotFound 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:869 record not found [0.039ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "nonexistent" ORDER BY `uptime_monitors`.`id` LIMIT 1 [GIN] 2025/12/12 - 19:05:53 | 404 | 79.99µs | | POST "/api/v1/uptime/nonexistent/check" --- PASS: TestUptimeHandler_CheckMonitor_NotFound (0.00s) === RUN TestUptimeHandler_Update === RUN TestUptimeHandler_Update/success [GIN] 2025/12/12 - 19:05:53 | 200 | 297.212µs | | PUT "/api/v1/uptime/monitor-update" === RUN TestUptimeHandler_Update/invalid_json [GIN] 2025/12/12 - 19:05:53 | 400 | 6.02µs | | PUT "/api/v1/uptime/monitor-1" === RUN TestUptimeHandler_Update/not_found 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:883 record not found [0.027ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "nonexistent" ORDER BY `uptime_monitors`.`id` LIMIT 1 [GIN] 2025/12/12 - 19:05:53 | 500 | 71.829µs | | PUT "/api/v1/uptime/nonexistent" --- PASS: TestUptimeHandler_Update (0.01s) --- PASS: TestUptimeHandler_Update/success (0.00s) --- PASS: TestUptimeHandler_Update/invalid_json (0.00s) --- PASS: TestUptimeHandler_Update/not_found (0.00s) === RUN TestUptimeHandler_DeleteAndSync === RUN TestUptimeHandler_DeleteAndSync/delete_monitor [GIN] 2025/12/12 - 19:05:53 | 200 | 131.741µs | | DELETE "/api/v1/uptime/mon-delete" 2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/uptime_handler_test.go:202 record not found [0.042ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "mon-delete" ORDER BY `uptime_monitors`.`id` LIMIT 1 === RUN TestUptimeHandler_DeleteAndSync/sync_creates_monitor_for_proxy_host 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.063ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.031ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "127.0.0.1" ORDER BY `uptime_hosts`.`id` LIMIT 1 [GIN] 2025/12/12 - 19:05:53 | 200 | 405.001µs | | POST "/api/v1/uptime/sync" === RUN TestUptimeHandler_DeleteAndSync/update_enabled_via_PUT [GIN] 2025/12/12 - 19:05:53 | 200 | 121.051µs | | PUT "/api/v1/uptime/mon-enable" --- PASS: TestUptimeHandler_DeleteAndSync (0.01s) --- PASS: TestUptimeHandler_DeleteAndSync/delete_monitor (0.00s) --- PASS: TestUptimeHandler_DeleteAndSync/sync_creates_monitor_for_proxy_host (0.00s) --- PASS: TestUptimeHandler_DeleteAndSync/update_enabled_via_PUT (0.00s) === RUN TestUptimeHandler_Sync_Success [GIN] 2025/12/12 - 19:05:53 | 200 | 63.5µs | | POST "/api/v1/uptime/sync" --- PASS: TestUptimeHandler_Sync_Success (0.00s) === RUN TestUptimeHandler_Delete_Error 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:911 no such table: uptime_monitors [0.017ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "nonexistent" ORDER BY `uptime_monitors`.`id` LIMIT 1 [GIN] 2025/12/12 - 19:05:53 | 500 | 53.249µs | | DELETE "/api/v1/uptime/nonexistent" --- PASS: TestUptimeHandler_Delete_Error (0.00s) === RUN TestUptimeHandler_List_Error 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:863 no such table: uptime_monitors [0.015ms] [rows:0] SELECT * FROM `uptime_monitors` ORDER BY name ASC [GIN] 2025/12/12 - 19:05:53 | 500 | 50.51µs | | GET "/api/v1/uptime" --- PASS: TestUptimeHandler_List_Error (0.00s) === RUN TestUptimeHandler_GetHistory_Error 2025/12/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:877 no such table: uptime_heartbeats [0.020ms] [rows:0] SELECT * FROM `uptime_heartbeats` WHERE monitor_id = "monitor-1" ORDER BY created_at desc LIMIT 50 [GIN] 2025/12/12 - 19:05:53 | 500 | 65.371µs | | GET "/api/v1/uptime/monitor-1/history" --- PASS: TestUptimeHandler_GetHistory_Error (0.00s) FAIL FAIL github.com/Wikid82/charon/backend/internal/api/handlers 20.305s === RUN TestAuthMiddleware_MissingHeader --- PASS: TestAuthMiddleware_MissingHeader (0.00s) === RUN TestRequireRole_Success --- PASS: TestRequireRole_Success (0.00s) === RUN TestRequireRole_Forbidden --- PASS: TestRequireRole_Forbidden (0.00s) === RUN TestAuthMiddleware_Cookie --- PASS: TestAuthMiddleware_Cookie (0.07s) === RUN TestAuthMiddleware_ValidToken --- PASS: TestAuthMiddleware_ValidToken (0.06s) === RUN TestAuthMiddleware_PrefersAuthorizationHeader --- PASS: TestAuthMiddleware_PrefersAuthorizationHeader (0.06s) === RUN TestAuthMiddleware_InvalidToken --- PASS: TestAuthMiddleware_InvalidToken (0.00s) === RUN TestRequireRole_MissingRoleInContext --- PASS: TestRequireRole_MissingRoleInContext (0.00s) === RUN TestRecoveryLogsStacktraceVerbose --- PASS: TestRecoveryLogsStacktraceVerbose (0.00s) === RUN TestRecoveryLogsBriefWhenNotVerbose --- PASS: TestRecoveryLogsBriefWhenNotVerbose (0.00s) === RUN TestRecoverySanitizesHeadersAndPath --- PASS: TestRecoverySanitizesHeadersAndPath (0.00s) === RUN TestRequestIDAddsHeaderAndLogger --- PASS: TestRequestIDAddsHeaderAndLogger (0.00s) === RUN TestRequestLoggerSanitizesPath --- PASS: TestRequestLoggerSanitizesPath (0.00s) === RUN TestRequestLoggerIncludesRequestID --- PASS: TestRequestLoggerIncludesRequestID (0.00s) === RUN TestSanitizeHeaders === RUN TestSanitizeHeaders/nil_headers === RUN TestSanitizeHeaders/redacts_sensitive_headers === RUN TestSanitizeHeaders/sanitizes_and_truncates_values --- PASS: TestSanitizeHeaders (0.00s) --- PASS: TestSanitizeHeaders/nil_headers (0.00s) --- PASS: TestSanitizeHeaders/redacts_sensitive_headers (0.00s) --- PASS: TestSanitizeHeaders/sanitizes_and_truncates_values (0.00s) === RUN TestSanitizePath --- PASS: TestSanitizePath (0.00s) === RUN TestSecurityHeaders === RUN TestSecurityHeaders/production_mode_sets_HSTS === RUN TestSecurityHeaders/development_mode_skips_HSTS === RUN TestSecurityHeaders/sets_X-Frame-Options === RUN TestSecurityHeaders/sets_X-Content-Type-Options === RUN TestSecurityHeaders/sets_X-XSS-Protection === RUN TestSecurityHeaders/sets_Referrer-Policy === RUN TestSecurityHeaders/sets_Content-Security-Policy === RUN TestSecurityHeaders/development_mode_CSP_allows_unsafe-eval === RUN TestSecurityHeaders/sets_Permissions-Policy === RUN TestSecurityHeaders/sets_Cross-Origin-Opener-Policy === RUN TestSecurityHeaders/sets_Cross-Origin-Resource-Policy --- PASS: TestSecurityHeaders (0.00s) --- PASS: TestSecurityHeaders/production_mode_sets_HSTS (0.00s) --- PASS: TestSecurityHeaders/development_mode_skips_HSTS (0.00s) --- PASS: TestSecurityHeaders/sets_X-Frame-Options (0.00s) --- PASS: TestSecurityHeaders/sets_X-Content-Type-Options (0.00s) --- PASS: TestSecurityHeaders/sets_X-XSS-Protection (0.00s) --- PASS: TestSecurityHeaders/sets_Referrer-Policy (0.00s) --- PASS: TestSecurityHeaders/sets_Content-Security-Policy (0.00s) --- PASS: TestSecurityHeaders/development_mode_CSP_allows_unsafe-eval (0.00s) --- PASS: TestSecurityHeaders/sets_Permissions-Policy (0.00s) --- PASS: TestSecurityHeaders/sets_Cross-Origin-Opener-Policy (0.00s) --- PASS: TestSecurityHeaders/sets_Cross-Origin-Resource-Policy (0.00s) === RUN TestSecurityHeadersCustomCSP --- PASS: TestSecurityHeadersCustomCSP (0.00s) === RUN TestDefaultSecurityHeadersConfig --- PASS: TestDefaultSecurityHeadersConfig (0.00s) === RUN TestBuildCSP === RUN TestBuildCSP/production_CSP === RUN TestBuildCSP/development_CSP --- PASS: TestBuildCSP (0.00s) --- PASS: TestBuildCSP/production_CSP (0.00s) --- PASS: TestBuildCSP/development_CSP (0.00s) === RUN TestBuildPermissionsPolicy --- PASS: TestBuildPermissionsPolicy (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/api/middleware (cached) === RUN TestRegister time="2025-12-12T19:01:39Z" level=info msg="Cleaning up invalid Let's Encrypt certificate associations..." time="2025-12-12T19:01:39Z" level=info msg="GeoIP database not found - geo-blocking features will be unavailable" path=/app/data/geoip/GeoLite2-Country.mmdb time="2025-12-12T19:01:39Z" level=info msg="Using Caddy data directory for certificates scan" caddy_data_dir=/data --- PASS: TestRegister (0.01s) === RUN TestRegisterImportHandler --- PASS: TestRegisterImportHandler (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/api/routes (cached) === RUN TestIntegration_WAF_BlockAndMonitor time="2025-12-12T19:01:39Z" level=info msg="Cleaning up invalid Let's Encrypt certificate associations..." time="2025-12-12T19:01:39Z" level=info msg="GeoIP database not found - geo-blocking features will be unavailable" path=/app/data/geoip/GeoLite2-Country.mmdb time="2025-12-12T19:01:39Z" level=info msg="Using Caddy data directory for certificates scan" caddy_data_dir=data/caddy/data time="2025-12-12T19:01:39Z" level=info msg="CertificateService: scanning cert directory" certRoot=data/caddy/data/certificates time="2025-12-12T19:01:39Z" level=info msg="CertificateService: cert directory does not exist" certRoot=data/caddy/data/certificates time="2025-12-12T19:01:39Z" level=info msg="CertificateService: disk sync complete" count=0 time="2025-12-12T19:01:39Z" level=info msg="Cleaning up invalid Let's Encrypt certificate associations..." time="2025-12-12T19:01:39Z" level=info msg="GeoIP database not found - geo-blocking features will be unavailable" path=/app/data/geoip/GeoLite2-Country.mmdb time="2025-12-12T19:01:39Z" level=info msg="Using Caddy data directory for certificates scan" caddy_data_dir=data/caddy/data time="2025-12-12T19:01:39Z" level=info msg="CertificateService: scanning cert directory" certRoot=data/caddy/data/certificates time="2025-12-12T19:01:39Z" level=info msg="CertificateService: cert directory does not exist" certRoot=data/caddy/data/certificates time="2025-12-12T19:01:39Z" level=info msg="CertificateService: disk sync complete" count=0 --- PASS: TestIntegration_WAF_BlockAndMonitor (0.03s) === RUN TestInviteToken_MustBeUnguessable --- PASS: TestInviteToken_MustBeUnguessable (0.07s) === RUN TestInviteToken_ExpiredCannotBeUsed --- PASS: TestInviteToken_ExpiredCannotBeUsed (0.06s) === RUN TestInviteToken_CannotBeReused --- PASS: TestInviteToken_CannotBeReused (0.14s) === RUN TestInviteUser_EmailValidation === RUN TestInviteUser_EmailValidation/empty_email === RUN TestInviteUser_EmailValidation/invalid_email_no_@ === RUN TestInviteUser_EmailValidation/invalid_email_no_domain === RUN TestInviteUser_EmailValidation/sql_injection_attempt === RUN TestInviteUser_EmailValidation/script_injection === RUN TestInviteUser_EmailValidation/valid_email --- PASS: TestInviteUser_EmailValidation (0.13s) --- PASS: TestInviteUser_EmailValidation/empty_email (0.00s) --- PASS: TestInviteUser_EmailValidation/invalid_email_no_@ (0.00s) --- PASS: TestInviteUser_EmailValidation/invalid_email_no_domain (0.00s) --- PASS: TestInviteUser_EmailValidation/sql_injection_attempt (0.00s) --- PASS: TestInviteUser_EmailValidation/script_injection (0.00s) --- PASS: TestInviteUser_EmailValidation/valid_email (0.00s) === RUN TestAcceptInvite_PasswordValidation === RUN TestAcceptInvite_PasswordValidation/empty_password === RUN TestAcceptInvite_PasswordValidation/too_short === RUN TestAcceptInvite_PasswordValidation/7_chars === RUN TestAcceptInvite_PasswordValidation/8_chars_valid --- PASS: TestAcceptInvite_PasswordValidation (0.19s) --- PASS: TestAcceptInvite_PasswordValidation/empty_password (0.00s) --- PASS: TestAcceptInvite_PasswordValidation/too_short (0.00s) --- PASS: TestAcceptInvite_PasswordValidation/7_chars (0.00s) --- PASS: TestAcceptInvite_PasswordValidation/8_chars_valid (0.06s) === RUN TestUserEndpoints_RequireAdmin === RUN TestUserEndpoints_RequireAdmin/GET_/api/users === RUN TestUserEndpoints_RequireAdmin/POST_/api/users === RUN TestUserEndpoints_RequireAdmin/POST_/api/users/invite === RUN TestUserEndpoints_RequireAdmin/GET_/api/users/1 === RUN TestUserEndpoints_RequireAdmin/PUT_/api/users/1 === RUN TestUserEndpoints_RequireAdmin/DELETE_/api/users/1 === RUN TestUserEndpoints_RequireAdmin/PUT_/api/users/1/permissions --- PASS: TestUserEndpoints_RequireAdmin (0.07s) --- PASS: TestUserEndpoints_RequireAdmin/GET_/api/users (0.00s) --- PASS: TestUserEndpoints_RequireAdmin/POST_/api/users (0.00s) --- PASS: TestUserEndpoints_RequireAdmin/POST_/api/users/invite (0.00s) --- PASS: TestUserEndpoints_RequireAdmin/GET_/api/users/1 (0.00s) --- PASS: TestUserEndpoints_RequireAdmin/PUT_/api/users/1 (0.00s) --- PASS: TestUserEndpoints_RequireAdmin/DELETE_/api/users/1 (0.00s) --- PASS: TestUserEndpoints_RequireAdmin/PUT_/api/users/1/permissions (0.00s) === RUN TestSMTPEndpoints_RequireAdmin === RUN TestSMTPEndpoints_RequireAdmin/POST_/api/settings/smtp === RUN TestSMTPEndpoints_RequireAdmin/POST_/api/settings/smtp/test === RUN TestSMTPEndpoints_RequireAdmin/POST_/api/settings/smtp/test-email --- PASS: TestSMTPEndpoints_RequireAdmin (0.06s) --- PASS: TestSMTPEndpoints_RequireAdmin/POST_/api/settings/smtp (0.00s) --- PASS: TestSMTPEndpoints_RequireAdmin/POST_/api/settings/smtp/test (0.00s) --- PASS: TestSMTPEndpoints_RequireAdmin/POST_/api/settings/smtp/test-email (0.00s) === RUN TestSMTPConfig_PasswordMasked --- PASS: TestSMTPConfig_PasswordMasked (0.07s) === RUN TestSMTPConfig_PortValidation === RUN TestSMTPConfig_PortValidation/port_0_invalid === RUN TestSMTPConfig_PortValidation/port_-1_invalid === RUN TestSMTPConfig_PortValidation/port_65536_invalid === RUN TestSMTPConfig_PortValidation/port_587_valid === RUN TestSMTPConfig_PortValidation/port_465_valid === RUN TestSMTPConfig_PortValidation/port_25_valid --- PASS: TestSMTPConfig_PortValidation (0.07s) --- PASS: TestSMTPConfig_PortValidation/port_0_invalid (0.00s) --- PASS: TestSMTPConfig_PortValidation/port_-1_invalid (0.00s) --- PASS: TestSMTPConfig_PortValidation/port_65536_invalid (0.00s) --- PASS: TestSMTPConfig_PortValidation/port_587_valid (0.00s) --- PASS: TestSMTPConfig_PortValidation/port_465_valid (0.00s) --- PASS: TestSMTPConfig_PortValidation/port_25_valid (0.00s) === RUN TestSMTPConfig_EncryptionValidation === RUN TestSMTPConfig_EncryptionValidation/empty_encryption_invalid === RUN TestSMTPConfig_EncryptionValidation/invalid_encryption === RUN TestSMTPConfig_EncryptionValidation/tls_lowercase_valid === RUN TestSMTPConfig_EncryptionValidation/starttls_valid === RUN TestSMTPConfig_EncryptionValidation/none_valid --- PASS: TestSMTPConfig_EncryptionValidation (0.07s) --- PASS: TestSMTPConfig_EncryptionValidation/empty_encryption_invalid (0.00s) --- PASS: TestSMTPConfig_EncryptionValidation/invalid_encryption (0.00s) --- PASS: TestSMTPConfig_EncryptionValidation/tls_lowercase_valid (0.00s) --- PASS: TestSMTPConfig_EncryptionValidation/starttls_valid (0.00s) --- PASS: TestSMTPConfig_EncryptionValidation/none_valid (0.00s) === RUN TestInviteUser_DuplicateEmailBlocked --- PASS: TestInviteUser_DuplicateEmailBlocked (0.07s) === RUN TestInviteUser_EmailCaseInsensitive --- PASS: TestInviteUser_EmailCaseInsensitive (0.12s) === RUN TestDeleteUser_CannotDeleteSelf --- PASS: TestDeleteUser_CannotDeleteSelf (0.06s) === RUN TestUpdatePermissions_ValidModes === RUN TestUpdatePermissions_ValidModes/allow_all_valid === RUN TestUpdatePermissions_ValidModes/deny_all_valid === RUN TestUpdatePermissions_ValidModes/invalid_mode === RUN TestUpdatePermissions_ValidModes/empty_mode --- PASS: TestUpdatePermissions_ValidModes (0.07s) --- PASS: TestUpdatePermissions_ValidModes/allow_all_valid (0.00s) --- PASS: TestUpdatePermissions_ValidModes/deny_all_valid (0.00s) --- PASS: TestUpdatePermissions_ValidModes/invalid_mode (0.00s) --- PASS: TestUpdatePermissions_ValidModes/empty_mode (0.00s) === RUN TestPublicEndpoints_NoAuthRequired --- PASS: TestPublicEndpoints_NoAuthRequired (0.06s) PASS ok github.com/Wikid82/charon/backend/internal/api/tests (cached) === RUN TestClient_Load_Success --- PASS: TestClient_Load_Success (0.00s) === RUN TestClient_Load_Failure --- PASS: TestClient_Load_Failure (0.00s) === RUN TestClient_GetConfig_Success --- PASS: TestClient_GetConfig_Success (0.00s) === RUN TestClient_Ping_Success --- PASS: TestClient_Ping_Success (0.00s) === RUN TestClient_Ping_Unreachable --- PASS: TestClient_Ping_Unreachable (0.00s) === RUN TestClient_Load_CreateRequestFailure --- PASS: TestClient_Load_CreateRequestFailure (0.00s) === RUN TestClient_Ping_CreateRequestFailure --- PASS: TestClient_Ping_CreateRequestFailure (0.00s) === RUN TestClient_GetConfig_Failure --- PASS: TestClient_GetConfig_Failure (0.00s) === RUN TestClient_GetConfig_InvalidJSON --- PASS: TestClient_GetConfig_InvalidJSON (0.00s) === RUN TestClient_Ping_Failure --- PASS: TestClient_Ping_Failure (0.00s) === RUN TestClient_RequestCreationErrors --- PASS: TestClient_RequestCreationErrors (0.00s) === RUN TestClient_NetworkErrors --- PASS: TestClient_NetworkErrors (0.00s) === RUN TestClient_Load_MarshalFailure --- PASS: TestClient_Load_MarshalFailure (0.00s) === RUN TestClient_Ping_TransportError --- PASS: TestClient_Ping_TransportError (0.00s) === RUN TestBuildACLHandler_GeoBlacklist --- PASS: TestBuildACLHandler_GeoBlacklist (0.00s) === RUN TestBuildACLHandler_UnknownTypeReturnsNil --- PASS: TestBuildACLHandler_UnknownTypeReturnsNil (0.00s) === RUN TestBuildACLHandler_GeoWhitelist --- PASS: TestBuildACLHandler_GeoWhitelist (0.00s) === RUN TestBuildACLHandler_LocalNetwork --- PASS: TestBuildACLHandler_LocalNetwork (0.00s) === RUN TestBuildACLHandler_IPRules --- PASS: TestBuildACLHandler_IPRules (0.00s) === RUN TestBuildACLHandler_InvalidIPJSON --- PASS: TestBuildACLHandler_InvalidIPJSON (0.00s) === RUN TestBuildACLHandler_NoIPRulesReturnsNil --- PASS: TestBuildACLHandler_NoIPRulesReturnsNil (0.00s) === RUN TestBuildACLHandler_Whitelist --- PASS: TestBuildACLHandler_Whitelist (0.00s) === RUN TestBuildCrowdSecHandler_Disabled --- PASS: TestBuildCrowdSecHandler_Disabled (0.00s) === RUN TestBuildCrowdSecHandler_EnabledWithoutConfig --- PASS: TestBuildCrowdSecHandler_EnabledWithoutConfig (0.00s) === RUN TestBuildCrowdSecHandler_EnabledWithEmptyAPIURL --- PASS: TestBuildCrowdSecHandler_EnabledWithEmptyAPIURL (0.00s) === RUN TestBuildCrowdSecHandler_EnabledWithCustomAPIURL --- PASS: TestBuildCrowdSecHandler_EnabledWithCustomAPIURL (0.00s) === RUN TestBuildCrowdSecHandler_JSONFormat --- PASS: TestBuildCrowdSecHandler_JSONFormat (0.00s) === RUN TestBuildCrowdSecHandler_WithHost --- PASS: TestBuildCrowdSecHandler_WithHost (0.00s) === RUN TestGenerateConfig_WithCrowdSec --- PASS: TestGenerateConfig_WithCrowdSec (0.00s) === RUN TestGenerateConfig_CrowdSecDisabled --- PASS: TestGenerateConfig_CrowdSecDisabled (0.00s) === RUN TestGenerateConfig_CatchAllFrontend --- PASS: TestGenerateConfig_CatchAllFrontend (0.00s) === RUN TestGenerateConfig_AdvancedInvalidJSON time="2025-12-12T19:01:40Z" level=warning msg="Failed to parse advanced_config for host" error="invalid character 'i' looking for beginning of object key string" host=adv1 --- PASS: TestGenerateConfig_AdvancedInvalidJSON (0.00s) === RUN TestGenerateConfig_AdvancedArrayHandler --- PASS: TestGenerateConfig_AdvancedArrayHandler (0.00s) === RUN TestGenerateConfig_LowercaseDomains --- PASS: TestGenerateConfig_LowercaseDomains (0.00s) === RUN TestGenerateConfig_AdvancedObjectHandler --- PASS: TestGenerateConfig_AdvancedObjectHandler (0.00s) === RUN TestGenerateConfig_AdvancedHeadersStringToArray --- PASS: TestGenerateConfig_AdvancedHeadersStringToArray (0.00s) === RUN TestGenerateConfig_ACLWhitelistIncluded --- PASS: TestGenerateConfig_ACLWhitelistIncluded (0.00s) === RUN TestGenerateConfig_SkipsEmptyDomainEntries --- PASS: TestGenerateConfig_SkipsEmptyDomainEntries (0.00s) === RUN TestGenerateConfig_AdvancedNoHandlerKey time="2025-12-12T19:01:40Z" level=warning msg="advanced_config for host is not a handler object" host=adv3 --- PASS: TestGenerateConfig_AdvancedNoHandlerKey (0.00s) === RUN TestGenerateConfig_AdvancedUnexpectedJSONStructure time="2025-12-12T19:01:40Z" level=warning msg="advanced_config for host has unexpected JSON structure" host=adv4 --- PASS: TestGenerateConfig_AdvancedUnexpectedJSONStructure (0.00s) === RUN TestBuildACLHandler_UnknownIPTypeReturnsNil --- PASS: TestBuildACLHandler_UnknownIPTypeReturnsNil (0.00s) === RUN TestGenerateConfig_SecurityPipeline_Order --- PASS: TestGenerateConfig_SecurityPipeline_Order (0.00s) === RUN TestGenerateConfig_SecurityPipeline_OmitWhenDisabled --- PASS: TestGenerateConfig_SecurityPipeline_OmitWhenDisabled (0.00s) === RUN TestGenerateConfig_ZerosslAndBothProviders --- PASS: TestGenerateConfig_ZerosslAndBothProviders (0.00s) === RUN TestGenerateConfig_SecurityPipeline_Order_Locations --- PASS: TestGenerateConfig_SecurityPipeline_Order_Locations (0.00s) === RUN TestGenerateConfig_ACLLogWarning --- PASS: TestGenerateConfig_ACLLogWarning (0.00s) === RUN TestGenerateConfig_ACLHandlerIncluded --- PASS: TestGenerateConfig_ACLHandlerIncluded (0.00s) === RUN TestGenerateConfig_DecisionsBlockWithAdminExclusion config_generate_additional_test.go:147: handles: [ { "handler": "subroute", "routes": [ { "handle": [ { "body": "Access denied: Blocked by security decision", "handler": "static_response", "status_code": 403 } ], "match": [ { "remote_ip": { "ranges": [ "1.2.3.4" ] } }, { "not": [ { "remote_ip": { "ranges": [ "10.0.0.1/32" ] } } ] } ], "terminal": true } ] }, { "flush_interval": -1, "handler": "reverse_proxy", "upstreams": [ { "dial": "app:8080" } ] } ] --- PASS: TestGenerateConfig_DecisionsBlockWithAdminExclusion (0.00s) === RUN TestGenerateConfig_WAFModeAndRulesetReference --- PASS: TestGenerateConfig_WAFModeAndRulesetReference (0.00s) === RUN TestGenerateConfig_WAFModeDisabledSkipsHandler --- PASS: TestGenerateConfig_WAFModeDisabledSkipsHandler (0.00s) === RUN TestGenerateConfig_WAFSelectedSetsContentAndMode --- PASS: TestGenerateConfig_WAFSelectedSetsContentAndMode (0.00s) === RUN TestGenerateConfig_DecisionAdminPartsEmpty --- PASS: TestGenerateConfig_DecisionAdminPartsEmpty (0.00s) === RUN TestNormalizeHeaderOps_PreserveStringArray --- PASS: TestNormalizeHeaderOps_PreserveStringArray (0.00s) === RUN TestGenerateConfig_WAFUsesRuleSet --- PASS: TestGenerateConfig_WAFUsesRuleSet (0.00s) === RUN TestGenerateConfig_WAFUsesRuleSetFromAdvancedConfig --- PASS: TestGenerateConfig_WAFUsesRuleSetFromAdvancedConfig (0.00s) === RUN TestGenerateConfig_WAFUsesRuleSetFromAdvancedConfig_Array --- PASS: TestGenerateConfig_WAFUsesRuleSetFromAdvancedConfig_Array (0.00s) === RUN TestGenerateConfig_WAFUsesRulesetFromSecCfgFallback --- PASS: TestGenerateConfig_WAFUsesRulesetFromSecCfgFallback (0.00s) === RUN TestGenerateConfig_RateLimitFromSecCfg --- PASS: TestGenerateConfig_RateLimitFromSecCfg (0.00s) === RUN TestGenerateConfig_CrowdSecHandlerFromSecCfg --- PASS: TestGenerateConfig_CrowdSecHandlerFromSecCfg (0.00s) === RUN TestGenerateConfig_EmptyHostsAndNoFrontend --- PASS: TestGenerateConfig_EmptyHostsAndNoFrontend (0.00s) === RUN TestGenerateConfig_SkipsInvalidCustomCert --- PASS: TestGenerateConfig_SkipsInvalidCustomCert (0.00s) === RUN TestGenerateConfig_SkipsDuplicateDomains --- PASS: TestGenerateConfig_SkipsDuplicateDomains (0.00s) === RUN TestGenerateConfig_LoadPEMSetsTLSWhenNoACME --- PASS: TestGenerateConfig_LoadPEMSetsTLSWhenNoACME (0.00s) === RUN TestGenerateConfig_DefaultAcmeStaging --- PASS: TestGenerateConfig_DefaultAcmeStaging (0.00s) === RUN TestGenerateConfig_ACLHandlerBuildError --- PASS: TestGenerateConfig_ACLHandlerBuildError (0.00s) === RUN TestGenerateConfig_SkipHostDomainEmptyAndDisabled --- PASS: TestGenerateConfig_SkipHostDomainEmptyAndDisabled (0.00s) === RUN TestGenerateConfig_CustomCertsAndTLS --- PASS: TestGenerateConfig_CustomCertsAndTLS (0.00s) === RUN TestGenerateConfig_Empty --- PASS: TestGenerateConfig_Empty (0.00s) === RUN TestGenerateConfig_SingleHost --- PASS: TestGenerateConfig_SingleHost (0.00s) === RUN TestGenerateConfig_MultipleHosts --- PASS: TestGenerateConfig_MultipleHosts (0.00s) === RUN TestGenerateConfig_WebSocketEnabled --- PASS: TestGenerateConfig_WebSocketEnabled (0.00s) === RUN TestGenerateConfig_EmptyDomain --- PASS: TestGenerateConfig_EmptyDomain (0.00s) === RUN TestGenerateConfig_Logging --- PASS: TestGenerateConfig_Logging (0.00s) === RUN TestGenerateConfig_IPHostsSkipAutoHTTPS --- PASS: TestGenerateConfig_IPHostsSkipAutoHTTPS (0.00s) === RUN TestGenerateConfig_Advanced --- PASS: TestGenerateConfig_Advanced (0.00s) === RUN TestGenerateConfig_ACMEStaging --- PASS: TestGenerateConfig_ACMEStaging (0.00s) === RUN TestBuildACLHandler_WhitelistAndBlacklistAdminMerge --- PASS: TestBuildACLHandler_WhitelistAndBlacklistAdminMerge (0.00s) === RUN TestBuildACLHandler_GeoAndLocalNetwork --- PASS: TestBuildACLHandler_GeoAndLocalNetwork (0.00s) === RUN TestBuildACLHandler_AdminWhitelistParsing --- PASS: TestBuildACLHandler_AdminWhitelistParsing (0.00s) === RUN TestBuildRateLimitHandler_Disabled --- PASS: TestBuildRateLimitHandler_Disabled (0.00s) === RUN TestBuildRateLimitHandler_InvalidValues --- PASS: TestBuildRateLimitHandler_InvalidValues (0.00s) === RUN TestBuildRateLimitHandler_ValidConfig --- PASS: TestBuildRateLimitHandler_ValidConfig (0.00s) === RUN TestBuildRateLimitHandler_JSONFormat --- PASS: TestBuildRateLimitHandler_JSONFormat (0.00s) === RUN TestGenerateConfig_WithRateLimiting --- PASS: TestGenerateConfig_WithRateLimiting (0.00s) === RUN TestBuildRateLimitHandler_UsesBurst --- PASS: TestBuildRateLimitHandler_UsesBurst (0.00s) === RUN TestBuildRateLimitHandler_DefaultBurst --- PASS: TestBuildRateLimitHandler_DefaultBurst (0.00s) === RUN TestBuildRateLimitHandler_BypassList --- PASS: TestBuildRateLimitHandler_BypassList (0.00s) === RUN TestBuildRateLimitHandler_BypassList_PlainIPs --- PASS: TestBuildRateLimitHandler_BypassList_PlainIPs (0.00s) === RUN TestBuildRateLimitHandler_BypassList_InvalidEntries --- PASS: TestBuildRateLimitHandler_BypassList_InvalidEntries (0.00s) === RUN TestBuildRateLimitHandler_BypassList_Empty --- PASS: TestBuildRateLimitHandler_BypassList_Empty (0.00s) === RUN TestBuildRateLimitHandler_BypassList_AllInvalid --- PASS: TestBuildRateLimitHandler_BypassList_AllInvalid (0.00s) === RUN TestParseBypassCIDRs === RUN TestParseBypassCIDRs/empty === RUN TestParseBypassCIDRs/single_cidr === RUN TestParseBypassCIDRs/multiple_cidrs === RUN TestParseBypassCIDRs/plain_ipv4 === RUN TestParseBypassCIDRs/plain_ipv6 === RUN TestParseBypassCIDRs/mixed === RUN TestParseBypassCIDRs/with_spaces === RUN TestParseBypassCIDRs/all_invalid --- PASS: TestParseBypassCIDRs (0.00s) --- PASS: TestParseBypassCIDRs/empty (0.00s) --- PASS: TestParseBypassCIDRs/single_cidr (0.00s) --- PASS: TestParseBypassCIDRs/multiple_cidrs (0.00s) --- PASS: TestParseBypassCIDRs/plain_ipv4 (0.00s) --- PASS: TestParseBypassCIDRs/plain_ipv6 (0.00s) --- PASS: TestParseBypassCIDRs/mixed (0.00s) --- PASS: TestParseBypassCIDRs/with_spaces (0.00s) --- PASS: TestParseBypassCIDRs/all_invalid (0.00s) === RUN TestBuildWAFHandler_ParanoiaLevel === RUN TestBuildWAFHandler_ParanoiaLevel/level_1_default === RUN TestBuildWAFHandler_ParanoiaLevel/level_1_explicit === RUN TestBuildWAFHandler_ParanoiaLevel/level_2 === RUN TestBuildWAFHandler_ParanoiaLevel/level_3 === RUN TestBuildWAFHandler_ParanoiaLevel/level_4_max === RUN TestBuildWAFHandler_ParanoiaLevel/level_invalid_high === RUN TestBuildWAFHandler_ParanoiaLevel/level_invalid_neg --- PASS: TestBuildWAFHandler_ParanoiaLevel (0.00s) --- PASS: TestBuildWAFHandler_ParanoiaLevel/level_1_default (0.00s) --- PASS: TestBuildWAFHandler_ParanoiaLevel/level_1_explicit (0.00s) --- PASS: TestBuildWAFHandler_ParanoiaLevel/level_2 (0.00s) --- PASS: TestBuildWAFHandler_ParanoiaLevel/level_3 (0.00s) --- PASS: TestBuildWAFHandler_ParanoiaLevel/level_4_max (0.00s) --- PASS: TestBuildWAFHandler_ParanoiaLevel/level_invalid_high (0.00s) --- PASS: TestBuildWAFHandler_ParanoiaLevel/level_invalid_neg (0.00s) === RUN TestBuildWAFHandler_Exclusions --- PASS: TestBuildWAFHandler_Exclusions (0.00s) === RUN TestBuildWAFHandler_ExclusionsWithTarget --- PASS: TestBuildWAFHandler_ExclusionsWithTarget (0.00s) === RUN TestBuildWAFHandler_PerHostDisabled --- PASS: TestBuildWAFHandler_PerHostDisabled (0.00s) === RUN TestBuildWAFHandler_MonitorMode --- PASS: TestBuildWAFHandler_MonitorMode (0.00s) === RUN TestBuildWAFHandler_GlobalDisabled --- PASS: TestBuildWAFHandler_GlobalDisabled (0.00s) === RUN TestBuildWAFHandler_NoRuleset --- PASS: TestBuildWAFHandler_NoRuleset (0.00s) === RUN TestParseWAFExclusions === RUN TestParseWAFExclusions/empty === RUN TestParseWAFExclusions/single_exclusion === RUN TestParseWAFExclusions/multiple_exclusions === RUN TestParseWAFExclusions/invalid_json --- PASS: TestParseWAFExclusions (0.00s) --- PASS: TestParseWAFExclusions/empty (0.00s) --- PASS: TestParseWAFExclusions/single_exclusion (0.00s) --- PASS: TestParseWAFExclusions/multiple_exclusions (0.00s) --- PASS: TestParseWAFExclusions/invalid_json (0.00s) === RUN TestGenerateConfig_WithWAFPerHostDisabled --- PASS: TestGenerateConfig_WithWAFPerHostDisabled (0.00s) === RUN TestBuildWAFHandler_PathTraversalAttack === RUN TestBuildWAFHandler_PathTraversalAttack/Path_traversal_in_ruleset_name === RUN TestBuildWAFHandler_PathTraversalAttack/Null_byte_injection === RUN TestBuildWAFHandler_PathTraversalAttack/URL_encoded_traversal --- PASS: TestBuildWAFHandler_PathTraversalAttack (0.00s) --- PASS: TestBuildWAFHandler_PathTraversalAttack/Path_traversal_in_ruleset_name (0.00s) --- PASS: TestBuildWAFHandler_PathTraversalAttack/Null_byte_injection (0.00s) --- PASS: TestBuildWAFHandler_PathTraversalAttack/URL_encoded_traversal (0.00s) === RUN TestBuildWAFHandler_SQLInjectionInRulesetName === RUN TestBuildWAFHandler_SQLInjectionInRulesetName/';_DROP_TABLE_rulesets;_-- === RUN TestBuildWAFHandler_SQLInjectionInRulesetName/1'_OR_'1'='1 === RUN TestBuildWAFHandler_SQLInjectionInRulesetName/UNION_SELECT_*_FROM_users-- === RUN TestBuildWAFHandler_SQLInjectionInRulesetName/admin'/* --- PASS: TestBuildWAFHandler_SQLInjectionInRulesetName (0.00s) --- PASS: TestBuildWAFHandler_SQLInjectionInRulesetName/';_DROP_TABLE_rulesets;_-- (0.00s) --- PASS: TestBuildWAFHandler_SQLInjectionInRulesetName/1'_OR_'1'='1 (0.00s) --- PASS: TestBuildWAFHandler_SQLInjectionInRulesetName/UNION_SELECT_*_FROM_users-- (0.00s) --- PASS: TestBuildWAFHandler_SQLInjectionInRulesetName/admin'/* (0.00s) === RUN TestBuildWAFHandler_XSSInAdvancedConfig === RUN TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":""} === RUN TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":""} === RUN TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":"javascript:alert(1)"} === RUN TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":""} --- PASS: TestBuildWAFHandler_XSSInAdvancedConfig (0.00s) --- PASS: TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":""} (0.00s) --- PASS: TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":""} (0.00s) --- PASS: TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":"javascript:alert(1)"} (0.00s) --- PASS: TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":""} (0.00s) === RUN TestBuildWAFHandler_HugePayload --- PASS: TestBuildWAFHandler_HugePayload (0.00s) === RUN TestBuildWAFHandler_EmptyAndWhitespaceInputs === RUN TestBuildWAFHandler_EmptyAndWhitespaceInputs/Empty_string_WAFRulesSource === RUN TestBuildWAFHandler_EmptyAndWhitespaceInputs/Whitespace-only_WAFRulesSource === RUN TestBuildWAFHandler_EmptyAndWhitespaceInputs/Tab_and_newline_in_WAFRulesSource --- PASS: TestBuildWAFHandler_EmptyAndWhitespaceInputs (0.00s) --- PASS: TestBuildWAFHandler_EmptyAndWhitespaceInputs/Empty_string_WAFRulesSource (0.00s) --- PASS: TestBuildWAFHandler_EmptyAndWhitespaceInputs/Whitespace-only_WAFRulesSource (0.00s) --- PASS: TestBuildWAFHandler_EmptyAndWhitespaceInputs/Tab_and_newline_in_WAFRulesSource (0.00s) === RUN TestBuildWAFHandler_ConcurrentRulesetSelection --- PASS: TestBuildWAFHandler_ConcurrentRulesetSelection (0.00s) === RUN TestBuildWAFHandler_NilSecCfg --- PASS: TestBuildWAFHandler_NilSecCfg (0.00s) === RUN TestBuildWAFHandler_NilHost --- PASS: TestBuildWAFHandler_NilHost (0.00s) === RUN TestBuildWAFHandler_SpecialCharactersInRulesetName === RUN TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset_with_spaces === RUN TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset/with/slashes === RUN TestBuildWAFHandler_SpecialCharactersInRulesetName/UPPERCASE-RULESET === RUN TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset_with_underscores === RUN TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset.with.dots --- PASS: TestBuildWAFHandler_SpecialCharactersInRulesetName (0.00s) --- PASS: TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset_with_spaces (0.00s) --- PASS: TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset/with/slashes (0.00s) --- PASS: TestBuildWAFHandler_SpecialCharactersInRulesetName/UPPERCASE-RULESET (0.00s) --- PASS: TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset_with_underscores (0.00s) --- PASS: TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset.with.dots (0.00s) === RUN TestBuildWAFHandler_RulesetSelectionPriority === RUN TestBuildWAFHandler_RulesetSelectionPriority/WAFRulesSource_takes_priority_over_owasp-crs === RUN TestBuildWAFHandler_RulesetSelectionPriority/hostRulesetName_takes_priority_over_owasp-crs === RUN TestBuildWAFHandler_RulesetSelectionPriority/host.Application_takes_priority_over_owasp-crs === RUN TestBuildWAFHandler_RulesetSelectionPriority/owasp-crs_used_as_fallback_when_no_other_match === RUN TestBuildWAFHandler_RulesetSelectionPriority/WAFRulesSource_takes_priority_over_host.Application_and_owasp-crs --- PASS: TestBuildWAFHandler_RulesetSelectionPriority (0.00s) --- PASS: TestBuildWAFHandler_RulesetSelectionPriority/WAFRulesSource_takes_priority_over_owasp-crs (0.00s) --- PASS: TestBuildWAFHandler_RulesetSelectionPriority/hostRulesetName_takes_priority_over_owasp-crs (0.00s) --- PASS: TestBuildWAFHandler_RulesetSelectionPriority/host.Application_takes_priority_over_owasp-crs (0.00s) --- PASS: TestBuildWAFHandler_RulesetSelectionPriority/owasp-crs_used_as_fallback_when_no_other_match (0.00s) --- PASS: TestBuildWAFHandler_RulesetSelectionPriority/WAFRulesSource_takes_priority_over_host.Application_and_owasp-crs (0.00s) === RUN TestBuildWAFHandler_NoDirectivesReturnsNil === RUN TestBuildWAFHandler_NoDirectivesReturnsNil/Empty_rulesets_returns_nil === RUN TestBuildWAFHandler_NoDirectivesReturnsNil/Ruleset_exists_but_no_path_mapping_returns_nil === RUN TestBuildWAFHandler_NoDirectivesReturnsNil/WAFRulesSource_specified_but_not_in_rulesets_or_paths_returns_nil === RUN TestBuildWAFHandler_NoDirectivesReturnsNil/Empty_path_in_rulesetPaths_returns_nil --- PASS: TestBuildWAFHandler_NoDirectivesReturnsNil (0.00s) --- PASS: TestBuildWAFHandler_NoDirectivesReturnsNil/Empty_rulesets_returns_nil (0.00s) --- PASS: TestBuildWAFHandler_NoDirectivesReturnsNil/Ruleset_exists_but_no_path_mapping_returns_nil (0.00s) --- PASS: TestBuildWAFHandler_NoDirectivesReturnsNil/WAFRulesSource_specified_but_not_in_rulesets_or_paths_returns_nil (0.00s) --- PASS: TestBuildWAFHandler_NoDirectivesReturnsNil/Empty_path_in_rulesetPaths_returns_nil (0.00s) === RUN TestBuildWAFHandler_DisabledModes === RUN TestBuildWAFHandler_DisabledModes/wafEnabled_false_returns_nil === RUN TestBuildWAFHandler_DisabledModes/WAFMode_disabled_returns_nil --- PASS: TestBuildWAFHandler_DisabledModes (0.00s) --- PASS: TestBuildWAFHandler_DisabledModes/wafEnabled_false_returns_nil (0.00s) --- PASS: TestBuildWAFHandler_DisabledModes/WAFMode_disabled_returns_nil (0.00s) === RUN TestBuildWAFHandler_HandlerStructure --- PASS: TestBuildWAFHandler_HandlerStructure (0.00s) === RUN TestBuildWAFHandler_AdvancedConfigParsing === RUN TestBuildWAFHandler_AdvancedConfigParsing/Valid_ruleset_name_in_advanced_config === RUN TestBuildWAFHandler_AdvancedConfigParsing/Invalid_JSON_falls_back_to_owasp-crs === RUN TestBuildWAFHandler_AdvancedConfigParsing/Empty_advanced_config_falls_back_to_owasp-crs === RUN TestBuildWAFHandler_AdvancedConfigParsing/Empty_ruleset_name_string_falls_back_to_owasp-crs === RUN TestBuildWAFHandler_AdvancedConfigParsing/Non-string_ruleset_name_falls_back_to_owasp-crs --- PASS: TestBuildWAFHandler_AdvancedConfigParsing (0.00s) --- PASS: TestBuildWAFHandler_AdvancedConfigParsing/Valid_ruleset_name_in_advanced_config (0.00s) --- PASS: TestBuildWAFHandler_AdvancedConfigParsing/Invalid_JSON_falls_back_to_owasp-crs (0.00s) --- PASS: TestBuildWAFHandler_AdvancedConfigParsing/Empty_advanced_config_falls_back_to_owasp-crs (0.00s) --- PASS: TestBuildWAFHandler_AdvancedConfigParsing/Empty_ruleset_name_string_falls_back_to_owasp-crs (0.00s) --- PASS: TestBuildWAFHandler_AdvancedConfigParsing/Non-string_ruleset_name_falls_back_to_owasp-crs (0.00s) === RUN TestImporter_ExtractHosts_DialWithoutPortDefaultsTo80 --- PASS: TestImporter_ExtractHosts_DialWithoutPortDefaultsTo80 (0.00s) === RUN TestImporter_ExtractHosts_DetectsWebsocketFromHeaders --- PASS: TestImporter_ExtractHosts_DetectsWebsocketFromHeaders (0.00s) === RUN TestImporter_ImportFile_ParseOutputInvalidJSON --- PASS: TestImporter_ImportFile_ParseOutputInvalidJSON (0.00s) === RUN TestImporter_ImportFile_ExecutorError --- PASS: TestImporter_ImportFile_ExecutorError (0.00s) === RUN TestImporter_ExtractHosts_TLSConnectionPolicyAndDialWithoutPort --- PASS: TestImporter_ExtractHosts_TLSConnectionPolicyAndDialWithoutPort (0.00s) === RUN TestExtractHandlers_Subroute_WithUnsupportedSubhandle --- PASS: TestExtractHandlers_Subroute_WithUnsupportedSubhandle (0.00s) === RUN TestExtractHandlers_Subroute_WithNonMapRoutes --- PASS: TestExtractHandlers_Subroute_WithNonMapRoutes (0.00s) === RUN TestImporter_ExtractHosts_UpstreamsNonMapAndWarnings --- PASS: TestImporter_ExtractHosts_UpstreamsNonMapAndWarnings (0.00s) === RUN TestBackupCaddyfile_ReadFailure --- PASS: TestBackupCaddyfile_ReadFailure (0.00s) === RUN TestExtractHandlers_Subroute_EmptyAndHandleNotArray --- PASS: TestExtractHandlers_Subroute_EmptyAndHandleNotArray (0.00s) === RUN TestImporter_ExtractHosts_ReverseProxyNoUpstreams --- PASS: TestImporter_ExtractHosts_ReverseProxyNoUpstreams (0.00s) === RUN TestBackupCaddyfile_Success --- PASS: TestBackupCaddyfile_Success (0.00s) === RUN TestExtractHandlers_Subroute_WithHeadersUpstreams --- PASS: TestExtractHandlers_Subroute_WithHeadersUpstreams (0.00s) === RUN TestImporter_ExtractHosts_DuplicateHost --- PASS: TestImporter_ExtractHosts_DuplicateHost (0.00s) === RUN TestBackupCaddyfile_WriteFailure --- PASS: TestBackupCaddyfile_WriteFailure (0.00s) === RUN TestImporter_ExtractHosts_SSLForcedByDomainScheme --- PASS: TestImporter_ExtractHosts_SSLForcedByDomainScheme (0.00s) === RUN TestImporter_ExtractHosts_MultipleHostsInMatch --- PASS: TestImporter_ExtractHosts_MultipleHostsInMatch (0.00s) === RUN TestImporter_ExtractHosts_UpgradeHeaderAsString --- PASS: TestImporter_ExtractHosts_UpgradeHeaderAsString (0.00s) === RUN TestImporter_ExtractHosts_SscanfFailureOnPort --- PASS: TestImporter_ExtractHosts_SscanfFailureOnPort (0.00s) === RUN TestImporter_ExtractHosts_PartsSscanfFail --- PASS: TestImporter_ExtractHosts_PartsSscanfFail (0.00s) === RUN TestImporter_ExtractHosts_PartsEmptyPortField --- PASS: TestImporter_ExtractHosts_PartsEmptyPortField (0.00s) === RUN TestImporter_ExtractHosts_ForceSplitFallback_PartsNumericPort --- PASS: TestImporter_ExtractHosts_ForceSplitFallback_PartsNumericPort (0.00s) === RUN TestImporter_ExtractHosts_ForceSplitFallback_PartsSscanfFail --- PASS: TestImporter_ExtractHosts_ForceSplitFallback_PartsSscanfFail (0.00s) === RUN TestBackupCaddyfile_WriteErrorDeterministic --- PASS: TestBackupCaddyfile_WriteErrorDeterministic (0.00s) === RUN TestParseCaddyfile_InvalidPath --- PASS: TestParseCaddyfile_InvalidPath (0.00s) === RUN TestBackupCaddyfile_InvalidOriginalPath --- PASS: TestBackupCaddyfile_InvalidOriginalPath (0.00s) === RUN TestExtractHandlers_Subroute --- PASS: TestExtractHandlers_Subroute (0.00s) === RUN TestNewImporter --- PASS: TestNewImporter (0.00s) === RUN TestImporter_ParseCaddyfile_NotFound --- PASS: TestImporter_ParseCaddyfile_NotFound (0.00s) === RUN TestImporter_ParseCaddyfile_Success --- PASS: TestImporter_ParseCaddyfile_Success (0.00s) === RUN TestImporter_ParseCaddyfile_Failure --- PASS: TestImporter_ParseCaddyfile_Failure (0.00s) === RUN TestImporter_ExtractHosts --- PASS: TestImporter_ExtractHosts (0.00s) === RUN TestImporter_ImportFile --- PASS: TestImporter_ImportFile (0.00s) === RUN TestConvertToProxyHosts --- PASS: TestConvertToProxyHosts (0.00s) === RUN TestImporter_ValidateCaddyBinary --- PASS: TestImporter_ValidateCaddyBinary (0.00s) === RUN TestBackupCaddyfile --- PASS: TestBackupCaddyfile (0.00s) === RUN TestDefaultExecutor_Execute --- PASS: TestDefaultExecutor_Execute (0.00s) === RUN TestManager_ListSnapshots_ReadDirError --- PASS: TestManager_ListSnapshots_ReadDirError (0.00s) === RUN TestManager_RotateSnapshots_NoOp --- PASS: TestManager_RotateSnapshots_NoOp (0.00s) === RUN TestManager_Rollback_NoSnapshots --- PASS: TestManager_Rollback_NoSnapshots (0.00s) === RUN TestManager_Rollback_UnmarshalError --- PASS: TestManager_Rollback_UnmarshalError (0.00s) === RUN TestManager_Rollback_LoadSnapshotFail --- PASS: TestManager_Rollback_LoadSnapshotFail (0.00s) === RUN TestManager_SaveSnapshot_WriteError --- PASS: TestManager_SaveSnapshot_WriteError (0.00s) === RUN TestBackupCaddyfile_MkdirAllFailure --- PASS: TestBackupCaddyfile_MkdirAllFailure (0.00s) === RUN TestManager_SaveSnapshot_Success --- PASS: TestManager_SaveSnapshot_Success (0.00s) === RUN TestManager_ApplyConfig_WithSettings 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.136ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.006ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.070ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.051ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_WithSettings (0.00s) === RUN TestManager_RotateSnapshots_ListDirError --- PASS: TestManager_RotateSnapshots_ListDirError (0.00s) === RUN TestManager_RotateSnapshots_DeletesOld --- PASS: TestManager_RotateSnapshots_DeletesOld (0.00s) === RUN TestManager_ApplyConfig_RotateSnapshotsWarning 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.185ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.006ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.064ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.128ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_RotateSnapshotsWarning (0.01s) === RUN TestManager_ApplyConfig_LoadFailsAndRollbackFails 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.133ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.034ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.074ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.048ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_LoadFailsAndRollbackFails (0.00s) === RUN TestManager_ApplyConfig_SaveSnapshotFails 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.125ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.008ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.076ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.074ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_SaveSnapshotFails (0.00s) === RUN TestManager_ApplyConfig_LoadFailsThenRollbackSucceeds 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.026ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.141ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.009ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.077ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.080ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_LoadFailsThenRollbackSucceeds (0.00s) === RUN TestManager_SaveSnapshot_MarshalError --- PASS: TestManager_SaveSnapshot_MarshalError (0.00s) === RUN TestManager_RotateSnapshots_DeleteError --- PASS: TestManager_RotateSnapshots_DeleteError (0.00s) === RUN TestManager_ApplyConfig_GenerateConfigFails 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.142ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.074ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.073ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_GenerateConfigFails (0.00s) === RUN TestManager_ApplyConfig_RejectsWhenCerberusEnabledWithoutAdminWhitelist 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestManager_ApplyConfig_RejectsWhenCerberusEnabledWithoutAdminWhitelist (0.00s) === RUN TestManager_ApplyConfig_ValidateFails 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.140ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.073ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.069ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_ValidateFails (0.00s) === RUN TestManager_Rollback_ReadFileError --- PASS: TestManager_Rollback_ReadFileError (0.00s) === RUN TestManager_ApplyConfig_RotateSnapshotsWarning_Stderr 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.132ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.071ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.067ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_RotateSnapshotsWarning_Stderr (0.00s) === RUN TestManager_ApplyConfig_PassesAdminWhitelistToGenerateConfig 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.031ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.095ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.051ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_PassesAdminWhitelistToGenerateConfig (0.00s) === RUN TestManager_ApplyConfig_PassesRuleSetsToGenerateConfig 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.081ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_PassesRuleSetsToGenerateConfig (0.00s) === RUN TestManager_ApplyConfig_IncludesWAFHandlerWithRuleset 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.072ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc manager_additional_test.go:711: generated config: {"admin":{"listen":"0.0.0.0:2019"},"apps":{"http":{"servers":{"charon_server":{"listen":[":80",":443"],"routes":[{"match":[{"host":["ruleset.example.com"]}],"handle":[{"directives":"SecRuleEngine On\nSecRequestBodyAccess On\nSecResponseBodyAccess Off\nSecAction \"id:900000,phase:1,nolog,pass,t:none,setvar:tx.paranoia_level=1\"\nInclude /tmp/TestManager_ApplyConfig_IncludesWAFHandlerWithRuleset3005272911/001/coraza/rulesets/owasp-crs-05ec1bde.conf\n","handler":"waf"},{"handler":"vars"},{"flush_interval":-1,"handler":"reverse_proxy","upstreams":[{"dial":"127.0.0.1:8080"}]}],"terminal":true}],"automatic_https":{},"logs":{"default_logger_name":"access_log"}}}}},"logging":{"logs":{"access":{"writer":{"output":"file","filename":"/tmp/TestManager_ApplyConfig_IncludesWAFHandlerWithRuleset3005272911/logs/access.log","roll":true,"roll_size_mb":10,"roll_keep":5,"roll_keep_days":7},"encoder":{"format":"json"},"level":"INFO","include":["http.log.access.access_log"]}}},"storage":{"module":"file_system","root":"/tmp/TestManager_ApplyConfig_IncludesWAFHandlerWithRuleset3005272911/001/data"}} --- PASS: TestManager_ApplyConfig_IncludesWAFHandlerWithRuleset (0.00s) === RUN TestManager_ApplyConfig_RulesetWriteFileFailure 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.029ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.060ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_RulesetWriteFileFailure (0.00s) === RUN TestManager_ApplyConfig_RulesetDirMkdirFailure 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.036ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.077ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_RulesetDirMkdirFailure (0.00s) === RUN TestManager_ApplyConfig_ReappliesOnFlagChange 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.106ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.049ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.044ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.022ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.172ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.065ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.005ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.006ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.009ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.008ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.008ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.006ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_ReappliesOnFlagChange (0.01s) === RUN TestManager_ApplyConfig_PrependsSecRuleEngineDirectives 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.061ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_PrependsSecRuleEngineDirectives (0.00s) === RUN TestManager_ApplyConfig_DoesNotPrependIfSecRuleEngineExists 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.034ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.059ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_DoesNotPrependIfSecRuleEngineExists (0.00s) === RUN TestManager_ApplyConfig_DebugMarshalFailure 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.030ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.062ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_DebugMarshalFailure (0.00s) === RUN TestManager_ApplyConfig_WAFModeMonitorUsesDetectionOnly 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.066ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_WAFModeMonitorUsesDetectionOnly (0.00s) === RUN TestManager_ApplyConfig_PerRulesetModeOverride 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.058ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_PerRulesetModeOverride (0.00s) === RUN TestManager_ApplyConfig_RulesetFileCleanup 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.074ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_RulesetFileCleanup (0.00s) === RUN TestManager_ApplyConfig_RulesetCleanupReadDirError 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.057ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_RulesetCleanupReadDirError (0.00s) === RUN TestManager_ApplyConfig_RulesetCleanupRemoveError 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.031ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.070ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_RulesetCleanupRemoveError (0.00s) === RUN TestManager_ApplyConfig_WAFModeBlockExplicit 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.076ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_WAFModeBlockExplicit (0.00s) === RUN TestManager_ApplyConfig_RulesetNamePathTraversal 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.060ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_RulesetNamePathTraversal (0.00s) === RUN TestManager_ApplyConfig_SSLProvider_Auto 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.035ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.105ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.062ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.074ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_SSLProvider_Auto (0.00s) === RUN TestManager_ApplyConfig_SSLProvider_LetsEncryptStaging 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.129ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.073ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.067ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_SSLProvider_LetsEncryptStaging (0.01s) === RUN TestManager_ApplyConfig_SSLProvider_LetsEncryptProd 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.124ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.010ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.080ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.077ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_SSLProvider_LetsEncryptProd (0.00s) === RUN TestManager_ApplyConfig_SSLProvider_ZeroSSL 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.119ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.011ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.079ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.076ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_SSLProvider_ZeroSSL (0.00s) === RUN TestManager_ApplyConfig_SSLProvider_Empty 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.089ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.027ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.053ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.046ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_SSLProvider_Empty (0.00s) === RUN TestManager_ApplyConfig_SSLProvider_EmptyWithNoStaging 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.032ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.127ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.029ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.011ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.085ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.078ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_SSLProvider_EmptyWithNoStaging (0.00s) === RUN TestManager_ApplyConfig_SSLProvider_Unknown 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.127ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.027ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.026ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.012ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.093ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.088ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_SSLProvider_Unknown (0.00s) === RUN TestManager_ApplyConfig 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.167ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.051ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.011ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.086ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.081ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig (0.01s) === RUN TestManager_ApplyConfig_Failure 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.144ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.027ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.010ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.103ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.085ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_Failure (0.00s) === RUN TestManager_Ping --- PASS: TestManager_Ping (0.00s) === RUN TestManager_GetCurrentConfig --- PASS: TestManager_GetCurrentConfig (0.00s) === RUN TestManager_RotateSnapshots 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.199ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.038ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.140ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.063ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.027ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.085ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.079ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_RotateSnapshots (0.00s) === RUN TestManager_Rollback_Success 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.113ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.117ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.013ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.058ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.047ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.009ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.006ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.005ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.006ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_Rollback_Success (1.11s) === RUN TestManager_ApplyConfig_DBError 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:61 sql: database is closed [0.023ms] [rows:0] SELECT * FROM `proxy_hosts` --- PASS: TestManager_ApplyConfig_DBError (0.00s) === RUN TestManager_ApplyConfig_ValidationError 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.046ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.149ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.011ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.084ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.077ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_ApplyConfig_ValidationError (0.01s) === RUN TestManager_Rollback_Failure 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.032ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.121ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs [0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets [0.098ms] [rows:0] SELECT * FROM `security_rule_sets` 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions [0.082ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc --- PASS: TestManager_Rollback_Failure (0.00s) === RUN TestComputeEffectiveFlags_DefaultsNoDB --- PASS: TestComputeEffectiveFlags_DefaultsNoDB (0.00s) === RUN TestComputeEffectiveFlags_DB_CerberusDisabled 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.107ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" AND `settings`.`id` = 1 ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestComputeEffectiveFlags_DB_CerberusDisabled (0.00s) === RUN TestComputeEffectiveFlags_DB_CrowdSecExternal 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.121ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.029ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestComputeEffectiveFlags_DB_CrowdSecExternal (0.00s) === RUN TestComputeEffectiveFlags_DB_CrowdSecUnknown 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.110ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestComputeEffectiveFlags_DB_CrowdSecUnknown (0.00s) === RUN TestComputeEffectiveFlags_DB_CrowdSecLocal 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.143ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.039ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestComputeEffectiveFlags_DB_CrowdSecLocal (0.00s) === RUN TestComputeEffectiveFlags_DB_ACLTrueAndFalse 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.103ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.083ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs [0.010ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestComputeEffectiveFlags_DB_ACLTrueAndFalse (0.00s) === RUN TestComputeEffectiveFlags_DB_WAFMonitor 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.029ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestComputeEffectiveFlags_DB_WAFMonitor (0.00s) === RUN TestManager_ApplyConfig_WAFMonitor 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:68 record not found [0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:75 record not found [0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found [0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found [0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found [0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestManager_ApplyConfig_WAFMonitor (0.01s) === RUN TestNormalizeAdvancedConfig_MapWithNestedHandles --- PASS: TestNormalizeAdvancedConfig_MapWithNestedHandles (0.00s) === RUN TestNormalizeAdvancedConfig_ArrayTopLevel --- PASS: TestNormalizeAdvancedConfig_ArrayTopLevel (0.00s) === RUN TestNormalizeAdvancedConfig_DefaultPrimitives --- PASS: TestNormalizeAdvancedConfig_DefaultPrimitives (0.00s) === RUN TestNormalizeAdvancedConfig_CoerceNonStandardTypes --- PASS: TestNormalizeAdvancedConfig_CoerceNonStandardTypes (0.00s) === RUN TestNormalizeAdvancedConfig_JSONRoundtrip --- PASS: TestNormalizeAdvancedConfig_JSONRoundtrip (0.00s) === RUN TestNormalizeAdvancedConfig_TopLevelHeaders --- PASS: TestNormalizeAdvancedConfig_TopLevelHeaders (0.00s) === RUN TestNormalizeAdvancedConfig_HeadersAlreadyArray --- PASS: TestNormalizeAdvancedConfig_HeadersAlreadyArray (0.00s) === RUN TestNormalizeAdvancedConfig_MapWithTopLevelHandle --- PASS: TestNormalizeAdvancedConfig_MapWithTopLevelHandle (0.00s) === RUN TestReverseProxyHandler_PlexAndOthers --- PASS: TestReverseProxyHandler_PlexAndOthers (0.00s) === RUN TestHandlers --- PASS: TestHandlers (0.00s) === RUN TestValidate_NilConfig --- PASS: TestValidate_NilConfig (0.00s) === RUN TestValidateHandler_MissingHandlerField --- PASS: TestValidateHandler_MissingHandlerField (0.00s) === RUN TestValidateHandler_UnknownHandlerAllowed --- PASS: TestValidateHandler_UnknownHandlerAllowed (0.00s) === RUN TestValidateHandler_FileServerAndStaticResponseAllowed --- PASS: TestValidateHandler_FileServerAndStaticResponseAllowed (0.00s) === RUN TestValidateRoute_InvalidHandler --- PASS: TestValidateRoute_InvalidHandler (0.00s) === RUN TestValidateListenAddr_InvalidHostName --- PASS: TestValidateListenAddr_InvalidHostName (0.00s) === RUN TestValidateListenAddr_InvalidPortNonNumeric --- PASS: TestValidateListenAddr_InvalidPortNonNumeric (0.00s) === RUN TestValidate_MarshalError --- PASS: TestValidate_MarshalError (0.00s) === RUN TestValidate_EmptyConfig --- PASS: TestValidate_EmptyConfig (0.00s) === RUN TestValidate_ValidConfig --- PASS: TestValidate_ValidConfig (0.00s) === RUN TestValidate_DuplicateHosts --- PASS: TestValidate_DuplicateHosts (0.00s) === RUN TestValidate_NoListenAddresses --- PASS: TestValidate_NoListenAddresses (0.00s) === RUN TestValidate_InvalidPort --- PASS: TestValidate_InvalidPort (0.00s) === RUN TestValidate_NoHandlers --- PASS: TestValidate_NoHandlers (0.00s) === RUN TestValidateListenAddr === RUN TestValidateListenAddr/Valid === RUN TestValidateListenAddr/ValidIP === RUN TestValidateListenAddr/ValidTCP === RUN TestValidateListenAddr/ValidUDP === RUN TestValidateListenAddr/InvalidFormat === RUN TestValidateListenAddr/InvalidPort === RUN TestValidateListenAddr/InvalidPortNegative === RUN TestValidateListenAddr/InvalidIP --- PASS: TestValidateListenAddr (0.00s) --- PASS: TestValidateListenAddr/Valid (0.00s) --- PASS: TestValidateListenAddr/ValidIP (0.00s) --- PASS: TestValidateListenAddr/ValidTCP (0.00s) --- PASS: TestValidateListenAddr/ValidUDP (0.00s) --- PASS: TestValidateListenAddr/InvalidFormat (0.00s) --- PASS: TestValidateListenAddr/InvalidPort (0.00s) --- PASS: TestValidateListenAddr/InvalidPortNegative (0.00s) --- PASS: TestValidateListenAddr/InvalidIP (0.00s) === RUN TestValidateReverseProxy === RUN TestValidateReverseProxy/Valid === RUN TestValidateReverseProxy/MissingUpstreams === RUN TestValidateReverseProxy/EmptyUpstreams === RUN TestValidateReverseProxy/MissingDial === RUN TestValidateReverseProxy/InvalidDial --- PASS: TestValidateReverseProxy (0.00s) --- PASS: TestValidateReverseProxy/Valid (0.00s) --- PASS: TestValidateReverseProxy/MissingUpstreams (0.00s) --- PASS: TestValidateReverseProxy/EmptyUpstreams (0.00s) --- PASS: TestValidateReverseProxy/MissingDial (0.00s) --- PASS: TestValidateReverseProxy/InvalidDial (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/caddy (cached) === RUN TestIsEnabled_ConfigTrue --- PASS: TestIsEnabled_ConfigTrue (0.00s) === RUN TestIsEnabled_WAFModeEnabled --- PASS: TestIsEnabled_WAFModeEnabled (0.00s) === RUN TestIsEnabled_ACLModeEnabled --- PASS: TestIsEnabled_ACLModeEnabled (0.00s) === RUN TestIsEnabled_RateLimitModeEnabled --- PASS: TestIsEnabled_RateLimitModeEnabled (0.00s) === RUN TestIsEnabled_CrowdSecModeLocal --- PASS: TestIsEnabled_CrowdSecModeLocal (0.00s) === RUN TestIsEnabled_DBSetting_FeatureFlag --- PASS: TestIsEnabled_DBSetting_FeatureFlag (0.00s) === RUN TestIsEnabled_DBSetting_LegacyKey 2025/12/12 19:01:40 /projects/Charon/backend/internal/cerberus/cerberus.go:57 record not found [0.030ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestIsEnabled_DBSetting_LegacyKey (0.00s) === RUN TestIsEnabled_DBSetting_FeatureFlagTakesPrecedence --- PASS: TestIsEnabled_DBSetting_FeatureFlagTakesPrecedence (0.00s) === RUN TestIsEnabled_DBSettingCaseInsensitive --- PASS: TestIsEnabled_DBSettingCaseInsensitive (0.00s) === RUN TestIsEnabled_DBSettingFalse --- PASS: TestIsEnabled_DBSettingFalse (0.00s) === RUN TestIsEnabled_DefaultTrue --- PASS: TestIsEnabled_DefaultTrue (0.00s) === RUN TestMiddleware_WAFEnabledTracksMetrics --- PASS: TestMiddleware_WAFEnabledTracksMetrics (0.00s) === RUN TestMiddleware_ACLBlocksClientIP 2025/12/12 19:01:40 /projects/Charon/backend/internal/services/security_notification_service.go:29 no such table: notification_configs [0.147ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestMiddleware_ACLBlocksClientIP (0.00s) === RUN TestMiddleware_ACLAllowsClientIP --- PASS: TestMiddleware_ACLAllowsClientIP (0.00s) === RUN TestMiddleware_NotEnabledSkips 2025/12/12 19:01:40 /projects/Charon/backend/internal/cerberus/cerberus.go:57 record not found [0.050ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 2025/12/12 19:01:40 /projects/Charon/backend/internal/cerberus/cerberus.go:61 record not found [0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestMiddleware_NotEnabledSkips (0.00s) === RUN TestMiddleware_WAFPassesWithNoPayload --- PASS: TestMiddleware_WAFPassesWithNoPayload (0.00s) === RUN TestMiddleware_WAFMonitorLogsButDoesNotBlock --- PASS: TestMiddleware_WAFMonitorLogsButDoesNotBlock (0.00s) === RUN TestMiddleware_ACLDisabledDoesNotBlock --- PASS: TestMiddleware_ACLDisabledDoesNotBlock (0.00s) === RUN TestCerberus_IsEnabled_ConfigTrue --- PASS: TestCerberus_IsEnabled_ConfigTrue (0.00s) === RUN TestCerberus_IsEnabled_DBSetting --- PASS: TestCerberus_IsEnabled_DBSetting (0.00s) === RUN TestCerberus_IsEnabled_Disabled cerberus_test.go:68: cfg: {CrowdSecMode: CrowdSecAPIURL: CrowdSecAPIKey: CrowdSecConfigDir: WAFMode: RateLimitMode: ACLMode: CerberusEnabled:false} cerberus_test.go:69: IsEnabled() -> false --- PASS: TestCerberus_IsEnabled_Disabled (0.00s) === RUN TestCerberus_IsEnabled_CrowdSecLocal --- PASS: TestCerberus_IsEnabled_CrowdSecLocal (0.00s) === RUN TestCerberus_IsEnabled_WAFEnabled --- PASS: TestCerberus_IsEnabled_WAFEnabled (0.00s) === RUN TestCerberus_IsEnabled_RateLimitEnabled --- PASS: TestCerberus_IsEnabled_RateLimitEnabled (0.00s) === RUN TestCerberus_IsEnabled_ACLEnabled --- PASS: TestCerberus_IsEnabled_ACLEnabled (0.00s) === RUN TestCerberus_IsEnabled_LegacySetting 2025/12/12 19:01:40 /projects/Charon/backend/internal/cerberus/cerberus.go:57 record not found [0.055ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1 --- PASS: TestCerberus_IsEnabled_LegacySetting (0.00s) === RUN TestCerberus_Middleware_Disabled --- PASS: TestCerberus_Middleware_Disabled (0.00s) === RUN TestCerberus_Middleware_WAFEnabled --- PASS: TestCerberus_Middleware_WAFEnabled (0.00s) === RUN TestCerberus_Middleware_ACLEnabled_NoAccessLists --- PASS: TestCerberus_Middleware_ACLEnabled_NoAccessLists (0.00s) === RUN TestCerberus_Middleware_ACLEnabled_DisabledList --- PASS: TestCerberus_Middleware_ACLEnabled_DisabledList (0.00s) === RUN TestCerberus_Middleware_ACLEnabled_Blocked 2025/12/12 19:01:40 /projects/Charon/backend/internal/services/security_notification_service.go:29 no such table: notification_configs [0.091ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestCerberus_Middleware_ACLEnabled_Blocked (0.00s) === RUN TestCerberus_Middleware_CrowdSecLocal --- PASS: TestCerberus_Middleware_CrowdSecLocal (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/cerberus (cached) === RUN TestLoad --- PASS: TestLoad (0.00s) === RUN TestLoad_Defaults --- PASS: TestLoad_Defaults (0.00s) === RUN TestLoad_CharonPrefersOverCPM --- PASS: TestLoad_CharonPrefersOverCPM (0.00s) === RUN TestLoad_Error --- PASS: TestLoad_Error (0.00s) === RUN TestGetEnvAny --- PASS: TestGetEnvAny (0.00s) === RUN TestLoad_SecurityConfig --- PASS: TestLoad_SecurityConfig (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/config (cached) === RUN TestConsoleEnrollSuccess time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi" 2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found [0.063ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1 time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=agent-one correlation_id=df46e443-0155-4b28-945a-230170728d23 tenant=tenant-a time="2025-12-12T19:01:41Z" level=info msg="crowdsec console enrollment succeeded" agent=agent-one correlation_id=df46e443-0155-4b28-945a-230170728d23 tenant=tenant-a --- PASS: TestConsoleEnrollSuccess (0.00s) === RUN TestConsoleEnrollFailureRedactsSecret time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi" 2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found [0.034ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1 time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=agent correlation_id=6bf8692d-798b-44ae-b4e9-7a5d65b616e3 tenant=tenant time="2025-12-12T19:01:41Z" level=warning msg="crowdsec console enrollment failed" correlation_id=6bf8692d-798b-44ae-b4e9-7a5d65b616e3 error="bad key secretKEY123" tenant=tenant --- PASS: TestConsoleEnrollFailureRedactsSecret (0.00s) === RUN TestConsoleEnrollIdempotentWhenAlreadyEnrolled time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi" 2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found [0.067ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1 time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=agent correlation_id=692144ad-efa0-4997-a2a9-8cd9134ad766 tenant=tenant time="2025-12-12T19:01:41Z" level=info msg="crowdsec console enrollment succeeded" agent=agent correlation_id=692144ad-efa0-4997-a2a9-8cd9134ad766 tenant=tenant time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi" --- PASS: TestConsoleEnrollIdempotentWhenAlreadyEnrolled (0.00s) === RUN TestConsoleEnrollBlockedWhenInProgress time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi" --- PASS: TestConsoleEnrollBlockedWhenInProgress (0.00s) === RUN TestConsoleEnrollNormalizesFullCommand time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi" 2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found [0.036ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1 time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=agent correlation_id=8296e2c1-9961-49ee-82d2-8bc879ee6daa tenant=tenant time="2025-12-12T19:01:41Z" level=info msg="crowdsec console enrollment succeeded" agent=agent correlation_id=8296e2c1-9961-49ee-82d2-8bc879ee6daa tenant=tenant --- PASS: TestConsoleEnrollNormalizesFullCommand (0.00s) === RUN TestConsoleEnrollRejectsUnsafeInput --- PASS: TestConsoleEnrollRejectsUnsafeInput (0.00s) === RUN TestConsoleEnrollDoesNotPassTenant time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi" 2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found [0.027ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1 time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=agent-one correlation_id=9f74947b-fe45-466d-beea-16cec52a8b3d tenant=some-tenant-id time="2025-12-12T19:01:41Z" level=info msg="crowdsec console enrollment succeeded" agent=agent-one correlation_id=9f74947b-fe45-466d-beea-16cec52a8b3d tenant=some-tenant-id --- PASS: TestConsoleEnrollDoesNotPassTenant (0.00s) === RUN TestSecureCommandExecutorExecuteWithEnv === RUN TestSecureCommandExecutorExecuteWithEnv/executes_command_successfully === RUN TestSecureCommandExecutorExecuteWithEnv/passes_environment_variables === RUN TestSecureCommandExecutorExecuteWithEnv/handles_empty_env_map === RUN TestSecureCommandExecutorExecuteWithEnv/handles_command_failure === RUN TestSecureCommandExecutorExecuteWithEnv/handles_context_timeout --- PASS: TestSecureCommandExecutorExecuteWithEnv (0.01s) --- PASS: TestSecureCommandExecutorExecuteWithEnv/executes_command_successfully (0.00s) --- PASS: TestSecureCommandExecutorExecuteWithEnv/passes_environment_variables (0.00s) --- PASS: TestSecureCommandExecutorExecuteWithEnv/handles_empty_env_map (0.00s) --- PASS: TestSecureCommandExecutorExecuteWithEnv/handles_command_failure (0.00s) --- PASS: TestSecureCommandExecutorExecuteWithEnv/handles_context_timeout (0.00s) === RUN TestFormatEnv === RUN TestFormatEnv/formats_single_env_var === RUN TestFormatEnv/formats_multiple_env_vars === RUN TestFormatEnv/handles_empty_map === RUN TestFormatEnv/handles_nil_map === RUN TestFormatEnv/handles_special_characters --- PASS: TestFormatEnv (0.00s) --- PASS: TestFormatEnv/formats_single_env_var (0.00s) --- PASS: TestFormatEnv/formats_multiple_env_vars (0.00s) --- PASS: TestFormatEnv/handles_empty_map (0.00s) --- PASS: TestFormatEnv/handles_nil_map (0.00s) --- PASS: TestFormatEnv/handles_special_characters (0.00s) === RUN TestConsoleEnrollmentStatus === RUN TestConsoleEnrollmentStatus/returns_not_enrolled_for_new_service 2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found [0.033ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1 === RUN TestConsoleEnrollmentStatus/returns_enrolled_status_after_enrollment time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi" 2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found [0.062ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1 time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=test-agent correlation_id=f9d8cff5-2328-4d76-99ae-8ad77cabe7c5 tenant= time="2025-12-12T19:01:41Z" level=info msg="crowdsec console enrollment succeeded" agent=test-agent correlation_id=f9d8cff5-2328-4d76-99ae-8ad77cabe7c5 tenant= === RUN TestConsoleEnrollmentStatus/returns_failed_status_after_failed_enrollment time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi" 2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found [0.058ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1 time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=test-agent correlation_id=2d72088a-f808-4327-a1b3-331ca36debc4 tenant= time="2025-12-12T19:01:41Z" level=warning msg="crowdsec console enrollment failed" correlation_id=2d72088a-f808-4327-a1b3-331ca36debc4 error="enroll failed" tenant= --- PASS: TestConsoleEnrollmentStatus (0.01s) --- PASS: TestConsoleEnrollmentStatus/returns_not_enrolled_for_new_service (0.00s) --- PASS: TestConsoleEnrollmentStatus/returns_enrolled_status_after_enrollment (0.00s) --- PASS: TestConsoleEnrollmentStatus/returns_failed_status_after_failed_enrollment (0.00s) === RUN TestDeriveKey === RUN TestDeriveKey/derives_consistent_key === RUN TestDeriveKey/derives_different_keys_for_different_secrets === RUN TestDeriveKey/uses_default_for_empty_secret --- PASS: TestDeriveKey (0.00s) --- PASS: TestDeriveKey/derives_consistent_key (0.00s) --- PASS: TestDeriveKey/derives_different_keys_for_different_secrets (0.00s) --- PASS: TestDeriveKey/uses_default_for_empty_secret (0.00s) === RUN TestNormalizeEnrollmentKey === RUN TestNormalizeEnrollmentKey/valid_raw_key === RUN TestNormalizeEnrollmentKey/full_command_with_sudo === RUN TestNormalizeEnrollmentKey/full_command_without_sudo === RUN TestNormalizeEnrollmentKey/key_with_whitespace === RUN TestNormalizeEnrollmentKey/empty_key === RUN TestNormalizeEnrollmentKey/only_whitespace === RUN TestNormalizeEnrollmentKey/invalid_format === RUN TestNormalizeEnrollmentKey/injection_attempt --- PASS: TestNormalizeEnrollmentKey (0.00s) --- PASS: TestNormalizeEnrollmentKey/valid_raw_key (0.00s) --- PASS: TestNormalizeEnrollmentKey/full_command_with_sudo (0.00s) --- PASS: TestNormalizeEnrollmentKey/full_command_without_sudo (0.00s) --- PASS: TestNormalizeEnrollmentKey/key_with_whitespace (0.00s) --- PASS: TestNormalizeEnrollmentKey/empty_key (0.00s) --- PASS: TestNormalizeEnrollmentKey/only_whitespace (0.00s) --- PASS: TestNormalizeEnrollmentKey/invalid_format (0.00s) --- PASS: TestNormalizeEnrollmentKey/injection_attempt (0.00s) === RUN TestRedactSecret === RUN TestRedactSecret/redacts_secret_from_message === RUN TestRedactSecret/handles_empty_secret === RUN TestRedactSecret/handles_secret_not_in_message === RUN TestRedactSecret/redacts_multiple_occurrences --- PASS: TestRedactSecret (0.00s) --- PASS: TestRedactSecret/redacts_secret_from_message (0.00s) --- PASS: TestRedactSecret/handles_empty_secret (0.00s) --- PASS: TestRedactSecret/handles_secret_not_in_message (0.00s) --- PASS: TestRedactSecret/redacts_multiple_occurrences (0.00s) === RUN TestEncryptDecrypt === RUN TestEncryptDecrypt/encrypts_and_decrypts_successfully === RUN TestEncryptDecrypt/handles_empty_string === RUN TestEncryptDecrypt/different_encryptions_produce_different_ciphertext --- PASS: TestEncryptDecrypt (0.00s) --- PASS: TestEncryptDecrypt/encrypts_and_decrypts_successfully (0.00s) --- PASS: TestEncryptDecrypt/handles_empty_string (0.00s) --- PASS: TestEncryptDecrypt/different_encryptions_produce_different_ciphertext (0.00s) === RUN TestApplyWithOpenFileHandles time="2025-12-12T19:01:41Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyWithOpenFileHandles1577121141/001/test/preset/bundle.tgz cache_key=test/preset-1765566101 meta_path=/tmp/TestApplyWithOpenFileHandles1577121141/001/test/preset/metadata.json preview_path=/tmp/TestApplyWithOpenFileHandles1577121141/001/test/preset/preview.yaml slug=test/preset time="2025-12-12T19:01:41Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyWithOpenFileHandles1577121141/001/test/preset/bundle.tgz cache_key=test/preset-1765566101 slug=test/preset --- PASS: TestApplyWithOpenFileHandles (0.00s) === RUN TestBackupPathOnlySetAfterSuccessfulBackup === RUN TestBackupPathOnlySetAfterSuccessfulBackup/backup_path_not_set_when_cache_missing time="2025-12-12T19:01:41Z" level=warning msg="failed to load cached preset metadata" error="cache miss" slug=nonexistent/preset time="2025-12-12T19:01:41Z" level=info msg="attempting to repull preset after cache load failure" error="load cache for nonexistent/preset: cache miss" slug=nonexistent/preset time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="https://hub-data.crowdsec.net/api/index.json (status 403)" hub_index="https://hub-data.crowdsec.net/api/index.json" time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=true hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json" time="2025-12-12T19:01:42Z" level=warning msg="cache refresh failed; rolled back backup" backup_path=/tmp/TestBackupPathOnlySetAfterSuccessfulBackupbackup_path_not_set_w3329883887/002/crowdsec.backup.20251212-190141 error="load cache for nonexistent/preset: cache miss: refresh cache: preset not found in hub" slug=nonexistent/preset === RUN TestBackupPathOnlySetAfterSuccessfulBackup/backup_path_set_only_after_successful_backup time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestBackupPathOnlySetAfterSuccessfulBackupbackup_path_set_only_3319044631/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 meta_path=/tmp/TestBackupPathOnlySetAfterSuccessfulBackupbackup_path_set_only_3319044631/001/test/preset/metadata.json preview_path=/tmp/TestBackupPathOnlySetAfterSuccessfulBackupbackup_path_set_only_3319044631/001/test/preset/preview.yaml slug=test/preset time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestBackupPathOnlySetAfterSuccessfulBackupbackup_path_set_only_3319044631/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 slug=test/preset --- PASS: TestBackupPathOnlySetAfterSuccessfulBackup (0.60s) --- PASS: TestBackupPathOnlySetAfterSuccessfulBackup/backup_path_not_set_when_cache_missing (0.59s) --- PASS: TestBackupPathOnlySetAfterSuccessfulBackup/backup_path_set_only_after_successful_backup (0.00s) === RUN TestHubCacheStoreLoadAndExpire time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCacheStoreLoadAndExpire451730120/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestHubCacheStoreLoadAndExpire451730120/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestHubCacheStoreLoadAndExpire451730120/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo --- PASS: TestHubCacheStoreLoadAndExpire (0.00s) === RUN TestHubCacheRejectsBadSlug --- PASS: TestHubCacheRejectsBadSlug (0.00s) === RUN TestHubCacheListAndEvict time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCacheListAndEvict2059688537/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestHubCacheListAndEvict2059688537/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestHubCacheListAndEvict2059688537/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCacheListAndEvict2059688537/001/crowdsecurity/other/bundle.tgz cache_key=crowdsecurity/other-1765566102 meta_path=/tmp/TestHubCacheListAndEvict2059688537/001/crowdsecurity/other/metadata.json preview_path=/tmp/TestHubCacheListAndEvict2059688537/001/crowdsecurity/other/preview.yaml slug=crowdsecurity/other --- PASS: TestHubCacheListAndEvict (0.00s) === RUN TestHubCacheTouchUpdatesTTL time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCacheTouchUpdatesTTL763022005/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestHubCacheTouchUpdatesTTL763022005/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestHubCacheTouchUpdatesTTL763022005/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo --- PASS: TestHubCacheTouchUpdatesTTL (0.00s) === RUN TestHubCachePreviewExistsAndSize time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCachePreviewExistsAndSize3876473300/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestHubCachePreviewExistsAndSize3876473300/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestHubCachePreviewExistsAndSize3876473300/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo --- PASS: TestHubCachePreviewExistsAndSize (0.00s) === RUN TestHubCacheExistsHonorsTTL time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCacheExistsHonorsTTL419723857/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestHubCacheExistsHonorsTTL419723857/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestHubCacheExistsHonorsTTL419723857/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo --- PASS: TestHubCacheExistsHonorsTTL (0.00s) === RUN TestSanitizeSlugCases --- PASS: TestSanitizeSlugCases (0.00s) === RUN TestNewHubCacheRequiresBaseDir --- PASS: TestNewHubCacheRequiresBaseDir (0.00s) === RUN TestHubCacheTouchMissing --- PASS: TestHubCacheTouchMissing (0.00s) === RUN TestHubCacheTouchInvalidSlug --- PASS: TestHubCacheTouchInvalidSlug (0.00s) === RUN TestHubCacheStoreContextCanceled --- PASS: TestHubCacheStoreContextCanceled (0.00s) === RUN TestHubCacheLoadInvalidSlug --- PASS: TestHubCacheLoadInvalidSlug (0.00s) === RUN TestHubCacheExistsContextCanceled --- PASS: TestHubCacheExistsContextCanceled (0.00s) === RUN TestHubCacheListSkipsExpired time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCacheListSkipsExpired2609582306/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1704110400 meta_path=/tmp/TestHubCacheListSkipsExpired2609582306/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestHubCacheListSkipsExpired2609582306/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo --- PASS: TestHubCacheListSkipsExpired (0.00s) === RUN TestHubCacheEvictInvalidSlug --- PASS: TestHubCacheEvictInvalidSlug (0.00s) === RUN TestHubCacheListContextCanceled --- PASS: TestHubCacheListContextCanceled (0.00s) === RUN TestHubCacheTTL === RUN TestHubCacheTTL/returns_configured_TTL === RUN TestHubCacheTTL/returns_minute_TTL === RUN TestHubCacheTTL/returns_zero_TTL_if_configured --- PASS: TestHubCacheTTL (0.00s) --- PASS: TestHubCacheTTL/returns_configured_TTL (0.00s) --- PASS: TestHubCacheTTL/returns_minute_TTL (0.00s) --- PASS: TestHubCacheTTL/returns_zero_TTL_if_configured (0.00s) === RUN TestPullThenApplyFlow hub_pull_apply_test.go:90: Step 1: Pulling preset time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://test.example.com/api/index.json" time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/test.tgz" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/test.yaml" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=158 etag=etag123 hub_endpoint="http://test.example.com/test.tgz" preview_size=24 slug=test/preset time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullThenApplyFlow466905016/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 meta_path=/tmp/TestPullThenApplyFlow466905016/001/test/preset/metadata.json preview_path=/tmp/TestPullThenApplyFlow466905016/001/test/preset/preview.yaml slug=test/preset time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestPullThenApplyFlow466905016/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 preview_path=/tmp/TestPullThenApplyFlow466905016/001/test/preset/preview.yaml slug=test/preset hub_pull_apply_test.go:110: Step 2: Verifying cache can be loaded hub_pull_apply_test.go:117: Step 3: Applying preset from cache time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestPullThenApplyFlow466905016/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 slug=test/preset --- PASS: TestPullThenApplyFlow (0.00s) === RUN TestApplyRepullsOnCacheMissAfterCSCLIFailure time="2025-12-12T19:01:42Z" level=warning msg="failed to load cached preset metadata" error="cache miss" slug=test/preset time="2025-12-12T19:01:42Z" level=warning msg="cscli install failed; attempting cache fallback" error="install failed" slug=test/preset time="2025-12-12T19:01:42Z" level=info msg="attempting to repull preset after cache load failure" error="load cache for test/preset: cache miss" slug=test/preset time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://test.example.com/api/index.json" time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/test/preset.tgz" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/test/preset.yaml" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=110 etag=e1 hub_endpoint="http://test.example.com/test/preset.tgz" preview_size=7 slug=test/preset time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyRepullsOnCacheMissAfterCSCLIFailure2942444691/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 meta_path=/tmp/TestApplyRepullsOnCacheMissAfterCSCLIFailure2942444691/001/test/preset/metadata.json preview_path=/tmp/TestApplyRepullsOnCacheMissAfterCSCLIFailure2942444691/001/test/preset/preview.yaml slug=test/preset time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestApplyRepullsOnCacheMissAfterCSCLIFailure2942444691/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 preview_path=/tmp/TestApplyRepullsOnCacheMissAfterCSCLIFailure2942444691/001/test/preset/preview.yaml slug=test/preset --- PASS: TestApplyRepullsOnCacheMissAfterCSCLIFailure (0.00s) === RUN TestApplyRepullsOnCacheExpired time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/bundle.tgz cache_key=expired/preset-1765566102 meta_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/metadata.json preview_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/preview.yaml slug=expired/preset time="2025-12-12T19:01:42Z" level=warning msg="failed to load cached preset metadata" error="cache expired" slug=expired/preset time="2025-12-12T19:01:42Z" level=info msg="attempting to repull preset after cache load failure" error="load cache for expired/preset: cache expired" slug=expired/preset time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://test.example.com/api/index.json" time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/expired/preset.tgz" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/expired/preset.yaml" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=112 etag=e2 hub_endpoint="http://test.example.com/expired/preset.tgz" preview_size=11 slug=expired/preset time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/bundle.tgz cache_key=expired/preset-1765566102 meta_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/metadata.json preview_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/preview.yaml slug=expired/preset time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/bundle.tgz cache_key=expired/preset-1765566102 preview_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/preview.yaml slug=expired/preset --- PASS: TestApplyRepullsOnCacheExpired (0.01s) === RUN TestPullAcceptsNamespacedIndexEntry time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://test.example.com/api/index.json" time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/crowdsecurity/bot-mitigation-essentials.tgz" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/crowdsecurity/bot-mitigation-essentials.yaml" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=114 etag=etag-bme hub_endpoint="http://test.example.com/crowdsecurity/bot-mitigation-essentials.tgz" preview_size=18 slug=bot-mitigation-essentials time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullAcceptsNamespacedIndexEntry475100233/001/bot-mitigation-essentials/bundle.tgz cache_key=bot-mitigation-essentials-1765566102 meta_path=/tmp/TestPullAcceptsNamespacedIndexEntry475100233/001/bot-mitigation-essentials/metadata.json preview_path=/tmp/TestPullAcceptsNamespacedIndexEntry475100233/001/bot-mitigation-essentials/preview.yaml slug=bot-mitigation-essentials time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestPullAcceptsNamespacedIndexEntry475100233/001/bot-mitigation-essentials/bundle.tgz cache_key=bot-mitigation-essentials-1765566102 preview_path=/tmp/TestPullAcceptsNamespacedIndexEntry475100233/001/bot-mitigation-essentials/preview.yaml slug=bot-mitigation-essentials --- PASS: TestPullAcceptsNamespacedIndexEntry (0.00s) === RUN TestHubFallbackToMirrorOnForbidden time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="http://primary.example.com/api/index.json (status 403)" hub_index="http://primary.example.com/api/index.json" time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=true hub_index="http://mirror.example.com/api/index.json" time="2025-12-12T19:01:42Z" level=warning msg="hub fetch failed, attempting fallback" attempt=1 endpoint="http://primary.example.com/fallback/preset.tgz" error="http://primary.example.com/fallback/preset.tgz (status 403)" time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://mirror.example.com/fallback/preset.tgz" fallback_used=true time="2025-12-12T19:01:42Z" level=warning msg="hub fetch failed, attempting fallback" attempt=1 endpoint="http://primary.example.com/fallback/preset.yaml" error="http://primary.example.com/fallback/preset.yaml (status 403)" time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://mirror.example.com/fallback/preset.yaml" fallback_used=true time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=104 etag=etag-mirror hub_endpoint="http://mirror.example.com/fallback/preset.tgz" preview_size=14 slug=fallback/preset time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubFallbackToMirrorOnForbidden2346863733/001/fallback/preset/bundle.tgz cache_key=fallback/preset-1765566102 meta_path=/tmp/TestHubFallbackToMirrorOnForbidden2346863733/001/fallback/preset/metadata.json preview_path=/tmp/TestHubFallbackToMirrorOnForbidden2346863733/001/fallback/preset/preview.yaml slug=fallback/preset time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestHubFallbackToMirrorOnForbidden2346863733/001/fallback/preset/bundle.tgz cache_key=fallback/preset-1765566102 preview_path=/tmp/TestHubFallbackToMirrorOnForbidden2346863733/001/fallback/preset/preview.yaml slug=fallback/preset --- PASS: TestHubFallbackToMirrorOnForbidden (0.00s) === RUN TestApplyWithoutPullFails time="2025-12-12T19:01:42Z" level=warning msg="failed to load cached preset metadata" error="cache miss" slug=nonexistent/preset time="2025-12-12T19:01:42Z" level=info msg="attempting to repull preset after cache load failure" error="load cache for nonexistent/preset: cache miss" slug=nonexistent/preset time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="http://test.example.com/api/index.json (status 500)" hub_index="http://test.example.com/api/index.json" time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=2 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 500)" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json" time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=3 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 500)" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json" time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=4 error="https://hub-data.crowdsec.net/api/index.json (status 500)" hub_index="https://hub-data.crowdsec.net/api/index.json" time="2025-12-12T19:01:42Z" level=warning msg="cache refresh failed; rolled back backup" backup_path=/tmp/TestApplyWithoutPullFails3366600238/002.backup.20251212-190142 error="load cache for nonexistent/preset: cache miss: refresh cache: fetch hub index: http://test.example.com/api/index.json: http://test.example.com/api/index.json (status 500)\nhttps://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json: https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 500)\nhttps://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json: https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 500)\nhttps://hub-data.crowdsec.net/api/index.json: https://hub-data.crowdsec.net/api/index.json (status 500)" slug=nonexistent/preset --- PASS: TestApplyWithoutPullFails (0.00s) === RUN TestCacheExpiration time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestCacheExpiration1620386465/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 meta_path=/tmp/TestCacheExpiration1620386465/001/test/preset/metadata.json preview_path=/tmp/TestCacheExpiration1620386465/001/test/preset/preview.yaml slug=test/preset --- PASS: TestCacheExpiration (0.01s) === RUN TestCacheListAfterPull time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://test.example.com/api/index.json" time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/preset1.tgz" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/preset1.yaml" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=105 etag=e1 hub_endpoint="http://test.example.com/preset1.tgz" preview_size=8 slug=preset1 time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestCacheListAfterPull1961094869/001/preset1/bundle.tgz cache_key=preset1-1765566102 meta_path=/tmp/TestCacheListAfterPull1961094869/001/preset1/metadata.json preview_path=/tmp/TestCacheListAfterPull1961094869/001/preset1/preview.yaml slug=preset1 time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestCacheListAfterPull1961094869/001/preset1/bundle.tgz cache_key=preset1-1765566102 preview_path=/tmp/TestCacheListAfterPull1961094869/001/preset1/preview.yaml slug=preset1 --- PASS: TestCacheListAfterPull (0.00s) === RUN TestApplyReadsArchiveBeforeBackup time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyReadsArchiveBeforeBackup1671951937/001/crowdsec/hub_cache/test/preset/bundle.tgz cache_key=test/preset-1765566102 meta_path=/tmp/TestApplyReadsArchiveBeforeBackup1671951937/001/crowdsec/hub_cache/test/preset/metadata.json preview_path=/tmp/TestApplyReadsArchiveBeforeBackup1671951937/001/crowdsec/hub_cache/test/preset/preview.yaml slug=test/preset time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyReadsArchiveBeforeBackup1671951937/001/crowdsec/hub_cache/test/preset/bundle.tgz cache_key=test/preset-1765566102 slug=test/preset --- PASS: TestApplyReadsArchiveBeforeBackup (0.00s) === RUN TestFetchIndexParsesRawIndexFormat time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://example.com/api/index.json" --- PASS: TestFetchIndexParsesRawIndexFormat (0.00s) === RUN TestFetchIndexPrefersCSCLI --- PASS: TestFetchIndexPrefersCSCLI (0.00s) === RUN TestFetchIndexFallbackHTTP time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://example.com/api/index.json" --- PASS: TestFetchIndexFallbackHTTP (0.00s) === RUN TestFetchIndexHTTPRejectsRedirect --- PASS: TestFetchIndexHTTPRejectsRedirect (0.00s) === RUN TestFetchIndexHTTPRejectsHTML time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="https://hub-data.crowdsec.net/api/index.json (status 200): hub index responded with HTML; install cscli or set HUB_BASE_URL to a JSON hub endpoint" hub_index="https://hub-data.crowdsec.net/api/index.json" time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=2 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 200): hub index responded with HTML; install cscli or set HUB_BASE_URL to a JSON hub endpoint" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json" time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=3 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 200): hub index responded with HTML; install cscli or set HUB_BASE_URL to a JSON hub endpoint" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json" --- PASS: TestFetchIndexHTTPRejectsHTML (0.00s) === RUN TestFetchIndexHTTPFallsBackToDefaultHub time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="https://hub.crowdsec.net/api/index.json" --- PASS: TestFetchIndexHTTPFallsBackToDefaultHub (0.00s) === RUN TestFetchIndexFallsBackToMirrorOnForbidden time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="https://hub-data.crowdsec.net/api/index.json (status 403)" hub_index="https://hub-data.crowdsec.net/api/index.json" time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=true hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json" --- PASS: TestFetchIndexFallsBackToMirrorOnForbidden (0.00s) === RUN TestPullCachesPreview time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://example.com/api/index.json" time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://example.com/demo.tgz" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://example.com/demo.yaml" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=106 etag=etag1 hub_endpoint="http://example.com/demo.tgz" preview_size=12 slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullCachesPreview163764455/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestPullCachesPreview163764455/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestPullCachesPreview163764455/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestPullCachesPreview163764455/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 preview_path=/tmp/TestPullCachesPreview163764455/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo --- PASS: TestPullCachesPreview (0.00s) === RUN TestApplyUsesCacheWhenCSCLIFails time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyUsesCacheWhenCSCLIFails3907435296/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestApplyUsesCacheWhenCSCLIFails3907435296/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestApplyUsesCacheWhenCSCLIFails3907435296/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyUsesCacheWhenCSCLIFails3907435296/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=warning msg="cscli install failed; attempting cache fallback" error="install failed" slug=crowdsecurity/demo --- PASS: TestApplyUsesCacheWhenCSCLIFails (0.00s) === RUN TestApplyRollsBackOnBadArchive time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyRollsBackOnBadArchive1203944782/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestApplyRollsBackOnBadArchive1203944782/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestApplyRollsBackOnBadArchive1203944782/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyRollsBackOnBadArchive1203944782/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 slug=crowdsecurity/demo --- PASS: TestApplyRollsBackOnBadArchive (0.00s) === RUN TestApplyUsesCacheWhenCscliMissing time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyUsesCacheWhenCscliMissing4071549477/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestApplyUsesCacheWhenCscliMissing4071549477/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestApplyUsesCacheWhenCscliMissing4071549477/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyUsesCacheWhenCscliMissing4071549477/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 slug=crowdsecurity/demo --- PASS: TestApplyUsesCacheWhenCscliMissing (0.00s) === RUN TestPullReturnsCachedPreviewWithoutNetwork time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullReturnsCachedPreviewWithoutNetwork150266149/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestPullReturnsCachedPreviewWithoutNetwork150266149/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestPullReturnsCachedPreviewWithoutNetwork150266149/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo --- PASS: TestPullReturnsCachedPreviewWithoutNetwork (0.00s) === RUN TestPullEvictsExpiredCacheAndRefreshes time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566100 meta_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://example.com/api/index.json" time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://example.com/demo.tgz" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://example.com/demo.yaml" fallback_used=false time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=99 etag=etag2 hub_endpoint="http://example.com/demo.tgz" preview_size=13 slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566103 meta_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566103 preview_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo --- PASS: TestPullEvictsExpiredCacheAndRefreshes (0.00s) === RUN TestPullFallsBackToArchivePreview time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://example.com/api/index.json" time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://example.com/demo.tgz" fallback_used=false time="2025-12-12T19:01:42Z" level=warning msg="hub fetch failed, attempting fallback" attempt=1 endpoint="http://example.com/demo.yaml" error="http://example.com/demo.yaml (status 500)" time="2025-12-12T19:01:42Z" level=warning msg="failed to download preview, falling back to archive inspection" error="preview fetch failed (last endpoint http://example.com/crowdsecurity/demo.yaml): http://example.com/demo.yaml: http://example.com/demo.yaml (status 500)\nhttp://example.com/crowdsecurity/demo.yaml: http://example.com/crowdsecurity/demo.yaml (status 404)" slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=116 etag=etag1 hub_endpoint="http://example.com/demo.tgz" preview_size=11 slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullFallsBackToArchivePreview1622869425/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestPullFallsBackToArchivePreview1622869425/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestPullFallsBackToArchivePreview1622869425/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestPullFallsBackToArchivePreview1622869425/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 preview_path=/tmp/TestPullFallsBackToArchivePreview1622869425/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo --- PASS: TestPullFallsBackToArchivePreview (0.00s) === RUN TestPullFallsBackToMirrorArchiveOnForbidden time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="https://primary.example/api/index.json" time="2025-12-12T19:01:42Z" level=warning msg="hub fetch failed, attempting fallback" attempt=1 endpoint="https://primary.example/crowdsecurity/demo.tgz" error="https://primary.example/crowdsecurity/demo.tgz (status 403)" time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="https://raw.githubusercontent.com/crowdsecurity/hub/master/crowdsecurity/demo.tgz" fallback_used=true time="2025-12-12T19:01:42Z" level=warning msg="hub fetch failed, attempting fallback" attempt=1 endpoint="https://primary.example/crowdsecurity/demo.yaml" error="https://primary.example/crowdsecurity/demo.yaml (status 403)" time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="https://raw.githubusercontent.com/crowdsecurity/hub/master/crowdsecurity/demo.yaml" fallback_used=true time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=105 etag=etag1 hub_endpoint="https://raw.githubusercontent.com/crowdsecurity/hub/master/crowdsecurity/demo.tgz" preview_size=14 slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullFallsBackToMirrorArchiveOnForbidden3050240437/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestPullFallsBackToMirrorArchiveOnForbidden3050240437/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestPullFallsBackToMirrorArchiveOnForbidden3050240437/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestPullFallsBackToMirrorArchiveOnForbidden3050240437/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 preview_path=/tmp/TestPullFallsBackToMirrorArchiveOnForbidden3050240437/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo --- PASS: TestPullFallsBackToMirrorArchiveOnForbidden (0.00s) === RUN TestFetchWithLimitRejectsLargePayload --- PASS: TestFetchWithLimitRejectsLargePayload (0.19s) === RUN TestExtractTarGzRejectsSymlink --- PASS: TestExtractTarGzRejectsSymlink (0.00s) === RUN TestExtractTarGzRejectsAbsolutePath --- PASS: TestExtractTarGzRejectsAbsolutePath (0.00s) === RUN TestFetchIndexHTTPError time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="https://hub-data.crowdsec.net/api/index.json (status 503)" hub_index="https://hub-data.crowdsec.net/api/index.json" time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=2 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 503)" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json" time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=3 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 503)" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json" --- PASS: TestFetchIndexHTTPError (0.00s) === RUN TestPullValidatesSlugAndMissingPreset time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://hub.example/api/index.json" --- PASS: TestPullValidatesSlugAndMissingPreset (0.00s) === RUN TestFetchPreviewRequiresURL --- PASS: TestFetchPreviewRequiresURL (0.00s) === RUN TestFetchWithLimitRequiresClient --- PASS: TestFetchWithLimitRequiresClient (0.00s) === RUN TestRunCSCLIRejectsUnsafeSlug --- PASS: TestRunCSCLIRejectsUnsafeSlug (0.00s) === RUN TestApplyUsesCSCLISuccess time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyUsesCSCLISuccess906171493/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestApplyUsesCSCLISuccess906171493/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestApplyUsesCSCLISuccess906171493/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyUsesCSCLISuccess906171493/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 slug=crowdsecurity/demo --- PASS: TestApplyUsesCSCLISuccess (0.00s) === RUN TestFetchIndexCSCLIParseError time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="http://hub.example/api/index.json (status 500)" hub_index="http://hub.example/api/index.json" time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=2 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 500)" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json" time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=3 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 500)" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json" time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=4 error="https://hub-data.crowdsec.net/api/index.json (status 500)" hub_index="https://hub-data.crowdsec.net/api/index.json" --- PASS: TestFetchIndexCSCLIParseError (0.00s) === RUN TestFetchWithLimitStatusError --- PASS: TestFetchWithLimitStatusError (0.00s) === RUN TestApplyRollsBackWhenCacheMissing time="2025-12-12T19:01:42Z" level=error msg="cache unavailable for apply" slug=crowdsecurity/demo time="2025-12-12T19:01:42Z" level=warning msg="cache refresh failed; rolled back backup" backup_path=/tmp/TestApplyRollsBackWhenCacheMissing1102494851/001/crowdsec.backup.20251212-190142 error="cache unavailable for manual apply" slug=crowdsecurity/demo --- PASS: TestApplyRollsBackWhenCacheMissing (0.00s) === RUN TestNormalizeHubBaseURL === RUN TestNormalizeHubBaseURL/empty_uses_default === RUN TestNormalizeHubBaseURL/whitespace_uses_default === RUN TestNormalizeHubBaseURL/removes_trailing_slash === RUN TestNormalizeHubBaseURL/removes_multiple_trailing_slashes === RUN TestNormalizeHubBaseURL/trims_spaces === RUN TestNormalizeHubBaseURL/no_slash_unchanged --- PASS: TestNormalizeHubBaseURL (0.00s) --- PASS: TestNormalizeHubBaseURL/empty_uses_default (0.00s) --- PASS: TestNormalizeHubBaseURL/whitespace_uses_default (0.00s) --- PASS: TestNormalizeHubBaseURL/removes_trailing_slash (0.00s) --- PASS: TestNormalizeHubBaseURL/removes_multiple_trailing_slashes (0.00s) --- PASS: TestNormalizeHubBaseURL/trims_spaces (0.00s) --- PASS: TestNormalizeHubBaseURL/no_slash_unchanged (0.00s) === RUN TestBuildIndexURL === RUN TestBuildIndexURL/empty_base_uses_default === RUN TestBuildIndexURL/standard_base_appends_path === RUN TestBuildIndexURL/trailing_slash_removed === RUN TestBuildIndexURL/direct_json_url_unchanged === RUN TestBuildIndexURL/case_insensitive_json --- PASS: TestBuildIndexURL (0.00s) --- PASS: TestBuildIndexURL/empty_base_uses_default (0.00s) --- PASS: TestBuildIndexURL/standard_base_appends_path (0.00s) --- PASS: TestBuildIndexURL/trailing_slash_removed (0.00s) --- PASS: TestBuildIndexURL/direct_json_url_unchanged (0.00s) --- PASS: TestBuildIndexURL/case_insensitive_json (0.00s) === RUN TestUniqueStrings === RUN TestUniqueStrings/empty_slice === RUN TestUniqueStrings/no_duplicates === RUN TestUniqueStrings/with_duplicates === RUN TestUniqueStrings/all_duplicates === RUN TestUniqueStrings/preserves_order --- PASS: TestUniqueStrings (0.00s) --- PASS: TestUniqueStrings/empty_slice (0.00s) --- PASS: TestUniqueStrings/no_duplicates (0.00s) --- PASS: TestUniqueStrings/with_duplicates (0.00s) --- PASS: TestUniqueStrings/all_duplicates (0.00s) --- PASS: TestUniqueStrings/preserves_order (0.00s) === RUN TestFirstNonEmpty === RUN TestFirstNonEmpty/first_non-empty === RUN TestFirstNonEmpty/all_empty === RUN TestFirstNonEmpty/first_is_non-empty === RUN TestFirstNonEmpty/whitespace_treated_as_empty === RUN TestFirstNonEmpty/whitespace_with_content === RUN TestFirstNonEmpty/empty_slice === RUN TestFirstNonEmpty/tabs_and_newlines --- PASS: TestFirstNonEmpty (0.00s) --- PASS: TestFirstNonEmpty/first_non-empty (0.00s) --- PASS: TestFirstNonEmpty/all_empty (0.00s) --- PASS: TestFirstNonEmpty/first_is_non-empty (0.00s) --- PASS: TestFirstNonEmpty/whitespace_treated_as_empty (0.00s) --- PASS: TestFirstNonEmpty/whitespace_with_content (0.00s) --- PASS: TestFirstNonEmpty/empty_slice (0.00s) --- PASS: TestFirstNonEmpty/tabs_and_newlines (0.00s) === RUN TestCleanShellArg === RUN TestCleanShellArg/clean_slug === RUN TestCleanShellArg/with_dash === RUN TestCleanShellArg/with_underscore === RUN TestCleanShellArg/with_dot === RUN TestCleanShellArg/path_traversal === RUN TestCleanShellArg/absolute_path === RUN TestCleanShellArg/backslash_converted === RUN TestCleanShellArg/colon_not_allowed === RUN TestCleanShellArg/semicolon === RUN TestCleanShellArg/pipe === RUN TestCleanShellArg/ampersand === RUN TestCleanShellArg/backtick === RUN TestCleanShellArg/dollar === RUN TestCleanShellArg/parenthesis --- PASS: TestCleanShellArg (0.00s) --- PASS: TestCleanShellArg/clean_slug (0.00s) --- PASS: TestCleanShellArg/with_dash (0.00s) --- PASS: TestCleanShellArg/with_underscore (0.00s) --- PASS: TestCleanShellArg/with_dot (0.00s) --- PASS: TestCleanShellArg/path_traversal (0.00s) --- PASS: TestCleanShellArg/absolute_path (0.00s) --- PASS: TestCleanShellArg/backslash_converted (0.00s) --- PASS: TestCleanShellArg/colon_not_allowed (0.00s) --- PASS: TestCleanShellArg/semicolon (0.00s) --- PASS: TestCleanShellArg/pipe (0.00s) --- PASS: TestCleanShellArg/ampersand (0.00s) --- PASS: TestCleanShellArg/backtick (0.00s) --- PASS: TestCleanShellArg/dollar (0.00s) --- PASS: TestCleanShellArg/parenthesis (0.00s) === RUN TestHasCSCLI === RUN TestHasCSCLI/cscli_available === RUN TestHasCSCLI/cscli_not_found --- PASS: TestHasCSCLI (0.00s) --- PASS: TestHasCSCLI/cscli_available (0.00s) --- PASS: TestHasCSCLI/cscli_not_found (0.00s) === RUN TestFindPreviewFileFromArchive === RUN TestFindPreviewFileFromArchive/finds_yaml_in_archive === RUN TestFindPreviewFileFromArchive/returns_empty_for_no_yaml === RUN TestFindPreviewFileFromArchive/returns_empty_for_invalid_archive --- PASS: TestFindPreviewFileFromArchive (0.00s) --- PASS: TestFindPreviewFileFromArchive/finds_yaml_in_archive (0.00s) --- PASS: TestFindPreviewFileFromArchive/returns_empty_for_no_yaml (0.00s) --- PASS: TestFindPreviewFileFromArchive/returns_empty_for_invalid_archive (0.00s) === RUN TestApplyWithCopyBasedBackup time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyWithCopyBasedBackup4175808900/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 meta_path=/tmp/TestApplyWithCopyBasedBackup4175808900/001/test/preset/metadata.json preview_path=/tmp/TestApplyWithCopyBasedBackup4175808900/001/test/preset/preview.yaml slug=test/preset time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyWithCopyBasedBackup4175808900/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 slug=test/preset --- PASS: TestApplyWithCopyBasedBackup (0.00s) === RUN TestBackupExistingHandlesDeviceBusy --- PASS: TestBackupExistingHandlesDeviceBusy (0.00s) === RUN TestCopyFile --- PASS: TestCopyFile (0.01s) === RUN TestCopyDir --- PASS: TestCopyDir (0.00s) === RUN TestFetchIndexHTTPAcceptsTextPlain time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="https://hub-data.crowdsec.net/api/index.json" --- PASS: TestFetchIndexHTTPAcceptsTextPlain (0.00s) === RUN TestEmptyDir === RUN TestEmptyDir/empties_directory_with_files === RUN TestEmptyDir/empties_directory_with_subdirectories === RUN TestEmptyDir/handles_non-existent_directory === RUN TestEmptyDir/handles_empty_directory --- PASS: TestEmptyDir (0.00s) --- PASS: TestEmptyDir/empties_directory_with_files (0.00s) --- PASS: TestEmptyDir/empties_directory_with_subdirectories (0.00s) --- PASS: TestEmptyDir/handles_non-existent_directory (0.00s) --- PASS: TestEmptyDir/handles_empty_directory (0.00s) === RUN TestExtractTarGz === RUN TestExtractTarGz/extracts_valid_archive === RUN TestExtractTarGz/rejects_path_traversal === RUN TestExtractTarGz/rejects_symlinks === RUN TestExtractTarGz/handles_corrupted_gzip === RUN TestExtractTarGz/handles_context_cancellation === RUN TestExtractTarGz/creates_nested_directories --- PASS: TestExtractTarGz (0.00s) --- PASS: TestExtractTarGz/extracts_valid_archive (0.00s) --- PASS: TestExtractTarGz/rejects_path_traversal (0.00s) --- PASS: TestExtractTarGz/rejects_symlinks (0.00s) --- PASS: TestExtractTarGz/handles_corrupted_gzip (0.00s) --- PASS: TestExtractTarGz/handles_context_cancellation (0.00s) --- PASS: TestExtractTarGz/creates_nested_directories (0.00s) === RUN TestBackupExisting === RUN TestBackupExisting/handles_non-existent_directory === RUN TestBackupExisting/creates_backup_of_existing_directory === RUN TestBackupExisting/backup_contents_match_original --- PASS: TestBackupExisting (0.00s) --- PASS: TestBackupExisting/handles_non-existent_directory (0.00s) --- PASS: TestBackupExisting/creates_backup_of_existing_directory (0.00s) --- PASS: TestBackupExisting/backup_contents_match_original (0.00s) === RUN TestRollback === RUN TestRollback/rollback_with_backup === RUN TestRollback/rollback_with_empty_backup_path === RUN TestRollback/rollback_with_non-existent_backup --- PASS: TestRollback (0.00s) --- PASS: TestRollback/rollback_with_backup (0.00s) --- PASS: TestRollback/rollback_with_empty_backup_path (0.00s) --- PASS: TestRollback/rollback_with_non-existent_backup (0.00s) === RUN TestHubHTTPErrorError === RUN TestHubHTTPErrorError/error_with_inner_error === RUN TestHubHTTPErrorError/error_without_inner_error --- PASS: TestHubHTTPErrorError (0.00s) --- PASS: TestHubHTTPErrorError/error_with_inner_error (0.00s) --- PASS: TestHubHTTPErrorError/error_without_inner_error (0.00s) === RUN TestHubHTTPErrorUnwrap === RUN TestHubHTTPErrorUnwrap/unwrap_returns_inner_error === RUN TestHubHTTPErrorUnwrap/unwrap_returns_nil_when_no_inner === RUN TestHubHTTPErrorUnwrap/errors.Is_works_through_Unwrap --- PASS: TestHubHTTPErrorUnwrap (0.00s) --- PASS: TestHubHTTPErrorUnwrap/unwrap_returns_inner_error (0.00s) --- PASS: TestHubHTTPErrorUnwrap/unwrap_returns_nil_when_no_inner (0.00s) --- PASS: TestHubHTTPErrorUnwrap/errors.Is_works_through_Unwrap (0.00s) === RUN TestHubHTTPErrorCanFallback === RUN TestHubHTTPErrorCanFallback/returns_true_when_fallback_is_true === RUN TestHubHTTPErrorCanFallback/returns_false_when_fallback_is_false --- PASS: TestHubHTTPErrorCanFallback (0.00s) --- PASS: TestHubHTTPErrorCanFallback/returns_true_when_fallback_is_true (0.00s) --- PASS: TestHubHTTPErrorCanFallback/returns_false_when_fallback_is_false (0.00s) === RUN TestListCuratedPresetsReturnsCopy --- PASS: TestListCuratedPresetsReturnsCopy (0.00s) === RUN TestFindPreset --- PASS: TestFindPreset (0.00s) === RUN TestFindPresetCaseVariants === RUN TestFindPresetCaseVariants/exact_match === RUN TestFindPresetCaseVariants/another_preset === RUN TestFindPresetCaseVariants/case_sensitive_miss === RUN TestFindPresetCaseVariants/partial_match_miss === RUN TestFindPresetCaseVariants/empty_slug --- PASS: TestFindPresetCaseVariants (0.00s) --- PASS: TestFindPresetCaseVariants/exact_match (0.00s) --- PASS: TestFindPresetCaseVariants/another_preset (0.00s) --- PASS: TestFindPresetCaseVariants/case_sensitive_miss (0.00s) --- PASS: TestFindPresetCaseVariants/partial_match_miss (0.00s) --- PASS: TestFindPresetCaseVariants/empty_slug (0.00s) === RUN TestListCuratedPresetsReturnsDifferentCopy --- PASS: TestListCuratedPresetsReturnsDifferentCopy (0.00s) === RUN TestCheckLAPIHealth_Healthy --- PASS: TestCheckLAPIHealth_Healthy (0.00s) === RUN TestCheckLAPIHealth_Unhealthy --- PASS: TestCheckLAPIHealth_Unhealthy (0.00s) === RUN TestCheckLAPIHealth_Unreachable --- PASS: TestCheckLAPIHealth_Unreachable (0.00s) === RUN TestCheckLAPIHealth_FallbackToDecisions --- PASS: TestCheckLAPIHealth_FallbackToDecisions (0.00s) === RUN TestCheckLAPIHealth_DefaultURL --- PASS: TestCheckLAPIHealth_DefaultURL (0.00s) === RUN TestGetBouncerAPIKey_FromEnv --- PASS: TestGetBouncerAPIKey_FromEnv (0.00s) === RUN TestGetBouncerAPIKey_Empty --- PASS: TestGetBouncerAPIKey_Empty (0.00s) === RUN TestGetBouncerAPIKey_Fallback --- PASS: TestGetBouncerAPIKey_Fallback (0.00s) === RUN TestEnsureBouncerRegistered_UsesEnvKey --- PASS: TestEnsureBouncerRegistered_UsesEnvKey (0.00s) === RUN TestEnsureBouncerRegistered_NoEnvNoCSCLI --- PASS: TestEnsureBouncerRegistered_NoEnvNoCSCLI (0.00s) === RUN TestEnsureBouncerRegistered_ReturnsExistingBouncerKey --- PASS: TestEnsureBouncerRegistered_ReturnsExistingBouncerKey (0.00s) === RUN TestEnsureBouncerRegistered_RegistersNewWhenNoneExists --- PASS: TestEnsureBouncerRegistered_RegistersNewWhenNoneExists (0.01s) === RUN TestGetLAPIVersion_JSON --- PASS: TestGetLAPIVersion_JSON (0.00s) === RUN TestGetLAPIVersion_PlainText --- PASS: TestGetLAPIVersion_PlainText (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/crowdsec (cached) === RUN TestConnect --- PASS: TestConnect (0.02s) === RUN TestConnect_Error --- PASS: TestConnect_Error (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/database (cached) === RUN TestNewBroadcastHook --- PASS: TestNewBroadcastHook (0.00s) === RUN TestBroadcastHook_Levels --- PASS: TestBroadcastHook_Levels (0.00s) === RUN TestBroadcastHook_Subscribe --- PASS: TestBroadcastHook_Subscribe (0.00s) === RUN TestBroadcastHook_Unsubscribe --- PASS: TestBroadcastHook_Unsubscribe (0.00s) === RUN TestInit --- PASS: TestInit (0.00s) === RUN TestLog --- PASS: TestLog (0.00s) === RUN TestWithFields --- PASS: TestWithFields (0.00s) === RUN TestBroadcastHook_Fire --- PASS: TestBroadcastHook_Fire (0.00s) === RUN TestGetBroadcastHook --- PASS: TestGetBroadcastHook (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/logger (cached) === RUN TestMetrics_Register --- PASS: TestMetrics_Register (0.00s) === RUN TestMetrics_Increment --- PASS: TestMetrics_Increment (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/metrics (cached) === RUN TestDomain_BeforeCreate --- PASS: TestDomain_BeforeCreate (0.00s) === RUN TestNotificationTemplate_BeforeCreate --- PASS: TestNotificationTemplate_BeforeCreate (0.00s) === RUN TestUptimeHost_BeforeCreate --- PASS: TestUptimeHost_BeforeCreate (0.00s) === RUN TestUptimeNotificationEvent_BeforeCreate --- PASS: TestUptimeNotificationEvent_BeforeCreate (0.00s) === RUN TestNotification_BeforeCreate --- PASS: TestNotification_BeforeCreate (0.00s) === RUN TestNotificationConfig_BeforeCreate --- PASS: TestNotificationConfig_BeforeCreate (0.00s) === RUN TestUser_SetPassword --- PASS: TestUser_SetPassword (0.27s) === RUN TestUser_CheckPassword --- PASS: TestUser_CheckPassword (0.18s) === RUN TestUser_HasPendingInvite === RUN TestUser_HasPendingInvite/no_invite_token === RUN TestUser_HasPendingInvite/expired_invite === RUN TestUser_HasPendingInvite/valid_pending_invite === RUN TestUser_HasPendingInvite/already_accepted_invite --- PASS: TestUser_HasPendingInvite (0.00s) --- PASS: TestUser_HasPendingInvite/no_invite_token (0.00s) --- PASS: TestUser_HasPendingInvite/expired_invite (0.00s) --- PASS: TestUser_HasPendingInvite/valid_pending_invite (0.00s) --- PASS: TestUser_HasPendingInvite/already_accepted_invite (0.00s) === RUN TestUser_CanAccessHost_AllowAll --- PASS: TestUser_CanAccessHost_AllowAll (0.00s) === RUN TestUser_CanAccessHost_DenyAll --- PASS: TestUser_CanAccessHost_DenyAll (0.00s) === RUN TestUser_CanAccessHost_AdminBypass --- PASS: TestUser_CanAccessHost_AdminBypass (0.00s) === RUN TestUser_CanAccessHost_DefaultBehavior --- PASS: TestUser_CanAccessHost_DefaultBehavior (0.00s) === RUN TestUser_CanAccessHost_EmptyPermittedHosts === RUN TestUser_CanAccessHost_EmptyPermittedHosts/allow_all_with_no_exceptions_allows_all === RUN TestUser_CanAccessHost_EmptyPermittedHosts/deny_all_with_no_exceptions_denies_all --- PASS: TestUser_CanAccessHost_EmptyPermittedHosts (0.00s) --- PASS: TestUser_CanAccessHost_EmptyPermittedHosts/allow_all_with_no_exceptions_allows_all (0.00s) --- PASS: TestUser_CanAccessHost_EmptyPermittedHosts/deny_all_with_no_exceptions_denies_all (0.00s) === RUN TestPermissionMode_Constants --- PASS: TestPermissionMode_Constants (0.00s) === RUN TestNotificationProvider_BeforeCreate --- PASS: TestNotificationProvider_BeforeCreate (0.00s) === RUN TestUptimeMonitor_BeforeCreate --- PASS: TestUptimeMonitor_BeforeCreate (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/models (cached) === RUN TestNewRouter [GIN] 2025/12/12 - 00:34:55 | 200 | 1.889348ms | | GET "/" --- PASS: TestNewRouter (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/server (cached) === RUN TestAccessListService_Create === RUN TestAccessListService_Create/create_whitelist_with_valid_IP_rules === RUN TestAccessListService_Create/create_geo_whitelist_with_valid_country_codes === RUN TestAccessListService_Create/create_local_network_only_ACL === RUN TestAccessListService_Create/fail_with_empty_name === RUN TestAccessListService_Create/fail_with_invalid_type === RUN TestAccessListService_Create/fail_with_invalid_IP_address === RUN TestAccessListService_Create/fail_geo-blocking_without_country_codes === RUN TestAccessListService_Create/fail_with_invalid_country_code --- PASS: TestAccessListService_Create (0.00s) --- PASS: TestAccessListService_Create/create_whitelist_with_valid_IP_rules (0.00s) --- PASS: TestAccessListService_Create/create_geo_whitelist_with_valid_country_codes (0.00s) --- PASS: TestAccessListService_Create/create_local_network_only_ACL (0.00s) --- PASS: TestAccessListService_Create/fail_with_empty_name (0.00s) --- PASS: TestAccessListService_Create/fail_with_invalid_type (0.00s) --- PASS: TestAccessListService_Create/fail_with_invalid_IP_address (0.00s) --- PASS: TestAccessListService_Create/fail_geo-blocking_without_country_codes (0.00s) --- PASS: TestAccessListService_Create/fail_with_invalid_country_code (0.00s) === RUN TestAccessListService_GetByID === RUN TestAccessListService_GetByID/get_existing_ACL === RUN TestAccessListService_GetByID/get_non-existent_ACL 2025/12/12 19:01:44 /projects/Charon/backend/internal/services/access_list_service.go:105 record not found [0.021ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 99999 ORDER BY `access_lists`.`id` LIMIT 1 --- PASS: TestAccessListService_GetByID (0.00s) --- PASS: TestAccessListService_GetByID/get_existing_ACL (0.00s) --- PASS: TestAccessListService_GetByID/get_non-existent_ACL (0.00s) === RUN TestAccessListService_GetByUUID === RUN TestAccessListService_GetByUUID/get_existing_ACL_by_UUID === RUN TestAccessListService_GetByUUID/get_non-existent_ACL_by_UUID 2025/12/12 19:01:44 /projects/Charon/backend/internal/services/access_list_service.go:117 record not found [0.046ms] [rows:0] SELECT * FROM `access_lists` WHERE uuid = "non-existent-uuid" ORDER BY `access_lists`.`id` LIMIT 1 --- PASS: TestAccessListService_GetByUUID (0.00s) --- PASS: TestAccessListService_GetByUUID/get_existing_ACL_by_UUID (0.00s) --- PASS: TestAccessListService_GetByUUID/get_non-existent_ACL_by_UUID (0.00s) === RUN TestAccessListService_List === RUN TestAccessListService_List/list_all_ACLs --- PASS: TestAccessListService_List (0.00s) --- PASS: TestAccessListService_List/list_all_ACLs (0.00s) === RUN TestAccessListService_Update === RUN TestAccessListService_Update/update_successfully === RUN TestAccessListService_Update/fail_update_on_non-existent_ACL 2025/12/12 19:01:44 /projects/Charon/backend/internal/services/access_list_service.go:105 record not found [0.019ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 99999 ORDER BY `access_lists`.`id` LIMIT 1 === RUN TestAccessListService_Update/fail_update_with_invalid_data --- PASS: TestAccessListService_Update (0.00s) --- PASS: TestAccessListService_Update/update_successfully (0.00s) --- PASS: TestAccessListService_Update/fail_update_on_non-existent_ACL (0.00s) --- PASS: TestAccessListService_Update/fail_update_with_invalid_data (0.00s) === RUN TestAccessListService_Delete === RUN TestAccessListService_Delete/delete_successfully 2025/12/12 19:01:44 /projects/Charon/backend/internal/services/access_list_service.go:105 record not found [0.059ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 1 ORDER BY `access_lists`.`id` LIMIT 1 === RUN TestAccessListService_Delete/fail_delete_non-existent_ACL === RUN TestAccessListService_Delete/fail_delete_ACL_in_use --- PASS: TestAccessListService_Delete (0.00s) --- PASS: TestAccessListService_Delete/delete_successfully (0.00s) --- PASS: TestAccessListService_Delete/fail_delete_non-existent_ACL (0.00s) --- PASS: TestAccessListService_Delete/fail_delete_ACL_in_use (0.00s) === RUN TestAccessListService_TestIP === RUN TestAccessListService_TestIP/whitelist_allows_matching_IP === RUN TestAccessListService_TestIP/whitelist_blocks_non-matching_IP === RUN TestAccessListService_TestIP/blacklist_blocks_matching_IP === RUN TestAccessListService_TestIP/blacklist_allows_non-matching_IP === RUN TestAccessListService_TestIP/local_network_only_allows_RFC1918 === RUN TestAccessListService_TestIP/disabled_ACL_allows_all === RUN TestAccessListService_TestIP/fail_with_invalid_IP --- PASS: TestAccessListService_TestIP (0.00s) --- PASS: TestAccessListService_TestIP/whitelist_allows_matching_IP (0.00s) --- PASS: TestAccessListService_TestIP/whitelist_blocks_non-matching_IP (0.00s) --- PASS: TestAccessListService_TestIP/blacklist_blocks_matching_IP (0.00s) --- PASS: TestAccessListService_TestIP/blacklist_allows_non-matching_IP (0.00s) --- PASS: TestAccessListService_TestIP/local_network_only_allows_RFC1918 (0.00s) --- PASS: TestAccessListService_TestIP/disabled_ACL_allows_all (0.00s) --- PASS: TestAccessListService_TestIP/fail_with_invalid_IP (0.00s) === RUN TestAccessListService_GetTemplates --- PASS: TestAccessListService_GetTemplates (0.00s) === RUN TestAccessListService_Validation === RUN TestAccessListService_Validation/validate_CIDR_formats === RUN TestAccessListService_Validation/validate_country_codes === RUN TestAccessListService_Validation/validate_types --- PASS: TestAccessListService_Validation (0.00s) --- PASS: TestAccessListService_Validation/validate_CIDR_formats (0.00s) --- PASS: TestAccessListService_Validation/validate_country_codes (0.00s) --- PASS: TestAccessListService_Validation/validate_types (0.00s) === RUN TestIPMatchesCIDR_Helper === RUN TestIPMatchesCIDR_Helper/IPv4_in_subnet === RUN TestIPMatchesCIDR_Helper/IPv4_not_in_subnet === RUN TestIPMatchesCIDR_Helper/IPv4_single_IP_match === RUN TestIPMatchesCIDR_Helper/IPv4_single_IP_no_match === RUN TestIPMatchesCIDR_Helper/IPv6_in_subnet === RUN TestIPMatchesCIDR_Helper/IPv6_not_in_subnet === RUN TestIPMatchesCIDR_Helper/Invalid_CIDR --- PASS: TestIPMatchesCIDR_Helper (0.00s) --- PASS: TestIPMatchesCIDR_Helper/IPv4_in_subnet (0.00s) --- PASS: TestIPMatchesCIDR_Helper/IPv4_not_in_subnet (0.00s) --- PASS: TestIPMatchesCIDR_Helper/IPv4_single_IP_match (0.00s) --- PASS: TestIPMatchesCIDR_Helper/IPv4_single_IP_no_match (0.00s) --- PASS: TestIPMatchesCIDR_Helper/IPv6_in_subnet (0.00s) --- PASS: TestIPMatchesCIDR_Helper/IPv6_not_in_subnet (0.00s) --- PASS: TestIPMatchesCIDR_Helper/Invalid_CIDR (0.00s) === RUN TestIsPrivateIP_Helper === RUN TestIsPrivateIP_Helper/Private_10.x.x.x === RUN TestIsPrivateIP_Helper/Private_172.16.x.x === RUN TestIsPrivateIP_Helper/Private_192.168.x.x === RUN TestIsPrivateIP_Helper/Private_127.0.0.1 === RUN TestIsPrivateIP_Helper/Private_::1 === RUN TestIsPrivateIP_Helper/Private_fc00::/7 === RUN TestIsPrivateIP_Helper/Public_8.8.8.8 === RUN TestIsPrivateIP_Helper/Public_1.1.1.1 === RUN TestIsPrivateIP_Helper/Public_IPv6 --- PASS: TestIsPrivateIP_Helper (0.00s) --- PASS: TestIsPrivateIP_Helper/Private_10.x.x.x (0.00s) --- PASS: TestIsPrivateIP_Helper/Private_172.16.x.x (0.00s) --- PASS: TestIsPrivateIP_Helper/Private_192.168.x.x (0.00s) --- PASS: TestIsPrivateIP_Helper/Private_127.0.0.1 (0.00s) --- PASS: TestIsPrivateIP_Helper/Private_::1 (0.00s) --- PASS: TestIsPrivateIP_Helper/Private_fc00::/7 (0.00s) --- PASS: TestIsPrivateIP_Helper/Public_8.8.8.8 (0.00s) --- PASS: TestIsPrivateIP_Helper/Public_1.1.1.1 (0.00s) --- PASS: TestIsPrivateIP_Helper/Public_IPv6 (0.00s) === RUN TestAccessListService_ListFunction --- PASS: TestAccessListService_ListFunction (0.00s) === RUN TestAccessListService_SetGeoIPService --- PASS: TestAccessListService_SetGeoIPService (0.00s) === RUN TestAccessListService_GeoACL_NoGeoIPService === RUN TestAccessListService_GeoACL_NoGeoIPService/geo_whitelist_without_GeoIP_service_allows_traffic === RUN TestAccessListService_GeoACL_NoGeoIPService/geo_blacklist_without_GeoIP_service_allows_traffic --- PASS: TestAccessListService_GeoACL_NoGeoIPService (0.00s) --- PASS: TestAccessListService_GeoACL_NoGeoIPService/geo_whitelist_without_GeoIP_service_allows_traffic (0.00s) --- PASS: TestAccessListService_GeoACL_NoGeoIPService/geo_blacklist_without_GeoIP_service_allows_traffic (0.00s) === RUN TestAccessListService_ParseCountryCodes === RUN TestAccessListService_ParseCountryCodes/parse_single_code === RUN TestAccessListService_ParseCountryCodes/parse_multiple_codes === RUN TestAccessListService_ParseCountryCodes/parse_with_spaces === RUN TestAccessListService_ParseCountryCodes/parse_with_lowercase === RUN TestAccessListService_ParseCountryCodes/parse_empty_string === RUN TestAccessListService_ParseCountryCodes/parse_with_empty_entries --- PASS: TestAccessListService_ParseCountryCodes (0.00s) --- PASS: TestAccessListService_ParseCountryCodes/parse_single_code (0.00s) --- PASS: TestAccessListService_ParseCountryCodes/parse_multiple_codes (0.00s) --- PASS: TestAccessListService_ParseCountryCodes/parse_with_spaces (0.00s) --- PASS: TestAccessListService_ParseCountryCodes/parse_with_lowercase (0.00s) --- PASS: TestAccessListService_ParseCountryCodes/parse_empty_string (0.00s) --- PASS: TestAccessListService_ParseCountryCodes/parse_with_empty_entries (0.00s) === RUN TestAuthService_Register --- PASS: TestAuthService_Register (0.12s) === RUN TestAuthService_Login --- PASS: TestAuthService_Login (0.42s) === RUN TestAuthService_ChangePassword 2025/12/12 19:01:45 /projects/Charon/backend/internal/services/auth_service.go:113 record not found [0.200ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1 --- PASS: TestAuthService_ChangePassword (0.36s) === RUN TestAuthService_ValidateToken --- PASS: TestAuthService_ValidateToken (0.12s) === RUN TestAuthService_GetUserByID 2025/12/12 19:01:45 /projects/Charon/backend/internal/services/auth_service.go:147 record not found [0.025ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1 --- PASS: TestAuthService_GetUserByID (0.06s) === RUN TestBackupService_GetAvailableSpace === PAUSE TestBackupService_GetAvailableSpace === RUN TestBackupService_CreateAndList --- PASS: TestBackupService_CreateAndList (0.00s) === RUN TestBackupService_Restore_ZipSlip --- PASS: TestBackupService_Restore_ZipSlip (0.00s) === RUN TestBackupService_PathTraversal --- PASS: TestBackupService_PathTraversal (0.00s) === RUN TestBackupService_RunScheduledBackup time="2025-12-12T19:01:45Z" level=info msg="Starting scheduled backup" time="2025-12-12T19:01:45Z" level=warning msg="Warning: could not backup caddy dir" error="lstat /tmp/TestBackupService_RunScheduledBackup2081147944/001/data/caddy: no such file or directory" time="2025-12-12T19:01:45Z" level=info msg="Scheduled backup created" backup=backup_2025-12-12_19-01-45.zip --- PASS: TestBackupService_RunScheduledBackup (0.00s) === RUN TestBackupService_CreateBackup_Errors === RUN TestBackupService_CreateBackup_Errors/missing_database_file === RUN TestBackupService_CreateBackup_Errors/cannot_create_backup_directory --- PASS: TestBackupService_CreateBackup_Errors (0.00s) --- PASS: TestBackupService_CreateBackup_Errors/missing_database_file (0.00s) --- PASS: TestBackupService_CreateBackup_Errors/cannot_create_backup_directory (0.00s) === RUN TestBackupService_RestoreBackup_Errors === RUN TestBackupService_RestoreBackup_Errors/non-existent_backup === RUN TestBackupService_RestoreBackup_Errors/invalid_zip_file --- PASS: TestBackupService_RestoreBackup_Errors (0.00s) --- PASS: TestBackupService_RestoreBackup_Errors/non-existent_backup (0.00s) --- PASS: TestBackupService_RestoreBackup_Errors/invalid_zip_file (0.00s) === RUN TestBackupService_ListBackups_EmptyDir --- PASS: TestBackupService_ListBackups_EmptyDir (0.00s) === RUN TestBackupService_ListBackups_MissingDir --- PASS: TestBackupService_ListBackups_MissingDir (0.00s) === RUN TestNewCertificateService time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestNewCertificateService2961672703/001/certificates time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=0 --- PASS: TestNewCertificateService (0.10s) === RUN TestCertificateService_GetCertificateInfo time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/cert-test277269634/certificates 2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found [0.152ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1 2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.255ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=1 time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/cert-test277269634/certificates 2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found [0.036ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "expired.com" ORDER BY `ssl_certificates`.`id` LIMIT 1 2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.013ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=2 --- PASS: TestCertificateService_GetCertificateInfo (0.13s) === RUN TestCertificateService_UploadAndDelete time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_UploadAndDelete1997251663/001/certificates time="2025-12-12T19:01:45Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_UploadAndDelete1997251663/001/certificates time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=1 time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_UploadAndDelete1997251663/001/certificates time="2025-12-12T19:01:45Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_UploadAndDelete1997251663/001/certificates time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=0 --- PASS: TestCertificateService_UploadAndDelete (0.16s) === RUN TestCertificateService_Persistence time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_Persistence800545086/001/certificates 2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found [0.144ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "persist.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1 time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=1 time="2025-12-12T19:01:45Z" level=info msg="CertificateService: deleting ACME cert file" path=/tmp/TestCertificateService_Persistence800545086/001/certificates/acme-v02.api.letsencrypt.org-directory/persist.example.com/persist.example.com.crt time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_Persistence800545086/001/certificates time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=0 2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service_test.go:289 record not found [0.034ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE (domains = "persist.example.com" AND provider = "letsencrypt") AND `ssl_certificates`.`id` = 1 ORDER BY `ssl_certificates`.`id` LIMIT 1 --- PASS: TestCertificateService_Persistence (0.04s) === RUN TestCertificateService_UploadCertificate_Errors === RUN TestCertificateService_UploadCertificate_Errors/invalid_PEM_format === RUN TestCertificateService_UploadCertificate_Errors/empty_certificate === RUN TestCertificateService_UploadCertificate_Errors/certificate_without_key_allowed === RUN TestCertificateService_UploadCertificate_Errors/valid_certificate_with_name === RUN TestCertificateService_UploadCertificate_Errors/expired_certificate_can_be_uploaded --- PASS: TestCertificateService_UploadCertificate_Errors (0.14s) --- PASS: TestCertificateService_UploadCertificate_Errors/invalid_PEM_format (0.00s) --- PASS: TestCertificateService_UploadCertificate_Errors/empty_certificate (0.00s) --- PASS: TestCertificateService_UploadCertificate_Errors/certificate_without_key_allowed (0.03s) --- PASS: TestCertificateService_UploadCertificate_Errors/valid_certificate_with_name (0.04s) --- PASS: TestCertificateService_UploadCertificate_Errors/expired_certificate_can_be_uploaded (0.07s) === RUN TestCertificateService_ListCertificates_EdgeCases === RUN TestCertificateService_ListCertificates_EdgeCases/empty_certificates_directory time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasesempty_certific1812970575/001/certificates time="2025-12-12T19:01:45Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasesempty_certific1812970575/001/certificates 2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.227ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=0 === RUN TestCertificateService_ListCertificates_EdgeCases/certificates_directory_does_not_exist time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasescertificates_d9819933/001/does-not-exist/certificates time="2025-12-12T19:01:45Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasescertificates_d9819933/001/does-not-exist/certificates 2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.204ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=0 === RUN TestCertificateService_ListCertificates_EdgeCases/invalid_certificate_files_are_skipped time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasesinvalid_certif4204332528/001/certificates 2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.161ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=0 === RUN TestCertificateService_ListCertificates_EdgeCases/multiple_certificates_from_different_providers time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasesmultiple_certi2309667957/001/certificates 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found [0.065ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "le.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.265ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=2 --- PASS: TestCertificateService_ListCertificates_EdgeCases (0.21s) --- PASS: TestCertificateService_ListCertificates_EdgeCases/empty_certificates_directory (0.00s) --- PASS: TestCertificateService_ListCertificates_EdgeCases/certificates_directory_does_not_exist (0.00s) --- PASS: TestCertificateService_ListCertificates_EdgeCases/invalid_certificate_files_are_skipped (0.00s) --- PASS: TestCertificateService_ListCertificates_EdgeCases/multiple_certificates_from_different_providers (0.21s) === RUN TestCertificateService_DeleteCertificate_Errors === RUN TestCertificateService_DeleteCertificate_Errors/delete_non-existent_certificate 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:410 record not found [0.019ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE `ssl_certificates`.`id` = 99999 ORDER BY `ssl_certificates`.`id` LIMIT 1 === RUN TestCertificateService_DeleteCertificate_Errors/delete_certificate_in_use_returns_ErrCertInUse === RUN TestCertificateService_DeleteCertificate_Errors/delete_certificate_when_file_already_removed 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service_test.go:513 record not found [0.021ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE id = 2 ORDER BY `ssl_certificates`.`id` LIMIT 1 --- PASS: TestCertificateService_DeleteCertificate_Errors (0.07s) --- PASS: TestCertificateService_DeleteCertificate_Errors/delete_non-existent_certificate (0.00s) --- PASS: TestCertificateService_DeleteCertificate_Errors/delete_certificate_in_use_returns_ErrCertInUse (0.04s) --- PASS: TestCertificateService_DeleteCertificate_Errors/delete_certificate_when_file_already_removed (0.03s) === RUN TestCertificateService_StagingCertificates === RUN TestCertificateService_StagingCertificates/staging_certificate_detected_by_path time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StagingCertificatesstaging_certificate_d3028211653/001/certificates 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found [0.183ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "staging.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.318ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1 === RUN TestCertificateService_StagingCertificates/production_cert_preferred_over_staging time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StagingCertificatesproduction_cert_prefe589373168/001/certificates 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found [0.135ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "both.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.251ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1 === RUN TestCertificateService_StagingCertificates/upgrade_from_staging_to_production time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StagingCertificatesupgrade_from_staging_992636313/001/certificates 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found [0.130ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "upgrade.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.270ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1 time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StagingCertificatesupgrade_from_staging_992636313/001/certificates 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.006ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1 --- PASS: TestCertificateService_StagingCertificates (0.21s) --- PASS: TestCertificateService_StagingCertificates/staging_certificate_detected_by_path (0.13s) --- PASS: TestCertificateService_StagingCertificates/production_cert_preferred_over_staging (0.03s) --- PASS: TestCertificateService_StagingCertificates/upgrade_from_staging_to_production (0.05s) === RUN TestCertificateService_ExpiringStatus === RUN TestCertificateService_ExpiringStatus/certificate_expiring_within_30_days time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ExpiringStatuscertificate_expiring_withi2043074678/001/certificates 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found [0.115ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "expiring.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.289ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1 === RUN TestCertificateService_ExpiringStatus/certificate_valid_for_more_than_30_days time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ExpiringStatuscertificate_valid_for_more411978940/001/certificates 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found [0.142ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "valid-long.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.319ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1 === RUN TestCertificateService_ExpiringStatus/staging_cert_always_untrusted_even_if_expiring time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ExpiringStatusstaging_cert_always_untrus1680907044/001/certificates 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found [0.163ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "staging-expiring.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.344ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1 --- PASS: TestCertificateService_ExpiringStatus (0.24s) --- PASS: TestCertificateService_ExpiringStatus/certificate_expiring_within_30_days (0.05s) --- PASS: TestCertificateService_ExpiringStatus/certificate_valid_for_more_than_30_days (0.09s) --- PASS: TestCertificateService_ExpiringStatus/staging_cert_always_untrusted_even_if_expiring (0.10s) === RUN TestCertificateService_StaleCertCleanup === RUN TestCertificateService_StaleCertCleanup/stale_DB_entries_removed_when_file_deleted time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StaleCertCleanupstale_DB_entries_removed416459177/001/certificates 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found [0.121ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "stale.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.282ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1 time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StaleCertCleanupstale_DB_entries_removed416459177/001/certificates time="2025-12-12T19:01:46Z" level=info msg="CertificateService: removed stale DB cert" domain=stale.example.com 2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.009ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=0 --- PASS: TestCertificateService_StaleCertCleanup (0.14s) --- PASS: TestCertificateService_StaleCertCleanup/stale_DB_entries_removed_when_file_deleted (0.14s) === RUN TestCertificateService_CertificateWithSANs === RUN TestCertificateService_CertificateWithSANs/certificate_with_SANs_uses_joined_domains --- PASS: TestCertificateService_CertificateWithSANs (0.17s) --- PASS: TestCertificateService_CertificateWithSANs/certificate_with_SANs_uses_joined_domains (0.17s) === RUN TestCertificateService_IsCertificateInUse === RUN TestCertificateService_IsCertificateInUse/certificate_not_in_use === RUN TestCertificateService_IsCertificateInUse/certificate_used_by_one_proxy_host === RUN TestCertificateService_IsCertificateInUse/certificate_used_by_multiple_proxy_hosts === RUN TestCertificateService_IsCertificateInUse/non-existent_certificate === RUN TestCertificateService_IsCertificateInUse/certificate_freed_after_proxy_host_deletion --- PASS: TestCertificateService_IsCertificateInUse (0.18s) --- PASS: TestCertificateService_IsCertificateInUse/certificate_not_in_use (0.02s) --- PASS: TestCertificateService_IsCertificateInUse/certificate_used_by_one_proxy_host (0.03s) --- PASS: TestCertificateService_IsCertificateInUse/certificate_used_by_multiple_proxy_hosts (0.01s) --- PASS: TestCertificateService_IsCertificateInUse/non-existent_certificate (0.00s) --- PASS: TestCertificateService_IsCertificateInUse/certificate_freed_after_proxy_host_deletion (0.11s) === RUN TestCertificateService_CacheBehavior === RUN TestCertificateService_CacheBehavior/cache_returns_consistent_results time="2025-12-12T19:01:47Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_CacheBehaviorcache_returns_consistent_re689688188/001/certificates time="2025-12-12T19:01:47Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_CacheBehaviorcache_returns_consistent_re689688188/001/certificates 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.256ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:47Z" level=info msg="CertificateService: disk sync complete" count=1 === RUN TestCertificateService_CacheBehavior/invalidate_cache_forces_resync time="2025-12-12T19:01:47Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_CacheBehaviorinvalidate_cache_forces_res1008682794/001/certificates time="2025-12-12T19:01:47Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_CacheBehaviorinvalidate_cache_forces_res1008682794/001/certificates 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.796ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:47Z" level=info msg="CertificateService: disk sync complete" count=1 time="2025-12-12T19:01:47Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_CacheBehaviorinvalidate_cache_forces_res1008682794/001/certificates time="2025-12-12T19:01:47Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_CacheBehaviorinvalidate_cache_forces_res1008682794/001/certificates 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.010ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:47Z" level=info msg="CertificateService: disk sync complete" count=2 === RUN TestCertificateService_CacheBehavior/refreshCacheFromDB_used_when_directory_nonexistent time="2025-12-12T19:01:47Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_CacheBehaviorrefreshCacheFromDB_used_whe2455254220/001/nonexistent/certificates time="2025-12-12T19:01:47Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_CacheBehaviorrefreshCacheFromDB_used_whe2455254220/001/nonexistent/certificates 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts [0.260ms] [rows:0] SELECT * FROM `proxy_hosts` time="2025-12-12T19:01:47Z" level=info msg="CertificateService: disk sync complete" count=1 --- PASS: TestCertificateService_CacheBehavior (0.08s) --- PASS: TestCertificateService_CacheBehavior/cache_returns_consistent_results (0.03s) --- PASS: TestCertificateService_CacheBehavior/invalidate_cache_forces_resync (0.05s) --- PASS: TestCertificateService_CacheBehavior/refreshCacheFromDB_used_when_directory_nonexistent (0.00s) === RUN TestDockerService_New --- PASS: TestDockerService_New (0.00s) === RUN TestDockerService_ListContainers --- PASS: TestDockerService_ListContainers (0.00s) === RUN TestNewGeoIPService_InvalidPath --- PASS: TestNewGeoIPService_InvalidPath (0.00s) === RUN TestGeoIPService_NotLoaded --- PASS: TestGeoIPService_NotLoaded (0.00s) === RUN TestGeoIPService_InvalidIP --- PASS: TestGeoIPService_InvalidIP (0.00s) === RUN TestGeoIPService_LookupCountry_CountryNotFound --- PASS: TestGeoIPService_LookupCountry_CountryNotFound (0.00s) === RUN TestGeoIPService_LookupCountry_Success --- PASS: TestGeoIPService_LookupCountry_Success (0.00s) === RUN TestGeoIPService_LookupCountry_ReaderError --- PASS: TestGeoIPService_LookupCountry_ReaderError (0.00s) === RUN TestGeoIPService_Close --- PASS: TestGeoIPService_Close (0.00s) === RUN TestGeoIPService_GetDatabasePath --- PASS: TestGeoIPService_GetDatabasePath (0.00s) === RUN TestGeoIPService_ConcurrentAccess --- PASS: TestGeoIPService_ConcurrentAccess (0.00s) === RUN TestGeoIPService_Integration geoip_service_test.go:134: GeoIP database not found, skipping integration test --- SKIP: TestGeoIPService_Integration (0.00s) === RUN TestGeoIPService_ErrorTypes --- PASS: TestGeoIPService_ErrorTypes (0.00s) === RUN TestLogService --- PASS: TestLogService (0.00s) === RUN TestMailService_SaveAndGetSMTPConfig --- PASS: TestMailService_SaveAndGetSMTPConfig (0.00s) === RUN TestMailService_UpdateSMTPConfig --- PASS: TestMailService_UpdateSMTPConfig (0.00s) === RUN TestMailService_IsConfigured === RUN TestMailService_IsConfigured/configured_with_all_fields === RUN TestMailService_IsConfigured/not_configured_-_missing_host === RUN TestMailService_IsConfigured/not_configured_-_missing_from_address --- PASS: TestMailService_IsConfigured (0.00s) --- PASS: TestMailService_IsConfigured/configured_with_all_fields (0.00s) --- PASS: TestMailService_IsConfigured/not_configured_-_missing_host (0.00s) --- PASS: TestMailService_IsConfigured/not_configured_-_missing_from_address (0.00s) === RUN TestMailService_GetSMTPConfig_Defaults --- PASS: TestMailService_GetSMTPConfig_Defaults (0.00s) === RUN TestMailService_BuildEmail --- PASS: TestMailService_BuildEmail (0.00s) === RUN TestMailService_HeaderInjectionPrevention === RUN TestMailService_HeaderInjectionPrevention/subject_with_CRLF_injection_attempt === RUN TestMailService_HeaderInjectionPrevention/subject_with_LF_injection_attempt === RUN TestMailService_HeaderInjectionPrevention/subject_with_null_byte --- PASS: TestMailService_HeaderInjectionPrevention (0.00s) --- PASS: TestMailService_HeaderInjectionPrevention/subject_with_CRLF_injection_attempt (0.00s) --- PASS: TestMailService_HeaderInjectionPrevention/subject_with_LF_injection_attempt (0.00s) --- PASS: TestMailService_HeaderInjectionPrevention/subject_with_null_byte (0.00s) === RUN TestSanitizeEmailHeader === RUN TestSanitizeEmailHeader/clean_string === RUN TestSanitizeEmailHeader/CR_removal === RUN TestSanitizeEmailHeader/LF_removal === RUN TestSanitizeEmailHeader/CRLF_removal === RUN TestSanitizeEmailHeader/null_byte_removal === RUN TestSanitizeEmailHeader/tab_removal === RUN TestSanitizeEmailHeader/multiple_control_chars === RUN TestSanitizeEmailHeader/empty_string --- PASS: TestSanitizeEmailHeader (0.00s) --- PASS: TestSanitizeEmailHeader/clean_string (0.00s) --- PASS: TestSanitizeEmailHeader/CR_removal (0.00s) --- PASS: TestSanitizeEmailHeader/LF_removal (0.00s) --- PASS: TestSanitizeEmailHeader/CRLF_removal (0.00s) --- PASS: TestSanitizeEmailHeader/null_byte_removal (0.00s) --- PASS: TestSanitizeEmailHeader/tab_removal (0.00s) --- PASS: TestSanitizeEmailHeader/multiple_control_chars (0.00s) --- PASS: TestSanitizeEmailHeader/empty_string (0.00s) === RUN TestValidateEmailAddress === RUN TestValidateEmailAddress/valid_email === RUN TestValidateEmailAddress/valid_email_with_name === RUN TestValidateEmailAddress/empty_email === RUN TestValidateEmailAddress/invalid_format === RUN TestValidateEmailAddress/missing_domain === RUN TestValidateEmailAddress/injection_attempt --- PASS: TestValidateEmailAddress (0.00s) --- PASS: TestValidateEmailAddress/valid_email (0.00s) --- PASS: TestValidateEmailAddress/valid_email_with_name (0.00s) --- PASS: TestValidateEmailAddress/empty_email (0.00s) --- PASS: TestValidateEmailAddress/invalid_format (0.00s) --- PASS: TestValidateEmailAddress/missing_domain (0.00s) --- PASS: TestValidateEmailAddress/injection_attempt (0.00s) === RUN TestMailService_TestConnection_NotConfigured --- PASS: TestMailService_TestConnection_NotConfigured (0.00s) === RUN TestMailService_SendEmail_NotConfigured --- PASS: TestMailService_SendEmail_NotConfigured (0.00s) === RUN TestSMTPConfigSerialization --- PASS: TestSMTPConfigSerialization (0.00s) === RUN TestMailService_SendInvite_Template time="2025-12-12T19:01:47Z" level=info msg="Sending invite email" email=test@example.com --- PASS: TestMailService_SendInvite_Template (0.00s) === RUN TestMailService_Integration mail_service_test.go:383: Integration test requires SMTP server --- SKIP: TestMailService_Integration (0.00s) === RUN TestMailService_SendInvite_TokenFormat time="2025-12-12T19:01:47Z" level=info msg="Sending invite email" email=test@example.com time="2025-12-12T19:01:47Z" level=info msg="Sending invite email" email=test@example.com --- PASS: TestMailService_SendInvite_TokenFormat (0.01s) === RUN TestMailService_SaveSMTPConfig_Concurrent mail_service_test.go:412: In-memory SQLite doesn't support concurrent writes - test real DB in integration --- SKIP: TestMailService_SaveSMTPConfig_Concurrent (0.00s) === RUN TestMailService_SendEmail_InvalidRecipient --- PASS: TestMailService_SendEmail_InvalidRecipient (0.00s) === RUN TestMailService_SendEmail_InvalidFromAddress --- PASS: TestMailService_SendEmail_InvalidFromAddress (0.00s) === RUN TestMailService_SendEmail_EncryptionModes === RUN TestMailService_SendEmail_EncryptionModes/ssl === RUN TestMailService_SendEmail_EncryptionModes/starttls === RUN TestMailService_SendEmail_EncryptionModes/none === RUN TestMailService_SendEmail_EncryptionModes/empty --- PASS: TestMailService_SendEmail_EncryptionModes (0.01s) --- PASS: TestMailService_SendEmail_EncryptionModes/ssl (0.00s) --- PASS: TestMailService_SendEmail_EncryptionModes/starttls (0.00s) --- PASS: TestMailService_SendEmail_EncryptionModes/none (0.00s) --- PASS: TestMailService_SendEmail_EncryptionModes/empty (0.00s) === RUN TestNotificationService_TemplateCRUD === PAUSE TestNotificationService_TemplateCRUD === RUN TestNotificationService_Create --- PASS: TestNotificationService_Create (0.00s) === RUN TestNotificationService_List --- PASS: TestNotificationService_List (0.00s) === RUN TestNotificationService_MarkAsRead --- PASS: TestNotificationService_MarkAsRead (0.00s) === RUN TestNotificationService_MarkAllAsRead --- PASS: TestNotificationService_MarkAllAsRead (0.00s) === RUN TestNotificationService_Providers --- PASS: TestNotificationService_Providers (0.00s) === RUN TestNotificationService_TestProvider_Webhook --- PASS: TestNotificationService_TestProvider_Webhook (0.00s) === RUN TestNotificationService_SendExternal --- PASS: TestNotificationService_SendExternal (0.00s) === RUN TestNotificationService_SendExternal_MinimalVsDetailedTemplates --- PASS: TestNotificationService_SendExternal_MinimalVsDetailedTemplates (0.00s) === RUN TestNotificationService_SendExternal_Filtered --- PASS: TestNotificationService_SendExternal_Filtered (0.10s) === RUN TestNotificationService_SendExternal_Shoutrrr --- PASS: TestNotificationService_SendExternal_Shoutrrr (0.10s) === RUN TestNormalizeURL === RUN TestNormalizeURL/Discord_HTTPS === RUN TestNormalizeURL/Discord_HTTPS_with_app === RUN TestNormalizeURL/Discord_Shoutrrr === RUN TestNormalizeURL/Other_Service --- PASS: TestNormalizeURL (0.00s) --- PASS: TestNormalizeURL/Discord_HTTPS (0.00s) --- PASS: TestNormalizeURL/Discord_HTTPS_with_app (0.00s) --- PASS: TestNormalizeURL/Discord_Shoutrrr (0.00s) --- PASS: TestNormalizeURL/Other_Service (0.00s) === RUN TestNotificationService_SendCustomWebhook_Errors === RUN TestNotificationService_SendCustomWebhook_Errors/invalid_URL === RUN TestNotificationService_SendCustomWebhook_Errors/unreachable_host === RUN TestNotificationService_SendCustomWebhook_Errors/server_returns_error === RUN TestNotificationService_SendCustomWebhook_Errors/valid_custom_payload_template === RUN TestNotificationService_SendCustomWebhook_Errors/default_payload_without_template --- PASS: TestNotificationService_SendCustomWebhook_Errors (0.00s) --- PASS: TestNotificationService_SendCustomWebhook_Errors/invalid_URL (0.00s) --- PASS: TestNotificationService_SendCustomWebhook_Errors/unreachable_host (0.00s) --- PASS: TestNotificationService_SendCustomWebhook_Errors/server_returns_error (0.00s) --- PASS: TestNotificationService_SendCustomWebhook_Errors/valid_custom_payload_template (0.00s) --- PASS: TestNotificationService_SendCustomWebhook_Errors/default_payload_without_template (0.00s) === RUN TestNotificationService_SendCustomWebhook_PropagatesRequestID --- PASS: TestNotificationService_SendCustomWebhook_PropagatesRequestID (0.00s) === RUN TestNotificationService_TestProvider_Errors === RUN TestNotificationService_TestProvider_Errors/unsupported_provider_type === RUN TestNotificationService_TestProvider_Errors/webhook_with_invalid_URL === RUN TestNotificationService_TestProvider_Errors/discord_with_invalid_URL_format === RUN TestNotificationService_TestProvider_Errors/slack_with_unreachable_webhook === RUN TestNotificationService_TestProvider_Errors/webhook_success --- PASS: TestNotificationService_TestProvider_Errors (0.00s) --- PASS: TestNotificationService_TestProvider_Errors/unsupported_provider_type (0.00s) --- PASS: TestNotificationService_TestProvider_Errors/webhook_with_invalid_URL (0.00s) --- PASS: TestNotificationService_TestProvider_Errors/discord_with_invalid_URL_format (0.00s) --- PASS: TestNotificationService_TestProvider_Errors/slack_with_unreachable_webhook (0.00s) --- PASS: TestNotificationService_TestProvider_Errors/webhook_success (0.00s) === RUN TestValidateWebhookURL_PrivateIP --- PASS: TestValidateWebhookURL_PrivateIP (0.00s) === RUN TestNotificationService_SendExternal_EdgeCases === RUN TestNotificationService_SendExternal_EdgeCases/no_enabled_providers time="2025-12-12T19:01:47Z" level=error msg="Failed to send notification" error="failed to send discord notification: response status code 400 Bad Request" provider="Test Discord" === RUN TestNotificationService_SendExternal_EdgeCases/provider_filtered_by_category === RUN TestNotificationService_SendExternal_EdgeCases/custom_data_passed_to_webhook --- PASS: TestNotificationService_SendExternal_EdgeCases (0.21s) --- PASS: TestNotificationService_SendExternal_EdgeCases/no_enabled_providers (0.05s) --- PASS: TestNotificationService_SendExternal_EdgeCases/provider_filtered_by_category (0.05s) --- PASS: TestNotificationService_SendExternal_EdgeCases/custom_data_passed_to_webhook (0.10s) === RUN TestNotificationService_RenderTemplate --- PASS: TestNotificationService_RenderTemplate (0.00s) === RUN TestNotificationService_CreateProvider_Validation === RUN TestNotificationService_CreateProvider_Validation/creates_provider_with_defaults === RUN TestNotificationService_CreateProvider_Validation/updates_existing_provider === RUN TestNotificationService_CreateProvider_Validation/deletes_non-existent_provider --- PASS: TestNotificationService_CreateProvider_Validation (0.00s) --- PASS: TestNotificationService_CreateProvider_Validation/creates_provider_with_defaults (0.00s) --- PASS: TestNotificationService_CreateProvider_Validation/updates_existing_provider (0.00s) --- PASS: TestNotificationService_CreateProvider_Validation/deletes_non-existent_provider (0.00s) === RUN TestNotificationService_IsPrivateIP === RUN TestNotificationService_IsPrivateIP/loopback_ipv4 === RUN TestNotificationService_IsPrivateIP/loopback_ipv6 === RUN TestNotificationService_IsPrivateIP/private_10.x === RUN TestNotificationService_IsPrivateIP/private_10.x_high === RUN TestNotificationService_IsPrivateIP/private_172.16-31 === RUN TestNotificationService_IsPrivateIP/private_172.31 === RUN TestNotificationService_IsPrivateIP/private_192.168 === RUN TestNotificationService_IsPrivateIP/public_172.32 === RUN TestNotificationService_IsPrivateIP/public_172.15 === RUN TestNotificationService_IsPrivateIP/public_ip === RUN TestNotificationService_IsPrivateIP/public_ipv6 === RUN TestNotificationService_IsPrivateIP/link_local_ipv4 === RUN TestNotificationService_IsPrivateIP/link_local_ipv6 === RUN TestNotificationService_IsPrivateIP/unique_local_ipv6_fc === RUN TestNotificationService_IsPrivateIP/unique_local_ipv6_fc_high === RUN TestNotificationService_IsPrivateIP/unique_local_ipv6_fd --- PASS: TestNotificationService_IsPrivateIP (0.00s) --- PASS: TestNotificationService_IsPrivateIP/loopback_ipv4 (0.00s) --- PASS: TestNotificationService_IsPrivateIP/loopback_ipv6 (0.00s) --- PASS: TestNotificationService_IsPrivateIP/private_10.x (0.00s) --- PASS: TestNotificationService_IsPrivateIP/private_10.x_high (0.00s) --- PASS: TestNotificationService_IsPrivateIP/private_172.16-31 (0.00s) --- PASS: TestNotificationService_IsPrivateIP/private_172.31 (0.00s) --- PASS: TestNotificationService_IsPrivateIP/private_192.168 (0.00s) --- PASS: TestNotificationService_IsPrivateIP/public_172.32 (0.00s) --- PASS: TestNotificationService_IsPrivateIP/public_172.15 (0.00s) --- PASS: TestNotificationService_IsPrivateIP/public_ip (0.00s) --- PASS: TestNotificationService_IsPrivateIP/public_ipv6 (0.00s) --- PASS: TestNotificationService_IsPrivateIP/link_local_ipv4 (0.00s) --- PASS: TestNotificationService_IsPrivateIP/link_local_ipv6 (0.00s) --- PASS: TestNotificationService_IsPrivateIP/unique_local_ipv6_fc (0.00s) --- PASS: TestNotificationService_IsPrivateIP/unique_local_ipv6_fc_high (0.00s) --- PASS: TestNotificationService_IsPrivateIP/unique_local_ipv6_fd (0.00s) === RUN TestNotificationService_CreateProvider_InvalidCustomTemplate === RUN TestNotificationService_CreateProvider_InvalidCustomTemplate/invalid_custom_template_on_create === RUN TestNotificationService_CreateProvider_InvalidCustomTemplate/invalid_custom_template_on_update --- PASS: TestNotificationService_CreateProvider_InvalidCustomTemplate (0.00s) --- PASS: TestNotificationService_CreateProvider_InvalidCustomTemplate/invalid_custom_template_on_create (0.00s) --- PASS: TestNotificationService_CreateProvider_InvalidCustomTemplate/invalid_custom_template_on_update (0.00s) === RUN TestProxyHostService_ValidateUniqueDomain === RUN TestProxyHostService_ValidateUniqueDomain/New_unique_domain === RUN TestProxyHostService_ValidateUniqueDomain/Duplicate_domain === RUN TestProxyHostService_ValidateUniqueDomain/Same_domain_but_excluded_ID_(update_self) --- PASS: TestProxyHostService_ValidateUniqueDomain (0.00s) --- PASS: TestProxyHostService_ValidateUniqueDomain/New_unique_domain (0.00s) --- PASS: TestProxyHostService_ValidateUniqueDomain/Duplicate_domain (0.00s) --- PASS: TestProxyHostService_ValidateUniqueDomain/Same_domain_but_excluded_ID_(update_self) (0.00s) === RUN TestProxyHostService_CRUD 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/proxyhost_service.go:103 record not found [0.041ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE `proxy_hosts`.`id` = 1 ORDER BY `proxy_hosts`.`id` LIMIT 1 --- PASS: TestProxyHostService_CRUD (0.00s) === RUN TestProxyHostService_TestConnection --- PASS: TestProxyHostService_TestConnection (0.00s) === RUN TestProxyHostService_AdvancedConfig === RUN TestProxyHostService_AdvancedConfig/Empty_advanced_config === RUN TestProxyHostService_AdvancedConfig/Valid_JSON_object === RUN TestProxyHostService_AdvancedConfig/Valid_JSON_array === RUN TestProxyHostService_AdvancedConfig/Invalid_JSON === RUN TestProxyHostService_AdvancedConfig/Valid_nested_config --- PASS: TestProxyHostService_AdvancedConfig (0.00s) --- PASS: TestProxyHostService_AdvancedConfig/Empty_advanced_config (0.00s) --- PASS: TestProxyHostService_AdvancedConfig/Valid_JSON_object (0.00s) --- PASS: TestProxyHostService_AdvancedConfig/Valid_JSON_array (0.00s) --- PASS: TestProxyHostService_AdvancedConfig/Invalid_JSON (0.00s) --- PASS: TestProxyHostService_AdvancedConfig/Valid_nested_config (0.00s) === RUN TestProxyHostService_UpdateAdvancedConfig --- PASS: TestProxyHostService_UpdateAdvancedConfig (0.00s) === RUN TestProxyHostService_EmptyDomain --- PASS: TestProxyHostService_EmptyDomain (0.00s) === RUN TestRemoteServerService_ValidateUniqueServer --- PASS: TestRemoteServerService_ValidateUniqueServer (0.00s) === RUN TestRemoteServerService_CRUD 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/remoteserver_service.go:68 record not found [0.015ms] [rows:0] SELECT * FROM `remote_servers` WHERE `remote_servers`.`id` = 2 ORDER BY `remote_servers`.`id` LIMIT 1 --- PASS: TestRemoteServerService_CRUD (0.00s) === RUN TestNewSecurityNotificationService --- PASS: TestNewSecurityNotificationService (0.00s) === RUN TestSecurityNotificationService_GetSettings_Default 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:29 record not found [0.024ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestSecurityNotificationService_GetSettings_Default (0.00s) === RUN TestSecurityNotificationService_UpdateSettings 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found [0.022ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestSecurityNotificationService_UpdateSettings (0.00s) === RUN TestSecurityNotificationService_UpdateSettings_Existing 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found [0.023ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestSecurityNotificationService_UpdateSettings_Existing (0.00s) === RUN TestSecurityNotificationService_Send_Disabled 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:29 record not found [0.016ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestSecurityNotificationService_Send_Disabled (0.00s) === RUN TestSecurityNotificationService_Send_FilteredByEventType 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found [0.018ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestSecurityNotificationService_Send_FilteredByEventType (0.00s) === RUN TestSecurityNotificationService_Send_FilteredBySeverity 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found [0.027ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestSecurityNotificationService_Send_FilteredBySeverity (0.00s) === RUN TestSecurityNotificationService_Send_WebhookSuccess 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found [0.044ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestSecurityNotificationService_Send_WebhookSuccess (0.00s) === RUN TestSecurityNotificationService_Send_WebhookFailure 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found [0.040ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 time="2025-12-12T19:01:47Z" level=error msg="Failed to send webhook notification" error="webhook returned status 500" --- PASS: TestSecurityNotificationService_Send_WebhookFailure (0.00s) === RUN TestShouldNotify === RUN TestShouldNotify/error_>=_error === RUN TestShouldNotify/warn_<_error === RUN TestShouldNotify/error_>=_warn === RUN TestShouldNotify/info_>=_info === RUN TestShouldNotify/debug_<_info === RUN TestShouldNotify/error_>=_debug --- PASS: TestShouldNotify (0.00s) --- PASS: TestShouldNotify/error_>=_error (0.00s) --- PASS: TestShouldNotify/warn_<_error (0.00s) --- PASS: TestShouldNotify/error_>=_warn (0.00s) --- PASS: TestShouldNotify/info_>=_info (0.00s) --- PASS: TestShouldNotify/debug_<_info (0.00s) --- PASS: TestShouldNotify/error_>=_debug (0.00s) === RUN TestSecurityNotificationService_Send_ACLDeny 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found [0.041ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 --- PASS: TestSecurityNotificationService_Send_ACLDeny (0.00s) === RUN TestSecurityNotificationService_Send_ContextTimeout 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found [0.039ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1 time="2025-12-12T19:01:47Z" level=error msg="Failed to send webhook notification" error="execute request: Post \"http://127.0.0.1:41425\": context deadline exceeded" --- PASS: TestSecurityNotificationService_Send_ContextTimeout (0.10s) === RUN TestSecurityService_Upsert_ValidateAdminWhitelist 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.036ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityService_Upsert_ValidateAdminWhitelist (0.00s) === RUN TestSecurityService_BreakGlassTokenLifecycle 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.033ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityService_BreakGlassTokenLifecycle (0.18s) === RUN TestSecurityService_LogDecisionAndList --- PASS: TestSecurityService_LogDecisionAndList (0.00s) === RUN TestSecurityService_UpsertRuleSet 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_service.go:212 record not found [0.027ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "owasp-crs" ORDER BY `security_rule_sets`.`id` LIMIT 1 --- PASS: TestSecurityService_UpsertRuleSet (0.00s) === RUN TestSecurityService_UpsertRuleSet_ContentTooLarge --- PASS: TestSecurityService_UpsertRuleSet_ContentTooLarge (0.01s) === RUN TestSecurityService_DeleteRuleSet 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_service.go:212 record not found [0.034ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "owasp-crs" ORDER BY `security_rule_sets`.`id` LIMIT 1 --- PASS: TestSecurityService_DeleteRuleSet (0.00s) === RUN TestSecurityService_Upsert_RejectExternalMode 2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.048ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityService_Upsert_RejectExternalMode (0.00s) === RUN TestSecurityService_GenerateBreakGlassToken_NewConfig 2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:121 record not found [0.175ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "newconfig" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityService_GenerateBreakGlassToken_NewConfig (0.13s) === RUN TestSecurityService_GenerateBreakGlassToken_UpdateExisting 2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.039ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityService_GenerateBreakGlassToken_UpdateExisting (0.24s) === RUN TestSecurityService_VerifyBreakGlassToken_NoConfig 2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:142 record not found [0.048ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "nonexistent" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityService_VerifyBreakGlassToken_NoConfig (0.00s) === RUN TestSecurityService_VerifyBreakGlassToken_NoHash 2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.042ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityService_VerifyBreakGlassToken_NoHash (0.00s) === RUN TestSecurityService_VerifyBreakGlassToken_WrongToken 2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:121 record not found [0.161ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityService_VerifyBreakGlassToken_WrongToken (0.36s) === RUN TestSecurityService_Get_NotFound 2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:37 record not found [0.035ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityService_Get_NotFound (0.00s) === RUN TestSecurityService_Upsert_PreserveBreakGlassHash 2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:121 record not found [0.141ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityService_Upsert_PreserveBreakGlassHash (0.12s) === RUN TestSecurityService_Upsert_RateLimitFieldsPersist 2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.035ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityService_Upsert_RateLimitFieldsPersist (0.00s) === RUN TestSecurityService_LogAudit --- PASS: TestSecurityService_LogAudit (0.00s) === RUN TestSecurityService_DeleteRuleSet_NotFound 2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:234 record not found [0.027ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE `security_rule_sets`.`id` = 9999 ORDER BY `security_rule_sets`.`id` LIMIT 1 --- PASS: TestSecurityService_DeleteRuleSet_NotFound (0.00s) === RUN TestSecurityService_ListDecisions_UnlimitedAndLimited --- PASS: TestSecurityService_ListDecisions_UnlimitedAndLimited (0.00s) === RUN TestSecurityService_LogDecision_Nil --- PASS: TestSecurityService_LogDecision_Nil (0.00s) === RUN TestSecurityService_LogDecision_PrefilledUUID --- PASS: TestSecurityService_LogDecision_PrefilledUUID (0.00s) === RUN TestSecurityService_ListRuleSets_Empty --- PASS: TestSecurityService_ListRuleSets_Empty (0.00s) === RUN TestSecurityService_Upsert_InvalidCrowdSecMode 2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:73 record not found [0.047ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1 --- PASS: TestSecurityService_Upsert_InvalidCrowdSecMode (0.00s) === RUN TestUpdateService_CheckForUpdates --- PASS: TestUpdateService_CheckForUpdates (0.00s) === RUN TestUptimeService_sendRecoveryNotification === PAUSE TestUptimeService_sendRecoveryNotification === RUN TestUptimeService_CheckAll 2025/12/12 19:01:48 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.061ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:48 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.063ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "127.0.0.1" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:48Z" level=info msg="Created UptimeHost" host=127.0.0.1 host_id=74fe6813-2845-487e-b7be-5115a6a04ade 2025/12/12 19:01:48 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.056ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 2 ORDER BY `uptime_monitors`.`id` LIMIT 1 time="2025-12-12T19:01:49Z" level=info msg="Host status changed" host_ip=127.0.0.1 host_name="127.0.0.1:34511" message="dial tcp 127.0.0.1:34097: connect: connection refused" new=down old=up time="2025-12-12T19:01:49Z" level=info msg="Sent consolidated DOWN notification" host_name="127.0.0.1:34511" service_count=1 --- PASS: TestUptimeService_CheckAll (1.74s) === RUN TestUptimeService_ListMonitors --- PASS: TestUptimeService_ListMonitors (0.01s) === RUN TestUptimeService_GetMonitorByID === RUN TestUptimeService_GetMonitorByID/get_existing_monitor === RUN TestUptimeService_GetMonitorByID/get_non-existent_monitor 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:869 record not found [0.029ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "non-existent" ORDER BY `uptime_monitors`.`id` LIMIT 1 --- PASS: TestUptimeService_GetMonitorByID (0.01s) --- PASS: TestUptimeService_GetMonitorByID/get_existing_monitor (0.00s) --- PASS: TestUptimeService_GetMonitorByID/get_non-existent_monitor (0.00s) === RUN TestUptimeService_GetMonitorHistory --- PASS: TestUptimeService_GetMonitorHistory (0.01s) === RUN TestUptimeService_SyncMonitors_Errors === RUN TestUptimeService_SyncMonitors_Errors/database_error_during_proxy_host_fetch 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:105 sql: database is closed [0.015ms] [rows:0] SELECT * FROM `proxy_hosts` === RUN TestUptimeService_SyncMonitors_Errors/creates_monitors_for_new_hosts 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.050ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.027ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=26cd5331-60ed-4ee6-9de6-0d715d027535 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.051ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 2 ORDER BY `uptime_monitors`.`id` LIMIT 1 === RUN TestUptimeService_SyncMonitors_Errors/orphaned_monitors_persist_after_host_deletion 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.041ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.023ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=c1b153d4-c37f-4d0f-9529-386f5687e14d --- PASS: TestUptimeService_SyncMonitors_Errors (0.03s) --- PASS: TestUptimeService_SyncMonitors_Errors/database_error_during_proxy_host_fetch (0.01s) --- PASS: TestUptimeService_SyncMonitors_Errors/creates_monitors_for_new_hosts (0.01s) --- PASS: TestUptimeService_SyncMonitors_Errors/orphaned_monitors_persist_after_host_deletion (0.01s) === RUN TestUptimeService_SyncMonitors_NameSync === RUN TestUptimeService_SyncMonitors_NameSync/syncs_name_from_proxy_host_when_changed 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.054ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.041ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=7564348b-8a58-497e-ac17-0a4ffa73c0da === RUN TestUptimeService_SyncMonitors_NameSync/uses_domain_name_when_proxy_host_name_is_empty 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.032ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.023ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=3c7ef273-e0b7-436b-bd6d-805a8faa99f3 === RUN TestUptimeService_SyncMonitors_NameSync/updates_monitor_name_when_host_name_becomes_empty 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.058ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.039ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=4748c52b-b02f-4cf7-a0b2-a64c174f2b4a --- PASS: TestUptimeService_SyncMonitors_NameSync (0.03s) --- PASS: TestUptimeService_SyncMonitors_NameSync/syncs_name_from_proxy_host_when_changed (0.01s) --- PASS: TestUptimeService_SyncMonitors_NameSync/uses_domain_name_when_proxy_host_name_is_empty (0.01s) --- PASS: TestUptimeService_SyncMonitors_NameSync/updates_monitor_name_when_host_name_becomes_empty (0.01s) === RUN TestUptimeService_SyncMonitors_TCPMigration === RUN TestUptimeService_SyncMonitors_TCPMigration/migrates_TCP_monitor_to_HTTP_for_public_URL 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.034ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "backend.local" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=backend.local host_id=152ae32f-d0e3-49e2-8696-1a2bf56dd256 time="2025-12-12T19:01:50Z" level=info msg="Migrated monitor for host 1 to check public URL: http://public.com" host_id=1 === RUN TestUptimeService_SyncMonitors_TCPMigration/does_not_migrate_TCP_monitor_with_custom_URL 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.030ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "backend.local" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=backend.local host_id=3b1e92b7-7a16-48dd-9dbb-554ce01f8826 --- PASS: TestUptimeService_SyncMonitors_TCPMigration (0.02s) --- PASS: TestUptimeService_SyncMonitors_TCPMigration/migrates_TCP_monitor_to_HTTP_for_public_URL (0.01s) --- PASS: TestUptimeService_SyncMonitors_TCPMigration/does_not_migrate_TCP_monitor_with_custom_URL (0.01s) === RUN TestUptimeService_SyncMonitors_HTTPSUpgrade === RUN TestUptimeService_SyncMonitors_HTTPSUpgrade/upgrades_HTTP_to_HTTPS_when_SSL_forced 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.021ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=17b65706-637c-4d22-9380-9908579c49d3 time="2025-12-12T19:01:50Z" level=info msg="Upgraded monitor for host 1 to HTTPS: https://secure.com" host_id=1 === RUN TestUptimeService_SyncMonitors_HTTPSUpgrade/does_not_downgrade_HTTPS_when_SSL_not_forced 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.021ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=fef11b5c-cdc7-4e30-9fec-78189c6431f6 --- PASS: TestUptimeService_SyncMonitors_HTTPSUpgrade (0.02s) --- PASS: TestUptimeService_SyncMonitors_HTTPSUpgrade/upgrades_HTTP_to_HTTPS_when_SSL_forced (0.01s) --- PASS: TestUptimeService_SyncMonitors_HTTPSUpgrade/does_not_downgrade_HTTPS_when_SSL_not_forced (0.01s) === RUN TestUptimeService_SyncMonitors_RemoteServers === RUN TestUptimeService_SyncMonitors_RemoteServers/creates_monitor_for_new_remote_server 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:210 record not found [0.059ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.043ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "backend.local" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=backend.local host_id=74908064-6ad0-4532-9711-93a7848947bc === RUN TestUptimeService_SyncMonitors_RemoteServers/creates_TCP_monitor_for_remote_server_without_scheme 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:210 record not found [0.038ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.022ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "tcp.backend" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=tcp.backend host_id=593e3c1e-c6a8-4d4a-86e1-c197048a59b3 === RUN TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_name_changes 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:210 record not found [0.044ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.022ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "server.local" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=server.local host_id=d1c46790-6ec2-4dee-a3d5-966fe241d615 === RUN TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_URL_changes 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:210 record not found [0.105ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.034ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "old.host" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=old.host host_id=9b0ac32c-6646-4a47-ba74-7608e35ef25b === RUN TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_enabled_status 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:210 record not found [0.049ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.047ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "server.local" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=server.local host_id=9d5ab0eb-fd75-488b-af31-c45ca72b72cf === RUN TestUptimeService_SyncMonitors_RemoteServers/syncs_scheme_change_from_TCP_to_HTTPS 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:210 record not found [0.042ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.026ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "server.local" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=server.local host_id=812922d2-8e38-4997-8df2-deb0220a535f --- PASS: TestUptimeService_SyncMonitors_RemoteServers (0.07s) --- PASS: TestUptimeService_SyncMonitors_RemoteServers/creates_monitor_for_new_remote_server (0.01s) --- PASS: TestUptimeService_SyncMonitors_RemoteServers/creates_TCP_monitor_for_remote_server_without_scheme (0.02s) --- PASS: TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_name_changes (0.01s) --- PASS: TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_URL_changes (0.01s) --- PASS: TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_enabled_status (0.01s) --- PASS: TestUptimeService_SyncMonitors_RemoteServers/syncs_scheme_change_from_TCP_to_HTTPS (0.01s) === RUN TestUptimeService_CheckAll_Errors === RUN TestUptimeService_CheckAll_Errors/handles_empty_monitor_list === RUN TestUptimeService_CheckAll_Errors/orphan_monitors_don't_prevent_check_execution === RUN TestUptimeService_CheckAll_Errors/handles_timeout_for_slow_hosts 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.067ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.035ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "192.0.2.1" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=192.0.2.1 host_id=b3a78269-2e94-4ebd-a939-260f1b342854 --- PASS: TestUptimeService_CheckAll_Errors (7.19s) --- PASS: TestUptimeService_CheckAll_Errors/handles_empty_monitor_list (0.06s) --- PASS: TestUptimeService_CheckAll_Errors/orphan_monitors_don't_prevent_check_execution (0.11s) --- PASS: TestUptimeService_CheckAll_Errors/handles_timeout_for_slow_hosts (7.02s) === RUN TestUptimeService_CheckMonitor_EdgeCases === RUN TestUptimeService_CheckMonitor_EdgeCases/invalid_URL_format === RUN TestUptimeService_CheckMonitor_EdgeCases/http_404_response_treated_as_down 2025/12/12 19:01:58 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.059ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:01:58 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.074ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "127.0.0.1" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:01:58Z" level=info msg="Created UptimeHost" host=127.0.0.1 host_id=b1a034b5-115f-45cf-bd08-eecc88f5786e === RUN TestUptimeService_CheckMonitor_EdgeCases/https_URL_without_valid_certificate --- PASS: TestUptimeService_CheckMonitor_EdgeCases (3.89s) --- PASS: TestUptimeService_CheckMonitor_EdgeCases/invalid_URL_format (0.51s) --- PASS: TestUptimeService_CheckMonitor_EdgeCases/http_404_response_treated_as_down (0.37s) --- PASS: TestUptimeService_CheckMonitor_EdgeCases/https_URL_without_valid_certificate (3.01s) === RUN TestUptimeService_GetMonitorHistory_EdgeCases === RUN TestUptimeService_GetMonitorHistory_EdgeCases/non-existent_monitor === RUN TestUptimeService_GetMonitorHistory_EdgeCases/limit_parameter_respected --- PASS: TestUptimeService_GetMonitorHistory_EdgeCases (0.05s) --- PASS: TestUptimeService_GetMonitorHistory_EdgeCases/non-existent_monitor (0.02s) --- PASS: TestUptimeService_GetMonitorHistory_EdgeCases/limit_parameter_respected (0.02s) === RUN TestUptimeService_ListMonitors_EdgeCases === RUN TestUptimeService_ListMonitors_EdgeCases/empty_database === RUN TestUptimeService_ListMonitors_EdgeCases/monitors_with_associated_proxy_hosts --- PASS: TestUptimeService_ListMonitors_EdgeCases (0.04s) --- PASS: TestUptimeService_ListMonitors_EdgeCases/empty_database (0.02s) --- PASS: TestUptimeService_ListMonitors_EdgeCases/monitors_with_associated_proxy_hosts (0.02s) === RUN TestUptimeService_UpdateMonitor === RUN TestUptimeService_UpdateMonitor/update_max_retries === RUN TestUptimeService_UpdateMonitor/update_interval === RUN TestUptimeService_UpdateMonitor/update_non-existent_monitor 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:883 record not found [0.063ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "non-existent" ORDER BY `uptime_monitors`.`id` LIMIT 1 === RUN TestUptimeService_UpdateMonitor/update_multiple_fields --- PASS: TestUptimeService_UpdateMonitor (0.10s) --- PASS: TestUptimeService_UpdateMonitor/update_max_retries (0.02s) --- PASS: TestUptimeService_UpdateMonitor/update_interval (0.03s) --- PASS: TestUptimeService_UpdateMonitor/update_non-existent_monitor (0.02s) --- PASS: TestUptimeService_UpdateMonitor/update_multiple_fields (0.03s) === RUN TestUptimeService_NotificationBatching === RUN TestUptimeService_NotificationBatching/batches_multiple_service_failures_on_same_host time="2025-12-12T19:02:02Z" level=info msg="Created pending notification batch" host="Test Server" monitor="Service A" time="2025-12-12T19:02:02Z" level=info msg="Added to pending notification batch" count=2 host="Test Server" monitor="Service B" time="2025-12-12T19:02:02Z" level=info msg="Added to pending notification batch" count=3 host="Test Server" monitor="Service C" time="2025-12-12T19:02:02Z" level=info msg="Sent batched DOWN notification" count=3 host="Test Server" === RUN TestUptimeService_NotificationBatching/single_service_down_gets_individual_notification time="2025-12-12T19:02:02Z" level=info msg="Created pending notification batch" host="Single Service Host" monitor="Lonely Service" time="2025-12-12T19:02:02Z" level=info msg="Sent batched DOWN notification" count=1 host="Single Service Host" --- PASS: TestUptimeService_NotificationBatching (0.07s) --- PASS: TestUptimeService_NotificationBatching/batches_multiple_service_failures_on_same_host (0.05s) --- PASS: TestUptimeService_NotificationBatching/single_service_down_gets_individual_notification (0.03s) === RUN TestUptimeService_HostLevelCheck === RUN TestUptimeService_HostLevelCheck/creates_uptime_host_during_sync 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.057ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.027ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "10.0.0.50" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:02:02Z" level=info msg="Created UptimeHost" host=10.0.0.50 host_id=c0ba9030-593f-4b3d-8af1-628f6aa9bc10 === RUN TestUptimeService_HostLevelCheck/groups_multiple_services_on_same_host 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.051ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.029ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "10.0.0.100" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:02:02Z" level=info msg="Created UptimeHost" host=10.0.0.100 host_id=8d650e75-5645-4b65-8384-741dae225532 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.049ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 2 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.051ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 3 ORDER BY `uptime_monitors`.`id` LIMIT 1 --- PASS: TestUptimeService_HostLevelCheck (0.07s) --- PASS: TestUptimeService_HostLevelCheck/creates_uptime_host_during_sync (0.04s) --- PASS: TestUptimeService_HostLevelCheck/groups_multiple_services_on_same_host (0.03s) === RUN TestFormatDuration --- PASS: TestFormatDuration (0.00s) === RUN TestUptimeService_SyncMonitorForHost === RUN TestUptimeService_SyncMonitorForHost/updates_monitor_when_proxy_host_is_edited 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.046ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.038ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "10.0.0.1" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:02:02Z" level=info msg="Created UptimeHost" host=10.0.0.1 host_id=5d4ca013-a842-4931-a222-4c3100bcac14 === RUN TestUptimeService_SyncMonitorForHost/returns_nil_when_no_monitor_exists 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:828 record not found [0.063ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 === RUN TestUptimeService_SyncMonitorForHost/returns_error_when_host_does_not_exist 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:823 record not found [0.049ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE `proxy_hosts`.`id` = 99999 ORDER BY `proxy_hosts`.`id` LIMIT 1 === RUN TestUptimeService_SyncMonitorForHost/uses_domain_name_when_proxy_host_name_is_empty 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.065ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.036ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "10.0.0.4" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:02:02Z" level=info msg="Created UptimeHost" host=10.0.0.4 host_id=a4fdc308-4a6f-49d5-8594-cd0d876ce24a === RUN TestUptimeService_SyncMonitorForHost/handles_multiple_domains_correctly 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found [0.085ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found [0.056ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "10.0.0.5" ORDER BY `uptime_hosts`.`id` LIMIT 1 time="2025-12-12T19:02:02Z" level=info msg="Created UptimeHost" host=10.0.0.5 host_id=d8947473-5cde-4eff-8bc0-307e1f41065a --- PASS: TestUptimeService_SyncMonitorForHost (0.09s) --- PASS: TestUptimeService_SyncMonitorForHost/updates_monitor_when_proxy_host_is_edited (0.02s) --- PASS: TestUptimeService_SyncMonitorForHost/returns_nil_when_no_monitor_exists (0.02s) --- PASS: TestUptimeService_SyncMonitorForHost/returns_error_when_host_does_not_exist (0.02s) --- PASS: TestUptimeService_SyncMonitorForHost/uses_domain_name_when_proxy_host_name_is_empty (0.02s) --- PASS: TestUptimeService_SyncMonitorForHost/handles_multiple_domains_correctly (0.02s) === RUN TestExtractPort === RUN TestExtractPort/http_url_default === RUN TestExtractPort/https_url_default === RUN TestExtractPort/http_with_port === RUN TestExtractPort/https_with_port === RUN TestExtractPort/host:port === RUN TestExtractPort/plain_host === RUN TestExtractPort/localhost_with_port === RUN TestExtractPort/ip_with_port === RUN TestExtractPort/ipv6_with_port --- PASS: TestExtractPort (0.00s) --- PASS: TestExtractPort/http_url_default (0.00s) --- PASS: TestExtractPort/https_url_default (0.00s) --- PASS: TestExtractPort/http_with_port (0.00s) --- PASS: TestExtractPort/https_with_port (0.00s) --- PASS: TestExtractPort/host:port (0.00s) --- PASS: TestExtractPort/plain_host (0.00s) --- PASS: TestExtractPort/localhost_with_port (0.00s) --- PASS: TestExtractPort/ip_with_port (0.00s) --- PASS: TestExtractPort/ipv6_with_port (0.00s) === RUN TestUpdateMonitorEnabled_Unit --- PASS: TestUpdateMonitorEnabled_Unit (0.00s) === RUN TestDeleteMonitorDeletesHeartbeats_Unit 2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service_unit_test.go:77 record not found [0.036ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "886f58b0-813d-4754-b0d5-e98b33b00415" ORDER BY `uptime_monitors`.`id` LIMIT 1 --- PASS: TestDeleteMonitorDeletesHeartbeats_Unit (0.00s) === RUN TestCheckMonitor_PublicAPI --- PASS: TestCheckMonitor_PublicAPI (7.87s) === RUN TestCheckMonitor_InvalidURL --- PASS: TestCheckMonitor_InvalidURL (0.00s) === RUN TestCheckMonitor_TCPSuccess --- PASS: TestCheckMonitor_TCPSuccess (0.01s) === RUN TestCheckMonitor_TCPFailure --- PASS: TestCheckMonitor_TCPFailure (10.00s) === RUN TestCheckMonitor_UnknownType --- PASS: TestCheckMonitor_UnknownType (0.00s) === RUN TestDeleteMonitor_NonExistent 2025/12/12 19:02:20 /projects/Charon/backend/internal/services/uptime_service.go:911 record not found [0.023ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "non-existent-id" ORDER BY `uptime_monitors`.`id` LIMIT 1 --- PASS: TestDeleteMonitor_NonExistent (0.00s) === RUN TestUpdateMonitor_NonExistent 2025/12/12 19:02:20 /projects/Charon/backend/internal/services/uptime_service.go:883 record not found [0.761ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "non-existent-id" ORDER BY `uptime_monitors`.`id` LIMIT 1 --- PASS: TestUpdateMonitor_NonExistent (0.00s) === CONT TestBackupService_GetAvailableSpace === CONT TestUptimeService_sendRecoveryNotification === RUN TestBackupService_GetAvailableSpace/returns_space_for_existing_directory === PAUSE TestBackupService_GetAvailableSpace/returns_space_for_existing_directory === RUN TestBackupService_GetAvailableSpace/errors_for_missing_directory === PAUSE TestBackupService_GetAvailableSpace/errors_for_missing_directory === CONT TestBackupService_GetAvailableSpace/returns_space_for_existing_directory === CONT TestNotificationService_TemplateCRUD === CONT TestBackupService_GetAvailableSpace/errors_for_missing_directory --- PASS: TestBackupService_GetAvailableSpace (0.00s) --- PASS: TestBackupService_GetAvailableSpace/returns_space_for_existing_directory (0.00s) --- PASS: TestBackupService_GetAvailableSpace/errors_for_missing_directory (0.00s) --- PASS: TestUptimeService_sendRecoveryNotification (0.00s) --- PASS: TestNotificationService_TemplateCRUD (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/services (cached) ? github.com/Wikid82/charon/backend/internal/trace [no test files] === RUN TestSanitizeForLog === RUN TestSanitizeForLog/empty_string === RUN TestSanitizeForLog/clean_string === RUN TestSanitizeForLog/string_with_newline === RUN TestSanitizeForLog/string_with_carriage_return_and_newline === RUN TestSanitizeForLog/string_with_multiple_newlines === RUN TestSanitizeForLog/string_with_control_characters === RUN TestSanitizeForLog/string_with_DEL_character_(0x7F) === RUN TestSanitizeForLog/complex_string_with_mixed_control_chars === RUN TestSanitizeForLog/string_with_tabs_(0x09_is_control_char) === RUN TestSanitizeForLog/string_with_only_control_chars --- PASS: TestSanitizeForLog (0.00s) --- PASS: TestSanitizeForLog/empty_string (0.00s) --- PASS: TestSanitizeForLog/clean_string (0.00s) --- PASS: TestSanitizeForLog/string_with_newline (0.00s) --- PASS: TestSanitizeForLog/string_with_carriage_return_and_newline (0.00s) --- PASS: TestSanitizeForLog/string_with_multiple_newlines (0.00s) --- PASS: TestSanitizeForLog/string_with_control_characters (0.00s) --- PASS: TestSanitizeForLog/string_with_DEL_character_(0x7F) (0.00s) --- PASS: TestSanitizeForLog/complex_string_with_mixed_control_chars (0.00s) --- PASS: TestSanitizeForLog/string_with_tabs_(0x09_is_control_char) (0.00s) --- PASS: TestSanitizeForLog/string_with_only_control_chars (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/util (cached) === RUN TestFull --- PASS: TestFull (0.00s) PASS ok github.com/Wikid82/charon/backend/internal/version (cached) FAIL