[INFO] cloning repository https://github.com/prose-im/prose-pod-api [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/prose-im/prose-pod-api" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fprose-im%2Fprose-pod-api", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fprose-im%2Fprose-pod-api'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] 502c201fe5c316bc9cf88c6b142e6129df620083 [INFO] testing prose-im/prose-pod-api against master#ebf0cf75d368c035f4c7e7246d203bd469ee4a51 for pr-137940-2 [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fprose-im%2Fprose-pod-api" "/workspace/builds/worker-3-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-3-tc1/source'... [INFO] [stderr] done. [INFO] validating manifest of git repo https://github.com/prose-im/prose-pod-api on toolchain ebf0cf75d368c035f4c7e7246d203bd469ee4a51 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+ebf0cf75d368c035f4c7e7246d203bd469ee4a51" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] started tweaking git repo https://github.com/prose-im/prose-pod-api [INFO] finished tweaking git repo https://github.com/prose-im/prose-pod-api [INFO] tweaked toml for git repo https://github.com/prose-im/prose-pod-api written to /workspace/builds/worker-3-tc1/source/Cargo.toml [INFO] crate git repo https://github.com/prose-im/prose-pod-api already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+ebf0cf75d368c035f4c7e7246d203bd469ee4a51" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Updating git repository `https://github.com/prose-im/prose-core-client.git` [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded quote v1.0.38 [INFO] [stderr] Downloaded zeroize_derive v1.4.2 [INFO] [stderr] Downloaded zeroize v1.8.1 [INFO] [stderr] Downloaded spin v0.9.8 [INFO] [stderr] Downloaded unicode-ident v1.0.15 [INFO] [stderr] Downloaded uriparse v0.6.4 [INFO] [stderr] Downloaded futures-sink v0.3.31 [INFO] [stderr] Downloaded signature v2.2.0 [INFO] [stderr] Downloaded wasm-bindgen-macro v0.2.100 [INFO] [stderr] Downloaded want v0.3.1 [INFO] [stderr] Downloaded pear_codegen v0.2.9 [INFO] [stderr] Downloaded rustls-pemfile v2.2.0 [INFO] [stderr] Downloaded libloading v0.8.6 [INFO] [stderr] Downloaded icu_provider_macros v1.5.0 [INFO] [stderr] Downloaded litemap v0.7.4 [INFO] [stderr] Downloaded sqlx-core v0.8.3 [INFO] [stderr] Downloaded webpki-roots v0.26.7 [INFO] [stderr] Downloaded unicode-linebreak v0.1.5 [INFO] [stderr] Downloaded errno v0.3.10 [INFO] [stderr] Downloaded crossbeam-queue v0.3.12 [INFO] [stderr] Downloaded crc v3.2.1 [INFO] [stderr] Downloaded crossbeam-utils v0.8.21 [INFO] [stderr] Downloaded serde_json v1.0.137 [INFO] [stderr] Downloaded console v0.15.10 [INFO] [stderr] Downloaded http-auth-basic v0.3.5 [INFO] [stderr] Downloaded iso8601-timestamp v0.3.3 [INFO] [stderr] Downloaded url v2.5.4 [INFO] [stderr] Downloaded idna v1.0.3 [INFO] [stderr] Downloaded zerovec v0.10.4 [INFO] [stderr] Downloaded generic-array v1.2.0 [INFO] [stderr] Downloaded encode_unicode v1.0.0 [INFO] [stderr] Downloaded synthez-codegen v0.3.1 [INFO] [stderr] Downloaded pretty_assertions v1.4.1 [INFO] [stderr] Downloaded axum v0.8.1 [INFO] [stderr] Downloaded synthez-core v0.3.1 [INFO] [stderr] Downloaded cucumber-codegen v0.21.1 [INFO] [stderr] Downloaded sea-query v0.32.1 [INFO] [stderr] Downloaded synthez v0.3.1 [INFO] [stderr] Downloaded bytecount v0.6.8 [INFO] [stderr] Downloaded globwalk v0.9.1 [INFO] [stderr] Downloaded hex v0.4.3 [INFO] [stderr] Downloaded hmac v0.12.1 [INFO] [stderr] Downloaded md-5 v0.10.6 [INFO] [stderr] Downloaded atoi v2.0.0 [INFO] [stderr] Downloaded axum-extra v0.10.0 [INFO] [stderr] Downloaded rustls-webpki v0.102.8 [INFO] [stderr] Downloaded sqlx v0.8.3 [INFO] [stderr] Downloaded sqlx-sqlite v0.8.3 [INFO] [stderr] Downloaded futures-intrusive v0.5.0 [INFO] [stderr] Downloaded rustix v0.38.44 [INFO] [stderr] Downloaded aws-lc-rs v1.12.2 [INFO] [stderr] Downloaded bindgen v0.69.5 [INFO] [stderr] Downloaded icu_collections v1.5.0 [INFO] [stderr] Downloaded serde_with v3.12.0 [INFO] [stderr] Downloaded icu_properties_data v1.5.0 [INFO] [stderr] Downloaded headers v0.4.0 [INFO] [stderr] Downloaded sea-schema v0.16.1 [INFO] [stderr] Downloaded crc-catalog v2.4.0 [INFO] [stderr] Downloaded bstr v1.11.3 [INFO] [stderr] Downloaded event-listener v5.4.0 [INFO] [stderr] Downloaded redox_syscall v0.5.8 [INFO] [stderr] Downloaded hashlink v0.10.0 [INFO] [stderr] Downloaded allocator-api2 v0.2.21 [INFO] [stderr] Downloaded lazycell v1.3.0 [INFO] [stderr] Downloaded home v0.5.11 [INFO] [stderr] Downloaded cmake v0.1.52 [INFO] [stderr] Downloaded which v4.4.2 [INFO] [stderr] Downloaded clap_builder v4.5.27 [INFO] [stderr] Downloaded dunce v1.0.5 [INFO] [stderr] Downloaded fs_extra v1.3.0 [INFO] [stderr] Downloaded untrusted v0.9.0 [INFO] [stderr] Downloaded anstyle-parse v0.2.6 [INFO] [stderr] Downloaded colorchoice v1.0.3 [INFO] [stderr] Downloaded is_terminal_polyfill v1.70.1 [INFO] [stderr] Downloaded utf8parse v0.2.2 [INFO] [stderr] Downloaded anstyle v1.0.10 [INFO] [stderr] Downloaded prettyplease v0.2.29 [INFO] [stderr] Downloaded clap_lex v0.7.4 [INFO] [stderr] Downloaded terminal_size v0.4.1 [INFO] [stderr] Downloaded clap_derive v4.5.24 [INFO] [stderr] Downloaded clap v4.5.27 [INFO] [stderr] Downloaded dotenvy v0.15.7 [INFO] [stderr] Downloaded glob v0.3.2 [INFO] [stderr] Downloaded reserve-port v2.0.1 [INFO] [stderr] Downloaded rust-multipart-rfc7578_2 v0.6.1 [INFO] [stderr] Downloaded linux-raw-sys v0.4.15 [INFO] [stderr] Downloaded icu_normalizer_data v1.5.0 [INFO] [stderr] Downloaded flume v0.11.1 [INFO] [stderr] Downloaded utf16_iter v1.0.5 [INFO] [stderr] Downloaded write16 v1.0.0 [INFO] [stderr] Downloaded icu_normalizer v1.5.0 [INFO] [stderr] Downloaded hkdf v0.12.4 [INFO] [stderr] Downloaded icu_locid_transform_data v1.5.0 [INFO] [stderr] Downloaded strsim v0.11.1 [INFO] [stderr] Downloaded darling_core v0.20.10 [INFO] [stderr] Downloaded darling v0.20.10 [INFO] [stderr] Downloaded serde_with_macros v3.12.0 [INFO] [stderr] Downloaded axum-test v17.1.0 [INFO] [stderr] Downloaded unicode-width v0.2.0 [INFO] [stderr] Downloaded sea-orm v1.1.4 [INFO] [stderr] Downloaded auto-future v1.0.0 [INFO] [stderr] Downloaded cookie v0.18.1 [INFO] [stderr] Downloaded icu_locid_transform v1.5.0 [INFO] [stderr] Downloaded darling_macro v0.20.10 [INFO] [stderr] Downloaded headers-core v0.3.0 [INFO] [stderr] Downloaded serde_html_form v0.2.7 [INFO] [stderr] Downloaded assert-json-diff v2.0.2 [INFO] [stderr] Downloaded axum-core v0.5.0 [INFO] [stderr] Downloaded axum-macros v0.5.0 [INFO] [stderr] Downloaded matchit v0.8.4 [INFO] [stderr] Downloaded serde_path_to_error v0.1.16 [INFO] [stderr] Downloaded bytesize v1.3.0 [INFO] [stderr] Downloaded diff v0.1.13 [INFO] [stderr] Downloaded icu_provider v1.5.0 [INFO] [stderr] Downloaded displaydoc v0.2.5 [INFO] [stderr] Downloaded tinystr v0.7.6 [INFO] [stderr] Downloaded stable_deref_trait v1.2.0 [INFO] [stderr] Downloaded yoke-derive v0.7.5 [INFO] [stderr] Downloaded yoke v0.7.5 [INFO] [stderr] Downloaded synstructure v0.13.1 [INFO] [stderr] Downloaded zerofrom-derive v0.1.5 [INFO] [stderr] Downloaded zerofrom v0.1.5 [INFO] [stderr] Downloaded zerovec-derive v0.10.3 [INFO] [stderr] Downloaded icu_properties v1.5.1 [INFO] [stderr] Downloaded idna_adapter v1.2.0 [INFO] [stderr] Downloaded utf8_iter v1.0.4 [INFO] [stderr] Downloaded sea-orm-cli v1.1.4 [INFO] [stderr] Downloaded futures-executor v0.3.31 [INFO] [stderr] Downloaded futures v0.3.31 [INFO] [stderr] Downloaded inherent v1.0.11 [INFO] [stderr] Downloaded ordered-float v3.9.2 [INFO] [stderr] Downloaded sea-query-derive v0.4.2 [INFO] [stderr] Downloaded heck v0.4.1 [INFO] [stderr] Downloaded sea-schema-derive v0.3.0 [INFO] [stderr] Downloaded sea-orm-migration v1.1.4 [INFO] [stderr] Downloaded secrecy v0.8.0 [INFO] [stderr] Downloaded ident_case v1.0.1 [INFO] [stderr] Downloaded peg-macros v0.6.3 [INFO] [stderr] Downloaded peg-runtime v0.6.3 [INFO] [stderr] Downloaded peg v0.6.3 [INFO] [stderr] Downloaded smawk v0.3.2 [INFO] [stderr] Downloaded textwrap v0.16.1 [INFO] [stderr] Downloaded typed-builder-macro v0.15.2 [INFO] [stderr] Downloaded typed-builder v0.15.2 [INFO] [stderr] Downloaded crossbeam-deque v0.8.6 [INFO] [stderr] Downloaded sqlx-postgres v0.8.3 [INFO] [stderr] Downloaded hashbrown v0.15.2 [INFO] [stderr] Downloaded indexmap v2.7.1 [INFO] [stderr] Downloaded itertools v0.12.1 [INFO] [stderr] Downloaded libsqlite3-sys v0.30.1 [INFO] [stderr] Downloaded gherkin v0.14.0 [INFO] [stderr] Downloaded crossbeam-epoch v0.9.18 [INFO] [stderr] Downloaded globset v0.4.15 [INFO] [stderr] Downloaded ignore v0.4.23 [INFO] [stderr] Downloaded rustls v0.23.21 [INFO] [stderr] Downloaded web-sys v0.3.77 [INFO] [stderr] Downloaded hickory-proto v0.24.2 [INFO] [stderr] Downloaded idna v0.1.5 [INFO] [stderr] Downloaded cucumber v0.21.1 [INFO] [stderr] Downloaded winnow v0.6.24 [INFO] [stderr] Downloaded lettre v0.11.11 [INFO] [stderr] Downloaded h2 v0.4.7 [INFO] [stderr] Downloaded hyper v1.5.2 [INFO] [stderr] Downloaded quinn-proto v0.11.9 [INFO] [stderr] Downloaded reqwest v0.12.12 [INFO] [stderr] Downloaded num-bigint v0.4.6 [INFO] [stderr] Downloaded rust_decimal v1.36.0 [INFO] [stderr] Downloaded num-bigint-dig v0.8.4 [INFO] [stderr] Downloaded logos v0.15.0 [INFO] [stderr] Downloaded icu_locid v1.5.0 [INFO] [stderr] Downloaded writeable v0.5.5 [INFO] [stderr] Downloaded cucumber-expressions v0.3.0 [INFO] [stderr] Downloaded pin-project v1.1.8 [INFO] [stderr] Downloaded figment v0.10.19 [INFO] [stderr] Downloaded chumsky v0.9.3 [INFO] [stderr] Downloaded anyhow v1.0.95 [INFO] [stderr] Downloaded hickory-resolver v0.24.2 [INFO] [stderr] Downloaded tokio-xmpp v4.0.0 [INFO] [stderr] Downloaded insta v1.42.0 [INFO] [stderr] Downloaded hyper-util v0.1.10 [INFO] [stderr] Downloaded quinn v0.11.6 [INFO] [stderr] Downloaded windows v0.52.0 [INFO] [stderr] Downloaded bigdecimal v0.4.7 [INFO] [stderr] Downloaded yansi v1.0.1 [INFO] [stderr] Downloaded sea-orm-macros v1.1.4 [INFO] [stderr] Downloaded pkcs1 v0.7.5 [INFO] [stderr] Downloaded der v0.7.9 [INFO] [stderr] Downloaded rsa v0.9.7 [INFO] [stderr] Downloaded vcpkg v0.2.15 [INFO] [stderr] Downloaded sha3 v0.10.8 [INFO] [stderr] Downloaded tokio v1.43.0 [INFO] [stderr] Downloaded libc v0.2.169 [INFO] [stderr] Downloaded nom_locate v4.2.0 [INFO] [stderr] Downloaded drain_filter_polyfill v0.1.3 [INFO] [stderr] Downloaded whoami v1.5.2 [INFO] [stderr] Downloaded foldhash v0.1.4 [INFO] [stderr] Downloaded pin-project-internal v1.1.8 [INFO] [stderr] Downloaded sealed v0.5.0 [INFO] [stderr] Downloaded bytemuck v1.21.0 [INFO] [stderr] Downloaded toml v0.8.19 [INFO] [stderr] Downloaded email-encoding v0.3.1 [INFO] [stderr] Downloaded ring v0.17.8 [INFO] [stderr] Downloaded email_address v0.2.9 [INFO] [stderr] Downloaded enum-as-inner v0.6.1 [INFO] [stderr] Downloaded winreg v0.50.0 [INFO] [stderr] Downloaded ipconfig v0.3.2 [INFO] [stderr] Downloaded lru-cache v0.1.2 [INFO] [stderr] Downloaded hostname v0.3.1 [INFO] [stderr] Downloaded quick-error v1.2.3 [INFO] [stderr] Downloaded resolv-conf v0.7.0 [INFO] [stderr] Downloaded pbkdf2 v0.12.2 [INFO] [stderr] Downloaded sasl v0.5.2 [INFO] [stderr] Downloaded similar v2.7.0 [INFO] [stderr] Downloaded hyper-rustls v0.27.5 [INFO] [stderr] Downloaded httparse v1.9.5 [INFO] [stderr] Downloaded ipnet v2.11.0 [INFO] [stderr] Downloaded quinn-udp v0.5.9 [INFO] [stderr] Downloaded rustc-hash v2.1.0 [INFO] [stderr] Downloaded tokio-rustls v0.26.1 [INFO] [stderr] Downloaded async-stream v0.3.6 [INFO] [stderr] Downloaded async-trait v0.1.85 [INFO] [stderr] Downloaded ouroboros_macro v0.18.5 [INFO] [stderr] Downloaded ouroboros v0.18.5 [INFO] [stderr] Downloaded proc-macro-error-attr2 v2.0.0 [INFO] [stderr] Downloaded proc-macro-error2 v2.0.1 [INFO] [stderr] Downloaded fastrand v2.3.0 [INFO] [stderr] Downloaded tempfile v3.15.0 [INFO] [stderr] Downloaded sqlx-macros-core v0.8.3 [INFO] [stderr] Downloaded num-iter v0.1.45 [INFO] [stderr] Downloaded num-integer v0.1.46 [INFO] [stderr] Downloaded pkcs8 v0.10.2 [INFO] [stderr] Downloaded base64ct v1.6.0 [INFO] [stderr] Downloaded pem-rfc7468 v0.7.0 [INFO] [stderr] Downloaded unicode-normalization v0.1.24 [INFO] [stderr] Downloaded rxml v0.11.1 [INFO] [stderr] Downloaded xmpp-parsers v0.21.0 [INFO] [stderr] Downloaded tower v0.5.2 [INFO] [stderr] Downloaded futures-util v0.3.31 [INFO] [stderr] Downloaded http v1.2.0 [INFO] [stderr] Downloaded time v0.3.37 [INFO] [stderr] Downloaded humantime v2.1.0 [INFO] [stderr] Downloaded inventory v0.3.17 [INFO] [stderr] Downloaded lazy-regex-proc_macros v3.4.1 [INFO] [stderr] Downloaded lazy-regex v3.4.1 [INFO] [stderr] Downloaded smart-default v0.7.1 [INFO] [stderr] Downloaded atomic v0.6.0 [INFO] [stderr] Downloaded inlinable_string v0.1.15 [INFO] [stderr] Downloaded pear v0.2.9 [INFO] [stderr] Downloaded serde_spanned v0.6.8 [INFO] [stderr] Downloaded uncased v0.9.10 [INFO] [stderr] Downloaded iso8601-duration v0.2.0 [INFO] [stderr] Downloaded psm v0.1.24 [INFO] [stderr] Downloaded stacker v0.1.17 [INFO] [stderr] Downloaded hostname v0.4.0 [INFO] [stderr] Downloaded quoted_printable v0.5.1 [INFO] [stderr] Downloaded convert_case v0.6.0 [INFO] [stderr] Downloaded gloo-timers v0.3.0 [INFO] [stderr] Downloaded data-encoding v2.7.0 [INFO] [stderr] Downloaded linked-hash-map v0.5.6 [INFO] [stderr] Downloaded linked_hash_set v0.1.5 [INFO] [stderr] Downloaded wasm-bindgen-futures v0.4.50 [INFO] [stderr] Downloaded windows-registry v0.2.0 [INFO] [stderr] Downloaded aliasable v0.1.3 [INFO] [stderr] Downloaded proc-macro2-diagnostics v0.10.1 [INFO] [stderr] Downloaded sqlx-macros v0.8.3 [INFO] [stderr] Downloaded spki v0.7.3 [INFO] [stderr] Downloaded sqlx-mysql v0.8.3 [INFO] [stderr] Downloaded chrono v0.4.39 [INFO] [stderr] Downloaded object v0.36.7 [INFO] [stderr] Downloaded tracing-subscriber v0.3.19 [INFO] [stderr] Downloaded serde v1.0.217 [INFO] [stderr] Downloaded syn v2.0.96 [INFO] [stderr] Downloaded web-time v1.1.0 [INFO] [stderr] Downloaded rustls-pki-types v1.10.1 [INFO] [stderr] Downloaded anstyle-query v1.1.2 [INFO] [stderr] Downloaded anstyle-wincon v3.0.7 [INFO] [stderr] Downloaded anstream v0.6.18 [INFO] [stderr] Downloaded etcetera v0.8.0 [INFO] [stderr] Downloaded url v1.7.2 [INFO] [stderr] Downloaded cc v1.2.10 [INFO] [stderr] Downloaded sha2 v0.10.8 [INFO] [stderr] Downloaded const-oid v0.9.6 [INFO] [stderr] Downloaded unicode-bidi v0.3.18 [INFO] [stderr] Downloaded tinyvec v1.8.1 [INFO] [stderr] Downloaded unicode-properties v0.1.3 [INFO] [stderr] Downloaded compact_str v0.7.1 [INFO] [stderr] Downloaded strum_macros v0.26.4 [INFO] [stderr] Downloaded bitflags v2.8.0 [INFO] [stderr] Downloaded futures-channel v0.3.31 [INFO] [stderr] Downloaded unicase v2.8.1 [INFO] [stderr] Downloaded mio v1.0.3 [INFO] [stderr] Downloaded tokio-util v0.7.13 [INFO] [stderr] Downloaded tower-http v0.6.2 [INFO] [stderr] Downloaded tracing v0.1.41 [INFO] [stderr] Downloaded js-sys v0.3.77 [INFO] [stderr] Downloaded log v0.4.25 [INFO] [stderr] Downloaded semver v1.0.25 [INFO] [stderr] Downloaded serde_derive v1.0.217 [INFO] [stderr] Downloaded time-macros v0.2.19 [INFO] [stderr] Downloaded unicode-segmentation v1.12.0 [INFO] [stderr] Downloaded match_cfg v0.1.0 [INFO] [stderr] Downloaded try-lock v0.2.5 [INFO] [stderr] Downloaded sea-bae v0.2.1 [INFO] [stderr] Downloaded wasite v0.1.0 [INFO] [stderr] Downloaded percent-encoding v1.0.1 [INFO] [stderr] Downloaded blake2 v0.10.6 [INFO] [stderr] Downloaded android-tzdata v0.1.1 [INFO] [stderr] Downloaded windows-core v0.52.0 [INFO] [stderr] Downloaded subtle v2.6.1 [INFO] [stderr] Downloaded cpufeatures v0.2.16 [INFO] [stderr] Downloaded keccak v0.1.5 [INFO] [stderr] Downloaded stringprep v0.1.5 [INFO] [stderr] Downloaded jid v0.11.1 [INFO] [stderr] Downloaded minidom v0.16.0 [INFO] [stderr] Downloaded castaway v0.2.3 [INFO] [stderr] Downloaded rxml_validation v0.11.0 [INFO] [stderr] Downloaded xso_proc v0.1.0 [INFO] [stderr] Downloaded xso v0.1.2 [INFO] [stderr] Downloaded heck v0.5.0 [INFO] [stderr] Downloaded strum v0.26.3 [INFO] [stderr] Downloaded tokio-stream v0.1.17 [INFO] [stderr] Downloaded futures-macro v0.3.31 [INFO] [stderr] Downloaded futures-task v0.3.31 [INFO] [stderr] Downloaded http-body v1.0.1 [INFO] [stderr] Downloaded http-body-util v0.1.2 [INFO] [stderr] Downloaded http-range-header v0.4.2 [INFO] [stderr] Downloaded bytes v1.9.0 [INFO] [stderr] Downloaded uuid-macro-internal v1.12.1 [INFO] [stderr] Downloaded wasm-bindgen-shared v0.2.100 [INFO] [stderr] Downloaded wasm-bindgen v0.2.100 [INFO] [stderr] Downloaded rustc_version v0.4.1 [INFO] [stderr] Downloaded logos-derive v0.15.0 [INFO] [stderr] Downloaded vcard4 v0.7.1 [INFO] [stderr] Downloaded async-stream-impl v0.3.6 [INFO] [stderr] Downloaded sea-query-binder v0.7.0 [INFO] [stderr] Downloaded matches v0.1.10 [INFO] [stderr] Downloaded url_serde v0.2.0 [INFO] [stderr] Downloaded iana-time-zone-haiku v0.1.2 [INFO] [stderr] Downloaded iana-time-zone v0.1.61 [INFO] [stderr] Downloaded sync_wrapper v1.0.2 [INFO] [stderr] Downloaded miniz_oxide v0.8.3 [INFO] [stderr] Downloaded socket2 v0.5.8 [INFO] [stderr] Downloaded pin-project-lite v0.2.16 [INFO] [stderr] Downloaded tracing-attributes v0.1.28 [INFO] [stderr] Downloaded urlencoding v2.1.3 [INFO] [stderr] Downloaded rustversion v1.0.19 [INFO] [stderr] Downloaded wasm-bindgen-backend v0.2.100 [INFO] [stderr] Downloaded wasm-bindgen-macro-support v0.2.100 [INFO] [stderr] Downloaded logos-codegen v0.15.0 [INFO] [stderr] Downloaded thiserror v2.0.11 [INFO] [stderr] Downloaded valuable v0.1.1 [INFO] [stderr] Downloaded uuid v1.12.1 [INFO] [stderr] Downloaded thiserror-impl v2.0.11 [INFO] [stderr] Downloaded itoa v1.0.14 [INFO] [stderr] Downloaded tokio-macros v2.5.0 [INFO] [stderr] Downloaded tower-layer v0.3.3 [INFO] [stderr] Downloaded tower-service v0.3.3 [INFO] [stderr] Downloaded tracing-core v0.1.33 [INFO] [stderr] Downloaded beef v0.5.2 [INFO] [stderr] Downloaded proc-macro2 v1.0.93 [INFO] [stderr] Downloaded aws-lc-sys v0.25.0 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:1680c8fbd8dfb46fcd6d22e546df16ab0e007457dc29fcd9e987cdd5077fd1af" "/opt/rustwide/cargo-home/bin/cargo" "+ebf0cf75d368c035f4c7e7246d203bd469ee4a51" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] b99a4f22085b7fdac0a23f535f7777253da0b0a8fbef998cfde2ac058f6499e1 [INFO] running `Command { std: "docker" "start" "-a" "b99a4f22085b7fdac0a23f535f7777253da0b0a8fbef998cfde2ac058f6499e1", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "b99a4f22085b7fdac0a23f535f7777253da0b0a8fbef998cfde2ac058f6499e1", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "b99a4f22085b7fdac0a23f535f7777253da0b0a8fbef998cfde2ac058f6499e1", kill_on_drop: false }` [INFO] [stdout] b99a4f22085b7fdac0a23f535f7777253da0b0a8fbef998cfde2ac058f6499e1 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:1680c8fbd8dfb46fcd6d22e546df16ab0e007457dc29fcd9e987cdd5077fd1af" "/opt/rustwide/cargo-home/bin/cargo" "+ebf0cf75d368c035f4c7e7246d203bd469ee4a51" "build" "--frozen" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 4ef4b7a55307553f40436bb6e1dcd3f80caa0c486715b7dee3925e06ca883470 [INFO] running `Command { std: "docker" "start" "-a" "4ef4b7a55307553f40436bb6e1dcd3f80caa0c486715b7dee3925e06ca883470", kill_on_drop: false }` [INFO] [stderr] Compiling proc-macro2 v1.0.93 [INFO] [stderr] Compiling unicode-ident v1.0.15 [INFO] [stderr] Compiling libc v0.2.169 [INFO] [stderr] Compiling cfg-if v1.0.0 [INFO] [stderr] Compiling autocfg v1.4.0 [INFO] [stderr] Compiling version_check v0.9.5 [INFO] [stderr] Compiling serde v1.0.217 [INFO] [stderr] Compiling itoa v1.0.14 [INFO] [stderr] Compiling memchr v2.7.4 [INFO] [stderr] Compiling pin-project-lite v0.2.16 [INFO] [stderr] Compiling shlex v1.3.0 [INFO] [stderr] Compiling bytes v1.9.0 [INFO] [stderr] Compiling futures-core v0.3.31 [INFO] [stderr] Compiling fnv v1.0.7 [INFO] [stderr] Compiling futures-sink v0.3.31 [INFO] [stderr] Compiling once_cell v1.20.2 [INFO] [stderr] Compiling pin-utils v0.1.0 [INFO] [stderr] Compiling futures-channel v0.3.31 [INFO] [stderr] Compiling typenum v1.17.0 [INFO] [stderr] Compiling slab v0.4.9 [INFO] [stderr] Compiling futures-io v0.3.31 [INFO] [stderr] Compiling futures-task v0.3.31 [INFO] [stderr] Compiling ryu v1.0.18 [INFO] [stderr] Compiling stable_deref_trait v1.2.0 [INFO] [stderr] Compiling smallvec v1.13.2 [INFO] [stderr] Compiling log v0.4.25 [INFO] [stderr] Compiling subtle v2.6.1 [INFO] [stderr] Compiling quote v1.0.38 [INFO] [stderr] Compiling generic-array v0.14.7 [INFO] [stderr] Compiling allocator-api2 v0.2.21 [INFO] [stderr] Compiling lock_api v0.4.12 [INFO] [stderr] Compiling byteorder v1.5.0 [INFO] [stderr] Compiling syn v2.0.96 [INFO] [stderr] Compiling tracing-core v0.1.33 [INFO] [stderr] Compiling scopeguard v1.2.0 [INFO] [stderr] Compiling writeable v0.5.5 [INFO] [stderr] Compiling jobserver v0.1.32 [INFO] [stderr] Compiling socket2 v0.5.8 [INFO] [stderr] Compiling mio v1.0.3 [INFO] [stderr] Compiling signal-hook-registry v1.4.2 [INFO] [stderr] Compiling cc v1.2.10 [INFO] [stderr] Compiling getrandom v0.2.15 [INFO] [stderr] Compiling rustversion v1.0.19 [INFO] [stderr] Compiling litemap v0.7.4 [INFO] [stderr] Compiling percent-encoding v2.3.1 [INFO] [stderr] Compiling equivalent v1.0.1 [INFO] [stderr] Compiling dunce v1.0.5 [INFO] [stderr] Compiling foldhash v0.1.4 [INFO] [stderr] Compiling fs_extra v1.3.0 [INFO] [stderr] Compiling icu_locid_transform_data v1.5.0 [INFO] [stderr] Compiling form_urlencoded v1.2.1 [INFO] [stderr] Compiling hashbrown v0.15.2 [INFO] [stderr] Compiling paste v1.0.15 [INFO] [stderr] Compiling icu_properties_data v1.5.0 [INFO] [stderr] Compiling num-traits v0.2.19 [INFO] [stderr] Compiling utf8_iter v1.0.4 [INFO] [stderr] Compiling aws-lc-rs v1.12.2 [INFO] [stderr] Compiling write16 v1.0.0 [INFO] [stderr] Compiling icu_normalizer_data v1.5.0 [INFO] [stderr] Compiling utf16_iter v1.0.5 [INFO] [stderr] Compiling spin v0.9.8 [INFO] [stderr] Compiling rand_core v0.6.4 [INFO] [stderr] Compiling rustls-pki-types v1.10.1 [INFO] [stderr] Compiling cmake v0.1.52 [INFO] [stderr] Compiling crypto-common v0.1.6 [INFO] [stderr] Compiling block-buffer v0.10.4 [INFO] [stderr] Compiling digest v0.10.7 [INFO] [stderr] Compiling indexmap v2.7.1 [INFO] [stderr] Compiling untrusted v0.9.0 [INFO] [stderr] Compiling rustls v0.23.21 [INFO] [stderr] Compiling strsim v0.11.1 [INFO] [stderr] Compiling static_assertions v1.1.0 [INFO] [stderr] Compiling cpufeatures v0.2.16 [INFO] [stderr] Compiling serde_json v1.0.137 [INFO] [stderr] Compiling http v1.2.0 [INFO] [stderr] Compiling iana-time-zone v0.1.61 [INFO] [stderr] Compiling parking_lot_core v0.9.10 [INFO] [stderr] Compiling tinyvec_macros v0.1.1 [INFO] [stderr] Compiling thiserror v1.0.69 [INFO] [stderr] Compiling tinyvec v1.8.1 [INFO] [stderr] Compiling heck v0.4.1 [INFO] [stderr] Compiling aws-lc-sys v0.25.0 [INFO] [stderr] Compiling ring v0.17.8 [INFO] [stderr] Compiling heck v0.5.0 [INFO] [stderr] Compiling ident_case v1.0.1 [INFO] [stderr] Compiling webpki-roots v0.26.7 [INFO] [stderr] Compiling castaway v0.2.3 [INFO] [stderr] Compiling crossbeam-utils v0.8.21 [INFO] [stderr] Compiling compact_str v0.7.1 [INFO] [stderr] Compiling parking_lot v0.12.3 [INFO] [stderr] Compiling sha2 v0.10.8 [INFO] [stderr] Compiling base64 v0.22.1 [INFO] [stderr] Compiling unicode-normalization v0.1.24 [INFO] [stderr] Compiling http-body v1.0.1 [INFO] [stderr] Compiling proc-macro2-diagnostics v0.10.1 [INFO] [stderr] Compiling lazy_static v1.5.0 [INFO] [stderr] Compiling thiserror v2.0.11 [INFO] [stderr] Compiling unicode-bidi v0.3.18 [INFO] [stderr] Compiling httpdate v1.0.3 [INFO] [stderr] Compiling rustls-pemfile v2.2.0 [INFO] [stderr] Compiling yansi v1.0.1 [INFO] [stderr] Compiling pkg-config v0.3.31 [INFO] [stderr] Compiling mime v0.3.17 [INFO] [stderr] Compiling httparse v1.9.5 [INFO] [stderr] Compiling tower-service v0.3.3 [INFO] [stderr] Compiling vcpkg v0.2.15 [INFO] [stderr] Compiling concurrent-queue v2.5.0 [INFO] [stderr] Compiling rxml_validation v0.11.0 [INFO] [stderr] Compiling semver v1.0.25 [INFO] [stderr] Compiling try-lock v0.2.5 [INFO] [stderr] Compiling crc-catalog v2.4.0 [INFO] [stderr] Compiling parking v2.2.1 [INFO] [stderr] Compiling atomic-waker v1.1.2 [INFO] [stderr] Compiling event-listener v5.4.0 [INFO] [stderr] Compiling crc v3.2.1 [INFO] [stderr] Compiling want v0.3.1 [INFO] [stderr] Compiling crossbeam-queue v0.3.12 [INFO] [stderr] Compiling synstructure v0.13.1 [INFO] [stderr] Compiling darling_core v0.20.10 [INFO] [stderr] Compiling libsqlite3-sys v0.30.1 [INFO] [stderr] Compiling futures-intrusive v0.5.0 [INFO] [stderr] Compiling ordered-float v3.9.2 [INFO] [stderr] Compiling sha1 v0.10.6 [INFO] [stderr] Compiling hashlink v0.10.0 [INFO] [stderr] Compiling linked-hash-map v0.5.6 [INFO] [stderr] Compiling unicode-properties v0.1.3 [INFO] [stderr] Compiling utf8parse v0.2.2 [INFO] [stderr] Compiling tower-layer v0.3.3 [INFO] [stderr] Compiling anstyle-parse v0.2.6 [INFO] [stderr] Compiling stringprep v0.1.5 [INFO] [stderr] Compiling atoi v2.0.0 [INFO] [stderr] Compiling psm v0.1.24 [INFO] [stderr] Compiling flume v0.11.1 [INFO] [stderr] Compiling proc-macro-error-attr2 v2.0.0 [INFO] [stderr] Compiling sync_wrapper v1.0.2 [INFO] [stderr] Compiling ahash v0.8.11 [INFO] [stderr] Compiling object v0.36.7 [INFO] [stderr] Compiling ipnet v2.11.0 [INFO] [stderr] Compiling is_terminal_polyfill v1.70.1 [INFO] [stderr] Compiling regex-syntax v0.8.5 [INFO] [stderr] Compiling anstyle-query v1.1.2 [INFO] [stderr] Compiling regex-syntax v0.6.29 [INFO] [stderr] Compiling serde_derive v1.0.217 [INFO] [stderr] Compiling tokio-macros v2.5.0 [INFO] [stderr] Compiling zerofrom-derive v0.1.5 [INFO] [stderr] Compiling tokio v1.43.0 [INFO] [stderr] Compiling futures-macro v0.3.31 [INFO] [stderr] Compiling futures-util v0.3.31 [INFO] [stderr] Compiling zerofrom v0.1.5 [INFO] [stderr] Compiling yoke-derive v0.7.5 [INFO] [stderr] Compiling zerovec-derive v0.10.3 [INFO] [stderr] Compiling displaydoc v0.2.5 [INFO] [stderr] Compiling zerocopy-derive v0.7.35 [INFO] [stderr] Compiling yoke v0.7.5 [INFO] [stderr] Compiling tracing-attributes v0.1.28 [INFO] [stderr] Compiling zerovec v0.10.4 [INFO] [stderr] Compiling zerocopy v0.7.35 [INFO] [stderr] Compiling tinystr v0.7.6 [INFO] [stderr] Compiling icu_locid v1.5.0 [INFO] [stderr] Compiling icu_provider_macros v1.5.0 [INFO] [stderr] Compiling tracing v0.1.41 [INFO] [stderr] Compiling zeroize_derive v1.4.2 [INFO] [stderr] Compiling icu_collections v1.5.0 [INFO] [stderr] Compiling ppv-lite86 v0.2.20 [INFO] [stderr] Compiling icu_provider v1.5.0 [INFO] [stderr] Compiling zeroize v1.8.1 [INFO] [stderr] Compiling rand_chacha v0.3.1 [INFO] [stderr] Compiling thiserror-impl v1.0.69 [INFO] [stderr] Compiling futures-executor v0.3.31 [INFO] [stderr] Compiling icu_locid_transform v1.5.0 [INFO] [stderr] Compiling rand v0.8.5 [INFO] [stderr] Compiling uuid-macro-internal v1.12.1 [INFO] [stderr] Compiling chrono v0.4.39 [INFO] [stderr] Compiling uuid v1.12.1 [INFO] [stderr] Compiling icu_properties v1.5.1 [INFO] [stderr] Compiling tokio-util v0.7.13 [INFO] [stderr] Compiling darling_macro v0.20.10 [INFO] [stderr] Compiling tokio-stream v0.1.17 [INFO] [stderr] Compiling darling v0.20.10 [INFO] [stderr] Compiling serde_urlencoded v0.7.1 [INFO] [stderr] Compiling thiserror-impl v2.0.11 [INFO] [stderr] Compiling futures v0.3.31 [INFO] [stderr] Compiling h2 v0.4.7 [INFO] [stderr] Compiling sea-query-derive v0.4.2 [INFO] [stderr] Compiling either v1.13.0 [INFO] [stderr] Compiling rxml v0.11.1 [INFO] [stderr] Compiling async-trait v0.1.85 [INFO] [stderr] Compiling inherent v1.0.11 [INFO] [stderr] Compiling sea-query v0.32.1 [INFO] [stderr] Compiling minidom v0.16.0 [INFO] [stderr] Compiling http-body-util v0.1.2 [INFO] [stderr] Compiling colorchoice v1.0.3 [INFO] [stderr] Compiling icu_normalizer v1.5.0 [INFO] [stderr] Compiling match_cfg v0.1.0 [INFO] [stderr] Compiling anstyle v1.0.10 [INFO] [stderr] Compiling hostname v0.3.1 [INFO] [stderr] Compiling jid v0.11.1 [INFO] [stderr] Compiling anstream v0.6.18 [INFO] [stderr] Compiling regex-automata v0.4.9 [INFO] [stderr] Compiling regex-automata v0.1.10 [INFO] [stderr] Compiling idna_adapter v1.2.0 [INFO] [stderr] Compiling enum-as-inner v0.6.1 [INFO] [stderr] Compiling idna v1.0.3 [INFO] [stderr] Compiling strum_macros v0.26.4 [INFO] [stderr] Compiling xso_proc v0.1.0 [INFO] [stderr] Compiling url v2.5.4 [INFO] [stderr] Compiling proc-macro-error2 v2.0.1 [INFO] [stderr] Compiling rustc_version v0.4.1 [INFO] [stderr] Compiling stacker v0.1.17 [INFO] [stderr] Compiling keccak v0.1.5 [INFO] [stderr] Compiling clap_lex v0.7.4 [INFO] [stderr] Compiling time-core v0.1.2 [INFO] [stderr] Compiling gimli v0.31.1 [INFO] [stderr] Compiling data-encoding v2.7.0 [INFO] [stderr] Compiling num-conv v0.1.0 [INFO] [stderr] Compiling overload v0.1.1 [INFO] [stderr] Compiling powerfmt v0.2.0 [INFO] [stderr] Compiling quick-error v1.2.3 [INFO] [stderr] Compiling unicode-segmentation v1.12.0 [INFO] [stderr] Compiling adler2 v2.0.0 [INFO] [stderr] Compiling miniz_oxide v0.8.3 [INFO] [stderr] Compiling strum v0.26.3 [INFO] [stderr] Compiling hickory-proto v0.24.2 [INFO] [stderr] Compiling deranged v0.3.11 [INFO] [stderr] Compiling resolv-conf v0.7.0 [INFO] [stderr] Compiling time-macros v0.2.19 [INFO] [stderr] Compiling nu-ansi-term v0.46.0 [INFO] [stderr] Compiling clap_builder v4.5.27 [INFO] [stderr] Compiling logos-codegen v0.15.0 [INFO] [stderr] Compiling sha3 v0.10.8 [INFO] [stderr] Compiling regex v1.11.1 [INFO] [stderr] Compiling xso v0.1.2 [INFO] [stderr] Compiling hyper v1.5.2 [INFO] [stderr] Compiling sea-bae v0.2.1 [INFO] [stderr] Compiling addr2line v0.24.2 [INFO] [stderr] Compiling matchers v0.1.0 [INFO] [stderr] Compiling serde_spanned v0.6.8 [INFO] [stderr] Compiling toml_datetime v0.6.8 [INFO] [stderr] Compiling tower v0.5.2 [INFO] [stderr] Compiling ouroboros_macro v0.18.5 [INFO] [stderr] Compiling sea-schema-derive v0.3.0 [INFO] [stderr] Compiling hyper-util v0.1.10 [INFO] [stderr] Compiling clap_derive v4.5.24 [INFO] [stderr] Compiling async-stream-impl v0.3.6 [INFO] [stderr] Compiling lru-cache v0.1.2 [INFO] [stderr] Compiling sharded-slab v0.1.7 [INFO] [stderr] Compiling pbkdf2 v0.12.2 [INFO] [stderr] Compiling blake2 v0.10.6 [INFO] [stderr] Compiling hmac v0.12.1 [INFO] [stderr] Compiling thread_local v1.1.8 [INFO] [stderr] Compiling uncased v0.9.10 [INFO] [stderr] Compiling matches v0.1.10 [INFO] [stderr] Compiling aliasable v0.1.3 [INFO] [stderr] Compiling anyhow v1.0.95 [INFO] [stderr] Compiling minimal-lexical v0.2.1 [INFO] [stderr] Compiling winnow v0.6.24 [INFO] [stderr] Compiling rustc-demangle v0.1.24 [INFO] [stderr] Compiling nom v7.1.3 [INFO] [stderr] Compiling tracing-subscriber v0.3.19 [INFO] [stderr] Compiling ouroboros v0.18.5 [INFO] [stderr] Compiling idna v0.1.5 [INFO] [stderr] Compiling clap v4.5.27 [INFO] [stderr] Compiling xmpp-parsers v0.21.0 [INFO] [stderr] Compiling sasl v0.5.2 [INFO] [stderr] Compiling hickory-resolver v0.24.2 [INFO] [stderr] Compiling async-stream v0.3.6 [INFO] [stderr] Compiling sea-schema v0.16.1 [INFO] [stderr] Compiling toml_edit v0.22.22 [INFO] [stderr] Compiling backtrace v0.3.74 [INFO] [stderr] Compiling sea-orm-macros v1.1.4 [INFO] [stderr] Compiling hashbrown v0.14.5 [INFO] [stderr] Compiling time v0.3.37 [INFO] [stderr] Compiling convert_case v0.6.0 [INFO] [stderr] Compiling secrecy v0.8.0 [INFO] [stderr] Compiling pear_codegen v0.2.9 [INFO] [stderr] Compiling figment v0.10.19 [INFO] [stderr] Compiling glob v0.3.2 [INFO] [stderr] Compiling unicase v2.8.1 [INFO] [stderr] Compiling beef v0.5.2 [INFO] [stderr] Compiling inlinable_string v0.1.15 [INFO] [stderr] Compiling percent-encoding v1.0.1 [INFO] [stderr] Compiling dotenvy v0.15.7 [INFO] [stderr] Compiling url v1.7.2 [INFO] [stderr] Compiling sea-orm-cli v1.1.4 [INFO] [stderr] Compiling pear v0.2.9 [INFO] [stderr] Compiling mime_guess v2.0.5 [INFO] [stderr] Compiling toml v0.8.19 [INFO] [stderr] Compiling prose-proc-macros v0.1.0 (https://github.com/prose-im/prose-core-client.git?tag=0.1.99#ca865789) [INFO] [stderr] Compiling chumsky v0.9.3 [INFO] [stderr] Compiling prose-wasm-utils v0.1.0 (https://github.com/prose-im/prose-core-client.git?tag=0.1.99#ca865789) [INFO] [stderr] Compiling serde_with_macros v3.12.0 [INFO] [stderr] Compiling email_address v0.2.9 [INFO] [stderr] Compiling linked_hash_set v0.1.5 [INFO] [stderr] Compiling email-encoding v0.3.1 [INFO] [stderr] Compiling hostname v0.4.0 [INFO] [stderr] Compiling cookie v0.18.1 [INFO] [stderr] Compiling prose-utils v0.1.0 (https://github.com/prose-im/prose-core-client.git?tag=0.1.99#ca865789) [INFO] [stderr] Compiling fastrand v2.3.0 [INFO] [stderr] Compiling quoted_printable v0.5.1 [INFO] [stderr] Compiling prosody-config v0.1.0 (/opt/rustwide/workdir/crates/prosody-config) [INFO] [stderr] Compiling url_serde v0.2.0 [INFO] [stderr] Compiling iso8601-duration v0.2.0 [INFO] [stderr] Compiling logos-derive v0.15.0 [INFO] [stderr] Compiling axum-core v0.5.0 [INFO] [stderr] Compiling serde_with v3.12.0 [INFO] [stderr] Compiling serde_path_to_error v0.1.16 [INFO] [stderr] Compiling axum-macros v0.5.0 [INFO] [stderr] Compiling headers-core v0.3.0 [INFO] [stderr] Compiling urlencoding v2.1.3 [INFO] [stderr] Compiling matchit v0.8.4 [INFO] [stderr] Compiling base64 v0.21.7 [INFO] [stderr] Compiling logos v0.15.0 [INFO] [stderr] Compiling headers v0.4.0 [INFO] [stderr] Compiling serde_html_form v0.2.7 [INFO] [stderr] Compiling uriparse v0.6.4 [INFO] [stderr] Compiling generic-array v1.2.0 [INFO] [stderr] Compiling aho-corasick v1.1.3 [INFO] [stderr] Compiling http-range-header v0.4.2 [INFO] [stderr] Compiling bitflags v2.8.0 [INFO] [stderr] Compiling iso8601-timestamp v0.3.3 [INFO] [stderr] Compiling tower-http v0.6.2 [INFO] [stderr] Compiling http-auth-basic v0.3.5 [INFO] [stderr] Compiling axum v0.8.1 [INFO] [stderr] Compiling vcard4 v0.7.1 [INFO] [stderr] Compiling axum-extra v0.10.0 [INFO] [stderr] Compiling rustls-webpki v0.102.8 [INFO] [stderr] Compiling sqlx-core v0.8.3 [INFO] [stderr] Compiling tokio-rustls v0.26.1 [INFO] [stderr] Compiling lettre v0.11.11 [INFO] [stderr] Compiling tokio-xmpp v4.0.0 [INFO] [stderr] Compiling hyper-rustls v0.27.5 [INFO] [stderr] Compiling reqwest v0.12.12 [INFO] [stderr] Compiling prose-xmpp v0.1.0 (https://github.com/prose-im/prose-core-client.git?tag=0.1.99#ca865789) [INFO] [stderr] Compiling sqlx-sqlite v0.8.3 [INFO] [stderr] Compiling sqlx v0.8.3 [INFO] [stderr] Compiling sea-query-binder v0.7.0 [INFO] [stderr] Compiling sea-orm v1.1.4 [INFO] [stderr] Compiling sea-orm-migration v1.1.4 [INFO] [stderr] Compiling service v0.9.0 (/opt/rustwide/workdir/crates/service) [INFO] [stderr] Compiling prose-pod-api v0.9.0 (/opt/rustwide/workdir/crates/rest-api) [INFO] [stderr] Compiling migrator v0.9.0 (/opt/rustwide/workdir/crates/migrator) [INFO] [stderr] Finished `dev` profile [unoptimized] target(s) in 2m 20s [INFO] running `Command { std: "docker" "inspect" "4ef4b7a55307553f40436bb6e1dcd3f80caa0c486715b7dee3925e06ca883470", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "4ef4b7a55307553f40436bb6e1dcd3f80caa0c486715b7dee3925e06ca883470", kill_on_drop: false }` [INFO] [stdout] 4ef4b7a55307553f40436bb6e1dcd3f80caa0c486715b7dee3925e06ca883470 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:1680c8fbd8dfb46fcd6d22e546df16ab0e007457dc29fcd9e987cdd5077fd1af" "/opt/rustwide/cargo-home/bin/cargo" "+ebf0cf75d368c035f4c7e7246d203bd469ee4a51" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 911138d3333ad3ebd126e7f54254b54b5a9c29f51aea4cb3e90bd93d389dedcc [INFO] running `Command { std: "docker" "start" "-a" "911138d3333ad3ebd126e7f54254b54b5a9c29f51aea4cb3e90bd93d389dedcc", kill_on_drop: false }` [INFO] [stderr] Compiling memchr v2.7.4 [INFO] [stderr] Compiling log v0.4.25 [INFO] [stderr] Compiling tracing-core v0.1.33 [INFO] [stderr] Compiling rand v0.8.5 [INFO] [stderr] Compiling crossbeam-utils v0.8.21 [INFO] [stderr] Compiling bitflags v2.8.0 [INFO] [stderr] Compiling rustix v0.38.44 [INFO] [stderr] Compiling rustls v0.23.21 [INFO] [stderr] Compiling linux-raw-sys v0.4.15 [INFO] [stderr] Compiling tracing v0.1.41 [INFO] [stderr] Compiling tracing-log v0.2.0 [INFO] [stderr] Compiling h2 v0.4.7 [INFO] [stderr] Compiling futures-util v0.3.31 [INFO] [stderr] Compiling serde_json v1.0.137 [INFO] [stderr] Compiling aho-corasick v1.1.3 [INFO] [stderr] Compiling uuid v1.12.1 [INFO] [stderr] Compiling concurrent-queue v2.5.0 [INFO] [stderr] Compiling event-listener v5.4.0 [INFO] [stderr] Compiling crossbeam-queue v0.3.12 [INFO] [stderr] Compiling terminal_size v0.4.1 [INFO] [stderr] Compiling object v0.36.7 [INFO] [stderr] Compiling nom v7.1.3 [INFO] [stderr] Compiling clap_builder v4.5.27 [INFO] [stderr] Compiling regex-automata v0.4.9 [INFO] [stderr] Compiling sea-query v0.32.1 [INFO] [stderr] Compiling jid v0.11.1 [INFO] [stderr] Compiling tokio-rustls v0.26.1 [INFO] [stderr] Compiling futures-executor v0.3.31 [INFO] [stderr] Compiling http-body-util v0.1.2 [INFO] [stderr] Compiling futures v0.3.31 [INFO] [stderr] Compiling sqlx-core v0.8.3 [INFO] [stderr] Compiling tower v0.5.2 [INFO] [stderr] Compiling regex v1.11.1 [INFO] [stderr] Compiling hyper v1.5.2 [INFO] [stderr] Compiling hickory-proto v0.24.2 [INFO] [stderr] Compiling backtrace v0.3.74 [INFO] [stderr] Compiling tracing-subscriber v0.3.19 [INFO] [stderr] Compiling clap v4.5.27 [INFO] [stderr] Compiling xso v0.1.2 [INFO] [stderr] Compiling serde v1.0.217 [INFO] [stderr] Compiling hyper-util v0.1.10 [INFO] [stderr] Compiling xmpp-parsers v0.21.0 [INFO] [stderr] Compiling sqlx-sqlite v0.8.3 [INFO] [stderr] Compiling anyhow v1.0.95 [INFO] [stderr] Compiling sea-schema v0.16.1 [INFO] [stderr] Compiling bytecount v0.6.8 [INFO] [stderr] Compiling hyper-rustls v0.27.5 [INFO] [stderr] Compiling prose-wasm-utils v0.1.0 (https://github.com/prose-im/prose-core-client.git?tag=0.1.99#ca865789) [INFO] [stderr] Compiling email-encoding v0.3.1 [INFO] [stderr] Compiling sealed v0.5.0 [INFO] [stderr] Compiling sqlx v0.8.3 [INFO] [stderr] Compiling sea-query-binder v0.7.0 [INFO] [stderr] Compiling sea-orm-cli v1.1.4 [INFO] [stderr] Compiling sea-orm v1.1.4 [INFO] [stderr] Compiling hickory-resolver v0.24.2 [INFO] [stderr] Compiling lettre v0.11.11 [INFO] [stderr] Compiling mime_guess v2.0.5 [INFO] [stderr] Compiling synthez-core v0.3.1 [INFO] [stderr] Compiling reqwest v0.12.12 [INFO] [stderr] Compiling iso8601-duration v0.2.0 [INFO] [stderr] Compiling bstr v1.11.3 [INFO] [stderr] Compiling tokio-xmpp v4.0.0 [INFO] [stderr] Compiling crossbeam-epoch v0.9.18 [INFO] [stderr] Compiling derive_more v0.99.18 [INFO] [stderr] Compiling regex-syntax v0.7.5 [INFO] [stderr] Compiling peg-runtime v0.6.3 [INFO] [stderr] Compiling same-file v1.0.6 [INFO] [stderr] Compiling either v1.13.0 [INFO] [stderr] Compiling walkdir v2.5.0 [INFO] [stderr] Compiling peg-macros v0.6.3 [INFO] [stderr] Compiling gherkin v0.14.0 [INFO] [stderr] Compiling crossbeam-deque v0.8.6 [INFO] [stderr] Compiling nom_locate v4.2.0 [INFO] [stderr] Compiling globset v0.4.15 [INFO] [stderr] Compiling synthez-codegen v0.3.1 [INFO] [stderr] Compiling typed-builder-macro v0.15.2 [INFO] [stderr] Compiling unicode-width v0.1.14 [INFO] [stderr] Compiling sea-orm-migration v1.1.4 [INFO] [stderr] Compiling smawk v0.3.2 [INFO] [stderr] Compiling unicode-linebreak v0.1.5 [INFO] [stderr] Compiling cucumber-expressions v0.3.0 [INFO] [stderr] Compiling textwrap v0.16.1 [INFO] [stderr] Compiling typed-builder v0.15.2 [INFO] [stderr] Compiling synthez v0.3.1 [INFO] [stderr] Compiling peg v0.6.3 [INFO] [stderr] Compiling ignore v0.4.23 [INFO] [stderr] Compiling itertools v0.13.0 [INFO] [stderr] Compiling lazy-regex-proc_macros v3.4.1 [INFO] [stderr] Compiling axum-core v0.5.0 [INFO] [stderr] Compiling pin-project-internal v1.1.8 [INFO] [stderr] Compiling inflections v1.1.1 [INFO] [stderr] Compiling unicode-width v0.2.0 [INFO] [stderr] Compiling console v0.15.10 [INFO] [stderr] Compiling lazy-regex v3.4.1 [INFO] [stderr] Compiling globwalk v0.9.1 [INFO] [stderr] Compiling cucumber-codegen v0.21.1 [INFO] [stderr] Compiling pin-project v1.1.8 [INFO] [stderr] Compiling smart-default v0.7.1 [INFO] [stderr] Compiling prose-xmpp v0.1.0 (https://github.com/prose-im/prose-core-client.git?tag=0.1.99#ca865789) [INFO] [stderr] Compiling axum v0.8.1 [INFO] [stderr] Compiling inventory v0.3.17 [INFO] [stderr] Compiling similar v2.7.0 [INFO] [stderr] Compiling drain_filter_polyfill v0.1.3 [INFO] [stderr] Compiling humantime v2.1.0 [INFO] [stderr] Compiling tower-http v0.6.2 [INFO] [stderr] Compiling vcard4 v0.7.1 [INFO] [stderr] Compiling http v0.2.12 [INFO] [stderr] Compiling insta v1.42.0 [INFO] [stderr] Compiling cucumber v0.21.1 [INFO] [stderr] Compiling diff v0.1.13 [INFO] [stderr] Compiling pretty_assertions v1.4.1 [INFO] [stderr] Compiling rust-multipart-rfc7578_2 v0.6.1 [INFO] [stderr] Compiling assert-json-diff v2.0.2 [INFO] [stderr] Compiling reserve-port v2.0.1 [INFO] [stderr] Compiling bytesize v1.3.0 [INFO] [stderr] Compiling auto-future v1.0.0 [INFO] [stderr] Compiling prosody-config v0.1.0 (/opt/rustwide/workdir/crates/prosody-config) [INFO] [stderr] Compiling service v0.9.0 (/opt/rustwide/workdir/crates/service) [INFO] [stderr] Compiling axum-extra v0.10.0 [INFO] [stderr] Compiling axum-test v17.1.0 [INFO] [stderr] Compiling prose-pod-api v0.9.0 (/opt/rustwide/workdir/crates/rest-api) [INFO] [stderr] Compiling migrator v0.9.0 (/opt/rustwide/workdir/crates/migrator) [INFO] [stderr] Finished `test` profile [unoptimized] target(s) in 1m 02s [INFO] running `Command { std: "docker" "inspect" "911138d3333ad3ebd126e7f54254b54b5a9c29f51aea4cb3e90bd93d389dedcc", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "911138d3333ad3ebd126e7f54254b54b5a9c29f51aea4cb3e90bd93d389dedcc", kill_on_drop: false }` [INFO] [stdout] 911138d3333ad3ebd126e7f54254b54b5a9c29f51aea4cb3e90bd93d389dedcc [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:1680c8fbd8dfb46fcd6d22e546df16ab0e007457dc29fcd9e987cdd5077fd1af" "/opt/rustwide/cargo-home/bin/cargo" "+ebf0cf75d368c035f4c7e7246d203bd469ee4a51" "test" "--frozen", kill_on_drop: false }` [INFO] [stdout] 8e44a405a90d5aaa5f43d1ef4a2abcb56d21d8f216b5202397529bcfe41b0fa5 [INFO] running `Command { std: "docker" "start" "-a" "8e44a405a90d5aaa5f43d1ef4a2abcb56d21d8f216b5202397529bcfe41b0fa5", kill_on_drop: false }` [INFO] [stderr] Finished `test` profile [unoptimized] target(s) in 0.81s [INFO] [stderr] Running unittests src/main.rs (/opt/rustwide/target/debug/deps/migrator-e9f9ae15790c376f) [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/prose_pod_api-db1fe94af2fa9908) [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running unittests src/main.rs (/opt/rustwide/target/debug/deps/prose_pod_api-924845e3e2888f3a) [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running tests/behavior.rs (/opt/rustwide/target/debug/deps/behavior-512e694c221169e9) [INFO] [stdout] Feature: DNS setup instructions [INFO] [stdout] Rule: Only admins can see DNS setup instructions [INFO] [stdout] Scenario: Rémi (not admin) tries to get DNS setup instructions [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Rémi is not an admin [INFO] [stdout] ✔ And the Prose Pod is publicly accessible via an IPv4 [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi requests DNS setup instructions [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the error code should be "forbidden" [INFO] [stdout] Rule: If the Prose Pod has a static IP address, `SRV` records point to `xmpp.` and `xmpp.` points to the Prose Pod [INFO] [stdout] Scenario Outline: IPv4 only [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via an IPv4 [INFO] [stdout] ✔ And the XMPP server domain is prose.org [INFO] [stdout] Rémi is online [INFO] [stdout] [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And DNS setup instructions should contain 3 steps [INFO] [stdout] ✔ And step 1 should contain a single A record [INFO] [stdout] ✔ And step 2 should contain a single SRV record [INFO] [stdout] ✔ And step 3 should contain a single SRV record [INFO] [stdout] ✔ And A records hostnames should be xmpp.prose.org [INFO] [stdout] John is offline [INFO] [stdout] [INFO] [stdout] ✔ And SRV records targets should be xmpp.prose.org. [INFO] [stdout] Scenario Outline: IPv4 only [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via an IPv4 [INFO] [stdout] ✔ And the XMPP server domain is chat.prose.org [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And DNS setup instructions should contain 3 steps [INFO] [stdout] ✔ And step 1 should contain a single A record [INFO] [stdout] ✔ And step 2 should contain a single SRV record [INFO] [stdout] ✔ And step 3 should contain a single SRV record [INFO] [stdout] ✔ And A records hostnames should be xmpp.chat.prose.org [INFO] [stdout] ✔ And SRV records targets should be xmpp.chat.prose.org. [INFO] [stdout] Scenario Outline: IPv6 only [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via an IPv6 [INFO] [stdout] ✔ And the XMPP server domain is prose.org [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And DNS setup instructions should contain 3 steps [INFO] [stdout] ✔ And step 1 should contain a single AAAA record [INFO] [stdout] ✔ And step 2 should contain a single SRV record [INFO] [stdout] ✔ And step 3 should contain a single SRV record [INFO] [stdout] ✔ And AAAA records hostnames should be xmpp.prose.org [INFO] [stdout] ✔ And SRV records targets should be xmpp.prose.org. [INFO] [stdout] Scenario Outline: IPv6 only [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via an IPv6 [INFO] [stdout] ✔ And the XMPP server domain is chat.prose.org [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And DNS setup instructions should contain 3 steps [INFO] [stdout] ✔ And step 1 should contain a single AAAA record [INFO] [stdout] ✔ And step 2 should contain a single SRV record [INFO] [stdout] ✔ And step 3 should contain a single SRV record [INFO] [stdout] ✔ And AAAA records hostnames should be xmpp.chat.prose.org [INFO] [stdout] ✔ And SRV records targets should be xmpp.chat.prose.org. [INFO] [stdout] Scenario Outline: IPv4 + IPv6 [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via an IPv4 [INFO] [stdout] ✔ And the Prose Pod is publicly accessible via an IPv6 [INFO] [stdout] ✔ And the XMPP server domain is prose.org [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And DNS setup instructions should contain 3 steps [INFO] [stdout] ✔ And step 1 should contain A and AAAA records [INFO] [stdout] ✔ And step 2 should contain a single SRV record [INFO] [stdout] ✔ And step 3 should contain a single SRV record [INFO] [stdout] ✔ And A records hostnames should be xmpp.prose.org [INFO] [stdout] ✔ And AAAA records hostnames should be xmpp.prose.org [INFO] [stdout] ✔ And SRV records targets should be xmpp.prose.org. [INFO] [stdout] Scenario Outline: IPv4 + IPv6 [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via an IPv4 [INFO] [stdout] ✔ And the Prose Pod is publicly accessible via an IPv6 [INFO] [stdout] ✔ And the XMPP server domain is chat.prose.org [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And DNS setup instructions should contain 3 steps [INFO] [stdout] ✔ And step 1 should contain A and AAAA records [INFO] [stdout] ✔ And step 2 should contain a single SRV record [INFO] [stdout] ✔ And step 3 should contain a single SRV record [INFO] [stdout] ✔ And A records hostnames should be xmpp.chat.prose.org [INFO] [stdout] ✔ And AAAA records hostnames should be xmpp.chat.prose.org [INFO] [stdout] ✔ And SRV records targets should be xmpp.chat.prose.org. [INFO] [stdout] Rule: If the Prose Pod is publicly accessible via a hostname, `SRV` records point to it [INFO] [stdout] Scenario: Hostname [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via a hostname [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And DNS setup instructions should contain 2 steps [INFO] [stdout] ✔ And step 1 should contain a single SRV record [INFO] [stdout] ✔ And step 2 should contain a single SRV record [INFO] [stdout] Scenario: IPv4 + IPv6 + hostname [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via an IPv4 [INFO] [stdout] ✔ And the Prose Pod is publicly accessible via an IPv6 [INFO] [stdout] ✔ And the Prose Pod is publicly accessible via a hostname [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And DNS setup instructions should contain 2 steps [INFO] [stdout] ✔ And step 1 should contain a single SRV record [INFO] [stdout] ✔ And step 2 should contain a single SRV record [INFO] [stdout] Rule: DNS setup instructions give SRV records for ports 5222 and 5269 [INFO] [stdout] Scenario: Prose Pod accessible via an IP address [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via an IPv4 [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And DNS setup instructions should contain a SRV record for port 5222 [INFO] [stdout] ✔ And DNS setup instructions should contain a SRV record for port 5269 [INFO] [stdout] Scenario: Prose Pod accessible via a hostname [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via a hostname [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And DNS setup instructions should contain a SRV record for port 5222 [INFO] [stdout] ✔ And DNS setup instructions should contain a SRV record for port 5269 [INFO] [stdout] Rule: DNS setup instructions use the XMPP server's domain [INFO] [stdout] Scenario Outline: Prose Pod accessible via an IP address [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the XMPP server domain is prose.org [INFO] [stdout] ✔ And the Prose Pod is publicly accessible via an IPv4 [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And SRV records hostnames should be prose.org [INFO] [stdout] Scenario Outline: Prose Pod accessible via an IP address [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the XMPP server domain is chat.prose.org [INFO] [stdout] ✔ And the Prose Pod is publicly accessible via an IPv4 [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And SRV records hostnames should be chat.prose.org [INFO] [stdout] Scenario Outline: Prose Pod accessible via a hostname [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the XMPP server domain is prose.org [INFO] [stdout] ✔ And the Prose Pod is publicly accessible via a hostname [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And SRV records hostnames should be prose.org [INFO] [stdout] Scenario Outline: Prose Pod accessible via a hostname [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the XMPP server domain is chat.prose.org [INFO] [stdout] ✔ And the Prose Pod is publicly accessible via a hostname [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And SRV records hostnames should be chat.prose.org [INFO] [stdout] Rule: The Prose Pod address needs to be initialized in order to get DNS setup instructions [INFO] [stdout] Scenario: Prose Pod address not initialized [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod address has not been initialized [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Prose Pod address not initialized. (recovery suggestion: Call `PUT /v1/pod/config/address` to initialize it.) [INFO] [stdout] ✔ When Valerian requests DNS setup instructions [INFO] [stdout] ✔ Then the HTTP status code should be Precondition Failed [INFO] [stdout] ✔ And the error code should be "pod_address_not_initialized" [INFO] [stdout] Feature: Initializing the first admin account [INFO] [stdout] Scenario: Creating the first account [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the server config has been initialized [INFO] [stdout] ✔ And the workspace has been initialized [INFO] [stdout] ✔ When someone creates the first account "Rémi" with node "remi" [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the HTTP status code should be Created [INFO] [stdout] ✔ And the response should contain a "Location" HTTP header [INFO] [stdout] Scenario: Trying to create the first account a second time [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod has been initialized [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When someone creates the first account "Rémi" with node "remi" [INFO] [stdout] ✔ Then the user should receive 'First account already created' [INFO] [stdout] Scenario: Creating the first account before initializing the workspace [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the server config has been initialized [INFO] [stdout] ✔ And the workspace has not been initialized [INFO] [stdout] ✔ When someone creates the first account "Rémi" with node "remi" [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the HTTP status code should be Created [INFO] [stdout] ✔ And the response should contain a "Location" HTTP header [INFO] [stdout] Scenario: Creating the first account before initializing the server config [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the server config has not been initialized [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: XMPP server not initialized. (recovery suggestion: Call `PUT /v1/server/config` to initialize it.) [INFO] [stdout] ✔ When someone creates the first account "Rémi" with node "remi" [INFO] [stdout] ✔ Then the call should not succeed [INFO] [stdout] ✔ And the user should receive 'Server config not initialized' [INFO] [stdout] Feature: Initializing the XMPP server configuration [INFO] [stdout] Scenario: Initializing the server config [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the workspace has not been initialized [INFO] [stdout] ✔ When someone initializes the server at [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the HTTP status code should be Created [INFO] [stdout] ✔ And the response should contain a "Location" HTTP header [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] Scenario: Trying to initialize the server config again [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the server config has been initialized [INFO] [stdout] ✔ When someone initializes the server at [INFO] [stdout] ✔ Then the call should not succeed [INFO] [stdout] ✔ And the user should receive 'Server config already initialized' [INFO] [stdout] Feature: Initializing the Prose Workspace [INFO] [stdout] Scenario: Initializing the workspace [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the server config has been initialized [INFO] [stdout] ✔ And the workspace has not been initialized [INFO] [stdout] ✔ When someone initializes a workspace named "Prose" [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the HTTP status code should be Created [INFO] [stdout] ✔ And the response should contain a "Location" HTTP header [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] Scenario: Trying to initialize the workspace again [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod has been initialized [INFO] [stdout] ✔ When someone initializes a workspace named "Prose" [INFO] [stdout] ✔ Then the call should not succeed [INFO] [stdout] ✔ And the user should receive 'Workspace already initialized' [INFO] [stdout] Feature: Inviting members [INFO] [stdout] Rule: New members can be invited via email [INFO] [stdout] Scenario: Valerian (admin) invites Rémi [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Valerian is an admin [INFO] [stdout] ✔ When Valerian invites as a MEMBER [INFO] [stdout] ✔ Then the HTTP status code should be Created [INFO] [stdout] ✔ And the response should contain a "Location" HTTP header [INFO] [stdout] ✔ And 1 email should have been sent [INFO] [stdout] ✔ And the email body should match "/invitations/accept/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}" [INFO] [stdout] ✔ And the email body should match "/invitations/reject/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}" [INFO] [stdout] Rule: Only admins can invite new members [INFO] [stdout] Scenario: Rémi (not admin) invites Marc [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Rémi is not an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi invites as a MEMBER [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] Rule: Admins can list invitations [INFO] [stdout] Scenario: Small number of invitations [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ And has been invited via email [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian lists pending invitations [INFO] [stdout] ✔ Then the HTTP status code should be OK [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And they should see 2 pending invitations [INFO] [stdout] Scenario: Large number of invitations, first page [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given 42 people have been invited via email [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian lists pending invitations by pages of 20 [INFO] [stdout] ✔ Then the HTTP status code should be Partial Content [INFO] [stdout] ✔ And they should see 20 pending invitations [INFO] [stdout] ✔ And the "Pagination-Current-Page" header should contain "1" [INFO] [stdout] ✔ And the "Pagination-Page-Size" header should contain "20" [INFO] [stdout] ✔ And the "Pagination-Page-Count" header should contain "3" [INFO] [stdout] Scenario: Large number of invitations, last page [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given 42 people have been invited via email [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian gets page 3 of pending invitations by pages of 20 [INFO] [stdout] ✔ Then the HTTP status code should be OK [INFO] [stdout] ✔ And they should see 2 pending invitations [INFO] [stdout] ✔ And the "Pagination-Current-Page" header should contain "3" [INFO] [stdout] ✔ And the "Pagination-Page-Size" header should contain "20" [INFO] [stdout] ✔ And the "Pagination-Page-Count" header should contain "3" [INFO] [stdout] Rule: Admins can see the status of an invitation [INFO] [stdout] Scenario: Small number of invitations [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ And has received their invitation [INFO] [stdout] ✔ And has been invited via email [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian lists pending invitations [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And 1 invitation should be TO_SEND [INFO] [stdout] ✔ And 1 invitation should be SENT [INFO] [stdout] Rule: Admins can see the creation timestamp of an invitation [INFO] [stdout] Scenario: Valerian (admin) cancels an invitation [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian cancels the invitation [INFO] [stdout] ✔ Then the HTTP status code should be NoContent [INFO] [stdout] ✔ And there should not be any invitation for in the database [INFO] [stdout] Scenario: Rémi (not admin) tries to cancel an invitation [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ And Rémi is not an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi cancels the invitation [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And there should be an invitation for in the database [INFO] [stdout] Rule: An invited member can be pre-assigned a role upon invitation [INFO] [stdout] Scenario: Rémi is invited to be an admin [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ And is pre-assigned the ADMIN role [INFO] [stdout] ✔ When accepts their invitation [INFO] [stdout] ✔ Then should have the ADMIN role [INFO] [stdout] Rule: An admin can only pre-assign a role lower or equal to theirs [INFO] [stdout] Scenario: Rémi did not accept the invitation in time (he always does this) [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ And the invitation has already expired [INFO] [stdout] ✔ When accepts their invitation [INFO] [stdout] ✔ Then the HTTP status code should be Not Found [INFO] [stdout] Rule: Admins can choose the lifetime of an invitation upon creation [INFO] [stdout] Scenario: Valerian (admin) resends an invitation [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ And the invitation did not go through [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian resends the invitation [INFO] [stdout] ✔ Then the HTTP status code should be NoContent [INFO] [stdout] ✔ And 1 email should have been sent [INFO] [stdout] Scenario: Rémi (not admin) tries to resend an invitation [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ And the invitation did not go through [INFO] [stdout] ✔ And Rémi is not an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi resends the invitation [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And 0 email should have been sent [INFO] [stdout] Rule: After resending an invitation, the previous accept token becomes invalid [INFO] [stdout] Scenario: Rémi has been invited twice but uses the first link [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ And an admin resent the invitation [INFO] [stdout] ✔ When uses the previous invitation accept link they received [INFO] [stdout] ✔ Then the HTTP status code should be Unauthorized [INFO] [stdout] Rule: An invitation disappears after it's accepted [INFO] [stdout] Scenario: Rémi accepts an invitation [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ When accepts their invitation [INFO] [stdout] ✔ Then there should not be any invitation for in the database [INFO] [stdout] Rule: Someone invited by mistake can reject an invitation [INFO] [stdout] Scenario: Rémi rejects an invitation [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ When rejects their invitation [INFO] [stdout] ✔ Then the HTTP status code should be No Content [INFO] [stdout] Rule: An invitation disappears after it's rejected [INFO] [stdout] Scenario: Rémi rejects an invitation [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ When rejects their invitation [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And there should not be any invitation for in the database [INFO] [stdout] Rule: Basic info about an invitation can be retrieved from the accept and reject tokens [INFO] [stdout] Scenario: Retrieving from an accept token [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ When requests the invitation associated to their accept token [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] Scenario: Retrieving from a reject token [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ When requests the invitation associated to their reject token [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] Scenario: Retrieving from an old accept token [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ And an admin resent the invitation [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: No invitation found for provided token [INFO] [stdout] ✔ When requests the invitation associated to their previous accept token [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] Rule: Invited members can choose their nickname when joining [INFO] [stdout] Scenario: Rémi joins using a custom nickname [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given has been invited via email [INFO] [stdout] ✔ And the XMPP server domain is prose.org [INFO] [stdout] ✔ When accepts their invitation using the nickname "Rémi B." [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And remi@prose.org’s nickname should be "Rémi B." [INFO] [stdout] Feature: Deleting a member [INFO] [stdout] Rule: Member accounts can be deleted [INFO] [stdout] Scenario: Valerian (admin) deletes Rémi’s account [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Valerian is an admin [INFO] [stdout] ✔ When Valerian deletes remi@prose.org’s account [INFO] [stdout] ✔ Then the HTTP status code should be NoContent [INFO] [stdout] Rule: Only admins can delete member accounts [INFO] [stdout] Scenario: Rémi (not admin) deletes Marc’s account [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Rémi is not an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi deletes marc@prose.org’s account [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] Rule: Members cannot delete their own account [INFO] [stdout] Scenario: Valerian (admin) deletes Rémi’s account [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Valerian is an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: UserDeleteError error: Cannot self-remove. [INFO] [stdout] ✔ When Valerian deletes Valerian’s account [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] Feature: Members list [INFO] [stdout] Rule: Admins can list members [INFO] [stdout] Scenario: Small number of members [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the workspace has 2 members [INFO] [stdout] ✔ When Valerian lists members [INFO] [stdout] ✔ Then the HTTP status code should be OK [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And they should see 2 members [INFO] [stdout] Scenario: Large number of members, first page [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the workspace has 42 members [INFO] [stdout] ✔ When Valerian lists members by pages of 20 [INFO] [stdout] ✔ Then the HTTP status code should be Partial Content [INFO] [stdout] ✔ And they should see 20 members [INFO] [stdout] ✔ And the "Pagination-Current-Page" header should contain "1" [INFO] [stdout] ✔ And the "Pagination-Page-Size" header should contain "20" [INFO] [stdout] ✔ And the "Pagination-Page-Count" header should contain "3" [INFO] [stdout] Scenario: Large number of members, last page [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the workspace has 42 members [INFO] [stdout] ✔ When Valerian gets page 3 of members by pages of 20 [INFO] [stdout] ✔ Then the HTTP status code should be OK [INFO] [stdout] ✔ And they should see 2 members [INFO] [stdout] ✔ And the "Pagination-Current-Page" header should contain "3" [INFO] [stdout] ✔ And the "Pagination-Page-Size" header should contain "20" [INFO] [stdout] ✔ And the "Pagination-Page-Count" header should contain "3" [INFO] [stdout] Rule: Regular members can list members [INFO] [stdout] Scenario: Authenticated as regular member [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Rémi is a regular member [INFO] [stdout] ✔ When Rémi lists members [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] Rule: One needs to be authenticated in order to list members [INFO] [stdout] Scenario: Not authenticated [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ When someone lists members without authenticating [INFO] [stdout] ✔ Then the HTTP status code should be Unauthorized [INFO] [stdout] Scenario Outline: Bad token [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ When someone lists members using "undefined" as Bearer token [INFO] [stdout] ✔ Then the HTTP status code should be Unauthorized [INFO] [stdout] Scenario Outline: Bad token [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ When someone lists members using "" as Bearer token [INFO] [stdout] ✔ Then the HTTP status code should be Unauthorized [INFO] [stdout] Scenario Outline: Bad token [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ When someone lists members using "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqaWQiOiJqb2huLmRvZUBleGFtcGxlLm9yZyJ9.C5mKZHGQhjTv8Td43yLcZ9S3-MQlDHexhaxlLWr6ixg" as Bearer token [INFO] [stdout] ✔ Then the HTTP status code should be Unauthorized [INFO] [stdout] Rule: Listing members should not interact with the XMPP server [INFO] [stdout] Scenario: XMPP server offline [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the workspace has 2 members [INFO] [stdout] ✔ And the XMPP server is offline [INFO] [stdout] ✔ When Valerian lists members [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] Rule: Admins can lazily load more information about users [INFO] [stdout] Scenario: Heterogeneous information [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the XMPP server domain is prose.org [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Rémi is a regular member [INFO] [stdout] ✔ And Rémi is online [INFO] [stdout] ✔ And Rémi's avatar is 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 [INFO] [stdout] ✔ And John is a regular member [INFO] [stdout] ✔ And John is offline [INFO] [stdout] ✔ And John has no avatar [INFO] [stdout] ✔ When Valerian gets detailed information about Rémi and John [INFO] [stdout] ✔ Then the response is a SSE stream [INFO] [stdout] ✔ And one SSE event is "id:rémi@prose.org\nevent:enriched-member\ndata:{\"jid\":\"rémi@prose.org\",\"role\":\"MEMBER\",\"online\":true,\"nickname\":\"Rémi\",\"avatar\":\"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\"}" [INFO] [stdout] ✔ And one SSE event is "id:john@prose.org\nevent:enriched-member\ndata:{\"jid\":\"john@prose.org\",\"role\":\"MEMBER\",\"online\":false,\"nickname\":\"John\",\"avatar\":null}" [INFO] [stdout] Feature: DNS record checks [INFO] [stdout] Rule: SSE route sends CHECKING events first. [INFO] [stdout] Scenario: IPv4 + IPv6 [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via an IPv4 [INFO] [stdout] ✔ And the Prose Pod is publicly accessible via an IPv6 [INFO] [stdout] ✔ And the XMPP server domain is test.prose.org [INFO] [stdout] ✔ And prose.org's DNS zone has a A record for xmpp.test.prose.org [INFO] [stdout] ✔ And prose.org's DNS zone has a AAAA record for xmpp.test.prose.org [INFO] [stdout] ✔ And prose.org's DNS zone has a SRV record for test.prose.org redirecting port 5222 to xmpp.test.prose.org. [INFO] [stdout] ✔ And prose.org's DNS zone has a SRV record for test.prose.org redirecting port 5269 to xmpp.test.prose.org. [INFO] [stdout] ✔ When Valerian checks the DNS records configuration [INFO] [stdout] ✔ Then the response is a SSE stream [INFO] [stdout] ✔ And one SSE event is "id:IPv4\nevent:dns-record-check-result\ndata:{\"description\":\"IPv4 record for xmpp.test.prose.org\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv6\nevent:dns-record-check-result\ndata:{\"description\":\"IPv6 record for xmpp.test.prose.org\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:SRV-c2s\nevent:dns-record-check-result\ndata:{\"description\":\"SRV record for client-to-server connections\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:SRV-s2s\nevent:dns-record-check-result\ndata:{\"description\":\"SRV record for server-to-server connections\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv4\nevent:dns-record-check-result\ndata:{\"description\":\"IPv4 record for xmpp.test.prose.org\",\"status\":\"VALID\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv6\nevent:dns-record-check-result\ndata:{\"description\":\"IPv6 record for xmpp.test.prose.org\",\"status\":\"VALID\"}" [INFO] [stdout] ✔ And one SSE event is "id:SRV-c2s\nevent:dns-record-check-result\ndata:{\"description\":\"SRV record for client-to-server connections\",\"status\":\"PARTIALLY_VALID\"}" [INFO] [stdout] ✔ And one SSE event is "id:SRV-s2s\nevent:dns-record-check-result\ndata:{\"description\":\"SRV record for server-to-server connections\",\"status\":\"PARTIALLY_VALID\"}" [INFO] [stdout] ✔ And one SSE event is ":End of stream\nid:end\nevent:end" [INFO] [stdout] Scenario: Hostname [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via a hostname [INFO] [stdout] ✔ And the XMPP server domain is test.prose.org [INFO] [stdout] ✔ And prose.org's DNS zone has a SRV record for test.prose.org redirecting port 5222 to cloud-provider.com. [INFO] [stdout] ✔ And prose.org's DNS zone has a SRV record for test.prose.org redirecting port 5269 to cloud-provider.com. [INFO] [stdout] ✔ When Valerian checks the DNS records configuration [INFO] [stdout] ✔ Then the response is a SSE stream [INFO] [stdout] ✔ And one SSE event is "id:SRV-c2s\nevent:dns-record-check-result\ndata:{\"description\":\"SRV record for client-to-server connections\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:SRV-s2s\nevent:dns-record-check-result\ndata:{\"description\":\"SRV record for server-to-server connections\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:SRV-c2s\nevent:dns-record-check-result\ndata:{\"description\":\"SRV record for client-to-server connections\",\"status\":\"PARTIALLY_VALID\"}" [INFO] [stdout] ✔ And one SSE event is "id:SRV-s2s\nevent:dns-record-check-result\ndata:{\"description\":\"SRV record for server-to-server connections\",\"status\":\"PARTIALLY_VALID\"}" [INFO] [stdout] ✔ And one SSE event is ":End of stream\nid:end\nevent:end" [INFO] [stdout] Feature: IP connectivity checks [INFO] [stdout] Rule: SSE route sends CHECKING events first. [INFO] [stdout] Scenario: IPv4 + IPv6 [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via an IPv4 [INFO] [stdout] ✔ And the Prose Pod is publicly accessible via an IPv6 [INFO] [stdout] ✔ And the XMPP server domain is test.prose.org [INFO] [stdout] ✔ And prose.org's DNS zone has a A record for test.prose.org [INFO] [stdout] ✔ And prose.org's DNS zone has a AAAA record for test.prose.org [INFO] [stdout] ✔ When Valerian checks the IP connectivity [INFO] [stdout] ✔ Then the response is a SSE stream [INFO] [stdout] ✔ And one SSE event is "id:IPv4-c2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Client-to-server connectivity over IPv4\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv6-c2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Client-to-server connectivity over IPv6\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv4-s2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Server-to-server connectivity over IPv4\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv6-s2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Server-to-server connectivity over IPv6\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv4-c2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Client-to-server connectivity over IPv4\",\"status\":\"SUCCESS\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv6-c2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Client-to-server connectivity over IPv6\",\"status\":\"SUCCESS\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv4-s2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Server-to-server connectivity over IPv4\",\"status\":\"SUCCESS\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv6-s2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Server-to-server connectivity over IPv6\",\"status\":\"SUCCESS\"}" [INFO] [stdout] ✔ And one SSE event is ":End of stream\nid:end\nevent:end" [INFO] [stdout] Scenario: Hostname [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via a hostname [INFO] [stdout] ✔ And the XMPP server domain is test.prose.org [INFO] [stdout] ✔ And prose.org's DNS zone has a A record for test.prose.org [INFO] [stdout] ✔ And prose.org's DNS zone has a AAAA record for test.prose.org [INFO] [stdout] ✔ When Valerian checks the IP connectivity [INFO] [stdout] ✔ Then the response is a SSE stream [INFO] [stdout] ✔ And one SSE event is "id:IPv4-c2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Client-to-server connectivity over IPv4\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv6-c2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Client-to-server connectivity over IPv6\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv4-s2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Server-to-server connectivity over IPv4\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv6-s2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Server-to-server connectivity over IPv6\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv4-c2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Client-to-server connectivity over IPv4\",\"status\":\"SUCCESS\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv6-c2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Client-to-server connectivity over IPv6\",\"status\":\"SUCCESS\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv4-s2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Server-to-server connectivity over IPv4\",\"status\":\"SUCCESS\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv6-s2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Server-to-server connectivity over IPv6\",\"status\":\"SUCCESS\"}" [INFO] [stdout] ✔ And one SSE event is ":End of stream\nid:end\nevent:end" [INFO] [stdout] Rule: Standard hosts are checked too [INFO] [stdout] Scenario: Standard XMPP hostnames [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via a hostname [INFO] [stdout] ✔ And the XMPP server domain is test.prose.org [INFO] [stdout] ✔ And prose.org's DNS zone has no A record for test.prose.org [INFO] [stdout] ✔ And prose.org's DNS zone has no AAAA record for test.prose.org [INFO] [stdout] ✔ And prose.org's DNS zone has a A record for _xmpp-client._tcp.test.prose.org. [INFO] [stdout] ✔ And prose.org's DNS zone has a AAAA record for _xmpp-client._tcp.test.prose.org. [INFO] [stdout] ✔ And prose.org's DNS zone has a A record for _xmpp-server._tcp.test.prose.org. [INFO] [stdout] ✔ And prose.org's DNS zone has a AAAA record for _xmpp-server._tcp.test.prose.org. [INFO] [stdout] ✔ When Valerian checks the IP connectivity [INFO] [stdout] ✔ Then the response is a SSE stream [INFO] [stdout] ✔ And one SSE event is "id:IPv4-c2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Client-to-server connectivity over IPv4\",\"status\":\"SUCCESS\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv6-c2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Client-to-server connectivity over IPv6\",\"status\":\"SUCCESS\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv4-s2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Server-to-server connectivity over IPv4\",\"status\":\"SUCCESS\"}" [INFO] [stdout] ✔ And one SSE event is "id:IPv6-s2s\nevent:ip-connectivity-check-result\ndata:{\"description\":\"Server-to-server connectivity over IPv6\",\"status\":\"SUCCESS\"}" [INFO] [stdout] ✔ And one SSE event is ":End of stream\nid:end\nevent:end" [INFO] [stdout] Feature: Port reachability checks [INFO] [stdout] Rule: SSE route sends CHECKING events first. [INFO] [stdout] Scenario: IPv4 + IPv6 [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via an IPv4 [INFO] [stdout] ✔ And the Prose Pod is publicly accessible via an IPv6 [INFO] [stdout] ✔ And the XMPP server domain is test.prose.org [INFO] [stdout] ✔ And test.prose.org's port 5222 is open [INFO] [stdout] ✔ And test.prose.org's port 5269 is open [INFO] [stdout] ✔ And test.prose.org's port 443 is open [INFO] [stdout] ✔ When Valerian checks the ports reachability [INFO] [stdout] ✔ Then the response is a SSE stream [INFO] [stdout] ✔ And one SSE event is "id:TCP-c2s\nevent:port-reachability-check-result\ndata:{\"description\":\"Client-to-server port at TCP 5222\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:TCP-s2s\nevent:port-reachability-check-result\ndata:{\"description\":\"Server-to-server port at TCP 5269\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:TCP-HTTPS\nevent:port-reachability-check-result\ndata:{\"description\":\"HTTP server port at TCP 443\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:TCP-c2s\nevent:port-reachability-check-result\ndata:{\"description\":\"Client-to-server port at TCP 5222\",\"status\":\"OPEN\"}" [INFO] [stdout] ✔ And one SSE event is "id:TCP-s2s\nevent:port-reachability-check-result\ndata:{\"description\":\"Server-to-server port at TCP 5269\",\"status\":\"OPEN\"}" [INFO] [stdout] ✔ And one SSE event is "id:TCP-HTTPS\nevent:port-reachability-check-result\ndata:{\"description\":\"HTTP server port at TCP 443\",\"status\":\"OPEN\"}" [INFO] [stdout] ✔ And one SSE event is ":End of stream\nid:end\nevent:end" [INFO] [stdout] Scenario: Hostname [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via a hostname [INFO] [stdout] ✔ And the XMPP server domain is test.prose.org [INFO] [stdout] ✔ And test.prose.org's port 5222 is open [INFO] [stdout] ✔ And test.prose.org's port 5269 is open [INFO] [stdout] ✔ And test.prose.org's port 443 is open [INFO] [stdout] ✔ When Valerian checks the ports reachability [INFO] [stdout] ✔ Then the response is a SSE stream [INFO] [stdout] ✔ And one SSE event is "id:TCP-c2s\nevent:port-reachability-check-result\ndata:{\"description\":\"Client-to-server port at TCP 5222\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:TCP-s2s\nevent:port-reachability-check-result\ndata:{\"description\":\"Server-to-server port at TCP 5269\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:TCP-HTTPS\nevent:port-reachability-check-result\ndata:{\"description\":\"HTTP server port at TCP 443\",\"status\":\"CHECKING\"}" [INFO] [stdout] ✔ And one SSE event is "id:TCP-c2s\nevent:port-reachability-check-result\ndata:{\"description\":\"Client-to-server port at TCP 5222\",\"status\":\"OPEN\"}" [INFO] [stdout] ✔ And one SSE event is "id:TCP-s2s\nevent:port-reachability-check-result\ndata:{\"description\":\"Server-to-server port at TCP 5269\",\"status\":\"OPEN\"}" [INFO] [stdout] ✔ And one SSE event is "id:TCP-HTTPS\nevent:port-reachability-check-result\ndata:{\"description\":\"HTTP server port at TCP 443\",\"status\":\"OPEN\"}" [INFO] [stdout] ✔ And one SSE event is ":End of stream\nid:end\nevent:end" [INFO] [stdout] Rule: Standard hosts are checked too [INFO] [stdout] Scenario: Standard XMPP hostnames [INFO] [stdout] ✔> Given the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via a hostname [INFO] [stdout] ✔ And the XMPP server domain is test.prose.org [INFO] [stdout] ✔ And test.prose.org's port 5222 is closed [INFO] [stdout] ✔ And _xmpp-client._tcp.test.prose.org's port 5222 is open [INFO] [stdout] ✔ And test.prose.org's port 5269 is closed [INFO] [stdout] ✔ And _xmpp-server._tcp.test.prose.org's port 5269 is open [INFO] [stdout] ✔ And test.prose.org's port 443 is open [INFO] [stdout] ✔ When Valerian checks the ports reachability [INFO] [stdout] ✔ Then the response is a SSE stream [INFO] [stdout] ✔ And one SSE event is "id:TCP-c2s\nevent:port-reachability-check-result\ndata:{\"description\":\"Client-to-server port at TCP 5222\",\"status\":\"OPEN\"}" [INFO] [stdout] ✔ And one SSE event is "id:TCP-s2s\nevent:port-reachability-check-result\ndata:{\"description\":\"Server-to-server port at TCP 5269\",\"status\":\"OPEN\"}" [INFO] [stdout] ✔ And one SSE event is "id:TCP-HTTPS\nevent:port-reachability-check-result\ndata:{\"description\":\"HTTP server port at TCP 443\",\"status\":\"OPEN\"}" [INFO] [stdout] ✔ And one SSE event is ":End of stream\nid:end\nevent:end" [INFO] [stdout] Feature: Setting the Prose Pod address [INFO] [stdout] Rule: Admins can set the Prose Pod address [INFO] [stdout] Scenario Outline: Valerian (not admin) tries to set the Prose Pod address [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔> And the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔ When Valerian sets the Prose Pod address to an IPv4 [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] Scenario Outline: Valerian (not admin) tries to set the Prose Pod address [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔> And the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔ When Valerian sets the Prose Pod address to an IPv6 [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] Scenario Outline: Valerian (not admin) tries to set the Prose Pod address [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔> And the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔ When Valerian sets the Prose Pod address to a hostname [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] Rule: Only admins can set the Prose Pod address [INFO] [stdout] Scenario Outline: Rémi (not admin) tries to set the Prose Pod address [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔> And the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔ Given Rémi is not an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi sets the Prose Pod address to an IPv4 [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the error code should be "forbidden" [INFO] [stdout] Scenario Outline: Rémi (not admin) tries to set the Prose Pod address [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔> And the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔ Given Rémi is not an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi sets the Prose Pod address to an IPv6 [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the error code should be "forbidden" [INFO] [stdout] Scenario Outline: Rémi (not admin) tries to set the Prose Pod address [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔> And the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔ Given Rémi is not an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi sets the Prose Pod address to a hostname [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the error code should be "forbidden" [INFO] [stdout] Rule: One can change from IP addresses to hostname and vice versa [INFO] [stdout] Scenario: User had given IP addresses, but wants to switch to a hostname [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔> And the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via an IPv4 [INFO] [stdout] ✔ And the Prose Pod is publicly accessible via an IPv6 [INFO] [stdout] ✔ When Valerian sets the Prose Pod address to a hostname [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] Scenario Outline: User had given a hostname, but wants to switch to IP addresses [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔> And the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via a hostname [INFO] [stdout] ✔ When Valerian sets the Prose Pod address to an IPv4 [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] Scenario Outline: User had given a hostname, but wants to switch to IP addresses [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔> And the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔ Given the Prose Pod is publicly accessible via a hostname [INFO] [stdout] ✔ When Valerian sets the Prose Pod address to an IPv6 [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] Rule: Request body can’t be empty [INFO] [stdout] Scenario: User passed an empty JSON [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔> And the server config has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: You must pass either an IPv4, an IPv6 or a hostname. [INFO] [stdout] ✔ When Valerian sets the Prose Pod address to an empty value [INFO] [stdout] ✔ Then the call should not succeed [INFO] [stdout] ✔ And the HTTP status code should be Unprocessable Entity [INFO] [stdout] Feature: Test required services are reachable [INFO] [stdout] Rule: The API doesn't start if the SMTP server isn't reachable [INFO] [stdout] Scenario: SMTP server not reachable [INFO] [stdout] ✔ Given the SMTP server isn't reachable [INFO] [stdout] ERROR scenario:step: behavior::prelude::steps: Startup error: Startup error: SMTP server unreachable. [INFO] [stdout] ✔ When the Prose Pod API starts [INFO] [stdout] ✔ Then the Prose Pod API isn't running [INFO] [stdout] Scenario: SMTP server reachable [INFO] [stdout] ✔ Given the SMTP server is reachable [INFO] [stdout] ✔ When the Prose Pod API starts [INFO] [stdout] ✔ Then the Prose Pod API is running [INFO] [stdout] Feature: Member nicknames [INFO] [stdout] Rule: One can change their own nickname [INFO] [stdout] Scenario: Rémi changes their nickname [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Rémi is a regular member [INFO] [stdout] ✔ And Rémi’s nickname is "Rémi" [INFO] [stdout] ✔ When Rémi sets their nickname to "Rémi B." [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And Rémi’s nickname should be "Rémi B." [INFO] [stdout] Rule: One cannot change someone else’s nickname [INFO] [stdout] Scenario: An admin tries to change Rémi’s nickname [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Rémi is a regular member [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ And Rémi’s nickname is "Rémi" [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: You can't change someone else's nickname. [INFO] [stdout] ✔ When Valerian sets Rémi’s nickname to "Rémi B." [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And Rémi’s nickname should be "Rémi" [INFO] [stdout] Scenario: A regular member tries to change Rémi’s nickname [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Rémi is a regular member [INFO] [stdout] ✔ And Marc is a regular member [INFO] [stdout] ✔ And Rémi’s nickname is "Rémi" [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: You can't change someone else's nickname. [INFO] [stdout] ✔ When Marc sets Rémi’s nickname to "Rémi B." [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And Rémi’s nickname should be "Rémi" [INFO] [stdout] Feature: Member roles [INFO] [stdout] Rule: Admins can change member roles [INFO] [stdout] Scenario: Valerian (admin) makes Marc an admin [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Marc is a regular member [INFO] [stdout] ✔ When Valerian makes Marc an admin [INFO] [stdout] ✔ Then the HTTP status code should be OK [INFO] [stdout] ✔ And Marc should have the ADMIN role [INFO] [stdout] ✔ And Marc should have the "prosody:admin" role in Prosody [INFO] [stdout] Scenario: Valerian (admin) makes Marc an admin while it already is one [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Marc is an admin [INFO] [stdout] ✔ When Valerian makes Marc an admin [INFO] [stdout] ✔ Then the HTTP status code should be No Content [INFO] [stdout] Rule: One cannot downgrade someone with a higher role [INFO] [stdout] Scenario: Rémi (not admin) makes Valerian a regular member [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Rémi is a regular member [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi makes Valerian a regular member [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And Valerian should have the ADMIN role [INFO] [stdout] ✔ And Valerian should have the "prosody:admin" role in Prosody [INFO] [stdout] Rule: One cannot downgrade their own role [INFO] [stdout] Scenario: Valerian (admin) makes Valerian a regular member [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And Valerian is an admin [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Valerian is an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: Cannot change your own role. [INFO] [stdout] ✔ When Valerian makes Valerian a regular member [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And Valerian should have the ADMIN role [INFO] [stdout] ✔ And Valerian should have the "prosody:admin" role in Prosody [INFO] [stdout] Feature: XMPP server configuration: File upload [INFO] [stdout] Rule: File uploading can be turned on and off [INFO] [stdout] Scenario Outline: An admin turns file uploading on/off [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given file uploading is off [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian turns file uploading on [INFO] [stdout] ✔ Then file uploading should be on [INFO] [stdout] ✔ And the server should have been reconfigured [INFO] [stdout] Scenario Outline: An admin turns file uploading on/off [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given file uploading is on [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian turns file uploading off [INFO] [stdout] ✔ Then file uploading should be off [INFO] [stdout] ✔ And the server should have been reconfigured [INFO] [stdout] Rule: The file retention can be configured [INFO] [stdout] Scenario: An admin changes the file retention [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the file retention is set to 2 years [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian sets the file retention to 1 year [INFO] [stdout] ✔ Then the file retention should be set to 1 year [INFO] [stdout] ✔ And the server should have been reconfigured [INFO] [stdout] Rule: The Files configuration can be reset to its default value [INFO] [stdout] Scenario: An admin resets the Files configuration to its default value [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given file uploading is off [INFO] [stdout] ✔ And the file retention is set to 1 year [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian resets the Files configuration to its default value [INFO] [stdout] ✔ Then file uploading should be on [INFO] [stdout] ✔ And the file retention should be set to infinite [INFO] [stdout] ✔ And the server should have been reconfigured [INFO] [stdout] Rule: Turning on/off file uploading is idempotent [INFO] [stdout] Scenario Outline: Turning on/off twice [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given file uploading is off [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian turns file uploading off [INFO] [stdout] ✔ Then file uploading should be off [INFO] [stdout] ✔ And the server should not have been reconfigured [INFO] [stdout] Scenario Outline: Turning on/off twice [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given file uploading is on [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian turns file uploading on [INFO] [stdout] ✔ Then file uploading should be on [INFO] [stdout] ✔ And the server should not have been reconfigured [INFO] [stdout] Rule: Changing the file retention is idempotent [INFO] [stdout] Scenario Outline: Changing to the same value twice [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the file retention is set to 1 year [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian sets the file retention to 1 year [INFO] [stdout] ✔ Then the file retention should be set to 1 year [INFO] [stdout] ✔ And the server should not have been reconfigured [INFO] [stdout] Scenario Outline: Changing to the same value twice [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the file retention is set to 2 years [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian sets the file retention to 2 years [INFO] [stdout] ✔ Then the file retention should be set to 2 years [INFO] [stdout] ✔ And the server should not have been reconfigured [INFO] [stdout] Rule: The Files configuration can only be changed by an admin [INFO] [stdout] Scenario Outline: Unauthorized actions [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Rémi is not an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi turns file uploading off [INFO] [stdout] ✔ Then the call should not succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the HTTP status code should be Forbidden [INFO] [stdout] Scenario Outline: Unauthorized actions [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Rémi is not an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi sets the file retention to 1 year [INFO] [stdout] ✔ Then the call should not succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the HTTP status code should be Forbidden [INFO] [stdout] Feature: XMPP server configuration: Message archive [INFO] [stdout] Rule: Message archiving can be turned on and off [INFO] [stdout] Scenario Outline: An admin turns message archiving on/off [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given message archiving is off [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian turns message archiving on [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And message archiving should be on [INFO] [stdout] ✔ And the server should have been reconfigured [INFO] [stdout] Scenario Outline: An admin turns message archiving on/off [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given message archiving is on [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian turns message archiving off [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And message archiving should be off [INFO] [stdout] ✔ And the server should have been reconfigured [INFO] [stdout] Rule: The message archive retention can be configured [INFO] [stdout] Scenario: An admin changes the message archive retention [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the message archive retention is set to 2 years [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian sets the message archive retention to 1 year [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the message archive retention should be set to 1 year [INFO] [stdout] ✔ And the server should have been reconfigured [INFO] [stdout] Rule: The Messaging configuration can be reset to its default value [INFO] [stdout] Scenario: An admin resets the Messaging configuration to its default value [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given message archiving is off [INFO] [stdout] ✔ And the message archive retention is set to 1 year [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian resets the Messaging configuration to its default value [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And message archiving should be on [INFO] [stdout] ✔ And the message archive retention should be set to infinite [INFO] [stdout] ✔ And the server should have been reconfigured [INFO] [stdout] Rule: The message archive retention can be reset to its default value [INFO] [stdout] Scenario: An admin resets the message archive retention to its default value [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the message archive retention is set to 1 year [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian resets the Messaging configuration to its default value [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the message archive retention should be set to infinite [INFO] [stdout] ✔ And the server should have been reconfigured [INFO] [stdout] Rule: Turning on/off message archiving is idempotent [INFO] [stdout] Scenario Outline: Turning on/off twice [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given message archiving is off [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian turns message archiving off [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And message archiving should be off [INFO] [stdout] ✔ And the server should not have been reconfigured [INFO] [stdout] Scenario Outline: Turning on/off twice [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given message archiving is on [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian turns message archiving on [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And message archiving should be on [INFO] [stdout] ✔ And the server should not have been reconfigured [INFO] [stdout] Rule: Changing the message archive retention is idempotent [INFO] [stdout] Scenario Outline: Changing to the same value twice [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the message archive retention is set to 1 year [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian sets the message archive retention to 1 year [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the message archive retention should be set to 1 year [INFO] [stdout] ✔ And the server should not have been reconfigured [INFO] [stdout] Scenario Outline: Changing to the same value twice [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given the message archive retention is set to 2 years [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian sets the message archive retention to 2 years [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the message archive retention should be set to 2 years [INFO] [stdout] ✔ And the server should not have been reconfigured [INFO] [stdout] Rule: The Messaging configuration can only be changed by an admin [INFO] [stdout] Scenario Outline: Unauthorized actions [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Rémi is not an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi turns message archiving off [INFO] [stdout] ✔ Then the call should not succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the HTTP status code should be Forbidden [INFO] [stdout] Scenario Outline: Unauthorized actions [INFO] [stdout] ✔> Given the Prose Pod has been initialized [INFO] [stdout] ✔> And the Prose Pod API has started [INFO] [stdout] ✔ Given Rémi is not an admin [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi sets the message archive retention to 1 year [INFO] [stdout] ✔ Then the call should not succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the HTTP status code should be Forbidden [INFO] [stdout] Feature: Rotating service account passwords [INFO] [stdout] Rule: The "super admin" account password is rotated [INFO] [stdout] Scenario: At API startup [INFO] [stdout] ✔ When the Prose Pod API starts [INFO] [stdout] ✔ Then 's password is changed [INFO] [stdout] Rule: The workspace account password is rotated [INFO] [stdout] Scenario: At API startup [INFO] [stdout] ✔ Given the Prose Pod has been initialized [INFO] [stdout] ✔ And the XMPP server domain is test.org [INFO] [stdout] ✔ When the Prose Pod API starts [INFO] [stdout] ✔ Then 's password is changed [INFO] [stdout] Feature: Workspace icon [INFO] [stdout] Rule: The API should warn if the workspace has not been initialized when getting the workspace icon [INFO] [stdout] Scenario: XMPP server and workspace not initialized [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the server config has not been initialized [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: XMPP server not initialized. (recovery suggestion: Call `PUT /v1/server/config` to initialize it.) [INFO] [stdout] ✔ When an unauthenticated user gets the workspace icon [INFO] [stdout] ✔ Then the user should receive 'Server config not initialized' [INFO] [stdout] Scenario: XMPP server initialized but not the workspace [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the server config has been initialized [INFO] [stdout] ✔ And the workspace has not been initialized [INFO] [stdout] ✔ When an unauthenticated user gets the workspace icon [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the returned workspace icon should be undefined [INFO] [stdout] Rule: Anyone can request the workspace icon [INFO] [stdout] Scenario: Get workspace icon after initializing [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod has been initialized [INFO] [stdout] ✔ When an unauthenticated user gets the workspace icon [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the returned workspace icon should be undefined [INFO] [stdout] Scenario: Get workspace icon after setting it once [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod has been initialized [INFO] [stdout] ✔ And the workspace icon is "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAGf0lEQVR4AX2WA7TsSBeFv1PpvrefZ55tjW3btm3btm3btp4xfrZt46JTdf6sWnd1rc7N/Ol1klJnH+zaKSHjOujEgVshsqu18bWIdFa1qAIoqKIQnn6MsjbUzYlBnJvtTPSoih0CjEhjye7HfF/qFExhG8nl7sW5fSXK55ytwTkHKKoK8H8cSM3XzQkGiSpwtjYWkV9jtbcC/5Qc2PXIbwFoWFE4Mln4ppGoWRzXgDo0vLw+sCqQGiuNB4fCBJjEEVW7KgnsTOBLANntsC9o3Kj5Vk5kAEpT54qgiv9phgOZzgTQAFjfKXxVcqjqasHuCYyQO+9UM2x8vx9NrrCfjavqAtOMqLOzAYTyUDae4gWETFRi4+pf9tvuyANlv+P6bylG/1bVKLEUuKKa4UBdO7aOYtGSyxls0s7nTYg4nYWyhoBg1bGtAbuHMRUJuCOABqvvkFJba6mqjmndssDZJ/fhxYd35ayTeqPOoZoYqf9783Oltkg+0gQ76rHp6Z+o2mYBIA2KH3POUVMTYwxssXFzLjpzYy48Y2OaNc0zYsxSjj2sB9//Oou164qIlNU9k5CoRZRNDJhO6mw9cK0Dt7Hz0TZumOPIg7ry4iO7cs9N23qHbr7vD867eiCffDPN422xSQtQxcYhC6XMpsx5TDrJvsf+olngqPoat9iwkhOP7M5eu7RnfeLID7/N5ucBc5i3YB1GQIzQvm1D3np2HwCG/bmA+5/8h/Xri54bIWwCQcNF7r/AXWIVecO9SbRx7Hj0hVH8NWKxT3FCNiorjF9rrSLgAe94+E8uPmsznn94D268ZxjzF6wNxAx7olwbysFD29VF37FdQ+594l/6DZlHMXYUKiOMAS0rlWKMMHfeGi64ph+z567hhYf3pFOHxhRjm0Hq0Df/TT7/I44VEXw2hFDTsN73AXzJ1lfVMuSPeXRs35jLztsCdf4/KSfCrjB1gAE8dCHofyASZdF7HaipjTEiHH1ID9578UAuP29LPv5qMhv3bk6L5pVeI7R8O5bemfOAoTZoyEJK4bS0xjnntUAM9Om5Iacd1zcBKrD3bh355qfpfPfLDPI5kxC3U8KVyPNJQvFTJExlIF2CkADFxppEa2nSOM/uO7fnmCTiXj02YPS4pVxyQz/+HrnIk9EYoWvnpuEr6qMWsq5cSG1auUrS64lUXR0nL23CgXt3Zv89O9OoYZ4f+83k4Wf/ZuqMlaCK3x2VUSnlAIFwaWgNGUhngTqzXlqhZ7dmieptwvZbt2HFiupk3zfinCt+YeTYJX5XJAStA9RQxhJ/XMqBck8MCvV5ACKwbHk1K1bW8MAtO2IMXHHzQK6+fTBr1tZ6KxQioogSeMikA98ig/laZsYvy+CBF5eqIm99NIGKiohBw+fzxz8LAUVESnqvSobMqt8Zfg2UMV9TlgvMT5VCNQE2/NRvFg0bRNx0xba0bF5IZHhWecRKqR3HjtpiTJNGFey3Rxfv6Np1NQBo+uxYtguA8lL4e4lYn3w1NdH+tdx9407stmN7cpHxUaqGz7NTR9dOzTjsgB4csl8PAB54YlhSxipyOUFDjQM8BCUsK0V4APhaD/tzPudf9SvLVlT5zFjrqKouArDTdu158t59eOeFQ9huq7Y8+9o/HHvWF4keTPXgHiObA8huh3+j6mxYgKZrVRqrrolp17ohH7x8CFfe2o/ePTbkmEN7JyLUgEHDZvPp15MYM2EJcWx95oyQdYIulUTEkFO1cxDphDqAEH0pZ8GhfE5Ys66WmbNX8dT9e7N4yXq++H4yP/42gwUL1xBF4iOOTFR2pgjbO5QBMWiCbVB9zJh8ee3LFDAQRwSqqopccUu/pBw/ccoF3/DG+2OSOq/3ZfLpVgI49bJamkMi1OpjsvPBX2wpRv5W56JSjdAgICkDxVrnzRgQSX9qCW00++iOAFhr2dbsv/2RoxPwfiaqSKWclHqFrWcEcpEgQlinZIMHK5EQyeHU9ZtyyJLR5k7ucqruBueKq0Vy9fRa6zsTfgE9+0yZcaIGg9riamf1hp7fNncmubFkyfwR6mrPUHSVz0Ras0P0aSnPdITyLIR5yaOqqxIHzjBqRySG8bfEli2e/6WL432ctT+CxGIqASGNmD7zl7mY+VkXxOQBYnXFH21s97FqvkyMxJAeWz9F+mrVqs3WTtnFOXstSOfkWTp+ZdY0jBEy4gC/1WY75FG18VDg3zTW/wD1Cn/lFZs8OgAAAABJRU5ErkJggg==" [INFO] [stdout] ✔ When an unauthenticated user gets the workspace icon [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the returned workspace icon should be "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" [INFO] [stdout] Rule: Admins can change the workspace icon [INFO] [stdout] Scenario: Valerian changes the workspace icon [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod has been initialized [INFO] [stdout] ✔ And the workspace icon is "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" [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian sets the workspace icon to "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" [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the returned workspace icon should be "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" [INFO] [stdout] ✔ And the workspace icon should be "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" [INFO] [stdout] Rule: Regular members can't change the workspace icon [INFO] [stdout] Scenario: Rémi tries to change the workspace icon [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod has been initialized [INFO] [stdout] ✔ And the workspace icon is "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAGf0lEQVR4AX2WA7TsSBeFv1PpvrefZ55tjW3btm3btm3btp4xfrZt46JTdf6sWnd1rc7N/Ol1klJnH+zaKSHjOujEgVshsqu18bWIdFa1qAIoqKIQnn6MsjbUzYlBnJvtTPSoih0CjEhjye7HfF/qFExhG8nl7sW5fSXK55ytwTkHKKoK8H8cSM3XzQkGiSpwtjYWkV9jtbcC/5Qc2PXIbwFoWFE4Mln4ppGoWRzXgDo0vLw+sCqQGiuNB4fCBJjEEVW7KgnsTOBLANntsC9o3Kj5Vk5kAEpT54qgiv9phgOZzgTQAFjfKXxVcqjqasHuCYyQO+9UM2x8vx9NrrCfjavqAtOMqLOzAYTyUDae4gWETFRi4+pf9tvuyANlv+P6bylG/1bVKLEUuKKa4UBdO7aOYtGSyxls0s7nTYg4nYWyhoBg1bGtAbuHMRUJuCOABqvvkFJba6mqjmndssDZJ/fhxYd35ayTeqPOoZoYqf9783Oltkg+0gQ76rHp6Z+o2mYBIA2KH3POUVMTYwxssXFzLjpzYy48Y2OaNc0zYsxSjj2sB9//Oou164qIlNU9k5CoRZRNDJhO6mw9cK0Dt7Hz0TZumOPIg7ry4iO7cs9N23qHbr7vD867eiCffDPN422xSQtQxcYhC6XMpsx5TDrJvsf+olngqPoat9iwkhOP7M5eu7RnfeLID7/N5ucBc5i3YB1GQIzQvm1D3np2HwCG/bmA+5/8h/Xri54bIWwCQcNF7r/AXWIVecO9SbRx7Hj0hVH8NWKxT3FCNiorjF9rrSLgAe94+E8uPmsznn94D268ZxjzF6wNxAx7olwbysFD29VF37FdQ+594l/6DZlHMXYUKiOMAS0rlWKMMHfeGi64ph+z567hhYf3pFOHxhRjm0Hq0Df/TT7/I44VEXw2hFDTsN73AXzJ1lfVMuSPeXRs35jLztsCdf4/KSfCrjB1gAE8dCHofyASZdF7HaipjTEiHH1ID9578UAuP29LPv5qMhv3bk6L5pVeI7R8O5bemfOAoTZoyEJK4bS0xjnntUAM9Om5Iacd1zcBKrD3bh355qfpfPfLDPI5kxC3U8KVyPNJQvFTJExlIF2CkADFxppEa2nSOM/uO7fnmCTiXj02YPS4pVxyQz/+HrnIk9EYoWvnpuEr6qMWsq5cSG1auUrS64lUXR0nL23CgXt3Zv89O9OoYZ4f+83k4Wf/ZuqMlaCK3x2VUSnlAIFwaWgNGUhngTqzXlqhZ7dmieptwvZbt2HFiupk3zfinCt+YeTYJX5XJAStA9RQxhJ/XMqBck8MCvV5ACKwbHk1K1bW8MAtO2IMXHHzQK6+fTBr1tZ6KxQioogSeMikA98ig/laZsYvy+CBF5eqIm99NIGKiohBw+fzxz8LAUVESnqvSobMqt8Zfg2UMV9TlgvMT5VCNQE2/NRvFg0bRNx0xba0bF5IZHhWecRKqR3HjtpiTJNGFey3Rxfv6Np1NQBo+uxYtguA8lL4e4lYn3w1NdH+tdx9407stmN7cpHxUaqGz7NTR9dOzTjsgB4csl8PAB54YlhSxipyOUFDjQM8BCUsK0V4APhaD/tzPudf9SvLVlT5zFjrqKouArDTdu158t59eOeFQ9huq7Y8+9o/HHvWF4keTPXgHiObA8huh3+j6mxYgKZrVRqrrolp17ohH7x8CFfe2o/ePTbkmEN7JyLUgEHDZvPp15MYM2EJcWx95oyQdYIulUTEkFO1cxDphDqAEH0pZ8GhfE5Ys66WmbNX8dT9e7N4yXq++H4yP/42gwUL1xBF4iOOTFR2pgjbO5QBMWiCbVB9zJh8ee3LFDAQRwSqqopccUu/pBw/ccoF3/DG+2OSOq/3ZfLpVgI49bJamkMi1OpjsvPBX2wpRv5W56JSjdAgICkDxVrnzRgQSX9qCW00++iOAFhr2dbsv/2RoxPwfiaqSKWclHqFrWcEcpEgQlinZIMHK5EQyeHU9ZtyyJLR5k7ucqruBueKq0Vy9fRa6zsTfgE9+0yZcaIGg9riamf1hp7fNncmubFkyfwR6mrPUHSVz0Ras0P0aSnPdITyLIR5yaOqqxIHzjBqRySG8bfEli2e/6WL432ctT+CxGIqASGNmD7zl7mY+VkXxOQBYnXFH21s97FqvkyMxJAeWz9F+mrVqs3WTtnFOXstSOfkWTp+ZdY0jBEy4gC/1WY75FG18VDg3zTW/wD1Cn/lFZs8OgAAAABJRU5ErkJggg==" [INFO] [stdout] ✔ And Rémi is a regular member [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi sets the workspace icon to "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" [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And the workspace icon should be "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" [INFO] [stdout] Feature: Workspace name [INFO] [stdout] Rule: The API should warn if the workspace has not been initialized when getting the workspace name [INFO] [stdout] Scenario: XMPP server and workspace not initialized [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the server config has not been initialized [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: XMPP server not initialized. (recovery suggestion: Call `PUT /v1/server/config` to initialize it.) [INFO] [stdout] ✔ When an unauthenticated user gets the workspace name [INFO] [stdout] ✔ Then the user should receive 'Server config not initialized' [INFO] [stdout] Scenario: XMPP server initialized but not the workspace [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the server config has been initialized [INFO] [stdout] ✔ And the workspace has not been initialized [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: WorkspaceServiceError: Workspace not initialized. (recovery suggestion: Call `PUT /v1/workspace` to initialize it.) [INFO] [stdout] ✔ When an unauthenticated user gets the workspace name [INFO] [stdout] ✔ Then the user should receive 'Workspace not initialized' [INFO] [stdout] Rule: Anyone can request the workspace name [INFO] [stdout] Scenario: Get workspace name after initializing [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod has been initialized [INFO] [stdout] ✔ And the workspace is named "Prose" [INFO] [stdout] ✔ When an unauthenticated user gets the workspace name [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the returned workspace name should be "Prose" [INFO] [stdout] Rule: Admins can change the workspace name [INFO] [stdout] Scenario: Valerian changes the workspace name [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod has been initialized [INFO] [stdout] ✔ And the workspace is named "Prose" [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ When Valerian sets the workspace name to "Prose IM" [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be JSON [INFO] [stdout] ✔ And the returned workspace name should be "Prose IM" [INFO] [stdout] ✔ And the workspace should be named "Prose IM" [INFO] [stdout] Rule: Regular members can't change the workspace name [INFO] [stdout] Scenario: Rémi tries to change the workspace name [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod has been initialized [INFO] [stdout] ✔ And the workspace is named "Prose" [INFO] [stdout] ✔ And Rémi is a regular member [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi sets the workspace name to "Prose IM" [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And the workspace should be named "Prose" [INFO] [stdout] Feature: Workspace vCard [INFO] [stdout] Rule: The API should warn if the workspace has not been initialized when getting the workspace vCard [INFO] [stdout] Scenario: XMPP server and workspace not initialized [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the server config has not been initialized [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: XMPP server not initialized. (recovery suggestion: Call `PUT /v1/server/config` to initialize it.) [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: XMPP server not initialized. (recovery suggestion: Call `PUT /v1/server/config` to initialize it.) [INFO] [stdout] ✔ When an unauthenticated user gets the workspace vCard [INFO] [stdout] ✔ Then the user should receive 'Server config not initialized' [INFO] [stdout] Scenario: XMPP server initialized but not the workspace [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the server config has been initialized [INFO] [stdout] ✔ And the workspace has not been initialized [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: WorkspaceServiceError: Workspace not initialized. (recovery suggestion: Call `PUT /v1/workspace` to initialize it.) [INFO] [stdout] ✔ When an unauthenticated user gets the workspace vCard [INFO] [stdout] ✔ Then the user should receive 'Workspace not initialized' [INFO] [stdout] Rule: Anyone can request the workspace vCard [INFO] [stdout] Scenario: Someone tries to get the workspace vCard without authenticating [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod has been initialized [INFO] [stdout] ✔ When an unauthenticated user gets the workspace vCard [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be "text/vcard" [INFO] [stdout] Rule: Admins can change the workspace vCard [INFO] [stdout] Scenario: Valerian changes the workspace vCard [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod has been initialized [INFO] [stdout] ✔ And Valerian is an admin [INFO] [stdout] ✔ And the workspace is named "Prose" [INFO] [stdout] ✔ When Valerian sets the workspace vCard to "BEGIN:VCARD\nVERSION:4.0\nFN:Prose IM\nEND:VCARD" [INFO] [stdout] ✔ Then the call should succeed [INFO] [stdout] ✔ And the response content type should be "text/vcard" [INFO] [stdout] ✔ And the workspace should be named "Prose IM" [INFO] [stdout] Rule: Regular members can't change the workspace vCard [INFO] [stdout] Scenario: Rémi tries to change the workspace vCard [INFO] [stdout] ✔> Given the Prose Pod API has started [INFO] [stdout] ✔ Given the Prose Pod has been initialized [INFO] [stdout] ✔ And the workspace is named "Prose" [INFO] [stdout] ✔ And Rémi is a regular member [INFO] [stdout]  WARN scenario:step: prose_pod_api::error: Forbidden: is not an admin. [INFO] [stdout] ✔ When Rémi sets the workspace vCard to "BEGIN:VCARD\nVERSION:4.0\nFN:Prose IM\nEND:VCARD" [INFO] [stdout] ✔ Then the HTTP status code should be Forbidden [INFO] [stdout] ✔ And the workspace should be named "Prose" [INFO] [stdout] [Summary] [INFO] [stdout] 20 features [INFO] [stdout] 70 rules [INFO] [stdout] 123 scenarios (123 passed) [INFO] [stdout] 1019 steps (1019 passed) [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/prosody_config-0af0fde2d81deee2) [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running tests/prosody_config.rs (/opt/rustwide/target/debug/deps/prosody_config-12112b3236e55e3b) [INFO] [stdout] [INFO] [stdout] running 1 test [INFO] [stdout] test test_prose_default_config ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s [INFO] [stdout] [INFO] [stderr] Running tests/prosody_config_file.rs (/opt/rustwide/target/debug/deps/prosody_config_file-d5c9c4a3d54ba8a3) [INFO] [stdout] [INFO] [stdout] running 1 test [INFO] [stdout] test test_prose_default_config ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s [INFO] [stdout] [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/service-1fb071dd97f20a58) [INFO] [stdout] [INFO] [stdout] running 4 tests [INFO] [stdout] test dependencies::uuid::incrementing::test_incrementing_generator ... ok [INFO] [stdout] test models::durations::date_like::tests::test_deserializing ... ok [INFO] [stdout] test dependencies::uuid::live::test_live_generator ... ok [INFO] [stdout] test models::durations::time_like::tests::test_deserializing ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running tests/behavior.rs (/opt/rustwide/target/debug/deps/behavior-3ae72d184bb95342) [INFO] [stdout] Feature: Prosody configuration file [INFO] [stdout] Scenario: Brand new Prose Pod configuration [INFO] [stdout] ✔ Given nothing has changed since the initialization of the workspace [INFO] [stdout] ✔ When generating a new Prosody configuration file from the database [INFO] [stdout] ✔ Then the file should match the snapshot named "default_config" [INFO] [stdout] Scenario: Everything off [INFO] [stdout] ✔ Given every optional feature has been disabled [INFO] [stdout] ✔ When generating a new Prosody configuration file from the database [INFO] [stdout] ✔ Then the file should match the snapshot named "minimal_config" [INFO] [stdout] [Summary] [INFO] [stdout] 1 feature [INFO] [stdout] 2 scenarios (2 passed) [INFO] [stdout] 6 steps (6 passed) [INFO] [stderr] Doc-tests prose_pod_api [INFO] [stdout] [INFO] [stdout] running 2 tests [INFO] [stdout] test crates/rest-api/src/features/auth/guards/authenticated.rs - features::auth::guards::authenticated::Authenticated (line 21) - compile ... ok [INFO] [stdout] test crates/rest-api/src/features/auth/guards/authenticated.rs - features::auth::guards::authenticated::Authenticated (line 36) - compile ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.11s [INFO] [stdout] [INFO] [stderr] Doc-tests prosody_config [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Doc-tests service [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] running `Command { std: "docker" "inspect" "8e44a405a90d5aaa5f43d1ef4a2abcb56d21d8f216b5202397529bcfe41b0fa5", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "8e44a405a90d5aaa5f43d1ef4a2abcb56d21d8f216b5202397529bcfe41b0fa5", kill_on_drop: false }` [INFO] [stdout] 8e44a405a90d5aaa5f43d1ef4a2abcb56d21d8f216b5202397529bcfe41b0fa5