Skip to content

Commit

Permalink
test: add excluded-in-CI live tests
Browse files Browse the repository at this point in the history
  • Loading branch information
thunderbiscuit committed Oct 30, 2023
1 parent 13c751c commit 6e3025e
Show file tree
Hide file tree
Showing 19 changed files with 295 additions and 160 deletions.
11 changes: 6 additions & 5 deletions .github/workflows/test-android.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,12 @@ jobs:
- name: "Build Android library"
run: |
cd bdk-android
./gradlew buildAndroidLib
./gradlew buildAndroidLib --console=plain
# There are currently no unit tests for bdk-android and the integration tests require the macOS image
# which is not working with the older NDK version we are using, so for now we just make sure that the library builds.
# - name: "Run Android unit tests"
# There are currently no unit tests for bdk-android (see the tests in bdk-jvm instead) and the
# integration tests require the macOS image which is not working with the older NDK version we
# are using, so for now we just make sure that the library builds and omit the connectedTest
# - name: "Run Android connected tests"
# run: |
# cd bdk-android
# ./gradlew test --console=rich
# ./gradlew connectedAndroidTest --console=plain
2 changes: 1 addition & 1 deletion .github/workflows/test-jvm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,4 @@ jobs:
- name: "Run JVM tests"
run: |
cd bdk-jvm
./gradlew test
./gradlew test -P excludeConnectedTests
8 changes: 4 additions & 4 deletions .github/workflows/test-python.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ jobs:
run: ${PYBIN}/pip install ./dist/*.whl

- name: "Run tests"
run: ${PYBIN}/python -m unittest tests/test_bdk.py --verbose
run: ${PYBIN}/python --module unittest discover --start "./tests/" --pattern "test_offline_*.py" --verbose

- name: "Upload artifact test"
uses: actions/upload-artifact@v3
Expand Down Expand Up @@ -97,7 +97,7 @@ jobs:
# - name: "Install wheel and run tests"
# run: |
# pip3 install ./dist/*.whl
# python3 -m unittest tests/test_bdk.py --verbose
# python3 --module unittest discover --start "./tests/" --pattern "test_offline_*.py" --verbose

- name: "Upload artifact test"
uses: actions/upload-artifact@v3
Expand Down Expand Up @@ -138,7 +138,7 @@ jobs:
run: pip3 install ./dist/*.whl

- name: "Run tests"
run: python3 -m unittest tests/test_bdk.py --verbose
run: python3 --module unittest discover --start "./tests/" --pattern "test_offline_*.py" --verbose

- name: "Upload artifact test"
uses: actions/upload-artifact@v3
Expand Down Expand Up @@ -186,4 +186,4 @@ jobs:
shell: powershell

- name: "Run tests"
run: python -m unittest tests/test_bdk.py --verbose
run: python --module unittest discover --start "./tests/" --pattern "test_offline_*.py" --verbose
2 changes: 1 addition & 1 deletion .github/workflows/test-swift.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ jobs:

- name: "Run Swift tests"
working-directory: bdk-swift
run: swift test
run: swift test --skip LiveWalletTests --skip LiveTxBuilderTests
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.bitcoindevkit

import org.junit.Test
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class LiveTxBuilderTest {
@Test
fun testTxBuilder() {
val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
val wallet = Wallet.newNoPersist(descriptor, null, Network.TESTNET)
val esploraClient = EsploraClient("https://mempool.space/testnet/api")
val update = esploraClient.scan(wallet, 10uL, 1uL)
wallet.applyUpdate(update)
println("Balance: ${wallet.getBalance().total()}")

assert(wallet.getBalance().total() > 0uL)

val recipient: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.TESTNET)
val psbt: PartiallySignedTransaction = TxBuilder()
.addRecipient(recipient.scriptPubkey(), 4200uL)
.feeRate(2.0f)
.finish(wallet)

println(psbt.serialize())
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.bitcoindevkit

import org.junit.Test
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class LiveWalletTest {
@Test
fun testSyncedBalance() {
val descriptor: Descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
val wallet: Wallet = Wallet.newNoPersist(descriptor, null, Network.TESTNET)
val esploraClient: EsploraClient = EsploraClient("https://mempool.space/testnet/api")
// val esploraClient = EsploraClient("https://blockstream.info/testnet/api")
val update = esploraClient.scan(wallet, 10uL, 1uL)
wallet.applyUpdate(update)
println("Balance: ${wallet.getBalance().total()}")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.bitcoindevkit

import kotlin.test.Test
import kotlin.test.assertTrue
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class OfflineDescriptorTest {
@Test
fun testDescriptorBip86() {
val mnemonic: Mnemonic = Mnemonic(WordCount.WORDS12)
val descriptorSecretKey: DescriptorSecretKey = DescriptorSecretKey(Network.TESTNET, mnemonic, null)
val descriptor: Descriptor = Descriptor.newBip86(descriptorSecretKey, KeychainKind.EXTERNAL, Network.TESTNET)

assertTrue(descriptor.asString().startsWith("tr"), "Bip86 Descriptor does not start with 'tr'")
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
package org.bitcoindevkit

import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith

/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class WalletTest {

class OfflineWalletTest {
@Test
fun testDescriptorBip86() {
val mnemonic: Mnemonic = Mnemonic(WordCount.WORDS12)
Expand All @@ -36,7 +30,10 @@ class WalletTest {
)
val addressInfo: AddressInfo = wallet.getAddress(AddressIndex.New)

assertEquals("tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e", addressInfo.address.asString())
assertEquals(
expected = "tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e",
actual = addressInfo.address.asString()
)
}

@Test
Expand All @@ -51,7 +48,9 @@ class WalletTest {
Network.TESTNET
)

assertEquals(0uL, wallet.getBalance().total())
assertEquals(
expected = 0uL,
actual = wallet.getBalance().total()
)
}

}
}
12 changes: 12 additions & 0 deletions bdk-jvm/lib/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,18 @@ java {
withJavadocJar()
}

// This block ensures that the tests that require access to a blockchain are not
// run if the -P excludeConnectedTests flag is passed to gradle.
// This ensures our CI runs are not fickle by not requiring access to testnet.
// This is a workaround until we have a proper regtest setup for the CI.
// Note that the command in the CI is ./gradlew test -P excludeConnectedTests
tasks.test {
if (project.hasProperty("excludeConnectedTests")) {
exclude("**/LiveWalletTest.class")
exclude("**/LiveTxBuilderTest.class")
}
}

