Update tests for new upstream API and using invoicse
[ldk-java] / src / test / java / org / ldk / HumanObjectPeerTest.java
index 0bde005b66ba08b5c043df58944a486e8e48e095..c1991c9a8f1af2ea382ddc3648041ba463b4b06e 100644 (file)
@@ -4,6 +4,7 @@ import org.bitcoinj.core.*;
 import org.bitcoinj.script.Script;
 import org.junit.jupiter.api.Test;
 import org.ldk.batteries.NioPeerHandler;
+import org.ldk.enums.LDKCurrency;
 import org.ldk.enums.LDKNetwork;
 import org.ldk.impl.bindings;
 import org.ldk.structs.*;
@@ -43,7 +44,8 @@ class HumanObjectPeerTestInstance {
                 @Override
                 public Sign get_channel_signer(boolean inbound, long channel_value_satoshis) {
                     Sign underlying_ck = underlying_if.get_channel_signer(inbound, channel_value_satoshis);
-                    Sign.SignInterface si = new Sign.SignInterface() {
+                    // TODO: Expose the underlying signer from a Sign
+                    /*BaseSign.BaseSignInterface si = new BaseSign.BaseSignInterface() {
                         @Override
                         public byte[] get_per_commitment_point(long idx) {
                             return underlying_ck.get_per_commitment_point(idx);
@@ -98,12 +100,13 @@ class HumanObjectPeerTestInstance {
                         public byte[] write() {
                             return underlying_ck.write();
                         }
-                    };
-                    Sign resp = Sign.new_impl(si, underlying_ck.get_pubkeys());
-                    must_free_objs.add(new WeakReference<>(si));
-                    must_free_objs.add(new WeakReference<>(resp));
+                    };*/
+                    //Sign resp = Sign.new_impl(si, underlying_ck.get_pubkeys());
+                    //must_free_objs.add(new WeakReference<>(si));
+                    //must_free_objs.add(new WeakReference<>(resp));
                     must_free_objs.add(new WeakReference<>(underlying_ck));
-                    return resp;
+                    //return resp;
+                    return underlying_ck;
                 }
 
                 @Override
@@ -115,6 +118,11 @@ class HumanObjectPeerTestInstance {
                 public Result_SignDecodeErrorZ read_chan_signer(byte[] reader) {
                     return underlying_if.read_chan_signer(reader);
                 }
+
+                @Override
+                public Result_RecoverableSignatureNoneZ sign_invoice(byte[] invoice_preimage) {
+                    return underlying_if.sign_invoice(invoice_preimage);
+                }
             });
         }
 
