Skip to content

Commit

Permalink
done
Browse files Browse the repository at this point in the history
  • Loading branch information
boufni95 committed Apr 25, 2024
1 parent 7411e1c commit fc804ca
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 168 deletions.
151 changes: 17 additions & 134 deletions src/tests/networkSetup.ts
Original file line number Diff line number Diff line change
@@ -1,144 +1,27 @@

import { LoadTestSettingsFromEnv, TestSettings } from "../services/main/settings.js"
import { LoadTestSettingsFromEnv } from "../services/main/settings.js"
import { BitcoinCoreWrapper } from "./bitcoinCore.js"
import LND from '../services/lnd/lnd.js'
import { AddressType } from '../../proto/autogenerated/ts/types.js';
import { BitcoinCoreWrapper } from "./bitcoinCore.js";
// dave <--> alice <--> carol <--> bob
type LndInstances = { alice: LND; bob: LND; carol: LND; dave: LND; }
type Addresses = { alice: string, bob: string, carol: string, dave: string }
type InstanceInfo = { pubkey: string; host: string; }
type InstancesInfo = { alice: InstanceInfo; bob: InstanceInfo; carol: InstanceInfo; dave: InstanceInfo; }
export const setupNetwork = async () => {

const settings = LoadTestSettingsFromEnv()
const core = new BitcoinCoreWrapper(settings)
await core.Init()
const instances = await initLndInstances(settings)
const { alice, bob, carol, dave } = instances
const connectInfo = await getConnectInfo(instances)
await bob.ConnectPeer(connectInfo.carol)
await carol.ConnectPeer(connectInfo.alice)
await alice.ConnectPeer(connectInfo.dave)
console.log("done connecting peer, sending coins")

const addresses = await getAddresses(instances)
await sendCoinsToAddresses(core, addresses)
console.log("done sending coins, opening channels")

await openChannels(core, instances, connectInfo, addresses)
console.log("done opening channels, sending balancing payment")
console.log(await getAllBalances(instances))
await sendBalancingPayment(instances)
stopAllInstances(instances)
console.log("network setup complete, starting tests")
}

const sendBalancingPayment = async (instances: LndInstances) => {
const invoice = await instances.dave.NewInvoice(50_000, "balancing_payment", 3600)
const payment = await instances.carol.PayInvoice(invoice.payRequest, 0, 50_000)
console.log({ payment })
}

const openChannels = async (core: BitcoinCoreWrapper, instances: LndInstances, info: InstancesInfo, addresses: Addresses) => {
await openChannel(instances.bob, info.carol.pubkey, addresses.bob)
await openChannel(instances.carol, info.alice.pubkey, addresses.carol)
await openChannel(instances.alice, info.dave.pubkey, addresses.alice)
await slowMine(core, 6)

}

const openChannel = async (instance: LND, to: string, closeAddr: string) => {
await core.InitAddress()
await core.Mine(1)
const lnd = new LND(settings.lndSettings, () => { }, () => { }, () => { }, () => { })
for (let i = 0; i < 10; i++) {
try {
await instance.OpenChannel(to, closeAddr, 10_000_000, 0)
console.log("success opening channel")
const info = await lnd.GetInfo()
if (!info.syncedToChain) {
throw new Error("not synced to chain")
}
if (!info.syncedToGraph) {
throw new Error("not synced to graph")
}
return
} catch (e) {
await new Promise((resolve) => setTimeout(resolve, 1000))
console.log("error opening channel", e)
console.log("waiting for lnd to be ready")
await new Promise(resolve => setTimeout(resolve, 1000))
}
}
throw new Error("could not open channel after 10 tries")
}

const sendCoinsToAddresses = async (core: BitcoinCoreWrapper, addresses: Addresses) => {
await core.SendToAddress(addresses.alice, 10)
await core.SendToAddress(addresses.bob, 10)
await core.SendToAddress(addresses.carol, 10)
await core.SendToAddress(addresses.dave, 10)
await core.Mine(6)
}

const slowMine = async (core: BitcoinCoreWrapper, blocks: number) => {
for (let i = 0; i < blocks; i++) {
await core.Mine(1)
await new Promise((resolve) => setTimeout(resolve, 500))
}
}

