diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8e5cd2f..b359467 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,6 +42,12 @@ jobs: - name: Clippy run: cargo clippy --tests --benches -- -D clippy::all + - name: Install ic-test + run: cargo install ic-test + + - name: Install candid-extractor + run: cargo install candid-extractor + - name: Build test projects run: ./scripts/build_tests.sh @@ -52,7 +58,7 @@ jobs: uses: taiki-e/install-action@cargo-llvm-cov - name: Generate code coverage - run: cargo llvm-cov --all-features --workspace --lcov --output-path lcov.info + run: cargo llvm-cov --all-features --ignore-filename-regex='(bindings|test_canisters)' --workspace --lcov --output-path lcov.info - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 diff --git a/CHANGELOG.md b/CHANGELOG.md index a6069b4..534a002 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,19 @@ # Changelog + +## [v0.9.0] +- switch to ic-stable-structures v0.7 +- refactor project structure +- integrate ic-test into project for the integration tests +- update dependencies + + ## [v0.8.1] - switch to ic-cdk v0.18.3 - switch to pocket-ic v9.0 - update dependencies + ## [v0.8.0] - improved Wasi compliance - change edition to 2024 @@ -79,8 +88,9 @@ ## [v0.5.0] - *API change:* init with memory manager using memory index range rather than first memory index. - -[unreleased]: https://github.com/wasm-forge/stable-fs/compare/v0.8.0...main +[unreleased]: https://github.com/wasm-forge/stable-fs/compare/v0.9.0...main +[v0.9.0]: https://github.com/wasm-forge/stable-fs/compare/v0.8.1...v0.9.0 +[v0.8.1]: https://github.com/wasm-forge/stable-fs/compare/v0.8.0...v0.8.1 [v0.8.0]: https://github.com/wasm-forge/stable-fs/compare/v0.7.3...v0.8.0 [v0.7.3]: https://github.com/wasm-forge/stable-fs/compare/v0.7.2...v0.7.3 [v0.7.2]: https://github.com/wasm-forge/stable-fs/compare/v0.7.1...v0.7.2 diff --git a/Cargo.lock b/Cargo.lock index c0c45d9..13325f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,18 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -26,18 +38,181 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "anstream" +version = "0.6.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.59.0", +] + [[package]] name = "anyhow" version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + [[package]] name = "arrayvec" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "askama" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" +dependencies = [ + "askama_derive", + "askama_escape", + "humansize", + "num-traits", + "percent-encoding", +] + +[[package]] +name = "askama_derive" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" +dependencies = [ + "askama_parser", + "basic-toml", + "mime", + "mime_guess", + "proc-macro2", + "quote", + "serde", + "syn 2.0.104", +] + +[[package]] +name = "askama_escape" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" + +[[package]] +name = "askama_parser" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" +dependencies = [ + "nom", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "async-watch" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a078faf4e27c0c6cc0efb20e5da59dcccc04968ebf2801d8e0b2195124cdcdb2" +dependencies = [ + "event-listener 2.5.3", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -76,6 +251,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.13.1" @@ -88,6 +269,27 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" + [[package]] name = "binread" version = "2.2.0" @@ -111,12 +313,36 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitflags" version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -144,6 +370,28 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +[[package]] +name = "cached" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8466736fe5dbcaf8b8ee24f9bbefe43c884dc3e9ff7178da70f55bffca1133c" +dependencies = [ + "ahash", + "hashbrown 0.14.5", + "instant", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "camino" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" +dependencies = [ + "serde", +] + [[package]] name = "candid" version = "0.10.14" @@ -179,12 +427,124 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "candid_parser" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48a3da76f989cd350b7342c64c6c6008341bb6186f6832ef04e56dc50ba0fd76" +dependencies = [ + "anyhow", + "candid", + "codespan-reporting", + "convert_case 0.6.0", + "hex", + "lalrpop", + "lalrpop-util", + "logos", + "num-bigint", + "pretty", + "thiserror 1.0.69", +] + +[[package]] +name = "canister_initial_backend" +version = "0.0.0" +dependencies = [ + "candid", + "ciborium", + "hex", + "ic-cdk", + "ic-stable-structures", + "serde", + "serde_bytes", + "stable-fs", +] + +[[package]] +name = "canister_upgraded_backend" +version = "0.0.0" +dependencies = [ + "candid", + "ciborium", + "hex", + "ic-cdk", + "ic-stable-structures", + "serde", + "serde_bytes", + "stable-fs", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84982c6c0ae343635a3a4ee6dedef965513735c8b183caa7289fa6e27399ebd4" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-util-schemas" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e63d2780ac94487eb9f1fea7b0d56300abc9eb488800854ca217f102f5caccca" +dependencies = [ + "semver", + "serde", + "serde-untagged", + "serde-value", + "thiserror 1.0.69", + "toml", + "unicode-xid", + "url", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform 0.1.9", + "semver", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "cargo_metadata" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f7835cfc6135093070e95eb2b53e5d9b5c403dc3a6be6040ee026270aa82502" +dependencies = [ + "camino", + "cargo-platform 0.2.0", + "cargo-util-schemas", + "semver", + "serde", + "serde_json", + "thiserror 2.0.12", +] + [[package]] name = "cc" -version = "1.2.27" +version = "1.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -227,6 +587,118 @@ dependencies = [ "half 2.6.0", ] +[[package]] +name = "clap" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width 0.1.14", +] + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width 0.2.1", + "windows-sys 0.59.0", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "convert_case" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation" version = "0.10.1" @@ -254,9 +726,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -282,6 +754,18 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -292,6 +776,19 @@ dependencies = [ "typenum", ] +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle-ng", + "zeroize", +] + [[package]] name = "darling" version = "0.20.11" @@ -333,6 +830,17 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.4.0" @@ -342,14 +850,81 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "dialoguer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console", + "fuzzy-matcher", + "shell-words", + "tempfile", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", + "const-oid", "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users 0.5.0", + "windows-sys 0.60.2", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users 0.4.6", + "winapi", ] [[package]] @@ -370,10 +945,106 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" [[package]] -name = "either" -version = "1.15.0" +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519-consensus" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" +dependencies = [ + "curve25519-dalek-ng", + "hex", + "rand_core 0.6.4", + "serde", + "sha2 0.9.9", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ena" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_filter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] [[package]] name = "equivalent" @@ -390,6 +1061,16 @@ dependencies = [ "serde", ] +[[package]] +name = "erased-serde" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +dependencies = [ + "serde", + "typeid", +] + [[package]] name = "errno" version = "0.3.13" @@ -400,12 +1081,55 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.0", + "pin-project-lite", +] + [[package]] name = "fastrand" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" version = "1.1.2" @@ -422,6 +1146,27 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -493,6 +1238,15 @@ dependencies = [ "slab", ] +[[package]] +name = "fuzzy-matcher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" +dependencies = [ + "thread_local", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -501,6 +1255,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -536,11 +1291,37 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "git2" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" +dependencies = [ + "bitflags", + "libc", + "libgit2-sys", + "log", + "openssl-probe", + "openssl-sys", + "url", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "h2" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" dependencies = [ "atomic-waker", "bytes", @@ -571,11 +1352,26 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + [[package]] name = "hashbrown" version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "heck" @@ -592,6 +1388,15 @@ dependencies = [ "serde", ] +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + [[package]] name = "http" version = "1.3.1" @@ -632,6 +1437,15 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "humansize" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" +dependencies = [ + "libm", +] + [[package]] name = "hyper" version = "1.6.0" @@ -670,11 +1484,27 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + [[package]] name = "hyper-util" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "base64 0.22.1", "bytes", @@ -688,10 +1518,60 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.0", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", +] + +[[package]] +name = "ic-agent" +version = "0.40.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4832787330765f1bdf67123928855390b7f0b5a16dd0a7ea67674b7d3178ffd0" +dependencies = [ + "arc-swap", + "async-channel", + "async-lock", + "async-trait", + "async-watch", + "backoff", + "cached", + "candid", + "der", + "ecdsa", + "ed25519-consensus", + "elliptic-curve", + "futures-util", + "hex", + "http", + "http-body", + "ic-certification", + "ic-transport-types", + "ic-verify-bls-signature", + "k256", + "leb128", + "p256", + "pem", + "pkcs8", + "rand 0.8.5", + "rangemap", + "reqwest", + "sec1", + "serde", + "serde_bytes", + "serde_cbor", + "serde_repr", + "sha2 0.10.9", + "simple_asn1", + "stop-token", + "thiserror 2.0.12", + "time", + "tokio", + "tower-service", + "url", ] [[package]] @@ -714,9 +1594,9 @@ dependencies = [ [[package]] name = "ic-cdk-executor" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f3586c51b6b3809b69c79e97de172b4649f56094e8c8bc1ce2e41a29f20ed5f" +checksum = "15948808e3e7b50749fe50838df77fccaf048c8af2c26884ff5c8f787c29787a" dependencies = [ "slotmap", ] @@ -743,7 +1623,7 @@ dependencies = [ "hex", "serde", "serde_bytes", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -770,13 +1650,52 @@ dependencies = [ [[package]] name = "ic-stable-structures" -version = "0.6.9" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d30d4cf17aff1024e13133897048bcba580e063c9000571ab766ca37e2996f4" +checksum = "e54aeb082293c69def5ab34c70593ba85ff000386f7d0eacdf73514daaeca031" dependencies = [ "ic_principal", ] +[[package]] +name = "ic-test" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8942fac0e558d169622a92bb17f6c32b3f794fcb3a6b1db1cfabc587fa41138" +dependencies = [ + "anyhow", + "askama", + "async-trait", + "candid", + "candid_parser", + "cargo_metadata 0.20.0", + "clap", + "convert_case 0.8.0", + "dialoguer", + "dirs", + "env_logger", + "git2", + "ic-agent", + "ic-cdk", + "lazy_static", + "log", + "pocket-ic", + "pretty", + "prettyplease", + "quote", + "regress", + "reqwest", + "serde", + "serde-json-schema", + "serde_json", + "slog", + "syn 2.0.104", + "thiserror 2.0.12", + "tokio", + "toml_edit", + "wf-cdk-bindgen", +] + [[package]] name = "ic-transport-types" version = "0.40.1" @@ -791,26 +1710,55 @@ dependencies = [ "serde_bytes", "serde_cbor", "serde_repr", - "sha2", + "sha2 0.10.9", "thiserror 2.0.12", ] +[[package]] +name = "ic-verify-bls-signature" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d420b25c0091059f6c3c23a21427a81915e6e0aca3b79e0d403ed767f286a3b9" +dependencies = [ + "hex", + "ic_bls12_381", + "lazy_static", + "pairing", + "rand 0.8.5", + "sha2 0.10.9", +] + [[package]] name = "ic0" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8877193e1921b5fd16accb0305eb46016868cd1935b05c05eca0ec007b943272" +[[package]] +name = "ic_bls12_381" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e828f9e804ccefe4b9b15b2195f474c60fd4f95ccd14fcb554eb6d7dfafde3" +dependencies = [ + "digest 0.10.7", + "ff", + "group", + "pairing", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "ic_principal" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1762deb6f7c8d8c2bdee4b6c5a47b60195b74e9b5280faa5ba29692f8e17429c" dependencies = [ + "arbitrary", "crc32fast", "data-encoding", "serde", - "sha2", + "sha2 0.10.9", "thiserror 1.0.69", ] @@ -934,7 +1882,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.4", ] [[package]] @@ -946,6 +1894,31 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "integration-tests" +version = "0.1.0" +dependencies = [ + "candid", + "cargo_metadata 0.19.2", + "convert_case 0.8.0", + "ic-test", + "pocket-ic", + "serde", + "serde_bytes", + "tokio", +] + +[[package]] +name = "io-uring" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -956,26 +1929,129 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" name = "iri-string" version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jiff" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde", +] + +[[package]] +name = "jiff-static" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-pointer" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fe841b94e719a482213cee19dd04927cf412f26d8dc84c5a446c081e49c2997" +dependencies = [ + "serde_json", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ - "memchr", - "serde", + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.9", + "signature", ] [[package]] -name = "itoa" -version = "1.0.15" +name = "lalrpop" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" +dependencies = [ + "ascii-canvas", + "bit-set", + "ena", + "itertools", + "lalrpop-util", + "petgraph", + "pico-args", + "regex", + "regex-syntax 0.8.5", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", + "walkdir", +] [[package]] -name = "js-sys" -version = "0.3.77" +name = "lalrpop-util" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "once_cell", - "wasm-bindgen", + "regex-automata 0.4.9", ] [[package]] @@ -996,6 +2072,62 @@ version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +[[package]] +name = "libgit2-sys" +version = "0.18.2+1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222" +dependencies = [ + "cc", + "libc", + "libssh2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", +] + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4488594b9328dee448adb906d8b126d9b7deb7cf5c22161ee591610bb1be83c0" +dependencies = [ + "bitflags", + "libc", +] + +[[package]] +name = "libssh2-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.9.4" @@ -1024,6 +2156,38 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "logos" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c000ca4d908ff18ac99b93a062cb8958d331c3220719c52e77cb19cc6ac5d2c1" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-codegen" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc487311295e0002e452025d6b580b77bb17286de87b57138f3b5db711cded68" +dependencies = [ + "beef", + "fnv", + "proc-macro2", + "quote", + "regex-syntax 0.6.29", + "syn 2.0.104", +] + +[[package]] +name = "logos-derive" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbfc0d229f1f42d790440136d941afd806bc9e949e2bcb8faa813b0f00d1267e" +dependencies = [ + "logos-codegen", +] + [[package]] name = "lru-slab" version = "0.1.2" @@ -1061,6 +2225,12 @@ dependencies = [ "unicase", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1081,6 +2251,39 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1141,18 +2344,110 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "openssl-probe" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + [[package]] name = "overload" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.9", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.4" @@ -1182,12 +2477,56 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pem" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +dependencies = [ + "base64 0.22.1", + "serde", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -1200,6 +2539,22 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + [[package]] name = "pocket-ic" version = "9.0.2" @@ -1220,7 +2575,7 @@ dependencies = [ "serde_bytes", "serde_cbor", "serde_json", - "sha2", + "sha2 0.10.9", "slog", "strum", "strum_macros", @@ -1233,6 +2588,21 @@ dependencies = [ "wslpath", ] +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + [[package]] name = "potential_utf" version = "0.1.2" @@ -1257,6 +2627,12 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "pretty" version = "0.12.4" @@ -1265,7 +2641,26 @@ checksum = "ac98773b7109bc75f475ab5a134c9b64b87e59d776d31098d8f346922396a477" dependencies = [ "arrayvec", "typed-arena", - "unicode-width", + "unicode-width 0.1.14", +] + +[[package]] +name = "prettyplease" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a" +dependencies = [ + "proc-macro2", + "syn 2.0.104", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", ] [[package]] @@ -1299,7 +2694,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2", + "socket2 0.5.10", "thiserror 2.0.12", "tokio", "tracing", @@ -1315,7 +2710,7 @@ dependencies = [ "bytes", "getrandom 0.3.3", "lru-slab", - "rand 0.9.1", + "rand 0.9.2", "ring", "rustc-hash", "rustls", @@ -1336,7 +2731,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.5.10", "tracing", "windows-sys 0.59.0", ] @@ -1369,9 +2764,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -1415,15 +2810,43 @@ dependencies = [ "getrandom 0.3.3", ] +[[package]] +name = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" + [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "7e8af0dde094006011e6a740d4879319439489813bd0bcdc7d821beaeeff48ec" dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "redox_users" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 2.0.12", +] + [[package]] name = "regex" version = "1.11.1" @@ -1468,14 +2891,25 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "regress" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145bb27393fe455dd64d6cbc8d059adfa392590a45eadf079c01b11857e7b010" +dependencies = [ + "hashbrown 0.15.4", + "memchr", +] + [[package]] name = "reqwest" -version = "0.12.20" +version = "0.12.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813" +checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" dependencies = [ "base64 0.22.1", "bytes", + "encoding_rs", "futures-channel", "futures-core", "futures-util", @@ -1485,10 +2919,13 @@ dependencies = [ "http-body-util", "hyper", "hyper-rustls", + "hyper-tls", "hyper-util", "js-sys", "log", + "mime", "mime_guess", + "native-tls", "percent-encoding", "pin-project-lite", "quinn", @@ -1500,6 +2937,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper", "tokio", + "tokio-native-tls", "tokio-rustls", "tokio-util", "tower", @@ -1513,6 +2951,16 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + [[package]] name = "ring" version = "0.17.14" @@ -1541,22 +2989,22 @@ checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "rustls" -version = "0.23.28" +version = "0.23.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" dependencies = [ "once_cell", "ring", @@ -1575,7 +3023,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 3.2.0", ] [[package]] @@ -1590,9 +3038,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "ring", "rustls-pki-types", @@ -1611,6 +3059,15 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.27" @@ -1650,6 +3107,33 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + [[package]] name = "security-framework" version = "3.2.0" @@ -1657,7 +3141,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ "bitflags", - "core-foundation", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -1673,6 +3157,15 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + [[package]] name = "serde" version = "1.0.219" @@ -1682,6 +3175,39 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-json-schema" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "481fc729c42ca7b2e93ac70540d05d58511399fef0a28c0d1c163304b042a142" +dependencies = [ + "json-pointer", + "serde", + "serde_json", + "url", +] + +[[package]] +name = "serde-untagged" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" +dependencies = [ + "erased-serde 0.4.6", + "serde", + "typeid", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + [[package]] name = "serde_bytes" version = "0.11.17" @@ -1725,10 +3251,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.141" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" dependencies = [ + "indexmap", "itoa", "memchr", "ryu", @@ -1746,6 +3273,15 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1758,6 +3294,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.9" @@ -1766,7 +3315,7 @@ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -1778,6 +3327,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + [[package]] name = "shlex" version = "1.3.0" @@ -1793,6 +3348,34 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror 2.0.12", + "time", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.10" @@ -1805,7 +3388,7 @@ version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" dependencies = [ - "erased-serde", + "erased-serde 0.3.31", ] [[package]] @@ -1833,9 +3416,29 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "stable-fs" -version = "0.8.1" +version = "0.9.0" dependencies = [ "bitflags", "candid", @@ -1866,6 +3469,30 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "stop-token" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af91f480ee899ab2d9f8435bfdfc14d08a5754bd9d3fef1f1a1c23336aad6c8b" +dependencies = [ + "async-channel", + "cfg-if", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + [[package]] name = "strsim" version = "0.11.1" @@ -1900,6 +3527,12 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + [[package]] name = "syn" version = "1.0.109" @@ -1942,6 +3575,27 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tempfile" version = "3.20.0" @@ -1955,6 +3609,26 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -2035,6 +3709,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinystr" version = "0.8.1" @@ -2062,18 +3745,20 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.1" +version = "1.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "slab", + "socket2 0.5.10", "tokio-macros", "windows-sys 0.52.0", ] @@ -2089,6 +3774,16 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.26.2" @@ -2112,6 +3807,47 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "tower" version = "0.5.2" @@ -2256,6 +3992,12 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typenum" version = "1.18.0" @@ -2274,12 +4016,30 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "unicode-width" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +[[package]] +name = "unicode-width" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "untrusted" version = "0.9.0" @@ -2295,6 +4055,7 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -2303,18 +4064,40 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -2445,13 +4228,25 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] +[[package]] +name = "wf-cdk-bindgen" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14d3ee5d18d9ea3588e0f885fdfee9e850287c32e708418002a0f7d4ce0e6b2" +dependencies = [ + "candid", + "candid_parser", + "convert_case 0.6.0", + "pretty", +] + [[package]] name = "winapi" version = "0.3.9" @@ -2468,12 +4263,56 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -2629,6 +4468,15 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +[[package]] +name = "winnow" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" diff --git a/Cargo.toml b/Cargo.toml index 22b7ba5..566d426 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,22 +1,24 @@ -[package] -name = "stable-fs" -version = "0.8.1" -edition = "2024" -description = "A Simple File system using the stable structures of the Internet Computer that implements WASI endpoints" -keywords = ["ic", "internet-computer", "file-system"] -license = "MIT" -repository = "https://github.com/wasm-forge/stable-fs" +[workspace] +members = [ "integration-tests", + "stable-fs", + "test_canisters/canister_initial/src/canister_initial_backend", + "test_canisters/canister_upgraded/src/canister_upgraded_backend", +] +resolver = "2" + +[workspace.dependencies] -[dependencies] bitflags = "2.9.1" +ciborium = "0.2.2" + ic-cdk = "0.18.5" -ic-stable-structures = "0.6.9" +ic-stable-structures = "0.7.0" serde = "1.0.219" serde_bytes = "0.11.17" -ciborium = "0.2.2" -[dev-dependencies] candid = "0.10.14" pocket-ic = "9.0.2" +hex = "0.4.3" +stable-fs = { path = "stable-fs" } diff --git a/ic-test.json b/ic-test.json new file mode 100644 index 0000000..baf5410 --- /dev/null +++ b/ic-test.json @@ -0,0 +1,26 @@ +{ + "test_folder": "integration-tests", + "icp_setup": { + "skip_dfx_json": true, + "canisters": { + "canister_initial_backend": { + "name": "canister_initial_backend", + "var_name": "canister_initial_backend", + "service_name": "CanisterInitialBackendCanister", + "candid_path": "test_canisters/canister_initial/src/canister_initial_backend/canister_initial_backend.did", + "generate_bindings": true, + "wasm": "target/wasm32-unknown-unknown/release/canister_initial_backend.wasm", + "specified_id": "lz3um-vp777-87777-aaaba-cai" + }, + "canister_upgraded_backend": { + "name": "canister_upgraded_backend", + "var_name": "canister_upgraded_backend", + "service_name": "CanisterUpgradedBackendCanister", + "candid_path": "test_canisters/canister_upgraded/src/canister_upgraded_backend/canister_upgraded_backend.did", + "generate_bindings": true, + "wasm": "target/wasm32-unknown-unknown/release/canister_upgraded_backend.wasm", + "specified_id": null + } + } + } +} \ No newline at end of file diff --git a/integration-tests/Cargo.toml b/integration-tests/Cargo.toml new file mode 100644 index 0000000..51965a5 --- /dev/null +++ b/integration-tests/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "integration-tests" +version = "0.1.0" +edition = "2021" + +[dev-dependencies] +candid = "0.10" +cargo_metadata = "0.19.1" +ic-test = {version = "0.1"} +pocket-ic = "9.0.2" +serde = "1.0.219" +serde_bytes = "0.11.17" +tokio = { version = "1", features = ["full"] } +convert_case = "0.8.0" \ No newline at end of file diff --git a/integration-tests/src/bindings/canister_initial_backend.rs b/integration-tests/src/bindings/canister_initial_backend.rs new file mode 100644 index 0000000..743aea4 --- /dev/null +++ b/integration-tests/src/bindings/canister_initial_backend.rs @@ -0,0 +1,234 @@ +// This is an experimental feature used to generate Rust bindings from Candid. +// THIS IS A GENERATED FILE. DO NOT EDIT THIS FILE TO AVOID DATA LOSS. +#![allow(dead_code, unused_imports, non_snake_case)] +use candid::{self, CandidType, Decode, Deserialize, Encode, Principal}; + +pub struct CanisterInitialBackendCanister { + pub canister_id: Principal, + pub caller: super::Caller, +} + +impl CanisterInitialBackendCanister { + pub fn append_buffer(&self, arg0: String, arg1: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "append_buffer", + args, + ) + } + pub fn append_text(&self, arg0: String, arg1: String, arg2: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1, &arg2); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "append_text", + args, + ) + } + pub fn cat_file(&self, arg0: String) -> super::CallBuilder { + let args = Encode!(&arg0); + self.caller + .call(self.canister_id, super::CallMode::Query, "cat_file", args) + } + pub fn check_metadata_binary(&self) -> super::CallBuilder { + let args = Encode!(); + self.caller.call( + self.canister_id, + super::CallMode::Query, + "check_metadata_binary", + args, + ) + } + pub fn check_metadata_deserialization_into_repr_c(&self) -> super::CallBuilder { + let args = Encode!(); + self.caller.call( + self.canister_id, + super::CallMode::Query, + " + check_metadata_deserialization_into_repr_c + ", + args, + ) + } + pub fn check_metadata_format(&self) -> super::CallBuilder<()> { + let args = Encode!(); + self.caller.call( + self.canister_id, + super::CallMode::Query, + "check_metadata_format", + args, + ) + } + pub fn chunk_size(&self) -> super::CallBuilder { + let args = Encode!(); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "chunk_size", + args, + ) + } + pub fn clear_buffer(&self) -> super::CallBuilder<()> { + let args = Encode!(); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "clear_buffer", + args, + ) + } + pub fn create_depth_folders(&self, arg0: String, arg1: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "create_depth_folders", + args, + ) + } + pub fn create_files(&self, arg0: String, arg1: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "create_files", + args, + ) + } + pub fn delete_file(&self, arg0: String) -> super::CallBuilder<()> { + let args = Encode!(&arg0); + self.caller.call( + self.canister_id, + super::CallMode::Query, + "delete_file", + args, + ) + } + pub fn delete_folder(&self, arg0: String) -> super::CallBuilder<()> { + let args = Encode!(&arg0); + self.caller.call( + self.canister_id, + super::CallMode::Query, + "delete_folder", + args, + ) + } + pub fn file_size(&self, arg0: String) -> super::CallBuilder { + let args = Encode!(&arg0); + self.caller + .call(self.canister_id, super::CallMode::Query, "file_size", args) + } + pub fn greet(&self, arg0: String) -> super::CallBuilder { + let args = Encode!(&arg0); + self.caller + .call(self.canister_id, super::CallMode::Query, "greet", args) + } + pub fn greet_times(&self, arg0: String, arg1: u64) -> super::CallBuilder> { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Query, + "greet_times", + args, + ) + } + pub fn list_files(&self, arg0: String) -> super::CallBuilder> { + let args = Encode!(&arg0); + self.caller + .call(self.canister_id, super::CallMode::Query, "list_files", args) + } + pub fn load_buffer(&self, arg0: String) -> super::CallBuilder<(u64, u64)> { + let args = Encode!(&arg0); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "load_buffer", + args, + ) + } + pub fn read_buffer(&self, arg0: u64, arg1: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "read_buffer", + args, + ) + } + pub fn read_bytes(&self, arg0: String, arg1: i64, arg2: u64) -> super::CallBuilder<(u64, u64)> { + let args = Encode!(&arg0, &arg1, &arg2); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "read_bytes", + args, + ) + } + pub fn read_text(&self, arg0: String, arg1: i64, arg2: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1, &arg2); + self.caller + .call(self.canister_id, super::CallMode::Query, "read_text", args) + } + pub fn store_buffer(&self, arg0: String) -> super::CallBuilder<(u64, u64)> { + let args = Encode!(&arg0); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "store_buffer", + args, + ) + } + pub fn write_kib_text(&self, arg0: String, arg1: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "write_kib_text", + args, + ) + } + pub fn write_mib_text(&self, arg0: String, arg1: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "write_mib_text", + args, + ) + } +} + +pub fn new(caller: &super::Caller, canister_id: Principal) -> CanisterInitialBackendCanister { + CanisterInitialBackendCanister { + canister_id, + caller: caller.clone(), + } +} + +pub fn deploy(deployer: &super::Deployer) -> super::DeployBuilder { + let args = Encode!(); + let result = deployer.deploy(args, new); + let result = if let Some(id) = canister_id() { + result.with_canister_id(id) + } else { + result + }; + if let Some(wasm) = wasm() { + result.with_wasm(wasm) + } else { + result + } +} +pub fn canister_id() -> Option { + None +} + +pub fn wasm() -> Option> { + let mut path = std::path::PathBuf::new(); + path.push("../target/wasm32-unknown-unknown/release/canister_initial_backend.wasm"); + let wasm = + std::fs::read(path.as_path()).unwrap_or_else(|_| panic!("wasm binary not found: {path:?}")); + Some(wasm) +} diff --git a/integration-tests/src/bindings/canister_upgraded_backend.rs b/integration-tests/src/bindings/canister_upgraded_backend.rs new file mode 100644 index 0000000..c92fcb4 --- /dev/null +++ b/integration-tests/src/bindings/canister_upgraded_backend.rs @@ -0,0 +1,234 @@ +// This is an experimental feature used to generate Rust bindings from Candid. +// THIS IS A GENERATED FILE. DO NOT EDIT THIS FILE TO AVOID DATA LOSS. +#![allow(dead_code, unused_imports, non_snake_case)] +use candid::{self, CandidType, Decode, Deserialize, Encode, Principal}; + +pub struct CanisterUpgradedBackendCanister { + pub canister_id: Principal, + pub caller: super::Caller, +} + +impl CanisterUpgradedBackendCanister { + pub fn append_buffer(&self, arg0: String, arg1: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "append_buffer", + args, + ) + } + pub fn append_text(&self, arg0: String, arg1: String, arg2: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1, &arg2); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "append_text", + args, + ) + } + pub fn cat_file(&self, arg0: String) -> super::CallBuilder { + let args = Encode!(&arg0); + self.caller + .call(self.canister_id, super::CallMode::Query, "cat_file", args) + } + pub fn check_metadata_binary(&self) -> super::CallBuilder { + let args = Encode!(); + self.caller.call( + self.canister_id, + super::CallMode::Query, + "check_metadata_binary", + args, + ) + } + pub fn check_metadata_deserialization_into_repr_c(&self) -> super::CallBuilder { + let args = Encode!(); + self.caller.call( + self.canister_id, + super::CallMode::Query, + " + check_metadata_deserialization_into_repr_c + ", + args, + ) + } + pub fn check_metadata_format(&self) -> super::CallBuilder<()> { + let args = Encode!(); + self.caller.call( + self.canister_id, + super::CallMode::Query, + "check_metadata_format", + args, + ) + } + pub fn chunk_size(&self) -> super::CallBuilder { + let args = Encode!(); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "chunk_size", + args, + ) + } + pub fn clear_buffer(&self) -> super::CallBuilder<()> { + let args = Encode!(); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "clear_buffer", + args, + ) + } + pub fn create_depth_folders(&self, arg0: String, arg1: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "create_depth_folders", + args, + ) + } + pub fn create_files(&self, arg0: String, arg1: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "create_files", + args, + ) + } + pub fn delete_file(&self, arg0: String) -> super::CallBuilder<()> { + let args = Encode!(&arg0); + self.caller.call( + self.canister_id, + super::CallMode::Query, + "delete_file", + args, + ) + } + pub fn delete_folder(&self, arg0: String) -> super::CallBuilder<()> { + let args = Encode!(&arg0); + self.caller.call( + self.canister_id, + super::CallMode::Query, + "delete_folder", + args, + ) + } + pub fn file_size(&self, arg0: String) -> super::CallBuilder { + let args = Encode!(&arg0); + self.caller + .call(self.canister_id, super::CallMode::Query, "file_size", args) + } + pub fn greet(&self, arg0: String) -> super::CallBuilder { + let args = Encode!(&arg0); + self.caller + .call(self.canister_id, super::CallMode::Query, "greet", args) + } + pub fn greet_times(&self, arg0: String, arg1: u64) -> super::CallBuilder> { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Query, + "greet_times", + args, + ) + } + pub fn list_files(&self, arg0: String) -> super::CallBuilder> { + let args = Encode!(&arg0); + self.caller + .call(self.canister_id, super::CallMode::Query, "list_files", args) + } + pub fn load_buffer(&self, arg0: String) -> super::CallBuilder<(u64, u64)> { + let args = Encode!(&arg0); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "load_buffer", + args, + ) + } + pub fn read_buffer(&self, arg0: u64, arg1: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "read_buffer", + args, + ) + } + pub fn read_bytes(&self, arg0: String, arg1: i64, arg2: u64) -> super::CallBuilder<(u64, u64)> { + let args = Encode!(&arg0, &arg1, &arg2); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "read_bytes", + args, + ) + } + pub fn read_text(&self, arg0: String, arg1: i64, arg2: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1, &arg2); + self.caller + .call(self.canister_id, super::CallMode::Query, "read_text", args) + } + pub fn store_buffer(&self, arg0: String) -> super::CallBuilder<(u64, u64)> { + let args = Encode!(&arg0); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "store_buffer", + args, + ) + } + pub fn write_kib_text(&self, arg0: String, arg1: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "write_kib_text", + args, + ) + } + pub fn write_mib_text(&self, arg0: String, arg1: u64) -> super::CallBuilder { + let args = Encode!(&arg0, &arg1); + self.caller.call( + self.canister_id, + super::CallMode::Update, + "write_mib_text", + args, + ) + } +} + +pub fn new(caller: &super::Caller, canister_id: Principal) -> CanisterUpgradedBackendCanister { + CanisterUpgradedBackendCanister { + canister_id, + caller: caller.clone(), + } +} + +pub fn deploy(deployer: &super::Deployer) -> super::DeployBuilder { + let args = Encode!(); + let result = deployer.deploy(args, new); + let result = if let Some(id) = canister_id() { + result.with_canister_id(id) + } else { + result + }; + if let Some(wasm) = wasm() { + result.with_wasm(wasm) + } else { + result + } +} +pub fn canister_id() -> Option { + None +} + +pub fn wasm() -> Option> { + let mut path = std::path::PathBuf::new(); + path.push("../target/wasm32-unknown-unknown/release/canister_upgraded_backend.wasm"); + let wasm = + std::fs::read(path.as_path()).unwrap_or_else(|_| panic!("wasm binary not found: {path:?}")); + Some(wasm) +} diff --git a/integration-tests/src/bindings/mod.rs b/integration-tests/src/bindings/mod.rs new file mode 100644 index 0000000..a0c1116 --- /dev/null +++ b/integration-tests/src/bindings/mod.rs @@ -0,0 +1,15 @@ +// THIS IS A GENERATED FILE, DO NOT EDIT! +#![allow(dead_code, unused_imports, non_snake_case)] + +type CallMode = ic_test::CallMode; +type Caller = ic_test::IcpUser; +type CallBuilder = ic_test::CallBuilder; +type DeployMode = ic_test::DeployMode; +type Deployer = ic_test::IcpUser; +type DeployBuilder = ic_test::DeployBuilder; + +// candid: test_canisters/canister_initial/src/canister_initial_backend/canister_initial_backend.did +pub mod canister_initial_backend; + +// candid: test_canisters/canister_upgraded/src/canister_upgraded_backend/canister_upgraded_backend.did +pub mod canister_upgraded_backend; diff --git a/integration-tests/src/lib.rs b/integration-tests/src/lib.rs new file mode 100644 index 0000000..00f3f9f --- /dev/null +++ b/integration-tests/src/lib.rs @@ -0,0 +1,5 @@ +#![cfg(test)] + +mod bindings; +mod test_setup; +mod tests; diff --git a/integration-tests/src/test_setup.rs b/integration-tests/src/test_setup.rs new file mode 100644 index 0000000..411610f --- /dev/null +++ b/integration-tests/src/test_setup.rs @@ -0,0 +1,34 @@ +// This is a generated test setup file. +// Manual changes are possible, but you still need to make sure they are not lost, if the file is regenerated. +// If possible, it is best to keep any additional manual test preparation steps outside, in `tests.rs`, +// then this file can be regenerated without risk of losing work. + +use ic_test::IcpTest; + +use crate::bindings::{ + canister_initial_backend::{self, CanisterInitialBackendCanister}, + canister_upgraded_backend::{self, CanisterUpgradedBackendCanister}, +}; + +#[allow(dead_code)] +pub(crate) struct Env { + pub icp_test: IcpTest, + pub canister_initial_backend: CanisterInitialBackendCanister, + pub canister_upgraded_backend: CanisterUpgradedBackendCanister, +} + +pub(crate) async fn setup(icp_test: IcpTest) -> Env { + let icp_user = icp_test.icp.test_user(0); + + // initialize canisters + + let canister_initial_backend = canister_initial_backend::deploy(&icp_user).call().await; + + let canister_upgraded_backend = canister_upgraded_backend::deploy(&icp_user).call().await; + + Env { + icp_test, + canister_initial_backend, + canister_upgraded_backend, + } +} diff --git a/integration-tests/src/tests.rs b/integration-tests/src/tests.rs new file mode 100644 index 0000000..e835c20 --- /dev/null +++ b/integration-tests/src/tests.rs @@ -0,0 +1,554 @@ +//! This is a sample test file, it shows an example of how to create actual tests. +//! The file is only generated once and won't be overwritten. + +use ic_test::IcpTest; + +use crate::{ + bindings::canister_upgraded_backend, + test_setup::{self, Env}, +}; + +async fn upgrade_canister(env: &Env) { + let wasm = canister_upgraded_backend::wasm().expect("Wasm not found for the upgrade_canister"); + + let user = env.icp_test.icp.default_user().principal; + + env.icp_test + .icp + .pic + .upgrade_canister( + env.canister_initial_backend.canister_id, + wasm, + vec![], + Some(user), + ) + .await + .expect("Failed to upgrade canister!"); +} + +#[tokio::test] +async fn greet_after_upgrade() { + let env = test_setup::setup(IcpTest::new().await).await; + + let result = env + .canister_initial_backend + .greet("ICP".to_string()) + .call() + .await; + + assert_eq!(result, "Hello, ICP!"); + + upgrade_canister(&env).await; + + let result = env + .canister_initial_backend + .greet("ICP".to_string()) + .call() + .await; + + assert_eq!(result, "Greetings, ICP!"); +} + +#[tokio::test] +async fn writing_10mib() { + let env = test_setup::setup(IcpTest::new().await).await; + + env.icp_test.tick().await; + + let _result = env + .canister_initial_backend + .write_mib_text("test.txt".to_string(), 10) + .call() + .await; +} + +#[tokio::test] +async fn reading_file_after_upgrade() { + let env = test_setup::setup(IcpTest::new().await).await; + + env.canister_initial_backend + .append_text("d1/d2/d3/test1.txt".to_string(), "test1".to_string(), 10u64) + .call() + .await; + env.canister_initial_backend + .append_text("d1/d2/test2.txt".to_string(), "test2".to_string(), 10u64) + .call() + .await; + env.canister_initial_backend + .append_text("test3.txt".to_string(), "test3".to_string(), 10u64) + .call() + .await; + env.canister_initial_backend + .append_text("d1/d2/test2.txt".to_string(), "abc".to_string(), 10u64) + .call() + .await; + + let result = env + .canister_initial_backend + .read_text("d1/d2/test2.txt".to_string(), 45i64, 100u64) + .call() + .await; + + assert_eq!(result, "test2abcabcabcabcabcabcabcabcabcabc"); + + upgrade_canister(&env).await; + + let result = env + .canister_initial_backend + .read_text("d1/d2/test2.txt".to_string(), 40i64, 15u64) + .call() + .await; + + assert_eq!(result, "test2test2abcab"); +} + +#[tokio::test] +async fn writing_file_after_upgrade() { + let env = test_setup::setup(IcpTest::new().await).await; + + env.canister_initial_backend + .append_text("test1.txt".to_string(), "test1".to_string(), 10u64) + .call() + .await; + env.canister_initial_backend + .append_text("test2.txt".to_string(), "test2".to_string(), 10u64) + .call() + .await; + env.canister_initial_backend + .append_text("test3.txt".to_string(), "test3".to_string(), 10u64) + .call() + .await; + env.canister_initial_backend + .append_text("test2.txt".to_string(), "abc".to_string(), 10u64) + .call() + .await; + + let result = env + .canister_initial_backend + .read_text("test2.txt".to_string(), 45i64, 100u64) + .call() + .await; + + assert_eq!(result, "test2abcabcabcabcabcabcabcabcabcabc"); + + upgrade_canister(&env).await; + + env.canister_initial_backend + .append_text("test4.txt".to_string(), "test4".to_string(), 10u64) + .call() + .await; + env.canister_initial_backend + .append_text("test5.txt".to_string(), "test5".to_string(), 10u64) + .call() + .await; + env.canister_initial_backend + .append_text("test6.txt".to_string(), "test6".to_string(), 10u64) + .call() + .await; + + let result = env + .canister_initial_backend + .read_text("test1.txt".to_string(), 10i64, 5u64) + .call() + .await; + assert_eq!(result, "test1"); + + let result = env + .canister_initial_backend + .read_text("test2.txt".to_string(), 40i64, 15u64) + .call() + .await; + assert_eq!(result, "test2test2abcab"); + + let result = env + .canister_initial_backend + .read_text("test3.txt".to_string(), 10i64, 5u64) + .call() + .await; + assert_eq!(result, "test3"); + + let result = env + .canister_initial_backend + .read_text("test4.txt".to_string(), 10i64, 5u64) + .call() + .await; + assert_eq!(result, "test4"); + + let result = env + .canister_initial_backend + .read_text("test4.txt".to_string(), 10i64, 5u64) + .call() + .await; + assert_eq!(result, "test4"); + + let result = env + .canister_initial_backend + .read_text("test4.txt".to_string(), 10i64, 5u64) + .call() + .await; + assert_eq!(result, "test4"); +} + +#[tokio::test] +async fn list_folders_after_upgrade() { + let env = test_setup::setup(IcpTest::new().await).await; + + env.canister_initial_backend + .create_files("files".to_string(), 10) + .call() + .await; + env.canister_initial_backend + .create_files("files/./f2".to_string(), 10) + .call() + .await; + + assert_eq!( + vec! {"0.txt", "1.txt", "2.txt", "3.txt", "4.txt", "5.txt", "6.txt", "7.txt", "8.txt", "9.txt", "f2"}, + env.canister_initial_backend + .list_files("files".to_string()) + .call() + .await + ); + + assert_eq!( + vec! {"0.txt", "1.txt", "2.txt", "3.txt", "4.txt", "5.txt", "6.txt", "7.txt", "8.txt", "9.txt"}, + env.canister_initial_backend + .list_files("files/f2".to_string()) + .call() + .await + ); + + // do upgrade + upgrade_canister(&env).await; + + assert_eq!( + vec! {"0.txt", "1.txt", "2.txt", "3.txt", "4.txt", "5.txt", "6.txt", "7.txt", "8.txt", "9.txt", "f2"}, + env.canister_initial_backend + .list_files("files".to_string()) + .call() + .await + ); + + assert_eq!( + vec! {"0.txt", "1.txt", "2.txt", "3.txt", "4.txt", "5.txt", "6.txt", "7.txt", "8.txt", "9.txt"}, + env.canister_initial_backend + .list_files("files/f2".to_string()) + .call() + .await + ); +} + +#[tokio::test] +async fn create_1000_files() { + let env = test_setup::setup(IcpTest::new().await).await; + + let file_count = 250; + let path1 = "./files1"; + let path2 = "files2//"; + let path3 = "files3"; + let path4 = ".//files4"; + + env.canister_initial_backend + .create_files(path1.to_string(), file_count) + .call() + .await; + + env.canister_initial_backend + .create_files(path2.to_string(), file_count) + .call() + .await; + + env.canister_initial_backend + .create_files(path3.to_string(), file_count) + .call() + .await; + + env.canister_initial_backend + .create_files(path4.to_string(), file_count) + .call() + .await; + + let result = env + .canister_initial_backend + .list_files(path2.to_string()) + .call() + .await; + + let mut filenames = vec![]; + + for i in 0..file_count { + filenames.push(format!("{i}.txt")) + } + assert_eq!(result, filenames); + + let result = env + .canister_initial_backend + .list_files("".to_string()) + .call() + .await; + + let filenames = vec!["mount_file.txt", "files1", "files2", "files3", "files4"]; + + assert_eq!(result, filenames); +} + +fn no_virtual_names(vec: Vec) -> Vec { + let mut v = vec; + + v.retain(|v| !(*v).eq("mount_file.txt")); + + v +} + +#[tokio::test] +async fn long_paths_and_file_names() { + let env = test_setup::setup(IcpTest::new().await).await; + + let file_count = 20; + + // maximal file length 255 letters or max possible length with some utf8 chars + let long_name = "1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDE"; + let long_name2 = "1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCä"; + let long_name3 = "1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF💖567890ABCDEF1234567890A💖"; + + let mut path = "".to_string(); + + // form long path (total depth - 300 folders) + for _ in 0..100 { + path.push_str(long_name); + path.push('/'); + path.push_str(long_name2); + path.push('/'); + path.push_str(long_name3); + path.push('/'); + } + + env.canister_initial_backend + .create_files(path.to_string(), file_count) + .call() + .await; + + let result = env + .canister_initial_backend + .list_files(path.to_string()) + .call() + .await; + + let mut filenames = vec![]; + + for i in 0..file_count { + filenames.push(format!("{i}.txt")) + } + assert_eq!(result, filenames); + + let filenames = vec![long_name]; + + let result = env + .canister_initial_backend + .list_files("".to_string()) + .call() + .await; + let result = no_virtual_names(result); + + assert_eq!(result, filenames); + + // try reading one of the files + + let file_content_start = "0123456789012345678901234567890123456789012345678901234567890123:"; + let file_name = "13.txt"; + let expected_content = format!("{file_content_start}{path}/{file_name}"); + let content_length = expected_content.len(); + + let content = env + .canister_initial_backend + .read_text(format!("{path}/{file_name}"), 0, 100000) + .call() + .await; + assert_eq!(expected_content, content); + + let expected_content = "0123:123"; + let content = env + .canister_initial_backend + .read_text(format!("{path}/3.txt"), 60, expected_content.len() as u64) + .call() + .await; + assert_eq!(expected_content, content); + + let expected_content = "A💖//13.txt"; + let content = env + .canister_initial_backend + .read_text( + format!("{path}/13.txt"), + content_length as i64 - expected_content.len() as i64, + 100, + ) + .call() + .await; + + assert_eq!(expected_content, content); +} + +#[tokio::test] +async fn large_file_read() { + let env = test_setup::setup(IcpTest::new().await).await; + + let filename = "test.txt"; + + // create large file + env.canister_initial_backend + .append_text("t1.txt".to_string(), "abcdef7890".to_string(), 10_000_000) + .call() + .await; + env.canister_initial_backend + .append_text("t2.txt".to_string(), "abcdef7890".to_string(), 10_000_000) + .call() + .await; + env.canister_initial_backend + .append_text("t3.txt".to_string(), "abcdef7890".to_string(), 10_000_000) + .call() + .await; + env.canister_initial_backend + .append_text("t4.txt".to_string(), "abcdef7890".to_string(), 10_000_000) + .call() + .await; + env.canister_initial_backend + .append_text(filename.to_string(), "abcdef7890".to_string(), 10_000_000) + .call() + .await; + + // TODO: ic-test does not support functions returning tuples + + /* + let (instructions, size) = env + .canister_initial_backend + .read_bytes(filename.to_string(), 13, 100_000_000) + .call() + .await; + + println!("instructions {instructions}, size {size}"); + + assert!( + instructions < 3_000_000_000, + "The call should take less than 3 billion instructions" + ); + + assert_eq!(size, 99_999_987); + */ +} + +/* TODO: tuple support needs to be fixed in ic-test +#[test] +fn large_file_read_after_upgrade() { + let env = test_setup::setup(IcpTest::new().await).await; + + let filename = "mount_file.txt"; + + // create large file + fns::append_text(&pic, "t1.txt", "abcdef7890", 10_000_000); + fns::append_text(&pic, "t2.txt", "abcdef7890", 10_000_000); + fns::append_text(&pic, "t3.txt", "abcdef7890", 10_000_000); + fns::append_text(&pic, "t4.txt", "abcdef7890", 10_000_000); + fns::append_text(&pic, filename, "abcdef7890", 10_000_000); + + // do upgrade + upgrade_canister(&pic); + + let (instructions, size) = fns::read_bytes(&pic, filename, 13, 100_000_000); + + println!("instructions {instructions}, size {size}"); + + assert!( + instructions < 3_000_000_000, + "The call should take less than 3 billion instructions" + ); + + assert_eq!(size, 99_999_987); +} + +#[tokio::test] +async fn large_mounted_file_write() { + let env = test_setup::setup(IcpTest::new().await).await; + + let filename = "mount_file.txt"; + + // create large buffer + env.canister_initial_backend + .append_buffer("abcdef7890".to_string(), 10_000_000) + .call() + .await; + + let (instructions, size) = fns::store_buffer(&pic, filename); + + println!("instructions {instructions}, size {size}"); + + assert!( + instructions < 14_000_000_000, + "The call should take less than 3 billion instructions" + ); + + assert_eq!(size, 100_000_000); +} + +#[tokio::test] +async fn large_file_write() { + let env = test_setup::setup(IcpTest::new().await).await; + + let filename = "some_file.txt"; + + // create large buffer + fns::append_buffer(&pic, "abcdef7890", 10_000_000); + + let (instructions, size) = fns::store_buffer(&pic, filename); + + println!("instructions {instructions}, size {size}"); + + assert!( + instructions < 14_000_000_000, + "The call should take less than 3 billion instructions" + ); + + assert_eq!(size, 100_000_000); +} + +#[tokio::test] +async fn large_file_second_write() { + let env = test_setup::setup(IcpTest::new().await).await; + + let filename = "some_file.txt"; + + // create large buffer + fns::append_buffer(&pic, "abcdef7890", 10_000_000); + + fns::store_buffer(&pic, filename); + + let (instructions, size) = fns::store_buffer(&pic, filename); + + println!("instructions {instructions}, size {size}"); + + assert!( + instructions < 14_000_000_000, + "The call should take less than 3 billion instructions" + ); + + assert_eq!(size, 100_000_000); +} +*/ + +#[tokio::test] +async fn check_metadata_binary() { + let env = test_setup::setup(IcpTest::new().await).await; + + // we should track any changes that affect Metadata binary representation in memory + // as it is stored directly without explicit serialization for the sake of performance. + let bin = env + .canister_initial_backend + .check_metadata_binary() + .call() + .await; + + // object memory is prefilled with 0xfa explicitly in fns::check_metadata_binary to ensure stable test + assert_eq!( + &bin, + "030000000000000004fafafafafafafa06000000000000000800000000000000410000000000000042000000000000004300000000000000010000000c000000010000000d00000002fafafafafafafa0100000000000000abcd000000000000" + ); +} diff --git a/scripts/build_tests.sh b/scripts/build_tests.sh index 090a2fe..990b11b 100755 --- a/scripts/build_tests.sh +++ b/scripts/build_tests.sh @@ -1,10 +1,10 @@ #!/bin/bash set -e -cd tests/canister_initial -cargo build --release --target wasm32-unknown-unknown +cargo build -p canister_initial_backend --release --target wasm32-unknown-unknown -cd ../canister_upgraded -cargo build --release --target wasm32-unknown-unknown +candid-extractor target/wasm32-unknown-unknown/release/canister_initial_backend.wasm > test_canisters/canister_initial/src/canister_initial_backend/canister_initial_backend.did +cargo build -p canister_upgraded_backend --release --target wasm32-unknown-unknown +candid-extractor target/wasm32-unknown-unknown/release/canister_upgraded_backend.wasm > test_canisters/canister_upgraded/src/canister_upgraded_backend/canister_upgraded_backend.did diff --git a/scripts/deploy_tests.sh b/scripts/deploy_tests.sh index 135fc85..5814e6a 100644 --- a/scripts/deploy_tests.sh +++ b/scripts/deploy_tests.sh @@ -2,7 +2,7 @@ set -e -cd tests/canister_initial +cd test_canisters/canister_initial dfx canister create canister_initial_backend diff --git a/src/integration_tests.rs b/src/integration_tests.rs deleted file mode 100644 index a8f2604..0000000 --- a/src/integration_tests.rs +++ /dev/null @@ -1,556 +0,0 @@ -use candid::Principal; -use fns::read_text; -use pocket_ic::PocketIc; -use std::sync::Once; -use std::{cell::RefCell, fs}; - -const BACKEND_WASM: &str = - "tests/canister_initial/target/wasm32-unknown-unknown/release/canister_initial_backend.wasm"; -const BACKEND_WASM_UPGRADED: &str = - "tests/canister_upgraded/target/wasm32-unknown-unknown/release/canister_upgraded_backend.wasm"; - -thread_local!( - static ACTIVE_CANISTER: RefCell> = const { RefCell::new(None) }; -); - -fn set_active_canister(new_canister: Principal) { - ACTIVE_CANISTER.with(|canister_cell| { - let mut canister = canister_cell.borrow_mut(); - *canister = Some(new_canister); - }) -} - -fn active_canister() -> Principal { - ACTIVE_CANISTER.with(|canister_cell| { - let canister = *canister_cell.borrow(); - canister.unwrap() - }) -} - -static INIT: Once = Once::new(); - -fn build_test_projects() { - INIT.call_once(|| { - use std::process::Command; - let _ = Command::new("bash") - .arg("scripts/build_tests.sh") - .output() - .expect("Failed to execute command"); - }); -} - -fn setup_initial_canister() -> PocketIc { - build_test_projects(); - let pic = PocketIc::new(); - - let wasm = fs::read(BACKEND_WASM).expect("Wasm file not found, run 'dfx build'."); - - let backend_canister = pic.create_canister(); - - pic.add_cycles(backend_canister, 2_000_000_000_000_000); - - set_active_canister(backend_canister); - - pic.install_canister(backend_canister, wasm, vec![], None); - - pic.tick(); - - pic -} - -fn upgrade_canister(pic: &PocketIc) { - build_test_projects(); - - let wasm_upgraded = - fs::read(BACKEND_WASM_UPGRADED).expect("Wasm file not found, run 'dfx build'."); - - pic.upgrade_canister(active_canister(), wasm_upgraded, vec![], None) - .unwrap(); -} - -mod fns { - - use candid::{Principal, decode_args, decode_one, encode_one}; - use pocket_ic::PocketIc; - - use super::active_canister; - - pub(crate) fn greet(pic: &PocketIc, arg: &str) -> String { - let response = pic - .query_call( - active_canister(), - Principal::anonymous(), - "greet", - encode_one(arg).unwrap(), - ) - .expect("Expected reply"); - - let result: String = decode_one(&response).unwrap(); - result - } - - pub(crate) fn append_text(pic: &PocketIc, filename: &str, content: &str, count: u64) { - pic.update_call( - active_canister(), - Principal::anonymous(), - "append_text", - candid::encode_args((filename, content, count)).unwrap(), - ) - .unwrap(); - } - - pub(crate) fn append_buffer(pic: &PocketIc, content: &str, count: u64) { - pic.update_call( - active_canister(), - Principal::anonymous(), - "append_buffer", - candid::encode_args((content, count)).unwrap(), - ) - .unwrap(); - } - - pub(crate) fn store_buffer(pic: &PocketIc, filename: &str) -> (u64, u64) { - let response = pic - .update_call( - active_canister(), - Principal::anonymous(), - "store_buffer", - candid::encode_one(filename).unwrap(), - ) - .unwrap(); - - let result: (u64, u64) = decode_args(&response).unwrap(); - - result - } - - pub(crate) fn read_text(pic: &PocketIc, filename: &str, offset: i64, size: u64) -> String { - let response = pic - .query_call( - active_canister(), - Principal::anonymous(), - "read_text", - candid::encode_args((filename, offset, size)).unwrap(), - ) - .unwrap(); - - let result: String = decode_one(&response).unwrap(); - - result - } - - pub(crate) fn read_bytes(pic: &PocketIc, filename: &str, offset: i64, size: u64) -> (u64, u64) { - let response = pic - .update_call( - active_canister(), - Principal::anonymous(), - "read_bytes", - candid::encode_args((filename, offset, size)).unwrap(), - ) - .unwrap(); - - let result: (u64, u64) = decode_args(&response).unwrap(); - - result - } - - pub(crate) fn create_files(pic: &PocketIc, path: &str, count: u64) { - pic.update_call( - active_canister(), - Principal::anonymous(), - "create_files", - candid::encode_args((path, count)).unwrap(), - ) - .unwrap(); - } - - pub(crate) fn list_files(pic: &PocketIc, path: &str) -> Vec { - let response = pic - .query_call( - active_canister(), - Principal::anonymous(), - "list_files", - encode_one(path).unwrap(), - ) - .unwrap(); - - let result: Vec = decode_one(&response).unwrap(); - - result - } - - pub(crate) fn check_metadata_binary(pic: &PocketIc) -> String { - let response = pic - .query_call( - active_canister(), - Principal::anonymous(), - "check_metadata_binary", - encode_one(()).unwrap(), - ) - .unwrap(); - - let result: String = decode_one(&response).unwrap(); - - result - } -} - -#[test] -fn greet_after_upgrade() { - let pic = setup_initial_canister(); - - let result = fns::greet(&pic, "ICP"); - - assert_eq!(result, "Hello, ICP!"); - - upgrade_canister(&pic); - - let result = fns::greet(&pic, "ICP"); - - assert_eq!(result, "Greetings, ICP!"); -} - -#[test] -fn writing_10mib() { - let pic = setup_initial_canister(); - - let args = candid::encode_args(("test.txt", 10u64)).unwrap(); - - pic.add_cycles(active_canister(), 2_000_000_000_000_000); - - pic.tick(); - - let _response = pic - .update_call( - active_canister(), - Principal::anonymous(), - "write_mib_text", - args, - ) - .unwrap(); -} - -#[test] -fn reading_file_after_upgrade() { - let pic = setup_initial_canister(); - - fns::append_text(&pic, "d1/d2/d3/test1.txt", "test1", 10u64); - fns::append_text(&pic, "d1/d2/test2.txt", "test2", 10u64); - fns::append_text(&pic, "test3.txt", "test3", 10u64); - fns::append_text(&pic, "d1/d2/test2.txt", "abc", 10u64); - - let result = fns::read_text(&pic, "d1/d2/test2.txt", 45i64, 100u64); - assert_eq!(result, "test2abcabcabcabcabcabcabcabcabcabc"); - - // do upgrade - upgrade_canister(&pic); - - let result = fns::read_text(&pic, "d1/d2/test2.txt", 40i64, 15u64); - assert_eq!(result, "test2test2abcab"); -} - -#[test] -fn writing_file_after_upgrade() { - let pic = setup_initial_canister(); - - fns::append_text(&pic, "test1.txt", "test1", 10u64); - fns::append_text(&pic, "test2.txt", "test2", 10u64); - fns::append_text(&pic, "test3.txt", "test3", 10u64); - fns::append_text(&pic, "test2.txt", "abc", 10u64); - - let result = fns::read_text(&pic, "test2.txt", 45i64, 100u64); - assert_eq!(result, "test2abcabcabcabcabcabcabcabcabcabc"); - - // do upgrade - upgrade_canister(&pic); - - fns::append_text(&pic, "test4.txt", "test4", 10u64); - fns::append_text(&pic, "test5.txt", "test5", 10u64); - fns::append_text(&pic, "test6.txt", "test6", 10u64); - - let result = fns::read_text(&pic, "test1.txt", 10i64, 5u64); - assert_eq!(result, "test1"); - let result = fns::read_text(&pic, "test2.txt", 40i64, 15u64); - assert_eq!(result, "test2test2abcab"); - let result = fns::read_text(&pic, "test3.txt", 10i64, 5u64); - assert_eq!(result, "test3"); - let result = fns::read_text(&pic, "test4.txt", 10i64, 5u64); - assert_eq!(result, "test4"); - let result = fns::read_text(&pic, "test5.txt", 10i64, 5u64); - assert_eq!(result, "test5"); - let result = fns::read_text(&pic, "test6.txt", 10i64, 5u64); - assert_eq!(result, "test6"); -} - -#[test] -fn list_folders_after_upgrade() { - let pic = setup_initial_canister(); - - fns::create_files(&pic, "files", 10); - fns::create_files(&pic, "files/./f2", 10); - - assert_eq!( - vec! {"0.txt", "1.txt", "2.txt", "3.txt", "4.txt", "5.txt", "6.txt", "7.txt", "8.txt", "9.txt", "f2"}, - fns::list_files(&pic, "files") - ); - - assert_eq!( - vec! {"0.txt", "1.txt", "2.txt", "3.txt", "4.txt", "5.txt", "6.txt", "7.txt", "8.txt", "9.txt"}, - fns::list_files(&pic, "files/f2") - ); - - // do upgrade - upgrade_canister(&pic); - - assert_eq!( - vec! {"0.txt", "1.txt", "2.txt", "3.txt", "4.txt", "5.txt", "6.txt", "7.txt", "8.txt", "9.txt", "f2"}, - fns::list_files(&pic, "files") - ); - - assert_eq!( - vec! {"0.txt", "1.txt", "2.txt", "3.txt", "4.txt", "5.txt", "6.txt", "7.txt", "8.txt", "9.txt"}, - fns::list_files(&pic, "files/f2") - ); -} - -#[test] -fn create_1000_files() { - let pic = setup_initial_canister(); - - let file_count = 250; - let path1 = "./files1"; - let path2 = "files2//"; - let path3 = "files3"; - let path4 = ".//files4"; - - fns::create_files(&pic, path1, file_count); - fns::create_files(&pic, path2, file_count); - fns::create_files(&pic, path3, file_count); - fns::create_files(&pic, path4, file_count); - - let result = fns::list_files(&pic, path2); - - let mut filenames = vec![]; - - for i in 0..file_count { - filenames.push(format!("{i}.txt")) - } - assert_eq!(result, filenames); - - let result = fns::list_files(&pic, ""); - - let filenames = vec!["mount_file.txt", "files1", "files2", "files3", "files4"]; - - assert_eq!(result, filenames); -} - -fn no_virtual_names(vec: Vec) -> Vec { - let mut v = vec; - - v.retain(|v| !(*v).eq("mount_file.txt")); - - v -} - -#[test] -fn long_paths_and_file_names() { - let pic = setup_initial_canister(); - - let file_count = 20; - - // maximal file length 255 letters or max possible length with some utf8 chars - let long_name = "1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDE"; - let long_name2 = "1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCä"; - let long_name3 = "1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF💖567890ABCDEF1234567890A💖"; - - let mut path = "".to_string(); - // form long path (total depth - 300 folders) - for _ in 0..100 { - path.push_str(long_name); - path.push('/'); - path.push_str(long_name2); - path.push('/'); - path.push_str(long_name3); - path.push('/'); - } - - fns::create_files(&pic, &path, file_count); - - let result = fns::list_files(&pic, &path); - - let mut filenames = vec![]; - - for i in 0..file_count { - filenames.push(format!("{i}.txt")) - } - assert_eq!(result, filenames); - - let filenames = vec![long_name]; - - let result = fns::list_files(&pic, ""); - let result = no_virtual_names(result); - - assert_eq!(result, filenames); - - // try reading one of the files - - let file_content_start = "0123456789012345678901234567890123456789012345678901234567890123:"; - let file_name = "13.txt"; - let expected_content = format!("{file_content_start}{path}/{file_name}"); - let content_length = expected_content.len(); - - let content = read_text(&pic, &format!("{path}/{file_name}"), 0, 100000); - assert_eq!(expected_content, content); - - let expected_content = "0123:123"; - let content = read_text( - &pic, - &format!("{path}/3.txt"), - 60, - expected_content.len() as u64, - ); - assert_eq!(expected_content, content); - - let expected_content = "A💖//13.txt"; - let content = read_text( - &pic, - &format!("{path}/13.txt"), - content_length as i64 - expected_content.len() as i64, - 100, - ); - - assert_eq!(expected_content, content); -} - -#[test] -fn large_file_read() { - let pic = setup_initial_canister(); - - let filename = "test.txt"; - - // create large file - fns::append_text(&pic, "t1.txt", "abcdef7890", 10_000_000); - fns::append_text(&pic, "t2.txt", "abcdef7890", 10_000_000); - fns::append_text(&pic, "t3.txt", "abcdef7890", 10_000_000); - fns::append_text(&pic, "t4.txt", "abcdef7890", 10_000_000); - fns::append_text(&pic, filename, "abcdef7890", 10_000_000); - - let (instructions, size) = fns::read_bytes(&pic, filename, 13, 100_000_000); - - println!("instructions {instructions}, size {size}"); - - assert!( - instructions < 3_000_000_000, - "The call should take less than 3 billion instructions" - ); - - assert_eq!(size, 99_999_987); -} - -#[test] -fn large_file_read_after_upgrade() { - let pic = setup_initial_canister(); - - let filename = "mount_file.txt"; - - // create large file - fns::append_text(&pic, "t1.txt", "abcdef7890", 10_000_000); - fns::append_text(&pic, "t2.txt", "abcdef7890", 10_000_000); - fns::append_text(&pic, "t3.txt", "abcdef7890", 10_000_000); - fns::append_text(&pic, "t4.txt", "abcdef7890", 10_000_000); - fns::append_text(&pic, filename, "abcdef7890", 10_000_000); - - // do upgrade - upgrade_canister(&pic); - - let (instructions, size) = fns::read_bytes(&pic, filename, 13, 100_000_000); - - println!("instructions {instructions}, size {size}"); - - assert!( - instructions < 3_000_000_000, - "The call should take less than 3 billion instructions" - ); - - assert_eq!(size, 99_999_987); -} - -#[test] -fn large_mounted_file_write() { - let pic = setup_initial_canister(); - - let filename = "mount_file.txt"; - - // create large buffer - fns::append_buffer(&pic, "abcdef7890", 10_000_000); - - let (instructions, size) = fns::store_buffer(&pic, filename); - - println!("instructions {instructions}, size {size}"); - - assert!( - instructions < 14_000_000_000, - "The call should take less than 3 billion instructions" - ); - - assert_eq!(size, 100_000_000); -} - -#[test] -fn large_file_write() { - let pic = setup_initial_canister(); - - let filename = "some_file.txt"; - - // create large buffer - fns::append_buffer(&pic, "abcdef7890", 10_000_000); - - let (instructions, size) = fns::store_buffer(&pic, filename); - - println!("instructions {instructions}, size {size}"); - - assert!( - instructions < 14_000_000_000, - "The call should take less than 3 billion instructions" - ); - - assert_eq!(size, 100_000_000); -} - -#[test] -fn large_file_second_write() { - let pic = setup_initial_canister(); - - let filename = "some_file.txt"; - - // create large buffer - fns::append_buffer(&pic, "abcdef7890", 10_000_000); - - fns::store_buffer(&pic, filename); - - let (instructions, size) = fns::store_buffer(&pic, filename); - - println!("instructions {instructions}, size {size}"); - - assert!( - instructions < 14_000_000_000, - "The call should take less than 3 billion instructions" - ); - - assert_eq!(size, 100_000_000); -} - -#[test] -fn check_metadata_binary() { - let pic = setup_initial_canister(); - - // we should track any changes that affect Metadata binary representation in memory - // as it is stored directly without explicit serialization for the sake of performance. - let bin = fns::check_metadata_binary(&pic); - - // object memory is prefilled with 0xfa explicitly in fns::check_metadata_binary to ensure stable test - assert_eq!( - &bin, - "030000000000000004fafafafafafafa06000000000000000800000000000000410000000000000042000000000000004300000000000000010000000c000000010000000d00000002fafafafafafafa0100000000000000abcd000000000000" - ); -} diff --git a/stable-fs/Cargo.toml b/stable-fs/Cargo.toml new file mode 100644 index 0000000..9bf73af --- /dev/null +++ b/stable-fs/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "stable-fs" +version = "0.9.0" +edition = "2024" +description = "A Simple File system using the stable structures of the Internet Computer that implements WASI endpoints" +keywords = ["ic", "internet-computer", "file-system"] +license = "MIT" +repository = "https://github.com/wasm-forge/stable-fs" + +[dependencies] +bitflags.workspace = true +ic-cdk.workspace = true +ic-stable-structures.workspace = true + +serde.workspace = true +serde_bytes.workspace = true +ciborium.workspace = true + +[dev-dependencies] +candid.workspace = true +pocket-ic.workspace = true + diff --git a/src/error.rs b/stable-fs/src/error.rs similarity index 100% rename from src/error.rs rename to stable-fs/src/error.rs diff --git a/src/filename_cache.rs b/stable-fs/src/filename_cache.rs similarity index 100% rename from src/filename_cache.rs rename to stable-fs/src/filename_cache.rs diff --git a/src/fs.rs b/stable-fs/src/fs.rs similarity index 100% rename from src/fs.rs rename to stable-fs/src/fs.rs diff --git a/src/fs_tests.rs b/stable-fs/src/fs_tests.rs similarity index 99% rename from src/fs_tests.rs rename to stable-fs/src/fs_tests.rs index 9183539..1970049 100644 --- a/src/fs_tests.rs +++ b/stable-fs/src/fs_tests.rs @@ -951,7 +951,6 @@ mod tests { #[test] fn test_mounts() { let dir_fd = 3; - for mut fs in test_fs_setups("") { let memory = new_vector_memory(); let file_name = "file.txt"; @@ -1843,10 +1842,10 @@ mod tests { /* #[test] fn test_reading_structure() { - let v = std::fs::read("./tests/res/memory-v0_4-op35_1000.bin").unwrap(); + let v = std::fs::read("./test_canisters/res/memory-v0_4-op35_1000.bin").unwrap(); let memory = new_vector_memory_init(v); - let v_files = std::fs::read("./tests/res/structure-v0_4-op35_1000.txt").unwrap(); + let v_files = std::fs::read("./test_canisters/res/structure-v0_4-op35_1000.txt").unwrap(); let files_old = std::str::from_utf8(&v_files).unwrap(); let storage = StableStorage::new(memory); @@ -1865,7 +1864,7 @@ mod tests { let new_content = "other content"; // read old version - let v = std::fs::read("./tests/res/memory-v0.4-some_file_content.bin").unwrap(); + let v = std::fs::read("../test_canisters/res/memory-v0.4-some_file_content.bin").unwrap(); let memory = new_vector_memory_init(v); let storage = StableStorage::new(memory); @@ -1926,7 +1925,7 @@ mod tests { #[test] fn test_generate_structure_v4_with_current_version() { // read old version - let v = std::fs::read("./tests/res/memory-v0_4-op35_1000.bin").unwrap(); + let v = std::fs::read("../test_canisters/res/memory-v0_4-op35_1000.bin").unwrap(); let memory = new_vector_memory_init(v); let storage = StableStorage::new(memory); diff --git a/src/lib.rs b/stable-fs/src/lib.rs similarity index 78% rename from src/lib.rs rename to stable-fs/src/lib.rs index 0b74ae5..e7a6730 100644 --- a/src/lib.rs +++ b/stable-fs/src/lib.rs @@ -11,6 +11,3 @@ mod test_utils; #[cfg(test)] mod fs_tests; - -#[cfg(test)] -mod integration_tests; diff --git a/src/runtime.rs b/stable-fs/src/runtime.rs similarity index 100% rename from src/runtime.rs rename to stable-fs/src/runtime.rs diff --git a/src/runtime/dir.rs b/stable-fs/src/runtime/dir.rs similarity index 100% rename from src/runtime/dir.rs rename to stable-fs/src/runtime/dir.rs diff --git a/src/runtime/fd.rs b/stable-fs/src/runtime/fd.rs similarity index 100% rename from src/runtime/fd.rs rename to stable-fs/src/runtime/fd.rs diff --git a/src/runtime/file.rs b/stable-fs/src/runtime/file.rs similarity index 100% rename from src/runtime/file.rs rename to stable-fs/src/runtime/file.rs diff --git a/src/runtime/structure_helpers.rs b/stable-fs/src/runtime/structure_helpers.rs similarity index 100% rename from src/runtime/structure_helpers.rs rename to stable-fs/src/runtime/structure_helpers.rs diff --git a/src/runtime/types.rs b/stable-fs/src/runtime/types.rs similarity index 100% rename from src/runtime/types.rs rename to stable-fs/src/runtime/types.rs diff --git a/src/storage.rs b/stable-fs/src/storage.rs similarity index 100% rename from src/storage.rs rename to stable-fs/src/storage.rs diff --git a/src/storage/allocator.rs b/stable-fs/src/storage/allocator.rs similarity index 100% rename from src/storage/allocator.rs rename to stable-fs/src/storage/allocator.rs diff --git a/src/storage/chunk_iterator.rs b/stable-fs/src/storage/chunk_iterator.rs similarity index 100% rename from src/storage/chunk_iterator.rs rename to stable-fs/src/storage/chunk_iterator.rs diff --git a/src/storage/dummy.rs b/stable-fs/src/storage/dummy.rs similarity index 100% rename from src/storage/dummy.rs rename to stable-fs/src/storage/dummy.rs diff --git a/src/storage/journal.rs b/stable-fs/src/storage/journal.rs similarity index 100% rename from src/storage/journal.rs rename to stable-fs/src/storage/journal.rs diff --git a/src/storage/metadata_provider.rs b/stable-fs/src/storage/metadata_provider.rs similarity index 98% rename from src/storage/metadata_provider.rs rename to stable-fs/src/storage/metadata_provider.rs index 055fa1a..54b0c8d 100644 --- a/src/storage/metadata_provider.rs +++ b/stable-fs/src/storage/metadata_provider.rs @@ -111,8 +111,8 @@ impl MetadataProvider { let mut chunks: Vec<(Node, FileChunkIndex)> = Vec::new(); - for (k, _v) in filechunk.range(range) { - chunks.push(k); + for en in filechunk.range(range) { + chunks.push(*en.key()); } for (nd, idx) in chunks.into_iter() { @@ -127,7 +127,8 @@ impl MetadataProvider { let mut chunks: Vec<(Node, FileChunkIndex)> = Vec::new(); - for (k, _v) in v2_chunk_ptr.range(range) { + for en in v2_chunk_ptr.range(range) { + let k = *en.key(); chunks.push((k.0, k.1)); } diff --git a/src/storage/ptr_cache.rs b/stable-fs/src/storage/ptr_cache.rs similarity index 98% rename from src/storage/ptr_cache.rs rename to stable-fs/src/storage/ptr_cache.rs index 14e8e4f..87660d8 100644 --- a/src/storage/ptr_cache.rs +++ b/stable-fs/src/storage/ptr_cache.rs @@ -66,7 +66,10 @@ impl PtrCache { let mut iterator_empty = true; - for ((n, index), ptr) in items { + for en in items { + let (n, index) = *en.key(); + let ptr = en.value(); + assert!(node == n); iterator_empty = false; diff --git a/src/storage/stable.rs b/stable-fs/src/storage/stable.rs similarity index 99% rename from src/storage/stable.rs rename to stable-fs/src/storage/stable.rs index 222199a..105d5b0 100644 --- a/src/storage/stable.rs +++ b/stable-fs/src/storage/stable.rs @@ -265,7 +265,7 @@ impl StableStorage { MetadataProvider::new(memories.metadata_memory, memories.mounted_meta_memory); let mut result = Self { - header: Cell::init(memories.header_memory, default_header_value).unwrap(), + header: Cell::init(memories.header_memory, default_header_value), direntry: BTreeMap::init(memories.direntry_memory), filechunk: BTreeMap::init(memories.filechunk_memory), @@ -452,7 +452,10 @@ impl StableStorage { let read_buf = &mut buf[size_read as usize..size_read as usize + to_read as usize]; - if let Some(((nd, idx), ref value)) = cur_fetched { + if let Some(ref en) = cur_fetched { + let (nd, idx) = *en.key(); + let value = en.value(); + if idx == cur_index { assert!(nd == node); @@ -616,7 +619,7 @@ impl StableStorage { let mut chunks: Vec<(Node, FileChunkIndex)> = Vec::new(); - for (k, _v) in self.filechunk.range(range) { + for k in self.filechunk.keys_range(range) { chunks.push(k); } @@ -645,7 +648,7 @@ impl StableStorage { let range = (node, first_deletable_index)..(node, MAX_FILE_CHUNK_COUNT); let mut chunks: Vec<(Node, FileChunkIndex)> = Vec::new(); - for (k, _v) in self.v2_filechunk.v2_chunk_ptr.range(range) { + for k in self.v2_filechunk.v2_chunk_ptr.keys_range(range) { chunks.push(k); } @@ -682,7 +685,7 @@ impl Storage for StableStorage { header.next_node += 1; - self.header.set(header).unwrap(); + self.header.set(header); result } @@ -778,10 +781,13 @@ impl Storage for StableStorage { let max_index = MAX_FILE_ENTRY_INDEX; - for ((_node, index), entry) in self + for en in self .direntry .range((node, initial_index)..(node, max_index)) { + let (_node, index) = *en.key(); + let entry = en.value(); + res.push((index, entry)); } diff --git a/src/storage/transient.rs b/stable-fs/src/storage/transient.rs similarity index 100% rename from src/storage/transient.rs rename to stable-fs/src/storage/transient.rs diff --git a/src/storage/types.rs b/stable-fs/src/storage/types.rs similarity index 95% rename from src/storage/types.rs rename to stable-fs/src/storage/types.rs index ea9a1f6..23e30d1 100644 --- a/src/storage/types.rs +++ b/stable-fs/src/storage/types.rs @@ -101,6 +101,10 @@ impl ic_stable_structures::Storable for FileChunk { std::borrow::Cow::Borrowed(&self.bytes) } + fn into_bytes(self) -> Vec { + self.bytes.to_vec() + } + fn from_bytes(bytes: std::borrow::Cow<[u8]>) -> Self { Self { bytes: bytes.as_ref().try_into().unwrap(), @@ -126,6 +130,12 @@ impl ic_stable_structures::Storable for Header { std::borrow::Cow::Owned(buf) } + fn into_bytes(self) -> Vec { + let mut buf = vec![]; + ciborium::ser::into_writer(&self, &mut buf).unwrap(); + buf + } + fn from_bytes(bytes: std::borrow::Cow<[u8]>) -> Self { ciborium::de::from_reader(bytes.as_ref()).unwrap() } @@ -154,6 +164,12 @@ impl ic_stable_structures::Storable for Metadata { std::borrow::Cow::Owned(buf) } + fn into_bytes(self) -> Vec { + let mut buf = vec![]; + ciborium::ser::into_writer(&self, &mut buf).unwrap(); + buf + } + fn from_bytes(bytes: std::borrow::Cow<[u8]>) -> Self { ciborium::de::from_reader(bytes.as_ref()).unwrap() } @@ -276,6 +292,12 @@ impl ic_stable_structures::Storable for DirEntry { std::borrow::Cow::Owned(buf) } + fn into_bytes(self) -> Vec { + let mut buf = vec![]; + ciborium::ser::into_writer(&self, &mut buf).unwrap(); + buf + } + fn from_bytes(bytes: std::borrow::Cow<[u8]>) -> Self { ciborium::de::from_reader(bytes.as_ref()).unwrap() } diff --git a/src/test_utils.rs b/stable-fs/src/test_utils.rs similarity index 100% rename from src/test_utils.rs rename to stable-fs/src/test_utils.rs diff --git a/tests/a b/test_canisters/a similarity index 100% rename from tests/a rename to test_canisters/a diff --git a/tests/b.sh b/test_canisters/b.sh similarity index 100% rename from tests/b.sh rename to test_canisters/b.sh diff --git a/tests/canister_initial/.gitignore b/test_canisters/canister_initial/.gitignore similarity index 100% rename from tests/canister_initial/.gitignore rename to test_canisters/canister_initial/.gitignore diff --git a/tests/canister_initial/Cargo.lock b/test_canisters/canister_initial/Cargo.lock similarity index 80% rename from tests/canister_initial/Cargo.lock rename to test_canisters/canister_initial/Cargo.lock index 7da35df..f56f67f 100644 --- a/tests/canister_initial/Cargo.lock +++ b/test_canisters/canister_initial/Cargo.lock @@ -106,8 +106,7 @@ dependencies = [ "candid", "ciborium", "hex", - "ic-cdk 0.17.1", - "ic-cdk-timers", + "ic-cdk", "ic-stable-structures", "serde", "serde_bytes", @@ -253,95 +252,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.92", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -374,19 +284,6 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "ic-cdk" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122efbcb0af5280d408a75a57b7dc6e9d92893bf6ed9cc98fe4dcff51f18b67c" -dependencies = [ - "candid", - "ic-cdk-macros 0.17.1", - "ic0 0.23.0", - "serde", - "serde_bytes", -] - [[package]] name = "ic-cdk" version = "0.18.5" @@ -395,10 +292,10 @@ checksum = "db9cc3e0e86ee12504c749fa33793014f1f4d6956a8a70e4db595169c5f6ac26" dependencies = [ "candid", "ic-cdk-executor", - "ic-cdk-macros 0.18.5", + "ic-cdk-macros", "ic-error-types", "ic-management-canister-types", - "ic0 1.0.0", + "ic0", "serde", "serde_bytes", "slotmap", @@ -414,20 +311,6 @@ dependencies = [ "slotmap", ] -[[package]] -name = "ic-cdk-macros" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c792bf0d1621c893ccf2bcdeac4ee70121103a03030a1827031a6b3c60488944" -dependencies = [ - "candid", - "proc-macro2", - "quote", - "serde", - "serde_tokenstream", - "syn 2.0.92", -] - [[package]] name = "ic-cdk-macros" version = "0.18.5" @@ -441,20 +324,6 @@ dependencies = [ "syn 2.0.92", ] -[[package]] -name = "ic-cdk-timers" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb8fd812a9e26f6aa00594546f8fbf4d4853f39c3ba794c8ff11ecf86fd3c9e4" -dependencies = [ - "futures", - "ic-cdk 0.17.1", - "ic0 0.23.0", - "serde", - "serde_bytes", - "slotmap", -] - [[package]] name = "ic-error-types" version = "0.2.0" @@ -479,19 +348,13 @@ dependencies = [ [[package]] name = "ic-stable-structures" -version = "0.6.9" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d30d4cf17aff1024e13133897048bcba580e063c9000571ab766ca37e2996f4" +checksum = "e54aeb082293c69def5ab34c70593ba85ff000386f7d0eacdf73514daaeca031" dependencies = [ "ic_principal", ] -[[package]] -name = "ic0" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de254dd67bbd58073e23dc1c8553ba12fa1dc610a19de94ad2bbcd0460c067f" - [[package]] name = "ic0" version = "1.0.0" @@ -535,12 +398,6 @@ version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - [[package]] name = "num-bigint" version = "0.4.6" @@ -576,18 +433,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pin-project-lite" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "pretty" version = "0.12.3" @@ -661,18 +506,6 @@ dependencies = [ "syn 2.0.92", ] -[[package]] -name = "serde_tokenstream" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64060d864397305347a78851c51588fd283767e7e7589829e8121d65512340f1" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "syn 2.0.92", -] - [[package]] name = "sha2" version = "0.10.8" @@ -690,15 +523,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - [[package]] name = "slotmap" version = "1.0.7" @@ -710,11 +534,11 @@ dependencies = [ [[package]] name = "stable-fs" -version = "0.8.1" +version = "0.9.0" dependencies = [ "bitflags", "ciborium", - "ic-cdk 0.18.5", + "ic-cdk", "ic-stable-structures", "serde", "serde_bytes", diff --git a/tests/canister_initial/clear_buffer.sh b/test_canisters/canister_initial/clear_buffer.sh similarity index 100% rename from tests/canister_initial/clear_buffer.sh rename to test_canisters/canister_initial/clear_buffer.sh diff --git a/tests/canister_initial/create_buffer.sh b/test_canisters/canister_initial/create_buffer.sh similarity index 100% rename from tests/canister_initial/create_buffer.sh rename to test_canisters/canister_initial/create_buffer.sh diff --git a/tests/canister_initial/dfx.json b/test_canisters/canister_initial/dfx.json similarity index 100% rename from tests/canister_initial/dfx.json rename to test_canisters/canister_initial/dfx.json diff --git a/tests/canister_initial/load_buffer.sh b/test_canisters/canister_initial/load_buffer.sh similarity index 100% rename from tests/canister_initial/load_buffer.sh rename to test_canisters/canister_initial/load_buffer.sh diff --git a/tests/canister_initial/read_buffer.sh b/test_canisters/canister_initial/read_buffer.sh similarity index 100% rename from tests/canister_initial/read_buffer.sh rename to test_canisters/canister_initial/read_buffer.sh diff --git a/test_canisters/canister_initial/src/canister_initial_backend/Cargo.toml b/test_canisters/canister_initial/src/canister_initial_backend/Cargo.toml new file mode 100644 index 0000000..2f831dd --- /dev/null +++ b/test_canisters/canister_initial/src/canister_initial_backend/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "canister_initial_backend" +edition = "2021" +publish = false + + +[lib] +crate-type = ["cdylib"] + +[dependencies] +candid.workspace = true +ic-cdk.workspace = true +ic-stable-structures.workspace = true +stable-fs.workspace = true +serde.workspace = true +serde_bytes.workspace = true +ciborium.workspace = true +hex.workspace = true diff --git a/test_canisters/canister_initial/src/canister_initial_backend/canister_initial_backend.did b/test_canisters/canister_initial/src/canister_initial_backend/canister_initial_backend.did new file mode 100644 index 0000000..e9341ae --- /dev/null +++ b/test_canisters/canister_initial/src/canister_initial_backend/canister_initial_backend.did @@ -0,0 +1,25 @@ +service : () -> { + append_buffer : (text, nat64) -> (nat64); + append_text : (text, text, nat64) -> (nat64); + cat_file : (text) -> (text) query; + check_metadata_binary : () -> (text) query; + check_metadata_deserialization_into_repr_c : () -> (nat64) query; + check_metadata_format : () -> () query; + chunk_size : () -> (nat64); + clear_buffer : () -> (); + create_depth_folders : (text, nat64) -> (text); + create_files : (text, nat64) -> (nat64); + delete_file : (text) -> () query; + delete_folder : (text) -> () query; + file_size : (text) -> (nat64) query; + greet : (text) -> (text) query; + greet_times : (text, nat64) -> (vec text) query; + list_files : (text) -> (vec text) query; + load_buffer : (text) -> (nat64, nat64); + read_buffer : (nat64, nat64) -> (text); + read_bytes : (text, int64, nat64) -> (nat64, nat64); + read_text : (text, int64, nat64) -> (text) query; + store_buffer : (text) -> (nat64, nat64); + write_kib_text : (text, nat64) -> (nat64); + write_mib_text : (text, nat64) -> (nat64); +} diff --git a/tests/canister_initial/src/canister_initial_backend/src/lib.rs b/test_canisters/canister_initial/src/canister_initial_backend/src/lib.rs similarity index 97% rename from tests/canister_initial/src/canister_initial_backend/src/lib.rs rename to test_canisters/canister_initial/src/canister_initial_backend/src/lib.rs index 0b44fb1..0d553f1 100644 --- a/tests/canister_initial/src/canister_initial_backend/src/lib.rs +++ b/test_canisters/canister_initial/src/canister_initial_backend/src/lib.rs @@ -5,8 +5,7 @@ use ic_stable_structures::{ DefaultMemoryImpl, Memory, }; -use hex; -use ic_cdk::api::stable::WASM_PAGE_SIZE_IN_BYTES; +use ic_cdk::{export_candid, stable::WASM_PAGE_SIZE_IN_BYTES}; use ic_stable_structures::VectorMemory; use serde::Deserialize; use serde::Serialize; @@ -28,7 +27,7 @@ use stable_fs::{ #[ic_cdk::query] fn greet(name: String) -> String { - format!("Hello, {}!", name) + format!("Hello, {name}!") } #[ic_cdk::query] @@ -67,7 +66,7 @@ thread_local! { } thread_local! { - static BUFFER: RefCell>> = RefCell::new(None); + static BUFFER: RefCell>> = const { RefCell::new(None) }; } #[ic_cdk::update] @@ -101,9 +100,9 @@ pub fn clear_buffer() { let chunk = chunk.as_mut().unwrap(); // explicitly destroy contents - for i in 0..chunk.len() { + (0..chunk.len()).for_each(|i| { chunk[i] = 0; - } + }); chunk.clear() }) @@ -435,7 +434,7 @@ fn cat_file(filename: String) -> String { unsafe { let st = std::str::from_utf8_unchecked(&buf[..(read_size as usize)]); - return st.to_string(); + st.to_string() } }) } @@ -450,13 +449,13 @@ fn create_depth_folders(path: String, count: usize) -> String { let mut dir_name = "d0".to_string(); for num in 1..count { - dir_name = format!("{}/d{}", dir_name, num); + dir_name = format!("{dir_name}/d{num}"); } fs.mkdir(root_dir, dir_name.as_str(), FdStat::default(), 0) .unwrap(); - format!("{}/{}", path, dir_name) + format!("{path}/{dir_name}") }) } @@ -470,7 +469,7 @@ fn create_files(path: String, count: usize) -> u64 { let dir = fs.root_fd(); for num in 0..count { - let filename = format!("{}/{}.txt", path, num); + let filename = format!("{path}/{num}.txt"); let fd = fs .open( @@ -486,8 +485,7 @@ fn create_files(path: String, count: usize) -> u64 { // 64 byte block let text = format!( - "0123456789012345678901234567890123456789012345678901234567890123:{}", - filename + "0123456789012345678901234567890123456789012345678901234567890123:{filename}" ); let write_content = [SrcBuf { @@ -807,3 +805,5 @@ fn check_metadata_binary() -> String { let vec = to_binary(&meta); hex::encode(&vec) } + +export_candid!(); diff --git a/tests/canister_initial/store_buffer.sh b/test_canisters/canister_initial/store_buffer.sh similarity index 100% rename from tests/canister_initial/store_buffer.sh rename to test_canisters/canister_initial/store_buffer.sh diff --git a/tests/canister_initial/store_buffer_4k.sh b/test_canisters/canister_initial/store_buffer_4k.sh similarity index 100% rename from tests/canister_initial/store_buffer_4k.sh rename to test_canisters/canister_initial/store_buffer_4k.sh diff --git a/tests/canister_initial/store_stable.sh b/test_canisters/canister_initial/store_stable.sh similarity index 100% rename from tests/canister_initial/store_stable.sh rename to test_canisters/canister_initial/store_stable.sh diff --git a/tests/canister_upgraded/.gitignore b/test_canisters/canister_upgraded/.gitignore similarity index 100% rename from tests/canister_upgraded/.gitignore rename to test_canisters/canister_upgraded/.gitignore diff --git a/tests/canister_upgraded/Cargo.lock b/test_canisters/canister_upgraded/Cargo.lock similarity index 78% rename from tests/canister_upgraded/Cargo.lock rename to test_canisters/canister_upgraded/Cargo.lock index f462b18..4a6474a 100644 --- a/tests/canister_upgraded/Cargo.lock +++ b/test_canisters/canister_upgraded/Cargo.lock @@ -106,8 +106,7 @@ dependencies = [ "candid", "ciborium", "hex", - "ic-cdk 0.17.1", - "ic-cdk-timers", + "ic-cdk", "ic-stable-structures", "serde", "serde_bytes", @@ -250,95 +249,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.91", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -371,19 +281,6 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "ic-cdk" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122efbcb0af5280d408a75a57b7dc6e9d92893bf6ed9cc98fe4dcff51f18b67c" -dependencies = [ - "candid", - "ic-cdk-macros 0.17.1", - "ic0 0.23.0", - "serde", - "serde_bytes", -] - [[package]] name = "ic-cdk" version = "0.18.5" @@ -392,10 +289,10 @@ checksum = "db9cc3e0e86ee12504c749fa33793014f1f4d6956a8a70e4db595169c5f6ac26" dependencies = [ "candid", "ic-cdk-executor", - "ic-cdk-macros 0.18.5", + "ic-cdk-macros", "ic-error-types", "ic-management-canister-types", - "ic0 1.0.0", + "ic0", "serde", "serde_bytes", "slotmap", @@ -411,20 +308,6 @@ dependencies = [ "slotmap", ] -[[package]] -name = "ic-cdk-macros" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c792bf0d1621c893ccf2bcdeac4ee70121103a03030a1827031a6b3c60488944" -dependencies = [ - "candid", - "proc-macro2", - "quote", - "serde", - "serde_tokenstream", - "syn 2.0.91", -] - [[package]] name = "ic-cdk-macros" version = "0.18.5" @@ -438,20 +321,6 @@ dependencies = [ "syn 2.0.91", ] -[[package]] -name = "ic-cdk-timers" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb8fd812a9e26f6aa00594546f8fbf4d4853f39c3ba794c8ff11ecf86fd3c9e4" -dependencies = [ - "futures", - "ic-cdk 0.17.1", - "ic0 0.23.0", - "serde", - "serde_bytes", - "slotmap", -] - [[package]] name = "ic-error-types" version = "0.2.0" @@ -476,19 +345,13 @@ dependencies = [ [[package]] name = "ic-stable-structures" -version = "0.6.9" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d30d4cf17aff1024e13133897048bcba580e063c9000571ab766ca37e2996f4" +checksum = "e54aeb082293c69def5ab34c70593ba85ff000386f7d0eacdf73514daaeca031" dependencies = [ "ic_principal", ] -[[package]] -name = "ic0" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de254dd67bbd58073e23dc1c8553ba12fa1dc610a19de94ad2bbcd0460c067f" - [[package]] name = "ic0" version = "1.0.0" @@ -532,12 +395,6 @@ version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - [[package]] name = "num-bigint" version = "0.4.5" @@ -573,18 +430,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "pretty" version = "0.12.3" @@ -658,18 +503,6 @@ dependencies = [ "syn 2.0.91", ] -[[package]] -name = "serde_tokenstream" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8790a7c3fe883e443eaa2af6f705952bc5d6e8671a220b9335c8cae92c037e74" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "syn 2.0.91", -] - [[package]] name = "sha2" version = "0.10.8" @@ -681,15 +514,6 @@ dependencies = [ "digest", ] -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - [[package]] name = "slotmap" version = "1.0.7" @@ -701,11 +525,11 @@ dependencies = [ [[package]] name = "stable-fs" -version = "0.8.1" +version = "0.9.0" dependencies = [ "bitflags", "ciborium", - "ic-cdk 0.18.5", + "ic-cdk", "ic-stable-structures", "serde", "serde_bytes", diff --git a/tests/canister_upgraded/README.md b/test_canisters/canister_upgraded/README.md similarity index 100% rename from tests/canister_upgraded/README.md rename to test_canisters/canister_upgraded/README.md diff --git a/test_canisters/canister_upgraded/dfx.json b/test_canisters/canister_upgraded/dfx.json new file mode 100644 index 0000000..8df5ce8 --- /dev/null +++ b/test_canisters/canister_upgraded/dfx.json @@ -0,0 +1,17 @@ +{ + "canisters": { + "canister_upgraded_backend": { + "candid": "src/canister_upgraded_backend/canister_upgraded_backend.did", + "package": "canister_upgraded_backend", + "type": "rust" + } + }, + "defaults": { + "build": { + "args": "", + "packtool": "" + } + }, + "output_env_file": ".env", + "version": 1 +} diff --git a/test_canisters/canister_upgraded/src/canister_upgraded_backend/Cargo.toml b/test_canisters/canister_upgraded/src/canister_upgraded_backend/Cargo.toml new file mode 100644 index 0000000..5614f16 --- /dev/null +++ b/test_canisters/canister_upgraded/src/canister_upgraded_backend/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "canister_upgraded_backend" +edition = "2021" +publish = false + +[lib] +crate-type = ["cdylib"] + +[dependencies] +candid.workspace = true +ic-cdk.workspace = true +ic-stable-structures.workspace = true +stable-fs.workspace = true +serde.workspace = true +serde_bytes.workspace = true +ciborium.workspace = true +hex.workspace = true diff --git a/test_canisters/canister_upgraded/src/canister_upgraded_backend/canister_upgraded_backend.did b/test_canisters/canister_upgraded/src/canister_upgraded_backend/canister_upgraded_backend.did new file mode 100644 index 0000000..e9341ae --- /dev/null +++ b/test_canisters/canister_upgraded/src/canister_upgraded_backend/canister_upgraded_backend.did @@ -0,0 +1,25 @@ +service : () -> { + append_buffer : (text, nat64) -> (nat64); + append_text : (text, text, nat64) -> (nat64); + cat_file : (text) -> (text) query; + check_metadata_binary : () -> (text) query; + check_metadata_deserialization_into_repr_c : () -> (nat64) query; + check_metadata_format : () -> () query; + chunk_size : () -> (nat64); + clear_buffer : () -> (); + create_depth_folders : (text, nat64) -> (text); + create_files : (text, nat64) -> (nat64); + delete_file : (text) -> () query; + delete_folder : (text) -> () query; + file_size : (text) -> (nat64) query; + greet : (text) -> (text) query; + greet_times : (text, nat64) -> (vec text) query; + list_files : (text) -> (vec text) query; + load_buffer : (text) -> (nat64, nat64); + read_buffer : (nat64, nat64) -> (text); + read_bytes : (text, int64, nat64) -> (nat64, nat64); + read_text : (text, int64, nat64) -> (text) query; + store_buffer : (text) -> (nat64, nat64); + write_kib_text : (text, nat64) -> (nat64); + write_mib_text : (text, nat64) -> (nat64); +} diff --git a/tests/canister_upgraded/src/canister_upgraded_backend/src/lib.rs b/test_canisters/canister_upgraded/src/canister_upgraded_backend/src/lib.rs similarity index 97% rename from tests/canister_upgraded/src/canister_upgraded_backend/src/lib.rs rename to test_canisters/canister_upgraded/src/canister_upgraded_backend/src/lib.rs index 9d50819..c565680 100644 --- a/tests/canister_upgraded/src/canister_upgraded_backend/src/lib.rs +++ b/test_canisters/canister_upgraded/src/canister_upgraded_backend/src/lib.rs @@ -5,8 +5,7 @@ use ic_stable_structures::{ DefaultMemoryImpl, Memory, }; -use hex; -use ic_cdk::api::stable::WASM_PAGE_SIZE_IN_BYTES; +use ic_cdk::{export_candid, stable::WASM_PAGE_SIZE_IN_BYTES}; use ic_stable_structures::VectorMemory; use serde::Deserialize; use serde::Serialize; @@ -28,7 +27,7 @@ use stable_fs::{ #[ic_cdk::query] fn greet(name: String) -> String { - format!("Greetings, {}!", name) + format!("Greetings, {name}!") } #[ic_cdk::query] @@ -67,7 +66,7 @@ thread_local! { } thread_local! { - static BUFFER: RefCell>> = RefCell::new(None); + static BUFFER: RefCell>> = const { RefCell::new(None) }; } #[ic_cdk::update] @@ -101,9 +100,9 @@ pub fn clear_buffer() { let chunk = chunk.as_mut().unwrap(); // explicitly destroy contents - for i in 0..chunk.len() { + (0..chunk.len()).for_each(|i| { chunk[i] = 0; - } + }); chunk.clear() }) @@ -435,7 +434,7 @@ fn cat_file(filename: String) -> String { unsafe { let st = std::str::from_utf8_unchecked(&buf[..(read_size as usize)]); - return st.to_string(); + st.to_string() } }) } @@ -450,13 +449,13 @@ fn create_depth_folders(path: String, count: usize) -> String { let mut dir_name = "d0".to_string(); for num in 1..count { - dir_name = format!("{}/d{}", dir_name, num); + dir_name = format!("{dir_name}/d{num}"); } fs.mkdir(root_dir, dir_name.as_str(), FdStat::default(), 0) .unwrap(); - format!("{}/{}", path, dir_name) + format!("{path}/{dir_name}") }) } @@ -470,7 +469,7 @@ fn create_files(path: String, count: usize) -> u64 { let dir = fs.root_fd(); for num in 0..count { - let filename = format!("{}/{}.txt", path, num); + let filename = format!("{path}/{num}.txt"); let fd = fs .open( @@ -486,8 +485,7 @@ fn create_files(path: String, count: usize) -> u64 { // 64 byte block let text = format!( - "0123456789012345678901234567890123456789012345678901234567890123:{}", - filename + "0123456789012345678901234567890123456789012345678901234567890123:{filename}" ); let write_content = [SrcBuf { @@ -807,3 +805,5 @@ fn check_metadata_binary() -> String { let vec = to_binary(&meta); hex::encode(&vec) } + +export_candid!(); diff --git a/tests/fsperf.repl b/test_canisters/fsperf.repl similarity index 100% rename from tests/fsperf.repl rename to test_canisters/fsperf.repl diff --git a/tests/perf.repl b/test_canisters/perf.repl similarity index 100% rename from tests/perf.repl rename to test_canisters/perf.repl diff --git a/tests/res/memory-v0.4-some_file_content.bin b/test_canisters/res/memory-v0.4-some_file_content.bin similarity index 100% rename from tests/res/memory-v0.4-some_file_content.bin rename to test_canisters/res/memory-v0.4-some_file_content.bin diff --git a/tests/res/memory-v0_4-op35_1000.bin b/test_canisters/res/memory-v0_4-op35_1000.bin similarity index 100% rename from tests/res/memory-v0_4-op35_1000.bin rename to test_canisters/res/memory-v0_4-op35_1000.bin diff --git a/tests/res/structure-v0_4-op35_1000.txt b/test_canisters/res/structure-v0_4-op35_1000.txt similarity index 100% rename from tests/res/structure-v0_4-op35_1000.txt rename to test_canisters/res/structure-v0_4-op35_1000.txt diff --git a/tests/res/structure-v0_7-op35_1000.txt b/test_canisters/res/structure-v0_7-op35_1000.txt similarity index 100% rename from tests/res/structure-v0_7-op35_1000.txt rename to test_canisters/res/structure-v0_7-op35_1000.txt diff --git a/tests/canister_initial/Cargo.toml b/tests/canister_initial/Cargo.toml deleted file mode 100644 index eea3aa1..0000000 --- a/tests/canister_initial/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[workspace] -members = [ - "src/canister_initial_backend" -] -resolver = "2" - diff --git a/tests/canister_initial/src/canister_initial_backend/Cargo.toml b/tests/canister_initial/src/canister_initial_backend/Cargo.toml deleted file mode 100644 index 434737c..0000000 --- a/tests/canister_initial/src/canister_initial_backend/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "canister_initial_backend" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -crate-type = ["cdylib"] - -[dependencies] -candid = "0.10" -ic-cdk = "0.17" -ic-cdk-timers = "0.11" # Feel free to remove this dependency if you don't need timers -ic-stable-structures = "0.6.7" -stable-fs = {path="../../../../../stable-fs"} - -serde = "1.0.216" -serde_bytes = "0.11.15" -ciborium = "0.2.2" -hex = "0.4" diff --git a/tests/canister_initial/src/canister_initial_backend/canister_initial_backend.did b/tests/canister_initial/src/canister_initial_backend/canister_initial_backend.did deleted file mode 100644 index 41c45d3..0000000 --- a/tests/canister_initial/src/canister_initial_backend/canister_initial_backend.did +++ /dev/null @@ -1,11 +0,0 @@ -service : { - "greet": (text) -> (text) query; - - "write_mib_text": (text, nat64) -> (nat64); - - "write_kib_text": (text, nat64) -> (nat64); - - "write_text": (text, text, nat64) -> (nat64); - - "read_text": (text, int64, nat64) -> (text); -} diff --git a/tests/canister_upgraded/Cargo.toml b/tests/canister_upgraded/Cargo.toml deleted file mode 100644 index 0e15a19..0000000 --- a/tests/canister_upgraded/Cargo.toml +++ /dev/null @@ -1,5 +0,0 @@ -[workspace] -members = [ - "src/canister_upgraded_backend" -] -resolver = "2" diff --git a/tests/canister_upgraded/src/canister_upgraded_backend/Cargo.toml b/tests/canister_upgraded/src/canister_upgraded_backend/Cargo.toml deleted file mode 100644 index 271de13..0000000 --- a/tests/canister_upgraded/src/canister_upgraded_backend/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "canister_upgraded_backend" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -crate-type = ["cdylib"] - -[dependencies] -candid = "0.10" -ic-cdk = "0.17" -ic-cdk-timers = "0.11" # Feel free to remove this dependency if you don't need timers -ic-stable-structures = "0.6.7" -stable-fs = {path="../../../../../stable-fs"} - - -serde = "1.0.216" -serde_bytes = "0.11.15" -ciborium = "0.2.2" -hex = "0.4" diff --git a/tests/canister_upgraded/src/canister_upgraded_backend/canister_upgraded_backend.did b/tests/canister_upgraded/src/canister_upgraded_backend/canister_upgraded_backend.did deleted file mode 100644 index aa419a2..0000000 --- a/tests/canister_upgraded/src/canister_upgraded_backend/canister_upgraded_backend.did +++ /dev/null @@ -1,3 +0,0 @@ -service : { - "greet": (text) -> (text) query; -}