Our Personal Data Server from scratch! tranquil.farm
atproto pds rust postgresql fun oauth

feat(test): test that websockets get closed #101

open opened by nel.pet targeting main from fix/zombie-websocket-connections
Labels

None yet.

assignee

None yet.

Participants 1
AT URI
at://did:plc:h5wsnqetncv6lu2weom35lg2/sh.tangled.repo.pull/3mhvk3mpe6q22
+245 -34
Diff #0
+196 -34
Cargo.lock
··· 914 914 "syn 2.0.117", 915 915 ] 916 916 917 + [[package]] 918 + name = "axum-test" 919 + version = "19.1.1" 920 + source = "registry+https://github.com/rust-lang/crates.io-index" 921 + checksum = "6a28640adad0e99978d38bc455b323c62a5cddc4e22f83eacde93f8c395ae7e3" 922 + dependencies = [ 923 + "anyhow", 924 + "axum", 925 + "base64 0.22.1", 926 + "bytes", 927 + "bytesize", 928 + "cookie", 929 + "expect-json", 930 + "futures-util", 931 + "http 1.4.0", 932 + "http-body-util", 933 + "hyper 1.8.1", 934 + "hyper-util", 935 + "mime", 936 + "pretty_assertions", 937 + "reserve-port", 938 + "rust-multipart-rfc7578_2", 939 + "serde", 940 + "serde_json", 941 + "serde_urlencoded", 942 + "tokio", 943 + "tokio-tungstenite", 944 + "tower", 945 + "url", 946 + "uuid", 947 + ] 948 + 917 949 [[package]] 918 950 name = "backon" 919 951 version = "1.6.0" ··· 1274 1306 "either", 1275 1307 ] 1276 1308 1309 + [[package]] 1310 + name = "bytesize" 1311 + version = "2.3.1" 1312 + source = "registry+https://github.com/rust-lang/crates.io-index" 1313 + checksum = "6bd91ee7b2422bcb158d90ef4d14f75ef67f340943fc4149891dcce8f8b972a3" 1314 + 1277 1315 [[package]] 1278 1316 name = "cbc" 1279 1317 version = "0.1.2" ··· 1570 1608 source = "registry+https://github.com/rust-lang/crates.io-index" 1571 1609 checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" 1572 1610 1611 + [[package]] 1612 + name = "cookie" 1613 + version = "0.18.1" 1614 + source = "registry+https://github.com/rust-lang/crates.io-index" 1615 + checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" 1616 + dependencies = [ 1617 + "time", 1618 + "version_check", 1619 + ] 1620 + 1573 1621 [[package]] 1574 1622 name = "cordyceps" 1575 1623 version = "0.3.4" ··· 2011 2059 source = "registry+https://github.com/rust-lang/crates.io-index" 2012 2060 checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" 2013 2061 2062 + [[package]] 2063 + name = "diff" 2064 + version = "0.1.13" 2065 + source = "registry+https://github.com/rust-lang/crates.io-index" 2066 + checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" 2067 + 2014 2068 [[package]] 2015 2069 name = "digest" 2016 2070 version = "0.10.7" ··· 2179 2233 "zeroize", 2180 2234 ] 2181 2235 2236 + [[package]] 2237 + name = "email_address" 2238 + version = "0.2.9" 2239 + source = "registry+https://github.com/rust-lang/crates.io-index" 2240 + checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" 2241 + dependencies = [ 2242 + "serde", 2243 + ] 2244 + 2182 2245 [[package]] 2183 2246 name = "embedded-io" 2184 2247 version = "0.4.0" ··· 2218 2281 source = "registry+https://github.com/rust-lang/crates.io-index" 2219 2282 checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 2220 2283 2284 + [[package]] 2285 + name = "erased-serde" 2286 + version = "0.4.10" 2287 + source = "registry+https://github.com/rust-lang/crates.io-index" 2288 + checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" 2289 + dependencies = [ 2290 + "serde", 2291 + "serde_core", 2292 + "typeid", 2293 + ] 2294 + 2221 2295 [[package]] 2222 2296 name = "errno" 2223 2297 version = "0.3.14" ··· 2270 2344 "pin-project-lite", 2271 2345 ] 2272 2346 2347 + [[package]] 2348 + name = "expect-json" 2349 + version = "1.10.1" 2350 + source = "registry+https://github.com/rust-lang/crates.io-index" 2351 + checksum = "869f97f4abe8e78fc812a94ad6b721d72c4fb5532877c79610f2c238d7ccf6c4" 2352 + dependencies = [ 2353 + "chrono", 2354 + "email_address", 2355 + "expect-json-macros", 2356 + "num", 2357 + "regex", 2358 + "serde", 2359 + "serde_json", 2360 + "thiserror 2.0.18", 2361 + "typetag", 2362 + "uuid", 2363 + ] 2364 + 2365 + [[package]] 2366 + name = "expect-json-macros" 2367 + version = "1.10.1" 2368 + source = "registry+https://github.com/rust-lang/crates.io-index" 2369 + checksum = "6e6fdf550180a6c29a28cb9aac262dc0064c25735641d2317f670075e9a469d9" 2370 + dependencies = [ 2371 + "proc-macro2", 2372 + "quote", 2373 + "syn 2.0.117", 2374 + ] 2375 + 2273 2376 [[package]] 2274 2377 name = "fastrand" 2275 2378 version = "2.3.0" ··· 3429 3532 3430 3533 [[package]] 3431 3534 name = "ipconfig" 3432 - version = "0.3.2" 3535 + version = "0.3.4" 3433 3536 source = "registry+https://github.com/rust-lang/crates.io-index" 3434 - checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" 3537 + checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" 3435 3538 dependencies = [ 3436 - "socket2 0.5.10", 3539 + "socket2 0.6.3", 3437 3540 "widestring", 3438 - "windows-sys 0.48.0", 3439 - "winreg", 3541 + "windows-registry", 3542 + "windows-result", 3543 + "windows-sys 0.61.2", 3440 3544 ] 3441 3545 3442 3546 [[package]] ··· 3458 3562 3459 3563 [[package]] 3460 3564 name = "iri-string" 3461 - version = "0.7.10" 3565 + version = "0.7.11" 3462 3566 source = "registry+https://github.com/rust-lang/crates.io-index" 3463 - checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" 3567 + checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb" 3464 3568 dependencies = [ 3465 3569 "memchr", 3466 3570 "serde", ··· 3835 3939 3836 3940 [[package]] 3837 3941 name = "libredox" 3838 - version = "0.1.14" 3942 + version = "0.1.15" 3839 3943 source = "registry+https://github.com/rust-lang/crates.io-index" 3840 - checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" 3944 + checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" 3841 3945 dependencies = [ 3842 3946 "bitflags", 3843 3947 "libc", ··· 4341 4445 4342 4446 [[package]] 4343 4447 name = "num-conv" 4344 - version = "0.2.0" 4448 + version = "0.2.1" 4345 4449 source = "registry+https://github.com/rust-lang/crates.io-index" 4346 - checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" 4450 + checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" 4347 4451 4348 4452 [[package]] 4349 4453 name = "num-integer" ··· 4891 4995 "url", 4892 4996 ] 4893 4997 4998 + [[package]] 4999 + name = "pretty_assertions" 5000 + version = "1.4.1" 5001 + source = "registry+https://github.com/rust-lang/crates.io-index" 5002 + checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" 5003 + dependencies = [ 5004 + "diff", 5005 + "yansi", 5006 + ] 5007 + 4894 5008 [[package]] 4895 5009 name = "prettyplease" 4896 5010 version = "0.2.37" ··· 5573 5687 "web-sys", 5574 5688 ] 5575 5689 5690 + [[package]] 5691 + name = "reserve-port" 5692 + version = "2.4.0" 5693 + source = "registry+https://github.com/rust-lang/crates.io-index" 5694 + checksum = "94070964579245eb2f76e62a7668fe87bd9969ed6c41256f3bf614e3323dd3cc" 5695 + dependencies = [ 5696 + "thiserror 2.0.18", 5697 + ] 5698 + 5576 5699 [[package]] 5577 5700 name = "resolv-conf" 5578 5701 version = "0.7.6" ··· 5634 5757 "zeroize", 5635 5758 ] 5636 5759 5760 + [[package]] 5761 + name = "rust-multipart-rfc7578_2" 5762 + version = "0.9.0" 5763 + source = "registry+https://github.com/rust-lang/crates.io-index" 5764 + checksum = "00bdaa068902270ca7fa8619775e1838e23a63620abac0947ce0f715819b8cec" 5765 + dependencies = [ 5766 + "bytes", 5767 + "futures-core", 5768 + "futures-util", 5769 + "http 1.4.0", 5770 + "mime", 5771 + "rand 0.10.0", 5772 + "thiserror 2.0.18", 5773 + ] 5774 + 5637 5775 [[package]] 5638 5776 name = "rustc-hash" 5639 5777 version = "2.1.1" ··· 6007 6145 6008 6146 [[package]] 6009 6147 name = "serde_spanned" 6010 - version = "1.0.4" 6148 + version = "1.1.0" 6011 6149 source = "registry+https://github.com/rust-lang/crates.io-index" 6012 - checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" 6150 + checksum = "876ac351060d4f882bb1032b6369eb0aef79ad9df1ea8bc404874d8cc3d0cd98" 6013 6151 dependencies = [ 6014 6152 "serde_core", 6015 6153 ] ··· 6937 7075 6938 7076 [[package]] 6939 7077 name = "toml_datetime" 6940 - version = "1.0.1+spec-1.1.0" 7078 + version = "1.1.0+spec-1.1.0" 6941 7079 source = "registry+https://github.com/rust-lang/crates.io-index" 6942 - checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" 7080 + checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" 6943 7081 dependencies = [ 6944 7082 "serde_core", 6945 7083 ] 6946 7084 6947 7085 [[package]] 6948 7086 name = "toml_edit" 6949 - version = "0.25.5+spec-1.1.0" 7087 + version = "0.25.8+spec-1.1.0" 6950 7088 source = "registry+https://github.com/rust-lang/crates.io-index" 6951 - checksum = "8ca1a40644a28bce036923f6a431df0b34236949d111cc07cb6dca830c9ef2e1" 7089 + checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" 6952 7090 dependencies = [ 6953 7091 "indexmap 2.13.0", 6954 - "toml_datetime 1.0.1+spec-1.1.0", 7092 + "toml_datetime 1.1.0+spec-1.1.0", 6955 7093 "toml_parser", 6956 7094 "winnow 1.0.0", 6957 7095 ] 6958 7096 6959 7097 [[package]] 6960 7098 name = "toml_parser" 6961 - version = "1.0.10+spec-1.1.0" 7099 + version = "1.1.0+spec-1.1.0" 6962 7100 source = "registry+https://github.com/rust-lang/crates.io-index" 6963 - checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" 7101 + checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" 6964 7102 dependencies = [ 6965 7103 "winnow 1.0.0", 6966 7104 ] 6967 7105 6968 7106 [[package]] 6969 7107 name = "toml_writer" 6970 - version = "1.0.7+spec-1.1.0" 7108 + version = "1.1.0+spec-1.1.0" 6971 7109 source = "registry+https://github.com/rust-lang/crates.io-index" 6972 - checksum = "f17aaa1c6e3dc22b1da4b6bba97d066e354c7945cac2f7852d4e4e7ca7a6b56d" 7110 + checksum = "d282ade6016312faf3e41e57ebbba0c073e4056dab1232ab1cb624199648f8ed" 6973 7111 6974 7112 [[package]] 6975 7113 name = "tonic" ··· 7624 7762 dependencies = [ 7625 7763 "anyhow", 7626 7764 "axum", 7765 + "axum-test", 7627 7766 "bytes", 7628 7767 "chrono", 7629 7768 "cid", ··· 7632 7771 "jacquard-repo", 7633 7772 "serde", 7634 7773 "serde_ipld_dagcbor", 7774 + "sqlx", 7635 7775 "tokio", 7776 + "tokio-util", 7636 7777 "tracing", 7778 + "tracing-subscriber", 7637 7779 "tranquil-config", 7638 7780 "tranquil-db-traits", 7639 7781 "tranquil-pds", ··· 7702 7844 source = "registry+https://github.com/rust-lang/crates.io-index" 7703 7845 checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" 7704 7846 7847 + [[package]] 7848 + name = "typeid" 7849 + version = "1.0.3" 7850 + source = "registry+https://github.com/rust-lang/crates.io-index" 7851 + checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" 7852 + 7705 7853 [[package]] 7706 7854 name = "typenum" 7707 7855 version = "1.19.0" 7708 7856 source = "registry+https://github.com/rust-lang/crates.io-index" 7709 7857 checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 7710 7858 7859 + [[package]] 7860 + name = "typetag" 7861 + version = "0.2.21" 7862 + source = "registry+https://github.com/rust-lang/crates.io-index" 7863 + checksum = "be2212c8a9b9bcfca32024de14998494cf9a5dfa59ea1b829de98bac374b86bf" 7864 + dependencies = [ 7865 + "erased-serde", 7866 + "inventory", 7867 + "once_cell", 7868 + "serde", 7869 + "typetag-impl", 7870 + ] 7871 + 7872 + [[package]] 7873 + name = "typetag-impl" 7874 + version = "0.2.21" 7875 + source = "registry+https://github.com/rust-lang/crates.io-index" 7876 + checksum = "27a7a9b72ba121f6f1f6c3632b85604cac41aedb5ddc70accbebb6cac83de846" 7877 + dependencies = [ 7878 + "proc-macro2", 7879 + "quote", 7880 + "syn 2.0.117", 7881 + ] 7882 + 7711 7883 [[package]] 7712 7884 name = "unicase" 7713 7885 version = "2.9.0" ··· 7743 7915 7744 7916 [[package]] 7745 7917 name = "unicode-segmentation" 7746 - version = "1.12.0" 7918 + version = "1.13.1" 7747 7919 source = "registry+https://github.com/rust-lang/crates.io-index" 7748 - checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 7920 + checksum = "da36089a805484bcccfffe0739803392c8298778a2d2f09febf76fac5ad9025b" 7749 7921 7750 7922 [[package]] 7751 7923 name = "unicode-width" ··· 8550 8722 "memchr", 8551 8723 ] 8552 8724 8553 - [[package]] 8554 - name = "winreg" 8555 - version = "0.50.0" 8556 - source = "registry+https://github.com/rust-lang/crates.io-index" 8557 - checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 8558 - dependencies = [ 8559 - "cfg-if", 8560 - "windows-sys 0.48.0", 8561 - ] 8562 - 8563 8725 [[package]] 8564 8726 name = "wiremock" 8565 8727 version = "0.6.5"
+6
crates/tranquil-sync/Cargo.toml
··· 22 22 serde_ipld_dagcbor = { workspace = true } 23 23 tokio = { workspace = true } 24 24 tracing = { workspace = true } 25 + 26 + [dev-dependencies] 27 + axum-test = { version = "19.1.1", features = [ "ws" ] } 28 + sqlx = { workspace = true } 29 + tokio-util = { workspace = true } 30 + tracing-subscriber.workspace = true
+43
crates/tranquil-sync/src/subscribe_repos.rs
··· 244 244 break; 245 245 }; 246 246 247 + info!("{msg:?}"); 248 + 247 249 if let Message::Close(_) = msg { 248 250 info!("Client closed connection"); 249 251 break; ··· 254 256 } 255 257 Ok(()) 256 258 } 259 + 260 + #[cfg(test)] 261 + mod test { 262 + use std::net::SocketAddr; 263 + use std::time::Duration; 264 + 265 + use super::super::sync_routes; 266 + use super::*; 267 + use axum_test::TestServer; 268 + use tokio_util::sync::CancellationToken; 269 + 270 + #[tokio::test] 271 + async fn test_websockets_closing() { 272 + // tracing_subscriber::fmt().init(); 273 + tranquil_config::ensure_test_defaults(); 274 + let state = AppState::new(CancellationToken::new()).await.unwrap(); 275 + let app = sync_routes() 276 + .with_state(state) 277 + .into_make_service_with_connect_info::<SocketAddr>(); 278 + let server = TestServer::builder().http_transport().build(app); 279 + 280 + const CONNECTIONS: usize = 100; 281 + let mut open_sockets = Vec::with_capacity(CONNECTIONS); 282 + 283 + for _ in 0..CONNECTIONS { 284 + let socket = server 285 + .get_websocket("/com.atproto.sync.subscribeRepos") 286 + .await 287 + .into_websocket() 288 + .await; 289 + open_sockets.push(socket); 290 + } 291 + assert_eq!(SUBSCRIBER_COUNT.load(Ordering::SeqCst), CONNECTIONS); 292 + 293 + drop(open_sockets); 294 + // disgusting awful hack to give tokio time to poll the server futures enough times to actually drop all the 295 + // websockets on the other end as well 296 + tokio::time::sleep(Duration::from_millis(8)).await; 297 + assert_eq!(SUBSCRIBER_COUNT.load(Ordering::SeqCst), 0); 298 + } 299 + }

History

1 round 1 comment
sign up or login to add to the discussion
nel.pet submitted #0
1 commit
expand
feat(test): test that websockets get closed
no conflicts, ready to merge
expand 1 comment

draft. def dont merge yet. lotsa issues