Files
clio/tools/snapshot/internal/export/export_test.go
cyan317 f454076fb6 feat: Snapshot import feature (#1970)
Implement snapshot import cmd
`clio_snapshot --server --grpc_server 0.0.0.0:12345 --path
<snapshot_path>`

Implement snapshot range cmd
`./clio_snapshot --range --path <snapshot_path>`

Add
LedgerHouses: It is responsible for reading/writing snapshot data
Server: Start grpc server and ws server
2025-03-26 09:11:15 +00:00

148 lines
4.8 KiB
Go

package export
import (
"fmt"
"os"
"testing"
"github.com/stretchr/testify/assert"
"xrplf/clio/clio_snapshot/internal/ledgers"
"xrplf/clio/clio_snapshot/mocks"
pb "xrplf/clio/clio_snapshot/org/xrpl/rpc/v1"
"github.com/golang/mock/gomock"
)
// Matcher used to verify the GetLedgerRequest parameters
type LedgerRequestMatcher struct {
expectedObjects bool
expectedNeighbors bool
}
func (m LedgerRequestMatcher) Matches(x interface{}) bool {
req, ok := x.(*pb.GetLedgerRequest)
return ok && req.GetObjects == m.expectedObjects && req.GetObjectNeighbors == m.expectedNeighbors
}
func (m LedgerRequestMatcher) String() string {
return fmt.Sprintf("LedgerRequest with objects=%v neighbors=%v", m.expectedObjects, m.expectedNeighbors)
}
func matchObjectsEquals(objects bool, neighbors bool) gomock.Matcher {
return LedgerRequestMatcher{objects, neighbors}
}
func TestExportDeltaLedgerData(t *testing.T) {
tests := []struct {
name string
startSeq uint32
endSeq uint32
}{
{"OneSeq", 700000, 700000},
{"MultipleSeq", 700000, 700019},
{"FirstAvailableLedger", firstAvailableLedger, firstAvailableLedger},
{"FirstAvailableLedgerMultipleSeq", firstAvailableLedger, firstAvailableLedger + 2},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockClient := mocks.NewMockXRPLedgerAPIServiceClient(ctrl)
mockResponse := &pb.GetLedgerResponse{}
times := tt.endSeq - tt.startSeq + 1
if tt.endSeq < tt.startSeq {
times = 0
}
if tt.startSeq == firstAvailableLedger {
mockClient.EXPECT().GetLedger(gomock.Any(), matchObjectsEquals(false, false)).Return(mockResponse, nil).Times(1)
mockClient.EXPECT().GetLedger(gomock.Any(), matchObjectsEquals(true, true)).Return(mockResponse, nil).Times(int(times) - 1)
} else {
mockClient.EXPECT().GetLedger(gomock.Any(), matchObjectsEquals(true, true)).Return(mockResponse, nil).Times(int(times))
}
os.MkdirAll("test", os.ModePerm)
manifest := ledgers.NewManifest("test")
manifest.SetLedgerRange(tt.startSeq-1, tt.startSeq-1)
defer os.RemoveAll("test")
exportFromDeltaLedgerImpl(mockClient, tt.startSeq, tt.endSeq, "test")
seq1, seq2, err := manifest.Read()
assert.Nil(t, err)
assert.Equal(t, tt.startSeq-1, seq1)
assert.Equal(t, tt.endSeq, seq2)
})
}
}
func TestExportFullLedgerData(t *testing.T) {
tests := []struct {
name string
startSeq uint32
endSeq uint32
}{
{"OneSeq", 1, 1},
{"MultipleSeq", 1, 20},
{"EndSeqLessThanStartSeq", 20, 1},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockClient := mocks.NewMockXRPLedgerAPIServiceClient(ctrl)
mockDataResponse := &pb.GetLedgerDataResponse{}
mockLedgerResponse := &pb.GetLedgerResponse{}
timesLedgerDataCalled := 16
timesLedgerCalled := tt.endSeq - tt.startSeq + 1
if tt.endSeq < tt.startSeq {
timesLedgerCalled = 0
}
mockClient.EXPECT().GetLedgerData(gomock.Any(), gomock.Any()).Return(mockDataResponse, nil).Times(timesLedgerDataCalled)
mockClient.EXPECT().GetLedger(gomock.Any(), gomock.Any()).Return(mockLedgerResponse, nil).Times(int(timesLedgerCalled))
defer os.RemoveAll("test")
exportFromFullLedgerImpl(mockClient, tt.startSeq, tt.endSeq, "test")
_, err := os.Stat("test")
assert.False(t, os.IsNotExist(err))
})
}
}
func TestGenerateMarkers(t *testing.T) {
tests := []struct {
name string
in uint32
out [][32]byte
}{
{"GenerateMarkers1", 1, [][32]byte{{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}},
{"GenerateMarkers2", 2, [][32]byte{{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}},
{"GenerateMarkers4", 4, [][32]byte{{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
assert.Equal(t, generateMarkers(tt.in), tt.out)
})
}
}