~ trap on "wasi_snapshot_preview1" APIs which allow to run wasi tests as is
diff --git a/libraries/kotlin.test/wasm/wasi/src/main/kotlin/kotlin/test/TeamcityAdapter.kt b/libraries/kotlin.test/wasm/wasi/src/main/kotlin/kotlin/test/TeamcityAdapter.kt
index 5091893..520b3c8 100644
--- a/libraries/kotlin.test/wasm/wasi/src/main/kotlin/kotlin/test/TeamcityAdapter.kt
+++ b/libraries/kotlin.test/wasm/wasi/src/main/kotlin/kotlin/test/TeamcityAdapter.kt
@@ -14,20 +14,20 @@
  * `args_sizes_get`. Each argument is expected to be `\0` terminated.
  */
 @ExperimentalWasmInterop
-//@WasmImport("wasi_snapshot_preview1", "args_get")
-private fun wasiRawArgsGet(
+@WasmImport("wasi_snapshot_preview1", "args_get")
+private external fun wasiRawArgsGet(
     argvPtr: Int,
     argvBuf: Int,
-): Int = TODO()
+): Int
 
 
 /** Return command-line argument data sizes. */
 @ExperimentalWasmInterop
-//@WasmImport("wasi_snapshot_preview1", "args_sizes_get")
-private fun wasiRawArgsSizesGet(
+@WasmImport("wasi_snapshot_preview1", "args_sizes_get")
+private external fun wasiRawArgsSizesGet(
     argumentNumberPtr: Int,
     argumentStringSizePtr: Int,
-): Int = TODO()
+): Int
 
 @OptIn(UnsafeWasmMemoryApi::class, ExperimentalWasmInterop::class)
 internal actual fun getArguments(): List<String> = withScopedMemoryAllocator { allocator ->
diff --git a/libraries/stdlib/wasm/wasi/src/kotlin/io.kt b/libraries/stdlib/wasm/wasi/src/kotlin/io.kt
index 2cbd588..d998c43 100644
--- a/libraries/stdlib/wasm/wasi/src/kotlin/io.kt
+++ b/libraries/stdlib/wasm/wasi/src/kotlin/io.kt
@@ -19,8 +19,8 @@
  * Write to a file descriptor. Note: This is similar to `writev` in POSIX.
  */
 @ExperimentalWasmInterop
-//@WasmImport("wasi_snapshot_preview1", "fd_write")
-private fun wasiRawFdWrite(descriptor: Int, scatterPtr: Int, scatterSize: Int, errorPtr: Int): Int = TODO()
+@WasmImport("wasi_snapshot_preview1", "fd_write")
+private external fun wasiRawFdWrite(descriptor: Int, scatterPtr: Int, scatterSize: Int, errorPtr: Int): Int
 
 @OptIn(ExperimentalWasmInterop::class)
 internal fun wasiPrintImpl(
diff --git a/libraries/stdlib/wasm/wasi/src/kotlin/random/PlatformRandom.kt b/libraries/stdlib/wasm/wasi/src/kotlin/random/PlatformRandom.kt
index cf93883..cf8d3e1 100644
--- a/libraries/stdlib/wasm/wasi/src/kotlin/random/PlatformRandom.kt
+++ b/libraries/stdlib/wasm/wasi/src/kotlin/random/PlatformRandom.kt
@@ -18,8 +18,8 @@
  * seed a pseudo-random number generator, rather than to provide the random data directly.
  */
 @ExperimentalWasmInterop
-//@WasmImport("wasi_snapshot_preview1", "random_get")
-internal fun wasiRawRandomGet(address: Int, size: Int): Int = TODO()
+@WasmImport("wasi_snapshot_preview1", "random_get")
+internal external fun wasiRawRandomGet(address: Int, size: Int): Int
 
 @OptIn(ExperimentalWasmInterop::class)
 private fun wasiRandomGet(): Long {
diff --git a/libraries/stdlib/wasm/wasi/src/kotlin/time/TimeSources.kt b/libraries/stdlib/wasm/wasi/src/kotlin/time/TimeSources.kt
index 8fa450c..8e61633 100644
--- a/libraries/stdlib/wasm/wasi/src/kotlin/time/TimeSources.kt
+++ b/libraries/stdlib/wasm/wasi/src/kotlin/time/TimeSources.kt
@@ -29,8 +29,8 @@
  * Return the time value of a clock. Note: This is similar to `clock_gettime` in POSIX.
  */
 @ExperimentalWasmInterop
-//@WasmImport("wasi_snapshot_preview1", "clock_time_get")
-private fun wasiRawClockTimeGet(clockId: Int, precision: Long, resultPtr: Int): Int = TODO()
+@WasmImport("wasi_snapshot_preview1", "clock_time_get")
+private external fun wasiRawClockTimeGet(clockId: Int, precision: Long, resultPtr: Int): Int
 
 /**
  * Returns timestamp of the given clock in nanoseconds.
diff --git a/wasm/wasm.tests/run.wast b/wasm/wasm.tests/run.wast
new file mode 100644
index 0000000..9b7eb72
--- /dev/null
+++ b/wasm/wasm.tests/run.wast
@@ -0,0 +1,43 @@
+(module
+    (func $print_i32 (import "spectest" "print_i32") (param i32))
+    
+    (func (export "fd_write") (param i32 i32 i32 i32) (result i32)
+        (i32.const 701)
+        (call $print_i32)
+        (i32.const 11)
+        (unreachable)
+    )
+    (func (export "random_get") (param i32 i32) (result i32)
+        (i32.const 702)
+        (call $print_i32)
+        (unreachable)
+    )
+    ;;???
+    (func (export "args_get") (param i32 i32) (result i32)
+        (i32.const 703)
+        (call $print_i32)
+        (unreachable)
+    )
+    (func (export "args_sizes_get") (param i32 i32) (result i32)
+        (i32.const 704)
+        (call $print_i32)
+        (unreachable)
+    )
+    ;;???
+    (func (export "clock_time_get") (param i32 i64 i32) (result i32)
+        (i32.const 705)
+        (call $print_i32)
+        (unreachable)
+    )
+    ;; test
+    (func (export "proc_exit") (param i32)
+        (i32.const 706)
+        (call $print_i32)
+        (unreachable)
+    )
+)
+(register "wasi_snapshot_preview1")
+(input "index.wasm")  
+(module instance) 
+(invoke "_initialize") 
+(invoke "runBoxTest")
diff --git a/wasm/wasm.tests/testFixtures/org/jetbrains/kotlin/wasm/test/tools/WasmVM.kt b/wasm/wasm.tests/testFixtures/org/jetbrains/kotlin/wasm/test/tools/WasmVM.kt
index ecb5003..a950c48 100644
--- a/wasm/wasm.tests/testFixtures/org/jetbrains/kotlin/wasm/test/tools/WasmVM.kt
+++ b/wasm/wasm.tests/testFixtures/org/jetbrains/kotlin/wasm/test/tools/WasmVM.kt
@@ -115,6 +115,7 @@
     }
 
     object StackSwitching : WasmVM("StackSwitching", property = "wasm.engine.path.StackSwitching", entryPointIsJsFile = false) {
+        val runScriptPath = File("wasm/wasm.tests/run.wast").absolutePath
         override fun run(
             entryFile: String,
             jsFiles: List<String>,
@@ -123,16 +124,18 @@
             toolArgs: List<String>,
         ): String {
             require(jsFiles.isEmpty())
+            require(entryFile == "./index.wasm") //TODO
             require(useNewExceptionHandling)
             return tool.run(
                 *toolArgs.toTypedArray(),
-                entryFile,
+//                entryFile,
                 "-e",
-                "(module instance) (invoke \"_initialize\") (invoke \"runBoxTest\")",
+                "(input \"$runScriptPath\")",
                 workingDirectory = workingDirectory,
             )
         }
     }
+//                    (input "/Users/zalim.bashorov/dev/kotlin_1/tmp/run.wast")
 
     companion object {
         // TODO remove .local
diff --git a/wasm/wasm.tests/wasiBoxTestRun.kt b/wasm/wasm.tests/wasiBoxTestRun.kt
index a3fba28..6bf000b 100644
--- a/wasm/wasm.tests/wasiBoxTestRun.kt
+++ b/wasm/wasm.tests/wasiBoxTestRun.kt
@@ -4,8 +4,28 @@
  */
 
 @kotlin.wasm.WasmExport
-fun runBoxTest(): Int {
+fun runBoxTest(): Boolean {
     val boxResult = box()
     val isOk = boxResult == "OK"
-    return if (isOk) 1 else 0
+    if (!isOk) {
+        println("Wrong box result '${boxResult}'; Expected 'OK'")
+    }
+    return isOk
 }
+
+@kotlin.wasm.WasmImport("wasi_snapshot_preview1", "proc_exit")
+private external fun wasiProcExit(code: Int)
+
+@kotlin.wasm.WasmExport
+fun startTest() {
+    try {
+        if (!runBoxTest()) {
+            wasiProcExit(1)
+        }
+    } catch (e: Throwable) {
+        println("Failed with exception!")
+        println(e.message)
+        println(e.printStackTrace())
+        wasiProcExit(1)
+    }
+}
\ No newline at end of file