123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- const { binary } = require('../src/coretypes')
- const { encode, decode } = require('../src')
- const { makeParser, BytesList, BinarySerializer } = binary
- const { coreTypes } = require('../src/types')
- const { UInt8, UInt16, UInt32, UInt64, STObject } = coreTypes
- const bigInt = require('big-integer')
- const { Buffer } = require('buffer/')
-
- const { loadFixture } = require('./utils')
- const fixtures = loadFixture('data-driven-tests.json')
- const deliverMinTx = require('./fixtures/delivermin-tx.json')
- const deliverMinTxBinary = require('./fixtures/delivermin-tx-binary.json')
- const SignerListSet = {
- tx: require('./fixtures/signerlistset-tx.json'),
- binary: require('./fixtures/signerlistset-tx-binary.json'),
- meta: require('./fixtures/signerlistset-tx-meta-binary.json'),
- }
- const DepositPreauth = {
- tx: require('./fixtures/deposit-preauth-tx.json'),
- binary: require('./fixtures/deposit-preauth-tx-binary.json'),
- meta: require('./fixtures/deposit-preauth-tx-meta-binary.json'),
- }
- const Escrow = {
- create: {
- tx: require('./fixtures/escrow-create-tx.json'),
- binary: require('./fixtures/escrow-create-binary.json'),
- },
- finish: {
- tx: require('./fixtures/escrow-finish-tx.json'),
- binary: require('./fixtures/escrow-finish-binary.json'),
- meta: require('./fixtures/escrow-finish-meta-binary.json'),
- },
- cancel: {
- tx: require('./fixtures/escrow-cancel-tx.json'),
- binary: require('./fixtures/escrow-cancel-binary.json'),
- },
- }
- const PaymentChannel = {
- create: {
- tx: require('./fixtures/payment-channel-create-tx.json'),
- binary: require('./fixtures/payment-channel-create-binary.json'),
- },
- fund: {
- tx: require('./fixtures/payment-channel-fund-tx.json'),
- binary: require('./fixtures/payment-channel-fund-binary.json'),
- },
- claim: {
- tx: require('./fixtures/payment-channel-claim-tx.json'),
- binary: require('./fixtures/payment-channel-claim-binary.json'),
- },
- }
-
- const Ticket = {
- create: {
- tx: require('./fixtures/ticket-create-tx.json'),
- binary: require('./fixtures/ticket-create-binary.json'),
- },
- }
-
- let json_undefined = {
- TakerPays: '223174650',
- Account: 'rPk2dXr27rMw9G5Ej9ad2Tt7RJzGy8ycBp',
- TransactionType: 'OfferCreate',
- Memos: [
- {
- Memo: {
- MemoType: '584D4D2076616C7565',
- MemoData: '322E3230393635',
- MemoFormat: undefined,
- },
- },
- ],
- Fee: '15',
- OfferSequence: undefined,
- TakerGets: {
- currency: 'XMM',
- value: '100',
- issuer: 'rExAPEZvbkZqYPuNcZ7XEBLENEshsWDQc8',
- },
- Flags: 524288,
- Sequence: undefined,
- LastLedgerSequence: 6220135,
- }
-
- let json_omitted = {
- TakerPays: '223174650',
- Account: 'rPk2dXr27rMw9G5Ej9ad2Tt7RJzGy8ycBp',
- TransactionType: 'OfferCreate',
- Memos: [
- {
- Memo: {
- MemoType: '584D4D2076616C7565',
- MemoData: '322E3230393635',
- },
- },
- ],
- Fee: '15',
- TakerGets: {
- currency: 'XMM',
- value: '100',
- issuer: 'rExAPEZvbkZqYPuNcZ7XEBLENEshsWDQc8',
- },
- Flags: 524288,
- LastLedgerSequence: 6220135,
- }
-
- const NegativeUNL = require('./fixtures/negative-unl.json')
-
- function bytesListTest() {
- const list = new BytesList()
- .put(Buffer.from([0]))
- .put(Buffer.from([2, 3]))
- .put(Buffer.from([4, 5]))
- test('is an Array<Buffer>', function () {
- expect(Array.isArray(list.bytesArray)).toBe(true)
- expect(list.bytesArray[0] instanceof Buffer).toBe(true)
- })
- test('keeps track of the length itself', function () {
- expect(list.getLength()).toBe(5)
- })
- test('can join all arrays into one via toBytes', function () {
- const joined = list.toBytes()
- expect(joined).toHaveLength(5)
- expect(joined).toEqual(Buffer.from([0, 2, 3, 4, 5]))
- })
- }
-
- function assertRecycles(blob) {
- const parser = makeParser(blob)
- const so = parser.readType(STObject)
- const out = new BytesList()
- so.toBytesSink(out)
- const hex = out.toHex()
- expect(hex).toEqual(blob)
- expect(hex + ':').not.toEqual(blob)
- }
-
- function nestedObjectTests() {
- fixtures.whole_objects.forEach((f, i) => {
- test(`whole_objects[${i}]: can parse blob and dump out same blob`, () => {
- assertRecycles(f.blob_with_no_signing)
- })
- })
- }
-
- function check(type, n, expected) {
- test(`Uint${type.width * 8} serializes ${n} as ${expected}`, function () {
- const bl = new BytesList()
- const serializer = new BinarySerializer(bl)
- if (expected === 'throws') {
- expect(() => serializer.writeType(type, n)).toThrow()
- return
- }
- serializer.writeType(type, n)
- expect(bl.toBytes()).toEqual(Buffer.from(expected))
- })
- }
-
- check(UInt8, 5, [5])
- check(UInt16, 5, [0, 5])
- check(UInt32, 5, [0, 0, 0, 5])
- check(UInt32, 0xffffffff, [255, 255, 255, 255])
- check(UInt8, 0xfeffffff, 'throws')
- check(UInt16, 0xfeffffff, 'throws')
- check(UInt16, 0xfeffffff, 'throws')
- check(UInt64, 0xfeffffff, [0, 0, 0, 0, 254, 255, 255, 255])
- check(UInt64, -1, 'throws')
- check(UInt64, 0, [0, 0, 0, 0, 0, 0, 0, 0])
- check(UInt64, 1, [0, 0, 0, 0, 0, 0, 0, 1])
- check(UInt64, bigInt(1), [0, 0, 0, 0, 0, 0, 0, 1])
-
- function deliverMinTest() {
- test('can serialize DeliverMin', () => {
- expect(encode(deliverMinTx)).toEqual(deliverMinTxBinary)
- })
- }
-
- function SignerListSetTest() {
- test('can serialize SignerListSet', () => {
- expect(encode(SignerListSet.tx)).toEqual(SignerListSet.binary)
- })
- test('can serialize SignerListSet metadata', () => {
- expect(encode(SignerListSet.tx.meta)).toEqual(SignerListSet.meta)
- })
- }
-
- function DepositPreauthTest() {
- test('can serialize DepositPreauth', () => {
- expect(encode(DepositPreauth.tx)).toEqual(DepositPreauth.binary)
- })
- test('can serialize DepositPreauth metadata', () => {
- expect(encode(DepositPreauth.tx.meta)).toEqual(DepositPreauth.meta)
- })
- }
-
- function EscrowTest() {
- test('can serialize EscrowCreate', () => {
- expect(encode(Escrow.create.tx)).toEqual(Escrow.create.binary)
- })
- test('can serialize EscrowFinish', () => {
- expect(encode(Escrow.finish.tx)).toEqual(Escrow.finish.binary)
- expect(encode(Escrow.finish.tx.meta)).toEqual(Escrow.finish.meta)
- })
- test('can serialize EscrowCancel', () => {
- expect(encode(Escrow.cancel.tx)).toEqual(Escrow.cancel.binary)
- })
- }
-
- function PaymentChannelTest() {
- test('can serialize PaymentChannelCreate', () => {
- expect(encode(PaymentChannel.create.tx)).toEqual(
- PaymentChannel.create.binary,
- )
- })
- test('can serialize PaymentChannelFund', () => {
- expect(encode(PaymentChannel.fund.tx)).toEqual(PaymentChannel.fund.binary)
- })
- test('can serialize PaymentChannelClaim', () => {
- expect(encode(PaymentChannel.claim.tx)).toEqual(PaymentChannel.claim.binary)
- })
- }
-
- function NegativeUNLTest() {
- test('can serialize NegativeUNL', () => {
- expect(encode(NegativeUNL.tx)).toEqual(NegativeUNL.binary)
- })
- test('can deserialize NegativeUNL', () => {
- expect(decode(NegativeUNL.binary)).toEqual(NegativeUNL.tx)
- })
- }
-
- function omitUndefinedTest() {
- test('omits fields with undefined value', () => {
- let encodedOmitted = encode(json_omitted)
- let encodedUndefined = encode(json_undefined)
- expect(encodedOmitted).toEqual(encodedUndefined)
- expect(decode(encodedOmitted)).toEqual(decode(encodedUndefined))
- })
- }
-
- function ticketTest() {
- test('can serialize TicketCreate', () => {
- expect(encode(Ticket.create.tx)).toEqual(Ticket.create.binary)
- })
- }
-
- function nfTokenTest() {
- const fixtures = require('./fixtures/nf-token.json')
-
- for (const txName of Object.keys(fixtures)) {
- test(`can serialize transaction ${txName}`, () => {
- expect(encode(fixtures[txName].tx.json)).toEqual(
- fixtures[txName].tx.binary,
- )
- })
-
- test(`can deserialize transaction ${txName}`, () => {
- expect(decode(fixtures[txName].tx.binary)).toEqual(
- fixtures[txName].tx.json,
- )
- })
-
- test(`can serialize meta ${txName}`, () => {
- expect(encode(fixtures[txName].meta.json)).toEqual(
- fixtures[txName].meta.binary,
- )
- })
-
- test(`can deserialize meta ${txName}`, () => {
- expect(decode(fixtures[txName].meta.binary)).toEqual(
- fixtures[txName].meta.json,
- )
- })
- }
- }
-
- describe('Binary Serialization', function () {
- describe('nestedObjectTests', nestedObjectTests)
- describe('BytesList', bytesListTest)
- describe('DeliverMin', deliverMinTest)
- describe('DepositPreauth', DepositPreauthTest)
- describe('SignerListSet', SignerListSetTest)
- describe('Escrow', EscrowTest)
- describe('PaymentChannel', PaymentChannelTest)
- describe('NegativeUNLTest', NegativeUNLTest)
- describe('OmitUndefined', omitUndefinedTest)
- describe('TicketTest', ticketTest)
- describe('NFToken', nfTokenTest)
- })
|