>>> anubis: Building testing/anubis 1.20.0-r1 (using abuild 3.15.0-r2) started Thu, 10 Jul 2025 15:47:18 +0000 >>> anubis: Validating /home/buildozer/aports/testing/anubis/APKBUILD... >>> anubis: Analyzing dependencies... >>> anubis: Installing for build: build-base go (1/2) Installing go (1.24.5-r1) (2/2) Installing .makedepends-anubis (20250710.154720) busybox-1.37.0-r19.trigger: Executing script... OK: 588 MiB in 110 packages >>> anubis: Cleaning up srcdir >>> anubis: Cleaning up pkgdir >>> anubis: Cleaning up tmpdir >>> anubis: Fetching https://distfiles.alpinelinux.org/distfiles/edge/anubis-src-vendor-npm-1.20.0.tar.gz Connecting to distfiles.alpinelinux.org (172.105.82.32:443) saving to '/var/cache/distfiles/edge/anubis-src-vendor-npm-1.20.0.tar.gz.part' anubis-src-vendor-np 30% |********* | 3647k 0:00:02 ETA anubis-src-vendor-np 100% |********************************| 11.7M 0:00:00 ETA '/var/cache/distfiles/edge/anubis-src-vendor-npm-1.20.0.tar.gz.part' saved >>> anubis: Fetching https://distfiles.alpinelinux.org/distfiles/edge/anubis-src-vendor-npm-1.20.0.tar.gz >>> anubis: Checking sha512sums... anubis-src-vendor-npm-1.20.0.tar.gz: OK anubis.initd: OK anubis.confd: OK >>> anubis: Unpacking /var/cache/distfiles/edge/anubis-src-vendor-npm-1.20.0.tar.gz... ? github.com/TecharoHQ/anubis [no test files] ? github.com/TecharoHQ/anubis/cmd/anubis [no test files] ? github.com/TecharoHQ/anubis/cmd/containerbuild [no test files] === RUN TestDataFileConversion === RUN TestDataFileConversion/simple_default === RUN TestDataFileConversion/simple_json === RUN TestDataFileConversion/simple_deny_action === RUN TestDataFileConversion/simple_custom_name === RUN TestDataFileConversion/blacklist_with_crawl_delay === RUN TestDataFileConversion/wildcards === RUN TestDataFileConversion/empty_file === RUN TestDataFileConversion/complex_scenario --- PASS: TestDataFileConversion (0.00s) --- PASS: TestDataFileConversion/simple_default (0.00s) --- PASS: TestDataFileConversion/simple_json (0.00s) --- PASS: TestDataFileConversion/simple_deny_action (0.00s) --- PASS: TestDataFileConversion/simple_custom_name (0.00s) --- PASS: TestDataFileConversion/blacklist_with_crawl_delay (0.00s) --- PASS: TestDataFileConversion/wildcards (0.00s) --- PASS: TestDataFileConversion/empty_file (0.00s) --- PASS: TestDataFileConversion/complex_scenario (0.00s) === RUN TestCaseInsensitiveParsing --- PASS: TestCaseInsensitiveParsing (0.00s) === RUN TestVariousOutputFormats --- PASS: TestVariousOutputFormats (0.00s) === RUN TestDifferentActions === RUN TestDifferentActions/action_ALLOW === RUN TestDifferentActions/action_DENY === RUN TestDifferentActions/action_CHALLENGE === RUN TestDifferentActions/action_WEIGH --- PASS: TestDifferentActions (0.00s) --- PASS: TestDifferentActions/action_ALLOW (0.00s) --- PASS: TestDifferentActions/action_DENY (0.00s) --- PASS: TestDifferentActions/action_CHALLENGE (0.00s) --- PASS: TestDifferentActions/action_WEIGH (0.00s) === RUN TestPolicyNaming === RUN TestPolicyNaming/name_custom-policy === RUN TestPolicyNaming/name_my-rules === RUN TestPolicyNaming/name_site-protection --- PASS: TestPolicyNaming (0.00s) --- PASS: TestPolicyNaming/name_custom-policy (0.00s) --- PASS: TestPolicyNaming/name_my-rules (0.00s) --- PASS: TestPolicyNaming/name_site-protection (0.00s) === RUN TestCrawlDelayWeights === RUN TestCrawlDelayWeights/weight_1 === RUN TestCrawlDelayWeights/weight_5 === RUN TestCrawlDelayWeights/weight_10 === RUN TestCrawlDelayWeights/weight_25 --- PASS: TestCrawlDelayWeights (0.00s) --- PASS: TestCrawlDelayWeights/weight_1 (0.00s) --- PASS: TestCrawlDelayWeights/weight_5 (0.00s) --- PASS: TestCrawlDelayWeights/weight_10 (0.00s) --- PASS: TestCrawlDelayWeights/weight_25 (0.00s) === RUN TestBlacklistActions === RUN TestBlacklistActions/blacklist_DENY === RUN TestBlacklistActions/blacklist_CHALLENGE --- PASS: TestBlacklistActions (0.00s) --- PASS: TestBlacklistActions/blacklist_DENY (0.00s) --- PASS: TestBlacklistActions/blacklist_CHALLENGE (0.00s) PASS ok github.com/TecharoHQ/anubis/cmd/robots2policy 0.013s ? github.com/TecharoHQ/anubis/cmd/robots2policy/batch [no test files] ? github.com/TecharoHQ/anubis/data [no test files] === RUN TestImpl --- PASS: TestImpl (0.00s) === RUN TestCleanup --- PASS: TestCleanup (0.00s) PASS ok github.com/TecharoHQ/anubis/decaymap 0.005s === RUN TestHashCollisions hash_bench_test.go:176: Basic test: 22 realistic inputs, no collisions hash_bench_test.go:199: Stress test 1: 22400 similar string variations, no collisions hash_bench_test.go:224: Stress test 2: 70000 sequential patterns, no collisions hash_bench_test.go:227: TOTAL: Tested 92422 inputs across realistic scenarios - NO COLLISIONS --- PASS: TestHashCollisions (0.05s) === RUN TestXXHashFormat hash_bench_test.go:259: Input: "short" -> Hash: a4dbb3294161a9a4 hash_bench_test.go:259: Input: "" -> Hash: ef46db3751d8e999 hash_bench_test.go:259: Input: "very long string with lots of content that might be used in policy checking and other internal hashing scenarios" -> Hash: 66442c9447f2401b hash_bench_test.go:259: Input: "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" -> Hash: 853008ee50e116bf --- PASS: TestXXHashFormat (0.00s) === RUN TestErrorLogFilter --- PASS: TestErrorLogFilter (0.00s) === RUN TestXForwardedForUpdateIgnoreUnix --- PASS: TestXForwardedForUpdateIgnoreUnix (0.00s) === RUN TestXForwardedForUpdateAddToChain --- PASS: TestXForwardedForUpdateAddToChain (0.00s) === RUN TestComputeXFFHeader === RUN TestComputeXFFHeader/StripPrivate === RUN TestComputeXFFHeader/StripPrivate#01 === RUN TestComputeXFFHeader/StripLoopback === RUN TestComputeXFFHeader/StripCGNAT === RUN TestComputeXFFHeader/StripLinkLocalUnicastIPv4 === RUN TestComputeXFFHeader/StripLinkLocalUnicastIPv6 === RUN TestComputeXFFHeader/Flatten === RUN TestComputeXFFHeader/TrimSpaces === RUN TestComputeXFFHeader/invalid-ip-port === RUN TestComputeXFFHeader/invalid-remote-ip === RUN TestComputeXFFHeader/no-xff-dont-panic --- PASS: TestComputeXFFHeader (0.00s) --- PASS: TestComputeXFFHeader/StripPrivate (0.00s) --- PASS: TestComputeXFFHeader/StripPrivate#01 (0.00s) --- PASS: TestComputeXFFHeader/StripLoopback (0.00s) --- PASS: TestComputeXFFHeader/StripCGNAT (0.00s) --- PASS: TestComputeXFFHeader/StripLinkLocalUnicastIPv4 (0.00s) --- PASS: TestComputeXFFHeader/StripLinkLocalUnicastIPv6 (0.00s) --- PASS: TestComputeXFFHeader/Flatten (0.00s) --- PASS: TestComputeXFFHeader/TrimSpaces (0.00s) --- PASS: TestComputeXFFHeader/invalid-ip-port (0.00s) --- PASS: TestComputeXFFHeader/invalid-remote-ip (0.00s) --- PASS: TestComputeXFFHeader/no-xff-dont-panic (0.00s) PASS ok github.com/TecharoHQ/anubis/internal 0.063s === RUN TestReverse4 === RUN TestReverse4/1.2.3.4->4.3.2.1 --- PASS: TestReverse4 (0.00s) --- PASS: TestReverse4/1.2.3.4->4.3.2.1 (0.00s) === RUN TestReverse6 === RUN TestReverse6/1234:5678:9ABC:DEF0:1234:5678:9ABC:DEF0->0.f.e.d.c.b.a.9.8.7.6.5.4.3.2.1.0.f.e.d.c.b.a.9.8.7.6.5.4.3.2.1 --- PASS: TestReverse6 (0.00s) --- PASS: TestReverse6/1234:5678:9ABC:DEF0:1234:5678:9ABC:DEF0->0.f.e.d.c.b.a.9.8.7.6.5.4.3.2.1.0.f.e.d.c.b.a.9.8.7.6.5.4.3.2.1 (0.00s) === RUN TestLookup dnsbl_test.go:60: response: 0 --- PASS: TestLookup (0.10s) PASS ok github.com/TecharoHQ/anubis/internal/dnsbl 0.113s === RUN TestCacheReturnsDefault === RUN TestCacheReturnsDefault/og:title === RUN TestCacheReturnsDefault/og:description --- PASS: TestCacheReturnsDefault (0.00s) --- PASS: TestCacheReturnsDefault/og:title (0.00s) --- PASS: TestCacheReturnsDefault/og:description (0.00s) === RUN TestCheckCache --- PASS: TestCheckCache (0.00s) === RUN TestGetOGTags --- PASS: TestGetOGTags (0.00s) === RUN TestGetOGTagsWithHostConsideration === RUN TestGetOGTagsWithHostConsideration/Host_Not_Considered_-_Same_Host === RUN TestGetOGTagsWithHostConsideration/Host_Not_Considered_-_Different_Host === RUN TestGetOGTagsWithHostConsideration/Host_Considered_-_Same_Host === RUN TestGetOGTagsWithHostConsideration/Host_Considered_-_Different_Host --- PASS: TestGetOGTagsWithHostConsideration (0.00s) --- PASS: TestGetOGTagsWithHostConsideration/Host_Not_Considered_-_Same_Host (0.00s) --- PASS: TestGetOGTagsWithHostConsideration/Host_Not_Considered_-_Different_Host (0.00s) --- PASS: TestGetOGTagsWithHostConsideration/Host_Considered_-_Same_Host (0.00s) --- PASS: TestGetOGTagsWithHostConsideration/Host_Considered_-_Different_Host (0.00s) === RUN TestFetchHTMLDocument === RUN TestFetchHTMLDocument/Valid_HTML === RUN TestFetchHTMLDocument/Empty_HTML === RUN TestFetchHTMLDocument/Not_found_error === RUN TestFetchHTMLDocument/Unsupported_Content-Type === RUN TestFetchHTMLDocument/Too_large_content --- PASS: TestFetchHTMLDocument (0.00s) --- PASS: TestFetchHTMLDocument/Valid_HTML (0.00s) --- PASS: TestFetchHTMLDocument/Empty_HTML (0.00s) --- PASS: TestFetchHTMLDocument/Not_found_error (0.00s) --- PASS: TestFetchHTMLDocument/Unsupported_Content-Type (0.00s) --- PASS: TestFetchHTMLDocument/Too_large_content (0.00s) === RUN TestFetchHTMLDocumentInvalidURL --- PASS: TestFetchHTMLDocumentInvalidURL (0.00s) === RUN TestIntegrationGetOGTags === RUN TestIntegrationGetOGTags/Simple_page === RUN TestIntegrationGetOGTags/Complete_page === RUN TestIntegrationGetOGTags/Page_with_no_OG_tags === RUN TestIntegrationGetOGTags/Nonexistent_page --- PASS: TestIntegrationGetOGTags (0.00s) --- PASS: TestIntegrationGetOGTags/Simple_page (0.00s) --- PASS: TestIntegrationGetOGTags/Complete_page (0.00s) --- PASS: TestIntegrationGetOGTags/Page_with_no_OG_tags (0.00s) --- PASS: TestIntegrationGetOGTags/Nonexistent_page (0.00s) === RUN TestMemoryUsage mem_test.go:111: Memory allocated for 10k getTarget calls: mem_test.go:112: Total: 630.56 KB (0.62 MB) mem_test.go:113: Per operation: 64.57 bytes mem_test.go:142: Memory allocated for 1k extractOGTags calls: mem_test.go:143: Total: 333.64 KB (0.33 MB) mem_test.go:144: Per operation: 341.65 bytes --- PASS: TestMemoryUsage (0.00s) === RUN TestNewOGTagCache === RUN TestNewOGTagCache/Basic_initialization === RUN TestNewOGTagCache/Empty_target --- PASS: TestNewOGTagCache (0.00s) --- PASS: TestNewOGTagCache/Basic_initialization (0.00s) --- PASS: TestNewOGTagCache/Empty_target (0.00s) === RUN TestNewOGTagCache_UnixSocket --- PASS: TestNewOGTagCache_UnixSocket (0.00s) === RUN TestGetTarget === RUN TestGetTarget/No_path_or_query === RUN TestGetTarget/With_complex_path === RUN TestGetTarget/With_query_and_path === RUN TestGetTarget/Unix_socket_target === RUN TestGetTarget/Unix_socket_target_with_/// --- PASS: TestGetTarget (0.00s) --- PASS: TestGetTarget/No_path_or_query (0.00s) --- PASS: TestGetTarget/With_complex_path (0.00s) --- PASS: TestGetTarget/With_query_and_path (0.00s) --- PASS: TestGetTarget/Unix_socket_target (0.00s) --- PASS: TestGetTarget/Unix_socket_target_with_/// (0.00s) === RUN TestIntegrationGetOGTags_UnixSocket --- PASS: TestIntegrationGetOGTags_UnixSocket (0.10s) === RUN TestExtractOGTags === RUN TestExtractOGTags/Basic_OG_tags === RUN TestExtractOGTags/OG_tags_with_name_attribute === RUN TestExtractOGTags/No_approved_OG_tags === RUN TestExtractOGTags/Empty_content === RUN TestExtractOGTags/Explicitly_approved_tag --- PASS: TestExtractOGTags (0.00s) --- PASS: TestExtractOGTags/Basic_OG_tags (0.00s) --- PASS: TestExtractOGTags/OG_tags_with_name_attribute (0.00s) --- PASS: TestExtractOGTags/No_approved_OG_tags (0.00s) --- PASS: TestExtractOGTags/Empty_content (0.00s) --- PASS: TestExtractOGTags/Explicitly_approved_tag (0.00s) === RUN TestIsOGMetaTag === RUN TestIsOGMetaTag/Meta_OG_tag === RUN TestIsOGMetaTag/Regular_meta_tag === RUN TestIsOGMetaTag/Not_a_meta_tag --- PASS: TestIsOGMetaTag (0.00s) --- PASS: TestIsOGMetaTag/Meta_OG_tag (0.00s) --- PASS: TestIsOGMetaTag/Regular_meta_tag (0.00s) --- PASS: TestIsOGMetaTag/Not_a_meta_tag (0.00s) === RUN TestExtractMetaTagInfo === RUN TestExtractMetaTagInfo/OG_title_with_property_(approved_by_prefix) === RUN TestExtractMetaTagInfo/OG_description_with_name_(approved_by_prefix) === RUN TestExtractMetaTagInfo/Regular_meta_tag_(name=description,_approved_by_exact_match) === RUN TestExtractMetaTagInfo/Regular_meta_tag_(name=keywords,_not_approved) === RUN TestExtractMetaTagInfo/Twitter_tag_(not_approved_by_default) === RUN TestExtractMetaTagInfo/No_content_(but_approved_property) === RUN TestExtractMetaTagInfo/No_property/name_attribute === RUN TestExtractMetaTagInfo/Explicitly_approved_tag_with_property_attribute --- PASS: TestExtractMetaTagInfo (0.00s) --- PASS: TestExtractMetaTagInfo/OG_title_with_property_(approved_by_prefix) (0.00s) --- PASS: TestExtractMetaTagInfo/OG_description_with_name_(approved_by_prefix) (0.00s) --- PASS: TestExtractMetaTagInfo/Regular_meta_tag_(name=description,_approved_by_exact_match) (0.00s) --- PASS: TestExtractMetaTagInfo/Regular_meta_tag_(name=keywords,_not_approved) (0.00s) --- PASS: TestExtractMetaTagInfo/Twitter_tag_(not_approved_by_default) (0.00s) --- PASS: TestExtractMetaTagInfo/No_content_(but_approved_property) (0.00s) --- PASS: TestExtractMetaTagInfo/No_property/name_attribute (0.00s) --- PASS: TestExtractMetaTagInfo/Explicitly_approved_tag_with_property_attribute (0.00s) === RUN FuzzGetTarget === RUN FuzzGetTarget/seed#0 === RUN FuzzGetTarget/seed#1 === RUN FuzzGetTarget/seed#2 === RUN FuzzGetTarget/seed#3 === RUN FuzzGetTarget/seed#4 === RUN FuzzGetTarget/seed#5 === RUN FuzzGetTarget/seed#6 === RUN FuzzGetTarget/seed#7 === RUN FuzzGetTarget/seed#8 === RUN FuzzGetTarget/seed#9 === RUN FuzzGetTarget/seed#10 === RUN FuzzGetTarget/seed#11 === RUN FuzzGetTarget/seed#12 === RUN FuzzGetTarget/seed#13 === RUN FuzzGetTarget/seed#14 --- PASS: FuzzGetTarget (0.00s) --- PASS: FuzzGetTarget/seed#0 (0.00s) --- PASS: FuzzGetTarget/seed#1 (0.00s) --- PASS: FuzzGetTarget/seed#2 (0.00s) --- PASS: FuzzGetTarget/seed#3 (0.00s) --- PASS: FuzzGetTarget/seed#4 (0.00s) --- PASS: FuzzGetTarget/seed#5 (0.00s) --- PASS: FuzzGetTarget/seed#6 (0.00s) --- PASS: FuzzGetTarget/seed#7 (0.00s) --- PASS: FuzzGetTarget/seed#8 (0.00s) --- PASS: FuzzGetTarget/seed#9 (0.00s) --- PASS: FuzzGetTarget/seed#10 (0.00s) --- PASS: FuzzGetTarget/seed#11 (0.00s) --- PASS: FuzzGetTarget/seed#12 (0.00s) --- PASS: FuzzGetTarget/seed#13 (0.00s) --- PASS: FuzzGetTarget/seed#14 (0.00s) === RUN FuzzExtractOGTags === RUN FuzzExtractOGTags/seed#0 === RUN FuzzExtractOGTags/seed#1 === RUN FuzzExtractOGTags/seed#2 === RUN FuzzExtractOGTags/seed#3 === RUN FuzzExtractOGTags/seed#4 === RUN FuzzExtractOGTags/seed#5 === RUN FuzzExtractOGTags/seed#6 === RUN FuzzExtractOGTags/seed#7 === RUN FuzzExtractOGTags/seed#8 === RUN FuzzExtractOGTags/seed#9 === RUN FuzzExtractOGTags/seed#10 === RUN FuzzExtractOGTags/seed#11 === RUN FuzzExtractOGTags/seed#12 === RUN FuzzExtractOGTags/seed#13 === RUN FuzzExtractOGTags/seed#14 === RUN FuzzExtractOGTags/seed#15 === RUN FuzzExtractOGTags/seed#16 === RUN FuzzExtractOGTags/seed#17 === RUN FuzzExtractOGTags/seed#18 === RUN FuzzExtractOGTags/seed#19 === RUN FuzzExtractOGTags/seed#20 === RUN FuzzExtractOGTags/seed#21 --- PASS: FuzzExtractOGTags (0.01s) --- PASS: FuzzExtractOGTags/seed#0 (0.00s) --- PASS: FuzzExtractOGTags/seed#1 (0.00s) --- PASS: FuzzExtractOGTags/seed#2 (0.00s) --- PASS: FuzzExtractOGTags/seed#3 (0.00s) --- PASS: FuzzExtractOGTags/seed#4 (0.00s) --- PASS: FuzzExtractOGTags/seed#5 (0.00s) --- PASS: FuzzExtractOGTags/seed#6 (0.00s) --- PASS: FuzzExtractOGTags/seed#7 (0.00s) --- PASS: FuzzExtractOGTags/seed#8 (0.00s) --- PASS: FuzzExtractOGTags/seed#9 (0.00s) --- PASS: FuzzExtractOGTags/seed#10 (0.00s) --- PASS: FuzzExtractOGTags/seed#11 (0.00s) --- PASS: FuzzExtractOGTags/seed#12 (0.01s) --- PASS: FuzzExtractOGTags/seed#13 (0.00s) --- PASS: FuzzExtractOGTags/seed#14 (0.00s) --- PASS: FuzzExtractOGTags/seed#15 (0.00s) --- PASS: FuzzExtractOGTags/seed#16 (0.00s) --- PASS: FuzzExtractOGTags/seed#17 (0.00s) --- PASS: FuzzExtractOGTags/seed#18 (0.00s) --- PASS: FuzzExtractOGTags/seed#19 (0.00s) --- PASS: FuzzExtractOGTags/seed#20 (0.00s) --- PASS: FuzzExtractOGTags/seed#21 (0.00s) === RUN FuzzGetTargetRoundTrip === RUN FuzzGetTargetRoundTrip/seed#0 === RUN FuzzGetTargetRoundTrip/seed#1 --- PASS: FuzzGetTargetRoundTrip (0.00s) --- PASS: FuzzGetTargetRoundTrip/seed#0 (0.00s) --- PASS: FuzzGetTargetRoundTrip/seed#1 (0.00s) === RUN FuzzExtractMetaTagInfo === RUN FuzzExtractMetaTagInfo/seed#0 === RUN FuzzExtractMetaTagInfo/seed#1 === RUN FuzzExtractMetaTagInfo/seed#2 === RUN FuzzExtractMetaTagInfo/seed#3 === RUN FuzzExtractMetaTagInfo/seed#4 === RUN FuzzExtractMetaTagInfo/seed#5 === RUN FuzzExtractMetaTagInfo/seed#6 --- PASS: FuzzExtractMetaTagInfo (0.00s) --- PASS: FuzzExtractMetaTagInfo/seed#0 (0.00s) --- PASS: FuzzExtractMetaTagInfo/seed#1 (0.00s) --- PASS: FuzzExtractMetaTagInfo/seed#2 (0.00s) --- PASS: FuzzExtractMetaTagInfo/seed#3 (0.00s) --- PASS: FuzzExtractMetaTagInfo/seed#4 (0.00s) --- PASS: FuzzExtractMetaTagInfo/seed#5 (0.00s) --- PASS: FuzzExtractMetaTagInfo/seed#6 (0.00s) PASS ok github.com/TecharoHQ/anubis/internal/ogtags 0.141s === RUN TestPlaywrightBrowser playwright_test.go:222: npx not found in PATH, skipping integration smoke testing: exec: "npx": executable file not found in $PATH --- SKIP: TestPlaywrightBrowser (0.00s) === RUN TestPlaywrightWithBasePrefix playwright_test.go:302: NOTE(Xe)\ these tests require HTTPS support in #364 --- SKIP: TestPlaywrightWithBasePrefix (0.00s) PASS ok github.com/TecharoHQ/anubis/internal/test 0.036s === RUN TestASNChecker asnchecker_test.go:16: using mock thoth === RUN TestASNChecker/{1.1.1.1_true_false} === RUN TestASNChecker/{2.2.2.2_false_false} === RUN TestASNChecker/{taco_false_false} 2025/07/10 15:47:29 ERROR error contacting thoth, please contact support err="ParseAddr(\"taco\"): unable to parse IP" actionable=true === RUN TestASNChecker/{127.0.0.1_false_false} --- PASS: TestASNChecker (0.00s) --- PASS: TestASNChecker/{1.1.1.1_true_false} (0.00s) --- PASS: TestASNChecker/{2.2.2.2_false_false} (0.00s) --- PASS: TestASNChecker/{taco_false_false} (0.00s) --- PASS: TestASNChecker/{127.0.0.1_false_false} (0.00s) === RUN TestGeoIPChecker geoipchecker_test.go:15: using mock thoth === RUN TestGeoIPChecker/{1.1.1.1_true_false} === RUN TestGeoIPChecker/{2.2.2.2_false_false} === RUN TestGeoIPChecker/{taco_false_false} 2025/07/10 15:47:29 ERROR error contacting thoth, please contact support err="ParseAddr(\"taco\"): unable to parse IP" actionable=true === RUN TestGeoIPChecker/{127.0.0.1_false_false} --- PASS: TestGeoIPChecker (0.00s) --- PASS: TestGeoIPChecker/{1.1.1.1_true_false} (0.00s) --- PASS: TestGeoIPChecker/{2.2.2.2_false_false} (0.00s) --- PASS: TestGeoIPChecker/{taco_false_false} (0.00s) --- PASS: TestGeoIPChecker/{127.0.0.1_false_false} (0.00s) === RUN TestNew thoth_test.go:31: using mock thoth --- PASS: TestNew (0.00s) PASS ok github.com/TecharoHQ/anubis/internal/thoth 0.028s ? github.com/TecharoHQ/anubis/internal/thoth/thothmock [no test files] === RUN TestLoadPolicies === RUN TestLoadPolicies/botPolicies.json === RUN TestLoadPolicies/botPolicies.yaml {"time":"2025-07-10T15:47:29.967046904Z","level":"WARN","source":{"function":"github.com/TecharoHQ/anubis/lib/policy.ParseConfig","file":"github.com/TecharoHQ/anubis/lib/policy/policy.go","line":130},"msg":"You have specified a Thoth specific check but you have no Thoth client configured. Please read https://anubis.techaro.lol/docs/admin/thoth for more information","check":"geoip","settings":{"countries":["BR","CN"]}} {"time":"2025-07-10T15:47:29.967103905Z","level":"WARN","source":{"function":"github.com/TecharoHQ/anubis/lib/policy.ParseConfig","file":"github.com/TecharoHQ/anubis/lib/policy/policy.go","line":121},"msg":"You have specified a Thoth specific check but you have no Thoth client configured. Please read https://anubis.techaro.lol/docs/admin/thoth for more information","check":"asn","settings":{"match":[13335,136907,45102]}} --- PASS: TestLoadPolicies (0.02s) --- PASS: TestLoadPolicies/botPolicies.json (0.01s) --- PASS: TestLoadPolicies/botPolicies.yaml (0.01s) === RUN TestCVE2025_24369 {"time":"2025-07-10T15:47:29.976403369Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} {"time":"2025-07-10T15:47:29.984136215Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).MakeChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":319},"msg":"made challenge","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"challenge":"5589e10bd2d48bdf","rules":{"algorithm":"fast","difficulty":4,"report_as":4},"cr":{"name":"default/allow","rule":"ALLOW","weight":0}} anubis_test.go:149: set cookie: http://127.0.0.1:38657/.within.website/x/cmd/anubis/api/make-challenge?redir=%2F -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=5589e10bd2d48bdf; Path=/; Expires=Thu, 10 Jul 2025 15:47:29 GMT; SameSite=Lax anubis_test.go:135: requested cookies for http://127.0.0.1:38657/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=0&redir=%2F&response=b5f6ceb5e84afa7f35b9a667f18680949f6344d2d0a20fe6d79c5fb65a75cd53 anubis_test.go:138: get cookie: <- techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=5589e10bd2d48bdf; Path=/; Expires=Thu, 10 Jul 2025 15:47:29 GMT; SameSite=Lax {"time":"2025-07-10T15:47:29.98451314Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).PassChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":383},"msg":"challenge validate call failed","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"err":"challenge: error when processing challenge: validate: challenge: user failed challenge: wanted 4 leading zeros but got b5f6ceb5e84afa7f35b9a667f18680949f6344d2d0a20fe6d79c5fb65a75cd53"} {"time":"2025-07-10T15:47:29.984673542Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).PassChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":413},"msg":"challenge passed, redirecting to app","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0}} {"time":"2025-07-10T15:47:29.984700382Z","level":"INFO","msg":"http: superfluous response.WriteHeader call from github.com/TecharoHQ/anubis/lib.(*Server).PassChallenge (anubis.go:414)"} anubis_test.go:149: set cookie: http://127.0.0.1:38657/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=0&redir=%2F&response=b5f6ceb5e84afa7f35b9a667f18680949f6344d2d0a20fe6d79c5fb65a75cd53 -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=; Path=/; Expires=Thu, 10 Jul 2025 15:46:29 GMT; Max-Age=0; SameSite=Lax anubis_test.go:149: set cookie: http://127.0.0.1:38657/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=0&redir=%2F&response=b5f6ceb5e84afa7f35b9a667f18680949f6344d2d0a20fe6d79c5fb65a75cd53 -> techaro.lol-anubis-auth=; Path=/; Expires=Thu, 10 Jul 2025 15:46:29 GMT; Max-Age=0; SameSite=Lax --- PASS: TestCVE2025_24369 (0.02s) === RUN TestCookieCustomExpiration {"time":"2025-07-10T15:47:29.993020875Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} {"time":"2025-07-10T15:47:29.993580281Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).MakeChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":319},"msg":"made challenge","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"challenge":"30621e2925206e07","rules":{"algorithm":"fast"},"cr":{"name":"default/allow","rule":"ALLOW","weight":0}} anubis_test.go:149: set cookie: http://127.0.0.1:41053/.within.website/x/cmd/anubis/api/make-challenge?redir=%2F -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=30621e2925206e07; Path=/; Expires=Thu, 10 Jul 2025 15:57:29 GMT; SameSite=Lax anubis_test.go:135: requested cookies for http://127.0.0.1:41053/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=0&redir=%2F&response=20a5cabb2fed3a67e287ff8517a8e898dd01806dd227748873067c6ae5334999 anubis_test.go:138: get cookie: <- techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=30621e2925206e07; Path=/; Expires=Thu, 10 Jul 2025 15:57:29 GMT; SameSite=Lax {"time":"2025-07-10T15:47:29.993934165Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib/challenge/proofofwork.(*Impl).Validate","file":"github.com/TecharoHQ/anubis/lib/challenge/proofofwork/proofofwork.go","line":79},"msg":"challenge took","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"elapsedTime":420} {"time":"2025-07-10T15:47:29.994064527Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).PassChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":413},"msg":"challenge passed, redirecting to app","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0}} anubis_test.go:149: set cookie: http://127.0.0.1:41053/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=0&redir=%2F&response=20a5cabb2fed3a67e287ff8517a8e898dd01806dd227748873067c6ae5334999 -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=; Path=/; Expires=Thu, 10 Jul 2025 15:46:29 GMT; Max-Age=0; SameSite=Lax anubis_test.go:149: set cookie: http://127.0.0.1:41053/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=0&redir=%2F&response=20a5cabb2fed3a67e287ff8517a8e898dd01806dd227748873067c6ae5334999 -> techaro.lol-anubis-auth=eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhY3Rpb24iOiJBTExPVyIsImNoYWxsZW5nZSI6IjMwNjIxZTI5MjUyMDZlMDciLCJleHAiOjE3NTIxNjMwNDksImlhdCI6MTc1MjE2MjQ0OSwibWV0aG9kIjoiZmFzdCIsIm5iZiI6MTc1MjE2MjM4OSwicG9saWN5UnVsZSI6ImFjOTgwZjQ5YzRkMzVmYWIifQ.yr4eOIwX0QMc5KuYUOrQdwA40nfMCIsGsCV8_u74oYI_LcJnd-lyQywCNzW0mDhzoe7hNfrXfTnc0zYbK4HUBQ; Path=/; Expires=Thu, 10 Jul 2025 15:57:29 GMT; SameSite=Lax anubis_test.go:237: &http.Cookie{Name:"techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work", Value:"", Quoted:false, Path:"/", Domain:"", Expires:time.Date(2025, time.July, 10, 15, 46, 29, 0, time.UTC), RawExpires:"Thu, 10 Jul 2025 15:46:29 GMT", MaxAge:-1, Secure:false, HttpOnly:false, SameSite:2, Partitioned:false, Raw:"techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=; Path=/; Expires=Thu, 10 Jul 2025 15:46:29 GMT; Max-Age=0; SameSite=Lax", Unparsed:[]string(nil)} anubis_test.go:237: &http.Cookie{Name:"techaro.lol-anubis-auth", Value:"eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhY3Rpb24iOiJBTExPVyIsImNoYWxsZW5nZSI6IjMwNjIxZTI5MjUyMDZlMDciLCJleHAiOjE3NTIxNjMwNDksImlhdCI6MTc1MjE2MjQ0OSwibWV0aG9kIjoiZmFzdCIsIm5iZiI6MTc1MjE2MjM4OSwicG9saWN5UnVsZSI6ImFjOTgwZjQ5YzRkMzVmYWIifQ.yr4eOIwX0QMc5KuYUOrQdwA40nfMCIsGsCV8_u74oYI_LcJnd-lyQywCNzW0mDhzoe7hNfrXfTnc0zYbK4HUBQ", Quoted:false, Path:"/", Domain:"", Expires:time.Date(2025, time.July, 10, 15, 57, 29, 0, time.UTC), RawExpires:"Thu, 10 Jul 2025 15:57:29 GMT", MaxAge:0, Secure:false, HttpOnly:false, SameSite:2, Partitioned:false, Raw:"techaro.lol-anubis-auth=eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhY3Rpb24iOiJBTExPVyIsImNoYWxsZW5nZSI6IjMwNjIxZTI5MjUyMDZlMDciLCJleHAiOjE3NTIxNjMwNDksImlhdCI6MTc1MjE2MjQ0OSwibWV0aG9kIjoiZmFzdCIsIm5iZiI6MTc1MjE2MjM4OSwicG9saWN5UnVsZSI6ImFjOTgwZjQ5YzRkMzVmYWIifQ.yr4eOIwX0QMc5KuYUOrQdwA40nfMCIsGsCV8_u74oYI_LcJnd-lyQywCNzW0mDhzoe7hNfrXfTnc0zYbK4HUBQ; Path=/; Expires=Thu, 10 Jul 2025 15:57:29 GMT; SameSite=Lax", Unparsed:[]string(nil)} --- PASS: TestCookieCustomExpiration (0.01s) === RUN TestCookieSettings {"time":"2025-07-10T15:47:30.001752613Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} {"time":"2025-07-10T15:47:30.002986227Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).MakeChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":319},"msg":"made challenge","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"challenge":"b6916c28e6f4c708","rules":{"algorithm":"fast"},"cr":{"name":"default/allow","rule":"ALLOW","weight":0}} anubis_test.go:149: set cookie: http://127.0.0.1:40941/.within.website/x/cmd/anubis/api/make-challenge?redir=%2F -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=b6916c28e6f4c708; Path=/; Domain=127.0.0.1; Expires=Thu, 17 Jul 2025 15:47:30 GMT; SameSite=Lax; Partitioned anubis_test.go:135: requested cookies for http://127.0.0.1:40941/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=0&redir=%2F&response=97fe304bbec5254ba167f700254cfa4e3bad3c897879eeaf02c399e51d6fd2ef anubis_test.go:138: get cookie: <- techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=b6916c28e6f4c708; Path=/; Domain=127.0.0.1; Expires=Thu, 17 Jul 2025 15:47:30 GMT; SameSite=Lax; Partitioned {"time":"2025-07-10T15:47:30.003372311Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib/challenge/proofofwork.(*Impl).Validate","file":"github.com/TecharoHQ/anubis/lib/challenge/proofofwork/proofofwork.go","line":79},"msg":"challenge took","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"elapsedTime":420} {"time":"2025-07-10T15:47:30.003500393Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).PassChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":413},"msg":"challenge passed, redirecting to app","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0}} anubis_test.go:149: set cookie: http://127.0.0.1:40941/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=0&redir=%2F&response=97fe304bbec5254ba167f700254cfa4e3bad3c897879eeaf02c399e51d6fd2ef -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=; Path=/; Domain=127.0.0.1; Expires=Thu, 10 Jul 2025 15:46:30 GMT; Max-Age=0; SameSite=Lax; Partitioned anubis_test.go:149: set cookie: http://127.0.0.1:40941/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=0&redir=%2F&response=97fe304bbec5254ba167f700254cfa4e3bad3c897879eeaf02c399e51d6fd2ef -> techaro.lol-anubis-auth-for-127.0.0.1=eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhY3Rpb24iOiJBTExPVyIsImNoYWxsZW5nZSI6ImI2OTE2YzI4ZTZmNGM3MDgiLCJleHAiOjE3NTI3NjcyNTAsImlhdCI6MTc1MjE2MjQ1MCwibWV0aG9kIjoiZmFzdCIsIm5iZiI6MTc1MjE2MjM5MCwicG9saWN5UnVsZSI6ImFjOTgwZjQ5YzRkMzVmYWIifQ.qoGwjIxxsh2RxXsrJn4lHjJg1T3dHeL2NVELKVg4Vxp6Thhx3btkM23CA_Q_OYHD6FpuLMlG_rk8haJ8F6RgDA; Path=/; Domain=127.0.0.1; Expires=Thu, 17 Jul 2025 15:47:30 GMT; SameSite=Lax; Partitioned anubis_test.go:288: &http.Cookie{Name:"techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work", Value:"", Quoted:false, Path:"/", Domain:"127.0.0.1", Expires:time.Date(2025, time.July, 10, 15, 46, 30, 0, time.UTC), RawExpires:"Thu, 10 Jul 2025 15:46:30 GMT", MaxAge:-1, Secure:false, HttpOnly:false, SameSite:2, Partitioned:true, Raw:"techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=; Path=/; Domain=127.0.0.1; Expires=Thu, 10 Jul 2025 15:46:30 GMT; Max-Age=0; SameSite=Lax; Partitioned", Unparsed:[]string(nil)} anubis_test.go:288: &http.Cookie{Name:"techaro.lol-anubis-auth-for-127.0.0.1", Value:"eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhY3Rpb24iOiJBTExPVyIsImNoYWxsZW5nZSI6ImI2OTE2YzI4ZTZmNGM3MDgiLCJleHAiOjE3NTI3NjcyNTAsImlhdCI6MTc1MjE2MjQ1MCwibWV0aG9kIjoiZmFzdCIsIm5iZiI6MTc1MjE2MjM5MCwicG9saWN5UnVsZSI6ImFjOTgwZjQ5YzRkMzVmYWIifQ.qoGwjIxxsh2RxXsrJn4lHjJg1T3dHeL2NVELKVg4Vxp6Thhx3btkM23CA_Q_OYHD6FpuLMlG_rk8haJ8F6RgDA", Quoted:false, Path:"/", Domain:"127.0.0.1", Expires:time.Date(2025, time.July, 17, 15, 47, 30, 0, time.UTC), RawExpires:"Thu, 17 Jul 2025 15:47:30 GMT", MaxAge:0, Secure:false, HttpOnly:false, SameSite:2, Partitioned:true, Raw:"techaro.lol-anubis-auth-for-127.0.0.1=eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhY3Rpb24iOiJBTExPVyIsImNoYWxsZW5nZSI6ImI2OTE2YzI4ZTZmNGM3MDgiLCJleHAiOjE3NTI3NjcyNTAsImlhdCI6MTc1MjE2MjQ1MCwibWV0aG9kIjoiZmFzdCIsIm5iZiI6MTc1MjE2MjM5MCwicG9saWN5UnVsZSI6ImFjOTgwZjQ5YzRkMzVmYWIifQ.qoGwjIxxsh2RxXsrJn4lHjJg1T3dHeL2NVELKVg4Vxp6Thhx3btkM23CA_Q_OYHD6FpuLMlG_rk8haJ8F6RgDA; Path=/; Domain=127.0.0.1; Expires=Thu, 17 Jul 2025 15:47:30 GMT; SameSite=Lax; Partitioned", Unparsed:[]string(nil)} --- PASS: TestCookieSettings (0.01s) === RUN TestCheckDefaultDifficultyMatchesPolicy === RUN TestCheckDefaultDifficultyMatchesPolicy/1 {"time":"2025-07-10T15:47:30.011146918Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} anubis_test.go:347: default/allow === RUN TestCheckDefaultDifficultyMatchesPolicy/2 {"time":"2025-07-10T15:47:30.018769124Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} anubis_test.go:347: default/allow === RUN TestCheckDefaultDifficultyMatchesPolicy/3 {"time":"2025-07-10T15:47:30.026937215Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} anubis_test.go:347: default/allow === RUN TestCheckDefaultDifficultyMatchesPolicy/4 {"time":"2025-07-10T15:47:30.034394099Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} anubis_test.go:347: default/allow === RUN TestCheckDefaultDifficultyMatchesPolicy/5 {"time":"2025-07-10T15:47:30.041882463Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} anubis_test.go:347: default/allow === RUN TestCheckDefaultDifficultyMatchesPolicy/6 {"time":"2025-07-10T15:47:30.050014634Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} anubis_test.go:347: default/allow === RUN TestCheckDefaultDifficultyMatchesPolicy/7 {"time":"2025-07-10T15:47:30.058283527Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} anubis_test.go:347: default/allow === RUN TestCheckDefaultDifficultyMatchesPolicy/8 {"time":"2025-07-10T15:47:30.065816011Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} anubis_test.go:347: default/allow === RUN TestCheckDefaultDifficultyMatchesPolicy/9 {"time":"2025-07-10T15:47:30.074094584Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} anubis_test.go:347: default/allow --- PASS: TestCheckDefaultDifficultyMatchesPolicy (0.07s) --- PASS: TestCheckDefaultDifficultyMatchesPolicy/1 (0.01s) --- PASS: TestCheckDefaultDifficultyMatchesPolicy/2 (0.01s) --- PASS: TestCheckDefaultDifficultyMatchesPolicy/3 (0.01s) --- PASS: TestCheckDefaultDifficultyMatchesPolicy/4 (0.01s) --- PASS: TestCheckDefaultDifficultyMatchesPolicy/5 (0.01s) --- PASS: TestCheckDefaultDifficultyMatchesPolicy/6 (0.01s) --- PASS: TestCheckDefaultDifficultyMatchesPolicy/7 (0.01s) --- PASS: TestCheckDefaultDifficultyMatchesPolicy/8 (0.01s) --- PASS: TestCheckDefaultDifficultyMatchesPolicy/9 (0.01s) === RUN TestBasePrefix === RUN TestBasePrefix/no_prefix {"time":"2025-07-10T15:47:30.081590108Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} {"time":"2025-07-10T15:47:30.082110074Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).MakeChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":319},"msg":"made challenge","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"challenge":"b1b71d4910b82403","rules":{"algorithm":"fast","difficulty":4,"report_as":4},"cr":{"name":"default/allow","rule":"ALLOW","weight":0}} anubis_test.go:149: set cookie: http://127.0.0.1:43531/.within.website/x/cmd/anubis/api/make-challenge?redir=%2F -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=b1b71d4910b82403; Path=/; Expires=Thu, 10 Jul 2025 15:47:30 GMT; SameSite=Lax anubis_test.go:135: requested cookies for http://127.0.0.1:43531/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=72088&redir=%2F&response=0000288381c72244c86a3ad0caea97fc2ba8234782d95b3d0a20ea6b8e8372b8 anubis_test.go:138: get cookie: <- techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=b1b71d4910b82403; Path=/; Expires=Thu, 10 Jul 2025 15:47:30 GMT; SameSite=Lax {"time":"2025-07-10T15:47:30.124479989Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib/challenge/proofofwork.(*Impl).Validate","file":"github.com/TecharoHQ/anubis/lib/challenge/proofofwork/proofofwork.go","line":79},"msg":"challenge took","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"elapsedTime":420} {"time":"2025-07-10T15:47:30.124614431Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).PassChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":413},"msg":"challenge passed, redirecting to app","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0}} anubis_test.go:149: set cookie: http://127.0.0.1:43531/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=72088&redir=%2F&response=0000288381c72244c86a3ad0caea97fc2ba8234782d95b3d0a20ea6b8e8372b8 -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=; Path=/; Expires=Thu, 10 Jul 2025 15:46:30 GMT; Max-Age=0; SameSite=Lax anubis_test.go:149: set cookie: http://127.0.0.1:43531/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=72088&redir=%2F&response=0000288381c72244c86a3ad0caea97fc2ba8234782d95b3d0a20ea6b8e8372b8 -> techaro.lol-anubis-auth=eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhY3Rpb24iOiJBTExPVyIsImNoYWxsZW5nZSI6ImIxYjcxZDQ5MTBiODI0MDMiLCJleHAiOjE3NTIxNjI0NTAsImlhdCI6MTc1MjE2MjQ1MCwibWV0aG9kIjoiZmFzdCIsIm5iZiI6MTc1MjE2MjM5MCwicG9saWN5UnVsZSI6ImFjOTgwZjQ5YzRkMzVmYWIifQ.gVY8iILlUU2FFGH3LU35cJ_ZxI4HclwPcgRJFocZWcS_dTpKAIsrcbSCEsKSy1SEiKshau-NeylN_wdWm7EqBA; Path=/; Expires=Thu, 10 Jul 2025 15:47:30 GMT; SameSite=Lax === RUN TestBasePrefix/with_prefix {"time":"2025-07-10T15:47:30.132985324Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} {"time":"2025-07-10T15:47:30.13348397Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).MakeChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":319},"msg":"made challenge","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"challenge":"91cb8da8a07925ac","rules":{"algorithm":"fast","difficulty":4,"report_as":4},"cr":{"name":"default/allow","rule":"ALLOW","weight":0}} anubis_test.go:149: set cookie: http://127.0.0.1:42985/myapp/.within.website/x/cmd/anubis/api/make-challenge?redir=%2Fmyapp -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=91cb8da8a07925ac; Path=/; Expires=Thu, 10 Jul 2025 15:47:30 GMT; SameSite=Lax anubis_test.go:135: requested cookies for http://127.0.0.1:42985/myapp/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=89639&redir=%2F&response=0000361aecc3b9bb6f10c31da21424a0369d388b4aa2db613c920ae31e3042cf anubis_test.go:138: get cookie: <- techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=91cb8da8a07925ac; Path=/; Expires=Thu, 10 Jul 2025 15:47:30 GMT; SameSite=Lax {"time":"2025-07-10T15:47:30.186929689Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib/challenge/proofofwork.(*Impl).Validate","file":"github.com/TecharoHQ/anubis/lib/challenge/proofofwork/proofofwork.go","line":79},"msg":"challenge took","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"elapsedTime":420} {"time":"2025-07-10T15:47:30.187082131Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).PassChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":413},"msg":"challenge passed, redirecting to app","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0}} anubis_test.go:149: set cookie: http://127.0.0.1:42985/myapp/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=89639&redir=%2F&response=0000361aecc3b9bb6f10c31da21424a0369d388b4aa2db613c920ae31e3042cf -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=; Path=/; Expires=Thu, 10 Jul 2025 15:46:30 GMT; Max-Age=0; SameSite=Lax anubis_test.go:149: set cookie: http://127.0.0.1:42985/myapp/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=89639&redir=%2F&response=0000361aecc3b9bb6f10c31da21424a0369d388b4aa2db613c920ae31e3042cf -> techaro.lol-anubis-auth=eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhY3Rpb24iOiJBTExPVyIsImNoYWxsZW5nZSI6IjkxY2I4ZGE4YTA3OTI1YWMiLCJleHAiOjE3NTIxNjI0NTAsImlhdCI6MTc1MjE2MjQ1MCwibWV0aG9kIjoiZmFzdCIsIm5iZiI6MTc1MjE2MjM5MCwicG9saWN5UnVsZSI6ImFjOTgwZjQ5YzRkMzVmYWIifQ.6wSO4QqPBqQyiZcGYlfSbNHt_wrRsZYPnANFIsaEd9JbbcqN6c_RmiTyrU8UUOY0B7D7hr8Js5-5KaTUHwY0Bw; Path=/myapp/; Expires=Thu, 10 Jul 2025 15:47:30 GMT; SameSite=Lax === RUN TestBasePrefix/with_prefix_and_trailing_slash {"time":"2025-07-10T15:47:30.194843218Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} {"time":"2025-07-10T15:47:30.196223233Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).MakeChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":319},"msg":"made challenge","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"challenge":"7347b803bce35e14","rules":{"algorithm":"fast","difficulty":4,"report_as":4},"cr":{"name":"default/allow","rule":"ALLOW","weight":0}} anubis_test.go:149: set cookie: http://127.0.0.1:41607/myapp/.within.website/x/cmd/anubis/api/make-challenge?redir=%2Fmyapp%2F -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=7347b803bce35e14; Path=/; Expires=Thu, 10 Jul 2025 15:47:30 GMT; SameSite=Lax anubis_test.go:135: requested cookies for http://127.0.0.1:41607/myapp/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=84795&redir=%2F&response=0000634a64adb84e3cda3c15dfbe89554888e32f94023bf440eb2522a5bf7158 anubis_test.go:138: get cookie: <- techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=7347b803bce35e14; Path=/; Expires=Thu, 10 Jul 2025 15:47:30 GMT; SameSite=Lax {"time":"2025-07-10T15:47:30.246053512Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib/challenge/proofofwork.(*Impl).Validate","file":"github.com/TecharoHQ/anubis/lib/challenge/proofofwork/proofofwork.go","line":79},"msg":"challenge took","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"elapsedTime":420} {"time":"2025-07-10T15:47:30.246187194Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).PassChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":413},"msg":"challenge passed, redirecting to app","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0}} anubis_test.go:149: set cookie: http://127.0.0.1:41607/myapp/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=84795&redir=%2F&response=0000634a64adb84e3cda3c15dfbe89554888e32f94023bf440eb2522a5bf7158 -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=; Path=/; Expires=Thu, 10 Jul 2025 15:46:30 GMT; Max-Age=0; SameSite=Lax anubis_test.go:149: set cookie: http://127.0.0.1:41607/myapp/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=84795&redir=%2F&response=0000634a64adb84e3cda3c15dfbe89554888e32f94023bf440eb2522a5bf7158 -> techaro.lol-anubis-auth=eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhY3Rpb24iOiJBTExPVyIsImNoYWxsZW5nZSI6IjczNDdiODAzYmNlMzVlMTQiLCJleHAiOjE3NTIxNjI0NTAsImlhdCI6MTc1MjE2MjQ1MCwibWV0aG9kIjoiZmFzdCIsIm5iZiI6MTc1MjE2MjM5MCwicG9saWN5UnVsZSI6ImFjOTgwZjQ5YzRkMzVmYWIifQ.Uk5ZcwCgErHXVRLSKLg7MHDAfGw9aDRVSlo-0T94XhMSH4ryaS2cBAcSZA0aDpIv8-vRSaFkABWvV8plOISgAw; Path=/myapp/; Expires=Thu, 10 Jul 2025 15:47:30 GMT; SameSite=Lax --- PASS: TestBasePrefix (0.17s) --- PASS: TestBasePrefix/no_prefix (0.05s) --- PASS: TestBasePrefix/with_prefix (0.06s) --- PASS: TestBasePrefix/with_prefix_and_trailing_slash (0.06s) === RUN TestCustomStatusCodes {"time":"2025-07-10T15:47:30.246940922Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} === RUN TestCustomStatusCodes/ALLOW {"time":"2025-07-10T15:47:30.24765909Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).checkRules","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":215},"msg":"allowing traffic to origin (explicit)","user_agent":"ALLOW","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0}} === NAME TestCustomStatusCodes anubis_test.go:513: ALLOW === RUN TestCustomStatusCodes/CHALLENGE {"time":"2025-07-10T15:47:30.24849634Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).checkRules","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":232},"msg":"challenge requested","user_agent":"CHALLENGE","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"bot/challenge","rule":"CHALLENGE","weight":0}} {"time":"2025-07-10T15:47:30.24851438Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).maybeReverseProxy","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":150},"msg":"cookie not found","user_agent":"CHALLENGE","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"bot/challenge","rule":"CHALLENGE","weight":0},"path":"/"} === RUN TestCustomStatusCodes/DENY {"time":"2025-07-10T15:47:30.249137787Z","level":"INFO","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).checkRules","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":220},"msg":"explicit deny","user_agent":"DENY","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"bot/deny","rule":"DENY","weight":0}} {"time":"2025-07-10T15:47:30.249164907Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).checkRules","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":228},"msg":"rule hash","user_agent":"DENY","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"bot/deny","rule":"DENY","weight":0},"hash":"484487c000d57854"} --- PASS: TestCustomStatusCodes (0.00s) --- PASS: TestCustomStatusCodes/ALLOW (0.00s) --- PASS: TestCustomStatusCodes/CHALLENGE (0.00s) --- PASS: TestCustomStatusCodes/DENY (0.00s) === RUN TestCloudflareWorkersRule === RUN TestCloudflareWorkersRule/cel {"time":"2025-07-10T15:47:30.250028677Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} === RUN TestCloudflareWorkersRule/cel/with-cf-worker-header === RUN TestCloudflareWorkersRule/cel/no-cf-worker-header === RUN TestCloudflareWorkersRule/header {"time":"2025-07-10T15:47:30.250660684Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} === RUN TestCloudflareWorkersRule/header/with-cf-worker-header === RUN TestCloudflareWorkersRule/header/no-cf-worker-header --- PASS: TestCloudflareWorkersRule (0.00s) --- PASS: TestCloudflareWorkersRule/cel (0.00s) --- PASS: TestCloudflareWorkersRule/cel/with-cf-worker-header (0.00s) --- PASS: TestCloudflareWorkersRule/cel/no-cf-worker-header (0.00s) --- PASS: TestCloudflareWorkersRule/header (0.00s) --- PASS: TestCloudflareWorkersRule/header/with-cf-worker-header (0.00s) --- PASS: TestCloudflareWorkersRule/header/no-cf-worker-header (0.00s) === RUN TestRuleChange {"time":"2025-07-10T15:47:30.251310651Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} {"time":"2025-07-10T15:47:30.251715216Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).MakeChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":319},"msg":"made challenge","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"challenge":"d6a72d9e821a1cb1","rules":{"algorithm":"fast"},"cr":{"name":"default/allow","rule":"ALLOW","weight":0}} anubis_test.go:149: set cookie: http://127.0.0.1:39077/.within.website/x/cmd/anubis/api/make-challenge?redir=%2F -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=d6a72d9e821a1cb1; Path=/; Domain=127.0.0.1; Expires=Thu, 10 Jul 2025 15:57:30 GMT; SameSite=Lax anubis_test.go:135: requested cookies for http://127.0.0.1:39077/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=0&redir=%2F&response=d113be4d30133bd7d8ffb46e24478f5bba9b45ee0d0a23c7c421864ef2f98293 anubis_test.go:138: get cookie: <- techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=d6a72d9e821a1cb1; Path=/; Domain=127.0.0.1; Expires=Thu, 10 Jul 2025 15:57:30 GMT; SameSite=Lax {"time":"2025-07-10T15:47:30.251991619Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib/challenge/proofofwork.(*Impl).Validate","file":"github.com/TecharoHQ/anubis/lib/challenge/proofofwork/proofofwork.go","line":79},"msg":"challenge took","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0},"elapsedTime":420} {"time":"2025-07-10T15:47:30.25212298Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.(*Server).PassChallenge","file":"github.com/TecharoHQ/anubis/lib/anubis.go","line":413},"msg":"challenge passed, redirecting to app","user_agent":"Go-http-client/1.1","accept_language":"","priority":"","x-forwarded-for":"","x-real-ip":"127.0.0.1","check_result":{"name":"default/allow","rule":"ALLOW","weight":0}} anubis_test.go:149: set cookie: http://127.0.0.1:39077/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=0&redir=%2F&response=d113be4d30133bd7d8ffb46e24478f5bba9b45ee0d0a23c7c421864ef2f98293 -> techaro.lol-anubis-cookie-test-if-you-block-this-anubis-wont-work=; Path=/; Domain=127.0.0.1; Expires=Thu, 10 Jul 2025 15:46:30 GMT; Max-Age=0; SameSite=Lax anubis_test.go:149: set cookie: http://127.0.0.1:39077/.within.website/x/cmd/anubis/api/pass-challenge?elapsedTime=420&nonce=0&redir=%2F&response=d113be4d30133bd7d8ffb46e24478f5bba9b45ee0d0a23c7c421864ef2f98293 -> techaro.lol-anubis-auth-for-127.0.0.1=eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhY3Rpb24iOiJBTExPVyIsImNoYWxsZW5nZSI6ImQ2YTcyZDllODIxYTFjYjEiLCJleHAiOjE3NTIxNjMwNTAsImlhdCI6MTc1MjE2MjQ1MCwibWV0aG9kIjoiZmFzdCIsIm5iZiI6MTc1MjE2MjM5MCwicG9saWN5UnVsZSI6ImFjOTgwZjQ5YzRkMzVmYWIifQ.E8oJR83kceQA-5_HjD8SvqSY4Z9V9jpbEX3xGSNkzHWmm-Rjn3swQ1cMYnGOGJ0-S2R_fzB_HJHTWdi4edU_AQ; Path=/; Domain=127.0.0.1; Expires=Thu, 10 Jul 2025 15:57:30 GMT; SameSite=Lax --- PASS: TestRuleChange (0.00s) === RUN TestStripBasePrefixFromRequest === RUN TestStripBasePrefixFromRequest/strip_disabled_-_no_change === RUN TestStripBasePrefixFromRequest/strip_enabled_-_removes_prefix === RUN TestStripBasePrefixFromRequest/strip_enabled_-_root_becomes_slash === RUN TestStripBasePrefixFromRequest/strip_enabled_-_trailing_slash_on_base_prefix === RUN TestStripBasePrefixFromRequest/strip_enabled_-_no_prefix_match === RUN TestStripBasePrefixFromRequest/strip_enabled_-_empty_base_prefix === RUN TestStripBasePrefixFromRequest/strip_enabled_-_nested_path === RUN TestStripBasePrefixFromRequest/strip_enabled_-_exact_match_becomes_root --- PASS: TestStripBasePrefixFromRequest (0.00s) --- PASS: TestStripBasePrefixFromRequest/strip_disabled_-_no_change (0.00s) --- PASS: TestStripBasePrefixFromRequest/strip_enabled_-_removes_prefix (0.00s) --- PASS: TestStripBasePrefixFromRequest/strip_enabled_-_root_becomes_slash (0.00s) --- PASS: TestStripBasePrefixFromRequest/strip_enabled_-_trailing_slash_on_base_prefix (0.00s) --- PASS: TestStripBasePrefixFromRequest/strip_enabled_-_no_prefix_match (0.00s) --- PASS: TestStripBasePrefixFromRequest/strip_enabled_-_empty_base_prefix (0.00s) --- PASS: TestStripBasePrefixFromRequest/strip_enabled_-_nested_path (0.00s) --- PASS: TestStripBasePrefixFromRequest/strip_enabled_-_exact_match_becomes_root (0.00s) === RUN TestInvalidChallengeMethod --- PASS: TestInvalidChallengeMethod (0.00s) === RUN TestBadConfigs === RUN TestBadConfigs/badregexes.json config_test.go:32: can't parse policy file policy/config/testdata/bad/badregexes.json: config is not valid: bot 0: config: bot entry for "path-bad" is not valid: config.Bot: invalid path regex error parsing regexp: missing closing ): `a(b` bot 1: config: bot entry for "user-agent-bad" is not valid: config.Bot: invalid user agent regex error parsing regexp: missing closing ): `a(b` bot 2: config: bot entry for "headers-bad" is not valid: config.Bot: must set either user_agent_regex, path_regex, headers_regex, or remote_addresses === RUN TestBadConfigs/badregexes.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/badregexes.yaml: config is not valid: bot 0: config: bot entry for "path-bad" is not valid: config.Bot: invalid path regex error parsing regexp: missing closing ): `a(b` bot 1: config: bot entry for "user-agent-bad" is not valid: config.Bot: invalid user agent regex error parsing regexp: missing closing ): `a(b` === RUN TestBadConfigs/import_and_bot.json config_test.go:32: can't parse policy file policy/config/testdata/bad/import_and_bot.json: config is not valid: bot 0: config.BotOrImport: can't set bot rules and import values at the same time === RUN TestBadConfigs/import_and_bot.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/import_and_bot.yaml: config is not valid: bot 0: config.BotOrImport: can't set bot rules and import values at the same time === RUN TestBadConfigs/import_invalid_file.json config_test.go:32: can't parse policy file policy/config/testdata/bad/import_invalid_file.json: config is not valid: bot 0: config.ImportStatement: invalid source file: (data)/does-not-exist-fake-file.yaml: open does-not-exist-fake-file.yaml: file does not exist === RUN TestBadConfigs/import_invalid_file.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/import_invalid_file.yaml: config is not valid: bot 0: config.ImportStatement: invalid source file: (data)/does-not-exist-fake-file.yaml: open does-not-exist-fake-file.yaml: file does not exist === RUN TestBadConfigs/impressum-no-footer.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/impressum-no-footer.yaml: errors validating policy config policy/config/testdata/bad/impressum-no-footer.yaml: config: missing value: impressum footer must be defined === RUN TestBadConfigs/impressum-no-page-contents.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/impressum-no-page-contents.yaml: errors validating policy config policy/config/testdata/bad/impressum-no-page-contents.yaml: config: missing value: impressum page title must be defined config: missing value: impressum body title must be defined === RUN TestBadConfigs/invalid.json config_test.go:32: can't parse policy file policy/config/testdata/bad/invalid.json: config is not valid: bot 0: config.BotOrImport: rule definition is invalid, you must set either bot rules or an import statement, not both === RUN TestBadConfigs/invalid.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/invalid.yaml: config is not valid: config: must define at least one (1) bot rule === RUN TestBadConfigs/multiple_expression_types.json config_test.go:32: can't parse policy file policy/config/testdata/bad/multiple_expression_types.json: config is not valid: bot 0: config: bot entry for "multiple-expression-types" is not valid: config: expression block can't contain multiple expression types === RUN TestBadConfigs/multiple_expression_types.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/multiple_expression_types.yaml: config is not valid: bot 0: config: bot entry for "multiple-expression-types" is not valid: config: expression block can't contain multiple expression types === RUN TestBadConfigs/nobots.json config_test.go:32: can't parse policy file policy/config/testdata/bad/nobots.json: config is not valid: config: must define at least one (1) bot rule === RUN TestBadConfigs/nobots.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/nobots.yaml: config is not valid: config: must define at least one (1) bot rule === RUN TestBadConfigs/opengraph_bad_ttl.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/opengraph_bad_ttl.yaml: config is not valid: config.OpenGraph: invalid OpenGraph configuration config.OpenGraph: ttl does not parse as a Duration, see https://pkg.go.dev/time#ParseDuration (formatted like 5m -> 5 minutes, 2h -> 2 hours, etc): ParseDuration("taco") returned: time: invalid duration "taco" === RUN TestBadConfigs/regex_ends_newline.json config_test.go:32: can't parse policy file policy/config/testdata/bad/regex_ends_newline.json: config is not valid: bot 0: config: bot entry for "user-agent-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): user agent regex: "Mozilla\n" bot 1: config: bot entry for "path-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): path regex: "^/evil/.*$\n" bot 2: config: bot entry for "headers-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): header CF-Worker regex: ".*\n" === RUN TestBadConfigs/regex_ends_newline.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/regex_ends_newline.yaml: config is not valid: bot 0: config: bot entry for "user-agent-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): user agent regex: "Mozilla\n" bot 1: config: bot entry for "path-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): path regex: "^/evil/.*$\n" bot 2: config: bot entry for "headers-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): header CF-Worker regex: ".*\n" === RUN TestBadConfigs/status-codes-0.json config_test.go:32: can't parse policy file policy/config/testdata/bad/status-codes-0.json: config is not valid: status codes not valid: config.StatusCode: status code not valid, must be between 100 and 599: challenge is 0 config.StatusCode: status code not valid, must be between 100 and 599: deny is 0 === RUN TestBadConfigs/status-codes-0.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/status-codes-0.yaml: config is not valid: status codes not valid: config.StatusCode: status code not valid, must be between 100 and 599: challenge is 0 config.StatusCode: status code not valid, must be between 100 and 599: deny is 0 === RUN TestBadConfigs/threshold-challenge-without-challenge.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/threshold-challenge-without-challenge.yaml: config is not valid: threshold 0: config: threshold entry for "extreme-suspicion" is not valid: config.Threshold: a threshold cannot have the WEIGH action === RUN TestBadConfigs/thresholds.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/thresholds.yaml: config is not valid: threshold 0: config: threshold entry for "extreme-suspicion" is not valid: config.Threshold: a threshold cannot have the WEIGH action === RUN TestBadConfigs/unparseable.json config_test.go:32: can't parse policy file policy/config/testdata/bad/unparseable.json: can't parse policy config YAML policy/config/testdata/bad/unparseable.json: error converting YAML to JSON: yaml: did not find expected node content === RUN TestBadConfigs/unparseable.yaml config_test.go:32: can't parse policy file policy/config/testdata/bad/unparseable.yaml: can't parse policy config YAML policy/config/testdata/bad/unparseable.yaml: error converting YAML to JSON: yaml: did not find expected node content --- PASS: TestBadConfigs (0.00s) --- PASS: TestBadConfigs/badregexes.json (0.00s) --- PASS: TestBadConfigs/badregexes.yaml (0.00s) --- PASS: TestBadConfigs/import_and_bot.json (0.00s) --- PASS: TestBadConfigs/import_and_bot.yaml (0.00s) --- PASS: TestBadConfigs/import_invalid_file.json (0.00s) --- PASS: TestBadConfigs/import_invalid_file.yaml (0.00s) --- PASS: TestBadConfigs/impressum-no-footer.yaml (0.00s) --- PASS: TestBadConfigs/impressum-no-page-contents.yaml (0.00s) --- PASS: TestBadConfigs/invalid.json (0.00s) --- PASS: TestBadConfigs/invalid.yaml (0.00s) --- PASS: TestBadConfigs/multiple_expression_types.json (0.00s) --- PASS: TestBadConfigs/multiple_expression_types.yaml (0.00s) --- PASS: TestBadConfigs/nobots.json (0.00s) --- PASS: TestBadConfigs/nobots.yaml (0.00s) --- PASS: TestBadConfigs/opengraph_bad_ttl.yaml (0.00s) --- PASS: TestBadConfigs/regex_ends_newline.json (0.00s) --- PASS: TestBadConfigs/regex_ends_newline.yaml (0.00s) --- PASS: TestBadConfigs/status-codes-0.json (0.00s) --- PASS: TestBadConfigs/status-codes-0.yaml (0.00s) --- PASS: TestBadConfigs/threshold-challenge-without-challenge.yaml (0.00s) --- PASS: TestBadConfigs/thresholds.yaml (0.00s) --- PASS: TestBadConfigs/unparseable.json (0.00s) --- PASS: TestBadConfigs/unparseable.yaml (0.00s) === RUN TestGoodConfigs === RUN TestGoodConfigs/allow_everyone.json === RUN TestGoodConfigs/allow_everyone.json/with-thoth === RUN TestGoodConfigs/allow_everyone.json/without-thoth === RUN TestGoodConfigs/allow_everyone.yaml === RUN TestGoodConfigs/allow_everyone.yaml/with-thoth === RUN TestGoodConfigs/allow_everyone.yaml/without-thoth === RUN TestGoodConfigs/block_cf_workers.json === RUN TestGoodConfigs/block_cf_workers.json/with-thoth === RUN TestGoodConfigs/block_cf_workers.json/without-thoth === RUN TestGoodConfigs/block_cf_workers.yaml === RUN TestGoodConfigs/block_cf_workers.yaml/with-thoth === RUN TestGoodConfigs/block_cf_workers.yaml/without-thoth === RUN TestGoodConfigs/challenge_cloudflare.yaml === RUN TestGoodConfigs/challenge_cloudflare.yaml/with-thoth === RUN TestGoodConfigs/challenge_cloudflare.yaml/without-thoth {"time":"2025-07-10T15:47:30.259386022Z","level":"WARN","source":{"function":"github.com/TecharoHQ/anubis/lib/policy.ParseConfig","file":"github.com/TecharoHQ/anubis/lib/policy/policy.go","line":121},"msg":"You have specified a Thoth specific check but you have no Thoth client configured. Please read https://anubis.techaro.lol/docs/admin/thoth for more information","check":"asn","settings":{"match":[13335]}} === RUN TestGoodConfigs/challengemozilla.json === RUN TestGoodConfigs/challengemozilla.json/with-thoth === RUN TestGoodConfigs/challengemozilla.json/without-thoth === RUN TestGoodConfigs/challengemozilla.yaml === RUN TestGoodConfigs/challengemozilla.yaml/with-thoth === RUN TestGoodConfigs/challengemozilla.yaml/without-thoth === RUN TestGoodConfigs/entropy.yaml === RUN TestGoodConfigs/entropy.yaml/with-thoth === RUN TestGoodConfigs/entropy.yaml/without-thoth === RUN TestGoodConfigs/everything_blocked.json === RUN TestGoodConfigs/everything_blocked.json/with-thoth === RUN TestGoodConfigs/everything_blocked.json/without-thoth === RUN TestGoodConfigs/everything_blocked.yaml === RUN TestGoodConfigs/everything_blocked.yaml/with-thoth === RUN TestGoodConfigs/everything_blocked.yaml/without-thoth === RUN TestGoodConfigs/geoip_us.yaml === RUN TestGoodConfigs/geoip_us.yaml/with-thoth === RUN TestGoodConfigs/geoip_us.yaml/without-thoth {"time":"2025-07-10T15:47:30.265533691Z","level":"WARN","source":{"function":"github.com/TecharoHQ/anubis/lib/policy.ParseConfig","file":"github.com/TecharoHQ/anubis/lib/policy/policy.go","line":130},"msg":"You have specified a Thoth specific check but you have no Thoth client configured. Please read https://anubis.techaro.lol/docs/admin/thoth for more information","check":"geoip","settings":{"countries":["US"]}} === RUN TestGoodConfigs/git_client.json === RUN TestGoodConfigs/git_client.json/with-thoth === RUN TestGoodConfigs/git_client.json/without-thoth === RUN TestGoodConfigs/git_client.yaml === RUN TestGoodConfigs/git_client.yaml/with-thoth === RUN TestGoodConfigs/git_client.yaml/without-thoth === RUN TestGoodConfigs/import_filesystem.json === RUN TestGoodConfigs/import_filesystem.json/with-thoth === RUN TestGoodConfigs/import_filesystem.json/without-thoth === RUN TestGoodConfigs/import_filesystem.yaml === RUN TestGoodConfigs/import_filesystem.yaml/with-thoth === RUN TestGoodConfigs/import_filesystem.yaml/without-thoth === RUN TestGoodConfigs/import_keep_internet_working.json === RUN TestGoodConfigs/import_keep_internet_working.json/with-thoth === RUN TestGoodConfigs/import_keep_internet_working.json/without-thoth === RUN TestGoodConfigs/import_keep_internet_working.yaml === RUN TestGoodConfigs/import_keep_internet_working.yaml/with-thoth === RUN TestGoodConfigs/import_keep_internet_working.yaml/without-thoth === RUN TestGoodConfigs/impressum.yaml === RUN TestGoodConfigs/impressum.yaml/with-thoth === RUN TestGoodConfigs/impressum.yaml/without-thoth === RUN TestGoodConfigs/no-thresholds.yaml === RUN TestGoodConfigs/no-thresholds.yaml/with-thoth === RUN TestGoodConfigs/no-thresholds.yaml/without-thoth === RUN TestGoodConfigs/old_xesite.json === RUN TestGoodConfigs/old_xesite.json/with-thoth === RUN TestGoodConfigs/old_xesite.json/without-thoth === RUN TestGoodConfigs/opengraph_all_good.yaml === RUN TestGoodConfigs/opengraph_all_good.yaml/with-thoth === RUN TestGoodConfigs/opengraph_all_good.yaml/without-thoth === RUN TestGoodConfigs/simple-weight.yaml === RUN TestGoodConfigs/simple-weight.yaml/with-thoth === RUN TestGoodConfigs/simple-weight.yaml/without-thoth === RUN TestGoodConfigs/status-codes-paranoid.json === RUN TestGoodConfigs/status-codes-paranoid.json/with-thoth === RUN TestGoodConfigs/status-codes-paranoid.json/without-thoth === RUN TestGoodConfigs/status-codes-paranoid.yaml === RUN TestGoodConfigs/status-codes-paranoid.yaml/with-thoth === RUN TestGoodConfigs/status-codes-paranoid.yaml/without-thoth === RUN TestGoodConfigs/status-codes-rfc.json === RUN TestGoodConfigs/status-codes-rfc.json/with-thoth === RUN TestGoodConfigs/status-codes-rfc.json/without-thoth === RUN TestGoodConfigs/status-codes-rfc.yaml === RUN TestGoodConfigs/status-codes-rfc.yaml/with-thoth === RUN TestGoodConfigs/status-codes-rfc.yaml/without-thoth === RUN TestGoodConfigs/thresholds.yaml === RUN TestGoodConfigs/thresholds.yaml/with-thoth === RUN TestGoodConfigs/thresholds.yaml/without-thoth === RUN TestGoodConfigs/weight-no-weight.yaml === RUN TestGoodConfigs/weight-no-weight.yaml/with-thoth === RUN TestGoodConfigs/weight-no-weight.yaml/without-thoth --- PASS: TestGoodConfigs (0.03s) --- PASS: TestGoodConfigs/allow_everyone.json (0.00s) --- PASS: TestGoodConfigs/allow_everyone.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/allow_everyone.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/allow_everyone.yaml (0.00s) --- PASS: TestGoodConfigs/allow_everyone.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/allow_everyone.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/block_cf_workers.json (0.00s) --- PASS: TestGoodConfigs/block_cf_workers.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/block_cf_workers.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/block_cf_workers.yaml (0.00s) --- PASS: TestGoodConfigs/block_cf_workers.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/block_cf_workers.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/challenge_cloudflare.yaml (0.00s) --- PASS: TestGoodConfigs/challenge_cloudflare.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/challenge_cloudflare.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/challengemozilla.json (0.00s) --- PASS: TestGoodConfigs/challengemozilla.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/challengemozilla.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/challengemozilla.yaml (0.00s) --- PASS: TestGoodConfigs/challengemozilla.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/challengemozilla.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/entropy.yaml (0.00s) --- PASS: TestGoodConfigs/entropy.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/entropy.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/everything_blocked.json (0.00s) --- PASS: TestGoodConfigs/everything_blocked.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/everything_blocked.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/everything_blocked.yaml (0.00s) --- PASS: TestGoodConfigs/everything_blocked.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/everything_blocked.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/geoip_us.yaml (0.00s) --- PASS: TestGoodConfigs/geoip_us.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/geoip_us.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/git_client.json (0.00s) --- PASS: TestGoodConfigs/git_client.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/git_client.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/git_client.yaml (0.00s) --- PASS: TestGoodConfigs/git_client.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/git_client.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/import_filesystem.json (0.00s) --- PASS: TestGoodConfigs/import_filesystem.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/import_filesystem.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/import_filesystem.yaml (0.00s) --- PASS: TestGoodConfigs/import_filesystem.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/import_filesystem.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/import_keep_internet_working.json (0.00s) --- PASS: TestGoodConfigs/import_keep_internet_working.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/import_keep_internet_working.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/import_keep_internet_working.yaml (0.00s) --- PASS: TestGoodConfigs/import_keep_internet_working.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/import_keep_internet_working.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/impressum.yaml (0.00s) --- PASS: TestGoodConfigs/impressum.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/impressum.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/no-thresholds.yaml (0.00s) --- PASS: TestGoodConfigs/no-thresholds.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/no-thresholds.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/old_xesite.json (0.00s) --- PASS: TestGoodConfigs/old_xesite.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/old_xesite.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/opengraph_all_good.yaml (0.00s) --- PASS: TestGoodConfigs/opengraph_all_good.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/opengraph_all_good.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/simple-weight.yaml (0.00s) --- PASS: TestGoodConfigs/simple-weight.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/simple-weight.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-paranoid.json (0.00s) --- PASS: TestGoodConfigs/status-codes-paranoid.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-paranoid.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-paranoid.yaml (0.00s) --- PASS: TestGoodConfigs/status-codes-paranoid.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-paranoid.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-rfc.json (0.00s) --- PASS: TestGoodConfigs/status-codes-rfc.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-rfc.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-rfc.yaml (0.00s) --- PASS: TestGoodConfigs/status-codes-rfc.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-rfc.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/thresholds.yaml (0.00s) --- PASS: TestGoodConfigs/thresholds.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/thresholds.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/weight-no-weight.yaml (0.00s) --- PASS: TestGoodConfigs/weight-no-weight.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/weight-no-weight.yaml/without-thoth (0.00s) === RUN TestSetCookie === RUN TestSetCookie/basic {"time":"2025-07-10T15:47:30.293856448Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} === RUN TestSetCookie/domain_techaro.lol {"time":"2025-07-10T15:47:30.302245262Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} === RUN TestSetCookie/dynamic_cookie_domain {"time":"2025-07-10T15:47:30.309777987Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} --- PASS: TestSetCookie (0.02s) --- PASS: TestSetCookie/basic (0.01s) --- PASS: TestSetCookie/domain_techaro.lol (0.01s) --- PASS: TestSetCookie/dynamic_cookie_domain (0.01s) === RUN TestClearCookie {"time":"2025-07-10T15:47:30.317925838Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} --- PASS: TestClearCookie (0.01s) === RUN TestClearCookieWithDomain {"time":"2025-07-10T15:47:30.325131079Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} --- PASS: TestClearCookieWithDomain (0.01s) === RUN TestClearCookieWithDynamicDomain {"time":"2025-07-10T15:47:30.332543602Z","level":"DEBUG","source":{"function":"github.com/TecharoHQ/anubis/lib.New","file":"github.com/TecharoHQ/anubis/lib/config.go","line":94},"msg":"opts.PrivateKey not set, generating a new one"} --- PASS: TestClearCookieWithDynamicDomain (0.01s) PASS ok github.com/TecharoHQ/anubis/lib 0.422s ? github.com/TecharoHQ/anubis/lib/challenge [no test files] ? github.com/TecharoHQ/anubis/lib/challenge/metarefresh [no test files] === RUN TestBasic === RUN TestBasic/allgood === RUN TestBasic/no-params === RUN TestBasic/missing-nonce === RUN TestBasic/missing-elapsedTime === RUN TestBasic/missing-response === RUN TestBasic/wrong-nonce-format === RUN TestBasic/wrong-elapsedTime-format === RUN TestBasic/invalid-response --- PASS: TestBasic (0.00s) --- PASS: TestBasic/allgood (0.00s) --- PASS: TestBasic/no-params (0.00s) --- PASS: TestBasic/missing-nonce (0.00s) --- PASS: TestBasic/missing-elapsedTime (0.00s) --- PASS: TestBasic/missing-response (0.00s) --- PASS: TestBasic/wrong-nonce-format (0.00s) --- PASS: TestBasic/wrong-elapsedTime-format (0.00s) --- PASS: TestBasic/invalid-response (0.00s) PASS ok github.com/TecharoHQ/anubis/lib/challenge/proofofwork 0.033s === RUN TestRemoteAddrChecker === RUN TestRemoteAddrChecker/match_ipv4 === RUN TestRemoteAddrChecker/match_ipv6 === RUN TestRemoteAddrChecker/not_match_ipv4 === RUN TestRemoteAddrChecker/not_match_ipv6 === RUN TestRemoteAddrChecker/no_ip_set === RUN TestRemoteAddrChecker/invalid_ip --- PASS: TestRemoteAddrChecker (0.00s) --- PASS: TestRemoteAddrChecker/match_ipv4 (0.00s) --- PASS: TestRemoteAddrChecker/match_ipv6 (0.00s) --- PASS: TestRemoteAddrChecker/not_match_ipv4 (0.00s) --- PASS: TestRemoteAddrChecker/not_match_ipv6 (0.00s) --- PASS: TestRemoteAddrChecker/no_ip_set (0.00s) --- PASS: TestRemoteAddrChecker/invalid_ip (0.00s) === RUN TestHeaderMatchesChecker === RUN TestHeaderMatchesChecker/match === RUN TestHeaderMatchesChecker/not_match === RUN TestHeaderMatchesChecker/not_present === RUN TestHeaderMatchesChecker/invalid_regex --- PASS: TestHeaderMatchesChecker (0.00s) --- PASS: TestHeaderMatchesChecker/match (0.00s) --- PASS: TestHeaderMatchesChecker/not_match (0.00s) --- PASS: TestHeaderMatchesChecker/not_present (0.00s) --- PASS: TestHeaderMatchesChecker/invalid_regex (0.00s) === RUN TestHeaderExistsChecker === RUN TestHeaderExistsChecker/match === RUN TestHeaderExistsChecker/not_match --- PASS: TestHeaderExistsChecker (0.00s) --- PASS: TestHeaderExistsChecker/match (0.00s) --- PASS: TestHeaderExistsChecker/not_match (0.00s) === RUN TestDefaultPolicyMustParse --- PASS: TestDefaultPolicyMustParse (0.01s) === RUN TestGoodConfigs === RUN TestGoodConfigs/allow_everyone.json === RUN TestGoodConfigs/allow_everyone.json/with-thoth === RUN TestGoodConfigs/allow_everyone.json/without-thoth === RUN TestGoodConfigs/allow_everyone.yaml === RUN TestGoodConfigs/allow_everyone.yaml/with-thoth === RUN TestGoodConfigs/allow_everyone.yaml/without-thoth === RUN TestGoodConfigs/block_cf_workers.json === RUN TestGoodConfigs/block_cf_workers.json/with-thoth === RUN TestGoodConfigs/block_cf_workers.json/without-thoth === RUN TestGoodConfigs/block_cf_workers.yaml === RUN TestGoodConfigs/block_cf_workers.yaml/with-thoth === RUN TestGoodConfigs/block_cf_workers.yaml/without-thoth === RUN TestGoodConfigs/challenge_cloudflare.yaml === RUN TestGoodConfigs/challenge_cloudflare.yaml/with-thoth === RUN TestGoodConfigs/challenge_cloudflare.yaml/without-thoth 2025/07/10 15:47:29 WARN You have specified a Thoth specific check but you have no Thoth client configured. Please read https://anubis.techaro.lol/docs/admin/thoth for more information check=asn settings=&{Match:[13335]} === RUN TestGoodConfigs/challengemozilla.json === RUN TestGoodConfigs/challengemozilla.json/with-thoth === RUN TestGoodConfigs/challengemozilla.json/without-thoth === RUN TestGoodConfigs/challengemozilla.yaml === RUN TestGoodConfigs/challengemozilla.yaml/with-thoth === RUN TestGoodConfigs/challengemozilla.yaml/without-thoth === RUN TestGoodConfigs/entropy.yaml === RUN TestGoodConfigs/entropy.yaml/with-thoth === RUN TestGoodConfigs/entropy.yaml/without-thoth === RUN TestGoodConfigs/everything_blocked.json === RUN TestGoodConfigs/everything_blocked.json/with-thoth === RUN TestGoodConfigs/everything_blocked.json/without-thoth === RUN TestGoodConfigs/everything_blocked.yaml === RUN TestGoodConfigs/everything_blocked.yaml/with-thoth === RUN TestGoodConfigs/everything_blocked.yaml/without-thoth === RUN TestGoodConfigs/geoip_us.yaml === RUN TestGoodConfigs/geoip_us.yaml/with-thoth === RUN TestGoodConfigs/geoip_us.yaml/without-thoth 2025/07/10 15:47:29 WARN You have specified a Thoth specific check but you have no Thoth client configured. Please read https://anubis.techaro.lol/docs/admin/thoth for more information check=geoip settings=&{Countries:[US]} === RUN TestGoodConfigs/git_client.json === RUN TestGoodConfigs/git_client.json/with-thoth === RUN TestGoodConfigs/git_client.json/without-thoth === RUN TestGoodConfigs/git_client.yaml === RUN TestGoodConfigs/git_client.yaml/with-thoth === RUN TestGoodConfigs/git_client.yaml/without-thoth === RUN TestGoodConfigs/import_filesystem.json === RUN TestGoodConfigs/import_filesystem.json/with-thoth === RUN TestGoodConfigs/import_filesystem.json/without-thoth === RUN TestGoodConfigs/import_filesystem.yaml === RUN TestGoodConfigs/import_filesystem.yaml/with-thoth === RUN TestGoodConfigs/import_filesystem.yaml/without-thoth === RUN TestGoodConfigs/import_keep_internet_working.json === RUN TestGoodConfigs/import_keep_internet_working.json/with-thoth === RUN TestGoodConfigs/import_keep_internet_working.json/without-thoth === RUN TestGoodConfigs/import_keep_internet_working.yaml === RUN TestGoodConfigs/import_keep_internet_working.yaml/with-thoth === RUN TestGoodConfigs/import_keep_internet_working.yaml/without-thoth === RUN TestGoodConfigs/impressum.yaml === RUN TestGoodConfigs/impressum.yaml/with-thoth === RUN TestGoodConfigs/impressum.yaml/without-thoth === RUN TestGoodConfigs/no-thresholds.yaml === RUN TestGoodConfigs/no-thresholds.yaml/with-thoth === RUN TestGoodConfigs/no-thresholds.yaml/without-thoth === RUN TestGoodConfigs/old_xesite.json === RUN TestGoodConfigs/old_xesite.json/with-thoth === RUN TestGoodConfigs/old_xesite.json/without-thoth === RUN TestGoodConfigs/opengraph_all_good.yaml === RUN TestGoodConfigs/opengraph_all_good.yaml/with-thoth === RUN TestGoodConfigs/opengraph_all_good.yaml/without-thoth === RUN TestGoodConfigs/simple-weight.yaml === RUN TestGoodConfigs/simple-weight.yaml/with-thoth === RUN TestGoodConfigs/simple-weight.yaml/without-thoth === RUN TestGoodConfigs/status-codes-paranoid.json === RUN TestGoodConfigs/status-codes-paranoid.json/with-thoth === RUN TestGoodConfigs/status-codes-paranoid.json/without-thoth === RUN TestGoodConfigs/status-codes-paranoid.yaml === RUN TestGoodConfigs/status-codes-paranoid.yaml/with-thoth === RUN TestGoodConfigs/status-codes-paranoid.yaml/without-thoth === RUN TestGoodConfigs/status-codes-rfc.json === RUN TestGoodConfigs/status-codes-rfc.json/with-thoth === RUN TestGoodConfigs/status-codes-rfc.json/without-thoth === RUN TestGoodConfigs/status-codes-rfc.yaml === RUN TestGoodConfigs/status-codes-rfc.yaml/with-thoth === RUN TestGoodConfigs/status-codes-rfc.yaml/without-thoth === RUN TestGoodConfigs/thresholds.yaml === RUN TestGoodConfigs/thresholds.yaml/with-thoth === RUN TestGoodConfigs/thresholds.yaml/without-thoth === RUN TestGoodConfigs/weight-no-weight.yaml === RUN TestGoodConfigs/weight-no-weight.yaml/with-thoth === RUN TestGoodConfigs/weight-no-weight.yaml/without-thoth --- PASS: TestGoodConfigs (0.03s) --- PASS: TestGoodConfigs/allow_everyone.json (0.00s) --- PASS: TestGoodConfigs/allow_everyone.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/allow_everyone.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/allow_everyone.yaml (0.00s) --- PASS: TestGoodConfigs/allow_everyone.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/allow_everyone.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/block_cf_workers.json (0.00s) --- PASS: TestGoodConfigs/block_cf_workers.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/block_cf_workers.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/block_cf_workers.yaml (0.00s) --- PASS: TestGoodConfigs/block_cf_workers.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/block_cf_workers.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/challenge_cloudflare.yaml (0.00s) --- PASS: TestGoodConfigs/challenge_cloudflare.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/challenge_cloudflare.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/challengemozilla.json (0.00s) --- PASS: TestGoodConfigs/challengemozilla.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/challengemozilla.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/challengemozilla.yaml (0.00s) --- PASS: TestGoodConfigs/challengemozilla.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/challengemozilla.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/entropy.yaml (0.00s) --- PASS: TestGoodConfigs/entropy.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/entropy.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/everything_blocked.json (0.00s) --- PASS: TestGoodConfigs/everything_blocked.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/everything_blocked.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/everything_blocked.yaml (0.00s) --- PASS: TestGoodConfigs/everything_blocked.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/everything_blocked.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/geoip_us.yaml (0.00s) --- PASS: TestGoodConfigs/geoip_us.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/geoip_us.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/git_client.json (0.00s) --- PASS: TestGoodConfigs/git_client.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/git_client.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/git_client.yaml (0.00s) --- PASS: TestGoodConfigs/git_client.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/git_client.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/import_filesystem.json (0.00s) --- PASS: TestGoodConfigs/import_filesystem.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/import_filesystem.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/import_filesystem.yaml (0.00s) --- PASS: TestGoodConfigs/import_filesystem.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/import_filesystem.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/import_keep_internet_working.json (0.00s) --- PASS: TestGoodConfigs/import_keep_internet_working.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/import_keep_internet_working.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/import_keep_internet_working.yaml (0.00s) --- PASS: TestGoodConfigs/import_keep_internet_working.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/import_keep_internet_working.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/impressum.yaml (0.00s) --- PASS: TestGoodConfigs/impressum.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/impressum.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/no-thresholds.yaml (0.00s) --- PASS: TestGoodConfigs/no-thresholds.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/no-thresholds.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/old_xesite.json (0.00s) --- PASS: TestGoodConfigs/old_xesite.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/old_xesite.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/opengraph_all_good.yaml (0.00s) --- PASS: TestGoodConfigs/opengraph_all_good.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/opengraph_all_good.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/simple-weight.yaml (0.00s) --- PASS: TestGoodConfigs/simple-weight.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/simple-weight.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-paranoid.json (0.00s) --- PASS: TestGoodConfigs/status-codes-paranoid.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-paranoid.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-paranoid.yaml (0.00s) --- PASS: TestGoodConfigs/status-codes-paranoid.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-paranoid.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-rfc.json (0.00s) --- PASS: TestGoodConfigs/status-codes-rfc.json/with-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-rfc.json/without-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-rfc.yaml (0.00s) --- PASS: TestGoodConfigs/status-codes-rfc.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/status-codes-rfc.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/thresholds.yaml (0.00s) --- PASS: TestGoodConfigs/thresholds.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/thresholds.yaml/without-thoth (0.00s) --- PASS: TestGoodConfigs/weight-no-weight.yaml (0.00s) --- PASS: TestGoodConfigs/weight-no-weight.yaml/with-thoth (0.00s) --- PASS: TestGoodConfigs/weight-no-weight.yaml/without-thoth (0.00s) === RUN TestBadConfigs === RUN TestBadConfigs/badregexes.json policy_test.go:85: config is not valid: bot 0: config: bot entry for "path-bad" is not valid: config.Bot: invalid path regex error parsing regexp: missing closing ): `a(b` bot 1: config: bot entry for "user-agent-bad" is not valid: config.Bot: invalid user agent regex error parsing regexp: missing closing ): `a(b` bot 2: config: bot entry for "headers-bad" is not valid: config.Bot: must set either user_agent_regex, path_regex, headers_regex, or remote_addresses === RUN TestBadConfigs/badregexes.yaml policy_test.go:85: config is not valid: bot 0: config: bot entry for "path-bad" is not valid: config.Bot: invalid path regex error parsing regexp: missing closing ): `a(b` bot 1: config: bot entry for "user-agent-bad" is not valid: config.Bot: invalid user agent regex error parsing regexp: missing closing ): `a(b` === RUN TestBadConfigs/import_and_bot.json policy_test.go:85: config is not valid: bot 0: config.BotOrImport: can't set bot rules and import values at the same time === RUN TestBadConfigs/import_and_bot.yaml policy_test.go:85: config is not valid: bot 0: config.BotOrImport: can't set bot rules and import values at the same time === RUN TestBadConfigs/import_invalid_file.json policy_test.go:85: config is not valid: bot 0: config.ImportStatement: invalid source file: (data)/does-not-exist-fake-file.yaml: open does-not-exist-fake-file.yaml: file does not exist === RUN TestBadConfigs/import_invalid_file.yaml policy_test.go:85: config is not valid: bot 0: config.ImportStatement: invalid source file: (data)/does-not-exist-fake-file.yaml: open does-not-exist-fake-file.yaml: file does not exist === RUN TestBadConfigs/impressum-no-footer.yaml policy_test.go:85: errors validating policy config config/testdata/bad/impressum-no-footer.yaml: config: missing value: impressum footer must be defined === RUN TestBadConfigs/impressum-no-page-contents.yaml policy_test.go:85: errors validating policy config config/testdata/bad/impressum-no-page-contents.yaml: config: missing value: impressum page title must be defined config: missing value: impressum body title must be defined === RUN TestBadConfigs/invalid.json policy_test.go:85: config is not valid: bot 0: config.BotOrImport: rule definition is invalid, you must set either bot rules or an import statement, not both === RUN TestBadConfigs/invalid.yaml policy_test.go:85: config is not valid: config: must define at least one (1) bot rule === RUN TestBadConfigs/multiple_expression_types.json policy_test.go:85: config is not valid: bot 0: config: bot entry for "multiple-expression-types" is not valid: config: expression block can't contain multiple expression types === RUN TestBadConfigs/multiple_expression_types.yaml policy_test.go:85: config is not valid: bot 0: config: bot entry for "multiple-expression-types" is not valid: config: expression block can't contain multiple expression types === RUN TestBadConfigs/nobots.json policy_test.go:85: config is not valid: config: must define at least one (1) bot rule === RUN TestBadConfigs/nobots.yaml policy_test.go:85: config is not valid: config: must define at least one (1) bot rule === RUN TestBadConfigs/opengraph_bad_ttl.yaml policy_test.go:85: config is not valid: config.OpenGraph: invalid OpenGraph configuration config.OpenGraph: ttl does not parse as a Duration, see https://pkg.go.dev/time#ParseDuration (formatted like 5m -> 5 minutes, 2h -> 2 hours, etc): ParseDuration("taco") returned: time: invalid duration "taco" === RUN TestBadConfigs/regex_ends_newline.json policy_test.go:85: config is not valid: bot 0: config: bot entry for "user-agent-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): user agent regex: "Mozilla\n" bot 1: config: bot entry for "path-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): path regex: "^/evil/.*$\n" bot 2: config: bot entry for "headers-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): header CF-Worker regex: ".*\n" === RUN TestBadConfigs/regex_ends_newline.yaml policy_test.go:85: config is not valid: bot 0: config: bot entry for "user-agent-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): user agent regex: "Mozilla\n" bot 1: config: bot entry for "path-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): path regex: "^/evil/.*$\n" bot 2: config: bot entry for "headers-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): header CF-Worker regex: ".*\n" === RUN TestBadConfigs/status-codes-0.json policy_test.go:85: config is not valid: status codes not valid: config.StatusCode: status code not valid, must be between 100 and 599: challenge is 0 config.StatusCode: status code not valid, must be between 100 and 599: deny is 0 === RUN TestBadConfigs/status-codes-0.yaml policy_test.go:85: config is not valid: status codes not valid: config.StatusCode: status code not valid, must be between 100 and 599: challenge is 0 config.StatusCode: status code not valid, must be between 100 and 599: deny is 0 === RUN TestBadConfigs/threshold-challenge-without-challenge.yaml policy_test.go:85: config is not valid: threshold 0: config: threshold entry for "extreme-suspicion" is not valid: config.Threshold: a threshold cannot have the WEIGH action === RUN TestBadConfigs/thresholds.yaml policy_test.go:85: config is not valid: threshold 0: config: threshold entry for "extreme-suspicion" is not valid: config.Threshold: a threshold cannot have the WEIGH action === RUN TestBadConfigs/unparseable.json policy_test.go:85: can't parse policy config YAML config/testdata/bad/unparseable.json: error converting YAML to JSON: yaml: did not find expected node content === RUN TestBadConfigs/unparseable.yaml policy_test.go:85: can't parse policy config YAML config/testdata/bad/unparseable.yaml: error converting YAML to JSON: yaml: did not find expected node content --- PASS: TestBadConfigs (0.00s) --- PASS: TestBadConfigs/badregexes.json (0.00s) --- PASS: TestBadConfigs/badregexes.yaml (0.00s) --- PASS: TestBadConfigs/import_and_bot.json (0.00s) --- PASS: TestBadConfigs/import_and_bot.yaml (0.00s) --- PASS: TestBadConfigs/import_invalid_file.json (0.00s) --- PASS: TestBadConfigs/import_invalid_file.yaml (0.00s) --- PASS: TestBadConfigs/impressum-no-footer.yaml (0.00s) --- PASS: TestBadConfigs/impressum-no-page-contents.yaml (0.00s) --- PASS: TestBadConfigs/invalid.json (0.00s) --- PASS: TestBadConfigs/invalid.yaml (0.00s) --- PASS: TestBadConfigs/multiple_expression_types.json (0.00s) --- PASS: TestBadConfigs/multiple_expression_types.yaml (0.00s) --- PASS: TestBadConfigs/nobots.json (0.00s) --- PASS: TestBadConfigs/nobots.yaml (0.00s) --- PASS: TestBadConfigs/opengraph_bad_ttl.yaml (0.00s) --- PASS: TestBadConfigs/regex_ends_newline.json (0.00s) --- PASS: TestBadConfigs/regex_ends_newline.yaml (0.00s) --- PASS: TestBadConfigs/status-codes-0.json (0.00s) --- PASS: TestBadConfigs/status-codes-0.yaml (0.00s) --- PASS: TestBadConfigs/threshold-challenge-without-challenge.yaml (0.00s) --- PASS: TestBadConfigs/thresholds.yaml (0.00s) --- PASS: TestBadConfigs/unparseable.json (0.00s) --- PASS: TestBadConfigs/unparseable.yaml (0.00s) PASS ok github.com/TecharoHQ/anubis/lib/policy 0.077s ? github.com/TecharoHQ/anubis/lib/policy/checker [no test files] === RUN TestASNsValid === RUN TestASNsValid/basic_valid === RUN TestASNsValid/private_ASN --- PASS: TestASNsValid (0.00s) --- PASS: TestASNsValid/basic_valid (0.00s) --- PASS: TestASNsValid/private_ASN (0.00s) === RUN TestIsPrivateASN === RUN TestIsPrivateASN/13335->false === RUN TestIsPrivateASN/64513->true === RUN TestIsPrivateASN/4206942069->true --- PASS: TestIsPrivateASN (0.00s) --- PASS: TestIsPrivateASN/13335->false (0.00s) --- PASS: TestIsPrivateASN/64513->true (0.00s) --- PASS: TestIsPrivateASN/4206942069->true (0.00s) === RUN TestBotValid === RUN TestBotValid/simple_user_agent === RUN TestBotValid/simple_path === RUN TestBotValid/no_rule_name === RUN TestBotValid/no_rule_matcher === RUN TestBotValid/both_user-agent_and_path === RUN TestBotValid/unknown_action === RUN TestBotValid/invalid_user_agent_regex === RUN TestBotValid/invalid_path_regex === RUN TestBotValid/invalid_headers_regex === RUN TestBotValid/challenge_difficulty_too_low === RUN TestBotValid/challenge_difficulty_too_high === RUN TestBotValid/invalid_cidr_range === RUN TestBotValid/only_filter_by_IP_range === RUN TestBotValid/filter_by_user_agent_and_IP_range === RUN TestBotValid/filter_by_path_and_IP_range === RUN TestBotValid/weight_rule_without_weight === RUN TestBotValid/weight_rule_with_weight_adjust --- PASS: TestBotValid (0.00s) --- PASS: TestBotValid/simple_user_agent (0.00s) --- PASS: TestBotValid/simple_path (0.00s) --- PASS: TestBotValid/no_rule_name (0.00s) --- PASS: TestBotValid/no_rule_matcher (0.00s) --- PASS: TestBotValid/both_user-agent_and_path (0.00s) --- PASS: TestBotValid/unknown_action (0.00s) --- PASS: TestBotValid/invalid_user_agent_regex (0.00s) --- PASS: TestBotValid/invalid_path_regex (0.00s) --- PASS: TestBotValid/invalid_headers_regex (0.00s) --- PASS: TestBotValid/challenge_difficulty_too_low (0.00s) --- PASS: TestBotValid/challenge_difficulty_too_high (0.00s) --- PASS: TestBotValid/invalid_cidr_range (0.00s) --- PASS: TestBotValid/only_filter_by_IP_range (0.00s) --- PASS: TestBotValid/filter_by_user_agent_and_IP_range (0.00s) --- PASS: TestBotValid/filter_by_path_and_IP_range (0.00s) --- PASS: TestBotValid/weight_rule_without_weight (0.00s) --- PASS: TestBotValid/weight_rule_with_weight_adjust (0.00s) === RUN TestConfigValidKnownGood === RUN TestConfigValidKnownGood/allow_everyone.json === RUN TestConfigValidKnownGood/allow_everyone.yaml === RUN TestConfigValidKnownGood/block_cf_workers.json === RUN TestConfigValidKnownGood/block_cf_workers.yaml === RUN TestConfigValidKnownGood/challenge_cloudflare.yaml === RUN TestConfigValidKnownGood/challengemozilla.json === RUN TestConfigValidKnownGood/challengemozilla.yaml === RUN TestConfigValidKnownGood/entropy.yaml === RUN TestConfigValidKnownGood/everything_blocked.json === RUN TestConfigValidKnownGood/everything_blocked.yaml === RUN TestConfigValidKnownGood/geoip_us.yaml === RUN TestConfigValidKnownGood/git_client.json === RUN TestConfigValidKnownGood/git_client.yaml === RUN TestConfigValidKnownGood/import_filesystem.json === RUN TestConfigValidKnownGood/import_filesystem.yaml === RUN TestConfigValidKnownGood/import_keep_internet_working.json === RUN TestConfigValidKnownGood/import_keep_internet_working.yaml === RUN TestConfigValidKnownGood/impressum.yaml === RUN TestConfigValidKnownGood/no-thresholds.yaml === RUN TestConfigValidKnownGood/old_xesite.json === RUN TestConfigValidKnownGood/opengraph_all_good.yaml === RUN TestConfigValidKnownGood/simple-weight.yaml === RUN TestConfigValidKnownGood/status-codes-paranoid.json === RUN TestConfigValidKnownGood/status-codes-paranoid.yaml === RUN TestConfigValidKnownGood/status-codes-rfc.json === RUN TestConfigValidKnownGood/status-codes-rfc.yaml === RUN TestConfigValidKnownGood/thresholds.yaml === RUN TestConfigValidKnownGood/weight-no-weight.yaml --- PASS: TestConfigValidKnownGood (0.00s) --- PASS: TestConfigValidKnownGood/allow_everyone.json (0.00s) --- PASS: TestConfigValidKnownGood/allow_everyone.yaml (0.00s) --- PASS: TestConfigValidKnownGood/block_cf_workers.json (0.00s) --- PASS: TestConfigValidKnownGood/block_cf_workers.yaml (0.00s) --- PASS: TestConfigValidKnownGood/challenge_cloudflare.yaml (0.00s) --- PASS: TestConfigValidKnownGood/challengemozilla.json (0.00s) --- PASS: TestConfigValidKnownGood/challengemozilla.yaml (0.00s) --- PASS: TestConfigValidKnownGood/entropy.yaml (0.00s) --- PASS: TestConfigValidKnownGood/everything_blocked.json (0.00s) --- PASS: TestConfigValidKnownGood/everything_blocked.yaml (0.00s) --- PASS: TestConfigValidKnownGood/geoip_us.yaml (0.00s) --- PASS: TestConfigValidKnownGood/git_client.json (0.00s) --- PASS: TestConfigValidKnownGood/git_client.yaml (0.00s) --- PASS: TestConfigValidKnownGood/import_filesystem.json (0.00s) --- PASS: TestConfigValidKnownGood/import_filesystem.yaml (0.00s) --- PASS: TestConfigValidKnownGood/import_keep_internet_working.json (0.00s) --- PASS: TestConfigValidKnownGood/import_keep_internet_working.yaml (0.00s) --- PASS: TestConfigValidKnownGood/impressum.yaml (0.00s) --- PASS: TestConfigValidKnownGood/no-thresholds.yaml (0.00s) --- PASS: TestConfigValidKnownGood/old_xesite.json (0.00s) --- PASS: TestConfigValidKnownGood/opengraph_all_good.yaml (0.00s) --- PASS: TestConfigValidKnownGood/simple-weight.yaml (0.00s) --- PASS: TestConfigValidKnownGood/status-codes-paranoid.json (0.00s) --- PASS: TestConfigValidKnownGood/status-codes-paranoid.yaml (0.00s) --- PASS: TestConfigValidKnownGood/status-codes-rfc.json (0.00s) --- PASS: TestConfigValidKnownGood/status-codes-rfc.yaml (0.00s) --- PASS: TestConfigValidKnownGood/thresholds.yaml (0.00s) --- PASS: TestConfigValidKnownGood/weight-no-weight.yaml (0.00s) === RUN TestImportStatement === RUN TestImportStatement/(data)/apps/allow-api-routes.yaml === RUN TestImportStatement/(data)/apps/bookstack-saml.yaml === RUN TestImportStatement/(data)/apps/gitea-rss-feeds.yaml === RUN TestImportStatement/(data)/apps/qualys-ssl-labs.yml === RUN TestImportStatement/(data)/apps/searx-checker.yml === RUN TestImportStatement/(data)/bots/_deny-pathological.yaml === RUN TestImportStatement/(data)/bots/aggressive-brazilian-scrapers.yaml === RUN TestImportStatement/(data)/bots/ai-catchall.yaml === RUN TestImportStatement/(data)/bots/ai-robots-txt.yaml === RUN TestImportStatement/(data)/bots/cloudflare-workers.yaml === RUN TestImportStatement/(data)/bots/headless-browsers.yaml === RUN TestImportStatement/(data)/bots/irc-bots/archlinux-phrik.yaml === RUN TestImportStatement/(data)/bots/irc-bots/gentoo-chat.yaml === RUN TestImportStatement/(data)/bots/us-ai-scraper.yaml === RUN TestImportStatement/(data)/common/allow-api-like.yaml === RUN TestImportStatement/(data)/common/allow-private-addresses.yaml === RUN TestImportStatement/(data)/common/json-api.yaml === RUN TestImportStatement/(data)/common/keep-internet-working.yaml === RUN TestImportStatement/(data)/common/rfc-violations.yaml === RUN TestImportStatement/(data)/crawlers/_allow-good.yaml === RUN TestImportStatement/(data)/crawlers/ai-search.yaml === RUN TestImportStatement/(data)/crawlers/ai-training.yaml === RUN TestImportStatement/(data)/crawlers/applebot.yaml === RUN TestImportStatement/(data)/crawlers/bingbot.yaml === RUN TestImportStatement/(data)/crawlers/duckduckbot.yaml === RUN TestImportStatement/(data)/crawlers/googlebot.yaml === RUN TestImportStatement/(data)/crawlers/internet-archive.yaml === RUN TestImportStatement/(data)/crawlers/kagibot.yaml === RUN TestImportStatement/(data)/crawlers/marginalia.yaml === RUN TestImportStatement/(data)/crawlers/mojeekbot.yaml === RUN TestImportStatement/(data)/crawlers/openai-gptbot.yaml === RUN TestImportStatement/(data)/crawlers/openai-searchbot.yaml === RUN TestImportStatement/(data)/crawlers/qwantbot.yaml === RUN TestImportStatement/(data)/meta/ai-block-aggressive.yaml === RUN TestImportStatement/(data)/meta/ai-block-moderate.yaml === RUN TestImportStatement/(data)/meta/ai-block-permissive.yaml --- PASS: TestImportStatement (0.01s) --- PASS: TestImportStatement/(data)/apps/allow-api-routes.yaml (0.00s) --- PASS: TestImportStatement/(data)/apps/bookstack-saml.yaml (0.00s) --- PASS: TestImportStatement/(data)/apps/gitea-rss-feeds.yaml (0.00s) --- PASS: TestImportStatement/(data)/apps/qualys-ssl-labs.yml (0.00s) --- PASS: TestImportStatement/(data)/apps/searx-checker.yml (0.00s) --- PASS: TestImportStatement/(data)/bots/_deny-pathological.yaml (0.00s) --- PASS: TestImportStatement/(data)/bots/aggressive-brazilian-scrapers.yaml (0.00s) --- PASS: TestImportStatement/(data)/bots/ai-catchall.yaml (0.00s) --- PASS: TestImportStatement/(data)/bots/ai-robots-txt.yaml (0.00s) --- PASS: TestImportStatement/(data)/bots/cloudflare-workers.yaml (0.00s) --- PASS: TestImportStatement/(data)/bots/headless-browsers.yaml (0.00s) --- PASS: TestImportStatement/(data)/bots/irc-bots/archlinux-phrik.yaml (0.00s) --- PASS: TestImportStatement/(data)/bots/irc-bots/gentoo-chat.yaml (0.00s) --- PASS: TestImportStatement/(data)/bots/us-ai-scraper.yaml (0.00s) --- PASS: TestImportStatement/(data)/common/allow-api-like.yaml (0.00s) --- PASS: TestImportStatement/(data)/common/allow-private-addresses.yaml (0.00s) --- PASS: TestImportStatement/(data)/common/json-api.yaml (0.00s) --- PASS: TestImportStatement/(data)/common/keep-internet-working.yaml (0.00s) --- PASS: TestImportStatement/(data)/common/rfc-violations.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/_allow-good.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/ai-search.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/ai-training.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/applebot.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/bingbot.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/duckduckbot.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/googlebot.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/internet-archive.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/kagibot.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/marginalia.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/mojeekbot.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/openai-gptbot.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/openai-searchbot.yaml (0.00s) --- PASS: TestImportStatement/(data)/crawlers/qwantbot.yaml (0.00s) --- PASS: TestImportStatement/(data)/meta/ai-block-aggressive.yaml (0.00s) --- PASS: TestImportStatement/(data)/meta/ai-block-moderate.yaml (0.00s) --- PASS: TestImportStatement/(data)/meta/ai-block-permissive.yaml (0.00s) === RUN TestConfigValidBad === RUN TestConfigValidBad/badregexes.json config_test.go:319: config is not valid: bot 0: config: bot entry for "path-bad" is not valid: config.Bot: invalid path regex error parsing regexp: missing closing ): `a(b` bot 1: config: bot entry for "user-agent-bad" is not valid: config.Bot: invalid user agent regex error parsing regexp: missing closing ): `a(b` bot 2: config: bot entry for "headers-bad" is not valid: config.Bot: must set either user_agent_regex, path_regex, headers_regex, or remote_addresses === RUN TestConfigValidBad/badregexes.yaml config_test.go:319: config is not valid: bot 0: config: bot entry for "path-bad" is not valid: config.Bot: invalid path regex error parsing regexp: missing closing ): `a(b` bot 1: config: bot entry for "user-agent-bad" is not valid: config.Bot: invalid user agent regex error parsing regexp: missing closing ): `a(b` === RUN TestConfigValidBad/import_and_bot.json config_test.go:319: config is not valid: bot 0: config.BotOrImport: can't set bot rules and import values at the same time === RUN TestConfigValidBad/import_and_bot.yaml config_test.go:319: config is not valid: bot 0: config.BotOrImport: can't set bot rules and import values at the same time === RUN TestConfigValidBad/import_invalid_file.json config_test.go:319: config is not valid: bot 0: config.ImportStatement: invalid source file: (data)/does-not-exist-fake-file.yaml: open does-not-exist-fake-file.yaml: file does not exist === RUN TestConfigValidBad/import_invalid_file.yaml config_test.go:319: config is not valid: bot 0: config.ImportStatement: invalid source file: (data)/does-not-exist-fake-file.yaml: open does-not-exist-fake-file.yaml: file does not exist === RUN TestConfigValidBad/impressum-no-footer.yaml config_test.go:319: errors validating policy config testdata/bad/impressum-no-footer.yaml: config: missing value: impressum footer must be defined === RUN TestConfigValidBad/impressum-no-page-contents.yaml config_test.go:319: errors validating policy config testdata/bad/impressum-no-page-contents.yaml: config: missing value: impressum page title must be defined config: missing value: impressum body title must be defined === RUN TestConfigValidBad/invalid.json config_test.go:319: config is not valid: bot 0: config.BotOrImport: rule definition is invalid, you must set either bot rules or an import statement, not both === RUN TestConfigValidBad/invalid.yaml config_test.go:319: config is not valid: config: must define at least one (1) bot rule === RUN TestConfigValidBad/multiple_expression_types.json config_test.go:319: config is not valid: bot 0: config: bot entry for "multiple-expression-types" is not valid: config: expression block can't contain multiple expression types === RUN TestConfigValidBad/multiple_expression_types.yaml config_test.go:319: config is not valid: bot 0: config: bot entry for "multiple-expression-types" is not valid: config: expression block can't contain multiple expression types === RUN TestConfigValidBad/nobots.json config_test.go:319: config is not valid: config: must define at least one (1) bot rule === RUN TestConfigValidBad/nobots.yaml config_test.go:319: config is not valid: config: must define at least one (1) bot rule === RUN TestConfigValidBad/opengraph_bad_ttl.yaml config_test.go:319: config is not valid: config.OpenGraph: invalid OpenGraph configuration config.OpenGraph: ttl does not parse as a Duration, see https://pkg.go.dev/time#ParseDuration (formatted like 5m -> 5 minutes, 2h -> 2 hours, etc): ParseDuration("taco") returned: time: invalid duration "taco" === RUN TestConfigValidBad/regex_ends_newline.json config_test.go:319: config is not valid: bot 0: config: bot entry for "user-agent-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): user agent regex: "Mozilla\n" bot 1: config: bot entry for "path-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): path regex: "^/evil/.*$\n" bot 2: config: bot entry for "headers-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): header CF-Worker regex: ".*\n" === RUN TestConfigValidBad/regex_ends_newline.yaml config_test.go:319: config is not valid: bot 0: config: bot entry for "user-agent-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): user agent regex: "Mozilla\n" bot 1: config: bot entry for "path-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): path regex: "^/evil/.*$\n" bot 2: config: bot entry for "headers-ends-newline" is not valid: config.Bot: regular expression ends with newline (try >- instead of > in yaml): header CF-Worker regex: ".*\n" === RUN TestConfigValidBad/status-codes-0.json config_test.go:319: config is not valid: status codes not valid: config.StatusCode: status code not valid, must be between 100 and 599: challenge is 0 config.StatusCode: status code not valid, must be between 100 and 599: deny is 0 === RUN TestConfigValidBad/status-codes-0.yaml config_test.go:319: config is not valid: status codes not valid: config.StatusCode: status code not valid, must be between 100 and 599: challenge is 0 config.StatusCode: status code not valid, must be between 100 and 599: deny is 0 === RUN TestConfigValidBad/threshold-challenge-without-challenge.yaml config_test.go:319: config is not valid: threshold 0: config: threshold entry for "extreme-suspicion" is not valid: config.Threshold: a threshold cannot have the WEIGH action === RUN TestConfigValidBad/thresholds.yaml config_test.go:319: config is not valid: threshold 0: config: threshold entry for "extreme-suspicion" is not valid: config.Threshold: a threshold cannot have the WEIGH action === RUN TestConfigValidBad/unparseable.json config_test.go:319: can't parse policy config YAML testdata/bad/unparseable.json: error converting YAML to JSON: yaml: did not find expected node content === RUN TestConfigValidBad/unparseable.yaml config_test.go:319: can't parse policy config YAML testdata/bad/unparseable.yaml: error converting YAML to JSON: yaml: did not find expected node content --- PASS: TestConfigValidBad (0.00s) --- PASS: TestConfigValidBad/badregexes.json (0.00s) --- PASS: TestConfigValidBad/badregexes.yaml (0.00s) --- PASS: TestConfigValidBad/import_and_bot.json (0.00s) --- PASS: TestConfigValidBad/import_and_bot.yaml (0.00s) --- PASS: TestConfigValidBad/import_invalid_file.json (0.00s) --- PASS: TestConfigValidBad/import_invalid_file.yaml (0.00s) --- PASS: TestConfigValidBad/impressum-no-footer.yaml (0.00s) --- PASS: TestConfigValidBad/impressum-no-page-contents.yaml (0.00s) --- PASS: TestConfigValidBad/invalid.json (0.00s) --- PASS: TestConfigValidBad/invalid.yaml (0.00s) --- PASS: TestConfigValidBad/multiple_expression_types.json (0.00s) --- PASS: TestConfigValidBad/multiple_expression_types.yaml (0.00s) --- PASS: TestConfigValidBad/nobots.json (0.00s) --- PASS: TestConfigValidBad/nobots.yaml (0.00s) --- PASS: TestConfigValidBad/opengraph_bad_ttl.yaml (0.00s) --- PASS: TestConfigValidBad/regex_ends_newline.json (0.00s) --- PASS: TestConfigValidBad/regex_ends_newline.yaml (0.00s) --- PASS: TestConfigValidBad/status-codes-0.json (0.00s) --- PASS: TestConfigValidBad/status-codes-0.yaml (0.00s) --- PASS: TestConfigValidBad/threshold-challenge-without-challenge.yaml (0.00s) --- PASS: TestConfigValidBad/thresholds.yaml (0.00s) --- PASS: TestConfigValidBad/unparseable.json (0.00s) --- PASS: TestConfigValidBad/unparseable.yaml (0.00s) === RUN TestBotConfigZero --- PASS: TestBotConfigZero (0.00s) === RUN TestExpressionOrListMarshalJSON === RUN TestExpressionOrListMarshalJSON/single_expression === RUN TestExpressionOrListMarshalJSON/all === RUN TestExpressionOrListMarshalJSON/all_one === RUN TestExpressionOrListMarshalJSON/any === RUN TestExpressionOrListMarshalJSON/any_one --- PASS: TestExpressionOrListMarshalJSON (0.00s) --- PASS: TestExpressionOrListMarshalJSON/single_expression (0.00s) --- PASS: TestExpressionOrListMarshalJSON/all (0.00s) --- PASS: TestExpressionOrListMarshalJSON/all_one (0.00s) --- PASS: TestExpressionOrListMarshalJSON/any (0.00s) --- PASS: TestExpressionOrListMarshalJSON/any_one (0.00s) === RUN TestExpressionOrListMarshalYAML === RUN TestExpressionOrListMarshalYAML/single_expression === RUN TestExpressionOrListMarshalYAML/all === RUN TestExpressionOrListMarshalYAML/all_one === RUN TestExpressionOrListMarshalYAML/any === RUN TestExpressionOrListMarshalYAML/any_one --- PASS: TestExpressionOrListMarshalYAML (0.00s) --- PASS: TestExpressionOrListMarshalYAML/single_expression (0.00s) --- PASS: TestExpressionOrListMarshalYAML/all (0.00s) --- PASS: TestExpressionOrListMarshalYAML/all_one (0.00s) --- PASS: TestExpressionOrListMarshalYAML/any (0.00s) --- PASS: TestExpressionOrListMarshalYAML/any_one (0.00s) === RUN TestExpressionOrListUnmarshalJSON === RUN TestExpressionOrListUnmarshalJSON/simple === RUN TestExpressionOrListUnmarshalJSON/object-and === RUN TestExpressionOrListUnmarshalJSON/object-or === RUN TestExpressionOrListUnmarshalJSON/both-or-and === RUN TestExpressionOrListUnmarshalJSON/expression-empty --- PASS: TestExpressionOrListUnmarshalJSON (0.00s) --- PASS: TestExpressionOrListUnmarshalJSON/simple (0.00s) --- PASS: TestExpressionOrListUnmarshalJSON/object-and (0.00s) --- PASS: TestExpressionOrListUnmarshalJSON/object-or (0.00s) --- PASS: TestExpressionOrListUnmarshalJSON/both-or-and (0.00s) --- PASS: TestExpressionOrListUnmarshalJSON/expression-empty (0.00s) === RUN TestExpressionOrListString === RUN TestExpressionOrListString/single_expression === RUN TestExpressionOrListString/all === RUN TestExpressionOrListString/all_with_&& === RUN TestExpressionOrListString/any === RUN TestExpressionOrListString/any_with_|| --- PASS: TestExpressionOrListString (0.00s) --- PASS: TestExpressionOrListString/single_expression (0.00s) --- PASS: TestExpressionOrListString/all (0.00s) --- PASS: TestExpressionOrListString/all_with_&& (0.00s) --- PASS: TestExpressionOrListString/any (0.00s) --- PASS: TestExpressionOrListString/any_with_|| (0.00s) === RUN TestGeoIPValid === RUN TestGeoIPValid/basic_valid === RUN TestGeoIPValid/invalid_country --- PASS: TestGeoIPValid (0.00s) --- PASS: TestGeoIPValid/basic_valid (0.00s) --- PASS: TestGeoIPValid/invalid_country (0.00s) === RUN TestImpressumValid === RUN TestImpressumValid/basic_happy_path === RUN TestImpressumValid/no_footer === RUN TestImpressumValid/page_not_valid --- PASS: TestImpressumValid (0.00s) --- PASS: TestImpressumValid/basic_happy_path (0.00s) --- PASS: TestImpressumValid/no_footer (0.00s) --- PASS: TestImpressumValid/page_not_valid (0.00s) === RUN TestOpenGraphFileConfigValid === RUN TestOpenGraphFileConfigValid/basic_happy_path === RUN TestOpenGraphFileConfigValid/basic_happy_path_with_default === RUN TestOpenGraphFileConfigValid/invalid_time_duration === RUN TestOpenGraphFileConfigValid/missing_og:title_in_defaults --- PASS: TestOpenGraphFileConfigValid (0.00s) --- PASS: TestOpenGraphFileConfigValid/basic_happy_path (0.00s) --- PASS: TestOpenGraphFileConfigValid/basic_happy_path_with_default (0.00s) --- PASS: TestOpenGraphFileConfigValid/invalid_time_duration (0.00s) --- PASS: TestOpenGraphFileConfigValid/missing_og:title_in_defaults (0.00s) === RUN TestThresholdValid === RUN TestThresholdValid/basic_allow === RUN TestThresholdValid/basic_challenge === RUN TestThresholdValid/no_name === RUN TestThresholdValid/no_expression === RUN TestThresholdValid/invalid_expression === RUN TestThresholdValid/invalid_action === RUN TestThresholdValid/challenge_action_but_no_challenge === RUN TestThresholdValid/challenge_invalid --- PASS: TestThresholdValid (0.00s) --- PASS: TestThresholdValid/basic_allow (0.00s) --- PASS: TestThresholdValid/basic_challenge (0.00s) --- PASS: TestThresholdValid/no_name (0.00s) --- PASS: TestThresholdValid/no_expression (0.00s) --- PASS: TestThresholdValid/invalid_expression (0.00s) --- PASS: TestThresholdValid/invalid_action (0.00s) --- PASS: TestThresholdValid/challenge_action_but_no_challenge (0.00s) --- PASS: TestThresholdValid/challenge_invalid (0.00s) === RUN TestDefaultThresholdsValid === RUN TestDefaultThresholdsValid/0_legacy-anubis-behaviour --- PASS: TestDefaultThresholdsValid (0.00s) --- PASS: TestDefaultThresholdsValid/0_legacy-anubis-behaviour (0.00s) === RUN TestLoadActuallyLoadsThresholds --- PASS: TestLoadActuallyLoadsThresholds (0.00s) PASS ok github.com/TecharoHQ/anubis/lib/policy/config 0.029s === RUN TestHTTPHeaders === RUN TestHTTPHeaders/contains-existing-header === RUN TestHTTPHeaders/not-contains-missing-header === RUN TestHTTPHeaders/get-existing-header === RUN TestHTTPHeaders/not-get-missing-header --- PASS: TestHTTPHeaders (0.00s) --- PASS: TestHTTPHeaders/contains-existing-header (0.00s) --- PASS: TestHTTPHeaders/not-contains-missing-header (0.00s) --- PASS: TestHTTPHeaders/get-existing-header (0.00s) --- PASS: TestHTTPHeaders/not-get-missing-header (0.00s) === RUN TestURLValues === RUN TestURLValues/contains-existing-key === RUN TestURLValues/not-contains-missing-key === RUN TestURLValues/get-existing-key === RUN TestURLValues/not-get-missing-key --- PASS: TestURLValues (0.00s) --- PASS: TestURLValues/contains-existing-key (0.00s) --- PASS: TestURLValues/not-contains-missing-key (0.00s) --- PASS: TestURLValues/get-existing-key (0.00s) --- PASS: TestURLValues/not-get-missing-key (0.00s) PASS ok github.com/TecharoHQ/anubis/lib/policy/expressions 0.019s ? github.com/TecharoHQ/anubis/web [no test files] ? github.com/TecharoHQ/anubis/xess [no test files] >>> anubis: Entering fakeroot... >>> anubis-doc*: Running split function doc... 'usr/share/licenses' -> '/home/buildozer/aports/testing/anubis/pkg/anubis-doc/usr/share/licenses' >>> anubis-doc*: Preparing subpackage anubis-doc... >>> anubis-doc*: Running postcheck for anubis-doc >>> anubis-openrc*: Running split function openrc... 'etc/conf.d' -> '/home/buildozer/aports/testing/anubis/pkg/anubis-openrc/etc/conf.d' 'etc/init.d' -> '/home/buildozer/aports/testing/anubis/pkg/anubis-openrc/etc/init.d' >>> anubis-openrc*: Preparing subpackage anubis-openrc... >>> anubis-openrc*: Running postcheck for anubis-openrc >>> anubis*: Running postcheck for anubis >>> anubis*: Preparing package anubis... >>> anubis*: Stripping binaries >>> anubis-doc*: Scanning shared objects >>> anubis-openrc*: Scanning shared objects >>> anubis*: Scanning shared objects >>> anubis-doc*: Tracing dependencies... >>> anubis-doc*: Package size: 1.0 KB >>> anubis-doc*: Compressing data... >>> anubis-doc*: Create checksum... >>> anubis-doc*: Create anubis-doc-1.20.0-r1.apk >>> anubis-openrc*: Tracing dependencies... >>> anubis-openrc*: Package size: 294.0 B >>> anubis-openrc*: Compressing data... >>> anubis-openrc*: Create checksum... >>> anubis-openrc*: Create anubis-openrc-1.20.0-r1.apk >>> anubis*: Tracing dependencies... so:libc.musl-aarch64.so.1 >>> anubis*: Package size: 22.0 MB >>> anubis*: Compressing data... >>> anubis*: Create checksum... >>> anubis*: Create anubis-1.20.0-r1.apk >>> anubis: Build complete at Thu, 10 Jul 2025 15:47:31 +0000 elapsed time 0h 0m 13s >>> anubis: Cleaning up srcdir >>> anubis: Cleaning up pkgdir >>> anubis: Uninstalling dependencies... (1/2) Purging .makedepends-anubis (20250710.154720) (2/2) Purging go (1.24.5-r1) busybox-1.37.0-r19.trigger: Executing script... OK: 399 MiB in 108 packages >>> anubis: Updating the testing/aarch64 repository index... >>> anubis: Signing the index...