testing {
suites {
val test by getting(JvmTestSuite::class) {
Expand Down
60 changes: 0 additions & 60 deletions bdk-jvm/lib/src/test/kotlin/org/bitcoindevkit/JvmLibTest.kt

This file was deleted.

38 changes: 38 additions & 0 deletions bdk-python/tests/test_live_tx_builder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import bdkpython as bdk
import unittest

class TestLiveTxBuilder(unittest.TestCase):

def test_tx_builder(self):
descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
bdk.Network.TESTNET
)
wallet: bdk.Wallet = bdk.Wallet.new_no_persist(
descriptor,
None,
bdk.Network.TESTNET
)
esploraClient: bdk.EsploraClient = bdk.EsploraClient(url = "https://mempool.space/testnet/api")
update = esploraClient.scan(
wallet = wallet,
stop_gap = 10,
parallel_requests = 1
)
wallet.apply_update(update)

self.assertGreater(wallet.get_balance().total(), 0)

recipient = bdk.Address(
address = "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989",
network = bdk.Network.TESTNET
)

psbt = bdk.TxBuilder().add_recipient(script=recipient.script_pubkey(), amount=4200).fee_rate(2.0).finish(wallet)
# print(psbt.serialize())

self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi")


if __name__ == '__main__':
unittest.main()
28 changes: 28 additions & 0 deletions bdk-python/tests/test_live_wallet.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import bdkpython as bdk
import unittest

class TestLiveWallet(unittest.TestCase):

def test_synced_balance(self):
descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
bdk.Network.TESTNET
)
wallet: bdk.Wallet = bdk.Wallet.new_no_persist(
descriptor,
None,
bdk.Network.TESTNET
)
esploraClient: bdk.EsploraClient = bdk.EsploraClient(url = "https://mempool.space/testnet/api")
update = esploraClient.scan(
wallet = wallet,
stop_gap = 10,
parallel_requests = 1
)
wallet.apply_update(update)

self.assertGreater(wallet.get_balance().total(), 0)


if __name__ == '__main__':
unittest.main()
15 changes: 15 additions & 0 deletions bdk-python/tests/test_offline_descriptor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import bdkpython as bdk
import unittest

class TestSimpleWallet(unittest.TestCase):

def test_descriptor_bip86(self):
mnemonic: bdk.Mnemonic = bdk.Mnemonic(bdk.WordCount.WORDS12)
descriptor_secret_key: bdk.DescriptorSecretKey = bdk.DescriptorSecretKey(bdk.Network.TESTNET, mnemonic, None)
descriptor: bdk.Descriptor = bdk.Descriptor.new_bip86(descriptor_secret_key, bdk.KeychainKind.EXTERNAL, bdk.Network.TESTNET)

self.assertTrue(descriptor.as_string().startswith("tr"), "Bip86 Descriptor does not start with 'tr'")


if __name__ == '__main__':
unittest.main()
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,6 @@

class TestSimpleWallet(unittest.TestCase):

def test_descriptor_bip86(self):
mnemonic: bdk.Mnemonic = bdk.Mnemonic(bdk.WordCount.WORDS12)
descriptor_secret_key: bdk.DescriptorSecretKey = bdk.DescriptorSecretKey(bdk.Network.TESTNET, mnemonic, None)
descriptor: bdk.Descriptor = bdk.Descriptor.new_bip86(descriptor_secret_key, bdk.KeychainKind.EXTERNAL, bdk.Network.TESTNET)

self.assertTrue(descriptor.as_string().startswith("tr"), "Bip86 Descriptor does not start with 'tr'")

def test_new_address(self):
descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
Expand All @@ -29,7 +22,7 @@ def test_balance(self):
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
bdk.Network.TESTNET
)
wallet: Wallet = bdk.Wallet.new_no_persist(
wallet: bdk.Wallet = bdk.Wallet.new_no_persist(
descriptor,
None,
bdk.Network.TESTNET
Expand Down
Loading

0 comments on commit 6e3025e

Please sign in to comment.