2022-07-26 12:02:32 +00:00
|
|
|
package mdb
|
|
|
|
|
2022-07-27 13:22:20 +00:00
|
|
|
import (
|
|
|
|
"os"
|
2022-07-27 19:16:53 +00:00
|
|
|
"sync"
|
2022-07-27 13:22:20 +00:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
"git.crumpington.com/private/mdb/testconn"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestShipping(t *testing.T) {
|
|
|
|
run := func(name string, inner func(t *testing.T, db1 *DB, db2 *DB, network *testconn.Network)) {
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
root1, err := os.MkdirTemp("", "")
|
|
|
|
must(err)
|
|
|
|
defer os.RemoveAll(root1)
|
|
|
|
root2, err := os.MkdirTemp("", "")
|
|
|
|
must(err)
|
|
|
|
defer os.RemoveAll(root2)
|
|
|
|
|
|
|
|
db1 := OpenDB(root1, true)
|
|
|
|
defer db1.Close()
|
|
|
|
db2 := OpenDB(root2, false)
|
|
|
|
defer db2.Close()
|
|
|
|
|
|
|
|
inner(t, db1, db2, testconn.NewNetwork())
|
|
|
|
})
|
2022-07-26 12:02:32 +00:00
|
|
|
}
|
|
|
|
|
2022-07-27 19:16:53 +00:00
|
|
|
run("simple", func(t *testing.T, db, db2 *DB, network *testconn.Network) {
|
|
|
|
wg := sync.WaitGroup{}
|
|
|
|
wg.Add(2)
|
|
|
|
|
|
|
|
// Send in background.
|
|
|
|
go func() {
|
|
|
|
defer wg.Done()
|
|
|
|
conn := network.Accept()
|
|
|
|
db.SyncSend(conn)
|
|
|
|
}()
|
|
|
|
|
|
|
|
// Recv in background.
|
|
|
|
go func() {
|
|
|
|
defer wg.Done()
|
|
|
|
conn := network.Dial()
|
|
|
|
db2.SyncRecv(conn)
|
|
|
|
}()
|
|
|
|
|
|
|
|
users := []User{
|
|
|
|
{ID: db.Users.c.NextID(), Email: "a@b.com", Name: "xxx"},
|
|
|
|
{ID: db.Users.c.NextID(), Email: "c@d.com", Name: "ggg"},
|
|
|
|
{ID: db.Users.c.NextID(), Email: "e@f.com", Name: "aaa"},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, user := range users {
|
|
|
|
_, err := db.Users.c.Insert(user)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
err := db.Users.c.Update(users[1].ID, func(u User) (User, error) {
|
|
|
|
u.Name = "hello"
|
|
|
|
return u, nil
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
db.Users.c.Delete(users[0].ID)
|
|
|
|
db.Users.c.Delete(users[2].ID)
|
|
|
|
|
|
|
|
db.WaitForSync(db2)
|
|
|
|
network.CloseClient()
|
|
|
|
wg.Wait()
|
|
|
|
|
|
|
|
if err := db.Equals(db2); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2022-07-26 12:02:32 +00:00
|
|
|
})
|
|
|
|
}
|