github.com/onflow/flow-go@v0.33.17/model/flow/service_event_test.go (about)

     1  package flow_test
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  
     7  	"github.com/fxamacker/cbor/v2"
     8  	"github.com/google/go-cmp/cmp"
     9  	"github.com/stretchr/testify/require"
    10  	"github.com/vmihailenco/msgpack"
    11  	"gotest.tools/assert"
    12  
    13  	"github.com/onflow/flow-go/crypto"
    14  	cborcodec "github.com/onflow/flow-go/model/encoding/cbor"
    15  	"github.com/onflow/flow-go/model/flow"
    16  	"github.com/onflow/flow-go/utils/unittest"
    17  )
    18  
    19  func TestEncodeDecode(t *testing.T) {
    20  
    21  	setup := unittest.EpochSetupFixture()
    22  	commit := unittest.EpochCommitFixture()
    23  	versionBeacon := unittest.VersionBeaconFixture()
    24  
    25  	comparePubKey := cmp.FilterValues(func(a, b crypto.PublicKey) bool {
    26  		return true
    27  	}, cmp.Comparer(func(a, b crypto.PublicKey) bool {
    28  		if a == nil {
    29  			return b == nil
    30  		}
    31  		return a.Equals(b)
    32  	}))
    33  
    34  	t.Run("json", func(t *testing.T) {
    35  		t.Run("specific event types", func(t *testing.T) {
    36  			// EpochSetup
    37  			b, err := json.Marshal(setup)
    38  			require.NoError(t, err)
    39  
    40  			gotSetup := new(flow.EpochSetup)
    41  			err = json.Unmarshal(b, gotSetup)
    42  			require.NoError(t, err)
    43  			assert.DeepEqual(t, setup, gotSetup, comparePubKey)
    44  
    45  			// EpochCommit
    46  			b, err = json.Marshal(commit)
    47  			require.NoError(t, err)
    48  
    49  			gotCommit := new(flow.EpochCommit)
    50  			err = json.Unmarshal(b, gotCommit)
    51  			require.NoError(t, err)
    52  			assert.DeepEqual(t, commit, gotCommit, comparePubKey)
    53  
    54  			// VersionBeacon
    55  			b, err = json.Marshal(versionBeacon)
    56  			require.NoError(t, err)
    57  
    58  			gotVersionBeacon := new(flow.VersionBeacon)
    59  			err = json.Unmarshal(b, gotVersionBeacon)
    60  			require.NoError(t, err)
    61  			assert.DeepEqual(t, versionBeacon, gotVersionBeacon)
    62  		})
    63  
    64  		t.Run("generic type", func(t *testing.T) {
    65  			// EpochSetup
    66  			b, err := json.Marshal(setup.ServiceEvent())
    67  			require.NoError(t, err)
    68  
    69  			outer := new(flow.ServiceEvent)
    70  			err = json.Unmarshal(b, outer)
    71  			require.NoError(t, err)
    72  			gotSetup, ok := outer.Event.(*flow.EpochSetup)
    73  			require.True(t, ok)
    74  			assert.DeepEqual(t, setup, gotSetup, comparePubKey)
    75  
    76  			// EpochCommit
    77  			t.Logf("- debug: setup.ServiceEvent()=%+v\n", setup.ServiceEvent())
    78  			b, err = json.Marshal(commit.ServiceEvent())
    79  			require.NoError(t, err)
    80  
    81  			outer = new(flow.ServiceEvent)
    82  			t.Logf("- debug: outer=%+v <-- before .Unmarshal()\n", outer)
    83  			err = json.Unmarshal(b, outer)
    84  			t.Logf("- debug: outer=%+v <-- after .Unmarshal()\n", outer)
    85  			require.NoError(t, err)
    86  			gotCommit, ok := outer.Event.(*flow.EpochCommit)
    87  			require.True(t, ok)
    88  			assert.DeepEqual(t, commit, gotCommit, comparePubKey)
    89  
    90  			// VersionBeacon
    91  			t.Logf("- debug: versionBeacon.ServiceEvent()=%+v\n", versionBeacon.ServiceEvent())
    92  			b, err = json.Marshal(versionBeacon.ServiceEvent())
    93  			require.NoError(t, err)
    94  
    95  			outer = new(flow.ServiceEvent)
    96  			t.Logf("- debug: outer=%+v <-- before .Unmarshal()\n", outer)
    97  			err = json.Unmarshal(b, outer)
    98  			t.Logf("- debug: outer=%+v <-- after .Unmarshal()\n", outer)
    99  			require.NoError(t, err)
   100  			gotVersionTable, ok := outer.Event.(*flow.VersionBeacon)
   101  			require.True(t, ok)
   102  			assert.DeepEqual(t, versionBeacon, gotVersionTable)
   103  		})
   104  	})
   105  
   106  	t.Run("msgpack", func(t *testing.T) {
   107  		t.Run("specific event types", func(t *testing.T) {
   108  			// EpochSetup
   109  			b, err := msgpack.Marshal(setup)
   110  			require.NoError(t, err)
   111  
   112  			gotSetup := new(flow.EpochSetup)
   113  			err = msgpack.Unmarshal(b, gotSetup)
   114  			require.NoError(t, err)
   115  			assert.DeepEqual(t, setup, gotSetup, comparePubKey)
   116  
   117  			// EpochCommit
   118  			b, err = msgpack.Marshal(commit)
   119  			require.NoError(t, err)
   120  
   121  			gotCommit := new(flow.EpochCommit)
   122  			err = msgpack.Unmarshal(b, gotCommit)
   123  			require.NoError(t, err)
   124  			assert.DeepEqual(t, commit, gotCommit, comparePubKey)
   125  
   126  			// VersionBeacon
   127  			b, err = msgpack.Marshal(versionBeacon)
   128  			require.NoError(t, err)
   129  
   130  			gotVersionTable := new(flow.VersionBeacon)
   131  			err = msgpack.Unmarshal(b, gotVersionTable)
   132  			require.NoError(t, err)
   133  			assert.DeepEqual(t, versionBeacon, gotVersionTable)
   134  		})
   135  
   136  		t.Run("generic type", func(t *testing.T) {
   137  			b, err := msgpack.Marshal(setup.ServiceEvent())
   138  			require.NoError(t, err)
   139  
   140  			outer := new(flow.ServiceEvent)
   141  			err = msgpack.Unmarshal(b, outer)
   142  			require.NoError(t, err)
   143  			gotSetup, ok := outer.Event.(*flow.EpochSetup)
   144  			require.True(t, ok)
   145  			assert.DeepEqual(t, setup, gotSetup, comparePubKey)
   146  
   147  			// EpochCommit
   148  			t.Logf("- debug: setup.ServiceEvent()=%+v\n", setup.ServiceEvent())
   149  			b, err = msgpack.Marshal(commit.ServiceEvent())
   150  			require.NoError(t, err)
   151  
   152  			outer = new(flow.ServiceEvent)
   153  			t.Logf("- debug: outer=%+v <-- before .Unmarshal()\n", outer)
   154  			err = msgpack.Unmarshal(b, outer)
   155  			t.Logf("- debug: outer=%+v <-- after .Unmarshal()\n", outer)
   156  			require.NoError(t, err)
   157  			gotCommit, ok := outer.Event.(*flow.EpochCommit)
   158  			require.True(t, ok)
   159  			assert.DeepEqual(t, commit, gotCommit, comparePubKey)
   160  
   161  			// VersionBeacon
   162  			t.Logf("- debug: versionTable.ServiceEvent()=%+v\n", versionBeacon.ServiceEvent())
   163  			b, err = msgpack.Marshal(versionBeacon.ServiceEvent())
   164  			require.NoError(t, err)
   165  
   166  			outer = new(flow.ServiceEvent)
   167  			t.Logf("- debug: outer=%+v <-- before .Unmarshal()\n", outer)
   168  			err = msgpack.Unmarshal(b, outer)
   169  			t.Logf("- debug: outer=%+v <-- after .Unmarshal()\n", outer)
   170  			require.NoError(t, err)
   171  			gotVersionTable, ok := outer.Event.(*flow.VersionBeacon)
   172  			require.True(t, ok)
   173  			assert.DeepEqual(t, versionBeacon, gotVersionTable, comparePubKey)
   174  		})
   175  	})
   176  
   177  	t.Run("cbor", func(t *testing.T) {
   178  		t.Run("specific event types", func(t *testing.T) {
   179  			// EpochSetup
   180  			b, err := cborcodec.EncMode.Marshal(setup)
   181  			require.NoError(t, err)
   182  
   183  			gotSetup := new(flow.EpochSetup)
   184  			err = cbor.Unmarshal(b, gotSetup)
   185  			require.NoError(t, err)
   186  			assert.DeepEqual(t, setup, gotSetup, comparePubKey)
   187  
   188  			// EpochCommit
   189  			b, err = cborcodec.EncMode.Marshal(commit)
   190  			require.NoError(t, err)
   191  
   192  			gotCommit := new(flow.EpochCommit)
   193  			err = cbor.Unmarshal(b, gotCommit)
   194  			require.NoError(t, err)
   195  			assert.DeepEqual(t, commit, gotCommit, comparePubKey)
   196  
   197  			// VersionBeacon
   198  			b, err = cborcodec.EncMode.Marshal(versionBeacon)
   199  			require.NoError(t, err)
   200  
   201  			gotVersionTable := new(flow.VersionBeacon)
   202  			err = cbor.Unmarshal(b, gotVersionTable)
   203  			require.NoError(t, err)
   204  			assert.DeepEqual(t, versionBeacon, gotVersionTable)
   205  
   206  		})
   207  
   208  		t.Run("generic type", func(t *testing.T) {
   209  			// EpochSetup
   210  			t.Logf("- debug: setup.ServiceEvent()=%+v\n", setup.ServiceEvent())
   211  			b, err := cborcodec.EncMode.Marshal(setup.ServiceEvent())
   212  			require.NoError(t, err)
   213  
   214  			outer := new(flow.ServiceEvent)
   215  			t.Logf("- debug: outer=%+v <-- before .Unmarshal()\n", outer)
   216  			err = cbor.Unmarshal(b, outer)
   217  			t.Logf("- debug: outer=%+v <-- after .Unmarshal()\n", outer)
   218  			require.NoError(t, err)
   219  			gotSetup, ok := outer.Event.(*flow.EpochSetup)
   220  			require.True(t, ok)
   221  			assert.DeepEqual(t, setup, gotSetup, comparePubKey)
   222  
   223  			// EpochCommit
   224  			b, err = cborcodec.EncMode.Marshal(commit.ServiceEvent())
   225  			require.NoError(t, err)
   226  
   227  			outer = new(flow.ServiceEvent)
   228  			err = cbor.Unmarshal(b, outer)
   229  			require.NoError(t, err)
   230  			gotCommit, ok := outer.Event.(*flow.EpochCommit)
   231  			require.True(t, ok)
   232  			assert.DeepEqual(t, commit, gotCommit, comparePubKey)
   233  
   234  			// VersionBeacon
   235  			t.Logf("- debug: setup.ServiceEvent()=%+v\n", versionBeacon.ServiceEvent())
   236  			b, err = cborcodec.EncMode.Marshal(versionBeacon.ServiceEvent())
   237  			require.NoError(t, err)
   238  
   239  			outer = new(flow.ServiceEvent)
   240  			err = cbor.Unmarshal(b, outer)
   241  			require.NoError(t, err)
   242  			gotVersionTable, ok := outer.Event.(*flow.VersionBeacon)
   243  			require.True(t, ok)
   244  			assert.DeepEqual(t, versionBeacon, gotVersionTable)
   245  		})
   246  	})
   247  }