Extend test coverage (#505)

* increase test coverage

* add error for compact sequence, add serialize test

* change imports

* add dns verifier tests

* disable codecov comments

* add tests to id conversion

* use actual fqdn

* rm unused line

* use checkout v4

* add support for multiple digests, extend testing

* add test for missing header, use oneshot where possible

* move tests

* add redis test

* add graphql tests

* order tests

* up

* add decode test

* add encode and serialise tests, use btreeset for determinism

* test to_owned impl

* rename test
This commit is contained in:
Aumetra Weisman 2024-03-22 00:18:23 +01:00 committed by GitHub
parent b023a12b68
commit de7a7fd684
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
51 changed files with 871 additions and 356 deletions

View File

@ -36,7 +36,7 @@ jobs:
--health-retries 5
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Install cargo-nextest
uses: taiki-e/install-action@nextest
@ -50,6 +50,5 @@ jobs:
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
#token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos
files: lcov.info
fail_ci_if_error: true

377
Cargo.lock generated
View File

@ -47,16 +47,15 @@ dependencies = [
"cfg-if",
"getrandom 0.2.12",
"once_cell",
"serde",
"version_check",
"zerocopy",
]
[[package]]
name = "aho-corasick"
version = "1.1.2"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
@ -860,9 +859,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.4.2"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
[[package]]
name = "bitflags_serde_shim"
@ -938,7 +937,7 @@ dependencies = [
"async-task",
"fastrand 2.0.1",
"futures-io",
"futures-lite 2.2.0",
"futures-lite 2.3.0",
"piper",
"tracing",
]
@ -1069,9 +1068,9 @@ dependencies = [
[[package]]
name = "cap-fs-ext"
version = "2.0.1"
version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88e341d15ac1029aadce600be764a1a1edafe40e03cde23285bc1d261b3a4866"
checksum = "769f8cd02eb04d57f14e2e371ebb533f96817f9b2525d73a5c72b61ca7973747"
dependencies = [
"cap-primitives",
"cap-std",
@ -1081,9 +1080,9 @@ dependencies = [
[[package]]
name = "cap-net-ext"
version = "2.0.1"
version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "434168fe6533055f0f4204039abe3ff6d7db338ef46872a5fa39e9d5ad5ab7a9"
checksum = "59ff6d3fb274292a9af283417e383afe6ded1fe66f6472d2c781216d3d80c218"
dependencies = [
"cap-primitives",
"cap-std",
@ -1093,9 +1092,9 @@ dependencies = [
[[package]]
name = "cap-primitives"
version = "2.0.1"
version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe16767ed8eee6d3f1f00d6a7576b81c226ab917eb54b96e5f77a5216ef67abb"
checksum = "90a0b44fc796b1a84535a63753d50ba3972c4db55c7255c186f79140e63d56d0"
dependencies = [
"ambient-authority",
"fs-set-times",
@ -1110,9 +1109,9 @@ dependencies = [
[[package]]
name = "cap-rand"
version = "2.0.1"
version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20e5695565f0cd7106bc3c7170323597540e772bb73e0be2cd2c662a0f8fa4ca"
checksum = "4327f08daac33a99bb03c54ae18c8f32c3ba31c728a33ddf683c6c6a5043de68"
dependencies = [
"ambient-authority",
"rand 0.8.5",
@ -1120,9 +1119,9 @@ dependencies = [
[[package]]
name = "cap-std"
version = "2.0.1"
version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "593db20e4c51f62d3284bae7ee718849c3214f93a3b94ea1899ad85ba119d330"
checksum = "266626ce180cf9709f317d0bf9754e3a5006359d87f4bf792f06c9c5f1b63c0f"
dependencies = [
"cap-primitives",
"io-extras",
@ -1132,9 +1131,9 @@ dependencies = [
[[package]]
name = "cap-time-ext"
version = "2.0.1"
version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03261630f291f425430a36f38c847828265bc928f517cdd2004c56f4b02f002b"
checksum = "e1353421ba83c19da60726e35db0a89abef984b3be183ff6f58c5b8084fcd0c5"
dependencies = [
"ambient-authority",
"cap-primitives",
@ -1301,7 +1300,7 @@ checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
[[package]]
name = "client-sdk-common"
version = "0.1.0"
source = "git+https://github.com/Lantern-chat/client-sdk-rs#a7b9db9d3794dfea50ad543769ec8396d6743114"
source = "git+https://github.com/Lantern-chat/client-sdk-rs#e9ba517b8e20b8289c6f314ee8401bb4fcb30293"
dependencies = [
"bitflags_serde_shim",
"rkyv",
@ -1468,18 +1467,18 @@ dependencies = [
[[package]]
name = "cranelift-bforest"
version = "0.105.3"
version = "0.106.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16d5521e2abca66bbb1ddeecbb6f6965c79160352ae1579b39f8c86183895c24"
checksum = "6a535eb1cf5a6003197dc569320c40c1cb2d2f97ef5d5348eebf067f20957381"
dependencies = [
"cranelift-entity",
]
[[package]]
name = "cranelift-codegen"
version = "0.105.3"
version = "0.106.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef40a4338a47506e832ac3e53f7f1375bc59351f049a8379ff736dd02565bd95"
checksum = "11b5066db32cec1492573827183af2142d2d88fe85a83cfc9e73f0f63d3788d4"
dependencies = [
"bumpalo",
"cranelift-bforest",
@ -1498,33 +1497,33 @@ dependencies = [
[[package]]
name = "cranelift-codegen-meta"
version = "0.105.3"
version = "0.106.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d24cd5d85985c070f73dfca07521d09086362d1590105ba44b0932bf33513b61"
checksum = "64942e5774308e835fbad4dd25f253105412c90324631910e1ec27963147bddb"
dependencies = [
"cranelift-codegen-shared",
]
[[package]]
name = "cranelift-codegen-shared"
version = "0.105.3"
version = "0.106.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0584c4363e3aa0a3c7cb98a778fbd5326a3709f117849a727da081d4051726c"
checksum = "c39c33db9a86dd6d8d04166a10c53deb477aeea3500eaaefca682e4eda9bb986"
[[package]]
name = "cranelift-control"
version = "0.105.3"
version = "0.106.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f25ecede098c6553fdba362a8e4c9ecb8d40138363bff47f9712db75be7f0571"
checksum = "4b7fc4937613aea3156a0538800a17bf56f345a5da2e79ae3df58488c93d867f"
dependencies = [
"arbitrary",
]
[[package]]
name = "cranelift-entity"
version = "0.105.3"
version = "0.106.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ea081a42f25dc4c5b248b87efdd87dcd3842a1050a37524ec5391e6172058cb"
checksum = "f85575e79a153ce1ddbfb7fe1813519b4bfe1eb200cc9c8353b45ad123ae4d36"
dependencies = [
"serde",
"serde_derive",
@ -1532,9 +1531,9 @@ dependencies = [
[[package]]
name = "cranelift-frontend"
version = "0.105.3"
version = "0.106.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9796e712f5af797e247784f7518e6b0a83a8907d73d51526982d86ecb3a58b68"
checksum = "bbc31d6c0ab2249fe0c21e988256b42f5f401ab2673b4fc40076c82a698bdfb9"
dependencies = [
"cranelift-codegen",
"log",
@ -1544,15 +1543,15 @@ dependencies = [
[[package]]
name = "cranelift-isle"
version = "0.105.3"
version = "0.106.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4a66ccad5782f15c80e9dd5af0df4acfe6e3eee98e8f7354a2e5c8ec3104bdd"
checksum = "dc14f37e3314c0e4c53779c2f46753bf242efff76ee9473757a1fff3b495ad37"
[[package]]
name = "cranelift-native"
version = "0.105.3"
version = "0.106.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "285e80df1d9b79ded9775b285df68b920a277b84f88a7228d2f5bc31fcdc58eb"
checksum = "2ea5375f76ab31f9800a23fb2b440810286a6f669a3eb467cdd7ff255ea64268"
dependencies = [
"cranelift-codegen",
"libc",
@ -1561,17 +1560,17 @@ dependencies = [
[[package]]
name = "cranelift-wasm"
version = "0.105.3"
version = "0.106.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4135b0ab01fd16aa8f8821196e9e2fe15953552ccaef8ba5153be0ced04ef757"
checksum = "79851dba01b1fa83fad95134aa27beca88dc4b027121d92ab19788582389dc5f"
dependencies = [
"cranelift-codegen",
"cranelift-entity",
"cranelift-frontend",
"itertools 0.10.5",
"itertools 0.12.1",
"log",
"smallvec",
"wasmparser 0.121.2",
"wasmparser",
"wasmtime-types",
]
@ -1763,7 +1762,7 @@ dependencies = [
"axum-core 0.4.3",
"blake3",
"cookie",
"futures",
"futures-test",
"hex-simd",
"http 1.1.0",
"pin-project-lite",
@ -1967,7 +1966,7 @@ version = "2.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03fc05c17098f21b89bc7d98fe1dd3cce2c11c2ad8e145f2a44fe08ed28eb559"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"byteorder",
"diesel_derives",
"itoa 1.0.10",
@ -2372,9 +2371,9 @@ dependencies = [
[[package]]
name = "fiat-crypto"
version = "0.2.6"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382"
checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f"
[[package]]
name = "finl_unicode"
@ -2524,9 +2523,9 @@ dependencies = [
[[package]]
name = "futures-lite"
version = "2.2.0"
version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba"
checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5"
dependencies = [
"futures-core",
"pin-project-lite",
@ -2555,6 +2554,23 @@ version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
[[package]]
name = "futures-test"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce388237b32ac42eca0df1ba55ed3bbda4eaf005d7d4b5dbc0b20ab962928ac9"
dependencies = [
"futures-core",
"futures-executor",
"futures-io",
"futures-macro",
"futures-sink",
"futures-task",
"futures-util",
"pin-project",
"pin-utils",
]
[[package]]
name = "futures-util"
version = "0.3.30"
@ -3679,7 +3695,7 @@ dependencies = [
"serde",
"smol_str",
"tokio",
"toml 0.8.11",
"toml 0.8.12",
]
[[package]]
@ -4370,9 +4386,9 @@ dependencies = [
[[package]]
name = "libz-sys"
version = "1.1.15"
version = "1.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "037731f5d3aaa87a5675e895b63ddff1a87624bc29f77004ea829809654e48f6"
checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9"
dependencies = [
"cc",
"libc",
@ -4473,7 +4489,7 @@ version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4629ff9c2deeb7aad9b2d0f379fc41937a02f3b739f007732c46af40339dee5"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"cfg-if",
"cssparser 0.27.2",
"encoding_rs",
@ -4829,7 +4845,6 @@ dependencies = [
name = "mrf-manifest"
version = "0.0.1-pre.5"
dependencies = [
"ahash 0.8.11",
"insta",
"leb128",
"miette",
@ -4839,8 +4854,9 @@ dependencies = [
"serde",
"serde_json",
"thiserror",
"wasm-encoder 0.201.0",
"wasmparser 0.201.0",
"wasm-encoder",
"wasmparser",
"wat",
]
[[package]]
@ -4851,14 +4867,14 @@ dependencies = [
"miette",
"mrf-manifest",
"serde_json",
"wasmparser 0.201.0",
"wasmparser",
]
[[package]]
name = "mrml"
version = "3.1.0"
version = "3.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70b2e3b2ec6b01dcced4bdc6f446c85d9a48cf7c995e357b3b086ec9ab310211"
checksum = "4b6f31e38fc879b2dbcca95fd0c03f15351e79e3abcdb8533216cc3bdf14afb5"
dependencies = [
"indexmap 2.2.5",
"itertools 0.12.1",
@ -4870,18 +4886,18 @@ dependencies = [
[[package]]
name = "mrml-common-macros"
version = "0.1.2"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c141a78933cb6151e19b1d3daacfd5d2903bc1caf96f6424b6eccc48ca8ce00f"
checksum = "8b99915c25e2b56916308ccd9ca090cb0759226271e5f3b8101e7bbdf7fb8d35"
dependencies = [
"syn 2.0.53",
]
[[package]]
name = "mrml-macros"
version = "0.1.2"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "573a6a8f4b79efc885ff5eaead81be779c8a948792d4bc5aea7979616a2141f2"
checksum = "a8abcf8dc56a7e0b082804f65ab6d3f542e6c93d1335053cd4ce7c4731f60494"
dependencies = [
"Inflector",
"mrml-common-macros",
@ -5885,7 +5901,7 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"lazy_static",
"num-traits",
"rand 0.8.5",
@ -5953,7 +5969,7 @@ version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"memchr",
"unicase",
]
@ -5964,7 +5980,7 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dce76ce678ffc8e5675b22aa1405de0b7037e2fdf8913fea40d1926c6fe1e6e7"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"memchr",
"pulldown-cmark-escape",
"unicase",
@ -6150,7 +6166,7 @@ version = "11.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
]
[[package]]
@ -6496,11 +6512,11 @@ dependencies = [
[[package]]
name = "rustix"
version = "0.38.31"
version = "0.38.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"
checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"errno",
"itoa 1.0.10",
"libc",
@ -6778,7 +6794,7 @@ version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4eb30575f3638fc8f6815f448d50cb1a2e255b0897985c8c59f4d37b72a07b06"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"cssparser 0.31.2",
"derive_more 0.99.17",
"fxhash",
@ -7063,9 +7079,9 @@ dependencies = [
[[package]]
name = "simd-json"
version = "0.13.8"
version = "0.13.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2faf8f101b9bc484337a6a6b0409cf76c139f2fb70a9e3aee6b6774be7bfbf76"
checksum = "b0b84c23a1066e1d650ebc99aa8fb9f8ed0ab96fd36e2e836173c92fc9fb29bc"
dependencies = [
"getrandom 0.2.12",
"halfbrown",
@ -7160,9 +7176,9 @@ dependencies = [
[[package]]
name = "smallvec"
version = "1.13.1"
version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
dependencies = [
"serde",
]
@ -7209,6 +7225,7 @@ dependencies = [
"diesel",
"redis",
"serde",
"serde_test",
"thiserror",
"uuid",
"uuid-simd",
@ -7436,11 +7453,11 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
[[package]]
name = "system-interface"
version = "0.26.1"
version = "0.27.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0682e006dd35771e392a6623ac180999a9a854b1d4a6c12fb2e804941c2b1f58"
checksum = "9aef1f9d4c1dbdd1cb3a63be9efd2f04d8ddbc919d46112982c76818ffc2f1a7"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"cap-fs-ext",
"cap-std",
"fd-lock",
@ -7809,14 +7826,14 @@ dependencies = [
[[package]]
name = "toml"
version = "0.8.11"
version = "0.8.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af06656561d28735e9c1cd63dfd57132c8155426aa6af24f36a00a351f88c48e"
checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3"
dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
"toml_edit 0.22.7",
"toml_edit 0.22.9",
]
[[package]]
@ -7843,9 +7860,9 @@ dependencies = [
[[package]]
name = "toml_edit"
version = "0.22.7"
version = "0.22.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "18769cd1cec395d70860ceb4d932812a0b4d06b1a4bb336745a4d21b9496e992"
checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4"
dependencies = [
"indexmap 2.2.5",
"serde",
@ -7912,7 +7929,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5"
dependencies = [
"async-compression",
"bitflags 2.4.2",
"bitflags 2.5.0",
"bytes",
"futures-core",
"futures-util",
@ -7941,7 +7958,7 @@ dependencies = [
"base64-simd",
"bytes",
"either",
"futures",
"futures-test",
"http 1.1.0",
"http-body 1.0.0",
"http-body-util",
@ -7985,7 +8002,7 @@ dependencies = [
name = "tower-x-clacks-overhead"
version = "0.0.1-pre.5"
dependencies = [
"futures",
"futures-test",
"http 1.1.0",
"itertools 0.12.1",
"pin-project-lite",
@ -8293,9 +8310,9 @@ dependencies = [
[[package]]
name = "uuid"
version = "1.7.0"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a"
checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0"
dependencies = [
"atomic",
"getrandom 0.2.12",
@ -8471,15 +8488,6 @@ version = "0.2.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
[[package]]
name = "wasm-encoder"
version = "0.41.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "972f97a5d8318f908dded23594188a90bcd09365986b1163e66d70170e5287ae"
dependencies = [
"leb128",
]
[[package]]
name = "wasm-encoder"
version = "0.201.0"
@ -8501,19 +8509,8 @@ dependencies = [
"serde_derive",
"serde_json",
"spdx",
"wasm-encoder 0.201.0",
"wasmparser 0.201.0",
]
[[package]]
name = "wasmparser"
version = "0.121.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9dbe55c8f9d0dbd25d9447a5a889ff90c0cc3feaa7395310d3d826b2c703eaab"
dependencies = [
"bitflags 2.4.2",
"indexmap 2.2.5",
"semver",
"wasm-encoder",
"wasmparser",
]
[[package]]
@ -8522,26 +8519,26 @@ version = "0.201.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84e5df6dba6c0d7fafc63a450f1738451ed7a0b52295d83e868218fa286bf708"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"indexmap 2.2.5",
"semver",
]
[[package]]
name = "wasmprinter"
version = "0.2.80"
version = "0.201.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60e73986a6b7fdfedb7c5bf9e7eb71135486507c8fbc4c0c42cffcb6532988b7"
checksum = "a67e66da702706ba08729a78e3c0079085f6bfcb1a62e4799e97bbf728c2c265"
dependencies = [
"anyhow",
"wasmparser 0.121.2",
"wasmparser",
]
[[package]]
name = "wasmtime"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8106d7d22d63d1bcb940e22dcc7b03e46f0fc8bfbaf2fd7b6cb8f448f9449774"
checksum = "6a08af88fa3d324cc5cf6d388d90ef396a787b3fb4bbd51ba185f8645dc0f02c"
dependencies = [
"addr2line",
"anyhow",
@ -8559,11 +8556,12 @@ dependencies = [
"paste",
"rayon",
"rustix",
"semver",
"serde",
"serde_derive",
"serde_json",
"target-lexicon",
"wasmparser 0.121.2",
"wasmparser",
"wasmtime-component-macro",
"wasmtime-component-util",
"wasmtime-cranelift",
@ -8571,24 +8569,25 @@ dependencies = [
"wasmtime-fiber",
"wasmtime-jit-icache-coherence",
"wasmtime-runtime",
"wasmtime-slab",
"wasmtime-winch",
"windows-sys 0.52.0",
]
[[package]]
name = "wasmtime-asm-macros"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b0cf02cea951ace34ee3b0e64b7f446c3519d1c95ad75bc5330f405e275ee8f"
checksum = "16cdbfcf28542bcda0b5fd68d44603e53e5ad126cbe7b9f25c130e1249fd8211"
dependencies = [
"cfg-if",
]
[[package]]
name = "wasmtime-component-macro"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d3786c0531565ec6c9852c0e46299f06cb6e4b58d36e30f3c234cfa69bde376"
checksum = "0cdcf690257c623506eeec3a502864b282aab0fdfd6981c1ebb63c7e98f4a23a"
dependencies = [
"anyhow",
"proc-macro2",
@ -8596,20 +8595,20 @@ dependencies = [
"syn 2.0.53",
"wasmtime-component-util",
"wasmtime-wit-bindgen",
"wit-parser 0.13.2",
"wit-parser",
]
[[package]]
name = "wasmtime-component-util"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81eae2ec98027ee0b3950da83bc320120a23087ac4d39b3d59201cb5ebf52777"
checksum = "ab3ae7bf66e2fae1e332ab3634f332d7422e878a6eecc47c8f8f78cc1f24e501"
[[package]]
name = "wasmtime-cranelift"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "595abdb067acdc812ab0f21d8d46d5aa4022392aa7c3e0632c20bff9ec49ffb4"
checksum = "67ea025c969a09117818732fa6f96848e858a7953d4659dab8081a6eea3c0523"
dependencies = [
"anyhow",
"cfg-if",
@ -8624,7 +8623,7 @@ dependencies = [
"object",
"target-lexicon",
"thiserror",
"wasmparser 0.121.2",
"wasmparser",
"wasmtime-cranelift-shared",
"wasmtime-environ",
"wasmtime-versioned-export-macros",
@ -8632,9 +8631,9 @@ dependencies = [
[[package]]
name = "wasmtime-cranelift-shared"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8c24c1fdea167b992d82ebe76471fd1cbe7b0b406bc72f9250f86353000134e"
checksum = "dcd6dd2f8d8d4860b384f61f89b597633a5b5f0943c546210e5084c5d321fe20"
dependencies = [
"anyhow",
"cranelift-codegen",
@ -8648,9 +8647,9 @@ dependencies = [
[[package]]
name = "wasmtime-environ"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3279d510005358141550d8a90a5fc989d7e81748e5759d582fe6bfdcbf074a04"
checksum = "7f60f3f717658dd77745de03b750d5852126e9be6dad465848c77f90387c44c9"
dependencies = [
"anyhow",
"bincode",
@ -8663,8 +8662,8 @@ dependencies = [
"serde_derive",
"target-lexicon",
"thiserror",
"wasm-encoder 0.41.2",
"wasmparser 0.121.2",
"wasm-encoder",
"wasmparser",
"wasmprinter",
"wasmtime-component-util",
"wasmtime-types",
@ -8672,9 +8671,9 @@ dependencies = [
[[package]]
name = "wasmtime-fiber"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b1df665f2117741d1265f5663b0d93068b18120c2c4b18b9faed49d00d92c31"
checksum = "bf8cd22ab1041bf0e54b6283e57824557902e4fed8b1f3a7eef29cbaba89eebf"
dependencies = [
"anyhow",
"cc",
@ -8687,9 +8686,9 @@ dependencies = [
[[package]]
name = "wasmtime-jit-icache-coherence"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "866634605089b4632b32226b54aa3670d72e1849f9fc425c7e50b3749c2e6df3"
checksum = "2796e4b4989db62899d2117e1e0258b839d088c044591b14e3a0396e7b3ae53a"
dependencies = [
"cfg-if",
"libc",
@ -8698,9 +8697,9 @@ dependencies = [
[[package]]
name = "wasmtime-runtime"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e11185c88cadf595d228f5ae4ff9b4badbf9ca98dcb37b0310c36e31fa74867f"
checksum = "4bf2b7745df452a4f41b9aab21d3f7ba1347b12da2fdc5241e59306127884a68"
dependencies = [
"anyhow",
"cc",
@ -8716,7 +8715,7 @@ dependencies = [
"psm",
"rustix",
"sptr",
"wasm-encoder 0.41.2",
"wasm-encoder",
"wasmtime-asm-macros",
"wasmtime-environ",
"wasmtime-fiber",
@ -8726,23 +8725,29 @@ dependencies = [
]
[[package]]
name = "wasmtime-types"
version = "18.0.3"
name = "wasmtime-slab"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f32377cbd827bee06fcb2f6bf97b0477fdcc86888bbe6db7b9cab8e644082e0a"
checksum = "83448ef600ad95977019ebaea84a5516fdbc9561d0a8e26b1e099351f993b527"
[[package]]
name = "wasmtime-types"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf6fe7ed3fd18ed4b1e4465fe5c8674acc9f03523fca5b1b9f975b2560cd741b"
dependencies = [
"cranelift-entity",
"serde",
"serde_derive",
"thiserror",
"wasmparser 0.121.2",
"wasmparser",
]
[[package]]
name = "wasmtime-versioned-export-macros"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ab8d7566d206c42f8cf1d4ac90c5e40d3582e8eabad9b3b67e9e73c61fc47a1"
checksum = "6d6d967f01032da7d4c6303da32f6a00d5efe1bac124b156e7342d8ace6ffdfc"
dependencies = [
"proc-macro2",
"quote",
@ -8751,13 +8756,13 @@ dependencies = [
[[package]]
name = "wasmtime-wasi"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ca912bda309188bd25ab7652c6654b34aacdf43047c716ee1cb685a28079078"
checksum = "371d828b6849ea06d598ae7dd1c316e8dd9e99b76f77d93d5886cb25c7f8e188"
dependencies = [
"anyhow",
"async-trait",
"bitflags 2.4.2",
"bitflags 2.5.0",
"bytes",
"cap-fs-ext",
"cap-net-ext",
@ -8768,7 +8773,6 @@ dependencies = [
"futures",
"io-extras",
"io-lifetimes",
"log",
"once_cell",
"rustix",
"system-interface",
@ -8782,16 +8786,16 @@ dependencies = [
[[package]]
name = "wasmtime-winch"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba5a97bfccc241d1769cef75eb16f472a893982704d5f3c9c71c431c1484344a"
checksum = "eb8b3fcbc455105760e4a2aa8ee3f39b8357183a62201383b3f72d4836ca2be8"
dependencies = [
"anyhow",
"cranelift-codegen",
"gimli",
"object",
"target-lexicon",
"wasmparser 0.121.2",
"wasmparser",
"wasmtime-cranelift-shared",
"wasmtime-environ",
"winch-codegen",
@ -8799,21 +8803,43 @@ dependencies = [
[[package]]
name = "wasmtime-wit-bindgen"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "faf2c76781a27e07802669f6f0e11eb4441546407eb65be60c3d862200988b92"
checksum = "96326c9800fb6c099f50d1bd2126d636fc2f96950e1675acf358c0f52516cd38"
dependencies = [
"anyhow",
"heck 0.4.1",
"indexmap 2.2.5",
"wit-parser 0.13.2",
"wit-parser",
]
[[package]]
name = "wasmtime-wmemcheck"
version = "18.0.3"
version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3847d969bd203b8cd239f89581e52432a0f00b8c5c9bc917be2fccd7542c4f2f"
checksum = "36bd91a4dc55af0bf55e9e2ab0ea13724cfb5c5a1acdf8873039769208f59490"
[[package]]
name = "wast"
version = "201.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ef6e1ef34d7da3e2b374fd2b1a9c0227aff6cad596e1b24df9b58d0f6222faa"
dependencies = [
"bumpalo",
"leb128",
"memchr",
"unicode-width",
"wasm-encoder",
]
[[package]]
name = "wat"
version = "1.201.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "453d5b37a45b98dee4f4cb68015fc73634d7883bbef1c65e6e9c78d454cf3f32"
dependencies = [
"wast",
]
[[package]]
name = "web-sys"
@ -8910,9 +8936,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "winch-codegen"
version = "0.16.3"
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e0bd4d6cac8d69525d475d0ce1e0801eb6f314d42e764a52bd497ed3cb9c371"
checksum = "d285c833af9453c037cd220765f86c5c9961e8906a815829107c8801d535b8e4"
dependencies = [
"anyhow",
"cranelift-codegen",
@ -8920,7 +8946,7 @@ dependencies = [
"regalloc2",
"smallvec",
"target-lexicon",
"wasmparser 0.121.2",
"wasmparser",
"wasmtime-environ",
]
@ -9099,7 +9125,7 @@ version = "0.36.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9643b83820c0cd246ecabe5fa454dd04ba4fa67996369466d0747472d337346"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"windows-sys 0.52.0",
]
@ -9109,7 +9135,7 @@ version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "288f992ea30e6b5c531b52cdd5f3be81c148554b09ea416f058d16556ba92c27"
dependencies = [
"bitflags 2.4.2",
"bitflags 2.5.0",
"wit-bindgen-rt",
"wit-bindgen-rust-macro",
]
@ -9121,7 +9147,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e85e72719ffbccf279359ad071497e47eb0675fe22106dea4ed2d8a7fcb60ba4"
dependencies = [
"anyhow",
"wit-parser 0.201.0",
"wit-parser",
]
[[package]]
@ -9165,33 +9191,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "421c0c848a0660a8c22e2fd217929a0191f14476b68962afd2af89fd22e39825"
dependencies = [
"anyhow",
"bitflags 2.4.2",
"bitflags 2.5.0",
"indexmap 2.2.5",
"log",
"serde",
"serde_derive",
"serde_json",
"wasm-encoder 0.201.0",
"wasm-encoder",
"wasm-metadata",
"wasmparser 0.201.0",
"wit-parser 0.201.0",
]
[[package]]
name = "wit-parser"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "316b36a9f0005f5aa4b03c39bc3728d045df136f8c13a73b7db4510dec725e08"
dependencies = [
"anyhow",
"id-arena",
"indexmap 2.2.5",
"log",
"semver",
"serde",
"serde_derive",
"serde_json",
"unicode-xid",
"wasmparser",
"wit-parser",
]
[[package]]
@ -9209,7 +9218,7 @@ dependencies = [
"serde_derive",
"serde_json",
"unicode-xid",
"wasmparser 0.201.0",
"wasmparser",
]
[[package]]

1
codecov.yml Normal file
View File

@ -0,0 +1 @@
comment: false

View File

@ -35,7 +35,7 @@ rsa = "0.9.6"
scoped-futures = "0.1.3"
serde = "1.0.197"
sha2 = "0.10.8"
simd-json = "0.13.8"
simd-json = "0.13.9"
speedy-uuid = { path = "../../lib/speedy-uuid" }
thiserror = "1.0.58"
tracing = "0.1.40"

View File

@ -14,7 +14,7 @@ redis = { version = "0.25.2", default-features = false, features = [
"tokio-comp",
] }
serde = "1.0.197"
simd-json = "0.13.8"
simd-json = "0.13.9"
thiserror = "1.0.58"
tracing = "0.1.40"
typed-builder = "0.18.1"

View File

@ -11,7 +11,7 @@ http = "1.1.0"
kitsune-http-client = { path = "../kitsune-http-client" }
serde = { version = "1.0.197", features = ["derive"] }
serde_urlencoded = "0.7.1"
simd-json = "0.13.8"
simd-json = "0.13.9"
strum = { version = "0.26.2", features = ["derive"] }
thiserror = "1.0.58"
typed-builder = "0.18.1"

View File

@ -11,7 +11,7 @@ miette = "7.2.0"
serde = { version = "1.0.197", features = ["derive"] }
smol_str = { version = "0.2.1", features = ["serde"] }
tokio = { version = "1.36.0", features = ["fs"] }
toml = { version = "0.8.11", default-features = false, features = ["parse"] }
toml = { version = "0.8.12", default-features = false, features = ["parse"] }
[lints]
workspace = true

View File

@ -30,7 +30,7 @@ num-traits = "0.2.18"
rustls = "=0.22.2"
rustls-native-certs = "0.7.0"
serde = { version = "1.0.197", features = ["derive"] }
simd-json = "0.13.8"
simd-json = "0.13.9"
speedy-uuid = { path = "../../lib/speedy-uuid", features = ["diesel"] }
thiserror = "1.0.58"
tokio = { version = "1.36.0", features = ["rt"] }

View File

@ -25,7 +25,7 @@ lettre = { version = "0.11.4", default-features = false, features = [
"tracing",
] }
miette = "7.2.0"
mrml = { version = "3.1.0", default-features = false, features = [
mrml = { version = "3.1.3", default-features = false, features = [
"orderedmap",
"parse",
"render",

View File

@ -26,7 +26,7 @@ kitsune-type = { path = "../kitsune-type" }
pin-project = "1.1.5"
serde = "1.0.197"
simdutf8 = { version = "0.1.4", features = ["aarch64_neon"] }
simd-json = "0.13.8"
simd-json = "0.13.9"
tower = { version = "0.4.13", features = ["util"] }
tower-http = { version = "0.5.2", features = [
# Explicitly exclude `zstd`

View File

@ -241,9 +241,8 @@ impl Client {
pub async fn execute(&self, req: Request<Body>) -> Result<Response> {
let req = self.prepare_request(req);
let mut ready_svc = self.inner.clone();
let ready_svc = ready_svc.ready().await.map_err(Error::new)?;
let response = ready_svc.call(req).await.map_err(Error::new)?;
let ready_svc = self.inner.clone();
let response = ready_svc.oneshot(req).await.map_err(Error::new)?;
Ok(Response { inner: response })
}

View File

@ -22,7 +22,7 @@ kitsune-util = { path = "../kitsune-util" }
mime = "0.3.17"
scoped-futures = "0.1.3"
serde = "1.0.197"
simd-json = "0.13.8"
simd-json = "0.13.9"
smol_str = "0.2.1"
speedy-uuid = { path = "../../lib/speedy-uuid" }
thiserror = "1.0.58"

View File

@ -13,7 +13,7 @@ just-retry = { path = "../../lib/just-retry" }
pin-project-lite = "0.2.13"
redis = { version = "0.25.2", features = ["connection-manager", "tokio-comp"] }
serde = "1.0.197"
simd-json = "0.13.8"
simd-json = "0.13.9"
tokio = { version = "1.36.0", features = ["macros", "rt", "sync"] }
tokio-stream = { version = "0.1.15", features = ["sync"] }
tracing = "0.1.40"

View File

@ -25,7 +25,7 @@ redis = { version = "0.25.2", default-features = false, features = [
"tokio-comp",
] }
serde = { version = "1.0.197", features = ["derive"] }
simd-json = "0.13.8"
simd-json = "0.13.9"
speedy-uuid = { path = "../../lib/speedy-uuid", features = ["serde"] }
thiserror = "1.0.58"
url = "2.5.0"

View File

@ -56,7 +56,7 @@ rsa = "0.9.6"
rusty-s3 = { version = "0.5.0", default-features = false }
scoped-futures = "0.1.3"
serde = "1.0.197"
simd-json = "0.13.8"
simd-json = "0.13.9"
smol_str = "0.2.1"
speedy-uuid = { path = "../../lib/speedy-uuid" }
thiserror = "1.0.58"

View File

@ -31,7 +31,7 @@ testcontainers-modules = { version = "0.3.5", features = [
] }
tokio = { version = "1.36.0", features = ["time"] }
url = "2.5.0"
uuid = { version = "1.7.0", features = ["v4", "fast-rng"] }
uuid = { version = "1.8.0", features = ["v4", "fast-rng"] }
[lints]
workspace = true

View File

@ -8,7 +8,7 @@ license.workspace = true
[dependencies]
iso8601-timestamp = "0.2.17"
serde = { version = "1.0.197", features = ["derive"] }
simd-json = "0.13.8"
simd-json = "0.13.9"
smol_str = { version = "0.2.1", features = ["serde"] }
speedy-uuid = { path = "../../lib/speedy-uuid", features = ["serde"] }
strum = { version = "0.26.2", features = ["derive"] }

View File

@ -16,13 +16,13 @@ futures-util = { version = "0.3.30", default-features = false, features = [
kitsune-config = { path = "../kitsune-config" }
kitsune-type = { path = "../kitsune-type" }
miette = "7.2.0"
mrf-manifest = { path = "../../lib/mrf-manifest", features = ["parse"] }
mrf-manifest = { path = "../../lib/mrf-manifest", features = ["decode"] }
multiplex-pool = { path = "../../lib/multiplex-pool" }
redis = { version = "0.25.2", default-features = false, features = [
"connection-manager",
"tokio-rustls-comp",
] }
simd-json = "0.13.8"
simd-json = "0.13.9"
slab = "0.4.9"
sled = "0.34.7"
smol_str = "0.2.1"
@ -31,7 +31,7 @@ tokio = { version = "1.36.0", features = ["fs"] }
tracing = "0.1.40"
typed-builder = "0.18.1"
walkdir = "2.5.0"
wasmtime = { version = "18.0.3", default-features = false, features = [
wasmtime = { version = "19.0.0", default-features = false, features = [
"addr2line",
"async",
"component-model",
@ -40,9 +40,7 @@ wasmtime = { version = "18.0.3", default-features = false, features = [
"pooling-allocator",
"runtime",
] }
wasmtime-wasi = { version = "18.0.3", default-features = false, features = [
"preview2",
] }
wasmtime-wasi = { version = "19.0.0", default-features = false }
[dev-dependencies]
tempfile = "3.10.1"

View File

@ -2,7 +2,7 @@ use crate::kv_storage;
use slab::Slab;
use std::sync::Arc;
use wasmtime::{component::ResourceTable, Engine, Store};
use wasmtime_wasi::preview2::{WasiCtx, WasiCtxBuilder, WasiView};
use wasmtime_wasi::{WasiCtx, WasiCtxBuilder, WasiView};
pub struct KvContext {
pub module_name: Option<String>,

View File

@ -125,8 +125,7 @@ impl MrfService {
let mut linker = Linker::<Context>::new(&engine);
mrf_wit::v1::Mrf::add_to_linker(&mut linker, |ctx| ctx).map_err(miette::Report::msg)?;
wasmtime_wasi::preview2::command::add_to_linker(&mut linker)
.map_err(miette::Report::msg)?;
wasmtime_wasi::command::add_to_linker(&mut linker).map_err(miette::Report::msg)?;
Ok(Self {
engine,

View File

@ -1,7 +1,7 @@
use kitsune_wasm_mrf::{MrfModule, MrfService, Outcome};
use mrf_manifest::{ActivitySet, ApiVersion, ManifestV1};
use smol_str::SmolStr;
use std::{borrow::Cow, collections::HashSet};
use std::{borrow::Cow, collections::BTreeSet};
use wasmtime::{component::Component, Config, Engine};
const WASM_COMPONENT: &[u8] = include_bytes!("example_mrf.component.wasm");
@ -12,7 +12,7 @@ fn dummy_manifest() -> ManifestV1<'static> {
name: "dummy".into(),
version: "1.0.0".parse().unwrap(),
activity_types: ActivitySet::from(
[Cow::Borrowed("*")].into_iter().collect::<HashSet<_, _>>(),
[Cow::Borrowed("*")].into_iter().collect::<BTreeSet<_>>(),
),
config_schema: None,
}

View File

@ -27,7 +27,7 @@ urlencoding = "2.1.3"
http-body-util = "0.1.1"
hyper = "1.2.0"
pretty_assertions = "1.4.0"
simd-json = "0.13.8"
simd-json = "0.13.9"
tokio = { version = "1.36.0", features = ["macros"] }
tower = { version = "0.4.13", default-features = false, features = ["util"] }

View File

@ -83,7 +83,7 @@ rust-embed = { version = "8.3.0", features = ["include-exclude"] }
scoped-futures = "0.1.3"
serde = { version = "1.0.197", features = ["derive"] }
serde_urlencoded = "0.7.1"
simd-json = "0.13.8"
simd-json = "0.13.9"
simdutf8 = { version = "0.1.4", features = ["aarch64_neon"] }
speedy-uuid = { path = "../lib/speedy-uuid" }
strum = { version = "0.26.2", features = ["derive", "phf"] }

View File

@ -22,7 +22,7 @@ redis = { version = "0.25.2", default-features = false, features = [
"tokio-comp",
] }
serde = { version = "1.0.197", features = ["derive"] }
simd-json = "0.13.8"
simd-json = "0.13.9"
smol_str = "0.2.1"
speedy-uuid = { path = "../speedy-uuid", features = ["redis", "serde"] }
thiserror = "1.0.58"

View File

@ -21,9 +21,7 @@ async-trait = { version = "0.1.78", optional = true }
axum-core = { version = "0.4.3", optional = true }
[dev-dependencies]
futures = { version = "0.3.30", default-features = false, features = [
"executor",
] }
futures-test = "0.3.30"
tower = { version = "0.4.13", default-features = false, features = ["util"] }
[features]

View File

@ -1,11 +1,11 @@
use cursiv::{CsrfHandle, CsrfLayer, Message};
use futures::{executor, future};
use http::{header, Request, Response};
use std::convert::Infallible;
use std::{convert::Infallible, future};
use tower::{service_fn, Layer, Service, ServiceExt};
fn common() -> impl Service<Request<()>, Response = Response<()>, Error = Infallible> {
let key = blake3::derive_key("wawa", b"bartmoss");
let service = service_fn(|req: Request<()>| {
let handle = req.extensions().get::<CsrfHandle>().unwrap();
if let Some(msg) = req.extensions().get::<Message>() {
@ -17,27 +17,18 @@ fn common() -> impl Service<Request<()>, Response = Response<()>, Error = Infall
let mut resp = Response::new(());
resp.extensions_mut().insert(msg);
future::ok::<_, Infallible>(resp)
future::ready(Ok::<_, Infallible>(resp))
});
CsrfLayer::new(key).layer(service)
}
#[test]
#[futures_test::test]
#[should_panic = "BAD VERIFICATION"]
fn panic_wrong_signature() {
let mut service = common();
let response = executor::block_on(async {
service
.ready()
.await
.unwrap()
.call(Request::default())
.await
.unwrap()
});
async fn panic_wrong_signature() {
let mut service = common().ready_oneshot().await.unwrap();
let response = service.call(Request::default()).await.unwrap();
let req = Request::builder()
.header(
header::COOKIE,
@ -47,21 +38,13 @@ fn panic_wrong_signature() {
.body(())
.unwrap();
executor::block_on(async { service.ready().await.unwrap().call(req).await.unwrap() });
service.oneshot(req).await.unwrap();
}
#[test]
fn sign_verify_simple() {
let mut service = common();
let response = executor::block_on(async {
service
.ready()
.await
.unwrap()
.call(Request::default())
.await
.unwrap()
});
#[futures_test::test]
async fn sign_verify_simple() {
let mut service = common().ready_oneshot().await.unwrap();
let response = service.call(Request::default()).await.unwrap();
let req = Request::builder()
.header(
@ -72,5 +55,5 @@ fn sign_verify_simple() {
.body(())
.unwrap();
executor::block_on(async { service.ready().await.unwrap().call(req).await.unwrap() });
service.oneshot(req).await.unwrap();
}

View File

@ -233,6 +233,37 @@ mod test {
}
}
#[tokio::test]
async fn default_resolver_works() {
let dummy = DummyStrategy::default();
let resolver = crate::default_resolver();
let verifier = Verifier::builder()
.fqdn("example.org.".into())
.resolver(resolver)
.strategy(dummy)
.build();
assert!(verifier.verify().await.is_ok());
}
#[tokio::test]
async fn dummy_strategy_works() {
let dummy = DummyStrategy::default();
let resolver = TestResolver {
expected_fqdn: "aumetra.xyz.".into(),
records: vec![],
};
let verifier = Verifier::builder()
.fqdn("aumetra.xyz.".into())
.resolver(Arc::new(resolver))
.strategy(dummy)
.build();
assert!(verifier.verify().await.is_ok());
}
#[tokio::test]
async fn rejects_invalid_records() {
let kv_strategy =

View File

@ -14,7 +14,7 @@ atoi_radix10 = "0.0.1"
nanorand = { version = "0.7.0", default-features = false, features = [
"wyrand",
] }
uuid = { version = "1.7.0", default-features = false }
uuid = { version = "1.8.0", default-features = false }
[features]
default = ["std"]
@ -23,7 +23,7 @@ std = []
[dev-dependencies]
criterion = "0.5.1"
time = "0.3.34"
uuid = { version = "1.7.0", features = ["v7"] }
uuid = { version = "1.8.0", features = ["v7"] }
[lints]
workspace = true

View File

@ -55,3 +55,48 @@ where
let result = atoi_radix10::parse(masto_id.as_ref())?;
Ok(process_u64(result))
}
#[cfg(test)]
mod test {
#![allow(clippy::unreadable_literal)]
use time::{Month, OffsetDateTime};
// ID nabbed from this post: <https://hachyderm.io/@samhenrigold/112094325204679902>
const ID: u64 = 112094325204679902;
const ID_STR: &str = "112094325204679902";
fn uuid_timestamp_to_time(timestamp: uuid::Timestamp) -> OffsetDateTime {
let (seconds, nanos) = timestamp.to_unix();
let nanos = ((seconds as i128) * 1_000_000_000) + (nanos as i128);
OffsetDateTime::from_unix_timestamp_nanos(nanos).unwrap()
}
#[test]
fn integer_convert_works() {
let uuid = crate::process_u64(ID);
let timestamp = uuid_timestamp_to_time(uuid.get_timestamp().unwrap());
assert_eq!(timestamp.day(), 14);
assert_eq!(timestamp.month(), Month::March);
assert_eq!(timestamp.year(), 2024);
assert_eq!(timestamp.hour(), 13);
assert_eq!(timestamp.minute(), 41);
assert_eq!(timestamp.second(), 3);
}
#[test]
fn string_convert_works() {
let uuid = crate::process(ID_STR).unwrap();
let timestamp = uuid_timestamp_to_time(uuid.get_timestamp().unwrap());
assert_eq!(timestamp.day(), 14);
assert_eq!(timestamp.month(), Month::March);
assert_eq!(timestamp.year(), 2024);
assert_eq!(timestamp.hour(), 13);
assert_eq!(timestamp.minute(), 41);
assert_eq!(timestamp.second(), 3);
}
}

View File

@ -6,7 +6,6 @@ version.workspace = true
license = "MIT OR Apache-2.0"
[dependencies]
ahash = { version = "0.8.11", features = ["serde"] }
leb128 = { version = "0.2.5", optional = true }
miette = { version = "7.2.0", optional = true }
olpc-cjson = { version = "0.1.3", optional = true }
@ -19,17 +18,19 @@ wasm-encoder = { version = "0.201.0", optional = true }
wasmparser = { version = "0.201.0", optional = true }
[dev-dependencies]
serde_json = "1.0.114"
insta = { version = "1.36.1", default-features = false, features = ["json"] }
wat = "1.201.0"
[features]
encode = ["dep:wasm-encoder", "serialise"]
parse = [
decode = [
"dep:miette",
"dep:leb128",
"dep:serde_json",
"dep:thiserror",
"dep:wasmparser",
]
encode = ["dep:wasm-encoder", "serialise"]
serialise = ["dep:olpc-cjson", "dep:serde_json"]
[lints]

View File

@ -10,17 +10,18 @@ use schemars::{schema::RootSchema, JsonSchema};
use serde::{Deserialize, Serialize};
use std::{
borrow::Cow,
collections::BTreeSet,
ops::{Deref, DerefMut},
};
#[cfg(feature = "parse")]
#[cfg(feature = "decode")]
pub use self::decode::{decode, DecodeError, SectionRange};
#[cfg(feature = "encode")]
pub use self::encode::encode;
#[cfg(feature = "serialise")]
pub use self::serialise::serialise;
#[cfg(feature = "parse")]
#[cfg(feature = "decode")]
mod decode;
#[cfg(feature = "encode")]
mod encode;
@ -39,9 +40,9 @@ where
}
/// Wrapper around a hash set intended for use with the `activityTypes` field
#[derive(Clone, Debug, Deserialize, JsonSchema, Serialize)]
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(transparent)]
pub struct ActivitySet<'a>(#[serde(borrow)] pub ahash::HashSet<Cow<'a, str>>);
pub struct ActivitySet<'a>(#[serde(borrow)] pub BTreeSet<Cow<'a, str>>);
impl ActivitySet<'_> {
/// Does the set of requested activity types contain `*`?
@ -58,13 +59,13 @@ impl ActivitySet<'_> {
.iter()
.cloned()
.map(cow_to_static)
.collect::<ahash::HashSet<Cow<'static, str>>>()
.collect::<BTreeSet<Cow<'static, str>>>()
.into()
}
}
impl<'a> Deref for ActivitySet<'a> {
type Target = ahash::HashSet<Cow<'a, str>>;
type Target = BTreeSet<Cow<'a, str>>;
fn deref(&self) -> &Self::Target {
&self.0
@ -77,21 +78,20 @@ impl DerefMut for ActivitySet<'_> {
}
}
#[allow(clippy::implicit_hasher)] // Literally not applicable here. False positive. Otherwise we would need to have the whole thing generic over the hasher
impl<'a> From<ActivitySet<'a>> for ahash::HashSet<Cow<'a, str>> {
impl<'a> From<ActivitySet<'a>> for BTreeSet<Cow<'a, str>> {
fn from(value: ActivitySet<'a>) -> Self {
value.0
}
}
impl<'a> From<ahash::HashSet<Cow<'a, str>>> for ActivitySet<'a> {
fn from(value: ahash::HashSet<Cow<'a, str>>) -> Self {
impl<'a> From<BTreeSet<Cow<'a, str>>> for ActivitySet<'a> {
fn from(value: BTreeSet<Cow<'a, str>>) -> Self {
Self(value)
}
}
/// Version of the API used
#[derive(Clone, Copy, Debug, Deserialize, JsonSchema, Serialize)]
#[derive(Clone, Copy, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum ApiVersion {
@ -100,7 +100,7 @@ pub enum ApiVersion {
}
/// Manifest of MRF modules
#[derive(Clone, Debug, Deserialize, JsonSchema, Serialize)]
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "camelCase", tag = "manifestVersion")]
#[non_exhaustive]
pub enum Manifest<'a> {
@ -122,7 +122,7 @@ impl Manifest<'_> {
}
/// Manifest v1
#[derive(Clone, Debug, Deserialize, JsonSchema, Serialize)]
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ManifestV1<'a> {
/// Version of the MRF API

View File

@ -0,0 +1,20 @@
#![cfg(feature = "decode")]
use mrf_manifest::{Manifest, SECTION_NAME};
const MANIFEST: &str = include_str!("test-manifest.json");
#[test]
fn decode_works() {
let manifest: Manifest<'_> = serde_json::from_str(MANIFEST).unwrap();
// Calling `serde_json::to_string` on a string will encode it into its JSON representation
// which is a fully escaped representation of the string
let escaped_manifest = serde_json::to_string(&MANIFEST).unwrap();
let wat_src = format!(r#"( module ( @custom "{SECTION_NAME}" {escaped_manifest} ) )"#);
let wasm_blob = wat::parse_str(wat_src).unwrap();
let (parsed_manifest, section_range) = mrf_manifest::decode(&wasm_blob).unwrap().unwrap();
assert_eq!(manifest, parsed_manifest);
assert_eq!(section_range, 8..245);
}

View File

@ -0,0 +1,10 @@
#![cfg(feature = "encode")]
const MANIFEST: &str = include_str!("test-manifest.json");
#[test]
fn encode_works() {
let manifest = serde_json::from_str(MANIFEST).unwrap();
let encoded_manifest = mrf_manifest::encode(&manifest).unwrap();
insta::assert_json_snapshot!(encoded_manifest);
}

View File

@ -0,0 +1,11 @@
#![cfg(feature = "serialise")]
const MANIFEST: &str = include_str!("test-manifest.json");
#[test]
fn encode_works() {
let manifest = serde_json::from_str(MANIFEST).unwrap();
let encoded_manifest = mrf_manifest::serialise(&manifest).unwrap();
let encoded_manifest_str = String::from_utf8(encoded_manifest).unwrap();
insta::assert_snapshot!(encoded_manifest_str);
}

View File

@ -0,0 +1,190 @@
---
source: lib/mrf-manifest/tests/encode.rs
expression: encoded_manifest
---
[
0,
181,
1,
11,
109,
97,
110,
105,
102,
101,
115,
116,
45,
118,
48,
123,
34,
97,
99,
116,
105,
118,
105,
116,
121,
84,
121,
112,
101,
115,
34,
58,
91,
34,
65,
110,
110,
111,
117,
110,
99,
101,
34,
44,
34,
67,
114,
101,
97,
116,
101,
34,
44,
34,
68,
101,
108,
101,
116,
101,
34,
44,
34,
76,
105,
107,
101,
34,
93,
44,
34,
97,
112,
105,
86,
101,
114,
115,
105,
111,
110,
34,
58,
34,
118,
49,
34,
44,
34,
99,
111,
110,
102,
105,
103,
83,
99,
104,
101,
109,
97,
34,
58,
110,
117,
108,
108,
44,
34,
109,
97,
110,
105,
102,
101,
115,
116,
86,
101,
114,
115,
105,
111,
110,
34,
58,
34,
118,
49,
34,
44,
34,
110,
97,
109,
101,
34,
58,
34,
116,
101,
115,
116,
45,
109,
97,
110,
105,
102,
101,
115,
116,
34,
44,
34,
118,
101,
114,
115,
105,
111,
110,
34,
58,
34,
48,
46,
48,
46,
49,
45,
99,
97,
116,
116,
121,
119,
97,
109,
112,
117,
115,
34,
125
]

View File

@ -0,0 +1,5 @@
---
source: lib/mrf-manifest/tests/serialise.rs
expression: encoded_manifest_str
---
{"activityTypes":["Announce","Create","Delete","Like"],"apiVersion":"v1","configSchema":null,"manifestVersion":"v1","name":"test-manifest","version":"0.0.1-cattywampus"}

View File

@ -0,0 +1,12 @@
{
"manifestVersion": "v1",
"apiVersion": "v1",
"name": "test-manifest",
"version": "0.0.1-cattywampus",
"activityTypes": [
"Announce",
"Create",
"Delete",
"Like"
]
}

View File

@ -0,0 +1,10 @@
use mrf_manifest::Manifest;
const MANIFEST: &str = include_str!("test-manifest.json");
#[test]
fn to_owned_works() {
let borrowed_manifest: Manifest<'_> = serde_json::from_str(MANIFEST).unwrap();
let owned_manifest: Manifest<'static> = borrowed_manifest.to_owned();
assert_eq!(borrowed_manifest, owned_manifest);
}

View File

@ -10,8 +10,8 @@ license = "MIT OR Apache-2.0"
clap = { version = "4.5.3", features = ["derive", "wrap_help"] }
miette = { version = "7.2.0", features = ["fancy"] }
mrf-manifest = { path = "../mrf-manifest", features = [
"decode",
"encode",
"parse",
"serialise",
] }
serde_json = "1.0.114"

View File

@ -14,8 +14,11 @@ diesel = { version = "2.1.5", features = [
redis = { version = "0.25.2", default-features = false, optional = true }
serde = { version = "1.0.197", optional = true }
thiserror = "1.0.58"
uuid = { version = "1.7.0", features = ["fast-rng", "v7"] }
uuid = { version = "1.8.0", features = ["fast-rng", "v7"] }
uuid-simd = { version = "0.8.0", features = ["uuid"] }
[dev-dependencies]
serde_test = "1.0.176"
[lints]
workspace = true

View File

@ -3,11 +3,12 @@ use std::{
ops::{Deref, DerefMut},
str::{self, FromStr},
};
use thiserror::Error;
use uuid_simd::{format_hyphenated, AsciiCase, Out, UuidExt};
pub use uuid;
#[derive(Debug, thiserror::Error)]
#[derive(Debug, Error)]
pub enum Error {
#[error(transparent)]
Simd(#[from] uuid_simd::Error),
@ -293,17 +294,3 @@ mod serde_impl {
}
}
}
#[cfg(test)]
mod test {
use crate::Uuid;
use std::str::FromStr;
const UUID_1: &str = "38058daf-b2cd-4832-902a-83583ac07e28";
#[test]
fn parse_1() {
let uuid = Uuid::from_str(UUID_1).unwrap();
assert_eq!(UUID_1, uuid.to_string());
}
}

View File

@ -0,0 +1,44 @@
#![cfg(feature = "async-graphql")]
use async_graphql::{connection::CursorType, ScalarType};
use speedy_uuid::Uuid;
const UUID: &str = "38058daf-b2cd-4832-902a-83583ac07e28";
const UUID_BYTES: [u8; 16] = [
0x38, 0x05, 0x8d, 0xaf, 0xb2, 0xcd, 0x48, 0x32, 0x90, 0x2a, 0x83, 0x58, 0x3a, 0xc0, 0x7e, 0x28,
];
#[test]
fn cursor_encode_decode() {
let parsed_cursor: Uuid = CursorType::decode_cursor(UUID).unwrap();
assert_eq!(parsed_cursor.as_bytes(), &UUID_BYTES);
let encoded_cursor = CursorType::encode_cursor(&parsed_cursor);
assert_eq!(encoded_cursor, UUID);
}
#[test]
fn cursor_invalid_input() {
let result: Result<Uuid, speedy_uuid::Error> = CursorType::decode_cursor("NOT A UUID");
assert!(result.is_err());
}
#[test]
fn scalar_encode_decode() {
let parsed_scalar: Uuid = ScalarType::parse(async_graphql::Value::String(UUID.into())).unwrap();
assert_eq!(parsed_scalar.as_bytes(), &UUID_BYTES);
let encoded_scalar = ScalarType::to_value(&parsed_scalar);
assert_eq!(encoded_scalar, async_graphql::Value::String(UUID.into()));
}
#[test]
fn scalar_invalid_input() {
let result: async_graphql::InputValueResult<Uuid> =
ScalarType::parse(async_graphql::Value::Null);
assert!(result.is_err());
let result: async_graphql::InputValueResult<Uuid> =
ScalarType::parse(async_graphql::Value::String("NOT A UUID".into()));
assert!(result.is_err());
}

View File

@ -0,0 +1,10 @@
use speedy_uuid::Uuid;
use std::str::FromStr;
const UUID: &str = "38058daf-b2cd-4832-902a-83583ac07e28";
#[test]
fn roundtrip() {
let uuid = Uuid::from_str(UUID).unwrap();
assert_eq!(UUID, uuid.to_string());
}

View File

@ -0,0 +1,17 @@
#![cfg(feature = "redis")]
use redis::ToRedisArgs;
use speedy_uuid::Uuid;
use std::str::FromStr;
const UUID: &str = "38058daf-b2cd-4832-902a-83583ac07e28";
#[test]
fn encode_redis() {
let uuid = Uuid::from_str(UUID).unwrap();
let mut buffer = Vec::new();
uuid.write_redis_args(&mut buffer);
assert_eq!(buffer, [UUID.as_bytes()]);
}

View File

@ -0,0 +1,62 @@
#![cfg(feature = "serde")]
use serde_test::{Compact, Configure, Token};
use speedy_uuid::Uuid;
use std::str::FromStr;
const UUID: &str = "38058daf-b2cd-4832-902a-83583ac07e28";
const UUID_BYTES: [u8; 16] = [
0x38, 0x05, 0x8d, 0xaf, 0xb2, 0xcd, 0x48, 0x32, 0x90, 0x2a, 0x83, 0x58, 0x3a, 0xc0, 0x7e, 0x28,
];
#[test]
fn deserialize_bytes() {
let uuid = Uuid::from_slice(&UUID_BYTES).unwrap();
serde_test::assert_de_tokens(&uuid.compact(), &[Token::Bytes(&UUID_BYTES)]);
serde_test::assert_de_tokens(&uuid.readable(), &[Token::Bytes(&UUID_BYTES)]);
}
#[test]
fn deserialize_byte_array() {
let uuid = Uuid::from_slice(&UUID_BYTES).unwrap();
serde_test::assert_de_tokens(
&uuid.readable(),
&[
Token::Seq { len: Some(16) },
Token::U8(UUID_BYTES[0]),
Token::U8(UUID_BYTES[1]),
Token::U8(UUID_BYTES[2]),
Token::U8(UUID_BYTES[3]),
Token::U8(UUID_BYTES[4]),
Token::U8(UUID_BYTES[5]),
Token::U8(UUID_BYTES[6]),
Token::U8(UUID_BYTES[7]),
Token::U8(UUID_BYTES[8]),
Token::U8(UUID_BYTES[9]),
Token::U8(UUID_BYTES[10]),
Token::U8(UUID_BYTES[11]),
Token::U8(UUID_BYTES[12]),
Token::U8(UUID_BYTES[13]),
Token::U8(UUID_BYTES[14]),
Token::U8(UUID_BYTES[15]),
Token::SeqEnd,
],
);
serde_test::assert_de_tokens_error::<Compact<Uuid>>(
&[Token::Seq { len: Some(16) }],
"invalid type: sequence, expected bytes",
);
}
#[test]
fn deserialize_str() {
let uuid = Uuid::from_str(UUID).unwrap().readable();
serde_test::assert_de_tokens(&uuid, &[Token::Str(UUID)]);
}
#[test]
fn serialize_uuid() {
let uuid = Uuid::from_slice(&UUID_BYTES).unwrap();
serde_test::assert_ser_tokens(&uuid, &[Token::Str(UUID)]);
}

View File

@ -21,9 +21,7 @@ tracing = { version = "0.1.40", default-features = false }
[dev-dependencies]
bytes = "1.5.0"
futures = { version = "0.3.30", default-features = false, features = [
"executor",
] }
futures-test = "0.3.30"
http-body-util = "0.1.1"
tower = { version = "0.4.13", default-features = false, features = ["util"] }

View File

@ -25,6 +25,39 @@ static DIGEST_HEADER_NAME: HeaderName = HeaderName::from_static("digest");
static MISSING_DIGEST_HEADER_BODY: Bytes = Bytes::from_static(b"Missing digest header");
static UNSUPPORTED_DIGEST_BODY: Bytes = Bytes::from_static(b"Unsupported digest");
fn handle_single(bytes: &[u8]) -> Result<Option<Verifier>, BoxError> {
let Some(pos) = memchr(b'=', bytes) else {
return Err("Invalid header value".into());
};
let (algorithm_name, digest_value) = bytes.split_at(pos);
let Some(algorithm) = Algorithm::from_bytes(algorithm_name) else {
return Ok(None);
};
let digest_value = base64_simd::STANDARD.decode_to_vec(&digest_value[1..])?;
Ok(Some(Verifier {
algorithm,
digest_value,
}))
}
fn handle_multiple(mut bytes: &[u8]) -> Result<Option<Verifier>, BoxError> {
while let Some(split_pos) = memchr(b',', bytes) {
let (algo, rest) = bytes.split_at(split_pos);
if let Some(verifier) = handle_single(algo)? {
return Ok(Some(verifier));
}
bytes = &rest[1..];
}
// And run one last time over the remaining bytes
handle_single(bytes)
}
struct Verifier {
algorithm: Algorithm,
digest_value: Vec<u8>,
@ -32,20 +65,15 @@ struct Verifier {
impl Verifier {
pub fn from_header_value(header_value: &HeaderValue) -> Result<Self, BoxError> {
let Some(pos) = memchr(b'=', header_value.as_bytes()) else {
return Err("Invalid header value".into());
};
let header_bytes = header_value.as_bytes();
let (algorithm_name, digest_value) = header_value.as_bytes().split_at(pos);
let algorithm = Algorithm::from_bytes(algorithm_name)
.ok_or_else(|| BoxError::from("Unsupported digest"))?;
let digest_value = base64_simd::STANDARD.decode_to_vec(&digest_value[1..])?;
Ok(Self {
algorithm,
digest_value,
})
if memchr(b',', header_bytes).is_some() {
handle_multiple(header_bytes)
} else {
handle_single(header_bytes)
}
.transpose()
.ok_or_else(|| BoxError::from("No compatible digest found"))?
}
pub fn update_digest(&mut self, val: &[u8]) {

View File

@ -5,7 +5,6 @@ use std::convert::Infallible;
use tower::{service_fn, ServiceExt};
use tower_http_digest::{VerifyDigestBody, VerifyDigestLayer};
use tower_layer::Layer;
use tower_service::Service;
const TEXT: &str = r"Una sombra abajo de mi cama
Cómo se llama éste fantasma?
@ -16,8 +15,71 @@ const EXPECTED_SHA256_HASH: &str = "vDI/NDnFX991qKsNsKB5Ne4bam8J5eLLYqo0jU8ku+I=
const EXPECTED_SHA512_HASH: &str =
"zTNHlXez9GjaWU8Z/7OM6ntFjCbxcOfuc7NRp8F4m3fVrmG5K/7QST2lQiif8EGEopqih9eFlbo0dumbsBYP4g==";
#[test]
fn digest_invalid_base64() {
#[futures_test::test]
async fn missing_header() {
let service = VerifyDigestLayer::default().layer(service_fn(
|_request: Request<VerifyDigestBody<Full<Bytes>>>| {
#[allow(unreachable_code)]
async move {
unreachable!() as Result<Response<Full<Bytes>>, Infallible>
}
},
));
let response = service
.oneshot(Request::new(Full::from(TEXT)))
.await
.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
}
#[futures_test::test]
async fn can_handle_one_invalid() {
let request = Request::builder()
.header(
"digest",
format!("made-up-hash=woowee,sha-512={EXPECTED_SHA512_HASH}"),
)
.body(Full::from(TEXT))
.unwrap();
let service = VerifyDigestLayer::default().layer(service_fn(
|request: Request<VerifyDigestBody<Full<Bytes>>>| async move {
let body = request.collect().await.unwrap().to_bytes();
assert_eq!(body, TEXT);
Ok::<_, Infallible>(Response::<Full<Bytes>>::default())
},
));
let response = service.oneshot(request).await.unwrap();
assert_eq!(response.status(), StatusCode::OK);
}
#[futures_test::test]
async fn can_handle_multiple() {
let request = Request::builder()
.header(
"digest",
format!("sha-256={EXPECTED_SHA256_HASH},sha-512={EXPECTED_SHA512_HASH}"),
)
.body(Full::from(TEXT))
.unwrap();
let service = VerifyDigestLayer::default().layer(service_fn(
|request: Request<VerifyDigestBody<Full<Bytes>>>| async move {
let body = request.collect().await.unwrap().to_bytes();
assert_eq!(body, TEXT);
Ok::<_, Infallible>(Response::<Full<Bytes>>::default())
},
));
let response = service.oneshot(request).await.unwrap();
assert_eq!(response.status(), StatusCode::OK);
}
#[futures_test::test]
async fn digest_invalid_base64() {
let request = Request::builder()
.header(
"digest",
@ -29,45 +91,43 @@ fn digest_invalid_base64() {
.body(Full::from(TEXT))
.unwrap();
let mut service = VerifyDigestLayer::default().layer(service_fn(
let service = VerifyDigestLayer::default().layer(service_fn(
|request: Request<VerifyDigestBody<Full<Bytes>>>| async move {
assert!(request.collect().await.is_err());
Ok::<_, Infallible>(Response::<Full<Bytes>>::default())
},
));
futures::executor::block_on(async move {
service.ready().await.unwrap().call(request).await.unwrap();
});
// The response code is ignored here since the actual validation is done in the HTTP body
// The above assert ensures that our code actually errors out on mismatch
service.oneshot(request).await.unwrap();
}
#[test]
fn digest_invalid_no_base64() {
#[futures_test::test]
async fn digest_invalid_no_base64() {
let request = Request::builder()
.header("digest", "sha-256=THIS-IS-BAD")
.body(Full::from(TEXT))
.unwrap();
let mut service = VerifyDigestLayer::default().layer(service_fn(
let service = VerifyDigestLayer::default().layer(service_fn(
|_request: Request<VerifyDigestBody<Full<Bytes>>>| async move {
Ok::<_, Infallible>(Response::<Full<Bytes>>::default())
},
));
futures::executor::block_on(async move {
let response = service.ready().await.unwrap().call(request).await.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
});
let response = service.oneshot(request).await.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
}
#[test]
fn digest_sha256() {
#[futures_test::test]
async fn digest_sha256() {
let request = Request::builder()
.header("digest", format!("sha-256={EXPECTED_SHA256_HASH}"))
.body(Full::from(TEXT))
.unwrap();
let mut service = VerifyDigestLayer::default().layer(service_fn(
let service = VerifyDigestLayer::default().layer(service_fn(
|request: Request<VerifyDigestBody<Full<Bytes>>>| async move {
let body = request.collect().await.unwrap().to_bytes();
assert_eq!(body, TEXT);
@ -75,19 +135,18 @@ fn digest_sha256() {
},
));
futures::executor::block_on(async move {
service.ready().await.unwrap().call(request).await.unwrap();
});
let response = service.oneshot(request).await.unwrap();
assert_eq!(response.status(), StatusCode::OK);
}
#[test]
fn digest_sha512() {
#[futures_test::test]
async fn digest_sha512() {
let request = Request::builder()
.header("digest", format!("sha-512={EXPECTED_SHA512_HASH}"))
.body(Full::from(TEXT))
.unwrap();
let mut service = VerifyDigestLayer::default().layer(service_fn(
let service = VerifyDigestLayer::default().layer(service_fn(
|request: Request<VerifyDigestBody<Full<Bytes>>>| async move {
let body = request.collect().await.unwrap().to_bytes();
assert_eq!(body, TEXT);
@ -96,7 +155,6 @@ fn digest_sha512() {
},
));
futures::executor::block_on(async move {
service.ready().await.unwrap().call(request).await.unwrap();
});
let response = service.oneshot(request).await.unwrap();
assert_eq!(response.status(), StatusCode::OK);
}

View File

@ -77,7 +77,7 @@ mod test {
Request, Response, StatusCode,
};
use std::convert::Infallible;
use tower::{service_fn, Layer, Service, ServiceExt};
use tower::{service_fn, Layer, ServiceExt};
const BRAVE_USER_AGENTS: &[&str] = &[
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Brave/120.0.0.0",
@ -104,15 +104,14 @@ mod test {
#[test]
fn matches_brave_agents() {
for user_agent in BRAVE_USER_AGENTS {
let mut service =
StopUsingBraveLayer::default().layer(service_fn(|_req: Request<()>| async move {
// The "unreachable" expression provides type annotations for the compiler to figure out the response and error types
#[allow(unreachable_code)]
{
panic!("Shouldn't have reached the handler!")
as Result<Response<()>, Infallible>
}
}));
let service = StopUsingBraveLayer::default().layer(service_fn(|_req: Request<()>| {
// The "unreachable" expression provides type annotations for the compiler to figure out the response and error types
#[allow(unreachable_code)]
async move {
panic!("Shouldn't have reached the handler!")
as Result<Response<()>, Infallible>
}
}));
let response = executor::block_on(async move {
let request = Request::builder()
@ -120,7 +119,7 @@ mod test {
.body(())
.unwrap();
service.ready().await.unwrap().call(request).await.unwrap()
service.oneshot(request).await.unwrap()
});
assert_eq!(response.status(), StatusCode::FOUND);
@ -134,7 +133,7 @@ mod test {
#[test]
fn doesnt_match_other_agents() {
for user_agent in OTHER_USER_AGENTS {
let mut service =
let service =
StopUsingBraveLayer::default().layer(service_fn(|_req: Request<()>| async move {
Ok::<_, Infallible>(
Response::builder().status(StatusCode::OK).body(()).unwrap(),
@ -147,7 +146,7 @@ mod test {
.body(())
.unwrap();
service.ready().await.unwrap().call(request).await.unwrap()
service.oneshot(request).await.unwrap()
});
assert_eq!(response.status(), StatusCode::OK);

View File

@ -13,9 +13,7 @@ tower-layer = "0.3.2"
tower-service = "0.3.2"
[dev-dependencies]
futures = { version = "0.3.30", default-features = false, features = [
"executor",
] }
futures-test = "0.3.30"
tower = { version = "0.4.13", default-features = false, features = ["util"] }
[lints]

View File

@ -124,26 +124,16 @@ mod test {
use std::convert::Infallible;
use tower::{service_fn, ServiceExt};
use tower_layer::Layer;
use tower_service::Service;
#[test]
fn add_header() {
let mut service = XClacksOverheadLayer::new(["Johnny"])
#[futures_test::test]
async fn add_header() {
let service = XClacksOverheadLayer::new(["Johnny"])
.unwrap()
.layer(service_fn(|_req: Request<()>| async move {
Ok::<_, Infallible>(Response::new(()))
}));
let response = futures::executor::block_on(async move {
service
.ready()
.await
.unwrap()
.call(Request::new(()))
.await
.unwrap()
});
let response = service.oneshot(Request::new(())).await.unwrap();
let clacks_overhead = response.headers().get(&HEADER_NAME).unwrap();
assert_eq!(clacks_overhead.as_bytes(), b"GNU Johnny");
}