Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F3361619
D8966.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
69 KB
Referenced Files
None
Subscribers
None
D8966.diff
View Options
diff --git a/services/commtest/Cargo.lock b/services/commtest/Cargo.lock
--- a/services/commtest/Cargo.lock
+++ b/services/commtest/Cargo.lock
@@ -2,11 +2,50 @@
# It is not intended for manual editing.
version = 3
+[[package]]
+name = "addr2line"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
[[package]]
name = "anyhow"
-version = "1.0.68"
+version = "1.0.75"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61"
+checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
[[package]]
name = "argon2"
@@ -57,6 +96,324 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+[[package]]
+name = "aws-config"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bcdcf0d683fe9c23d32cf5b53c9918ea0a500375a9fb20109802552658e576c9"
+dependencies = [
+ "aws-credential-types",
+ "aws-http",
+ "aws-sdk-sso",
+ "aws-sdk-sts",
+ "aws-smithy-async",
+ "aws-smithy-client",
+ "aws-smithy-http",
+ "aws-smithy-http-tower",
+ "aws-smithy-json",
+ "aws-smithy-types",
+ "aws-types",
+ "bytes",
+ "fastrand",
+ "hex",
+ "http",
+ "hyper",
+ "ring",
+ "time 0.3.26",
+ "tokio",
+ "tower",
+ "tracing",
+ "zeroize",
+]
+
+[[package]]
+name = "aws-credential-types"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fcdb2f7acbc076ff5ad05e7864bdb191ca70a6fd07668dc3a1a8bcd051de5ae"
+dependencies = [
+ "aws-smithy-async",
+ "aws-smithy-types",
+ "fastrand",
+ "tokio",
+ "tracing",
+ "zeroize",
+]
+
+[[package]]
+name = "aws-endpoint"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8cce1c41a6cfaa726adee9ebb9a56fcd2bbfd8be49fd8a04c5e20fd968330b04"
+dependencies = [
+ "aws-smithy-http",
+ "aws-smithy-types",
+ "aws-types",
+ "http",
+ "regex",
+ "tracing",
+]
+
+[[package]]
+name = "aws-http"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aadbc44e7a8f3e71c8b374e03ecd972869eb91dd2bc89ed018954a52ba84bc44"
+dependencies = [
+ "aws-credential-types",
+ "aws-smithy-http",
+ "aws-smithy-types",
+ "aws-types",
+ "bytes",
+ "http",
+ "http-body",
+ "lazy_static",
+ "percent-encoding",
+ "pin-project-lite",
+ "tracing",
+]
+
+[[package]]
+name = "aws-sdk-dynamodb"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67fb64867fe098cffee7e34352b01bbfa2beb3aa1b2ff0e0a7bf9ff293557852"
+dependencies = [
+ "aws-credential-types",
+ "aws-endpoint",
+ "aws-http",
+ "aws-sig-auth",
+ "aws-smithy-async",
+ "aws-smithy-client",
+ "aws-smithy-http",
+ "aws-smithy-http-tower",
+ "aws-smithy-json",
+ "aws-smithy-types",
+ "aws-types",
+ "bytes",
+ "fastrand",
+ "http",
+ "regex",
+ "tokio-stream",
+ "tower",
+ "tracing",
+]
+
+[[package]]
+name = "aws-sdk-sso"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8b812340d86d4a766b2ca73f740dfd47a97c2dff0c06c8517a16d88241957e4"
+dependencies = [
+ "aws-credential-types",
+ "aws-endpoint",
+ "aws-http",
+ "aws-sig-auth",
+ "aws-smithy-async",
+ "aws-smithy-client",
+ "aws-smithy-http",
+ "aws-smithy-http-tower",
+ "aws-smithy-json",
+ "aws-smithy-types",
+ "aws-types",
+ "bytes",
+ "http",
+ "regex",
+ "tokio-stream",
+ "tower",
+ "tracing",
+]
+
+[[package]]
+name = "aws-sdk-sts"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "265fac131fbfc188e5c3d96652ea90ecc676a934e3174eaaee523c6cec040b3b"
+dependencies = [
+ "aws-credential-types",
+ "aws-endpoint",
+ "aws-http",
+ "aws-sig-auth",
+ "aws-smithy-async",
+ "aws-smithy-client",
+ "aws-smithy-http",
+ "aws-smithy-http-tower",
+ "aws-smithy-json",
+ "aws-smithy-query",
+ "aws-smithy-types",
+ "aws-smithy-xml",
+ "aws-types",
+ "bytes",
+ "http",
+ "regex",
+ "tower",
+ "tracing",
+]
+
+[[package]]
+name = "aws-sig-auth"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b94acb10af0c879ecd5c7bdf51cda6679a0a4f4643ce630905a77673bfa3c61"
+dependencies = [
+ "aws-credential-types",
+ "aws-sigv4",
+ "aws-smithy-http",
+ "aws-types",
+ "http",
+ "tracing",
+]
+
+[[package]]
+name = "aws-sigv4"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c"
+dependencies = [
+ "aws-smithy-http",
+ "form_urlencoded",
+ "hex",
+ "hmac",
+ "http",
+ "once_cell",
+ "percent-encoding",
+ "regex",
+ "sha2",
+ "time 0.3.26",
+ "tracing",
+]
+
+[[package]]
+name = "aws-smithy-async"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13bda3996044c202d75b91afeb11a9afae9db9a721c6a7a427410018e286b880"
+dependencies = [
+ "futures-util",
+ "pin-project-lite",
+ "tokio",
+ "tokio-stream",
+]
+
+[[package]]
+name = "aws-smithy-client"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a86aa6e21e86c4252ad6a0e3e74da9617295d8d6e374d552be7d3059c41cedd"
+dependencies = [
+ "aws-smithy-async",
+ "aws-smithy-http",
+ "aws-smithy-http-tower",
+ "aws-smithy-types",
+ "bytes",
+ "fastrand",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-rustls",
+ "lazy_static",
+ "pin-project-lite",
+ "rustls",
+ "tokio",
+ "tower",
+ "tracing",
+]
+
+[[package]]
+name = "aws-smithy-http"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28"
+dependencies = [
+ "aws-smithy-types",
+ "bytes",
+ "bytes-utils",
+ "futures-core",
+ "http",
+ "http-body",
+ "hyper",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "pin-utils",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "aws-smithy-http-tower"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ae4f6c5798a247fac98a867698197d9ac22643596dc3777f0c76b91917616b9"
+dependencies = [
+ "aws-smithy-http",
+ "aws-smithy-types",
+ "bytes",
+ "http",
+ "http-body",
+ "pin-project-lite",
+ "tower",
+ "tracing",
+]
+
+[[package]]
+name = "aws-smithy-json"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23f9f42fbfa96d095194a632fbac19f60077748eba536eb0b9fecc28659807f8"
+dependencies = [
+ "aws-smithy-types",
+]
+
+[[package]]
+name = "aws-smithy-query"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98819eb0b04020a1c791903533b638534ae6c12e2aceda3e6e6fba015608d51d"
+dependencies = [
+ "aws-smithy-types",
+ "urlencoding",
+]
+
+[[package]]
+name = "aws-smithy-types"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16a3d0bf4f324f4ef9793b86a1701d9700fbcdbd12a846da45eed104c634c6e8"
+dependencies = [
+ "base64-simd",
+ "itoa",
+ "num-integer",
+ "ryu",
+ "time 0.3.26",
+]
+
+[[package]]
+name = "aws-smithy-xml"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1b9d12875731bd07e767be7baad95700c3137b56730ec9ddeedb52a5e5ca63b"
+dependencies = [
+ "xmlparser",
+]
+
+[[package]]
+name = "aws-types"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6dd209616cc8d7bfb82f87811a5c655dc97537f592689b18743bddf5dc5c4829"
+dependencies = [
+ "aws-credential-types",
+ "aws-smithy-async",
+ "aws-smithy-client",
+ "aws-smithy-http",
+ "aws-smithy-types",
+ "http",
+ "rustc_version",
+ "tracing",
+]
+
[[package]]
name = "axum"
version = "0.6.1"
@@ -103,6 +460,21 @@
"tower-service",
]
+[[package]]
+name = "backtrace"
+version = "0.3.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
[[package]]
name = "base16ct"
version = "0.1.1"
@@ -127,6 +499,16 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d"
+[[package]]
+name = "base64-simd"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195"
+dependencies = [
+ "outref",
+ "vsimd",
+]
+
[[package]]
name = "base64ct"
version = "1.6.0"
@@ -175,6 +557,16 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c"
+[[package]]
+name = "bytes-utils"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e47d3a8076e283f3acd27400535992edb3ba4b5bb72f8891ad8fbe7932a7d4b9"
+dependencies = [
+ "bytes",
+ "either",
+]
+
[[package]]
name = "bytesize"
version = "1.1.0"
@@ -193,6 +585,31 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+[[package]]
+name = "chrono"
+version = "0.4.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "time 0.1.45",
+ "wasm-bindgen",
+ "winapi",
+]
+
+[[package]]
+name = "codespan-reporting"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
+dependencies = [
+ "termcolor",
+ "unicode-width",
+]
+
[[package]]
name = "comm-opaque2"
version = "0.2.0"
@@ -205,6 +622,24 @@
"wasm-bindgen",
]
+[[package]]
+name = "comm-services-lib"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "aws-config",
+ "aws-sdk-dynamodb",
+ "aws-types",
+ "base64 0.21.2",
+ "chrono",
+ "derive_more",
+ "rand",
+ "serde",
+ "serde_json",
+ "tokio",
+ "tracing",
+]
+
[[package]]
name = "commtest"
version = "0.1.0"
@@ -214,6 +649,7 @@
"base64 0.20.0",
"bytesize",
"comm-opaque2",
+ "comm-services-lib",
"derive_more",
"futures",
"futures-util",
@@ -307,6 +743,50 @@
"zeroize",
]
+[[package]]
+name = "cxx"
+version = "1.0.94"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93"
+dependencies = [
+ "cc",
+ "cxxbridge-flags",
+ "cxxbridge-macro",
+ "link-cplusplus",
+]
+
+[[package]]
+name = "cxx-build"
+version = "1.0.94"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b"
+dependencies = [
+ "cc",
+ "codespan-reporting",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "scratch",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "cxxbridge-flags"
+version = "1.0.94"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb"
+
+[[package]]
+name = "cxxbridge-macro"
+version = "1.0.94"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+]
+
[[package]]
name = "der"
version = "0.6.1"
@@ -316,6 +796,12 @@
"const-oid",
]
+[[package]]
+name = "deranged"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946"
+
[[package]]
name = "derive-where"
version = "1.0.0-rc.3"
@@ -481,6 +967,12 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+[[package]]
+name = "futures-io"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
+
[[package]]
name = "futures-macro"
version = "0.3.28"
@@ -511,9 +1003,11 @@
checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
dependencies = [
"futures-core",
+ "futures-io",
"futures-macro",
"futures-sink",
"futures-task",
+ "memchr",
"pin-project-lite",
"pin-utils",
"slab",
@@ -538,9 +1032,15 @@
dependencies = [
"cfg-if",
"libc",
- "wasi",
+ "wasi 0.11.0+wasi-snapshot-preview1",
]
+[[package]]
+name = "gimli"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
+
[[package]]
name = "group"
version = "0.12.1"
@@ -618,9 +1118,9 @@
[[package]]
name = "http"
-version = "0.2.8"
+version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
dependencies = [
"bytes",
"fnv",
@@ -658,9 +1158,9 @@
[[package]]
name = "hyper"
-version = "0.14.23"
+version = "0.14.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c"
+checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
dependencies = [
"bytes",
"futures-channel",
@@ -673,13 +1173,28 @@
"httpdate",
"itoa",
"pin-project-lite",
- "socket2",
+ "socket2 0.4.7",
"tokio",
"tower-service",
"tracing",
"want",
]
+[[package]]
+name = "hyper-rustls"
+version = "0.23.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c"
+dependencies = [
+ "http",
+ "hyper",
+ "log",
+ "rustls",
+ "rustls-native-certs",
+ "tokio",
+ "tokio-rustls",
+]
+
[[package]]
name = "hyper-timeout"
version = "0.4.1"
@@ -705,6 +1220,30 @@
"tokio-native-tls",
]
+[[package]]
+name = "iana-time-zone"
+version = "0.1.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca"
+dependencies = [
+ "cxx",
+ "cxx-build",
+]
+
[[package]]
name = "idna"
version = "0.3.0"
@@ -776,6 +1315,15 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
+[[package]]
+name = "link-cplusplus"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9"
+dependencies = [
+ "cc",
+]
+
[[package]]
name = "log"
version = "0.4.17"
@@ -813,16 +1361,24 @@
"unicase",
]
+[[package]]
+name = "miniz_oxide"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+dependencies = [
+ "adler",
+]
+
[[package]]
name = "mio"
-version = "0.8.5"
+version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de"
+checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
dependencies = [
"libc",
- "log",
- "wasi",
- "windows-sys",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -849,6 +1405,25 @@
"tempfile",
]
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
+dependencies = [
+ "autocfg",
+]
+
[[package]]
name = "num_cpus"
version = "1.14.0"
@@ -859,6 +1434,15 @@
"libc",
]
+[[package]]
+name = "object"
+version = "0.32.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe"
+dependencies = [
+ "memchr",
+]
+
[[package]]
name = "once_cell"
version = "1.16.0"
@@ -931,6 +1515,12 @@
"vcpkg",
]
+[[package]]
+name = "outref"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a"
+
[[package]]
name = "password-hash"
version = "0.4.2"
@@ -980,9 +1570,9 @@
[[package]]
name = "pin-project-lite"
-version = "0.2.9"
+version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
[[package]]
name = "pin-utils"
@@ -1130,6 +1720,8 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a"
dependencies = [
+ "aho-corasick",
+ "memchr",
"regex-syntax",
]
@@ -1178,14 +1770,37 @@
"serde_urlencoded",
"tokio",
"tokio-native-tls",
+ "tokio-util",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
+ "wasm-streams",
"web-sys",
"winreg",
]
+[[package]]
+name = "ring"
+version = "0.16.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin",
+ "untrusted",
+ "web-sys",
+ "winapi",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+
[[package]]
name = "rustc_version"
version = "0.4.0"
@@ -1195,6 +1810,39 @@
"semver",
]
+[[package]]
+name = "rustls"
+version = "0.20.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f"
+dependencies = [
+ "log",
+ "ring",
+ "sct",
+ "webpki",
+]
+
+[[package]]
+name = "rustls-native-certs"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00"
+dependencies = [
+ "openssl-probe",
+ "rustls-pemfile",
+ "schannel",
+ "security-framework",
+]
+
+[[package]]
+name = "rustls-pemfile"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2"
+dependencies = [
+ "base64 0.21.2",
+]
+
[[package]]
name = "rustversion"
version = "1.0.11"
@@ -1213,7 +1861,23 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3"
dependencies = [
- "windows-sys",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "scratch"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152"
+
+[[package]]
+name = "sct"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
+dependencies = [
+ "ring",
+ "untrusted",
]
[[package]]
@@ -1342,6 +2006,22 @@
"winapi",
]
+[[package]]
+name = "socket2"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877"
+dependencies = [
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
[[package]]
name = "subtle"
version = "2.5.0"
@@ -1390,6 +2070,15 @@
"winapi",
]
+[[package]]
+name = "termcolor"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+dependencies = [
+ "winapi-util",
+]
+
[[package]]
name = "thiserror"
version = "1.0.40"
@@ -1410,6 +2099,44 @@
"syn 2.0.15",
]
+[[package]]
+name = "time"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi",
+]
+
+[[package]]
+name = "time"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a79d09ac6b08c1ab3906a2f7cc2e81a0e27c7ae89c63812df75e52bef0751e07"
+dependencies = [
+ "deranged",
+ "serde",
+ "time-core",
+ "time-macros",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb"
+
+[[package]]
+name = "time-macros"
+version = "0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75c65469ed6b3a4809d987a41eb1dc918e9bc1d92211cbad7ae82931846f7451"
+dependencies = [
+ "time-core",
+]
+
[[package]]
name = "tinyvec"
version = "1.6.0"
@@ -1427,20 +2154,19 @@
[[package]]
name = "tokio"
-version = "1.24.2"
+version = "1.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "597a12a59981d9e3c38d216785b0c37399f6e415e8d0712047620f189371b0bb"
+checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9"
dependencies = [
- "autocfg",
+ "backtrace",
"bytes",
"libc",
- "memchr",
"mio",
"num_cpus",
"pin-project-lite",
- "socket2",
+ "socket2 0.5.3",
"tokio-macros",
- "windows-sys",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -1455,13 +2181,13 @@
[[package]]
name = "tokio-macros"
-version = "1.8.2"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8"
+checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.107",
+ "syn 2.0.15",
]
[[package]]
@@ -1474,6 +2200,17 @@
"tokio",
]
+[[package]]
+name = "tokio-rustls"
+version = "0.23.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"
+dependencies = [
+ "rustls",
+ "tokio",
+ "webpki",
+]
+
[[package]]
name = "tokio-stream"
version = "0.1.11"
@@ -1739,6 +2476,18 @@
"tinyvec",
]
+[[package]]
+name = "unicode-width"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
[[package]]
name = "url"
version = "2.3.1"
@@ -1750,6 +2499,12 @@
"percent-encoding",
]
+[[package]]
+name = "urlencoding"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
+
[[package]]
name = "utf-8"
version = "0.7.6"
@@ -1787,6 +2542,12 @@
"zeroize",
]
+[[package]]
+name = "vsimd"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
+
[[package]]
name = "want"
version = "0.3.0"
@@ -1797,6 +2558,12 @@
"try-lock",
]
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
@@ -1869,6 +2636,19 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
+[[package]]
+name = "wasm-streams"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078"
+dependencies = [
+ "futures-util",
+ "js-sys",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
[[package]]
name = "web-sys"
version = "0.3.64"
@@ -1879,6 +2659,16 @@
"wasm-bindgen",
]
+[[package]]
+name = "webpki"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
[[package]]
name = "which"
version = "4.3.0"
@@ -1906,25 +2696,67 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
[[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"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+dependencies = [
+ "windows-targets",
+]
+
[[package]]
name = "windows-sys"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows_aarch64_gnullvm 0.42.0",
+ "windows_aarch64_msvc 0.42.0",
+ "windows_i686_gnu 0.42.0",
+ "windows_i686_msvc 0.42.0",
+ "windows_x86_64_gnu 0.42.0",
+ "windows_x86_64_gnullvm 0.42.0",
+ "windows_x86_64_msvc 0.42.0",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
]
[[package]]
@@ -1933,42 +2765,84 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
[[package]]
name = "windows_aarch64_msvc"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
[[package]]
name = "windows_i686_gnu"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
[[package]]
name = "windows_i686_msvc"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
[[package]]
name = "windows_x86_64_gnu"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
[[package]]
name = "windows_x86_64_msvc"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
[[package]]
name = "winreg"
version = "0.10.1"
@@ -1978,6 +2852,12 @@
"winapi",
]
+[[package]]
+name = "xmlparser"
+version = "0.13.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd"
+
[[package]]
name = "zeroize"
version = "1.6.0"
diff --git a/services/commtest/Cargo.toml b/services/commtest/Cargo.toml
--- a/services/commtest/Cargo.toml
+++ b/services/commtest/Cargo.toml
@@ -26,8 +26,9 @@
futures-util = "0.3.28"
serde_json = "1.0.96"
rand = "0.8.5"
-reqwest = { version = "0.11", features = ["json", "multipart"] }
+reqwest = { version = "0.11", features = ["json", "multipart", "stream"] }
serde = "1.0"
+comm-services-lib = { path = "../comm-services-lib" }
[build-dependencies]
tonic-build = "0.8"
diff --git a/services/commtest/src/backup/add_attachments.rs b/services/commtest/src/backup/add_attachments.rs
deleted file mode 100644
--- a/services/commtest/src/backup/add_attachments.rs
+++ /dev/null
@@ -1,48 +0,0 @@
-use crate::backup::backup_utils::{
- proto::AddAttachmentsRequest, BackupData, BackupServiceClient,
-};
-use crate::constants::ATTACHMENT_DELIMITER;
-use crate::tools::Error;
-use tonic::Request;
-
-// log_index = None means that we add attachments to the backup
-// log_index = Some(x) means that we add attachments to a specific log
-pub async fn run(
- client: &mut BackupServiceClient<tonic::transport::Channel>,
- backup_data: &BackupData,
- log_index: Option<usize>,
-) -> Result<(), Error> {
- let cloned_user_id = backup_data.user_id.clone();
- let cloned_backup_id = backup_data.backup_item.id.clone();
- let log_id: String = match log_index {
- Some(index) => {
- let log_id = backup_data.log_items[index].id.clone();
- println!("add attachments for log {}/{}", index, log_id);
- log_id
- }
- None => {
- println!("add attachments for backup");
- String::new()
- }
- };
-
- let holders: String = match log_index {
- Some(log_index) => backup_data.log_items[log_index]
- .attachments_holders
- .join(ATTACHMENT_DELIMITER),
- None => backup_data
- .backup_item
- .attachments_holders
- .join(ATTACHMENT_DELIMITER),
- };
-
- client
- .add_attachments(Request::new(AddAttachmentsRequest {
- user_id: cloned_user_id,
- backup_id: cloned_backup_id,
- log_id,
- holders,
- }))
- .await?;
- Ok(())
-}
diff --git a/services/commtest/src/backup/backup_utils.rs b/services/commtest/src/backup/backup_utils.rs
--- a/services/commtest/src/backup/backup_utils.rs
+++ b/services/commtest/src/backup/backup_utils.rs
@@ -1,101 +1,9 @@
-pub mod proto {
- tonic::include_proto!("backup");
-}
-pub use proto::backup_service_client::BackupServiceClient;
-use std::collections::HashMap;
-
-// stands for both, backup and log items
-#[derive(Clone)]
-pub struct Item {
- pub id: String,
- pub chunks_sizes: Vec<usize>,
- pub attachments_holders: Vec<String>,
-}
-
-impl Item {
- pub fn new(
- id: String,
- chunks_sizes: Vec<usize>,
- attachments_holders: Vec<String>,
- ) -> Item {
- Item {
- id,
- chunks_sizes,
- attachments_holders,
- }
- }
-}
-
-#[derive(Clone)]
+#[derive(Debug, Clone)]
pub struct BackupData {
- pub user_id: String,
- pub device_id: String,
- pub backup_item: Item,
- pub log_items: Vec<Item>,
-}
-
-pub fn compare_backups(backup_data: &BackupData, result: &BackupData) {
- // check backup size
- let expected: usize = backup_data.backup_item.chunks_sizes.iter().sum();
- let from_result: usize = result.backup_item.chunks_sizes.iter().sum();
- assert_eq!(
- from_result, expected,
- "backup sizes do not match, expected {}, got {}",
- expected, from_result
- );
-
- // check backup attachments
- let expected: usize = backup_data.backup_item.attachments_holders.len();
- let from_result: usize = result.backup_item.attachments_holders.len();
- assert_eq!(
- from_result, expected,
- "backup: number of attachments holders do not match, expected {}, got {}",
- expected, from_result
- );
-
- // check number of logs
- let expected: usize = backup_data.log_items.len();
- let from_result: usize = result.log_items.len();
- assert_eq!(
- expected, from_result,
- "backup id {} number of logs do not match, expected {}, got {}",
- backup_data.backup_item.id, expected, from_result
- );
-
- // check log sizes
- // map<log_id, chunks_sizes>
- let mut expected_log_map: HashMap<String, usize> = HashMap::new();
- let mut result_log_map: HashMap<String, usize> = HashMap::new();
- for i in 0..backup_data.log_items.len() {
- let expected: usize = backup_data.log_items[i].chunks_sizes.iter().sum();
- let insert_result =
- expected_log_map.insert(backup_data.log_items[i].id.clone(), expected);
- assert_eq!(
- insert_result, None,
- "expected collection contained duplicated log id: {}",
- backup_data.log_items[i].id
- );
- let from_result: usize = result.log_items[i].chunks_sizes.iter().sum();
- let insert_result =
- result_log_map.insert(result.log_items[i].id.clone(), from_result);
- assert_eq!(
- insert_result, None,
- "expected collection contained duplicated log id: {}",
- result.log_items[i].id
- );
- }
-
- for (expected_id, expected_size) in &expected_log_map {
- let result_size = result_log_map.get(expected_id).expect(&format!(
- "comparing logs: expected id found in result: {}",
- expected_id
- ));
- assert_eq!(
- expected_size, result_size,
- "comparing logs, sizes don't match, backup {}",
- backup_data.backup_item.id
- );
- }
-
- // todo: check logs attachment holders
+ pub backup_id: String,
+ pub user_keys_hash: String,
+ pub user_keys: Vec<u8>,
+ pub user_data_hash: String,
+ pub user_data: Vec<u8>,
+ pub attachments: Vec<String>,
}
diff --git a/services/commtest/src/backup/create_new_backup.rs b/services/commtest/src/backup/create_new_backup.rs
--- a/services/commtest/src/backup/create_new_backup.rs
+++ b/services/commtest/src/backup/create_new_backup.rs
@@ -1,69 +1,60 @@
-use crate::backup::backup_utils::{
- proto::create_new_backup_request::Data::*, proto::CreateNewBackupRequest,
- BackupData, BackupServiceClient,
+use std::convert::Infallible;
+
+use crate::tools::Error;
+use async_stream::stream;
+use comm_services_lib::auth::UserIdentity;
+use reqwest::{
+ multipart::{Form, Part},
+ Body,
};
-use crate::tools::{generate_stable_nbytes, DataHasher, Error};
-use tonic::Request;
+
+use super::backup_utils::BackupData;
pub async fn run(
- client: &mut BackupServiceClient<tonic::transport::Channel>,
+ url: reqwest::Url,
+ user_identity: &UserIdentity,
backup_data: &BackupData,
-) -> Result<String, Error> {
- println!("create new backup");
- let cloned_user_id = backup_data.user_id.clone();
- let cloned_device_id = backup_data.device_id.clone();
- let cloned_backup_chunk_sizes = backup_data.backup_item.chunks_sizes.clone();
- let predefined_byte_value = None;
- let outbound = async_stream::stream! {
- println!(" - sending user id");
- let request = CreateNewBackupRequest {
- data: Some(UserId(cloned_user_id)),
- };
- yield request;
- println!(" - sending device id");
- let request = CreateNewBackupRequest {
- data: Some(DeviceId(cloned_device_id)),
- };
- yield request;
- println!(" - sending key entropy");
- let request = CreateNewBackupRequest {
- data: Some(KeyEntropy(vec![65,66,67,68])),
- };
- yield request;
- println!(" - sending data hash");
- let mut hasher = DataHasher::new();
- for chunk_size in &cloned_backup_chunk_sizes {
- DataHasher::update(&mut hasher, generate_stable_nbytes(*chunk_size, predefined_byte_value));
- }
+) -> Result<(), Error> {
+ println!("Creating new backup");
+
+ let BackupData {
+ backup_id,
+ user_keys_hash,
+ user_keys,
+ user_data_hash,
+ user_data,
+ attachments,
+ } = backup_data.clone();
- let request = CreateNewBackupRequest {
- data: Some(NewCompactionHash(hasher.get_hash().as_bytes().to_vec())),
- };
- yield request;
- for chunk_size in &cloned_backup_chunk_sizes {
- println!(" - sending data chunk {}", chunk_size);
- let request = CreateNewBackupRequest {
- data: Some(NewCompactionChunk(generate_stable_nbytes(*chunk_size, predefined_byte_value))),
- };
- yield request;
- }
- };
+ let client = reqwest::Client::new();
+ let form = Form::new()
+ .text("backup_id", backup_id)
+ .text("user_keys_hash", user_keys_hash)
+ .part(
+ "user_keys",
+ Part::stream(Body::wrap_stream(
+ stream! { yield Ok::<Vec<u8>, Infallible>(user_keys); },
+ )),
+ )
+ .text("user_data_hash", user_data_hash)
+ .part(
+ "user_data",
+ Part::stream(Body::wrap_stream(
+ stream! { yield Ok::<Vec<u8>, Infallible>(user_data); },
+ )),
+ )
+ .text("attachments", attachments.join("\n"));
- let mut backup_id: String = String::new();
- let response = client.create_new_backup(Request::new(outbound)).await?;
- let mut inbound = response.into_inner();
- while let Some(response) = inbound.message().await? {
- if !response.backup_id.is_empty() {
- assert!(
- backup_id.is_empty(),
- "backup id should be returned only once"
- );
- backup_id = response.backup_id;
- }
+ let response = client
+ .post(url.join("backups")?)
+ .bearer_auth(user_identity.as_authorization_token()?)
+ .multipart(form)
+ .send()
+ .await?;
+
+ if !response.status().is_success() {
+ return Err(Error::HttpStatus(response.status()));
}
- assert!(
- !backup_id.is_empty(),
- "could not get a backup id from the server"
- );
- Ok(backup_id)
+
+ Ok(())
}
diff --git a/services/commtest/src/backup/mod.rs b/services/commtest/src/backup/mod.rs
--- a/services/commtest/src/backup/mod.rs
+++ b/services/commtest/src/backup/mod.rs
@@ -1,5 +1,3 @@
-pub mod add_attachments;
pub mod backup_utils;
pub mod create_new_backup;
pub mod pull_backup;
-pub mod send_log;
diff --git a/services/commtest/src/backup/pull_backup.rs b/services/commtest/src/backup/pull_backup.rs
--- a/services/commtest/src/backup/pull_backup.rs
+++ b/services/commtest/src/backup/pull_backup.rs
@@ -1,130 +1,80 @@
-use crate::backup::backup_utils::{
- proto::pull_backup_response::Data, proto::pull_backup_response::Data::*,
- proto::pull_backup_response::Id, proto::pull_backup_response::Id::*,
- proto::PullBackupRequest, BackupData, BackupServiceClient, Item,
-};
-use crate::constants::ATTACHMENT_DELIMITER;
+use std::fmt::Display;
+
use crate::tools::Error;
-use std::io::{Error as IOError, ErrorKind};
-use tonic::Request;
+use comm_services_lib::auth::UserIdentity;
-#[derive(PartialEq, Debug)]
-enum State {
- Compaction,
- Log,
+#[derive(Debug, Clone)]
+pub enum BackupDescriptor {
+ BackupID {
+ backup_id: String,
+ user_identity: UserIdentity,
+ },
+ Latest {
+ username: String,
+ },
}
-pub async fn run(
- client: &mut BackupServiceClient<tonic::transport::Channel>,
- backup_data: &BackupData,
-) -> Result<BackupData, Error> {
- println!("pull backup");
- let cloned_user_id = backup_data.user_id.clone();
- let cloned_backup_id = backup_data.backup_item.id.clone();
+impl Display for BackupDescriptor {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ BackupDescriptor::BackupID {
+ backup_id,
+ user_identity,
+ } => write!(
+ f,
+ "backup '{backup_id}' for user '{}'",
+ user_identity.user_id
+ ),
+ BackupDescriptor::Latest { username } => {
+ write!(f, "latest backup for user '{username}'")
+ }
+ }
+ }
+}
- let mut result = BackupData {
- user_id: String::new(),
- device_id: String::new(),
- backup_item: Item::new(String::new(), Vec::new(), Vec::new()),
- log_items: Vec::new(),
- };
+#[derive(Debug, Clone, Copy)]
+pub enum RequestedData {
+ BackupID,
+ UserKeys,
+ UserData,
+}
- let response = client
- .pull_backup(Request::new(PullBackupRequest {
- user_id: cloned_user_id,
- backup_id: cloned_backup_id,
- }))
- .await?;
- let mut inbound = response.into_inner();
- let mut state: State = State::Compaction;
- let mut current_id: String = String::new();
- while let Some(response) = inbound.message().await? {
- let response_data: Option<Data> = response.data;
- let id: Option<Id> = response.id;
- let mut backup_id: Option<String> = None;
- let mut log_id: Option<String> = None;
- match id {
- Some(BackupId(id)) => backup_id = Some(id),
- Some(LogId(id)) => log_id = Some(id),
- None => {}
- };
- match response_data {
- Some(CompactionChunk(chunk)) => {
- assert_eq!(
- state,
- State::Compaction,
- "invalid state, expected compaction, got {:?}",
- state
- );
- current_id = backup_id.ok_or(IOError::new(
- ErrorKind::Other,
- "backup id expected but not received",
- ))?;
- println!(
- "compaction (id {}), pulling chunk (size: {})",
- current_id,
- chunk.len()
- );
- result.backup_item.chunks_sizes.push(chunk.len())
- }
- Some(LogChunk(chunk)) => {
- if state == State::Compaction {
- state = State::Log;
- }
- assert_eq!(
- state,
- State::Log,
- "invalid state, expected log, got {:?}",
- state
- );
- let log_id = log_id.ok_or(IOError::new(
- ErrorKind::Other,
- "log id expected but not received",
- ))?;
- if log_id != current_id {
- result.log_items.push(Item::new(
- log_id.clone(),
- Vec::new(),
- Vec::new(),
- ));
- current_id = log_id;
- }
- let log_items_size = result.log_items.len() - 1;
- result.log_items[log_items_size]
- .chunks_sizes
- .push(chunk.len());
+pub async fn run(
+ url: reqwest::Url,
+ backup_descriptor: BackupDescriptor,
+ requested_data: RequestedData,
+) -> Result<Vec<u8>, Error> {
+ println!("Pulling data: {requested_data:?}, from {backup_descriptor}");
- println!("log (id {}) chunk size {}", current_id, chunk.len());
- }
- None => {}
+ let client = reqwest::Client::new();
+ let url = url.join("backups/")?;
+ let url = match &backup_descriptor {
+ BackupDescriptor::BackupID { backup_id, .. } => {
+ url.join(&format!("{backup_id}/"))?
}
- if let Some(holders) = response.attachment_holders {
- let holders_split: Vec<&str> =
- holders.split(ATTACHMENT_DELIMITER).collect();
- if state == State::Compaction {
- for holder in holders_split {
- if holder.len() == 0 {
- continue;
- }
- println!("attachments for the backup: {}", holder);
- result
- .backup_item
- .attachments_holders
- .push(holder.to_string());
- }
- } else if state == State::Log {
- println!("attachments for the log {:?}: {}", current_id, holders);
- for holder in holders_split {
- if holder.len() == 0 {
- continue;
- }
- let log_items_size = result.log_items.len() - 1;
- result.log_items[log_items_size]
- .attachments_holders
- .push(holder.to_string())
- }
- }
+ BackupDescriptor::Latest { username } => {
+ url.join(&format!("latest/{username}/"))?
}
+ };
+ let url = match &requested_data {
+ RequestedData::BackupID => url.join("backup_id")?,
+ RequestedData::UserKeys => url.join("user_keys")?,
+ RequestedData::UserData => url.join("user_data")?,
+ };
+
+ let mut request = client.get(url);
+
+ if let BackupDescriptor::BackupID { user_identity, .. } = backup_descriptor {
+ request = request.bearer_auth(user_identity.as_authorization_token()?)
}
+
+ let response = request.send().await?;
+
+ if !response.status().is_success() {
+ return Err(Error::HttpStatus(response.status()));
+ }
+
+ let result = response.bytes().await?.to_vec();
+
Ok(result)
}
diff --git a/services/commtest/src/backup/send_log.rs b/services/commtest/src/backup/send_log.rs
deleted file mode 100644
--- a/services/commtest/src/backup/send_log.rs
+++ /dev/null
@@ -1,53 +0,0 @@
-use crate::backup::backup_utils::{
- proto::{send_log_request::Data::*, SendLogRequest},
- BackupData, BackupServiceClient,
-};
-use crate::tools::{generate_stable_nbytes, DataHasher, Error};
-use tonic::Request;
-
-pub async fn run(
- client: &mut BackupServiceClient<tonic::transport::Channel>,
- backup_data: &BackupData,
- log_index: usize,
-) -> Result<String, Error> {
- println!("send log");
- let cloned_user_id = backup_data.user_id.clone();
- let cloned_backup_id = backup_data.backup_item.id.clone();
- let cloned_log_sizes = backup_data.log_items[log_index].chunks_sizes.clone();
- let predefined_byte_value = None;
- let outbound = async_stream::stream! {
- println!(" - sending user id");
- let request = SendLogRequest {
- data: Some(UserId(cloned_user_id)),
- };
- yield request;
- println!(" - sending backup id");
- let request = SendLogRequest {
- data: Some(BackupId(cloned_backup_id)),
- };
- yield request;
- println!(" - sending log hash");
- let mut hasher = DataHasher::new();
- for chunk_size in &cloned_log_sizes {
- DataHasher::update(&mut hasher, generate_stable_nbytes(*chunk_size, predefined_byte_value));
- }
-
- let request = SendLogRequest {
- data: Some(LogHash(hasher.get_hash().as_bytes().to_vec())),
- };
- yield request;
- println!(" - sending log data");
- for log_size in &cloned_log_sizes {
- println!(" - sending log data {}", *log_size);
- let request = SendLogRequest {
- data: Some(LogData(generate_stable_nbytes(*log_size, predefined_byte_value))),
- };
- yield request;
- }
- };
-
- let response = client.send_log(Request::new(outbound)).await?;
- let inbound = response.into_inner();
- println!("send log response: {:?}", inbound.log_checkpoint);
- Ok(inbound.log_checkpoint)
-}
diff --git a/services/commtest/src/tools.rs b/services/commtest/src/tools.rs
--- a/services/commtest/src/tools.rs
+++ b/services/commtest/src/tools.rs
@@ -28,6 +28,10 @@
HttpStatus(#[error(ignore)] reqwest::StatusCode),
#[display(...)]
ParseError(ParseError),
+ #[display(...)]
+ JsonError(serde_json::error::Error),
+ #[display(...)]
+ FromUtf8Error(std::string::FromUtf8Error),
}
pub fn obtain_number_of_threads() -> usize {
diff --git a/services/commtest/tests/backup_integration_test.rs b/services/commtest/tests/backup_integration_test.rs
--- a/services/commtest/tests/backup_integration_test.rs
+++ b/services/commtest/tests/backup_integration_test.rs
@@ -1,126 +1,110 @@
use bytesize::ByteSize;
-use commtest::backup::{
- add_attachments,
- backup_utils::{self, BackupData, BackupServiceClient, Item},
- create_new_backup, pull_backup, send_log,
+use comm_services_lib::{auth::UserIdentity, backup::LatestBackupIDResponse};
+use commtest::{
+ backup::{
+ backup_utils::BackupData,
+ create_new_backup,
+ pull_backup::{self, BackupDescriptor, RequestedData},
+ },
+ tools::{generate_stable_nbytes, Error},
};
-use commtest::constants;
-use commtest::tools::Error;
-use std::collections::HashMap;
use std::env;
#[tokio::test]
async fn backup_integration_test() -> Result<(), Error> {
let port = env::var("COMM_SERVICES_PORT_BACKUP")
- .expect("port env var expected but not received");
- let mut client =
- BackupServiceClient::connect(format!("http://localhost:{}", port)).await?;
+ .expect("port env var expected but not received")
+ .parse()
+ .expect("port env var should be a number");
- let attachments_fill_size: u64 = 500;
+ let mut url = reqwest::Url::parse("http://localhost")?;
+ url.set_port(Some(port)).expect("failed to set port");
- let mut backup_data = BackupData {
- user_id: "user0000".to_string(),
- device_id: "device0000".to_string(),
- backup_item: Item::new(
- String::new(),
- vec![ByteSize::mib(1).as_u64() as usize; 6],
- vec![
- "holder0".to_string(),
- "holder1".to_string(),
- "holder2".to_string(),
- ],
- ),
- log_items: vec![
- // the item that almost hits the DB limit, we're going to later add a long
- // list of attachments, so that causes it to exceed the limit.
- // In this case its data should be moved to the S3
- Item::new(
- String::new(),
- vec![
- *constants::DYNAMO_DB_ITEM_SIZE_LIMIT
- - ByteSize::b(attachments_fill_size / 2).as_u64() as usize,
- ],
- vec!["holder0".to_string(), "holder1".to_string()],
+ let backup_datas = [
+ BackupData {
+ backup_id: "b1".to_string(),
+ user_keys_hash: "kh1".to_string(),
+ user_keys: generate_stable_nbytes(
+ ByteSize::kib(4).as_u64() as usize,
+ Some(b'a'),
),
- // just a small item
- Item::new(
- String::new(),
- vec![ByteSize::b(100).as_u64() as usize],
- vec!["holder0".to_string()],
+ user_data_hash: "dh1".to_string(),
+ user_data: generate_stable_nbytes(
+ ByteSize::mib(4).as_u64() as usize,
+ Some(b'A'),
),
- // a big item that should be placed in the S3 right away
- Item::new(
- String::new(),
- vec![
- *constants::GRPC_CHUNK_SIZE_LIMIT,
- *constants::GRPC_CHUNK_SIZE_LIMIT,
- ],
- vec![
- "holder0".to_string(),
- "holder1".to_string(),
- "holder2".to_string(),
- ],
+ attachments: vec![],
+ },
+ BackupData {
+ backup_id: "b2".to_string(),
+ user_keys_hash: "kh2".to_string(),
+ user_keys: generate_stable_nbytes(
+ ByteSize::kib(4).as_u64() as usize,
+ Some(b'b'),
),
- ],
+ user_data_hash: "dh2".to_string(),
+ user_data: generate_stable_nbytes(
+ ByteSize::mib(4).as_u64() as usize,
+ Some(b'B'),
+ ),
+ attachments: vec![],
+ },
+ ];
+
+ let user_identity = UserIdentity {
+ user_id: "1".to_string(),
+ access_token: "dummy access token".to_string(),
+ device_id: "dummy device_id".to_string(),
};
- backup_data.backup_item.id =
- create_new_backup::run(&mut client, &backup_data).await?;
- println!("backup id in main: {}", backup_data.backup_item.id);
+ create_new_backup::run(url.clone(), &user_identity, &backup_datas[0]).await?;
+ create_new_backup::run(url.clone(), &user_identity, &backup_datas[1]).await?;
- add_attachments::run(&mut client, &backup_data, None).await?;
+ // Test direct lookup
+ let second_backup_descriptor = BackupDescriptor::BackupID {
+ backup_id: backup_datas[1].backup_id.clone(),
+ user_identity: user_identity.clone(),
+ };
- for log_index in 0..backup_data.log_items.len() {
- backup_data.log_items[log_index].id =
- send_log::run(&mut client, &backup_data, log_index).await?;
- add_attachments::run(&mut client, &backup_data, Some(log_index)).await?;
- }
+ let user_keys = pull_backup::run(
+ url.clone(),
+ second_backup_descriptor.clone(),
+ RequestedData::UserKeys,
+ )
+ .await?;
+ assert_eq!(user_keys, backup_datas[1].user_keys);
- let result: BackupData = pull_backup::run(&mut client, &backup_data).await?;
+ let user_data = pull_backup::run(
+ url.clone(),
+ second_backup_descriptor.clone(),
+ RequestedData::UserData,
+ )
+ .await?;
+ assert_eq!(user_data, backup_datas[1].user_data);
- backup_utils::compare_backups(&backup_data, &result);
+ // Test latest backup lookup
+ let latest_backup_descriptor = BackupDescriptor::Latest {
+ // Initial version of the backup service uses `user_id` in place of a username
+ username: "1".to_string(),
+ };
- // push so many attachments that the log item's data will have to be moved
- // from the db to the s3
- let mut attachments_size = 0;
- let mut i = backup_data.log_items[0].attachments_holders.len();
- let mut new_attachments: Vec<String> = Vec::new();
- while attachments_size < (attachments_fill_size as usize) {
- let att = format!("holder{}", i);
- attachments_size += att.len();
- new_attachments.push(att);
- i += 1;
- }
+ let backup_id_response = pull_backup::run(
+ url.clone(),
+ latest_backup_descriptor.clone(),
+ RequestedData::BackupID,
+ )
+ .await?;
+ let response: LatestBackupIDResponse =
+ serde_json::from_slice(&backup_id_response)?;
+ assert_eq!(response.backup_id, backup_datas[1].backup_id);
- let mut old_attachments =
- backup_data.log_items[0].attachments_holders.clone();
- backup_data.log_items[0].attachments_holders = new_attachments;
- add_attachments::run(&mut client, &backup_data, Some(0)).await?;
- backup_data.log_items[0]
- .attachments_holders
- .append(&mut old_attachments);
- let result = pull_backup::run(&mut client, &backup_data).await?;
- // check logs attachments
- // map<log_id, attachments size>
- let mut expected_log_map: HashMap<String, usize> = HashMap::new();
- let mut result_log_map: HashMap<String, usize> = HashMap::new();
- for i in 0..backup_data.log_items.len() {
- let expected: usize = backup_data.log_items[i].attachments_holders.len();
- expected_log_map.insert(backup_data.log_items[i].id.clone(), expected);
- let from_result: usize = result.log_items[i].attachments_holders.len();
- result_log_map.insert(result.log_items[i].id.clone(), from_result);
- }
- for (expected_id, expected_size) in &expected_log_map {
- let result_size = result_log_map.get(expected_id).expect(&format!(
- "comparing logs attachments: expected id found in result: {}",
- expected_id
- ));
- assert_eq!(
- expected_size, result_size,
- "comparing logs attachments, sizes don't match, backup {}",
- backup_data.backup_item.id
- );
- }
+ let user_keys = pull_backup::run(
+ url.clone(),
+ latest_backup_descriptor.clone(),
+ RequestedData::UserKeys,
+ )
+ .await?;
+ assert_eq!(user_keys, backup_datas[1].user_keys);
Ok(())
}
diff --git a/services/commtest/tests/backup_performance_test.rs b/services/commtest/tests/backup_performance_test.rs
--- a/services/commtest/tests/backup_performance_test.rs
+++ b/services/commtest/tests/backup_performance_test.rs
@@ -1,228 +1,187 @@
use bytesize::ByteSize;
-use commtest::backup::{
- add_attachments,
- backup_utils::{self, BackupData, BackupServiceClient, Item},
- create_new_backup, pull_backup, send_log,
+use comm_services_lib::{auth::UserIdentity, backup::LatestBackupIDResponse};
+use commtest::{
+ backup::{
+ backup_utils::BackupData,
+ create_new_backup,
+ pull_backup::{self, BackupDescriptor},
+ },
+ tools::{generate_stable_nbytes, obtain_number_of_threads, Error},
};
-use commtest::tools::{obtain_number_of_threads, Error};
use std::env;
-use std::sync::mpsc::channel;
-use tokio::runtime::Runtime;
+use tokio::{runtime::Runtime, task::JoinSet};
#[tokio::test]
async fn backup_performance_test() -> Result<(), Error> {
let port = env::var("COMM_SERVICES_PORT_BACKUP")
- .expect("port env var expected but not received");
- let client =
- BackupServiceClient::connect(format!("http://localhost:{}", port)).await?;
+ .expect("port env var expected but not received")
+ .parse()
+ .expect("port env var should be a number");
+
+ let mut url = reqwest::Url::parse("http://localhost")?;
+ url.set_port(Some(port)).expect("failed to set port");
let number_of_threads = obtain_number_of_threads();
+ let rt = Runtime::new().unwrap();
+
println!(
"Running performance tests for backup, number of threads: {}",
number_of_threads
);
let mut backup_data = vec![];
-
for i in 0..number_of_threads {
backup_data.push(BackupData {
- user_id: format!("user{}", i),
- device_id: format!("device{}", i),
- backup_item: Item::new(
- String::new(),
- vec![ByteSize::mib(1).as_u64() as usize; 3 + (i % 5)],
- (0..(i % 5)).map(|x| format!("holder{}", x)).collect(),
+ backup_id: format!("b{i}"),
+ user_keys_hash: format!("kh{i}"),
+ user_keys: generate_stable_nbytes(
+ ByteSize::kib(4).as_u64() as usize,
+ Some(i as u8),
),
- log_items: (0..(i % 4))
- .map(|x| {
- Item::new(
- String::new(),
- vec![ByteSize::mib(1).as_u64() as usize; 2 + (x % 2)],
- (0..(i % 5)).map(|x| format!("holder{}-{}", i, x)).collect(),
- )
- })
- .collect(),
+ user_data_hash: format!("dh{i}"),
+ user_data: generate_stable_nbytes(
+ ByteSize::mib(4).as_u64() as usize,
+ Some(i as u8),
+ ),
+ attachments: vec![],
});
}
- let rt = Runtime::new().unwrap();
+ let user_identities = [
+ UserIdentity {
+ user_id: "1".to_string(),
+ access_token: "dummy access token".to_string(),
+ device_id: "dummy device_id".to_string(),
+ },
+ UserIdentity {
+ user_id: "2".to_string(),
+ access_token: "dummy access token".to_string(),
+ device_id: "dummy device_id".to_string(),
+ },
+ ];
+
tokio::task::spawn_blocking(move || {
- // CREATE NEW BACKUP
+ println!("Creating new backups");
rt.block_on(async {
- println!("performing CREATE NEW BACKUP operations");
- let mut handlers = vec![];
- let (sender, receiver) = channel::<(usize, String)>();
+ let mut set = JoinSet::new();
for (i, item) in backup_data.iter().enumerate() {
- let item_cloned = item.clone();
- let mut client_cloned = client.clone();
- let sender_cloned = sender.clone();
- handlers.push(tokio::spawn(async move {
- let id = create_new_backup::run(&mut client_cloned, &item_cloned)
- .await
- .unwrap();
- assert!(
- !id.is_empty(),
- "backup id should not be empty after creating a new backup"
- );
- sender_cloned.send((i, id)).unwrap();
- }));
+ let url = url.clone();
+ let user = user_identities[i % user_identities.len()].clone();
+ let item = item.clone();
+ set.spawn(async move {
+ create_new_backup::run(url, &user, &item).await.unwrap();
+ });
}
- // https://docs.rs/tokio/1.1.0/tokio/sync/mpsc/struct.Receiver.html#method.recv
- // The channel is closed when all senders have been dropped, or when close
- // is called. The best option here is to clone the sender for every
- // thread, drop the original one and let all the clones be dropped when
- // going out of scope which is equal to the parent thread's termination.
- drop(sender);
- for handler in handlers {
- handler.await.unwrap();
- }
- for data in receiver {
- println!("received: {:?}", data);
- let (index, id) = data;
- backup_data[index].backup_item.id = id;
+ while let Some(result) = set.join_next().await {
+ result.unwrap();
}
});
- // check if backup IDs are properly set
- for (i, item) in backup_data.iter().enumerate() {
- assert!(
- !item.backup_item.id.is_empty(),
- "missing backup id for index {}",
- i
- );
- }
-
- // ADD ATTACHMENTS - BACKUPS
+ let mut latest_ids_for_user = vec![];
+ println!("Reading latest ids");
rt.block_on(async {
- println!("performing ADD ATTACHMENTS - BACKUPS operations");
let mut handlers = vec![];
- for item in &backup_data {
- let item_cloned = item.clone();
- let mut client_cloned = client.clone();
+ for user in &user_identities {
+ let url = url.clone();
+ let descriptor = BackupDescriptor::Latest {
+ username: user.user_id.clone(),
+ };
handlers.push(tokio::spawn(async move {
- if !item_cloned.backup_item.attachments_holders.is_empty() {
- add_attachments::run(&mut client_cloned, &item_cloned, None)
- .await
- .unwrap();
- }
+ let response = pull_backup::run(
+ url,
+ descriptor,
+ pull_backup::RequestedData::BackupID,
+ )
+ .await
+ .unwrap();
+
+ serde_json::from_slice::<LatestBackupIDResponse>(&response).unwrap()
}));
}
for handler in handlers {
- handler.await.unwrap();
+ latest_ids_for_user.push(handler.await.unwrap().backup_id);
}
});
- // SEND LOG
+ assert_eq!(latest_ids_for_user.len(), user_identities.len());
+
+ let mut latest_user_keys_for_user = vec![];
+ println!("Reading latest user keys");
rt.block_on(async {
- println!("performing SEND LOG operations");
let mut handlers = vec![];
- let (sender, receiver) = channel::<(usize, usize, String)>();
- for (backup_index, backup_item) in backup_data.iter().enumerate() {
- let backup_item_cloned = backup_item.clone();
- for log_index in 0..backup_item_cloned.log_items.len() {
- let backup_item_recloned = backup_item_cloned.clone();
- let mut client_cloned = client.clone();
- let sender_cloned = sender.clone();
- handlers.push(tokio::spawn(async move {
- println!(
- "sending log, backup index: [{}] log index: [{}]",
- backup_index, log_index
- );
- let id = send_log::run(
- &mut client_cloned,
- &backup_item_recloned,
- log_index,
- )
- .await
- .unwrap();
- assert!(!id.is_empty(), "log id should not be empty after sending");
- sender_cloned.send((backup_index, log_index, id)).unwrap();
- }));
- }
+ for user in &user_identities {
+ let url = url.clone();
+ let descriptor = BackupDescriptor::Latest {
+ username: user.user_id.clone(),
+ };
+ handlers.push(tokio::spawn(async move {
+ pull_backup::run(
+ url,
+ descriptor,
+ pull_backup::RequestedData::UserKeys,
+ )
+ .await
+ .unwrap()
+ }));
}
- // https://docs.rs/tokio/1.1.0/tokio/sync/mpsc/struct.Receiver.html#method.recv
- // The channel is closed when all senders have been dropped, or when close
- // is called. The best option here is to clone the sender for every
- // thread, drop the original one and let all the clones be dropped when
- // going out of scope which is equal to the parent thread's termination.
- drop(sender);
for handler in handlers {
- handler.await.unwrap();
- }
- for data in receiver {
- println!("received: {:?}", data);
- let (backup_index, log_index, id) = data;
- backup_data[backup_index].log_items[log_index].id = id;
+ latest_user_keys_for_user.push(handler.await.unwrap());
}
});
- // check if log IDs are properly set
- for (backup_index, backup_item) in backup_data.iter().enumerate() {
- for (log_index, log_item) in backup_item.log_items.iter().enumerate() {
- assert!(
- !log_item.id.is_empty(),
- "missing log id for backup index {} and log index {}",
- backup_index,
- log_index
- );
- }
- }
-
- // ADD ATTACHMENTS - LOGS
- rt.block_on(async {
- println!("performing ADD ATTACHMENTS - LOGS operations");
- let mut handlers = vec![];
- for backup_item in &backup_data {
- let backup_item_cloned = backup_item.clone();
- for log_index in 0..backup_item_cloned.log_items.len() {
- let backup_item_recloned = backup_item_cloned.clone();
- let mut client_cloned = client.clone();
- handlers.push(tokio::spawn(async move {
- if !backup_item_recloned
- .backup_item
- .attachments_holders
- .is_empty()
- {
- add_attachments::run(
- &mut client_cloned,
- &backup_item_recloned,
- Some(log_index),
- )
- .await
- .unwrap();
- }
- }));
- }
- }
+ assert_eq!(latest_user_keys_for_user.len(), user_identities.len());
+ for (backup_id, user_keys) in
+ latest_ids_for_user.iter().zip(latest_user_keys_for_user)
+ {
+ let backup = backup_data
+ .iter()
+ .find(|data| data.backup_id == *backup_id)
+ .expect("Request should return existing backup data");
- for handler in handlers {
- handler.await.unwrap();
- }
- });
+ assert_eq!(backup.user_keys, user_keys);
+ }
- // PULL BACKUP
+ let mut latest_user_data_for_user = vec![];
+ println!("Reading latest user data");
rt.block_on(async {
- println!("performing PULL BACKUP operations");
let mut handlers = vec![];
- for item in backup_data {
- let item_cloned = item.clone();
- let mut client_cloned = client.clone();
+ for (i, backup_id) in latest_ids_for_user.iter().enumerate() {
+ let url = url.clone();
+ let descriptor = BackupDescriptor::BackupID {
+ backup_id: backup_id.clone(),
+ user_identity: user_identities[i % user_identities.len()].clone(),
+ };
handlers.push(tokio::spawn(async move {
- let result = pull_backup::run(&mut client_cloned, &item_cloned)
- .await
- .unwrap();
- backup_utils::compare_backups(&item_cloned, &result);
+ pull_backup::run(
+ url,
+ descriptor,
+ pull_backup::RequestedData::UserData,
+ )
+ .await
+ .unwrap()
}));
}
for handler in handlers {
- handler.await.unwrap();
+ latest_user_data_for_user.push(handler.await.unwrap());
}
});
+
+ assert_eq!(latest_user_data_for_user.len(), user_identities.len());
+ for (backup_id, user_data) in
+ latest_ids_for_user.iter().zip(latest_user_data_for_user)
+ {
+ let backup = backup_data
+ .iter()
+ .find(|data| data.backup_id == *backup_id)
+ .expect("Request should return existing backup data");
+
+ assert_eq!(backup.user_data, user_data);
+ }
})
.await
.expect("Task panicked");
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Nov 25, 6:29 PM (21 h, 4 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2580669
Default Alt Text
D8966.diff (69 KB)
Attached To
Mode
D8966: [backup] Add integration and performance tests
Attached
Detach File
Event Timeline
Log In to Comment