mirror of
https://github.com/yggdrasil-network/yggdrasil-go.git
synced 2025-04-29 06:35:07 +03:00
Db-test
This commit is contained in:
parent
215990860b
commit
80ea41600f
13 changed files with 1811 additions and 250 deletions
Binary file not shown.
|
@ -1,11 +1,9 @@
|
|||
package db_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/ed25519"
|
||||
"crypto/rand"
|
||||
"crypto/x509"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strconv"
|
||||
|
@ -20,33 +18,39 @@ import (
|
|||
)
|
||||
|
||||
func TestPeerGetCoords(t *testing.T) {
|
||||
peer := core.PeerInfo{
|
||||
peerinfo := core.PeerInfo{
|
||||
Coords: []uint64{1, 2, 3, 4},
|
||||
}
|
||||
peer := core.PeerInfoDB{
|
||||
PeerInfo: peerinfo,
|
||||
}
|
||||
|
||||
target := []byte{1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0}
|
||||
var coordinates = peer.GetCoordinates()
|
||||
if reflect.DeepEqual(target, coordinates) {
|
||||
coordinates := core.ConvertToByteSlise(peer.Coords)
|
||||
if !reflect.DeepEqual(target, coordinates) {
|
||||
t.Error(fmt.Errorf("Not equal"))
|
||||
}
|
||||
}
|
||||
|
||||
func TestPeerSetCoords(t *testing.T) {
|
||||
peer := core.PeerInfo{
|
||||
Coords: []uint64{1, 2, 3, 4},
|
||||
peerinfo := core.PeerInfo{}
|
||||
peer := core.PeerInfoDB{
|
||||
PeerInfo: peerinfo,
|
||||
}
|
||||
target := []byte{4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}
|
||||
var coordinates = peer.SetCoordinates(&target)
|
||||
if reflect.DeepEqual(target, coordinates) {
|
||||
var err error
|
||||
peer.CoordsBytes = []byte{4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}
|
||||
peer.Coords, err = core.ConvertToUintSlise(peer.CoordsBytes)
|
||||
require.NoError(t, err)
|
||||
coords := []uint64{4, 3, 2, 1}
|
||||
if !reflect.DeepEqual(coords, peer.Coords) {
|
||||
t.Error(fmt.Errorf("Not equal"))
|
||||
}
|
||||
fmt.Print(peer.Coords)
|
||||
}
|
||||
|
||||
func TestAddPeer(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := peerinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
@ -55,12 +59,11 @@ func TestAddPeer(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
rootPubKey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
peer := core.PeerInfo{
|
||||
peerinfo := core.PeerInfo{
|
||||
URI: "test.test",
|
||||
Up: true,
|
||||
Inbound: true,
|
||||
LastError: nil,
|
||||
LastError: errors.New("test"),
|
||||
LastErrorTime: time.Now(),
|
||||
Key: pubkey,
|
||||
Root: rootPubKey,
|
||||
|
@ -72,28 +75,19 @@ func TestAddPeer(t *testing.T) {
|
|||
Uptime: 3600,
|
||||
Latency: 50.0,
|
||||
}
|
||||
peer, err := core.NewPeerInfoDB(peerinfo)
|
||||
require.NoError(t, err)
|
||||
|
||||
pKey, err := x509.MarshalPKIXPublicKey(peer.Key)
|
||||
require.NoError(t, err)
|
||||
pKeyRoot, err := x509.MarshalPKIXPublicKey(peer.Root)
|
||||
require.NoError(t, err)
|
||||
var coordsBlob []byte
|
||||
if peer.Coords != nil {
|
||||
coordsBlob = make([]byte, len(peer.Coords)*8)
|
||||
for i, coord := range peer.Coords {
|
||||
binary.LittleEndian.PutUint64(coordsBlob[i*8:], coord)
|
||||
}
|
||||
}
|
||||
mock.ExpectExec("INSERT OR REPLACE INTO peer_infos").
|
||||
WithArgs(
|
||||
peer.URI,
|
||||
peer.Up,
|
||||
peer.Inbound,
|
||||
nil,
|
||||
peer.PeerErr,
|
||||
peer.LastErrorTime,
|
||||
pKey,
|
||||
pKeyRoot,
|
||||
coordsBlob,
|
||||
peer.KeyBytes,
|
||||
peer.RootBytes,
|
||||
peer.CoordsBytes,
|
||||
peer.Port,
|
||||
peer.Priority,
|
||||
peer.RXBytes,
|
||||
|
@ -103,7 +97,7 @@ func TestAddPeer(t *testing.T) {
|
|||
).
|
||||
WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
err = cfg.AddPeer(peer)
|
||||
_, err = cfg.Add(peer)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
|
@ -114,7 +108,6 @@ func TestRemovePeer(t *testing.T) {
|
|||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := peerinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
@ -124,11 +117,11 @@ func TestRemovePeer(t *testing.T) {
|
|||
rootPubKey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
peer := core.PeerInfo{
|
||||
peerinfo := core.PeerInfo{
|
||||
URI: "test.test",
|
||||
Up: true,
|
||||
Inbound: true,
|
||||
LastError: nil,
|
||||
LastError: errors.New("test"),
|
||||
LastErrorTime: time.Now(),
|
||||
Key: pubkey,
|
||||
Root: rootPubKey,
|
||||
|
@ -140,16 +133,14 @@ func TestRemovePeer(t *testing.T) {
|
|||
Uptime: 3600,
|
||||
Latency: 50.0,
|
||||
}
|
||||
peer, err := core.NewPeerInfoDB(peerinfo)
|
||||
require.NoError(t, err)
|
||||
|
||||
pKey, err := x509.MarshalPKIXPublicKey(peer.Key)
|
||||
require.NoError(t, err)
|
||||
pKeyRoot, err := x509.MarshalPKIXPublicKey(peer.Root)
|
||||
require.NoError(t, err)
|
||||
mock.ExpectExec("DELETE FROM peer_infos WHERE uri = \\? AND key = \\? AND root = \\?").
|
||||
WithArgs(peer.URI, pKey, pKeyRoot).
|
||||
mock.ExpectExec("DELETE FROM peer_infos WHERE Id = \\?").
|
||||
WithArgs(peer.Id).
|
||||
WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
err = cfg.RemovePeer(peer)
|
||||
err = cfg.Remove(peer)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
|
@ -170,11 +161,11 @@ func TestGetPeer(t *testing.T) {
|
|||
rootPubKey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
peer := core.PeerInfo{
|
||||
peerinfo := core.PeerInfo{
|
||||
URI: "test.test",
|
||||
Up: true,
|
||||
Inbound: true,
|
||||
LastError: nil,
|
||||
LastError: errors.New("test"),
|
||||
LastErrorTime: time.Now(),
|
||||
Key: pubkey,
|
||||
Root: rootPubKey,
|
||||
|
@ -186,20 +177,21 @@ func TestGetPeer(t *testing.T) {
|
|||
Uptime: 3600,
|
||||
Latency: 50.0,
|
||||
}
|
||||
|
||||
pKey, err := x509.MarshalPKIXPublicKey(peer.Key)
|
||||
peer, err := core.NewPeerInfoDB(peerinfo)
|
||||
require.NoError(t, err)
|
||||
pKeyRoot, err := x509.MarshalPKIXPublicKey(peer.Root)
|
||||
require.NoError(t, err)
|
||||
var coords []byte
|
||||
rows := sqlmock.NewRows([]string{"uri", "up", "Inbound", "LastError", "LastErrorTime", "Key", "Root", "Coords", "Port", "Priority", "Rxbytes", "Txbytes", "Uptime", "Latency"}).
|
||||
AddRow(peer.URI, peer.Up, peer.Inbound, peer.LastError, peer.LastErrorTime, peer.Key, peer.Root, coords, peer.Port, peer.Priority, peer.RXBytes, peer.TXBytes, peer.Uptime, peer.Latency)
|
||||
|
||||
mock.ExpectQuery("SELECT * FROM peer_infos WHERE uri = ? AND key = ? AND root = ?").
|
||||
WithArgs(peer.URI, pKey, pKeyRoot).
|
||||
rows := sqlmock.NewRows([]string{"up", "inbound", "last_error", "last_error_time", "coords",
|
||||
"port", "priority", "Rxbytes", "Txbytes", "uptime", "latency", "uri", "key", "root"}).
|
||||
AddRow(peer.Up, peer.Inbound, peer.PeerErr, peer.LastErrorTime, peer.CoordsBytes,
|
||||
peer.Port, peer.Priority, peer.RXBytes, peer.TXBytes, peer.Uptime, peer.Latency,
|
||||
peer.URI, peer.KeyBytes, peer.RootBytes)
|
||||
|
||||
mock.ExpectQuery("SELECT (.+) FROM peer_infos WHERE Id = \\?").
|
||||
WithArgs(peer.Id).
|
||||
WillReturnRows(rows)
|
||||
|
||||
err = cfg.GetPeer(&peer)
|
||||
_, err = cfg.Get(peer)
|
||||
t.Log(err)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
|
@ -210,7 +202,6 @@ func TestUpdatePeer(t *testing.T) {
|
|||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := peerinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
@ -219,12 +210,11 @@ func TestUpdatePeer(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
rootPubKey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
peer := core.PeerInfo{
|
||||
peerinfo := core.PeerInfo{
|
||||
URI: "test.test",
|
||||
Up: true,
|
||||
Inbound: true,
|
||||
LastError: nil,
|
||||
LastError: errors.New("test"),
|
||||
LastErrorTime: time.Now(),
|
||||
Key: pubkey,
|
||||
Root: rootPubKey,
|
||||
|
@ -236,17 +226,7 @@ func TestUpdatePeer(t *testing.T) {
|
|||
Uptime: 3600,
|
||||
Latency: 50.0,
|
||||
}
|
||||
|
||||
pKey, err := x509.MarshalPKIXPublicKey(peer.Key)
|
||||
require.NoError(t, err)
|
||||
pKeyRoot, err := x509.MarshalPKIXPublicKey(peer.Root)
|
||||
var coordsBlob []byte
|
||||
if peer.Coords != nil {
|
||||
coordsBlob = make([]byte, len(peer.Coords)*8)
|
||||
for i, coord := range peer.Coords {
|
||||
binary.LittleEndian.PutUint64(coordsBlob[i*8:], coord)
|
||||
}
|
||||
}
|
||||
peer, err := core.NewPeerInfoDB(peerinfo)
|
||||
require.NoError(t, err)
|
||||
mock.ExpectExec(`UPDATE peer_infos
|
||||
SET
|
||||
|
@ -259,23 +239,25 @@ func TestUpdatePeer(t *testing.T) {
|
|||
priority = \?,
|
||||
RXBytes = RXBytes \+ \?,
|
||||
TXBytes = TXBytes \+ \?,
|
||||
uptime = \?,
|
||||
latency = \?
|
||||
uptime = uptime \+ \?,
|
||||
latency = \?,
|
||||
uri = \?,
|
||||
key = \?,
|
||||
root = \?
|
||||
WHERE
|
||||
uri = \? AND key = \? AND root = \?`).
|
||||
Id = \?`).
|
||||
WithArgs(
|
||||
peer.Up, peer.Inbound, peer.LastError, peer.LastErrorTime, coordsBlob, peer.Port, peer.Priority,
|
||||
peer.RXBytes, peer.TXBytes, peer.Uptime, peer.Latency, peer.URI, pKey, pKeyRoot).
|
||||
peer.Up, peer.Inbound, peer.PeerErr, peer.LastErrorTime, peer.CoordsBytes, peer.Port, peer.Priority,
|
||||
peer.RXBytes, peer.TXBytes, peer.Uptime, peer.Latency, peer.URI, peer.KeyBytes, peer.RootBytes, peer.Id).
|
||||
WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
err = cfg.UpdatePeer(peer)
|
||||
err = cfg.Update(peer)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
// One more test here
|
||||
func TestMain(t *testing.T) {
|
||||
peerinfodb.Name = fmt.Sprintf(
|
||||
"%s.%s",
|
||||
|
@ -297,7 +279,7 @@ func TestMain(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
rootPubKey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
peer := core.PeerInfo{
|
||||
peerinfo := core.PeerInfo{
|
||||
URI: "test.test",
|
||||
Up: true,
|
||||
Inbound: true,
|
||||
|
@ -313,14 +295,16 @@ func TestMain(t *testing.T) {
|
|||
Uptime: 3600,
|
||||
Latency: 50.0,
|
||||
}
|
||||
peer, err := core.NewPeerInfoDB(peerinfo)
|
||||
require.NoError(t, err)
|
||||
|
||||
root2PubKey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
peer2 := core.PeerInfo{
|
||||
peerinfo2 := core.PeerInfo{
|
||||
URI: "new.test",
|
||||
Up: true,
|
||||
Inbound: true,
|
||||
LastError: nil,
|
||||
LastError: errors.New("test2"),
|
||||
LastErrorTime: time.Now(),
|
||||
Key: pubkey,
|
||||
Root: root2PubKey,
|
||||
|
@ -332,9 +316,13 @@ func TestMain(t *testing.T) {
|
|||
Uptime: 3600,
|
||||
Latency: 50.0,
|
||||
}
|
||||
peer2, err := core.NewPeerInfoDB(peerinfo2)
|
||||
require.NoError(t, err)
|
||||
|
||||
peerdb.AddPeer(peer)
|
||||
peerdb.AddPeer(peer2)
|
||||
_, err = peerdb.Add(peer)
|
||||
require.NoError(t, err)
|
||||
_, err = peerdb.Add(peer2)
|
||||
require.NoError(t, err)
|
||||
count, err := peerdb.Count()
|
||||
require.NoError(t, err)
|
||||
condition = func() bool {
|
||||
|
@ -342,29 +330,35 @@ func TestMain(t *testing.T) {
|
|||
}
|
||||
require.Condition(t, condition, "Expected count to be 2", count)
|
||||
|
||||
peerdb.RemovePeer(peer)
|
||||
err = peerdb.Remove(peer)
|
||||
require.NoError(t, err)
|
||||
count, err = peerdb.Count()
|
||||
require.NoError(t, err)
|
||||
condition = func() bool {
|
||||
return count == 1
|
||||
}
|
||||
|
||||
require.Condition(t, condition, "Expected count to be 1", count)
|
||||
|
||||
peer2.Latency = 10
|
||||
peer2.RXBytes = 1024
|
||||
peer2.TXBytes = 1024
|
||||
peer2.Port = 80
|
||||
peerdb.UpdatePeer(peer2)
|
||||
peerdb.GetPeer(&peer2)
|
||||
err = peerdb.Update(peer2)
|
||||
require.NoError(t, err)
|
||||
_, err = peerdb.Get(peer2)
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return peer2.Latency == 10 &&
|
||||
peer2.RXBytes == 2048 &&
|
||||
peer2.TXBytes == 3072 &&
|
||||
peer2.Port == 80 && peer2.URI == "new.test" && bytes.Equal(peer.Key, pubkey)
|
||||
peer2.Port == 80 && peer2.URI == "new.test" && peer2.Key.Equal(pubkey)
|
||||
}
|
||||
|
||||
require.Condition(t, condition, "Inner exception")
|
||||
|
||||
peerdb.RemovePeer(peer2)
|
||||
peerdb.Remove(peer2)
|
||||
count, err = peerdb.Count()
|
||||
require.NoError(t, err)
|
||||
|
||||
|
|
258
src/db/test/pathentryinfodb_test.go
Normal file
258
src/db/test/pathentryinfodb_test.go
Normal file
|
@ -0,0 +1,258 @@
|
|||
package db_test
|
||||
|
||||
import (
|
||||
"crypto/ed25519"
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/DATA-DOG/go-sqlmock"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/yggdrasil-network/yggdrasil-go/src/core"
|
||||
|
||||
pathentryinfodb "github.com/yggdrasil-network/yggdrasil-go/src/db/PathEntryInfoDB"
|
||||
)
|
||||
|
||||
func TestSelectPathEntryInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := pathentryinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.PathEntryInfo{
|
||||
Key: pubkey,
|
||||
Path: []uint64{0, 0, 0},
|
||||
Sequence: 100,
|
||||
}
|
||||
model, err := core.NewPathEntryInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
|
||||
rows := sqlmock.NewRows([]string{"Sequence", "Key", "Path"}).
|
||||
AddRow(100, model.KeyBytes, model.PathBytes)
|
||||
|
||||
mock.ExpectQuery("SELECT (.+) FROM path_entry_info WHERE Id = \\?").
|
||||
WithArgs(model.Id).
|
||||
WillReturnRows(rows)
|
||||
|
||||
_, err = cfg.Get(model)
|
||||
t.Log(err)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
|
||||
}
|
||||
|
||||
func TestInsertPathEntryInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := pathentryinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.PathEntryInfo{
|
||||
Key: pubkey,
|
||||
Path: []uint64{0, 0, 0},
|
||||
Sequence: 100,
|
||||
}
|
||||
model, err := core.NewPathEntryInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
mock.ExpectExec("INSERT INTO path_entry_info").
|
||||
WithArgs(
|
||||
model.KeyBytes,
|
||||
model.PathBytes,
|
||||
model.Sequence,
|
||||
).
|
||||
WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
_, err = cfg.Add(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestDeletePathEntryInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := pathentryinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.PathEntryInfo{
|
||||
Key: pubkey,
|
||||
Path: []uint64{0, 0, 0},
|
||||
Sequence: 100,
|
||||
}
|
||||
model, err := core.NewPathEntryInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
mock.ExpectExec("DELETE FROM path_entry_info WHERE Id = \\?").
|
||||
WithArgs(
|
||||
model.Id,
|
||||
).WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
err = cfg.Remove(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestUpdatePathEntryInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := pathentryinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.PathEntryInfo{
|
||||
Key: pubkey,
|
||||
Path: []uint64{0, 0, 0},
|
||||
Sequence: 100,
|
||||
}
|
||||
model, err := core.NewPathEntryInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
mock.ExpectExec(`
|
||||
UPDATE path_entry_info
|
||||
SET
|
||||
Sequence = \?,
|
||||
Key = \?,
|
||||
Path = \?
|
||||
WHERE
|
||||
Id = \?`).
|
||||
WithArgs(
|
||||
model.Sequence,
|
||||
model.KeyBytes,
|
||||
model.PathBytes,
|
||||
model.Id,
|
||||
).WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
err = cfg.Update(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestMainPathEntryInfo(t *testing.T) {
|
||||
pathentryinfodb.Name = fmt.Sprintf(
|
||||
"%s.%s",
|
||||
pathentryinfodb.Name,
|
||||
strconv.Itoa(int(time.Now().Unix())),
|
||||
)
|
||||
pathentryinfodb, err := pathentryinfodb.New()
|
||||
require.NoError(t, err)
|
||||
|
||||
pathentryinfodb.DbConfig.OpenDb()
|
||||
isOpened := pathentryinfodb.DbConfig.DBIsOpened()
|
||||
condition := func() bool {
|
||||
return isOpened
|
||||
}
|
||||
require.Condition(t, condition, "Expected db is opened", isOpened)
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
secondPubKey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.PathEntryInfo{
|
||||
Key: pubkey,
|
||||
Path: []uint64{0, 0, 0},
|
||||
Sequence: 100,
|
||||
}
|
||||
model, err := core.NewPathEntryInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
|
||||
secondEntry := core.PathEntryInfo{
|
||||
Key: secondPubKey,
|
||||
Path: []uint64{0, 0, 0},
|
||||
Sequence: 100,
|
||||
}
|
||||
secondModel, err := core.NewPathEntryInfoDB(secondEntry)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = pathentryinfodb.Add(model)
|
||||
require.NoError(t, err)
|
||||
_, err = pathentryinfodb.Add(secondModel)
|
||||
require.NoError(t, err)
|
||||
count, err := pathentryinfodb.Count()
|
||||
require.NoError(t, err)
|
||||
condition = func() bool {
|
||||
return count == 2
|
||||
}
|
||||
require.Condition(t, condition, "Expected count to be 2", count)
|
||||
|
||||
err = pathentryinfodb.Remove(secondModel)
|
||||
require.NoError(t, err)
|
||||
count, err = pathentryinfodb.Count()
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return count == 1
|
||||
}
|
||||
require.Condition(t, condition, "Expected count to be 1", count)
|
||||
|
||||
model.Sequence = 10
|
||||
err = pathentryinfodb.Update(model)
|
||||
require.NoError(t, err)
|
||||
_, err = pathentryinfodb.Get(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = pathentryinfodb.Update(secondModel)
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return model.Sequence == 10
|
||||
}
|
||||
require.Condition(t, condition, "Inner exception")
|
||||
|
||||
pathentryinfodb.Remove(model)
|
||||
count, err = pathentryinfodb.Count()
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return count == 0
|
||||
}
|
||||
require.Condition(t, condition, "Expected count to be 0", count)
|
||||
|
||||
err = pathentryinfodb.DbConfig.CloseDb()
|
||||
isOpened = pathentryinfodb.DbConfig.DBIsOpened()
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return !isOpened
|
||||
}
|
||||
require.Condition(t, condition, "Expected db is not opened", isOpened)
|
||||
|
||||
err = pathentryinfodb.DbConfig.DeleteDb()
|
||||
require.NoError(t, err)
|
||||
|
||||
isExist := pathentryinfodb.DbConfig.DBIsExist()
|
||||
condition = func() bool {
|
||||
return !isExist
|
||||
}
|
||||
require.Condition(t, condition, "Expected db is not exist", isExist)
|
||||
}
|
246
src/db/test/selfinfodb_test.go
Normal file
246
src/db/test/selfinfodb_test.go
Normal file
|
@ -0,0 +1,246 @@
|
|||
package db_test
|
||||
|
||||
import (
|
||||
"crypto/ed25519"
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/DATA-DOG/go-sqlmock"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/yggdrasil-network/yggdrasil-go/src/core"
|
||||
|
||||
selfinfodb "github.com/yggdrasil-network/yggdrasil-go/src/db/SelfInfoDB"
|
||||
)
|
||||
|
||||
func TestSelectSelfInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := selfinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
selfinfo := core.SelfInfo{
|
||||
Key: pubkey,
|
||||
}
|
||||
model, err := core.NewSelfInfoDB(selfinfo)
|
||||
require.NoError(t, err)
|
||||
|
||||
rows := sqlmock.NewRows([]string{"RoutingEntries", "Key"}).
|
||||
AddRow(100, model.KeyBytes)
|
||||
|
||||
mock.ExpectQuery("SELECT (.+) FROM self_info WHERE Id = \\?").
|
||||
WithArgs(model.Id).
|
||||
WillReturnRows(rows)
|
||||
|
||||
_, err = cfg.Get(model)
|
||||
t.Log(err)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
|
||||
}
|
||||
|
||||
func TestInsertSelfInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := selfinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
selfinfo := core.SelfInfo{
|
||||
Key: pubkey,
|
||||
}
|
||||
model, err := core.NewSelfInfoDB(selfinfo)
|
||||
require.NoError(t, err)
|
||||
mock.ExpectExec("INSERT OR REPLACE INTO self_info").
|
||||
WithArgs(
|
||||
model.KeyBytes,
|
||||
model.RoutingEntries,
|
||||
).
|
||||
WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
_, err = cfg.Add(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestDeleteSelfInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := selfinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
selfinfo := core.SelfInfo{
|
||||
Key: pubkey,
|
||||
}
|
||||
model, err := core.NewSelfInfoDB(selfinfo)
|
||||
require.NoError(t, err)
|
||||
mock.ExpectExec("DELETE FROM self_info WHERE Id = \\?").
|
||||
WithArgs(
|
||||
model.Id,
|
||||
).WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
err = cfg.Remove(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestUpdateSelfInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := selfinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
selfinfo := core.SelfInfo{
|
||||
Key: pubkey,
|
||||
RoutingEntries: 100,
|
||||
}
|
||||
model, err := core.NewSelfInfoDB(selfinfo)
|
||||
require.NoError(t, err)
|
||||
mock.ExpectExec(`
|
||||
UPDATE self_info
|
||||
SET
|
||||
RoutingEntries = \?,
|
||||
Key = \?
|
||||
WHERE
|
||||
Id = \?`).
|
||||
WithArgs(
|
||||
model.RoutingEntries,
|
||||
model.KeyBytes,
|
||||
model.Id,
|
||||
).WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
err = cfg.Update(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestMainSelfInfo(t *testing.T) {
|
||||
selfinfodb.Name = fmt.Sprintf(
|
||||
"%s.%s",
|
||||
selfinfodb.Name,
|
||||
strconv.Itoa(int(time.Now().Unix())),
|
||||
)
|
||||
selfinfodb, err := selfinfodb.New()
|
||||
require.NoError(t, err)
|
||||
|
||||
selfinfodb.DbConfig.OpenDb()
|
||||
isOpened := selfinfodb.DbConfig.DBIsOpened()
|
||||
condition := func() bool {
|
||||
return isOpened
|
||||
}
|
||||
require.Condition(t, condition, "Expected db is opened", isOpened)
|
||||
|
||||
firstKey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
secondKey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
firstSelfinfo := core.SelfInfo{
|
||||
Key: firstKey,
|
||||
RoutingEntries: 100,
|
||||
}
|
||||
firstModel, err := core.NewSelfInfoDB(firstSelfinfo)
|
||||
require.NoError(t, err)
|
||||
|
||||
secondSelfinfo := core.SelfInfo{
|
||||
Key: secondKey,
|
||||
RoutingEntries: 200,
|
||||
}
|
||||
secondModel, err := core.NewSelfInfoDB(secondSelfinfo)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = selfinfodb.Add(firstModel)
|
||||
require.NoError(t, err)
|
||||
_, err = selfinfodb.Add(secondModel)
|
||||
require.NoError(t, err)
|
||||
count, err := selfinfodb.Count()
|
||||
require.NoError(t, err)
|
||||
condition = func() bool {
|
||||
return count == 2
|
||||
}
|
||||
require.Condition(t, condition, "Expected count to be 2", count)
|
||||
|
||||
err = selfinfodb.Remove(secondModel)
|
||||
require.NoError(t, err)
|
||||
count, err = selfinfodb.Count()
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return count == 1
|
||||
}
|
||||
require.Condition(t, condition, "Expected count to be 1", count)
|
||||
|
||||
firstModel.RoutingEntries = 10
|
||||
err = selfinfodb.Update(firstModel)
|
||||
require.NoError(t, err)
|
||||
_, err = selfinfodb.Get(firstModel)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = selfinfodb.Update(secondModel)
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return firstModel.RoutingEntries == 10
|
||||
}
|
||||
require.Condition(t, condition, "Inner exception")
|
||||
|
||||
selfinfodb.Remove(firstModel)
|
||||
count, err = selfinfodb.Count()
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return count == 0
|
||||
}
|
||||
require.Condition(t, condition, "Expected count to be 0", count)
|
||||
|
||||
err = selfinfodb.DbConfig.CloseDb()
|
||||
isOpened = selfinfodb.DbConfig.DBIsOpened()
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return !isOpened
|
||||
}
|
||||
require.Condition(t, condition, "Expected db is not opened", isOpened)
|
||||
|
||||
err = selfinfodb.DbConfig.DeleteDb()
|
||||
require.NoError(t, err)
|
||||
|
||||
isExist := selfinfodb.DbConfig.DBIsExist()
|
||||
condition = func() bool {
|
||||
return !isExist
|
||||
}
|
||||
require.Condition(t, condition, "Expected db is not exist", isExist)
|
||||
}
|
271
src/db/test/sessioninfodb_test.go
Normal file
271
src/db/test/sessioninfodb_test.go
Normal file
|
@ -0,0 +1,271 @@
|
|||
package db_test
|
||||
|
||||
import (
|
||||
"crypto/ed25519"
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/DATA-DOG/go-sqlmock"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/yggdrasil-network/yggdrasil-go/src/core"
|
||||
|
||||
sessioninfodb "github.com/yggdrasil-network/yggdrasil-go/src/db/SessionInfoDB"
|
||||
)
|
||||
|
||||
func TestSelectSessionInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := sessioninfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.SessionInfo{
|
||||
Key: pubkey,
|
||||
RXBytes: 10,
|
||||
TXBytes: 10,
|
||||
Uptime: time.Hour,
|
||||
}
|
||||
model, err := core.NewSessionInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
|
||||
rows := sqlmock.NewRows([]string{"RXBytes", "TXBytes", "Duration", "Key"}).
|
||||
AddRow(100, 200, 100, model.KeyBytes)
|
||||
|
||||
mock.ExpectQuery("SELECT (.+) FROM session_info WHERE Id = \\?").
|
||||
WithArgs(model.Id).
|
||||
WillReturnRows(rows)
|
||||
|
||||
_, err = cfg.Get(model)
|
||||
t.Log(err)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
|
||||
}
|
||||
|
||||
func TestInsertSessionInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := sessioninfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.SessionInfo{
|
||||
Key: pubkey,
|
||||
RXBytes: 10,
|
||||
TXBytes: 10,
|
||||
Uptime: time.Hour,
|
||||
}
|
||||
model, err := core.NewSessionInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
|
||||
mock.ExpectExec("INSERT INTO session_info").
|
||||
WithArgs(
|
||||
model.KeyBytes,
|
||||
model.RXBytes,
|
||||
model.TXBytes,
|
||||
model.Uptime,
|
||||
).
|
||||
WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
_, err = cfg.Add(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestDeleteSessionInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := sessioninfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.SessionInfo{
|
||||
Key: pubkey,
|
||||
RXBytes: 10,
|
||||
TXBytes: 10,
|
||||
Uptime: time.Hour,
|
||||
}
|
||||
model, err := core.NewSessionInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
mock.ExpectExec("DELETE FROM session_info WHERE Id = \\?").
|
||||
WithArgs(
|
||||
model.Id,
|
||||
).WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
err = cfg.Remove(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestUpdateSessionInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := sessioninfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.SessionInfo{
|
||||
Key: pubkey,
|
||||
RXBytes: 10,
|
||||
TXBytes: 10,
|
||||
Uptime: time.Hour,
|
||||
}
|
||||
model, err := core.NewSessionInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
mock.ExpectExec(`
|
||||
UPDATE session_info
|
||||
SET
|
||||
RXBytes = RXBytes \+ \?,
|
||||
TXBytes = TXBytes \+ \?,
|
||||
Duration = Duration \+ \?,
|
||||
Key = \?
|
||||
WHERE
|
||||
Id = \?`).
|
||||
WithArgs(
|
||||
model.RXBytes,
|
||||
model.TXBytes,
|
||||
model.Uptime,
|
||||
model.KeyBytes,
|
||||
model.Id,
|
||||
).WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
err = cfg.Update(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestMainSessionInfo(t *testing.T) {
|
||||
sessioninfodb.Name = fmt.Sprintf(
|
||||
"%s.%s",
|
||||
sessioninfodb.Name,
|
||||
strconv.Itoa(int(time.Now().Unix())),
|
||||
)
|
||||
sessioninfodb, err := sessioninfodb.New()
|
||||
require.NoError(t, err)
|
||||
|
||||
sessioninfodb.DbConfig.OpenDb()
|
||||
isOpened := sessioninfodb.DbConfig.DBIsOpened()
|
||||
condition := func() bool {
|
||||
return isOpened
|
||||
}
|
||||
require.Condition(t, condition, "Expected db is opened", isOpened)
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
secondPubKey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.SessionInfo{
|
||||
Key: pubkey,
|
||||
RXBytes: 10,
|
||||
TXBytes: 10,
|
||||
Uptime: time.Hour,
|
||||
}
|
||||
model, err := core.NewSessionInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
|
||||
secondEntry := core.SessionInfo{
|
||||
Key: secondPubKey,
|
||||
RXBytes: 10,
|
||||
TXBytes: 10,
|
||||
Uptime: time.Hour,
|
||||
}
|
||||
secondModel, err := core.NewSessionInfoDB(secondEntry)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = sessioninfodb.Add(model)
|
||||
require.NoError(t, err)
|
||||
_, err = sessioninfodb.Add(secondModel)
|
||||
require.NoError(t, err)
|
||||
count, err := sessioninfodb.Count()
|
||||
require.NoError(t, err)
|
||||
condition = func() bool {
|
||||
return count == 2
|
||||
}
|
||||
require.Condition(t, condition, "Expected count to be 2", count)
|
||||
|
||||
err = sessioninfodb.Remove(secondModel)
|
||||
require.NoError(t, err)
|
||||
count, err = sessioninfodb.Count()
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return count == 1
|
||||
}
|
||||
require.Condition(t, condition, "Expected count to be 1", count)
|
||||
|
||||
model.TXBytes = 100
|
||||
model.RXBytes = 150
|
||||
model.Uptime = 100
|
||||
err = sessioninfodb.Update(model)
|
||||
require.NoError(t, err)
|
||||
_, err = sessioninfodb.Get(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = sessioninfodb.Update(secondModel)
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return model.RXBytes == 160 &&
|
||||
model.TXBytes == 110 && model.Uptime == 3600000000100
|
||||
}
|
||||
require.Condition(t, condition, "Inner exception")
|
||||
|
||||
sessioninfodb.Remove(model)
|
||||
count, err = sessioninfodb.Count()
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return count == 0
|
||||
}
|
||||
require.Condition(t, condition, "Expected count to be 0", count)
|
||||
|
||||
err = sessioninfodb.DbConfig.CloseDb()
|
||||
isOpened = sessioninfodb.DbConfig.DBIsOpened()
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return !isOpened
|
||||
}
|
||||
require.Condition(t, condition, "Expected db is not opened", isOpened)
|
||||
|
||||
err = sessioninfodb.DbConfig.DeleteDb()
|
||||
require.NoError(t, err)
|
||||
|
||||
isExist := sessioninfodb.DbConfig.DBIsExist()
|
||||
condition = func() bool {
|
||||
return !isExist
|
||||
}
|
||||
require.Condition(t, condition, "Expected db is not exist", isExist)
|
||||
}
|
259
src/db/test/treeentryinfodb_test.go
Normal file
259
src/db/test/treeentryinfodb_test.go
Normal file
|
@ -0,0 +1,259 @@
|
|||
package db_test
|
||||
|
||||
import (
|
||||
"crypto/ed25519"
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/DATA-DOG/go-sqlmock"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/yggdrasil-network/yggdrasil-go/src/core"
|
||||
|
||||
treeentryinfodb "github.com/yggdrasil-network/yggdrasil-go/src/db/TreeEntryInfoDB"
|
||||
)
|
||||
|
||||
func TestSelectTreeEntryInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := treeentryinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.TreeEntryInfo{
|
||||
Key: pubkey,
|
||||
Parent: pubkey,
|
||||
Sequence: 10,
|
||||
}
|
||||
model, err := core.NewTreeEntryInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
|
||||
rows := sqlmock.NewRows([]string{"Sequence", "Key", "Parent"}).
|
||||
AddRow(100, model.KeyBytes, model.ParentBytes)
|
||||
|
||||
mock.ExpectQuery("SELECT (.+) FROM tree_entry_info WHERE Id = \\?").
|
||||
WithArgs(model.Id).
|
||||
WillReturnRows(rows)
|
||||
|
||||
_, err = cfg.Get(model)
|
||||
t.Log(err)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
|
||||
}
|
||||
|
||||
func TestInsertTreeEntryInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := treeentryinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.TreeEntryInfo{
|
||||
Key: pubkey,
|
||||
Parent: pubkey,
|
||||
Sequence: 10,
|
||||
}
|
||||
model, err := core.NewTreeEntryInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
|
||||
mock.ExpectExec("INSERT INTO tree_entry_info").
|
||||
WithArgs(
|
||||
model.KeyBytes,
|
||||
model.ParentBytes,
|
||||
model.Sequence,
|
||||
).
|
||||
WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
_, err = cfg.Add(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestDeleteTreeEntryInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := treeentryinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.TreeEntryInfo{
|
||||
Key: pubkey,
|
||||
Parent: pubkey,
|
||||
Sequence: 10,
|
||||
}
|
||||
model, err := core.NewTreeEntryInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
mock.ExpectExec("DELETE FROM tree_entry_info WHERE Id = \\?").
|
||||
WithArgs(
|
||||
model.Id,
|
||||
).WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
err = cfg.Remove(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestUpdateTreeEntryInfo(t *testing.T) {
|
||||
mockDB, mock, err := sqlmock.New()
|
||||
require.NoError(t, err)
|
||||
defer mockDB.Close()
|
||||
|
||||
cfg, err := treeentryinfodb.New()
|
||||
require.NoError(t, err)
|
||||
cfg.DbConfig.DB = mockDB
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.TreeEntryInfo{
|
||||
Key: pubkey,
|
||||
Parent: pubkey,
|
||||
Sequence: 10,
|
||||
}
|
||||
model, err := core.NewTreeEntryInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
mock.ExpectExec(`
|
||||
UPDATE tree_entry_info
|
||||
SET
|
||||
Sequence = \?,
|
||||
Key = \?,
|
||||
Parent = \?
|
||||
WHERE
|
||||
Id = \?`).
|
||||
WithArgs(
|
||||
model.Sequence,
|
||||
model.KeyBytes,
|
||||
model.ParentBytes,
|
||||
model.Id,
|
||||
).WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
|
||||
err = cfg.Update(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = mock.ExpectationsWereMet()
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestMainTreeEntryInfo(t *testing.T) {
|
||||
treeentryinfodb.Name = fmt.Sprintf(
|
||||
"%s.%s",
|
||||
treeentryinfodb.Name,
|
||||
strconv.Itoa(int(time.Now().Unix())),
|
||||
)
|
||||
treeentryinfodb, err := treeentryinfodb.New()
|
||||
require.NoError(t, err)
|
||||
|
||||
treeentryinfodb.DbConfig.OpenDb()
|
||||
isOpened := treeentryinfodb.DbConfig.DBIsOpened()
|
||||
condition := func() bool {
|
||||
return isOpened
|
||||
}
|
||||
require.Condition(t, condition, "Expected db is opened", isOpened)
|
||||
|
||||
pubkey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
secondPubKey, _, err := ed25519.GenerateKey(rand.Reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
entry := core.TreeEntryInfo{
|
||||
Key: pubkey,
|
||||
Parent: pubkey,
|
||||
Sequence: 10,
|
||||
}
|
||||
model, err := core.NewTreeEntryInfoDB(entry)
|
||||
require.NoError(t, err)
|
||||
|
||||
secondEntry := core.TreeEntryInfo{
|
||||
Key: secondPubKey,
|
||||
Parent: secondPubKey,
|
||||
Sequence: 20,
|
||||
}
|
||||
secondModel, err := core.NewTreeEntryInfoDB(secondEntry)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = treeentryinfodb.Add(model)
|
||||
require.NoError(t, err)
|
||||
_, err = treeentryinfodb.Add(secondModel)
|
||||
require.NoError(t, err)
|
||||
count, err := treeentryinfodb.Count()
|
||||
require.NoError(t, err)
|
||||
condition = func() bool {
|
||||
return count == 2
|
||||
}
|
||||
require.Condition(t, condition, "Expected count to be 2", count)
|
||||
|
||||
err = treeentryinfodb.Remove(secondModel)
|
||||
require.NoError(t, err)
|
||||
count, err = treeentryinfodb.Count()
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return count == 1
|
||||
}
|
||||
require.Condition(t, condition, "Expected count to be 1", count)
|
||||
|
||||
model.Sequence = 100
|
||||
err = treeentryinfodb.Update(model)
|
||||
require.NoError(t, err)
|
||||
_, err = treeentryinfodb.Get(model)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = treeentryinfodb.Update(secondModel)
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return model.Sequence == 100
|
||||
}
|
||||
require.Condition(t, condition, "Inner exception")
|
||||
|
||||
treeentryinfodb.Remove(model)
|
||||
count, err = treeentryinfodb.Count()
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return count == 0
|
||||
}
|
||||
require.Condition(t, condition, "Expected count to be 0", count)
|
||||
|
||||
err = treeentryinfodb.DbConfig.CloseDb()
|
||||
isOpened = treeentryinfodb.DbConfig.DBIsOpened()
|
||||
require.NoError(t, err)
|
||||
|
||||
condition = func() bool {
|
||||
return !isOpened
|
||||
}
|
||||
require.Condition(t, condition, "Expected db is not opened", isOpened)
|
||||
|
||||
err = treeentryinfodb.DbConfig.DeleteDb()
|
||||
require.NoError(t, err)
|
||||
|
||||
isExist := treeentryinfodb.DbConfig.DBIsExist()
|
||||
condition = func() bool {
|
||||
return !isExist
|
||||
}
|
||||
require.Condition(t, condition, "Expected db is not exist", isExist)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue