This commit is contained in:
HappyHakunaMatata 2024-09-03 21:32:11 +02:00
parent 215990860b
commit 80ea41600f
13 changed files with 1811 additions and 250 deletions

Binary file not shown.

View file

@ -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)

View 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)
}

View 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)
}

View 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)
}

View 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)
}