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 }