github.com/gagliardetto/solana-go@v1.11.0/programs/serum/queue_test.go (about) 1 // Copyright 2021 github.com/gagliardetto 2 // This file has been modified by github.com/gagliardetto 3 // 4 // Copyright 2020 dfuse Platform Inc. 5 // 6 // Licensed under the Apache License, Version 2.0 (the "License"); 7 // you may not use this file except in compliance with the License. 8 // You may obtain a copy of the License at 9 // 10 // http://www.apache.org/licenses/LICENSE-2.0 11 // 12 // Unless required by applicable law or agreed to in writing, software 13 // distributed under the License is distributed on an "AS IS" BASIS, 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 // See the License for the specific language governing permissions and 16 // limitations under the License. 17 18 package serum 19 20 import ( 21 "context" 22 "fmt" 23 "os" 24 "strings" 25 "testing" 26 "time" 27 28 bin "github.com/gagliardetto/binary" 29 "github.com/gagliardetto/solana-go" 30 "github.com/gagliardetto/solana-go/diff" 31 "github.com/gagliardetto/solana-go/rpc" 32 "github.com/stretchr/testify/assert" 33 "github.com/stretchr/testify/require" 34 ) 35 36 func TestDecoder_EventQueue_Diff(t *testing.T) { 37 //t.Skip("diff event queue test") 38 39 oldDataFile := "testdata/serum-event-queue-old.bin.zst" 40 newDataFile := "testdata/serum-event-queue-new.bin.zst" 41 42 olDataJSONFile := strings.ReplaceAll(oldDataFile, ".bin.zst", ".json") 43 newDataJSONFile := strings.ReplaceAll(newDataFile, ".bin.zst", ".json") 44 45 if os.Getenv("TESTDATA_UPDATE") == "true" { 46 client := rpc.New("http://api.mainnet-beta.solana.com:80/rpc") 47 ctx := context.Background() 48 account := solana.MustPublicKeyFromBase58("13iGJcA4w5hcJZDjJbJQor1zUiDLE4jv2rMW9HkD5Eo1") 49 50 info, err := client.GetAccountInfo(ctx, account) 51 require.NoError(t, err) 52 writeCompressedFile(t, oldDataFile, info.Value.Data.GetBinary()) 53 54 oldQueue := &EventQueue{} 55 require.NoError(t, oldQueue.Decode(info.Value.Data.GetBinary())) 56 writeJSONFile(t, olDataJSONFile, oldQueue) 57 58 time.Sleep(900 * time.Millisecond) 59 60 info, err = client.GetAccountInfo(ctx, account) 61 require.NoError(t, err) 62 writeCompressedFile(t, newDataFile, info.Value.Data.GetBinary()) 63 64 newQueue := &EventQueue{} 65 require.NoError(t, newQueue.Decode(info.Value.Data.GetBinary())) 66 writeJSONFile(t, newDataJSONFile, newQueue) 67 } 68 69 oldQueue := &EventQueue{} 70 require.NoError(t, oldQueue.Decode(readCompressedFile(t, oldDataFile))) 71 72 newQueue := &EventQueue{} 73 require.NoError(t, newQueue.Decode(readCompressedFile(t, newDataFile))) 74 75 fmt.Println("==>> All diff(s)") 76 diff.Diff(oldQueue, newQueue, diff.OnEvent(func(event diff.Event) { fmt.Println("Event " + event.String()) })) 77 } 78 79 func Test_fill(t *testing.T) { 80 tests := []struct { 81 name string 82 e *Event 83 expectIsFill bool 84 expectIsOut bool 85 expectIsBid bool 86 expectIsMaker bool 87 }{ 88 { 89 name: "Is Fill", 90 e: &Event{ 91 Flag: 0b00000001, 92 }, 93 expectIsFill: true, 94 expectIsOut: false, 95 expectIsBid: false, 96 expectIsMaker: false, 97 }, 98 { 99 name: "Is Out", 100 e: &Event{ 101 Flag: 0b00000010, 102 }, 103 expectIsFill: false, 104 expectIsOut: true, 105 expectIsBid: false, 106 expectIsMaker: false, 107 }, 108 { 109 name: "Is Fill & bid", 110 e: &Event{ 111 Flag: 0b00000101, 112 }, 113 expectIsFill: true, 114 expectIsOut: false, 115 expectIsBid: true, 116 expectIsMaker: false, 117 }, 118 { 119 name: "Is Fill & bid & maker", 120 e: &Event{ 121 Flag: 0b00001101, 122 }, 123 expectIsFill: true, 124 expectIsOut: false, 125 expectIsBid: true, 126 expectIsMaker: true, 127 }, 128 } 129 130 for _, test := range tests { 131 t.Run(test.name, func(t *testing.T) { 132 assert.Equal(t, test.expectIsFill, test.e.Flag.IsFill()) 133 assert.Equal(t, test.expectIsOut, test.e.Flag.IsOut()) 134 assert.Equal(t, test.expectIsBid, test.e.Flag.IsBid()) 135 assert.Equal(t, test.expectIsMaker, test.e.Flag.IsMaker()) 136 }) 137 } 138 } 139 140 func TestDecoder_EventQueue_DiffManual(t *testing.T) { 141 oldQueue := &EventQueue{ 142 SerumPadding: [5]byte{}, 143 Head: 120, 144 Count: 13, 145 SeqNum: 25, 146 Events: []*Event{ 147 {OrderID: OrderID(bin.Uint128{Lo: 1})}, 148 {OrderID: OrderID(bin.Uint128{Lo: 2})}, 149 }, 150 EndPadding: [7]byte{}, 151 } 152 153 newQueue := &EventQueue{ 154 Head: 120, 155 Count: 13, 156 SeqNum: 25, 157 Events: []*Event{ 158 {OrderID: OrderID(bin.Uint128{Lo: 1})}, 159 {OrderID: OrderID(bin.Uint128{Lo: 4})}, 160 {OrderID: OrderID(bin.Uint128{Lo: 5})}, 161 }, 162 } 163 164 fmt.Println("All diff lines") 165 diff.Diff(oldQueue, newQueue, diff.OnEvent(func(event diff.Event) { fmt.Println("Event " + event.String()) })) 166 167 fmt.Println("") 168 fmt.Println("Processed diff lines") 169 diff.Diff(oldQueue, newQueue, diff.OnEvent(func(event diff.Event) { 170 if match, _ := event.Match("Events[#]"); match { 171 fmt.Printf("Event %s => %v\n", event.Kind, event.Element()) 172 } 173 })) 174 }