From 4d7f8ce2f7e8a1b1324586ff06c760244f56cea3 Mon Sep 17 00:00:00 2001 From: Ryan Levick Date: Wed, 29 Nov 2023 13:58:31 +0100 Subject: [PATCH 1/4] Add outbound redis runtime test Signed-off-by: Ryan Levick --- test-components/Cargo.lock | 25 ++++ test-components/Cargo.toml | 2 +- .../outbound-redis/.cargo/config.toml | 2 + test-components/outbound-redis/Cargo.toml | 10 ++ test-components/outbound-redis/component.wasm | Bin 0 -> 164323 bytes test-components/outbound-redis/src/lib.rs | 126 ++++++++++++++++++ tests/runtime-tests/src/lib.rs | 2 +- .../tests/outbound-mysql/spin.toml | 16 ++- .../tests/outbound-redis/spin.toml | 15 +++ .../tests/sqlite-no-permission/spin.toml | 17 +-- tests/runtime-tests/tests/sqlite/spin.toml | 18 +-- 11 files changed, 207 insertions(+), 26 deletions(-) create mode 100644 test-components/outbound-redis/.cargo/config.toml create mode 100644 test-components/outbound-redis/Cargo.toml create mode 100755 test-components/outbound-redis/component.wasm create mode 100644 test-components/outbound-redis/src/lib.rs create mode 100644 tests/runtime-tests/tests/outbound-redis/spin.toml diff --git a/test-components/Cargo.lock b/test-components/Cargo.lock index 2ab07e5266..a556ee9f62 100644 --- a/test-components/Cargo.lock +++ b/test-components/Cargo.lock @@ -84,6 +84,31 @@ dependencies = [ "helper", ] +[[package]] +name = "outbound-redis" +version = "0.1.0" +dependencies = [ + "helper", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "proc-macro2" version = "1.0.69" diff --git a/test-components/Cargo.toml b/test-components/Cargo.toml index fb237cba84..ab480fa65e 100644 --- a/test-components/Cargo.toml +++ b/test-components/Cargo.toml @@ -1,3 +1,3 @@ [workspace] -members = ["sqlite", "helper", "outbound-mysql"] +members = ["sqlite", "helper", "outbound-mysql", "outbound-redis"] resolver = "2" diff --git a/test-components/outbound-redis/.cargo/config.toml b/test-components/outbound-redis/.cargo/config.toml new file mode 100644 index 0000000000..6b77899cb3 --- /dev/null +++ b/test-components/outbound-redis/.cargo/config.toml @@ -0,0 +1,2 @@ +[build] +target = "wasm32-wasi" diff --git a/test-components/outbound-redis/Cargo.toml b/test-components/outbound-redis/Cargo.toml new file mode 100644 index 0000000000..6e35ce6f02 --- /dev/null +++ b/test-components/outbound-redis/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "outbound-redis" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +helper = { path = "../helper" } diff --git a/test-components/outbound-redis/component.wasm b/test-components/outbound-redis/component.wasm new file mode 100755 index 0000000000000000000000000000000000000000..f3b682a92928dc569a242586f6e7e48351931589 GIT binary patch literal 164323 zcmeFa3%s3oS?Bv+)@|>#cCuO`1QPALRx`RI4UJlpPTSGE8Cs~IprdE}9Q8vxZJ^yL zZIf(5orBFTO)+4R07U~viBcp=D*-E3tQs&%#X1HlSg@9W)lv zwfEY|PMSJ;<}|R^d--3U|8swy|K*LY-0|8tilX?o_&Ha^yP_+SUHnOR6@TMhdcxlp zkL+o~f134M-bc|D5kIlYCO6YYsKBik<)UqM)O2yh!}Mlrzq#vX{)>{QCZE6Z)myf| z_J?n{{-PZ>UVHud+qYbO?T$^~{G#ZNF;WH?RNZZ&~+E>(_nLh3Cwxf9>^G z-SFCLuYb+D?OV3JZp)6@C|b1Z=ZzU2)wiDj+Hn}UddqbusPTd^oou;j%T=$N-4ZpI zGQj8j00i4HyZv=n&EBy6hhBZ{mg}zG5jB=l^J@!=gW(%#W6Qc5UN?K=mD{g;?TbXk z_EOsTx{=dx!&T^06C|?!GiiPdj0lmK}5V1P*yEy<-go;^$(v)3#$u+lyF!J zufF#BYj<1|B@V>3H=GZ)w_N$!vFx^D9=mPXzWs*nOXJk9nO8NCGI05cyB*ZVe&g$A z*ExhQy6T!OS8ZK4g2NNHQ^#Sg9dDtv6a*~N!mF=)9ViTRJTVNb=ixz2Sq>?Ro-3h$ z)sE}0ym7}hH_X23#_d~nUc2S>-_&{a)vt0eJByU)-gv`x*S+e7>$lwS>Q_gL7TR+C z&TF^daQ&;Kl^Tn*bXHMl$F=`;%Z?Kkow#xP4OhKt%T3p!Xwo+&yORmbK|C2XS_zgR zZbXenyVYtol1@W6-GB4bY4JG`d|{qCI|j6F1VN6;H%* z!aoBkru8&wv>WMEg9k~snYC)mJyuI6A8}fmO@r<_<^Q_IIbP*KT?34cmV>iN3W`?WM-P=F01@zHZC* zaa#Ude;0jy@2V^R%eAjUJg>X%hO45>C*BpuQ66`%`a+z29sHU)(x94y5Qem z_!G&+`L}KQkKg{{%PxJzo8#~K?&I<8@ef@8>aEvpnR)GNu6^YXeL24Bw)j8&=l|pT zzW<6h{K(C7@vd9r-SNBQ_ryOH?~mUY-x6Uy!h7h72?maouFtz>uCv(c*e zpLze&_5Rn)@Bgh+X>V72b8A-~4U%LNHRE;B<<#uO-7KC?)(=uWJ<&fEi@->nFPm8x zMN^Yp^>j55PA;(Sn}e1&p~8(}n+|lJHM921sLIb}Q*kftW@*-*IWLOxO)s5Fx_Z8K z(CTKbOQ#GBdp+z>VA#rceFrr=>!LXS_HBcStd*a$Z7@ljt^A5t@Mbb^&1MtZ2dy3r zP3VTQ31znrCalzrDm6j5-t4?msY>zU>{;0Tctnks(9z1Dj<*S%hAyU-^I&f7NCf10 zJZM;(bMfU-U!P@yw77^_9k?-+K}Gn>Jq!^pK|hbPsjY*vfTNSgvugV6 znZa|i<%7voG+oAv#>_WG(Vh?Fph=7oZAjJta%U#%&SZ4mPBx_~_#AMdf}7)8UwJ9* zhmvPo*f7 z%n07?_a##ajWzRlX4rhml$xHh3X@s$6|ino!)dC)mar_80dJ>lMMI;t%cw~oJz&cE zgGq76S(K)W03?K-^g$ciTd+b8JN~}odU7`7 zni6^^^uthv`#v28&grOSy0^j;^9UfkR+wR+hWF;B3{(gjPSS(M7nkD;;~yR5unpaW ziOZ*wUZ;y>09b?Z1Ui*(ZH$4o1rrps75U4CK(CQ?>e8tu(2oII$}0}-Z%9^i4I9yLQbaY{$IeWk ze9(ZI8kfQWZCWW2*38cKMrio0*$&e4zOJ#-9ETO?)RfB^>jc-Ug{?p(`a4+xn?{{*d8{_^b{rW}N_Nv)r zQ@%29gofRPSl-PW`O2dByKj!WyUwNGxhOx>+&YZc*froBPiOMIQug^&|4F?sF!IcP zg^lB>KP5yYp zOb;}_m*zzKd-NOUkJ*b2$szT^(D-{Oo$3F+2Ie4{&8{$Kwdg>Uq?zMM-YzKw2vVaU zD4LG$5so%Q=z86KxVUTOKW)fc!E*_Y1_XuFn-9V`qZmRzn`hOMbIzu&6AFn{p9V59$e=f$k)K195hem5phhQ1Ak#_7Uv zY#|KCl3`;iDPef%Kph6qU--yI=%gf!kA(4xD1j2L*^^C9B}mc`XPq*p=3^-Wz;+4X z?Qg6BDAI|^#ZdEj02~<`^Sg95HcQnoc7W&=;+q?uA@PqcMEp@9J}$@g=+D%~Fp(WQ|q1NmSnMe^eDNb*ms9;3dqf zmwQ{#*o=m~&JQOuIV!gQa|N#+k&jHnhZA(h`imlw9liPx4>NH5pngHqQGO*r{5?(+ zbGI_8{4DN{!uTIlW8#nLaHR(5sJNcY?pb2J1! z={5@1eF zb67iISZn$4o^7lhosYE#V^>l~mw>e%nmTBaLqV(DC2ayH9Mo^c3BO!&f=qQho)hL^ z65>}UzPYD{RO$8ojg9FX`3YAJAV>=YU4gwjr+hjHa8i7`x}Jm`8TRA3Y?xU5qusBBATnMPJYZcOcRwQ~$F@eJTGFQU7$6{}NRJy+1a8u-CagyyoPC zJvP7U)$U1LAxnCG^u+>C&48ybRd{-6e$^iwSfKp<@X=mn=BMWA(airYBz>zh# zP@J-&^bG6#c5=_~uSfXpS@sN9&Kvk@XSbCnN7)%>x4q^WkFj-o8cWt^)5#tWABhL{ z;`0PAW}b7iIGaUEYD#VFskzs*b$erI88h;2`KXh9jLgydgC9=8M^i7z<*{@@;RB5HXFK3+O?vGS9}+up@WJ)Lqg$sF5}TvBJqEWy8*N86JOE5zD|29}oJ zFHQXX4a9`}{{1cJ=HO9(l?w~lC49Y^&E%Ox%O^0Sw+LD%t$^#z=_*{3E*lJJ9=pE&}pNFberkfo)?INA*c*K^Mwz<@?{X6k34k4at-A zN{t7E|3H@`HM-na(uJIj!#7G79?zr8Q33Bt=XmNir$|v(q9VDf%fvx&cD`^%%%{4Ynw~fu)k_*_1ZZ{4Q;FIU;Q@6bVn+($B>Ul;Irdxl5hD5B4^ypeB-mm_i5np>mPgDQV{*GjrG4#NORV= z%MsQ$BAznq?^{TqeMX>j)Ytx!KqqDWPd-D|e`@biD00SGf9^*;e-56F6-8Lhwf9ZNxUo%Knulx}T3f|zfhpG~cAeyOv*U5>E65%F2^u?{UH z;vpmADiQIXr4#X@Ktu3)2Ar&i-)S^Fg(z^TGz7j=@RLs?3YY+ zDk%xB?+qz39fUh&8VdSoxl#zeTu)gXHlnADjL(XmdT1dTA2Kq2jR1Ri>13Qfqk8J# zzJG0c%CWD-as?Ud6q1-7Dic;;uiIyZT*nuZ>$s8YIU?5+OD9)$M#**id;Tqx>)(l7 zr|balS-9wO4{P2oonk#A5lT`7=O?u+U-!%`%R`R)Lvr-SBzA2w{mf63^wtPzuG>mx zuTOxmq&Ypk4CCH~h}~<5T`t7lQ6g4Za%IqOSCX6rl@^H>8T6yNUQHHgq5CUBuRgt5 zkh^~BRE>*yx*q83> zd&m$AnFt9=#GaI|pF5VXPj_nX;r;)5n0g3P``!~-S?=a>^zd0zI`=Ll&b_R`zI4hK zci(4=yfxcx?ksDR7R`#Y()#2vw{#GzwNE$=UQE3{^wXzGpOc4dr>1mHY3daNIH)hU z?`bXBsax0k7t-T?6Bb)s{y-@#C)Gk{KQk?KL>nizbKPcram8sLl7wo@sNC z**I*S%~yumVxb`KZ(ywrzZjBdmL{<2w7axd=%k}YOO^?KGibrk+0u((=uAJ`WHJ7* z!{>YPuv0ei?rt(RtTc4m3{^99nY6%@wt~hkM@*dK>0#S*Ap97f5Yt8RwCs%H>Cl0H zAv_hk#lVa27K=_zD65@Ty>pDU9$h+Xv2y+lvev$z{TD)65rLh6wJcTbtYw!YtR*~! z4If;{BN$!g&%U|TMDLU%hsPG`w#SkoYq!{dGo3tcTcNa%)Eoh3j}~=sS#CSV!IdMh zyINqix2G=j`)s+6&GPJT2q^;=XH^T@2JALw%URe` zD}1q`4q%E&Hgv$EYdO%7(hr4>Jk|AR$KJRU{G5tIYMYV^Md&_fom*`^T5nai+{JfT zvQuo~ET7KR_x6=fcgt;9P5~d97d*XZ?9-#l*DNS|Ov$(fPY){< zy5Q;VJH|b|S91;v%I<&rxTkwG5wxJ}OI)9-qDx$zs-h=Yo2o-u7GIfaTk(^uzBH9{ z1B$K5cWR|)fuHi}6Iyp&JeAlsXV#$BI8bK=3pNoH{Xw4lZ^ki;x?ha#?3`qiETdpa zY$Lz!d6H6;hq?;c*oNID6lC*%uhFeGnCm%oF)Aat51p~+Q3?r2m11a00svX zc0|A+RUys^(2`PCWNX18ZjKHG;7UFYXAsci$Q$)%FKeZB5`jO{FXf}|4xkUC@gob8 z>bL?MBd}FKfv^ImP%iF˃IvNaVPCpfdpOIJkJW& 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 literal 0 HcmV?d00001 diff --git a/test-components/outbound-redis/src/lib.rs b/test-components/outbound-redis/src/lib.rs new file mode 100644 index 0000000000..ec449d2bb6 --- /dev/null +++ b/test-components/outbound-redis/src/lib.rs @@ -0,0 +1,126 @@ +use helper::{ensure, ensure_eq, ensure_ok, ensure_some}; + +const REDIS_ADDRESS_ENV: &str = "REDIS_ADDRESS"; + +use bindings::fermyon::spin2_0_0::redis; + +helper::define_component!(Component); + +impl Component { + fn main() -> Result<(), String> { + let address = ensure_ok!(std::env::var(REDIS_ADDRESS_ENV)); + let connection = ensure_ok!(redis::Connection::open(&address)); + + ensure_ok!(connection.set("spin-example-get-set", &b"Eureka!".to_vec())); + + let payload = ensure_some!(ensure_ok!(connection.get("spin-example-get-set"))); + + ensure_eq!(String::from_utf8_lossy(&payload), "Eureka!"); + + ensure_ok!(connection.set("spin-example-incr", &b"0".to_vec())); + + let int_value = ensure_ok!(connection.incr("spin-example-incr")); + + ensure_eq!(int_value, 1); + + let keys = vec!["spin-example-get-set".into(), "spin-example-incr".into()]; + + let del_keys = ensure_ok!(connection.del(&keys)); + + ensure_eq!(del_keys, 2); + + ensure_ok!(connection.execute( + "set", + &[ + redis::RedisParameter::Binary(b"spin-example".to_vec()), + redis::RedisParameter::Binary(b"Eureka!".to_vec()), + ], + )); + + ensure_ok!(connection.execute( + "append", + &[ + redis::RedisParameter::Binary(b"spin-example".to_vec()), + redis::RedisParameter::Binary(b" I've got it!".to_vec()), + ], + )); + + let values = ensure_ok!(connection.execute( + "get", + &[redis::RedisParameter::Binary(b"spin-example".to_vec())] + )); + + ensure!(matches!( + values.as_slice(), + &[redis::RedisResult::Binary(ref b)] if b == b"Eureka! I've got it!" + )); + + ensure_ok!(connection.execute( + "set", + &[ + redis::RedisParameter::Binary(b"int-key".to_vec()), + redis::RedisParameter::Int64(0), + ], + )); + + let values = ensure_ok!(connection.execute( + "incr", + &[redis::RedisParameter::Binary(b"int-key".to_vec())] + )); + + ensure!(matches!(values.as_slice(), &[redis::RedisResult::Int64(1)])); + + let values = ensure_ok!( + connection.execute("get", &[redis::RedisParameter::Binary(b"int-key".to_vec())]) + ); + + ensure!(matches!( + values.as_slice(), + &[redis::RedisResult::Binary(ref b)] if b == b"1" + )); + + ensure_ok!(connection.execute("del", &[redis::RedisParameter::Binary(b"foo".to_vec())])); + + ensure_ok!(connection.execute( + "sadd", + &[ + redis::RedisParameter::Binary(b"foo".to_vec()), + redis::RedisParameter::Binary(b"bar".to_vec()), + redis::RedisParameter::Binary(b"baz".to_vec()), + ], + )); + + let values = ensure_ok!(connection.execute( + "smembers", + &[redis::RedisParameter::Binary(b"foo".to_vec())], + )); + + ensure!(matches!( + values.as_slice(), + &[ + redis::RedisResult::Binary(ref bar), + redis::RedisResult::Binary(ref baz) + ] if bar == b"bar" && baz == b"baz" + )); + + ensure_ok!(connection.execute( + "srem", + &[ + redis::RedisParameter::Binary(b"foo".to_vec()), + redis::RedisParameter::Binary(b"baz".to_vec()), + ], + )); + + let values = ensure_ok!(connection.execute( + "smembers", + &[redis::RedisParameter::Binary(b"foo".to_vec())] + )); + + ensure!(matches!( + values.as_slice(), + &[redis::RedisResult::Binary(ref bar)] if bar == b"bar" + )); + + Ok(()) + } +} diff --git a/tests/runtime-tests/src/lib.rs b/tests/runtime-tests/src/lib.rs index eb92ff36c9..9f05c92c24 100644 --- a/tests/runtime-tests/src/lib.rs +++ b/tests/runtime-tests/src/lib.rs @@ -147,7 +147,7 @@ fn copy_manifest( let mut table = manifest .parse::() .context("could not parse the manifest as toml")?; - for component in table["component"].as_array_mut().with_context(|| { + for (_, component) in table["component"].as_table_mut().with_context(|| { format!( "malformed manifest '{}' does not contain 'component' array", manifest_path.display(), diff --git a/tests/runtime-tests/tests/outbound-mysql/spin.toml b/tests/runtime-tests/tests/outbound-mysql/spin.toml index b0a51db0b0..efe39c7355 100644 --- a/tests/runtime-tests/tests/outbound-mysql/spin.toml +++ b/tests/runtime-tests/tests/outbound-mysql/spin.toml @@ -1,13 +1,15 @@ -spin_version = "1" -authors = ["Fermyon Engineering "] +spin_manifest_version = 2 + +[application] name = "outbound-mysql" -trigger = { type = "http" } +authors = ["Fermyon Engineering "] version = "0.1.0" -[[component]] -id = "outbound-mysql" +[[trigger.http]] +route = "/" +component = "test" + +[component.test] source = "{{outbound-mysql}}" allowed_outbound_hosts = ["mysql://mysql:3306"] environment = { DB_URL = "mysql://spin:spin@mysql:3306/spin_dev" } -[component.trigger] -route = "/..." diff --git a/tests/runtime-tests/tests/outbound-redis/spin.toml b/tests/runtime-tests/tests/outbound-redis/spin.toml new file mode 100644 index 0000000000..6fe542ba65 --- /dev/null +++ b/tests/runtime-tests/tests/outbound-redis/spin.toml @@ -0,0 +1,15 @@ +spin_manifest_version = 2 + +[application] +name = "outbound-redis" +authors = ["Fermyon Engineering "] +version = "0.1.0" + +[[trigger.http]] +route = "/" +component = "test" + +[component.test] +source = "{{outbound-redis}}" +environment = { REDIS_ADDRESS = "redis://redis:6379" } +allowed_outbound_hosts = ["redis://redis:6379"] diff --git a/tests/runtime-tests/tests/sqlite-no-permission/spin.toml b/tests/runtime-tests/tests/sqlite-no-permission/spin.toml index 62d484e863..3923d9d23d 100644 --- a/tests/runtime-tests/tests/sqlite-no-permission/spin.toml +++ b/tests/runtime-tests/tests/sqlite-no-permission/spin.toml @@ -1,13 +1,14 @@ -spin_manifest_version = "1" -authors = ["Ryan Levick "] -description = "" +spin_manifest_version = 2 + +[application] name = "sqlite" -trigger = { type = "http", base = "/" } +authors = ["Ryan Levick "] version = "0.1.0" -[[component]] +[[trigger.http]] +route = "/" +component = "test" + +[component.sqlite] id = "sqlite" source = "{{sqlite}}" -allowed_http_hosts = [] -[component.trigger] -route = "/..." diff --git a/tests/runtime-tests/tests/sqlite/spin.toml b/tests/runtime-tests/tests/sqlite/spin.toml index d7e6189d90..beff28bb4a 100644 --- a/tests/runtime-tests/tests/sqlite/spin.toml +++ b/tests/runtime-tests/tests/sqlite/spin.toml @@ -1,14 +1,14 @@ -spin_manifest_version = "1" -authors = ["Ryan Levick "] -description = "" +spin_manifest_version = 2 + +[application] name = "sqlite" -trigger = { type = "http", base = "/" } +authors = ["Ryan Levick "] version = "0.1.0" -[[component]] -id = "sqlite" +[[trigger.http]] +route = "/" +component = "test" + +[component.test] source = "{{sqlite}}" sqlite_databases = ["default"] -allowed_http_hosts = [] -[component.trigger] -route = "/..." From d9ce644ba1ea0c01f0a43234f71506363f164e8d Mon Sep 17 00:00:00 2001 From: Ryan Levick Date: Wed, 29 Nov 2023 17:42:04 +0100 Subject: [PATCH 2/4] Remove the now redundant outbound redis test Signed-off-by: Ryan Levick --- Cargo.toml | 5 +- Makefile | 4 - build.rs | 2 - tests/integration.rs | 24 - .../.cargo/config.toml | 2 - .../http-rust-outbound-redis/Cargo.lock | 587 ------------------ .../http-rust-outbound-redis/Cargo.toml | 20 - .../http-rust-outbound-redis/spin.toml | 15 - .../http-rust-outbound-redis/src/lib.rs | 146 ----- 9 files changed, 2 insertions(+), 803 deletions(-) delete mode 100644 tests/outbound-redis/http-rust-outbound-redis/.cargo/config.toml delete mode 100644 tests/outbound-redis/http-rust-outbound-redis/Cargo.lock delete mode 100644 tests/outbound-redis/http-rust-outbound-redis/Cargo.toml delete mode 100644 tests/outbound-redis/http-rust-outbound-redis/spin.toml delete mode 100644 tests/outbound-redis/http-rust-outbound-redis/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 7dba64d8ca..e655392420 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -100,10 +100,9 @@ vergen = { version = "^8.2.1", default-features = false, features = [ [features] default = ["llm"] -all-tests = ["e2e-tests", "outbound-redis-tests", "config-provider-tests"] +all-tests = ["e2e-tests", "config-provider-tests"] config-provider-tests = [] e2e-tests = [] -outbound-redis-tests = [] llm = ["spin-trigger-http/llm"] llm-metal = ["llm", "spin-trigger-http/llm-metal"] llm-cublas = ["llm", "spin-trigger-http/llm-cublas"] @@ -119,7 +118,7 @@ reqwest = { version = "0.11", features = ["stream"] } tracing = { version = "0.1", features = ["log"] } wasi-common-preview1 = { version = "15.0.0", package = "wasi-common" } -wasmtime = { version = "15.0.0" , features = ["component-model"] } +wasmtime = { version = "15.0.0", features = ["component-model"] } wasmtime-wasi = { version = "15.0.0", features = ["tokio"] } wasmtime-wasi-http = "15.0.0" diff --git a/Makefile b/Makefile index 449d2e7e72..0942758bb2 100644 --- a/Makefile +++ b/Makefile @@ -113,10 +113,6 @@ test-kv: build test-sqlite: build PATH=$$(pwd)/target/release:$$PATH RUST_LOG=$(LOG_LEVEL) cargo test --test spinup_tests --features e2e-tests --no-fail-fast -- spinup_tests::sqlite --nocapture -.PHONY: test-outbound-redis -test-outbound-redis: - RUST_LOG=$(LOG_LEVEL) cargo test --test integration --features outbound-redis-tests --no-fail-fast -- --nocapture - .PHONY: test-config-provider test-config-provider: RUST_LOG=$(LOG_LEVEL) cargo test --test integration --features config-provider-tests --no-fail-fast -- integration_tests::config_provider_tests --nocapture diff --git a/build.rs b/build.rs index ec5ebbec6b..cf74bb2add 100644 --- a/build.rs +++ b/build.rs @@ -10,7 +10,6 @@ use cargo_target_dep::build_target_dep; const RUST_HTTP_INTEGRATION_TEST: &str = "tests/http/simple-spin-rust"; const RUST_HTTP_INTEGRATION_ENV_TEST: &str = "tests/http/headers-env-routes-test"; const RUST_HTTP_VAULT_VARIABLES_TEST: &str = "tests/http/vault-variables-test"; -const RUST_OUTBOUND_REDIS_INTEGRATION_TEST: &str = "tests/outbound-redis/http-rust-outbound-redis"; const TIMER_TRIGGER_INTEGRATION_TEST: &str = "examples/spin-timer/app-example"; const WASI_HTTP_INTEGRATION_TEST: &str = "examples/wasi-http-rust-streaming-outgoing-body"; const OUTBOUND_HTTP_POST_INTEGRATION_TEST: &str = "examples/http-rust-outbound-post"; @@ -90,7 +89,6 @@ error: the `wasm32-wasi` target is not installed cargo_build(RUST_HTTP_INTEGRATION_TEST); cargo_build(RUST_HTTP_INTEGRATION_ENV_TEST); cargo_build(RUST_HTTP_VAULT_VARIABLES_TEST); - cargo_build(RUST_OUTBOUND_REDIS_INTEGRATION_TEST); cargo_build(TIMER_TRIGGER_INTEGRATION_TEST); cargo_build(WASI_HTTP_INTEGRATION_TEST); cargo_build(OUTBOUND_HTTP_POST_INTEGRATION_TEST); diff --git a/tests/integration.rs b/tests/integration.rs index d7c07bb729..1e0ea6ea7b 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -43,30 +43,6 @@ mod integration_tests { } } - #[cfg(feature = "outbound-redis-tests")] - mod outbound_redis_tests { - use super::*; - - const RUST_OUTBOUND_REDIS_INTEGRATION_TEST: &str = - "tests/outbound-redis/http-rust-outbound-redis"; - - #[tokio::test] - async fn test_outbound_redis_rust_local() -> Result<()> { - let s = SpinTestController::with_manifest( - &format!( - "{}/{}", - RUST_OUTBOUND_REDIS_INTEGRATION_TEST, DEFAULT_MANIFEST_LOCATION - ), - &[], - &[], - ) - .await?; - - assert_status(&s, "/test", 204).await?; - Ok(()) - } - } - #[tokio::test] async fn test_simple_rust_local() -> Result<()> { let s = SpinTestController::with_manifest( diff --git a/tests/outbound-redis/http-rust-outbound-redis/.cargo/config.toml b/tests/outbound-redis/http-rust-outbound-redis/.cargo/config.toml deleted file mode 100644 index 6b77899cb3..0000000000 --- a/tests/outbound-redis/http-rust-outbound-redis/.cargo/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -[build] -target = "wasm32-wasi" diff --git a/tests/outbound-redis/http-rust-outbound-redis/Cargo.lock b/tests/outbound-redis/http-rust-outbound-redis/Cargo.lock deleted file mode 100644 index f152a989f6..0000000000 --- a/tests/outbound-redis/http-rust-outbound-redis/Cargo.lock +++ /dev/null @@ -1,587 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "anyhow" -version = "1.0.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" - -[[package]] -name = "async-trait" -version = "0.1.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "bitflags" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "hashbrown" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-rust-outbound-redis" -version = "0.1.0" -dependencies = [ - "anyhow", - "bytes", - "http", - "spin-sdk", -] - -[[package]] -name = "id-arena" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" - -[[package]] -name = "indexmap" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" -dependencies = [ - "equivalent", - "hashbrown", - "serde", -] - -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "leb128" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "memchr" -version = "2.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "proc-macro2" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "routefinder" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f8f99b10dedd317514253dda1fa7c14e344aac96e1f78149a64879ce282aca" -dependencies = [ - "smartcow", - "smartstring", -] - -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "semver" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" - -[[package]] -name = "serde" -version = "1.0.189" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.189" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "serde_json" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" - -[[package]] -name = "smartcow" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "656fcb1c1fca8c4655372134ce87d8afdf5ec5949ebabe8d314be0141d8b5da2" -dependencies = [ - "smartstring", -] - -[[package]] -name = "smartstring" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" -dependencies = [ - "autocfg", - "static_assertions", - "version_check", -] - -[[package]] -name = "spdx" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b19b32ed6d899ab23174302ff105c1577e45a06b08d4fe0a9dd13ce804bbbf71" -dependencies = [ - "smallvec", -] - -[[package]] -name = "spin-macro" -version = "0.1.0" -dependencies = [ - "anyhow", - "bytes", - "http", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "spin-sdk" -version = "2.1.0-pre0" -dependencies = [ - "anyhow", - "async-trait", - "bytes", - "form_urlencoded", - "futures", - "http", - "once_cell", - "routefinder", - "serde", - "serde_json", - "spin-macro", - "thiserror", - "wit-bindgen", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-segmentation" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasm-encoder" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca90ba1b5b0a70d3d49473c5579951f3bddc78d47b59256d2f9d4922b150aca" -dependencies = [ - "leb128", -] - -[[package]] -name = "wasm-metadata" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14abc161bfda5b519aa229758b68f2a52b45a12b993808665c857d1a9a00223c" -dependencies = [ - "anyhow", - "indexmap", - "serde", - "serde_derive", - "serde_json", - "spdx", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.115.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e06c0641a4add879ba71ccb3a1e4278fd546f76f1eafb21d8f7b07733b547cd5" -dependencies = [ - "indexmap", - "semver", -] - -[[package]] -name = "wit-bindgen" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d92ce0ca6b6074059413a9581a637550c3a740581c854f9847ec293c8aed71" -dependencies = [ - "bitflags", - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "565b945ae074886071eccf9cdaf8ccd7b959c2b0d624095bea5fe62003e8b3e0" -dependencies = [ - "anyhow", - "wit-component", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5695ff4e41873ed9ce56d2787e6b5772bdad9e70e2c1d2d160621d1762257f4f" -dependencies = [ - "anyhow", - "heck", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91835ea4231da1fe7971679d505ba14be7826e192b6357f08465866ef482e08" -dependencies = [ - "anyhow", - "proc-macro2", - "quote", - "syn 2.0.38", - "wit-bindgen-core", - "wit-bindgen-rust", - "wit-component", -] - -[[package]] -name = "wit-component" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87488b57a08e2cbbd076b325acbe7f8666965af174d69d5929cd373bd54547f" -dependencies = [ - "anyhow", - "bitflags", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ace9943d89bbf3dbbc71b966da0e7302057b311f36a4ac3d65ddfef17b52cf" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", -] diff --git a/tests/outbound-redis/http-rust-outbound-redis/Cargo.toml b/tests/outbound-redis/http-rust-outbound-redis/Cargo.toml deleted file mode 100644 index 6281b8c5e6..0000000000 --- a/tests/outbound-redis/http-rust-outbound-redis/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "http-rust-outbound-redis" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = [ "cdylib" ] - -[dependencies] -# Useful crate to handle errors. -anyhow = "1" -# Crate to simplify working with bytes. -bytes = "1" -# General-purpose crate with common HTTP types. -http = "0.2" -# The Spin SDK. -spin-sdk = { path = "../../../sdk/rust" } - - -[workspace] diff --git a/tests/outbound-redis/http-rust-outbound-redis/spin.toml b/tests/outbound-redis/http-rust-outbound-redis/spin.toml deleted file mode 100644 index 5454cc71ca..0000000000 --- a/tests/outbound-redis/http-rust-outbound-redis/spin.toml +++ /dev/null @@ -1,15 +0,0 @@ -spin_version = "1" -authors = ["Fermyon Engineering "] -name = "rust-outbound-redis-example" -trigger = { type = "http" } -version = "0.1.0" - -[[component]] -environment = { REDIS_ADDRESS = "redis://127.0.0.1:6379" } -id = "outbound-redis" -source = "target/wasm32-wasi/release/http_rust_outbound_redis.wasm" -[component.trigger] -route = "/test" -[component.build] -command = "cargo build --target wasm32-wasi --release" - diff --git a/tests/outbound-redis/http-rust-outbound-redis/src/lib.rs b/tests/outbound-redis/http-rust-outbound-redis/src/lib.rs deleted file mode 100644 index 45342f4ca7..0000000000 --- a/tests/outbound-redis/http-rust-outbound-redis/src/lib.rs +++ /dev/null @@ -1,146 +0,0 @@ -use anyhow::{anyhow, Context, Result}; -use spin_sdk::{ - http_component, - redis::{self, RedisParameter, RedisResult}, -}; -use std::collections::HashSet; - -const REDIS_ADDRESS_ENV: &str = "REDIS_ADDRESS"; - -#[http_component] -fn test(_req: http::Request<()>) -> Result> { - let address = std::env::var(REDIS_ADDRESS_ENV)?; - let connection = redis::Connection::open(&address)?; - - connection - .set("spin-example-get-set", &b"Eureka!".to_vec()) - .map_err(|_| anyhow!("Error executing Redis set command"))?; - - let payload = connection - .get("spin-example-get-set") - .map_err(|_| anyhow!("Error querying Redis"))? - .context("no value found for key 'spin-example-get-set'")?; - - assert_eq!(std::str::from_utf8(&payload)?, "Eureka!"); - - connection - .set("spin-example-incr", &b"0".to_vec()) - .map_err(|_| anyhow!("Error querying Redis set command"))?; - - let int_value = connection - .incr("spin-example-incr") - .map_err(|_| anyhow!("Error executing Redis incr command"))?; - - assert_eq!(int_value, 1); - - let keys = vec!["spin-example-get-set".into(), "spin-example-incr".into()]; - - let del_keys = connection - .del(&keys) - .map_err(|_| anyhow!("Error executing Redis incr command"))?; - - assert_eq!(del_keys, 2); - - connection - .execute( - "set", - &[ - RedisParameter::Binary(b"spin-example".to_vec()), - RedisParameter::Binary(b"Eureka!".to_vec()), - ], - ) - .map_err(|_| anyhow!("Error executing Redis set command"))?; - - connection - .execute( - "append", - &[ - RedisParameter::Binary(b"spin-example".to_vec()), - RedisParameter::Binary(b" I've got it!".to_vec()), - ], - ) - .map_err(|_| anyhow!("Error executing Redis append command via `execute`"))?; - - let values = connection - .execute("get", &[RedisParameter::Binary(b"spin-example".to_vec())]) - .map_err(|_| anyhow!("Error executing Redis get command via `execute`"))?; - - assert_eq!( - values, - &[RedisResult::Binary(b"Eureka! I've got it!".to_vec())] - ); - - connection - .execute( - "set", - &[ - RedisParameter::Binary(b"int-key".to_vec()), - RedisParameter::Int64(0), - ], - ) - .map_err(|_| anyhow!("Error executing Redis set command via `execute`"))?; - - let values = connection - .execute("incr", &[RedisParameter::Binary(b"int-key".to_vec())]) - .map_err(|_| anyhow!("Error executing Redis incr command via `execute`"))?; - - assert_eq!(values, &[RedisResult::Int64(1)]); - - let values = connection - .execute("get", &[RedisParameter::Binary(b"int-key".to_vec())]) - .map_err(|_| anyhow!("Error executing Redis get command via `execute`"))?; - - assert_eq!(values, &[RedisResult::Binary(b"1".to_vec())]); - - connection - .execute("del", &[RedisParameter::Binary(b"foo".to_vec())]) - .map_err(|_| anyhow!("Error executing Redis del command via `execute`"))?; - - connection - .execute( - "sadd", - &[ - RedisParameter::Binary(b"foo".to_vec()), - RedisParameter::Binary(b"bar".to_vec()), - RedisParameter::Binary(b"baz".to_vec()), - ], - ) - .map_err(|_| anyhow!("Error executing Redis sadd command via `execute`"))?; - - let values = connection - .execute("smembers", &[RedisParameter::Binary(b"foo".to_vec())]) - .map_err(|_| anyhow!("Error executing Redis smembers command via `execute`"))?; - - assert_eq!( - values.into_iter().collect::>(), - [ - RedisResult::Binary(b"bar".to_vec()), - RedisResult::Binary(b"baz".to_vec()) - ] - .into_iter() - .collect::>() - ); - - connection - .execute( - "srem", - &[ - RedisParameter::Binary(b"foo".to_vec()), - RedisParameter::Binary(b"baz".to_vec()), - ], - ) - .map_err(|_| anyhow!("Error executing Redis srem command via `execute`"))?; - - let values = connection - .execute("smembers", &[RedisParameter::Binary(b"foo".to_vec())]) - .map_err(|_| anyhow!("Error executing Redis smembers command via `execute`"))?; - - assert_eq!( - values.into_iter().collect::>(), - [RedisResult::Binary(b"bar".to_vec()),] - .into_iter() - .collect::>() - ); - - Ok(http::Response::builder().status(204).body(())?) -} From 628c9163e0376c4b2f0abc06bcc47ec94e8da93a Mon Sep 17 00:00:00 2001 From: Ryan Levick Date: Thu, 30 Nov 2023 10:21:31 +0100 Subject: [PATCH 3/4] Fix sqlite no permission runtime test and add more no permission tests Signed-off-by: Ryan Levick --- .../tests/outbound-mysql-no-permission/error.txt | 1 + .../tests/outbound-mysql-no-permission/spin.toml | 14 ++++++++++++++ .../tests/outbound-redis-no-permission/error.txt | 1 + .../tests/outbound-redis-no-permission/spin.toml | 14 ++++++++++++++ .../tests/sqlite-no-permission/spin.toml | 3 +-- 5 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 tests/runtime-tests/tests/outbound-mysql-no-permission/error.txt create mode 100644 tests/runtime-tests/tests/outbound-mysql-no-permission/spin.toml create mode 100644 tests/runtime-tests/tests/outbound-redis-no-permission/error.txt create mode 100644 tests/runtime-tests/tests/outbound-redis-no-permission/spin.toml diff --git a/tests/runtime-tests/tests/outbound-mysql-no-permission/error.txt b/tests/runtime-tests/tests/outbound-mysql-no-permission/error.txt new file mode 100644 index 0000000000..61bdfe4229 --- /dev/null +++ b/tests/runtime-tests/tests/outbound-mysql-no-permission/error.txt @@ -0,0 +1 @@ +Error::ConnectionFailed("address mysql://spin:spin@mysql:3306/spin_dev is not permitted") \ No newline at end of file diff --git a/tests/runtime-tests/tests/outbound-mysql-no-permission/spin.toml b/tests/runtime-tests/tests/outbound-mysql-no-permission/spin.toml new file mode 100644 index 0000000000..573b884a73 --- /dev/null +++ b/tests/runtime-tests/tests/outbound-mysql-no-permission/spin.toml @@ -0,0 +1,14 @@ +spin_manifest_version = 2 + +[application] +name = "outbound-mysql" +authors = ["Fermyon Engineering "] +version = "0.1.0" + +[[trigger.http]] +route = "/" +component = "test" + +[component.test] +source = "{{outbound-mysql}}" +environment = { DB_URL = "mysql://spin:spin@mysql:3306/spin_dev" } diff --git a/tests/runtime-tests/tests/outbound-redis-no-permission/error.txt b/tests/runtime-tests/tests/outbound-redis-no-permission/error.txt new file mode 100644 index 0000000000..bdb4a74a86 --- /dev/null +++ b/tests/runtime-tests/tests/outbound-redis-no-permission/error.txt @@ -0,0 +1 @@ +Error::InvalidAddress \ No newline at end of file diff --git a/tests/runtime-tests/tests/outbound-redis-no-permission/spin.toml b/tests/runtime-tests/tests/outbound-redis-no-permission/spin.toml new file mode 100644 index 0000000000..a8798c1bc9 --- /dev/null +++ b/tests/runtime-tests/tests/outbound-redis-no-permission/spin.toml @@ -0,0 +1,14 @@ +spin_manifest_version = 2 + +[application] +name = "outbound-redis" +authors = ["Fermyon Engineering "] +version = "0.1.0" + +[[trigger.http]] +route = "/" +component = "test" + +[component.test] +source = "{{outbound-redis}}" +environment = { REDIS_ADDRESS = "redis://redis:6379" } diff --git a/tests/runtime-tests/tests/sqlite-no-permission/spin.toml b/tests/runtime-tests/tests/sqlite-no-permission/spin.toml index 3923d9d23d..46cc46c5e8 100644 --- a/tests/runtime-tests/tests/sqlite-no-permission/spin.toml +++ b/tests/runtime-tests/tests/sqlite-no-permission/spin.toml @@ -9,6 +9,5 @@ version = "0.1.0" route = "/" component = "test" -[component.sqlite] -id = "sqlite" +[component.test] source = "{{sqlite}}" From ce14ad7506ccc1de0f332cf5fb44a5e7f7963c10 Mon Sep 17 00:00:00 2001 From: Ryan Levick Date: Mon, 4 Dec 2023 11:38:25 +0100 Subject: [PATCH 4/4] Run each runtime test on its own Signed-off-by: Ryan Levick --- test-components/Cargo.lock | 20 +------- test-components/helper/src/lib.rs | 2 +- test-components/outbound-mysql/component.wasm | Bin 152250 -> 153768 bytes test-components/outbound-redis/component.wasm | Bin 164323 -> 167673 bytes test-components/outbound-redis/src/lib.rs | 20 ++++---- test-components/sqlite/component.wasm | Bin 143928 -> 177161 bytes tests/runtime-tests/src/lib.rs | 24 +++++---- tests/runtime-tests/src/main.rs | 4 +- tests/runtime.rs | 46 +++++++++++++----- 9 files changed, 63 insertions(+), 53 deletions(-) diff --git a/test-components/Cargo.lock b/test-components/Cargo.lock index a556ee9f62..587c1fc92c 100644 --- a/test-components/Cargo.lock +++ b/test-components/Cargo.lock @@ -91,24 +91,6 @@ dependencies = [ "helper", ] -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "proc-macro2" version = "1.0.69" @@ -186,7 +168,7 @@ dependencies = [ ] [[package]] -name = "sqlite" +name = "sqlite-test-component" version = "0.1.0" dependencies = [ "helper", diff --git a/test-components/helper/src/lib.rs b/test-components/helper/src/lib.rs index 191c115061..9f21e29d71 100644 --- a/test-components/helper/src/lib.rs +++ b/test-components/helper/src/lib.rs @@ -137,7 +137,7 @@ macro_rules! ensure_some { macro_rules! ensure_matches { ($expr:expr, $($arg:tt)*) => { if !matches!($expr, $($arg)*) { - $crate::bail!("`{}` did not match `{}`", stringify!($expr), stringify!($($arg)*)) + $crate::bail!("`{:?}` did not match `{}`", $expr, stringify!($($arg)*)) } }; } diff --git a/test-components/outbound-mysql/component.wasm b/test-components/outbound-mysql/component.wasm index 5e2d2983a5c6681bd3cba5310adc3ad2b9157baf..879144d8a82052976657b11ab8cb7b9843453758 100755 GIT binary patch delta 20705 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 delta 19053 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 Q898z}!o)VYYdKH)e``WQ<^TWy delta 24242 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

