2
0
mirror of https://github.com/lightninglabs/loop synced 2024-11-13 13:10:30 +00:00
loop/client/store_mock_test.go
2019-03-06 15:29:49 -08:00

147 lines
3.1 KiB
Go

package client
import (
"errors"
"testing"
"time"
"github.com/lightninglabs/loop/test"
"github.com/lightningnetwork/lnd/lntypes"
)
// storeMock implements a mock client swap store.
type storeMock struct {
unchargeSwaps map[lntypes.Hash]*UnchargeContract
unchargeUpdates map[lntypes.Hash][]SwapState
unchargeStoreChan chan UnchargeContract
unchargeUpdateChan chan SwapState
t *testing.T
}
type finishData struct {
preimage lntypes.Hash
result SwapState
}
// NewStoreMock instantiates a new mock store.
func newStoreMock(t *testing.T) *storeMock {
return &storeMock{
unchargeStoreChan: make(chan UnchargeContract, 1),
unchargeUpdateChan: make(chan SwapState, 1),
unchargeSwaps: make(map[lntypes.Hash]*UnchargeContract),
unchargeUpdates: make(map[lntypes.Hash][]SwapState),
t: t,
}
}
// getUnchargeSwaps returns all swaps currently in the store.
func (s *storeMock) getUnchargeSwaps() ([]*PersistentUncharge, error) {
result := []*PersistentUncharge{}
for hash, contract := range s.unchargeSwaps {
updates := s.unchargeUpdates[hash]
events := make([]*PersistentUnchargeEvent, len(updates))
for i, u := range updates {
events[i] = &PersistentUnchargeEvent{
State: u,
}
}
swap := &PersistentUncharge{
Hash: hash,
Contract: contract,
Events: events,
}
result = append(result, swap)
}
return result, nil
}
// createUncharge adds an initiated swap to the store.
func (s *storeMock) createUncharge(hash lntypes.Hash,
swap *UnchargeContract) error {
_, ok := s.unchargeSwaps[hash]
if ok {
return errors.New("swap already exists")
}
s.unchargeSwaps[hash] = swap
s.unchargeUpdates[hash] = []SwapState{}
s.unchargeStoreChan <- *swap
return nil
}
// Finalize stores the final swap result.
func (s *storeMock) updateUncharge(hash lntypes.Hash, time time.Time,
state SwapState) error {
updates, ok := s.unchargeUpdates[hash]
if !ok {
return errors.New("swap does not exists")
}
updates = append(updates, state)
s.unchargeUpdates[hash] = updates
s.unchargeUpdateChan <- state
return nil
}
func (s *storeMock) isDone() error {
select {
case <-s.unchargeStoreChan:
return errors.New("storeChan not empty")
default:
}
select {
case <-s.unchargeUpdateChan:
return errors.New("updateChan not empty")
default:
}
return nil
}
func (s *storeMock) assertUnchargeStored() {
s.t.Helper()
select {
case <-s.unchargeStoreChan:
case <-time.After(test.Timeout):
s.t.Fatalf("expected swap to be stored")
}
}
func (s *storeMock) assertStorePreimageReveal() {
s.t.Helper()
select {
case state := <-s.unchargeUpdateChan:
if state != StatePreimageRevealed {
s.t.Fatalf("unexpected state")
}
case <-time.After(test.Timeout):
s.t.Fatalf("expected swap to be marked as preimage revealed")
}
}
func (s *storeMock) assertStoreFinished(expectedResult SwapState) {
s.t.Helper()
select {
case state := <-s.unchargeUpdateChan:
if state != expectedResult {
s.t.Fatalf("expected result %v, but got %v",
expectedResult, state)
}
case <-time.After(test.Timeout):
s.t.Fatalf("expected swap to be finished")
}
}