blob: 7ebc01be54629eeca248fd15b08e2d1caf144410 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use {
crate::{
parse::{PackageName, PackageVariant},
RelativePackageUrl,
},
proptest::prelude::*,
};
/// Valid characters for a Fuchsia package path. These characters are any unicode character,
/// except for '/', '\0', '.', and '\n'.
// TODO(https://fxbug.dev/42096516) allow newline once meta/contents supports it in blob paths
pub(crate) const ANY_UNICODE_EXCEPT_SLASH_NULL_DOT_OR_NEWLINE: &str = "[^/\0\\.\n]";
prop_compose! {
pub(crate) fn random_package_segment()
(s in r"[-0-9a-z\._]{1, 255}"
.prop_filter(
"Segments of '.' and '..' are not allowed",
|s| s != "." && s != ".."
)
)
-> String {
s
}
}
prop_compose! {
pub fn random_package_name()(s in random_package_segment()) -> PackageName {
s.parse().unwrap()
}
}
prop_compose! {
pub fn random_package_variant()(s in random_package_segment()) -> PackageVariant {
s.parse().unwrap()
}
}
prop_compose! {
fn always_valid_resource_path_char()(c in ANY_UNICODE_EXCEPT_SLASH_NULL_DOT_OR_NEWLINE) -> String {
c
}
}
prop_compose! {
pub fn random_relative_package_url()(s in random_package_segment()) -> RelativePackageUrl {
s.parse().unwrap()
}
}
prop_compose! {
pub(crate) fn always_valid_resource_path_chars
(min: usize, max: usize)
(s in prop::collection::vec(always_valid_resource_path_char(), min..max)) -> String {
s.join("")
}
}
prop_compose! {
pub fn random_resource_path
(min: usize, max: usize)
(s in prop::collection::vec(always_valid_resource_path_chars(1, 4), min..max))
-> String
{
s.join("/")
}
}
#[cfg(test)]
prop_compose! {
pub(crate) fn random_resource_path_with_regex_segment_string
(max_segments: usize, inner: String)
(vec in prop::collection::vec(
always_valid_resource_path_chars(1, 3), 3..max_segments),
inner in prop::string::string_regex(inner.as_str()).unwrap())
(index in ..vec.len(),
inner in Just(inner),
vec in Just(vec))-> String
{
let mut vec = vec;
vec[index] = inner;
vec.join("/")
}
}
#[cfg(test)]
prop_compose! {
pub(crate) fn random_resource_path_with_regex_segment_str
(max_segments: usize, inner: &'static str)
(s in random_resource_path_with_regex_segment_string(
max_segments, inner.to_string())) -> String
{
s
}
}