@@ -25,45 +25,69 @@ std::string bytesToAlphanumeric(const std::string& source) {
2525 return result;
2626}
2727
28+ void exercise_result (auto result) {
29+ (void )result.get_protocol ();
30+ (void )result.get_username ();
31+ (void )result.get_password ();
32+ (void )result.get_hostname ();
33+ (void )result.get_port ();
34+ (void )result.get_pathname ();
35+ (void )result.get_search ();
36+ (void )result.get_hash ();
37+ (void )result.ignore_case ();
38+ (void )result.has_regexp_groups ();
39+ }
40+
2841extern " C" int LLVMFuzzerTestOneInput (const uint8_t * data, size_t size) {
2942 FuzzedDataProvider fdp (data, size);
3043 // We do not want to trigger arbitrary regex matching.
31- std::string source =
44+ std::string source_1 =
3245 " /" + bytesToAlphanumeric (fdp.ConsumeRandomLengthString (50 )) + " /" +
3346 bytesToAlphanumeric (fdp.ConsumeRandomLengthString (50 ));
34- std::string base_source =
47+ std::string base_source_1 =
3548 " /" + bytesToAlphanumeric (fdp.ConsumeRandomLengthString (50 )) + " /" +
3649 bytesToAlphanumeric (fdp.ConsumeRandomLengthString (50 ));
3750
38- // Without base or options
39- auto result =
40- ada::parse_url_pattern<regex_provider>(source, nullptr , nullptr );
41- (void )result;
42-
43- // Testing with base_url
44- std::string_view base_source_view (base_source.data (), base_source.length ());
45- auto result_with_base = ada::parse_url_pattern<regex_provider>(
46- source, &base_source_view, nullptr );
47- (void )result_with_base;
48-
49- // Testing with base_url and options
50- ada::url_pattern_options options{.ignore_case = true };
51- auto result_with_base_and_options = ada::parse_url_pattern<regex_provider>(
52- source, &base_source_view, &options);
53- (void )result_with_base_and_options;
54-
55- // Testing with url_pattern_init and base url.
56- ada::url_pattern_init init{.protocol = source,
57- .username = source,
58- .password = source,
59- .hostname = source,
60- .port = source,
61- .pathname = source,
62- .search = source,
63- .hash = source};
64- auto result_with_init =
65- ada::parse_url_pattern<regex_provider>(init, &base_source_view, nullptr );
66- (void )result_with_init;
51+ std::string source_2 = " https://ada-url.com/*" ;
52+ std::string base_source_2 = " https://ada-url.com" ;
53+
54+ std::array<std::pair<std::string, std::string>, 2 > sources = {{
55+ {source_1, base_source_1},
56+ {source_2, base_source_2},
57+ }};
58+
59+ for (const auto & [source, base_source] : sources) {
60+ // Without base or options
61+ auto result =
62+ ada::parse_url_pattern<regex_provider>(source, nullptr , nullptr );
63+ if (result) exercise_result (*result);
64+
65+ // Testing with base_url
66+ std::string_view base_source_view (base_source.data (), base_source.length ());
67+ auto result_with_base = ada::parse_url_pattern<regex_provider>(
68+ source, &base_source_view, nullptr );
69+ if (result_with_base) exercise_result (*result_with_base);
70+
71+ // Testing with base_url and options
72+ ada::url_pattern_options options{.ignore_case = fdp.ConsumeBool ()};
73+ auto result_with_base_and_options = ada::parse_url_pattern<regex_provider>(
74+ source, &base_source_view, &options);
75+ if (result_with_base_and_options)
76+ exercise_result (*result_with_base_and_options);
77+
78+ // Testing with url_pattern_init and base url.
79+ ada::url_pattern_init init{.protocol = source,
80+ .username = source,
81+ .password = source,
82+ .hostname = source,
83+ .port = source,
84+ .pathname = source,
85+ .search = source,
86+ .hash = source};
87+ auto result_with_init = ada::parse_url_pattern<regex_provider>(
88+ init, &base_source_view, nullptr );
89+ if (result_with_init) exercise_result (*result_with_init);
90+ }
6791
6892 return 0 ;
6993}
0 commit comments