Files
shadowsocks-libev/tests/test_rule.c
Max LvandClaude Opus 4.6 e36d03b5f6 Migrate from PCRE to PCRE2
Replace legacy PCRE (libpcre3) with PCRE2 (libpcre2-8). PCRE1 has been
end-of-life since 2021.

- src/rule.h: use pcre2_code and pcre2_match_data types
- src/rule.c: pcre_compile -> pcre2_compile, pcre_exec -> pcre2_match,
  pcre_free -> pcre2_code_free, with proper error message retrieval
- cmake/FindPCRE.cmake -> cmake/FindPCRE2.cmake: find libpcre2-8 via
  pkg-config, pcre2-config, or manual search
- Update all CMakeLists.txt, config.h.cmake, configure.cmake, README.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 16:40:27 +08:00

127 lines
2.7 KiB
C

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <assert.h>
#include <string.h>
#include <stdlib.h>
int verbose = 0;
#include "rule.h"
#include "utils.h"
static void
test_new_rule(void)
{
rule_t *rule = new_rule();
assert(rule != NULL);
assert(rule->pattern == NULL);
assert(rule->pattern_re == NULL);
free(rule);
}
static void
test_accept_rule_arg(void)
{
rule_t *rule = new_rule();
assert(rule != NULL);
int ret = accept_rule_arg(rule, "^example\\.com$");
assert(ret == 1);
assert(rule->pattern != NULL);
assert(strcmp(rule->pattern, "^example\\.com$") == 0);
/* Second call should fail - pattern already set */
ret = accept_rule_arg(rule, "another");
assert(ret == -1);
(void)ret;
free(rule->pattern);
free(rule);
}
static void
test_init_rule(void)
{
rule_t *rule = new_rule();
accept_rule_arg(rule, "^test.*$");
int ret = init_rule(rule);
assert(ret == 1);
(void)ret;
assert(rule->pattern_re != NULL);
if (rule->match_data)
pcre2_match_data_free(rule->match_data);
if (rule->pattern_re)
pcre2_code_free(rule->pattern_re);
free(rule->pattern);
free(rule);
}
static void
test_init_rule_invalid(void)
{
rule_t *rule = new_rule();
accept_rule_arg(rule, "[invalid"); /* Unclosed bracket */
int ret = init_rule(rule);
assert(ret == 0); /* Should fail */
(void)ret;
free(rule->pattern);
free(rule);
}
static void
test_lookup_rule(void)
{
struct cork_dllist rules;
cork_dllist_init(&rules);
rule_t *rule1 = new_rule();
accept_rule_arg(rule1, "^google\\.com$");
init_rule(rule1);
add_rule(&rules, rule1);
rule_t *rule2 = new_rule();
accept_rule_arg(rule2, ".*\\.example\\.com$");
init_rule(rule2);
add_rule(&rules, rule2);
/* Should match rule1 */
rule_t *found = lookup_rule(&rules, "google.com", 10);
assert(found == rule1);
/* Should match rule2 */
found = lookup_rule(&rules, "sub.example.com", 15);
assert(found == rule2);
/* Should not match */
found = lookup_rule(&rules, "other.net", 9);
assert(found == NULL);
(void)found;
/* Clean up */
if (rule1->match_data) pcre2_match_data_free(rule1->match_data);
if (rule1->pattern_re) pcre2_code_free(rule1->pattern_re);
free(rule1->pattern);
free(rule1);
if (rule2->match_data) pcre2_match_data_free(rule2->match_data);
if (rule2->pattern_re) pcre2_code_free(rule2->pattern_re);
free(rule2->pattern);
free(rule2);
}
int
main(void)
{
test_new_rule();
test_accept_rule_arg();
test_init_rule();
test_init_rule_invalid();
test_lookup_rule();
return 0;
}