@@ -25,45 +25,69 @@ std::string bytesToAlphanumeric(const std::string& source) {
25
25
return result;
26
26
}
27
27
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
+
28
41
extern " C" int LLVMFuzzerTestOneInput (const uint8_t * data, size_t size) {
29
42
FuzzedDataProvider fdp (data, size);
30
43
// We do not want to trigger arbitrary regex matching.
31
- std::string source =
44
+ std::string source_1 =
32
45
" /" + bytesToAlphanumeric (fdp.ConsumeRandomLengthString (50 )) + " /" +
33
46
bytesToAlphanumeric (fdp.ConsumeRandomLengthString (50 ));
34
- std::string base_source =
47
+ std::string base_source_1 =
35
48
" /" + bytesToAlphanumeric (fdp.ConsumeRandomLengthString (50 )) + " /" +
36
49
bytesToAlphanumeric (fdp.ConsumeRandomLengthString (50 ));
37
50
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
+ }
67
91
68
92
return 0 ;
69
93
}
0 commit comments