const getAddresses = async (instances: LndInstances): Promise<Addresses> => {
const alice = (await instances.alice.NewAddress(AddressType.WITNESS_PUBKEY_HASH)).address
const bob = (await instances.bob.NewAddress(AddressType.WITNESS_PUBKEY_HASH)).address
const carol = (await instances.carol.NewAddress(AddressType.WITNESS_PUBKEY_HASH)).address
const dave = (await instances.dave.NewAddress(AddressType.WITNESS_PUBKEY_HASH)).address
return { alice, bob, carol, dave }
}

const getAllInfo = async (instances: LndInstances) => {
const aliceInfo = await instances.alice.GetInfo()
const bobInfo = await instances.bob.GetInfo()
const carolInfo = await instances.carol.GetInfo()
const daveInfo = await instances.dave.GetInfo()
return { aliceInfo, bobInfo, carolInfo, daveInfo }

}

const getAllBalances = async (instances: LndInstances) => {
const aliceBal = await instances.alice.GetBalance()
const bobBal = await instances.bob.GetBalance()
const carolBal = await instances.carol.GetBalance()
const daveBal = await instances.dave.GetBalance()
return { aliceBal, bobBal, carolBal, daveBal }

}

const getConnectInfo = async (instances: LndInstances) => {
const { aliceInfo, bobInfo, carolInfo, daveInfo } = await getAllInfo(instances)
const [alicePub, aliceHost] = aliceInfo.uris[0].split('@')
const alice = { pubkey: alicePub, host: aliceHost }

const [bobPub, bobHost] = bobInfo.uris[0].split('@')
const bob = { pubkey: bobPub, host: bobHost }

const [carolPub, carolHost] = carolInfo.uris[0].split('@')
const carol = { pubkey: carolPub, host: carolHost }

const [davePub, daveHost] = daveInfo.uris[0].split('@')
const dave = { pubkey: davePub, host: daveHost }

return { alice, bob, carol, dave }
}

const initLndInstances = async (settings: TestSettings): Promise<LndInstances> => {
const alice = new LND(settings.lndSettings, console.log, console.log, () => { }, () => { })
await alice.Warmup()

const bobSettings = { ...settings.lndSettings, mainNode: settings.lndSettings.otherNode }
const bob = new LND(bobSettings, console.log, console.log, () => { }, () => { })
await bob.Warmup()

const carolSettings = { ...settings.lndSettings, mainNode: settings.lndSettings.thirdNode }
const carol = new LND(carolSettings, console.log, console.log, () => { }, () => { })
await carol.Warmup()

const daveSettings = { ...settings.lndSettings, mainNode: settings.lndSettings.fourthNode }
const dave = new LND(daveSettings, console.log, console.log, () => { }, () => { })
await dave.Warmup()
return { alice, bob, carol, dave }
}

const stopAllInstances = (instances: LndInstances) => {
instances.alice.Stop()
instances.bob.Stop()
instances.carol.Stop()
instances.dave.Stop()
}
throw new Error("lnd is not ready after 10 seconds")
}
27 changes: 0 additions & 27 deletions src/tests/prepareNetwork.ts

This file was deleted.

7 changes: 1 addition & 6 deletions src/tests/testRunner.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { globby } from 'globby'
import { setupNetwork } from './networkSetup.js'
import { prepareNetwork } from './prepareNetwork.js'
import { Describe, SetupTest, teardown, TestBase } from './testBase.js'


Expand All @@ -21,11 +20,7 @@ const getDescribe = (fileName: string): Describe => {
}
}
const start = async () => {
if (process.argv[2] === 'setup_network') {
await setupNetwork()
} else {
await prepareNetwork()
}
await setupNetwork()
const files = await globby(["**/*.spec.js", "!**/node_modules/**"])
const modules: { file: string, module: TestModule }[] = []
let devModule = -1
Expand Down
2 changes: 1 addition & 1 deletion src/tests/userToUserPayment.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { defaultInvoiceExpiry } from '../services/storage/paymentStorage.js'
import { Describe, expect, expectThrowsAsync, runSanityCheck, safelySetUserBalance, SetupTest, TestBase } from './testBase.js'
export const ignore = false
export const dev = true
export const dev = false
export default async (T: TestBase) => {
await safelySetUserBalance(T, T.user1, 2000)
await testSuccessfulU2UPayment(T)
Expand Down

0 comments on commit fc804ca

Please sign in to comment.