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