From 377af5a15b2d1e775ce9cf287285feecdc71a2ef Mon Sep 17 00:00:00 2001 From: Volodymyr Shymanskyy Date: Sat, 21 Dec 2019 18:50:21 +0200 Subject: [PATCH] Add file read test --- test/run-wasi-test.py | 11 ++++++----- test/wasi/test-opt.wasm | Bin 26432 -> 27440 bytes test/wasi/test.c | 23 ++++++++++++++++++++++- test/wasi/test.wasm | Bin 32929 -> 34423 bytes 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/test/run-wasi-test.py b/test/run-wasi-test.py index d642499..d5d3a9f 100755 --- a/test/run-wasi-test.py +++ b/test/run-wasi-test.py @@ -4,7 +4,7 @@ # Usage: # ./run-wasi-test.py # ./run-wasi-test.py --exec ../custom_build/wasm3 --timeout 120 -# ./run-wasi-test.py --exec "wasmer run" +# ./run-wasi-test.py --exec "wasmer run --dir=." # import argparse @@ -63,13 +63,13 @@ commands = [ { "name": "Simple WASI test", "wasm": "./wasi/test.wasm", - "args": ["args", "test"], - "expect_pattern": "Hello world*Constructor OK*Args: *; args; test;*fib(20) = 6765*[* ms]*=== done ===*" + "args": ["cat", "./wasi/0.txt"], + "expect_pattern": "Hello world*Constructor OK*Args: *; cat; ./wasi/0.txt;*fib(20) = 6765*[* ms]*48 65 6c 6c 6f 20 77 6f 72 6c 64*=== done ===*" }, { "name": "Simple WASI test (wasm-opt -O3)", "wasm": "./wasi/test-opt.wasm", - "args": ["args", "test"], - "expect_pattern": "Hello world*Constructor OK*Args: *; args; test;*fib(20) = 6765*[* ms]*=== done ===*" + "args": ["cat", "./wasi/0.txt"], + "expect_pattern": "Hello world*Constructor OK*Args: *; cat; ./wasi/0.txt;*fib(20) = 6765*[* ms]*48 65 6c 6c 6f 20 77 6f 72 6c 64*=== done ===*" }, { "name": "mandelbrot", "wasm": "./benchmark/mandelbrot/mandel.wasm", @@ -97,6 +97,7 @@ commands = [ "wasm": "./benchmark/stream/stream.wasm", "expect_pattern": "----*Solution Validates:*on all three arrays*----*" }, { + # TODO "if": { "file_exists": "./self-hosting/wasm3-fib.wasm" }, "name": "Self-hosting", "wasm": "./self-hosting/wasm3-fib.wasm", "expect_pattern": "wasm3 on WASM*Result: 832040*Elapsed: * ms*" diff --git a/test/wasi/test-opt.wasm b/test/wasi/test-opt.wasm index 443a9a0203fa153761bdb45592c25c223ae544c7..db11c803a41a1d684add492d19080f0157aa1293 100644 GIT binary patch delta 6242 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 delta 5111 zcmb7Ie{fV+y+7yNyFc%4as$aGyEn<6dy~K};b#Z|%C9}C34s6+lyx{B%rI;B}6Hlk@AJsBboubv2nRHsTRio`pQLDx=eS;(K89O+lb}Du1dswH%&-dO9 z4RrL)%fR{d{c*nM`}^*h|KyWD=NUG5^dM)9@meIMIz?LTz)&|QZQ?fK~b5yr<~1C~zm28;`MGmq;Y zp3`6D)!6Uh4V~h8;`m*Ihi*T7Frd926ghDFo}>Hs4>L>8@XV(6MW!&h2#HWAggGok zI2JLvDGWm}fFL~+f<-vz2{Xj+vc)2tFQ4yPtuS~3dwWAw7FT3!k(vpDe6KE{_4*nx9(h) zpiGGoWftw4F2QJ@uxmWllVs{#7C>TDVMB;T#ek;H=^e(xc#Z25FuO*VjHdrM=cv(W z-e9W@rY0R#uB?5YlG(P)?3`pth@|XdE33BDi_ETLvlCF>*)%eV>joe;Q>CI^h3Ob3 zebs1QFcZbjF4`G&)`5h!lfiy@(XLgsc9n})D~XN1**sACGf-^;7lvDz^`a1>#E(H) zQ*781txSzYRU+Wx8TR4~iET?-Nuf?hyTo$!l_-{Ao>5OmRltkyFbf9s=_{{GNcA+~ z;LZ$QW)@wJ`$|QRC0WU`YzbIl*scY>$Qy;#hE1!S=<5;<>c>P$Pw|nIX~#Wg7Sv=` zlA0|wnj_Q#*nOL{I-0{jXt?{^Z@+wT`o6bLpJ&Iq`KLS+KxuZnqmQ}QA-(@!VR6X7 z)U&_*{C}~79$ke!pWX8=VG>;OVwZ@jXCb4Vv8(Mx5ORtY^-QRPPwDyLHN331g&UkJ zPSG=aA@-CbL+Y3mpEv@J32vzwT?((`=k>GU`<9d&i{wslu&BqRp@_=3p2`bdqdOS6 zwHX*LR~N~~E({0WTpA;uaioXt(yv51YA-r63>tObktWe5EH$lj(K{g7c=S#_qeX0- zPwV?*U*hG7*0{w1SZ>`4kw&d%fFH9yS#_Q+@VE@a+tfw9G|?IZJ3(wO>JKJv%3pK> zr#~Oe7Bm+vx-1d5)P-5ve$Zah-%q4t7aR!%GVEp&`QFnMLx7#3nN;#rw!5?%;BRHS z%jM(ca(R-`_HngMNNb!%5S8(c%M+MEn;# zRK0NDjQ=90AdX}M4!Ofjpmj?zM8N%7NuH#}kl$#&?5GmWZ#d91uAue9fo>7UOu;oV zl0%Z!u{^F_ySwgHN1dHThgE&DOZpzWmtW97u(SO)zyqrXo+C{eDXKLHB-k906-aDs zc}G&oT>}uj-W4!RzGf94(|c;h5|;v3hHI${`X4oob$$R)pupM5$>Hqkyk0zScM1}3 z&Pc;gu$~BF34!t8ydOE`W<(dBibEifHe@Kt)wF~77@7Z#Mv5&aN(fmXc>y&)x%-Z<$^ccy>#?`3Mre3!KDav2Sz5fy2CSDe;=&HM(*=jToX z^3flh7yayp3`5FwO;{qxZ8B7`!Ap%DF&Nx`%6T1W`cPfqL*|ww-YNymha`GY-_zt) z{J@kjc*5h?{NTx^zz@udADDCALw<0w`CcT#>gwJAP}C&AgE8~d*)!aUO%5*vx?#=vf1}|2#~R$&q|dDybhIu2bDq)EI`%E z}R(XX{++B;ATtPi6&3F<0>77Xl1W1#Iu zOu@zNuqU8|NxibQp#Q$`po8uT&V>YR&-dV9unJk!o@c2S^k;JEwJG&Nkp6I(vfko6 zMD3j%_DnP^FHl0VQ>x^K1>%s}H2=sGc1r&$m&?xgj2`easBb_OhexP}kJ&5GU{D`8 zPiOLZzD&O-FC!?!zFfn3X{Au&Q^=iR$nZeElTYfO<`-{l^5Ykc(^myIN|I5cE$1P? z>})$OO4^mmkw4o=#COr@OZv>N1^R=Fe%f}4WJVtes!Lfll_dw8%DMt|Oi&|*5JLv+ zZ*Pmu#86iKzTuPY_m`R#L#L(2av*mN^%BjBZS#-d`+KO%u%LQyQO^;OZg?(-9))f= zoeLcHRIc0aNYDCgOm!A572tHuDLP7GQNks5KFKo{78G6T953#}gmwqxDPFXjEf-nO zBuoV<)ET0!VJt&8`WJ$+pB3M^I5_{Be=$>EtKc!zPAfxv#wK1{oaVfJBD&Nt_$i%O zag=9udBs!wgkIJ01jdUU%aAl`S1!f+=9S$TPpsV3cp^nrrCOEkBX}`)qzg zBHDrzdf}?Wyi-58>HzQ1Z?9U;+x4=p0>(SL+?GzDhl^fVhWg2MmoT`eA44&;ztk|; z?fR*%O`zO3kk-l7^`JXE(5APpcCb3Iy3jc0T>pYvrRhXH;HYu^qt&;8v}Pk+s@Bq_ zUs}`9*^V|I(p$k*>TyRs>Bt)FROoIm?5IZ_^%%NAN4Cn=eU37GDSor2b1tjKcBG*y z8KwVQ9XCWmw91%zRTS;6iLb1^oBG4rbr(SM`Z~JaTVF^K&73zTWYTAS&-!IPT3Y{b zJw5Q(>kFA1P-ALJ6lL5;U%6qyTuE-^I#1U4XusP)T<5%f;C$-;sf~YoP5K(l(V0 zwj&u&#Hi-R;bh1AZ-c}Cw!c1|g~5>Q6aJScdK%S$mJCTLtE;yWG(^zaYtY;*bdwK_ z5VY|cbj>XE@V0vJ|J=5Y6x!oPih9!m?{kRifcY=B4M8!Nx2N^4?Id||`@8IIR}470 zogR64JDI`VLHgUbgG~DNsJ0b+7^pb%}( zzy%SP`k8?rL@uY*Xx?`9r{DXjz9~u?D&C9y?&lAW1=%V%K=q(+Gln^S6T_FZ?OFKI zqJ%_-Gkdv5UvFq%?8RE`Z0hjyoQIzYBuB(krbAAn3#1n2h5&V%k>{y`e*)LUvFWo)}5EMb9m5F1J0M%7pfFZ8`dvHbd zh7B9!?S~KTmsl`0K2g~B`7p}IOLsJZ&7baA5PLmk@hYa?OzHGcWAyQQizk?RMsFC( z#D0&B&D87ldhbv=`bdMt=P~uT{>)HI<0}nTRfeIYWoX1-j47SAcr8^k>+l znEJJTW#|zk%6p6Jj@kf@h0&@KAU5#-N;L)(KNsb!7{`+S;&@u#ih #include +#include +#include + /* * Helpers */ @@ -105,6 +108,20 @@ void test_perf_fib(uint32_t n) { printf("%d [%.3f ms]\n", result, fms); } +void test_cat(char* fn) { + int file = open(fn, O_RDONLY); + if (file >= 0) { + char c = 0; + while (read(file, &c, sizeof(c)) > 0) { + printf("%02x ", c); + } + close(file); + puts(""); + } else { + printf("Cannot open %s\n", fn); + } +} + /* * Main */ @@ -116,9 +133,13 @@ int main(int argc, char **argv) test_printf(); test_args(argc, argv); test_gettime(); - test_random(); + //test_random(); test_perf_fib(20); + if (0 == strcmp(argv[1], "cat")) { + test_cat(argv[2]); + } + puts("=== done ==="); return 0; } diff --git a/test/wasi/test.wasm b/test/wasi/test.wasm index a299332a51e12566b94a79f536a62fa93fc14fc2..e5167401d4d20b15d1a851de9d8e265378a29095 100755 GIT binary patch delta 7568 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