Files
wazero/namespace_test.go
Crypt Keeper 07a814a105 Exposes experimental writefs.DirFS, but hides implementation (#972)
The type we use to expose write operations is still evolving. It might
be a single writefs.FS interface, or similar to go where we have an
interface per feature (e.g. writefs.MkdirFS). These choices are all
implementation details for DirFS and won't be settled before the end of
the month version cutoff. Instead, this only exposes the ability to
create a DirFS, not an arbitrary implementation of writefs.FS. This does
so by making `writefs.FS` an internal type.

Signed-off-by: Adrian Cole <adrian@tetrate.io>
2022-12-29 10:39:04 +08:00

61 lines
1.9 KiB
Go

package wazero
import (
_ "embed"
"testing"
"github.com/tetratelabs/wazero/internal/testing/require"
)
func TestRuntime_Namespace_Independent(t *testing.T) {
r := NewRuntime(testCtx)
defer r.Close(testCtx)
// Compile a module to add to the runtime
compiled, err := r.NewHostModuleBuilder("env").Compile(testCtx)
require.NoError(t, err)
// Instantiate "env" into the runtime default namespace (base case)
require.Nil(t, r.Module("env"))
m1, err := r.InstantiateModule(testCtx, compiled, NewModuleConfig())
require.NoError(t, err)
require.Equal(t, m1, r.Module("env"))
// NewNamespace does not inherit modules in the default namespace
ns1 := r.NewNamespace(testCtx)
require.Nil(t, ns1.Module("env"))
// Ensure this namespace has a new instance of "env"
m2, err := ns1.InstantiateModule(testCtx, compiled, NewModuleConfig())
require.NoError(t, err)
require.NotSame(t, m1, m2)
// Ensure the next namespace is similarly independent.
ns2 := r.NewNamespace(testCtx)
m3, err := ns2.InstantiateModule(testCtx, compiled, NewModuleConfig())
require.NoError(t, err)
require.NotSame(t, m1, m3)
require.NotSame(t, m2, m3)
// Ensure we can't re-instantiate the same module multiple times.
_, err = ns2.InstantiateModule(testCtx, compiled, NewModuleConfig())
require.EqualError(t, err, "module[env] has already been instantiated")
// Ensure we can instantiate the same module multiple times.
m4, err := ns2.InstantiateModule(testCtx, compiled, NewModuleConfig().WithName("env2"))
require.NoError(t, err)
require.NotSame(t, m3, m4)
// Ensure closing one namespace doesn't affect another
require.NoError(t, ns2.Close(testCtx))
require.Nil(t, ns2.Module("env"))
require.Nil(t, ns2.Module("env2"))
require.Equal(t, m1, r.Module("env"))
require.Equal(t, m2, ns1.Module("env"))
// Ensure closing the Runtime closes all namespaces
require.NoError(t, r.Close(testCtx))
require.Nil(t, r.Module("env"))
require.Nil(t, ns1.Module("env"))
}