mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-04 17:13:57 +00:00
Bundle pinned offline dependencies, remove libcork/libipset and submodule requirements, and add portable runtime helpers with relocatable static/shared library installations.
Add Clang static build validation for Linux/musl, macOS and Windows, real TCP/UDP and SIP003 interoperability coverage, and recorded performance tradeoffs. All 21 hosted checks pass at the reviewed PR head 8d504e6218.
114 lines
2.2 KiB
C
114 lines
2.2 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(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);
|
|
|
|
free_rule(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(rule);
|
|
}
|
|
|
|
static void
|
|
test_lookup_rule(void)
|
|
{
|
|
struct ss_list rules;
|
|
ss_list_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 */
|
|
free_rule(rule1);
|
|
free_rule(rule2);
|
|
}
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
test_new_rule();
|
|
test_accept_rule_arg();
|
|
test_init_rule();
|
|
test_init_rule_invalid();
|
|
test_lookup_rule();
|
|
return 0;
|
|
}
|