blob: a323f19e1c6e4989375be578e7871c8276528c16 [file] [log] [blame]
Raja Daoud14710902015-06-01 18:06:02 -07001// Copyright 2015 The Vanadium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package vsync
6
7// Utilities for testing sync.
8
9import (
Raja Daoudfe2239f2015-06-17 17:48:01 -070010 "fmt"
11 "os"
Raja Daoudd6a75572015-07-17 19:27:56 -070012 "path"
Raja Daoud14710902015-06-01 18:06:02 -070013 "testing"
Raja Daoudfe2239f2015-06-17 17:48:01 -070014 "time"
Raja Daoud14710902015-06-01 18:06:02 -070015
Jatin Lodhiaaf93faa2015-07-17 15:57:36 -070016 wire "v.io/syncbase/v23/services/syncbase/nosql"
Raja Daoud14710902015-06-01 18:06:02 -070017 "v.io/syncbase/x/ref/services/syncbase/server/interfaces"
Raja Daoudfe2239f2015-06-17 17:48:01 -070018 "v.io/syncbase/x/ref/services/syncbase/server/util"
Himabindu Pucha19133a02015-06-26 17:56:09 -070019 "v.io/syncbase/x/ref/services/syncbase/server/watchable"
Raja Daoud14710902015-06-01 18:06:02 -070020 "v.io/syncbase/x/ref/services/syncbase/store"
Raja Daoud14710902015-06-01 18:06:02 -070021 "v.io/v23/context"
22 "v.io/v23/rpc"
23 "v.io/v23/security/access"
24 "v.io/v23/verror"
Himabindu Pucha19133a02015-06-26 17:56:09 -070025 "v.io/x/ref/test"
Raja Daoud14710902015-06-01 18:06:02 -070026)
27
28// mockService emulates a Syncbase service that includes store and sync.
29// It is used to access a mock application.
30type mockService struct {
Himabindu Pucha19133a02015-06-26 17:56:09 -070031 engine string
Raja Daoudd6a75572015-07-17 19:27:56 -070032 dir string
Himabindu Pucha19133a02015-06-26 17:56:09 -070033 st store.Store
34 sync *syncService
35 shutdown func()
Raja Daoud14710902015-06-01 18:06:02 -070036}
37
38func (s *mockService) St() store.Store {
39 return s.st
40}
41
Himabindu Pucha41212cb2015-06-02 11:34:05 -070042func (s *mockService) Sync() interfaces.SyncServerMethods {
43 return s.sync
44}
45
Raja Daoud14710902015-06-01 18:06:02 -070046func (s *mockService) App(ctx *context.T, call rpc.ServerCall, appName string) (interfaces.App, error) {
Himabindu Puchac1247032015-08-13 13:42:01 -070047 return &mockApp{st: s.st}, nil
Raja Daoud14710902015-06-01 18:06:02 -070048}
49
50func (s *mockService) AppNames(ctx *context.T, call rpc.ServerCall) ([]string, error) {
51 return []string{"mockapp"}, nil
52}
53
54// mockApp emulates a Syncbase App. It is used to access a mock database.
55type mockApp struct {
Himabindu Puchac1247032015-08-13 13:42:01 -070056 st store.Store
Raja Daoud14710902015-06-01 18:06:02 -070057}
58
59func (a *mockApp) NoSQLDatabase(ctx *context.T, call rpc.ServerCall, dbName string) (interfaces.Database, error) {
Himabindu Puchac1247032015-08-13 13:42:01 -070060 return &mockDatabase{st: a.st}, nil
Raja Daoud14710902015-06-01 18:06:02 -070061}
62
63func (a *mockApp) NoSQLDatabaseNames(ctx *context.T, call rpc.ServerCall) ([]string, error) {
64 return []string{"mockdb"}, nil
65}
66
Jatin Lodhiaaf93faa2015-07-17 15:57:36 -070067func (a *mockApp) CreateNoSQLDatabase(ctx *context.T, call rpc.ServerCall, dbName string, perms access.Permissions, metadata *wire.SchemaMetadata) error {
Raja Daoud14710902015-06-01 18:06:02 -070068 return verror.NewErrNotImplemented(ctx)
69}
70
71func (a *mockApp) DeleteNoSQLDatabase(ctx *context.T, call rpc.ServerCall, dbName string) error {
72 return verror.NewErrNotImplemented(ctx)
73}
74
75func (a *mockApp) SetDatabasePerms(ctx *context.T, call rpc.ServerCall, dbName string, perms access.Permissions, version string) error {
76 return verror.NewErrNotImplemented(ctx)
77}
78
Himabindu Pucha41212cb2015-06-02 11:34:05 -070079func (a *mockApp) Service() interfaces.Service {
80 return nil
81}
82
83func (a *mockApp) Name() string {
84 return "mockapp"
85}
86
Raja Daoud14710902015-06-01 18:06:02 -070087// mockDatabase emulates a Syncbase Database. It is used to test sync functionality.
88type mockDatabase struct {
Himabindu Puchac1247032015-08-13 13:42:01 -070089 st store.Store
Raja Daoud14710902015-06-01 18:06:02 -070090}
91
92func (d *mockDatabase) St() store.Store {
93 return d.st
94}
95
Himabindu Puchab480ea82015-07-21 20:46:33 -070096func (d *mockDatabase) CheckPermsInternal(ctx *context.T, call rpc.ServerCall, st store.StoreReader) error {
Raja Daoud14710902015-06-01 18:06:02 -070097 return verror.NewErrNotImplemented(ctx)
98}
99
100func (d *mockDatabase) SetPermsInternal(ctx *context.T, call rpc.ServerCall, perms access.Permissions, version string) error {
101 return verror.NewErrNotImplemented(ctx)
102}
103
Himabindu Pucha41212cb2015-06-02 11:34:05 -0700104func (d *mockDatabase) Name() string {
105 return "mockdb"
106}
107
Himabindu Pucha41212cb2015-06-02 11:34:05 -0700108func (d *mockDatabase) App() interfaces.App {
109 return nil
110}
111
Raja Daoud14710902015-06-01 18:06:02 -0700112// createService creates a mock Syncbase service used for testing sync functionality.
Raja Daoud14710902015-06-01 18:06:02 -0700113func createService(t *testing.T) *mockService {
Himabindu Pucha19133a02015-06-26 17:56:09 -0700114 ctx, shutdown := test.V23Init()
Raja Daoudfe2239f2015-06-17 17:48:01 -0700115 engine := "leveldb"
Raja Daoudd6a75572015-07-17 19:27:56 -0700116 opts := util.OpenOptions{CreateIfMissing: true, ErrorIfExists: false}
117 dir := fmt.Sprintf("%s/vsync_test_%d_%d", os.TempDir(), os.Getpid(), time.Now().UnixNano())
Raja Daoudfe2239f2015-06-17 17:48:01 -0700118
Raja Daoudd6a75572015-07-17 19:27:56 -0700119 st, err := util.OpenStore(engine, path.Join(dir, engine), opts)
Raja Daoudfe2239f2015-06-17 17:48:01 -0700120 if err != nil {
Raja Daoudd6a75572015-07-17 19:27:56 -0700121 t.Fatalf("cannot create store %s (%s): %v", engine, dir, err)
Raja Daoudfe2239f2015-06-17 17:48:01 -0700122 }
Himabindu Pucha19133a02015-06-26 17:56:09 -0700123 st, err = watchable.Wrap(st, &watchable.Options{
Raja Daoudb2837ea2015-06-30 11:15:55 -0700124 ManagedPrefixes: []string{util.RowPrefix, util.PermsPrefix},
Himabindu Pucha19133a02015-06-26 17:56:09 -0700125 })
Raja Daoudfe2239f2015-06-17 17:48:01 -0700126
Raja Daoud14710902015-06-01 18:06:02 -0700127 s := &mockService{
Himabindu Pucha19133a02015-06-26 17:56:09 -0700128 st: st,
129 engine: engine,
Raja Daoudd6a75572015-07-17 19:27:56 -0700130 dir: dir,
Himabindu Pucha19133a02015-06-26 17:56:09 -0700131 shutdown: shutdown,
Raja Daoud14710902015-06-01 18:06:02 -0700132 }
Himabindu Puchac1247032015-08-13 13:42:01 -0700133 if s.sync, err = New(ctx, nil, s, nil, dir); err != nil {
Raja Daoudd6a75572015-07-17 19:27:56 -0700134 util.DestroyStore(engine, dir)
Raja Daoud14710902015-06-01 18:06:02 -0700135 t.Fatalf("cannot create sync service: %v", err)
136 }
137 return s
138}
Raja Daoudfe2239f2015-06-17 17:48:01 -0700139
140// destroyService cleans up the mock Syncbase service.
141func destroyService(t *testing.T, s *mockService) {
Himabindu Pucha19133a02015-06-26 17:56:09 -0700142 defer s.shutdown()
143 defer s.sync.Close()
Raja Daoudd6a75572015-07-17 19:27:56 -0700144 if err := util.DestroyStore(s.engine, s.dir); err != nil {
145 t.Fatalf("cannot destroy store %s (%s): %v", s.engine, s.dir, err)
Raja Daoudfe2239f2015-06-17 17:48:01 -0700146 }
147}
Raja Daoudb2837ea2015-06-30 11:15:55 -0700148
Raja Daoudb2837ea2015-06-30 11:15:55 -0700149// makeRowKey returns the database row key for a given application key.
150func makeRowKey(key string) string {
151 return util.JoinKeyParts(util.RowPrefix, key)
152}