@@ -270,7 +278,7 @@ class HumanObjectPeerTestInstance {
         }
         Peer(byte seed) {
             this(null, seed);
-            this.chan_manager = ChannelManager.constructor_new(FeeEstimator.new_impl(confirmation_target -> 0), chain_watch, tx_broadcaster, logger, this.keys_interface, UserConfig.constructor_default(), LDKNetwork.LDKNetwork_Bitcoin, new byte[32], 0);
+            this.chan_manager = ChannelManager.constructor_new(FeeEstimator.new_impl(confirmation_target -> 0), chain_watch, tx_broadcaster, logger, this.keys_interface, UserConfig.constructor_default(), LDKNetwork.LDKNetwork_Bitcoin, BestBlock.constructor_new(new byte[32], 0));
             this.node_id = chan_manager.get_our_node_id();
             this.chan_manager_events = chan_manager.as_EventsProvider();
 
@@ -342,10 +350,13 @@ class HumanObjectPeerTestInstance {
                 txn = new TwoTuple[]{txp};
             } else
                 txn = new TwoTuple[0];
-            chan_manager.as_Listen().block_connected(b.bitcoinSerialize(), height);
             if (chain_monitor != null) {
-                chain_monitor.block_connected(header, txn, height);
+                chan_manager.as_Listen().block_connected(b.bitcoinSerialize(), height);
+                chain_monitor.as_Listen().block_connected(b.bitcoinSerialize(), height);
             } else {
+                chan_manager.as_Confirm().transactions_confirmed(header, txn, height);
+                chan_manager.as_Confirm().best_block_updated(header, height);
+                // Connect manually if we aren't using a ChainMonitor and are implementing Watch ourselves
                 synchronized (monitors) {
                     assert monitors.size() == 1;
                     for (ChannelMonitor mon : monitors.values()) {
@@ -519,13 +530,13 @@ class HumanObjectPeerTestInstance {
         funding.getInputs().get(0).setWitness(new TransactionWitness(2)); // Make sure we don't complain about lack of witness
         funding.getInput(0).getWitness().setPush(0, new byte[]{0x1});
         funding.addOutput(Coin.SATOSHI.multiply(10000), new Script(funding_spk));
-        peer1.chan_manager.funding_transaction_generated(chan_id, OutPoint.constructor_new(funding.getTxId().getReversedBytes(), (short) 0));
+        Result_NoneAPIErrorZ funding_res = peer1.chan_manager.funding_transaction_generated(chan_id, funding.bitcoinSerialize());
+        assert funding_res instanceof Result_NoneAPIErrorZ.Result_NoneAPIErrorZ_OK;
         wait_events_processed(peer1, peer2);
 
-        events = peer1.chan_manager_events.get_and_clear_pending_events();
-        assert events.length == 1;
-        assert events[0] instanceof Event.FundingBroadcastSafe;
-        assert ((Event.FundingBroadcastSafe) events[0]).user_channel_id == 42;
+        assert peer1.broadcast_set.size() == 1;
+        assert Arrays.equals(peer1.broadcast_set.get(0), funding.bitcoinSerialize());
+        peer1.broadcast_set.clear();
 
         Block b = new Block(bitcoinj_net, 2, Sha256Hash.ZERO_HASH, Sha256Hash.ZERO_HASH, 42, 0, 0, Arrays.asList(new Transaction[]{funding}));
         peer1.connect_block(b, 1, 0);
@@ -551,11 +562,13 @@ class HumanObjectPeerTestInstance {
         assert Arrays.equals(peer1_chans[0].get_channel_id(), funding.getTxId().getReversedBytes());
         assert Arrays.equals(peer2_chans[0].get_channel_id(), funding.getTxId().getReversedBytes());
 
-        byte[] payment_preimage = new byte[32];
-        for (int i = 0; i < 32; i++) payment_preimage[i] = (byte) (i ^ 0x0f);
-        byte[] payment_hash = Sha256Hash.hash(payment_preimage);
+        Result_InvoiceNoneZ invoice = UtilMethods.constructor_invoice_from_channelmanager(peer2.chan_manager, peer2.keys_interface, LDKCurrency.LDKCurrency_Bitcoin, Option_u64Z.constructor_none(), new byte[0]);
+        assert invoice instanceof Result_InvoiceNoneZ.Result_InvoiceNoneZ_OK;
+        byte[] payment_hash = ((Result_InvoiceNoneZ.Result_InvoiceNoneZ_OK) invoice).res.payment_hash();
+        byte[] payment_secret = ((Result_InvoiceNoneZ.Result_InvoiceNoneZ_OK) invoice).res.payment_secret();
+
         Route route = peer1.get_route(peer2.node_id, peer1_chans);
-        Result_NonePaymentSendFailureZ payment_res = peer1.chan_manager.send_payment(route, payment_hash, new byte[32]);
+        Result_NonePaymentSendFailureZ payment_res = peer1.chan_manager.send_payment(route, payment_hash, payment_secret);
         assert payment_res instanceof Result_NonePaymentSendFailureZ.Result_NonePaymentSendFailureZ_OK;
         wait_events_processed(peer1, peer2);
 
@@ -565,7 +578,7 @@ class HumanObjectPeerTestInstance {
         hop_pubkey[1] = 42;
         hops[0][0] = RouteHop.constructor_new(hop_pubkey, NodeFeatures.constructor_known(), 42, ChannelFeatures.constructor_known(), 100, 0);
         Route r2 = Route.constructor_new(hops);
-        payment_res = peer1.chan_manager.send_payment(r2, payment_hash, new byte[32]);
+        payment_res = peer1.chan_manager.send_payment(r2, payment_hash, payment_secret);
         assert payment_res instanceof Result_NonePaymentSendFailureZ.Result_NonePaymentSendFailureZ_Err;
 
         assert peer1.get_monitor_events().length == 0;
@@ -579,9 +592,9 @@ class HumanObjectPeerTestInstance {
             WeakReference<Peer> op1 = new WeakReference<Peer>(peer1);
             peer1 = new Peer(peer1);
             peer2 = new Peer(peer2);
-            return new TestState(op1, peer1, peer2, payment_preimage, b.getHash());
+            return new TestState(op1, peer1, peer2, b.getHash());
         }
-        return new TestState(null, peer1, peer2, payment_preimage, b.getHash());
+        return new TestState(null, peer1, peer2, b.getHash());
     }
 
     boolean cross_reload_ref_pollution = false;
@@ -589,14 +602,12 @@ class HumanObjectPeerTestInstance {
         private final WeakReference<Peer> ref_block;
         private final Peer peer1;
         private final Peer peer2;
-        private final byte[] payment_preimage;
         public Sha256Hash best_blockhash;
 
-        public TestState(WeakReference<Peer> ref_block, Peer peer1, Peer peer2, byte[] payment_preimage, Sha256Hash best_blockhash) {
+        public TestState(WeakReference<Peer> ref_block, Peer peer1, Peer peer2, Sha256Hash best_blockhash) {
             this.ref_block = ref_block;
             this.peer1 = peer1;
             this.peer2 = peer2;
-            this.payment_preimage = payment_preimage;
             this.best_blockhash = best_blockhash;
         }
     }
@@ -621,13 +632,15 @@ class HumanObjectPeerTestInstance {
         events = state.peer2.chan_manager_events.get_and_clear_pending_events();
         assert events.length == 1;
         assert events[0] instanceof Event.PaymentReceived;
-        state.peer2.chan_manager.claim_funds(state.payment_preimage, new byte[32], ((Event.PaymentReceived) events[0]).amt);
+        byte[] payment_preimage = ((Event.PaymentReceived)events[0]).payment_preimage;
+        assert !Arrays.equals(payment_preimage, new byte[32]);
+        state.peer2.chan_manager.claim_funds(payment_preimage);
         wait_events_processed(state.peer1, state.peer2);
 
         events = state.peer1.chan_manager_events.get_and_clear_pending_events();
         assert events.length == 1;
         assert events[0] instanceof Event.PaymentSent;
-        assert Arrays.equals(((Event.PaymentSent) events[0]).payment_preimage, state.payment_preimage);
+        assert Arrays.equals(((Event.PaymentSent) events[0]).payment_preimage, payment_preimage);
         wait_events_processed(state.peer1, state.peer2);
 
         ChannelDetails[] peer1_chans = state.peer1.chan_manager.list_channels();
@@ -644,7 +657,7 @@ class HumanObjectPeerTestInstance {
             wait_events_processed(state.peer1, state.peer2);
 
             assert state.peer1.broadcast_set.size() == 1;
-            assert state.peer2.broadcast_set.size() == 0;
+            assert state.peer2.broadcast_set.size() == 1;
 
             NetworkParameters bitcoinj_net = NetworkParameters.fromID(NetworkParameters.ID_MAINNET);
             Transaction tx = new Transaction(bitcoinj_net, state.peer1.broadcast_set.getFirst());