@@ -1793,6 +1793,163 @@ impl TestSyncStoreInner {
17931793/// ```ignore
17941794/// interop_combo_tests!(test_lnd, setup_clients, setup_ldk_node);
17951795/// ```
1796+ ///
1797+ /// ## `interop_basic_tests!`
1798+ ///
1799+ /// Generates the standard named tests that are identical across all external
1800+ /// node implementations: basic channel cycle, disconnect/reconnect, force-close
1801+ /// (by LDK and external), inbound channel, bidirectional payments, expired
1802+ /// invoice, concurrent payments, and fee-change close scenarios.
1803+ ///
1804+ /// Tests that differ per-implementation (e.g. keysend, splicing) should remain
1805+ /// as hand-written functions in the individual test files.
1806+ ///
1807+ /// Usage:
1808+ /// ```ignore
1809+ /// interop_basic_tests!(test_lnd, setup_clients, setup_ldk_node);
1810+ /// ```
1811+ #[ macro_export]
1812+ macro_rules! interop_basic_tests {
1813+ ( $prefix: ident, $setup_clients: ident, $setup_ldk_node: ident) => {
1814+ paste:: paste! {
1815+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
1816+ async fn [ <$prefix _basic_channel_cycle>] ( ) {
1817+ let ( bitcoind, electrs, peer) = $setup_clients( ) . await ;
1818+ let node = $setup_ldk_node( ) ;
1819+ setup_interop_test( & node, & peer, & bitcoind, & electrs) . await ;
1820+
1821+ let ( user_channel_id, _ext_channel_id) =
1822+ open_channel_to_external(
1823+ & node, & peer, & bitcoind, & electrs, 1_000_000 , Some ( 500_000_000 ) ,
1824+ ) . await ;
1825+
1826+ let invoice = peer. create_invoice( 10_000_000 , "basic-send" ) . await . unwrap( ) ;
1827+ let parsed = lightning_invoice:: Bolt11Invoice :: from_str( & invoice) . unwrap( ) ;
1828+ node. bolt11_payment( ) . send( & parsed, None ) . unwrap( ) ;
1829+ $crate:: common:: expect_event!( node, PaymentSuccessful ) ;
1830+
1831+ receive_bolt11_payment( & node, & peer, 10_000_000 ) . await ;
1832+
1833+ cooperative_close_by_ldk(
1834+ & node, & peer, & bitcoind, & electrs, & user_channel_id,
1835+ ) . await ;
1836+ node. stop( ) . unwrap( ) ;
1837+ }
1838+
1839+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
1840+ async fn [ <$prefix _disconnect_reconnect>] ( ) {
1841+ let ( bitcoind, electrs, peer) = $setup_clients( ) . await ;
1842+ let node = $setup_ldk_node( ) ;
1843+ setup_interop_test( & node, & peer, & bitcoind, & electrs) . await ;
1844+ let ( _user_ch, _ext_ch) = open_channel_to_external(
1845+ & node, & peer, & bitcoind, & electrs, 1_000_000 , Some ( 500_000_000 ) ,
1846+ ) . await ;
1847+
1848+ disconnect_reconnect_idle(
1849+ & node, & peer, & bitcoind, & electrs, & Side :: Ldk ,
1850+ ) . await ;
1851+ disconnect_reconnect_idle(
1852+ & node, & peer, & bitcoind, & electrs, & Side :: External ,
1853+ ) . await ;
1854+
1855+ node. stop( ) . unwrap( ) ;
1856+ }
1857+
1858+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
1859+ async fn [ <$prefix _force_close_by_ldk>] ( ) {
1860+ let ( bitcoind, electrs, peer) = $setup_clients( ) . await ;
1861+ let node = $setup_ldk_node( ) ;
1862+ setup_interop_test( & node, & peer, & bitcoind, & electrs) . await ;
1863+ let ( user_ch, _ext_ch) = open_channel_to_external(
1864+ & node, & peer, & bitcoind, & electrs, 1_000_000 , Some ( 500_000_000 ) ,
1865+ ) . await ;
1866+
1867+ force_close_by_ldk( & node, & peer, & bitcoind, & electrs, & user_ch) . await ;
1868+ node. stop( ) . unwrap( ) ;
1869+ }
1870+
1871+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
1872+ async fn [ <$prefix _force_close_by_external>] ( ) {
1873+ let ( bitcoind, electrs, peer) = $setup_clients( ) . await ;
1874+ let node = $setup_ldk_node( ) ;
1875+ setup_interop_test( & node, & peer, & bitcoind, & electrs) . await ;
1876+ let ( _user_ch, ext_ch) = open_channel_to_external(
1877+ & node, & peer, & bitcoind, & electrs, 1_000_000 , Some ( 500_000_000 ) ,
1878+ ) . await ;
1879+
1880+ force_close_by_external( & node, & peer, & bitcoind, & electrs, & ext_ch) . await ;
1881+ node. stop( ) . unwrap( ) ;
1882+ }
1883+
1884+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
1885+ async fn [ <$prefix _inbound_channel>] ( ) {
1886+ let ( bitcoind, electrs, peer) = $setup_clients( ) . await ;
1887+ let node = $setup_ldk_node( ) ;
1888+ run_inbound_channel_test(
1889+ & node, & peer, & bitcoind, & electrs,
1890+ CloseType :: Cooperative , Side :: External ,
1891+ ) . await ;
1892+ node. stop( ) . unwrap( ) ;
1893+ }
1894+
1895+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
1896+ async fn [ <$prefix _bidirectional_payments>] ( ) {
1897+ let ( bitcoind, electrs, peer) = $setup_clients( ) . await ;
1898+ let node = $setup_ldk_node( ) ;
1899+ setup_interop_test( & node, & peer, & bitcoind, & electrs) . await ;
1900+ let ( _user_ch, ext_ch) = open_channel_to_external(
1901+ & node, & peer, & bitcoind, & electrs, 1_000_000 , Some ( 500_000_000 ) ,
1902+ ) . await ;
1903+
1904+ bidirectional_payments( & node, & peer, & ext_ch, 5_000_000 ) . await ;
1905+ node. stop( ) . unwrap( ) ;
1906+ }
1907+
1908+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
1909+ async fn [ <$prefix _pay_expired_invoice>] ( ) {
1910+ let ( bitcoind, electrs, peer) = $setup_clients( ) . await ;
1911+ let node = $setup_ldk_node( ) ;
1912+ setup_interop_test( & node, & peer, & bitcoind, & electrs) . await ;
1913+ let ( _user_ch, _ext_ch) = open_channel_to_external(
1914+ & node, & peer, & bitcoind, & electrs, 1_000_000 , Some ( 500_000_000 ) ,
1915+ ) . await ;
1916+
1917+ pay_expired_invoice( & node, & peer) . await ;
1918+ node. stop( ) . unwrap( ) ;
1919+ }
1920+
1921+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
1922+ async fn [ <$prefix _concurrent_payments>] ( ) {
1923+ let ( bitcoind, electrs, peer) = $setup_clients( ) . await ;
1924+ let node = $setup_ldk_node( ) ;
1925+ setup_interop_test( & node, & peer, & bitcoind, & electrs) . await ;
1926+ let ( _user_ch, _ext_ch) = open_channel_to_external(
1927+ & node, & peer, & bitcoind, & electrs, 1_000_000 , Some ( 500_000_000 ) ,
1928+ ) . await ;
1929+
1930+ concurrent_payments( & node, & peer, 5 , 1_000_000 ) . await ;
1931+ node. stop( ) . unwrap( ) ;
1932+ }
1933+
1934+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
1935+ async fn [ <$prefix _cooperative_close_after_fee_change>] ( ) {
1936+ let ( bitcoind, electrs, peer) = $setup_clients( ) . await ;
1937+ let node = $setup_ldk_node( ) ;
1938+ cooperative_close_after_fee_change( & node, & peer, & bitcoind, & electrs) . await ;
1939+ node. stop( ) . unwrap( ) ;
1940+ }
1941+
1942+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
1943+ async fn [ <$prefix _force_close_after_fee_change>] ( ) {
1944+ let ( bitcoind, electrs, peer) = $setup_clients( ) . await ;
1945+ let node = $setup_ldk_node( ) ;
1946+ force_close_after_fee_change( & node, & peer, & bitcoind, & electrs) . await ;
1947+ node. stop( ) . unwrap( ) ;
1948+ }
1949+ }
1950+ } ;
1951+ }
1952+
17961953#[ macro_export]
17971954macro_rules! interop_combo_tests {
17981955 ( $prefix: ident, $setup_clients: ident, $setup_ldk_node: ident) => {
0 commit comments