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  }