2022-05-28 11:23:56 +08:00
|
|
|
#undef NDEBUG
|
|
|
|
|
#include"Boss/Mod/ForwardFeeMonitor.hpp"
|
|
|
|
|
#include"Boss/Mod/JsonOutputter.hpp"
|
2022-05-28 11:52:30 +08:00
|
|
|
#include"Boss/Mod/PeerFromScidMapper.hpp"
|
2022-05-28 11:23:56 +08:00
|
|
|
#include"Boss/Msg/ForwardFee.hpp"
|
|
|
|
|
#include"Boss/Msg/ListpeersResult.hpp"
|
|
|
|
|
#include"Boss/Msg/ManifestNotification.hpp"
|
|
|
|
|
#include"Boss/Msg/Manifestation.hpp"
|
|
|
|
|
#include"Boss/Msg/Notification.hpp"
|
|
|
|
|
#include"Ev/Io.hpp"
|
|
|
|
|
#include"Ev/start.hpp"
|
|
|
|
|
#include"Ev/yield.hpp"
|
|
|
|
|
#include"Jsmn/Object.hpp"
|
|
|
|
|
#include"S/Bus.hpp"
|
|
|
|
|
#include"Util/make_unique.hpp"
|
|
|
|
|
#include<assert.h>
|
|
|
|
|
#include<sstream>
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
|
|
auto const listpeers_result = R"JSON(
|
|
|
|
|
{ "peers": [ { "id": "020000000000000000000000000000000000000000000000000000000000000000"
|
|
|
|
|
, "channels": [ { "state": "CHANNELD_NORMAL"
|
|
|
|
|
, "to_us_msat": "750000000msat"
|
|
|
|
|
, "total_msat": "1000000000msat"
|
|
|
|
|
, "short_channel_id": "1000x1x0"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
, { "id": "020000000000000000000000000000000000000000000000000000000000000001"
|
|
|
|
|
, "channels": [ { "state": "CHANNELD_NORMAL"
|
|
|
|
|
, "to_us_msat": "0msat"
|
|
|
|
|
, "total_msat": "1000000000msat"
|
|
|
|
|
, "short_channel_id": "1000x1x1"
|
|
|
|
|
}
|
|
|
|
|
, { "state": "ONCHAIN"
|
|
|
|
|
, "to_us_msat": "1000000000msat"
|
|
|
|
|
, "total_msat": "1000000000msat"
|
|
|
|
|
, "short_channel_id": "999x1x1"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
, { "id": "020000000000000000000000000000000000000000000000000000000000000002"
|
|
|
|
|
, "channels": [ { "state": "CHANNELD_NORMAL"
|
|
|
|
|
, "to_us_msat": "80000msat"
|
|
|
|
|
, "total_msat": "1000000000msat"
|
|
|
|
|
, "short_channel_id": "1000x1x2"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
)JSON";
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
auto bus = S::Bus();
|
|
|
|
|
|
|
|
|
|
/* Utility outputter. */
|
|
|
|
|
Boss::Mod::JsonOutputter cout(std::cout, bus);
|
|
|
|
|
|
|
|
|
|
/* Module under test. */
|
|
|
|
|
Boss::Mod::ForwardFeeMonitor mut(bus);
|
|
|
|
|
|
2022-05-28 11:52:30 +08:00
|
|
|
/* Utility. */
|
|
|
|
|
Boss::Mod::PeerFromScidMapper mapper(bus);
|
|
|
|
|
|
2022-05-28 11:23:56 +08:00
|
|
|
/* Should occur once. */
|
|
|
|
|
auto got_manifest_notification = false;
|
|
|
|
|
bus.subscribe<Boss::Msg::ManifestNotification
|
|
|
|
|
>([&](Boss::Msg::ManifestNotification const& m) {
|
|
|
|
|
assert(!got_manifest_notification);
|
|
|
|
|
assert(m.name == "forward_event");
|
|
|
|
|
got_manifest_notification = true;
|
|
|
|
|
return Ev::lift();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/* Monitor ForwardFee messages. */
|
|
|
|
|
auto forwardfee = std::unique_ptr<Boss::Msg::ForwardFee>();
|
|
|
|
|
bus.subscribe<Boss::Msg::ForwardFee
|
|
|
|
|
>([&](Boss::Msg::ForwardFee const& m) {
|
|
|
|
|
forwardfee = Util::make_unique<Boss::Msg::ForwardFee>(m);
|
|
|
|
|
return Ev::lift();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/* Test. */
|
|
|
|
|
auto code = Ev::lift().then([&]() {
|
|
|
|
|
|
|
|
|
|
/* Trigger manifestation. */
|
|
|
|
|
return bus.raise(Boss::Msg::Manifestation{});
|
|
|
|
|
}).then([&]() {
|
|
|
|
|
return Ev::yield(42);
|
|
|
|
|
}).then([&]() {
|
|
|
|
|
assert(got_manifest_notification);
|
|
|
|
|
|
|
|
|
|
/* Give the peers. */
|
|
|
|
|
return bus.raise(Boss::Msg::ListpeersResult{
|
2024-08-05 19:11:03 -07:00
|
|
|
Boss::Mod::convert_legacy_listpeers(Jsmn::Object::parse_json(listpeers_result)["peers"]), true
|
2022-05-28 11:23:56 +08:00
|
|
|
});
|
|
|
|
|
}).then([&]() {
|
|
|
|
|
|
|
|
|
|
/* Should ignore non-forward_event. */
|
|
|
|
|
forwardfee = nullptr;
|
|
|
|
|
return bus.raise(Boss::Msg::Notification{
|
2024-08-05 19:11:03 -07:00
|
|
|
"not-forward_event", Jsmn::Object::parse_json("{}")
|
2022-05-28 11:23:56 +08:00
|
|
|
});
|
|
|
|
|
}).then([&]() {
|
|
|
|
|
return Ev::yield(42);
|
|
|
|
|
}).then([&]() {
|
|
|
|
|
assert(!forwardfee);
|
|
|
|
|
|
|
|
|
|
/* Check legit forward_event. */
|
|
|
|
|
forwardfee = nullptr;
|
|
|
|
|
return bus.raise(Boss::Msg::Notification{
|
|
|
|
|
"forward_event",
|
2024-08-05 19:11:03 -07:00
|
|
|
Jsmn::Object::parse_json(R"JSON(
|
2022-05-28 11:23:56 +08:00
|
|
|
{
|
|
|
|
|
"forward_event": {
|
|
|
|
|
"payment_hash": "f5a6a059a25d1e329d9b094aeeec8c2191ca037d3f5b0662e21ae850debe8ea2",
|
|
|
|
|
"in_channel": "1000x1x1",
|
|
|
|
|
"out_channel": "1000x1x0",
|
|
|
|
|
"in_msatoshi": 100001001,
|
|
|
|
|
"in_msat": "100001001msat",
|
|
|
|
|
"out_msatoshi": 100000000,
|
|
|
|
|
"out_msat": "100000000msat",
|
|
|
|
|
"fee_msat": "1001msat",
|
|
|
|
|
"status": "settled",
|
|
|
|
|
"received_time": 1560696342.368,
|
|
|
|
|
"resolved_time": 1560696342.556
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
)JSON")
|
|
|
|
|
});
|
|
|
|
|
}).then([&]() {
|
|
|
|
|
return Ev::yield(42);
|
|
|
|
|
}).then([&]() {
|
|
|
|
|
assert(forwardfee);
|
|
|
|
|
assert(forwardfee->in_id == Ln::NodeId("020000000000000000000000000000000000000000000000000000000000000001"));
|
|
|
|
|
assert(forwardfee->out_id == Ln::NodeId("020000000000000000000000000000000000000000000000000000000000000000"));
|
|
|
|
|
assert(forwardfee->fee == Ln::Amount::msat(1001));
|
|
|
|
|
assert(forwardfee->resolution_time == (1560696342.556 - 1560696342.368));
|
2024-08-15 13:37:29 -07:00
|
|
|
assert(forwardfee->amount == Ln::Amount::msat(100000000));
|
2022-05-28 11:23:56 +08:00
|
|
|
return Ev::lift(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return Ev::start(code);
|
|
|
|
|
}
|