Skip to content

Commit

Permalink
multiprocess: Add type conversion code for UniValue types
Browse files Browse the repository at this point in the history
Extend IPC unit test to cover this and verify the serialization happens
correctly.
  • Loading branch information
ryanofsky committed Nov 20, 2023
1 parent b120ff4 commit 33d7964
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 0 deletions.
19 changes: 19 additions & 0 deletions src/ipc/capnp/common-types.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include <clientversion.h>
#include <streams.h>
#include <univalue.h>

#include <cstddef>
#include <mp/proxy-types.h>
Expand Down Expand Up @@ -84,6 +85,24 @@ CustomReadField(TypeList<LocalType>, Priority<1>, InvokeContext& invoke_context,
value.Unserialize(stream);
});
}

template <typename Value, typename Output>
void CustomBuildField(TypeList<UniValue>, Priority<1>, InvokeContext& invoke_context, Value&& value, Output&& output)
{
std::string str = value.write();
auto result = output.init(str.size());
memcpy(result.begin(), str.data(), str.size());
}

template <typename Input, typename ReadDest>
decltype(auto) CustomReadField(TypeList<UniValue>, Priority<1>, InvokeContext& invoke_context, Input&& input,
ReadDest&& read_dest)
{
return read_dest.update([&](auto& value) {
auto data = input.get();
value.read(std::string_view{data.begin(), data.size()});
});
}
} // namespace mp

#endif // BITCOIN_IPC_CAPNP_COMMON_TYPES_H
1 change: 1 addition & 0 deletions src/test/ipc_test.capnp
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ $Proxy.includeTypes("ipc/capnp/common-types.h");
interface FooInterface $Proxy.wrap("FooImplementation") {
add @0 (a :Int32, b :Int32) -> (result :Int32);
passOutPoint @1 (arg :Data) -> (result :Data);
passUniValue @2 (arg :Text) -> (result :Text);
}
6 changes: 6 additions & 0 deletions src/test/ipc_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,12 @@ void IpcTest()
COutPoint txout2{foo->passOutPoint(txout1)};
BOOST_CHECK(txout1 == txout2);

UniValue uni1{UniValue::VOBJ};
uni1.pushKV("i", 1);
uni1.pushKV("s", "two");
UniValue uni2{foo->passUniValue(uni1)};
BOOST_CHECK_EQUAL(uni1.write(), uni2.write());

// Test cleanup: disconnect pipe and join thread
disconnect_client();
thread.join();
Expand Down
2 changes: 2 additions & 0 deletions src/test/ipc_test.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
#define BITCOIN_TEST_IPC_TEST_H

#include <primitives/transaction.h>
#include <univalue.h>

class FooImplementation
{
public:
int add(int a, int b) { return a + b; }
COutPoint passOutPoint(COutPoint o) { return o; }
UniValue passUniValue(UniValue v) { return v; }
};

void IpcTest();
Expand Down

0 comments on commit 33d7964

Please sign in to comment.