c^2$=imq5Bp15m8={b^^<~S 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 jsPYbeqtHl)7H2bDGt~I#j1<-P9-wkhEHpIK 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 anyhow::Result<()> { +pub fn run_all(config: Config) -> anyhow::Result<()> { for test in std::fs::read_dir(&config.tests_path).with_context(|| { format!( "failed to read test directory '{}'", @@ -44,18 +44,24 @@ pub fn run(config: Config) -> anyhow::Result<()> { continue; } - log::info!("Testing: {}", test.path().display()); - let temp = temp_dir::TempDir::new() - .context("failed to produce a temporary directory to run the test in")?; - log::trace!("Temporary directory: {}", temp.path().display()); - copy_manifest(&test.path(), &config.components_path, &temp)?; - let spin = Spin::start(&config.spin_binary_path, temp.path())?; - log::debug!("Spin started on port {}.", spin.port()); - run_test(test.path().as_path(), spin, config.on_error) + bootstrap_and_run(&test.path(), &config)?; } Ok(()) } +/// Bootstrap and run a test at a path against the given config +pub fn bootstrap_and_run(test_path: &Path, config: &Config) -> Result<(), anyhow::Error> { + log::info!("Testing: {}", test_path.display()); + let temp = temp_dir::TempDir::new() + .context("failed to produce a temporary directory to run the test in")?; + log::trace!("Temporary directory: {}", temp.path().display()); + copy_manifest(test_path, &config.components_path, &temp)?; + let spin = Spin::start(&config.spin_binary_path, temp.path())?; + log::debug!("Spin started on port {}.", spin.port()); + run_test(test_path, spin, config.on_error); + Ok(()) +} + /// Run an individual test fn run_test(test_path: &Path, mut spin: Spin, on_error: OnTestError) { // macro which will look at `on_error` and do the right thing diff --git a/tests/runtime-tests/src/main.rs b/tests/runtime-tests/src/main.rs index aaf7ef7113..8a884a528a 100644 --- a/tests/runtime-tests/src/main.rs +++ b/tests/runtime-tests/src/main.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use runtime_tests::{run, Config, OnTestError}; +use runtime_tests::{run_all, Config, OnTestError}; fn main() -> anyhow::Result<()> { env_logger::init(); @@ -18,5 +18,5 @@ fn main() -> anyhow::Result<()> { components_path, on_error: OnTestError::Log, }; - run(config) + run_all(config) } diff --git a/tests/runtime.rs b/tests/runtime.rs index 321d1eb580..175dba12ac 100644 --- a/tests/runtime.rs +++ b/tests/runtime.rs @@ -1,17 +1,39 @@ #[cfg(feature = "e2e-tests")] -#[test] -fn runtime_tests() { +mod runtime_tests { use runtime_tests::Config; use std::path::PathBuf; - let spin_binary_path = env!("CARGO_BIN_EXE_spin").into(); - let tests_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/runtime-tests/tests"); - let components_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("test-components"); - let config = Config { - spin_binary_path, - tests_path, - components_path, - on_error: runtime_tests::OnTestError::Panic, - }; - runtime_tests::run(config).expect("failed to bootstrap runtime tests tests") + // TODO: write a proc macro that reads from the tests folder + // and creates tests for every subdirectory + macro_rules! test { + ($ident:ident, $path:literal) => { + #[test] + fn $ident() { + run($path) + } + }; + } + + test!(outbound_mysql, "outbound-mysql"); + test!(outbound_mysql_no_permission, "outbound-mysql-no-permission"); + test!(outbound_redis, "outbound-redis"); + test!(outbound_redis_no_permission, "outbound-redis-no-permission"); + test!(sqlite, "sqlite"); + test!(sqlite_no_permission, "sqlite-no-permission"); + + fn run(name: &str) { + let spin_binary_path = env!("CARGO_BIN_EXE_spin").into(); + let tests_path = + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/runtime-tests/tests"); + let components_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("test-components"); + let config = Config { + spin_binary_path, + tests_path, + components_path, + on_error: runtime_tests::OnTestError::Panic, + }; + let path = config.tests_path.join(name); + runtime_tests::bootstrap_and_run(&path, &config) + .expect("failed to bootstrap runtime tests tests"); + } }