') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Add Eclair integration tests by tnull · Pull Request #785 · lightningdevkit/ldk-node · GitHub
Skip to content

Add Eclair integration tests - #785

Closed
tnull wants to merge 2 commits into
lightningdevkit:mainfrom
tnull:2026-02-add-eclair-integration-tests
Closed

Add Eclair integration tests#785
tnull wants to merge 2 commits into
lightningdevkit:mainfrom
tnull:2026-02-add-eclair-integration-tests

Conversation

@tnull

@tnulltnull commented Feb 6, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

Add `integration_tests_eclair.rs` with a `TestEclairClient` wrapping
Eclair's HTTP REST API via `bitreq`, and a `test_eclair()` function
exercising channel open/close, bidirectional BOLT11 payments, and
soft-fail splice in/out tests.
Also add `eclair_test` to the `check-cfg` list in `Cargo.toml` and to
the cfg gate in `tests/common/mod.rs`.
Generated with the help of AI (Claude Code).
Co-Authored-By: HAL 9000
@ldk-reviews-bot

ldk-reviews-bot commented Feb 6, 2026

Copy link
Copy Markdown

👋 I see @valentinewallace was un-assigned.
If you'd like another reviewer assignment, please click here.

Add `docker-compose-eclair.yml` running bitcoind (with ZMQ), electrs,
and `acinq/eclair:v0.13.1`, and a GitHub Actions workflow that starts
the containers and runs the Eclair integration test suite.
Generated with the help of AI (Claude Code).
Co-Authored-By: HAL 9000
Signed-off-by: Elias Rohrer <dev@tnull.de>
@tnull
tnullforce-pushed the 2026-02-add-eclair-integration-tests branch from 43673da to cb73a18CompareFebruary 6, 2026 11:43
@tnull
tnull marked this pull request as draft February 6, 2026 13:22
@tnull
tnull removed the request for review from valentinewallaceFebruary 6, 2026 13:22
@jkczyz

Copy link
Copy Markdown
Contributor

Were you able to get this to work locally with docker? I'm having trouble on macOS. I threw Claude at the problem, and it gave up but did fix some issues:

⏺ We found several bugs in the cherry-picked commits:

  1. Wrong Eclair config key names: rpc-port, rpc-user, rpc-password should be rpcport, rpcuser, rpcpassword. This caused Eclair to use default port 8332 instead of 18443.
  2. Wrong ZMQ topic: bitcoind was configured with -zmqpubrawblock but Eclair subscribes to hashblock, not rawblock. Changed to -zmqpubhashblock.
  3. Bitcoin Core version mismatch: Eclair latest (0.14.0-SNAPSHOT) requires Bitcoin Core 29+, but the compose file used blockstream/bitcoind:27.2. Changed to bitcoin/bitcoin:29.
  4. corepc-types incompatibility with BC 29: Bitcoin Core 29 changed warnings from string to array in getblockchaininfo, breaking deserialization. Replaced get_blockchain_info() with get_block_count() in tests/common/mod.rs.
  5. Missing wallet setup: BC 29 doesn't auto-create a default wallet. Added a bitcoin-init service to create the ldk_node_test wallet and mine an initial block before Eclair/electrs start. Also added -Declair.bitcoind.wallet=ldk_node_test and -Declair.allow-unsafe-startup=true.

Unresolved: Eclair's ZMQ subscription doesn't receive messages when running in Docker on macOS, despite:

  • libzmq (pyzmq) working between containers
  • Jeromq working between containers in a standalone test with the same DONTWAIT polling pattern
  • ZMQ working from host to container

The issue appears specific to Eclair's Akka actor system interacting with jeromq inside Docker on macOS. I don't have a root cause.

@tnull

tnull commented Mar 23, 2026

Copy link
Copy Markdown
CollaboratorAuthor

Were you able to get this to work locally with docker? I'm having trouble on macOS. I threw Claude at the problem, and it gave up but did fix some issues:

No, I never got it to work fully (not only macOS, but also not in CI) and didn't get back to look at it more closely yet. @febyeji however indicated to wanted to work on it as part of #766, so we might end up closing this PR.

@febyeji

Copy link
Copy Markdown
Contributor

@tnull@jkczyz I'm working on this as part of an integration test harness PR for CLN, LND, and Eclair. Here's what I've found regarding the Eclair issues.

Confirmed fixes:

  • Eclair config key names: rpcport/rpcuser/rpcpassword (not hyphenated)
  • Bitcoin Core 29: Bumped bitcoind to 29.1.
  • Wallet setup: Bitcoin Core 29 doesn't auto-create a default wallet, so I had to create one explicitly.
  • ZMQ: I had to configure two ZMQ topics: zmqpubhashblock for blocks and zmqpubrawtx for transactions.
  • txindex: Eclair needs a synchronized, segwit-ready, zeromq-enabled, wallet-enabled, non-pruning, tx-indexing Bitcoin Core node. (standard Eclair requirement)

Regarding macOS Docker, I also had a similar issue. Standalone ZMQ tests work fine between containers, but Eclair's internal ZMQ subscription fails on Docker bridge networking. I didn't find a root cause for this yet.

  • On Linux, I worked around this by using network_mode: host, which eliminates the Docker network layer entirely and makes ZMQ reliable. Our CI runs on Linux so this works for us.
  • This doesn't help on macOS though, Docker Desktop there runs containers inside a Linux VM, so network_mode: host refers to the VM's network, not the Mac's. I haven't found a solution for macOS yet.

@tnull

Copy link
Copy Markdown
CollaboratorAuthor

Thank you very much!

  • This doesn't help on macOS though, Docker Desktop there runs containers inside a Linux VM, so network_mode: host refers to the VM's network, not the Mac's. I haven't found a solution for macOS yet.

I think it's not that bad as long as the tests run properly in CI. However, it would of course be preferable for macOS-based devs to also run them locally, but we shouldn't probably block on that (i.e., when in doubt open an issue for it so we don't forget and keep things moving).

@tnull

Copy link
Copy Markdown
CollaboratorAuthor

Superseded by #839.

@tnulltnull closed this Apr 29, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@tnull@ldk-reviews-bot@jkczyz@febyeji