five-bells-integration-test
Version:
A module to help with testing Five Bells components against each other
273 lines (249 loc) • 10.8 kB
JavaScript
/* global describe, it, beforeEach, afterEach */
'use strict'
const path = require('path')
const assert = require('assert')
const ServiceManager = require('five-bells-service-manager')
const services = new ServiceManager(path.resolve(process.cwd(), 'node_modules/'))
const {startConnector, startSender, startReceiver, stopPlugins, routesReady} = require('../lib/helpers')({services})
describe('Advanced', function () {
afterEach(async function () {
await stopPlugins()
// Prevent "Uncaught Error: read ECONNRESET"
await new Promise((resolve) => setTimeout(resolve, 10))
services.killAll()
})
describe('different scales', function () {
beforeEach(async function () {
await startConnector({
ilpAddress: 'test.mark',
accounts: {
ledger1: { relation: 'child', assetScale: 4, options: {port: 3001, currencyScale: 4} },
ledger2: { relation: 'child', assetScale: 2, options: {port: 3002, currencyScale: 2} }
}
})
this.sender1 = await startSender({ server: 'btp+ws://:alice_secret@127.0.0.1:3001' })
this.sender2 = await startSender({ server: 'btp+ws://:alice_secret@127.0.0.1:3002' })
this.receiver1 = await startReceiver({ server: 'btp+ws://:bob_secret@127.0.0.1:3001' })
this.receiver2 = await startReceiver({ server: 'btp+ws://:bob_secret@127.0.0.1:3002' })
})
it('high → low', async function () {
const res = await services.sendPayment({
sender: this.sender1,
receiver: this.receiver2,
sourceAmount: '49999'
})
assert.equal(res.typeString, 'ilp_fulfill')
// Bob should have:
// 49999 USD (money from Alice)
// - 99.998 USD (mark: spread/fee)
// ==================
// 49899.002 USD
// 498 USD (scale 4 → 2)
services.assertBalance(this.receiver2, '498')
})
it('low → high', async function () {
const res = await services.sendPayment({
sender: this.sender2,
receiver: this.receiver1,
sourceAmount: '499'
})
assert.equal(res.typeString, 'ilp_fulfill')
// Bob should have:
// 499 USD (money from Alice)
// - 1 USD (mark: spread/fee)
// ===========
// 498 USD
// 49800 USD (scale 2 → 4)
services.assertBalance(this.receiver1, '49800')
})
})
it('zero spread', async function () {
await startConnector({
ilpAddress: 'test.micah',
accounts: {
ledger1: { relation: 'child', assetScale: 4, options: {port: 3001, currencyScale: 4} },
ledger2: { relation: 'child', assetScale: 4, options: {port: 3002, currencyScale: 4} }
},
spread: '0'
})
const sender = await startSender({ server: 'btp+ws://:alice_secret@127.0.0.1:3001' })
const receiver = await startReceiver({ server: 'btp+ws://:bob_secret@127.0.0.1:3002' })
const res = await services.sendPayment({ sender, receiver, sourceAmount: '10' })
assert.equal(res.typeString, 'ilp_fulfill')
services.assertBalance(receiver, '10')
})
it('high spread', async function () {
await startConnector({
ilpAddress: 'test.martin',
accounts: {
ledger1: { relation: 'child', assetScale: 4, options: {port: 3001, currencyScale: 4} },
ledger2: { relation: 'child', assetScale: 4, options: {port: 3002, currencyScale: 4} }
},
spread: '0.5'
})
const sender = await startSender({ server: 'btp+ws://:alice_secret@127.0.0.1:3001' })
const receiver = await startReceiver({ server: 'btp+ws://:bob_secret@127.0.0.1:3002' })
const res = await services.sendPayment({ sender, receiver, sourceAmount: '500' })
assert.equal(res.typeString, 'ilp_fulfill')
// 500 USD (money from Alice)
// - 250 USD (martin: spread/fee)
// ===========
// 250 USD
services.assertBalance(receiver, '250')
})
it('many hops', async function () {
await Promise.all([
startConnector({
ilpAddress: 'test.mia',
accounts: {
millie: { relation: 'peer', assetScale: 4, options: {listener: {port: 3100, secret: 'secret'}} },
mike: { relation: 'peer', assetScale: 4, options: {listener: {port: 3101, secret: 'secret'}} }
}
}),
startConnector({
ilpAddress: 'test.millie',
accounts: {
ledger1: { relation: 'child', assetScale: 4, options: {port: 3001, currencyScale: 4} },
mia: { relation: 'peer', assetScale: 4, options: {server: 'btp+ws://:secret@127.0.0.1:3100'} }
}
}),
startConnector({
ilpAddress: 'test.mike',
accounts: {
ledger2: { relation: 'child', assetScale: 4, options: {port: 3002, currencyScale: 4} },
mia: { relation: 'peer', assetScale: 4, options: {server: 'btp+ws://:secret@127.0.0.1:3101'} }
}
})
])
// Send payment ledger1 → millie → mia → mike → ledger2
const sender = await startSender({ server: 'btp+ws://:alice_secret@127.0.0.1:3001' })
const receiver = await startReceiver({ server: 'btp+ws://:bob_secret@127.0.0.1:3002' })
// Wait to send payment until the routes are all ready.
await routesReady(sender, receiver)
const res = await services.sendPayment({ sender, receiver, sourceAmount: '49999' })
assert.equal(res.typeString, 'ilp_fulfill')
// 49999.000 USD (original amount from Alice)
// × 0.998 (millie: spread/fee; 0.998 = 1 - 0.002)
// × 0.998 (mia: spread/fee)
// × 0.998 (mike: spread/fee)
// - 1.0 USD (mia rounding in her own favor)
// - 1.0 USD (mike rounding in his own favor)
// ===================
// 49697.6055880 USD
// 49697 USD (round destination down)
services.assertBalance(receiver, '49697')
})
it('static route', async function () {
await Promise.all([
startConnector({
ilpAddress: 'test.mia',
accounts: {
millie: { relation: 'peer', assetScale: 4, options: {listener: {port: 3100, secret: 'secret'}} },
mike: { relation: 'peer', assetScale: 4, options: {listener: {port: 3101, secret: 'secret'}} }
}
}),
startConnector({
ilpAddress: 'test.millie',
accounts: {
ledger1: { relation: 'child', assetScale: 4, options: {port: 3001, currencyScale: 4} },
mia: {
relation: 'peer',
assetScale: 4,
options: {server: 'btp+ws://:secret@127.0.0.1:3100'},
receiveRoutes: false
}
},
routes: [{targetPrefix: 'test.mike.ledger2', peerId: 'mia'}]
}),
startConnector({
ilpAddress: 'test.mike',
accounts: {
ledger2: { relation: 'child', assetScale: 4, options: {port: 3002, currencyScale: 4} },
mia: { relation: 'peer', assetScale: 4, options: {server: 'btp+ws://:secret@127.0.0.1:3101'} }
}
})
])
// Send payment ledger1 → millie → mia → mike → ledger2
const sender = await startSender({ server: 'btp+ws://:alice_secret@127.0.0.1:3001' })
const receiver = await startReceiver({ server: 'btp+ws://:bob_secret@127.0.0.1:3002' })
await routesReady(sender, receiver)
const res = await services.sendPayment({ sender, receiver, sourceAmount: '49999' })
assert.equal(res.typeString, 'ilp_fulfill')
services.assertBalance(receiver, '49697')
})
it('rate check', async function () {
await startConnector({
ilpAddress: 'test.mesrop',
accounts: {
ledger1: { relation: 'child', assetScale: 2, options: {port: 3001, currencyScale: 2} },
ledger2: { relation: 'child', assetScale: 2, options: {port: 3002, currencyScale: 2} }
},
spread: (1 - 0.877980).toFixed(8)
})
const sender = await startSender({ server: 'btp+ws://:alice_secret@127.0.0.1:3001' })
const receiver = await startReceiver({ server: 'btp+ws://:bob_secret@127.0.0.1:3002' })
const res = await services.sendPayment({ sender, receiver, sourceAmount: '1000' })
assert.equal(res.typeString, 'ilp_fulfill')
// Bob should have:
// 1000 USD (money from Alice)
// × 0.877980 (mesrop: spread/fee; 10 * 0.877980 = 8.7798)
// =================
// 877.980 USD
// 877 USD (round destination amount down)
services.assertBalance(receiver, '877')
})
it('parent connector', async function () {
await Promise.all([
startConnector({ // test.millie
_name: 'test.millie',
accounts: {
ledger1: { relation: 'child', assetScale: 4, options: {port: 3001, currencyScale: 4} },
mike: { relation: 'parent', assetScale: 4, options: {server: 'btp+ws://:secret@127.0.0.1:3100'} }
}
}),
startConnector({
ilpAddress: 'test.mike',
accounts: {
millie: { relation: 'child', assetScale: 4, options: {listener: {port: 3100, secret: 'secret'}} },
ledger2: { relation: 'child', assetScale: 4, options: {port: 3002, currencyScale: 4} }
}
})
])
// Send payment ledger1 → millie → mike → ledger2
const sender = await startSender({ server: 'btp+ws://:alice_secret@127.0.0.1:3001' })
const receiver = await startReceiver({ server: 'btp+ws://:bob_secret@127.0.0.1:3002' })
const res = await services.sendPayment({ sender, receiver, sourceAmount: '49999' })
assert.equal(res.typeString, 'ilp_fulfill')
// 49999.000 USD (original amount from Alice)
// × 0.998 (millie: spread/fee; 0.998 = 1 - 0.002)
// × 0.998 (mike: spread/fee)
// - 1.0 USD (mike rounding in his own favor)
// ===================
// 49798.2039960 USD
// 49798 USD (round destination down)
services.assertBalance(receiver, '49798')
})
it('connector rejects payment when payment exceeds maximum debt', async function () {
await startConnector({
ilpAddress: 'test.mark',
accounts: {
ledger1: {
relation: 'child',
assetScale: 4,
balance: {maximum: '100'},
options: {port: 3001, currencyScale: 4}
},
ledger2: { relation: 'child', assetScale: 4, options: {port: 3002, currencyScale: 4} }
}
})
this.sender1 = await startSender({ server: 'btp+ws://:alice_secret@127.0.0.1:3001' })
this.receiver2 = await startReceiver({ server: 'btp+ws://:bob_secret@127.0.0.1:3002' })
const res = await services.sendPayment({
sender: this.sender1,
receiver: this.receiver2,
sourceAmount: '49999'
})
assert.equal(res.typeString, 'ilp_reject')
assert.equal(res.data.message, 'exceeded maximum balance.')
})
})