Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Storage - move AtomicStorage to a new package #530

Merged
merged 13 commits into from
Feb 1, 2021
3 changes: 2 additions & 1 deletion escrow/control_service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/singnet/snet-daemon/authutils"
"github.com/singnet/snet-daemon/config"
"github.com/singnet/snet-daemon/storage"
"github.com/stretchr/testify/suite"
"math/big"
"strings"
Expand Down Expand Up @@ -82,7 +83,7 @@ func (suite *ControlServiceTestSuite) SetupSuite() {
println("suite.orgMetaData.GetPaymentAddress().Hex() " + suite.orgMetaData.GetPaymentAddress().Hex())
println("suite.receiverAddress.Hex()" + suite.receiverAddress.Hex())

memoryStorage := NewMemStorage()
memoryStorage := storage.NewMemStorage()
suite.storage = NewPaymentChannelStorage(memoryStorage)
suite.paymentStorage = NewPaymentStorage(memoryStorage)
suite.channelService = NewPaymentChannelService(
Expand Down
5 changes: 3 additions & 2 deletions escrow/escrow_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"github.com/singnet/snet-daemon/config"
"github.com/singnet/snet-daemon/storage"
"math/big"
"testing"

Expand Down Expand Up @@ -85,7 +86,7 @@ type PaymentChannelServiceSuite struct {
signerAddress common.Address
recipientAddress common.Address
mpeContractAddress common.Address
memoryStorage *memoryStorage
memoryStorage *storage.MemoryStorage
storage *PaymentChannelStorage
paymentStorage *PaymentStorage

Expand All @@ -99,7 +100,7 @@ func (suite *PaymentChannelServiceSuite) SetupSuite() {
suite.signerAddress = crypto.PubkeyToAddress(suite.signerPrivateKey.PublicKey)
suite.recipientAddress = crypto.PubkeyToAddress(GenerateTestPrivateKey().PublicKey)
suite.mpeContractAddress = blockchain.HexToAddress("0xf25186b5081ff5ce73482ad761db0eb0d25abfbf")
suite.memoryStorage = NewMemStorage()
suite.memoryStorage = storage.NewMemStorage()
suite.storage = NewPaymentChannelStorage(suite.memoryStorage)
suite.paymentStorage = NewPaymentStorage(suite.memoryStorage)

Expand Down
7 changes: 4 additions & 3 deletions escrow/free_call_payment_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"crypto/ecdsa"
"fmt"
"github.com/singnet/snet-daemon/blockchain"
"github.com/singnet/snet-daemon/storage"
"math/big"
"strconv"
"testing"
Expand All @@ -27,7 +28,7 @@ type FreeCallPaymentHandlerTestSuite struct {
privateKey *ecdsa.PrivateKey
key *FreeCallUserKey
data *FreeCallUserData
memoryStorage *memoryStorage
memoryStorage *storage.MemoryStorage
storage *FreeCallUserStorage
metadata *blockchain.ServiceMetadata
}
Expand All @@ -40,11 +41,11 @@ func (suite *FreeCallPaymentHandlerTestSuite) getKey(userId string) *FreeCallUse
func (suite *FreeCallPaymentHandlerTestSuite) SetupSuite() {

suite.privateKey = GenerateTestPrivateKey()
suite.memoryStorage = NewMemStorage()
suite.memoryStorage = storage.NewMemStorage()
suite.storage = NewFreeCallUserStorage(suite.memoryStorage)
orgMetadata, _ := blockchain.InitOrganizationMetaDataFromJson(testJsonOrgGroupData)
suite.metadata, _ = blockchain.InitServiceMetaDataFromJson(testJsonData)
suite.data = &FreeCallUserData{FreeCallsMade:12,UserId:"user1"}
suite.data = &FreeCallUserData{FreeCallsMade: 12, UserId: "user1"}
suite.key = suite.getKey("user1")
suite.paymentHandler = freeCallPaymentHandler{
orgMetadata: orgMetadata,
Expand Down
5 changes: 3 additions & 2 deletions escrow/free_call_state_service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/singnet/snet-daemon/blockchain"
"github.com/singnet/snet-daemon/config"
"github.com/singnet/snet-daemon/storage"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
"math/big"
Expand All @@ -24,7 +25,7 @@ type FreeCallStateServiceSuite struct {
serviceMetaData *blockchain.ServiceMetadata
orgMetaData *blockchain.OrganizationMetaData
stateService *FreeCallStateService
memoryStorage *memoryStorage
memoryStorage *storage.MemoryStorage
storage *FreeCallUserStorage
service FreeCallUserService
request *FreeCallStateRequest
Expand All @@ -49,7 +50,7 @@ func (suite *FreeCallStateServiceSuite) SetupSuite() {

suite.orgMetaData, _ = blockchain.InitOrganizationMetaDataFromJson(testJsonOrgGroupData)
suite.serviceMetaData, _ = blockchain.InitServiceMetaDataFromJson(testJsonData)
suite.memoryStorage = NewMemStorage()
suite.memoryStorage = storage.NewMemStorage()
suite.storage = NewFreeCallUserStorage(suite.memoryStorage)
suite.service = NewFreeCallUserService(suite.storage,
NewEtcdLocker(suite.memoryStorage), func() ([32]byte, error) { return suite.orgMetaData.GetGroupId(), nil },
Expand Down
19 changes: 13 additions & 6 deletions escrow/free_call_storage.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
package escrow

import (
"github.com/singnet/snet-daemon/storage"
"reflect"
)

type FreeCallUserStorage struct {
delegate TypedAtomicStorage
delegate storage.TypedAtomicStorage
}

func NewFreeCallUserStorage(atomicStorage AtomicStorage) *FreeCallUserStorage {
return &FreeCallUserStorage{
delegate: &TypedAtomicStorageImpl{
atomicStorage: &PrefixedAtomicStorage{
func NewFreeCallUserStorage(atomicStorage storage.AtomicStorage) *FreeCallUserStorage {
prefixedStorage := storage.NewPrefixedAtomicStorage(atomicStorage, "/free-call-user/storage")
storage := storage.NewTypedAtomicStorageImpl(
prefixedStorage, serializeFreeCallKey, reflect.TypeOf(FreeCallUserKey{}), serialize, deserialize,
reflect.TypeOf(FreeCallUserData{}),
)
return &FreeCallUserStorage{delegate: storage}
/* return &FreeCallUserStorage{
delegate: &storage.TypedAtomicStorageImpl{
atomicStorage: &storage.PrefixedAtomicStorage{
delegate: atomicStorage,
keyPrefix: "/free-call-user/storage",
},
Expand All @@ -21,7 +28,7 @@ func NewFreeCallUserStorage(atomicStorage AtomicStorage) *FreeCallUserStorage {
valueDeserializer: deserialize,
valueType: reflect.TypeOf(FreeCallUserData{}),
},
}
}*/
}

func serializeFreeCallKey(key interface{}) (serialized string, err error) {
Expand Down
5 changes: 3 additions & 2 deletions escrow/free_call_storage_test.go
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
package escrow

import (
"github.com/singnet/snet-daemon/storage"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
"testing"
)

type FreeCallUserStorageSuite struct {
suite.Suite
memoryStorage *memoryStorage
memoryStorage *storage.MemoryStorage
storage *FreeCallUserStorage
}

func (suite *FreeCallUserStorageSuite) SetupSuite() {

suite.memoryStorage = NewMemStorage()
suite.memoryStorage = storage.NewMemStorage()

suite.storage = NewFreeCallUserStorage(suite.memoryStorage)
}
Expand Down
5 changes: 3 additions & 2 deletions escrow/free_call_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package escrow

import (
"github.com/singnet/snet-daemon/storage"
"testing"

"github.com/singnet/snet-daemon/blockchain"
Expand All @@ -11,7 +12,7 @@ import (

type FreeCallServiceSuite struct {
suite.Suite
memoryStorage *memoryStorage
memoryStorage *storage.MemoryStorage
storage *FreeCallUserStorage
service FreeCallUserService
metadata *blockchain.ServiceMetadata
Expand All @@ -31,7 +32,7 @@ func (suite *FreeCallServiceSuite) SetupSuite() {
metadata, err := blockchain.InitServiceMetaDataFromJson(testJsonData)
assert.Nil(suite.T(), err, "Unexpected error: %v", err)
suite.metadata = metadata
suite.memoryStorage = NewMemStorage()
suite.memoryStorage = storage.NewMemStorage()
suite.groupId = [32]byte{123}
suite.storage = NewFreeCallUserStorage(suite.memoryStorage)
suite.service = NewFreeCallUserService(suite.storage,
Expand Down
6 changes: 3 additions & 3 deletions escrow/lock.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package escrow

import (
"github.com/singnet/snet-daemon/storage"
log "github.com/sirupsen/logrus"
)

Expand All @@ -17,15 +18,14 @@ type Locker interface {
}

// NewEtcdLocker returns new lock which is based on etcd storage.
func NewEtcdLocker(storage AtomicStorage) Locker {
func NewEtcdLocker(storage storage.AtomicStorage) Locker {
return &etcdLocker{
storage: storage,
}
}


type etcdLocker struct {
storage AtomicStorage
storage storage.AtomicStorage
}

const (
Expand Down
22 changes: 10 additions & 12 deletions escrow/payment_channel_storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"encoding/gob"
"fmt"
"github.com/ethereum/go-ethereum/common"
"github.com/singnet/snet-daemon/storage"
log "github.com/sirupsen/logrus"
"github.com/spf13/viper"
"math/big"
Expand All @@ -16,22 +17,19 @@ import (
// PaymentChannelStorage is a storage for PaymentChannelData by
// PaymentChannelKey based on TypedAtomicStorage implementation
type PaymentChannelStorage struct {
delegate TypedAtomicStorage
delegate storage.TypedAtomicStorage
}

// NewPaymentChannelStorage returns new instance of PaymentChannelStorage
// implementation
func NewPaymentChannelStorage(atomicStorage AtomicStorage) *PaymentChannelStorage {
return &PaymentChannelStorage{
delegate: &TypedAtomicStorageImpl{
atomicStorage: NewPrefixedAtomicStorage(atomicStorage, "/payment-channel/storage"),
keySerializer: serializeKey,
keyType: reflect.TypeOf(PaymentChannelKey{}),
valueSerializer: serialize,
valueDeserializer: deserialize,
valueType: reflect.TypeOf(PaymentChannelData{}),
},
}
func NewPaymentChannelStorage(atomicStorage storage.AtomicStorage) *PaymentChannelStorage {
prefixedStorage := storage.NewPrefixedAtomicStorage(atomicStorage, "/payment-channel/storage")
storage := storage.NewTypedAtomicStorageImpl(
prefixedStorage, serializeKey, reflect.TypeOf(PaymentChannelKey{}), serialize, deserialize,
reflect.TypeOf(PaymentChannelData{}),
)
return &PaymentChannelStorage{delegate: storage}

}

func serializeKey(key interface{}) (slice string, err error) {
Expand Down
52 changes: 43 additions & 9 deletions escrow/payment_channel_storage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package escrow

import (
"errors"
"github.com/singnet/snet-daemon/storage"
"math/big"
"testing"

Expand All @@ -27,7 +28,7 @@ type PaymentChannelStorageSuite struct {
senderAddress common.Address
signerAddress common.Address
recipientAddress common.Address
memoryStorage *memoryStorage
memoryStorage *storage.MemoryStorage

storage *PaymentChannelStorage
}
Expand All @@ -36,7 +37,7 @@ func (suite *PaymentChannelStorageSuite) SetupSuite() {
suite.senderAddress = crypto.PubkeyToAddress(GenerateTestPrivateKey().PublicKey)
suite.signerAddress = crypto.PubkeyToAddress(GenerateTestPrivateKey().PublicKey)
suite.recipientAddress = crypto.PubkeyToAddress(GenerateTestPrivateKey().PublicKey)
suite.memoryStorage = NewMemStorage()
suite.memoryStorage = storage.NewMemStorage()

suite.storage = NewPaymentChannelStorage(suite.memoryStorage)
}
Expand Down Expand Up @@ -173,12 +174,45 @@ func (suite *BlockchainChannelReaderSuite) TestGetChannelStateIncorrectRecipeint
}

func (suite *PaymentChannelStorageSuite) TestNewPaymentChannelStorage() {
mpeStorage := NewPrefixedAtomicStorage( NewPrefixedAtomicStorage(suite.memoryStorage,"path1"),"path2")
mpeStorage.Put("key1","value1")
value,_,_ := mpeStorage.Get("key1")
assert.Equal(suite.T(),value,"value1")
values,err := suite.memoryStorage.GetByKeyPrefix("path1")
assert.Equal(suite.T(), len(values),1)
assert.Equal(suite.T(),values[0],"value1")
mpeStorage := storage.NewPrefixedAtomicStorage(storage.NewPrefixedAtomicStorage(suite.memoryStorage, "path1"), "path2")
mpeStorage.Put("key1", "value1")
value, _, _ := mpeStorage.Get("key1")
assert.Equal(suite.T(), value, "value1")
values, err := suite.memoryStorage.GetByKeyPrefix("path1")
assert.Equal(suite.T(), len(values), 1)
assert.Equal(suite.T(), values[0], "value1")
assert.Nil(suite.T(), err)
}

func (suite *PaymentChannelStorageSuite) TestExecuteTransaction() {
t := suite.T()

channelId := big.NewInt(1)
price := big.NewInt(2)
storage := NewPrepaidStorage(storage.NewPrefixedAtomicStorage(suite.memoryStorage, "path1"))
service := NewPrePaidService(storage, nil, func() (bytes [32]byte, e error) {
return [32]byte{123}, nil
})

err := service.UpdateUsage(channelId, big.NewInt(10), PLANNED_AMOUNT)
assert.Nil(t, err)
value, ok, err := service.GetUsage(PrePaidDataKey{ChannelID: channelId, UsageType: PLANNED_AMOUNT})
assert.Nil(t, err)
assert.True(t, ok)
assert.Equal(t, value.Amount, big.NewInt(10))

err = service.UpdateUsage(channelId, price, USED_AMOUNT)
assert.Nil(t, err)
value, ok, err = service.GetUsage(PrePaidDataKey{ChannelID: channelId, UsageType: USED_AMOUNT})
assert.Nil(t, err)
assert.True(t, ok)
assert.Equal(t, value.Amount, price)

err = service.UpdateUsage(channelId, price, REFUND_AMOUNT)
assert.Nil(t, err)
value, ok, err = service.GetUsage(PrePaidDataKey{ChannelID: channelId, UsageType: REFUND_AMOUNT})
assert.Nil(t, err)
assert.True(t, ok)
assert.Equal(t, value.Amount, price)

}
22 changes: 9 additions & 13 deletions escrow/payment_storage.go
Original file line number Diff line number Diff line change
@@ -1,29 +1,25 @@
package escrow

import (
"github.com/singnet/snet-daemon/storage"
"reflect"
)

// PaymentStorage is a storage for PaymentChannelData by
// PaymentChannelKey based on TypedAtomicStorage implementation
type PaymentStorage struct {
delegate TypedAtomicStorage
delegate storage.TypedAtomicStorage
}

// NewPaymentStorage returns new instance of PaymentStorage
// implementation
func NewPaymentStorage(atomicStorage AtomicStorage) *PaymentStorage {
return &PaymentStorage{
delegate: &TypedAtomicStorageImpl{

atomicStorage: NewPrefixedAtomicStorage(atomicStorage, "/payment/storage"),
keySerializer: serializeKey,
keyType: reflect.TypeOf(""),
valueSerializer: serialize,
valueDeserializer: deserialize,
valueType: reflect.TypeOf(Payment{}),
},
}
func NewPaymentStorage(atomicStorage storage.AtomicStorage) *PaymentStorage {
prefixedStorage := storage.NewPrefixedAtomicStorage(atomicStorage, "/payment/storage")
storage := storage.NewTypedAtomicStorageImpl(
prefixedStorage, serializeKey, reflect.TypeOf(""), serialize, deserialize,
reflect.TypeOf(Payment{}),
)
return &PaymentStorage{delegate: storage}
}

func (storage *PaymentStorage) GetAll() (states []*Payment, err error) {
Expand Down
Loading