mirror of
https://github.com/extism/extism.git
synced 2026-04-23 03:00:11 -04:00
- Removes the `ExtismContext` type from runtime and all SDKs - Removed SDK functions: `extism_context_new`, `extism_context_reset`, `extism_context_free` - All SDKs have been updated, but there are still some TODOs below - Removes `extism_plugin_update` - Plugins can no longer be updated - a new plugin should be created instead - Adds `extism_plugin_id` to uniquely identify plugins - Merges the `extism-runtime` and `extism` crates (there is no longer an `extism-runtime` crate) - Makes `extism::Manifest` an alias for `extism_manifest::Manifest` instead of a distinct type - Adds `MemoryHandle` type to SDKs to refer to blocks of Extism memory that can be accessed in host functions - Improves thread-safety of Plugins, adds C++ test to call a single plugin from multiple threads. - Expands wasmtime bounds to include 12.0
124 lines
2.5 KiB
Go
124 lines
2.5 KiB
Go
package extism
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func manifest(functions bool) Manifest {
|
|
path := "./wasm/code.wasm"
|
|
if functions {
|
|
path = "./wasm/code-functions.wasm"
|
|
}
|
|
|
|
return Manifest{
|
|
Wasm: []Wasm{
|
|
WasmFile{
|
|
Path: path,
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func expectVowelCount(plugin Plugin, input string, count int) error {
|
|
out, err := plugin.Call("count_vowels", []byte(input))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
var result map[string]int
|
|
json.Unmarshal(out, &result)
|
|
if result["count"] != count {
|
|
return fmt.Errorf("Got count %d but expected %d", result["count"], count)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func TestCallPlugin(t *testing.T) {
|
|
plugin, err := NewPluginFromManifest(manifest(false), []Function{}, false)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
if err := expectVowelCount(plugin, "this is a test", 4); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if err := expectVowelCount(plugin, "this is a test again", 7); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if err := expectVowelCount(plugin, "this is a test thrice", 6); err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
|
|
func TestFreePlugin(t *testing.T) {
|
|
plugin, err := NewPluginFromManifest(manifest(false), []Function{}, false)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
if err := expectVowelCount(plugin, "this is a test", 4); err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
// free this specific plugin
|
|
plugin.Free()
|
|
|
|
if err := expectVowelCount(plugin, "this is a test", 4); err == nil {
|
|
t.Fatal("Expected an error after plugin was freed")
|
|
}
|
|
}
|
|
|
|
func TestFunctionExists(t *testing.T) {
|
|
plugin, err := NewPluginFromManifest(manifest(false), []Function{}, false)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
if !plugin.FunctionExists("count_vowels") {
|
|
t.Fatal("Was expecting to find the function count_vowels")
|
|
}
|
|
if plugin.FunctionExists("i_dont_exist") {
|
|
t.Fatal("Was not expecting to find the function i_dont_exist")
|
|
}
|
|
}
|
|
|
|
func TestErrorsOnUnknownFunction(t *testing.T) {
|
|
plugin, err := NewPluginFromManifest(manifest(false), []Function{}, false)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
_, err = plugin.Call("i_dont_exist", []byte("someinput"))
|
|
if err == nil {
|
|
t.Fatal("Was expecting call to unknown function to fail")
|
|
}
|
|
}
|
|
|
|
func TestCancel(t *testing.T) {
|
|
manifest := Manifest{
|
|
Wasm: []Wasm{
|
|
WasmFile{
|
|
Path: "./wasm/loop.wasm",
|
|
},
|
|
},
|
|
}
|
|
|
|
plugin, err := NewPluginFromManifest(manifest, []Function{}, false)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
cancelHandle := plugin.CancelHandle()
|
|
|
|
go func(handle CancelHandle) {
|
|
time.Sleep(time.Second * 1)
|
|
handle.Cancel()
|
|
}(cancelHandle)
|
|
|
|
_, err = plugin.Call("infinite_loop", []byte(""))
|
|
if err == nil {
|
|
t.Fail()
|
|
}
|
|
}
|