Skip to content

Commit

Permalink
A palpable test
Browse files Browse the repository at this point in the history
Signed-off-by: itowlson <ivan.towlson@fermyon.com>
  • Loading branch information
itowlson committed May 5, 2024
1 parent 581d890 commit fa81516
Show file tree
Hide file tree
Showing 7 changed files with 96 additions and 1 deletion.
2 changes: 1 addition & 1 deletion crates/key-value/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ impl wasi_keyvalue::store::HostBucket for KeyValueDispatch {
cursor: Option<u64>,
) -> anyhow::Result<Result<wasi_keyvalue::store::KeyResponse, wasi_keyvalue::store::Error>>
{
if cursor.is_some() {
if cursor.unwrap_or_default() != 0 {
anyhow::bail!("list_keys: cursor not supported");
}

Expand Down
14 changes: 14 additions & 0 deletions tests/runtime-tests/tests/key-value-wasi/spin.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
spin_manifest_version = 2

[application]
name = "key-value-wasi"
authors = ["Fermyon Engineering <engineering@fermyon.com>"]
version = "0.1.0"

[[trigger.http]]
route = "/"
component = "test"

[component.test]
source = "%{source=key-value-wasi}"
key_value_stores = ["default"]
8 changes: 8 additions & 0 deletions tests/test-components/components/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions tests/test-components/components/key-value-wasi/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[package]
name = "key-value-wasi"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["cdylib"]

[dependencies]
helper = { path = "../../helper" }
wit-bindgen = "0.16.0"
10 changes: 10 additions & 0 deletions tests/test-components/components/key-value-wasi/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Key Value

Tests the key/value interface.

## Expectations

This test component expects the following to be true:
* It is given permission to open a connection to the "default" store.
* It does not have permission to access a store named "forbidden".
* It is empty
51 changes: 51 additions & 0 deletions tests/test-components/components/key-value-wasi/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
use helper::{ensure_matches, ensure_ok};

use bindings::wasi::keyvalue::store::{Error, open, KeyResponse};

helper::define_component!(Component);

impl Component {
fn main() -> Result<(), String> {

ensure_matches!(open("forbidden"), Err(Error::AccessDenied));

let store = ensure_ok!(open("default"));

// Ensure nothing set in `bar` key
ensure_ok!(store.delete("bar"));
ensure_matches!(store.exists("bar"), Ok(false));
ensure_matches!(store.get("bar"), Ok(None));
ensure_matches!(keys(&store.list_keys(None)), Ok(&[]));

// Set `bar` key
ensure_ok!(store.set("bar", b"baz"));
ensure_matches!(store.exists("bar"), Ok(true));
ensure_matches!(store.get("bar"), Ok(Some(v)) if v == b"baz");
ensure_matches!(keys(&store.list_keys(None)), Ok([bar]) if bar == "bar");
ensure_matches!(keys(&store.list_keys(Some(0))), Ok([bar]) if bar == "bar");

// Override `bar` key
ensure_ok!(store.set("bar", b"wow"));
ensure_matches!(store.exists("bar"), Ok(true));
ensure_matches!(store.get("bar"), Ok(Some(wow)) if wow == b"wow");
ensure_matches!(keys(&store.list_keys(None)), Ok([bar]) if bar == "bar");

// Set another key
ensure_ok!(store.set("qux", b"yay"));
ensure_matches!(keys(&store.list_keys(None)), Ok(c) if c.len() == 2 && c.contains(&"bar".into()) && c.contains(&"qux".into()));

// Delete everything
ensure_ok!(store.delete("bar"));
ensure_ok!(store.delete("bar"));
ensure_ok!(store.delete("qux"));
ensure_matches!(store.exists("bar"), Ok(false));
ensure_matches!(store.get("qux"), Ok(None));
ensure_matches!(keys(&store.list_keys(None)), Ok(&[]));

Ok(())
}
}

fn keys<E>(res: &Result<KeyResponse, E>) -> Result<&[String], &E> {
res.as_ref().map(|kr| kr.keys.as_slice())
}
1 change: 1 addition & 0 deletions wit/world.wit
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ world platform {
world platform-rc20231018 {
include wasi:cli/reactor@0.2.0-rc-2023-10-18;
import wasi:http/outgoing-handler@0.2.0-rc-2023-10-18;
import wasi:keyvalue/store@0.2.0-draft;
import llm;
import redis;
import mqtt;
Expand Down

0 comments on commit fa81516

Please sign in to comment.