Memory Driver
In-memory object storage driver for testing and ephemeral data.
The memory driver stores all objects in-memory using Go maps protected by a read-write mutex. It is designed for testing and development -- data is lost when the process exits.
Installation
go get github.com/xraph/trove/drivers/memdriverUsage
import (
"github.com/xraph/trove"
"github.com/xraph/trove/drivers/memdriver"
)
drv := memdriver.New()
t, err := trove.Open(drv)
if err != nil {
log.Fatal(err)
}
defer t.Close(ctx)No DSN or Open() call is required -- the memory driver is ready to use immediately after New().
DSN Format
When used via DSN-based resolution (e.g., in multi-store configuration), the memory driver uses the mem:// scheme:
storage_driver: "mem://"Driver Registry
The memory driver registers itself in the global driver registry under the mem scheme. This enables DSN-based driver resolution in multi-store mode:
import _ "github.com/xraph/trove/drivers/memdriver" // registers "mem"Features
- Thread-safe -- All operations are protected by
sync.RWMutex - Zero configuration -- No DSN, no files, no setup
- Sorted listing --
Listreturns objects in lexicographic key order - Pagination -- Supports
WithMaxKeysand cursor-based pagination - Full conformance -- Passes the complete
trovetest.RunDriverSuite
When to Use
- Unit tests -- Fast, isolated test environments with no filesystem dependencies
- Integration tests -- Verify routing and multi-backend logic without real backends
- Development -- Quick prototyping without setting up storage infrastructure
- Conformance testing -- Reference implementation for the driver interface
- Multi-store scratch space -- Ephemeral store alongside persistent stores in multi-store mode
Example: Test Setup
func TestMyService(t *testing.T) {
drv := memdriver.New()
store, _ := trove.Open(drv)
defer store.Close(context.Background())
store.CreateBucket(context.Background(), "test")
// Your test logic using store...
}Example: Multi-Backend Testing
func TestRouting(t *testing.T) {
primary := memdriver.New()
archive := memdriver.New()
store, _ := trove.Open(primary,
trove.WithBackend("archive", archive),
trove.WithRoute("*.log", "archive"),
)
// Put a .log file -- routes to archive
store.Put(ctx, "logs", "app.log", strings.NewReader("log data"))
// Verify it landed on the archive driver
_, err := archive.Get(ctx, "logs", "app.log")
assert.NoError(t, err)
}Limitations
- Data is not persisted -- lost on process exit
- No multipart upload, pre-signed URLs, versioning, or lifecycle management
- Not suitable for production use with large datasets (all data is in memory)