From 5b8f1c5cfb416bb2bd7a82b759f345fdd568a41e Mon Sep 17 00:00:00 2001 From: capossele <angelocapossele@gmail.com> Date: Fri, 20 Mar 2020 20:29:14 +0000 Subject: [PATCH] :white_check_mark: adds dispatcher test --- packages/binary/drng/dispatcher.go | 11 ++- packages/binary/drng/dispatcher_test.go | 72 +++++++++++++++++++ packages/binary/drng/payload/payload.go | 3 + packages/binary/drng/state/state.go | 7 +- .../collectiveBeacon/collective_beacon.go | 2 + .../collective_beacon_test.go | 2 +- plugins/drng/plugin.go | 5 +- 7 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 packages/binary/drng/dispatcher_test.go diff --git a/packages/binary/drng/dispatcher.go b/packages/binary/drng/dispatcher.go index 8cc1beb9..1d72badc 100644 --- a/packages/binary/drng/dispatcher.go +++ b/packages/binary/drng/dispatcher.go @@ -1,6 +1,7 @@ package drng import ( + "errors" "time" "github.com/iotaledger/goshimmer/packages/binary/drng/payload" @@ -12,14 +13,14 @@ import ( "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" ) -func (drng *Instance) Dispatch(issuer ed25119.PublicKey, timestamp time.Time, payload *payload.Payload) { +func (drng *Instance) Dispatch(issuer ed25119.PublicKey, timestamp time.Time, payload *payload.Payload) error { switch payload.SubType() { case header.CollectiveBeaconType(): // parse as CollectiveBeaconType marshalUtil := marshalutil.New(payload.Bytes()) parsedPayload, err := cb.Parse(marshalUtil) if err != nil { - return + return err } // trigger CollectiveBeaconEvent cbEvent := &events.CollectiveBeaconEvent{ @@ -35,12 +36,16 @@ func (drng *Instance) Dispatch(issuer ed25119.PublicKey, timestamp time.Time, pa // process collectiveBeacon if err := collectiveBeacon.ProcessBeacon(drng.State, cbEvent); err != nil { - return + return err } + // trigger RandomnessEvent drng.Events.Randomness.Trigger(drng.State.Randomness()) + return nil + default: //do other stuff + return errors.New("subtype not implemented") } } diff --git a/packages/binary/drng/dispatcher_test.go b/packages/binary/drng/dispatcher_test.go new file mode 100644 index 00000000..a97ca57f --- /dev/null +++ b/packages/binary/drng/dispatcher_test.go @@ -0,0 +1,72 @@ +package drng + +import ( + "encoding/hex" + "testing" + "time" + + "github.com/iotaledger/goshimmer/packages/binary/drng/payload" + "github.com/iotaledger/goshimmer/packages/binary/drng/payload/header" + "github.com/iotaledger/goshimmer/packages/binary/drng/state" + "github.com/iotaledger/goshimmer/packages/binary/drng/subtypes/collectiveBeacon" + "github.com/iotaledger/goshimmer/packages/binary/drng/subtypes/collectiveBeacon/events" + cbPayload "github.com/iotaledger/goshimmer/packages/binary/drng/subtypes/collectiveBeacon/payload" + "github.com/iotaledger/goshimmer/packages/binary/marshalutil" + "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" + "github.com/stretchr/testify/require" +) + +var ( + eventTest *events.CollectiveBeaconEvent + prevSignatureTest []byte + signatureTest []byte + dpkTest []byte + issuerPK ed25119.PublicKey + committeeTest *state.Committee + timestampTest time.Time + randomnessTest *state.Randomness +) + +func init() { + prevSignatureTest, _ = hex.DecodeString("ae9ba6d1445bffea8e66cb7d28fe5924e0a8d31b11b62a8710204e56e1ba84bc3694a3033e5793fcee6e75e956e5da3016cd0e22aa46fa419cd06343a7ff9d1e9c5c08f660f0bdec099e97ef99f470bb8c607ce9667a165e9caa474710f62ffd") + signatureTest, _ = hex.DecodeString("8dee56fae60dcad960f7176d0813d5415b930cf6e20c299ec2c2dfc5f2ad4903916fd462ba1abf5c32a5bfd94dcc8eba062d011a548d99df7fa1e3bbbc9a0455663d60f6ccc736c1d5b6de727dbe4427e21fb660925518be386265913f447c94") + dpkTest, _ = hex.DecodeString("a02fcd15edd52c8e134027491a43b597505b466d1679e88f70f927e57c45a93ae0765ff02fc2d015e3a02fd8748e2103") + timestampTest = time.Now() + + rand, _ := collectiveBeacon.GetRandomness(signatureTest) + randomnessTest = &state.Randomness{ + Round: 1, + Randomness: rand, + Timestamp: timestampTest, + } + + kp := ed25119.GenerateKeyPair() + issuerPK = kp.PublicKey + + committeeTest = &state.Committee{ + InstanceID: 1, + Threshold: 3, + Identities: []ed25119.PublicKey{issuerPK}, + DistributedPK: dpkTest, + } +} + +func dummyPayload() *cbPayload.Payload { + header := header.New(header.CollectiveBeaconType(), 0) + return cbPayload.New(header.Instance(), + 1, + prevSignatureTest, + signatureTest, + dpkTest) +} + +func TestDispatcher(t *testing.T) { + marshalUtil := marshalutil.New(dummyPayload().Bytes()) + parsedPayload, err := payload.Parse(marshalUtil) + require.NoError(t, err) + + drng := New(state.SetCommittee(committeeTest)) + err = drng.Dispatch(issuerPK, timestampTest, parsedPayload) + require.NoError(t, err) + require.Equal(t, *randomnessTest, drng.State.Randomness()) +} diff --git a/packages/binary/drng/payload/payload.go b/packages/binary/drng/payload/payload.go index 26e36989..3422447a 100644 --- a/packages/binary/drng/payload/payload.go +++ b/packages/binary/drng/payload/payload.go @@ -81,6 +81,9 @@ func FromBytes(bytes []byte, optionalTargetObject ...*Payload) (result *Payload, return } + // return the number of bytes we processed + consumedBytes = marshalUtil.ReadOffset() + // store bytes, so we don't have to marshal manually result.bytes = bytes[:consumedBytes] diff --git a/packages/binary/drng/state/state.go b/packages/binary/drng/state/state.go index c4746384..b0a89b50 100644 --- a/packages/binary/drng/state/state.go +++ b/packages/binary/drng/state/state.go @@ -19,7 +19,6 @@ type Committee struct { Identities []ed25119.PublicKey DistributedPK []byte } - type State struct { randomness *Randomness committe *Committee @@ -48,6 +47,9 @@ func (s *State) SetRandomness(r *Randomness) { func (s *State) Randomness() Randomness { s.mutex.RLock() defer s.mutex.RUnlock() + if s.randomness == nil { + return Randomness{} + } return *s.randomness } @@ -60,5 +62,8 @@ func (s *State) SetCommittee(c *Committee) { func (s *State) Committee() Committee { s.mutex.RLock() defer s.mutex.RUnlock() + if s.committe == nil { + return Committee{} + } return *s.committe } diff --git a/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon.go b/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon.go index 6346aa33..971e5559 100644 --- a/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon.go +++ b/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon.go @@ -33,7 +33,9 @@ func ProcessBeacon(drng *state.State, cb *events.CollectiveBeaconEvent) error { Randomness: randomness, Timestamp: cb.Timestamp, } + drng.SetRandomness(newRandomness) + return nil } diff --git a/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon_test.go b/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon_test.go index a3413dfa..749a161b 100644 --- a/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon_test.go +++ b/packages/binary/drng/subtypes/collectiveBeacon/collective_beacon_test.go @@ -56,7 +56,7 @@ func TestGetRandomness(t *testing.T) { require.NoError(t, err) } -func TestProcessTransaction(t *testing.T) { +func TestProcessBeacon(t *testing.T) { err := ProcessBeacon(stateTest, eventTest) require.NoError(t, err) } diff --git a/plugins/drng/plugin.go b/plugins/drng/plugin.go index e33da390..9ee15179 100644 --- a/plugins/drng/plugin.go +++ b/plugins/drng/plugin.go @@ -32,9 +32,12 @@ func configureEvents() { marshalUtil := marshalutil.New(transaction.GetPayload().Bytes()) parsedPayload, err := payload.Parse(marshalUtil) if err != nil { + //TODO: handle error return } - Instance.Dispatch(transaction.IssuerPublicKey(), transaction.IssuingTime(), parsedPayload) + if err := Instance.Dispatch(transaction.IssuerPublicKey(), transaction.IssuingTime(), parsedPayload); err != nil { + //TODO: handle error + } }) })) -- GitLab