2018-05-01 20:33:43 -05:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
2018-05-11 14:07:46 -05:00
|
|
|
|
using BTCPayServer.Payments.Lightning;
|
2018-05-01 20:33:43 -05:00
|
|
|
|
using BTCPayServer.Payments.Lightning.Lnd;
|
|
|
|
|
using NBitcoin;
|
2018-05-11 14:07:46 -05:00
|
|
|
|
using NBitcoin.RPC;
|
2018-05-01 20:33:43 -05:00
|
|
|
|
using Xunit;
|
|
|
|
|
using Xunit.Abstractions;
|
|
|
|
|
|
|
|
|
|
namespace BTCPayServer.Tests.UnitTests
|
|
|
|
|
{
|
2018-05-11 16:59:24 -05:00
|
|
|
|
// this depends for now on `docker-compose up devlnd`
|
2018-05-01 20:33:43 -05:00
|
|
|
|
public class LndTest
|
|
|
|
|
{
|
|
|
|
|
private readonly ITestOutputHelper output;
|
|
|
|
|
|
|
|
|
|
public LndTest(ITestOutputHelper output)
|
|
|
|
|
{
|
|
|
|
|
this.output = output;
|
2018-05-11 14:07:46 -05:00
|
|
|
|
initializeEnvironment();
|
2018-05-01 20:33:43 -05:00
|
|
|
|
|
2018-05-11 16:59:24 -05:00
|
|
|
|
MerchantLnd = LndSwaggerClientCustomHttp.Create(new Uri("http://127.0.0.1:53280"), Network.RegTest);
|
|
|
|
|
InvoiceClient = new LndClient(MerchantLnd);
|
|
|
|
|
|
|
|
|
|
CustomerLnd = LndSwaggerClientCustomHttp.Create(new Uri("http://127.0.0.1:53281"), Network.RegTest);
|
2018-05-01 20:33:43 -05:00
|
|
|
|
}
|
|
|
|
|
|
2018-05-11 16:59:24 -05:00
|
|
|
|
private LndSwaggerClientCustomHttp MerchantLnd { get; set; }
|
2018-05-11 14:07:46 -05:00
|
|
|
|
private LndClient InvoiceClient { get; set; }
|
|
|
|
|
|
2018-05-11 16:59:24 -05:00
|
|
|
|
private LndSwaggerClientCustomHttp CustomerLnd { get; set; }
|
|
|
|
|
|
2018-05-01 20:33:43 -05:00
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetInfo()
|
|
|
|
|
{
|
2018-05-11 14:07:46 -05:00
|
|
|
|
var res = await InvoiceClient.GetInfo();
|
2018-05-01 20:33:43 -05:00
|
|
|
|
output.WriteLine("Result: " + res.ToJson());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task CreateInvoice()
|
|
|
|
|
{
|
2018-05-11 14:07:46 -05:00
|
|
|
|
var res = await InvoiceClient.CreateInvoice(10000, "Hello world", TimeSpan.FromSeconds(3600));
|
2018-05-01 20:33:43 -05:00
|
|
|
|
output.WriteLine("Result: " + res.ToJson());
|
|
|
|
|
}
|
2018-05-11 14:07:46 -05:00
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetInvoice()
|
|
|
|
|
{
|
|
|
|
|
var createInvoice = await InvoiceClient.CreateInvoice(10000, "Hello world", TimeSpan.FromSeconds(3600));
|
|
|
|
|
var getInvoice = await InvoiceClient.GetInvoice(createInvoice.Id);
|
|
|
|
|
|
|
|
|
|
Assert.Equal(createInvoice.BOLT11, getInvoice.BOLT11);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task SetupWalletForPayment()
|
|
|
|
|
{
|
2018-05-11 16:59:24 -05:00
|
|
|
|
var merchantNodeInfo = await InvoiceClient.GetInfo();
|
|
|
|
|
var addressResponse = await CustomerLnd.NewWitnessAddressAsync();
|
2018-05-11 14:07:46 -05:00
|
|
|
|
var address = BitcoinAddress.Create(addressResponse.Address, Network.RegTest);
|
|
|
|
|
await ExplorerNode.SendToAddressAsync(address, Money.Coins(0.2m));
|
|
|
|
|
ExplorerNode.Generate(1);
|
|
|
|
|
await WaitLNSynched();
|
|
|
|
|
await Task.Delay(1000);
|
|
|
|
|
|
2018-05-11 16:59:24 -05:00
|
|
|
|
var connectResp = await CustomerLnd.ConnectPeerAsync(new LnrpcConnectPeerRequest
|
|
|
|
|
{
|
|
|
|
|
Addr = new LnrpcLightningAddress
|
|
|
|
|
{
|
|
|
|
|
Pubkey = merchantNodeInfo.NodeId,
|
|
|
|
|
Host = "merchant_lnd:8080"
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2018-05-11 14:07:46 -05:00
|
|
|
|
// We need two instances of lnd... one for merchant, one for buyer
|
|
|
|
|
// prepare that in next commit
|
|
|
|
|
//var channelReq = new LnrpcOpenChannelRequest
|
|
|
|
|
//{
|
|
|
|
|
// Local_funding_amount = 16777215.ToString()
|
|
|
|
|
//};
|
|
|
|
|
//var channelResp = await LndRpc.OpenChannelSyncAsync(channelReq);
|
|
|
|
|
|
|
|
|
|
output.WriteLine("Wallet Address: " + address);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task<LightningNodeInformation> WaitLNSynched()
|
|
|
|
|
{
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
var merchantInfo = await InvoiceClient.GetInfo();
|
|
|
|
|
var blockCount = await ExplorerNode.GetBlockCountAsync();
|
|
|
|
|
if (merchantInfo.BlockHeight != blockCount)
|
|
|
|
|
{
|
|
|
|
|
await Task.Delay(1000);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return merchantInfo;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
private void initializeEnvironment()
|
|
|
|
|
{
|
|
|
|
|
NetworkProvider = new BTCPayNetworkProvider(NetworkType.Regtest);
|
|
|
|
|
ExplorerNode = new RPCClient(RPCCredentialString.Parse(GetEnvironment("TESTS_BTCRPCCONNECTION", "server=http://127.0.0.1:43782;ceiwHEbqWI83:DwubwWsoo3")), NetworkProvider.GetNetwork("BTC").NBitcoinNetwork);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public BTCPayNetworkProvider NetworkProvider { get; private set; }
|
|
|
|
|
public RPCClient ExplorerNode { get; set; }
|
|
|
|
|
|
|
|
|
|
internal string GetEnvironment(string variable, string defaultValue)
|
|
|
|
|
{
|
|
|
|
|
var var = Environment.GetEnvironmentVariable(variable);
|
|
|
|
|
return String.IsNullOrEmpty(var) ? defaultValue : var;
|
|
|
|
|
}
|
2018-05-01 20:33:43 -05:00
|
|
|
|
}
|
|
|
|
|
}
|