blob: 751091f616bbc6855a3328223cf5fb6ca742fea5 [file] [log] [blame]
package testutil
import (
"crypto/rand"
"fmt"
"io/ioutil"
"os"
"testing"
store "veyron/services/store/server"
"veyron2/ipc"
"veyron2/naming"
"veyron2/security"
)
// NewStire creates a new testing instance of the store server and returns
// a veyron name that identifies the instance and a closure that can
// be used to terminate the instance and clean up.
func NewStore(t *testing.T, server ipc.Server, id security.PublicID) (string, func()) {
// Create a temporary directory for the store server.
prefix := "vstore-test-db"
dbName, err := ioutil.TempDir("", prefix)
if err != nil {
t.Fatalf("TempDir(%v, %v) failed: %v", "", prefix, err)
}
// Create a new StoreService.
config := store.ServerConfig{Admin: id, DBName: dbName}
storeService, err := store.New(config)
if err != nil {
t.Fatalf("New(%v) failed: %v", config, err)
}
var buf [16]byte
if _, err := rand.Read(buf[:]); err != nil {
t.Fatalf("rand.Read() failed: %v", err)
}
name := fmt.Sprintf("test/%x", buf)
t.Logf("Storage server at %v", name)
// Register the services.
storeDispatcher := store.NewStoreDispatcher(storeService)
objectDispatcher := store.NewObjectDispatcher(storeService)
if err := server.Register(name+"/.store", storeDispatcher); err != nil {
t.Fatalf("Register(%v) failed: %v", storeDispatcher, err)
}
if err := server.Register(name, objectDispatcher); err != nil {
t.Fatalf("Register(%v) failed: %v", objectDispatcher, err)
}
// Create an endpoint and start listening.
protocol, hostname := "tcp", "127.0.0.1:0"
ep, err := server.Listen(protocol, hostname)
if err != nil {
t.Fatalf("Listen(%v, %v) failed: %v", protocol, hostname, err)
}
name = naming.JoinAddressName(ep.String(), name)
// Create a closure that cleans things up.
cleanup := func() {
server.Stop()
os.RemoveAll(dbName)
}
return name, cleanup
}