setting up when the remote requests the yamux protocol
This commit is contained in:
parent
18b0139b81
commit
f4860d3ed4
5 changed files with 56 additions and 7 deletions
|
@ -83,8 +83,11 @@ int libp2p_identify_receive_protocol(struct IdentifyContext* context) {
|
|||
int libp2p_identify_handle_message(const struct StreamMessage* msg, struct SessionContext* context, void* protocol_context) {
|
||||
if (protocol_context == NULL)
|
||||
return -1;
|
||||
//struct IdentifyContext* ctx = (struct IdentifyContext*) protocol_context;
|
||||
// TODO: Do something with the incoming msg
|
||||
// attempt to create a new Identify connection with them.
|
||||
// send the protocol id back, and set up the channel
|
||||
struct IdentifyContext* ctx = (struct IdentifyContext*)protocol_context;
|
||||
libp2p_identify_send_protocol(ctx);
|
||||
//TODO: now add this "channel"
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -42,4 +42,11 @@ struct Libp2pProtocolHandler {
|
|||
*/
|
||||
struct Libp2pProtocolHandler* libp2p_protocol_handler_new();
|
||||
|
||||
int libp2p_protocol_marshal(struct StreamMessage* msg, struct SessionContext* context, struct Libp2pVector* protocol_handlers);
|
||||
/***
|
||||
* Handle an incoming message
|
||||
* @param message the incoming message
|
||||
* @param session the SessionContext of the incoming connection
|
||||
* @param handlers a Vector of protocol handlers
|
||||
* @returns -1 on error, 0 if everything was okay, but the daemon should no longer handle this connection, 1 on success
|
||||
*/
|
||||
int libp2p_protocol_marshal(struct StreamMessage* message, struct SessionContext* context, struct Libp2pVector* protocol_handlers);
|
||||
|
|
|
@ -41,8 +41,7 @@ struct Libp2pProtocolHandler* libp2p_protocol_handler_new() {
|
|||
|
||||
/***
|
||||
* Handle an incoming message
|
||||
* @param incoming the incoming data
|
||||
* @param incoming_size the size of the incoming data buffer
|
||||
* @param message the incoming message
|
||||
* @param session the SessionContext of the incoming connection
|
||||
* @param handlers a Vector of protocol handlers
|
||||
* @returns -1 on error, 0 if everything was okay, but the daemon should no longer handle this connection, 1 on success
|
||||
|
@ -65,6 +64,5 @@ int libp2p_protocol_marshal(struct StreamMessage* msg, struct SessionContext* se
|
|||
return -1;
|
||||
}
|
||||
|
||||
//TODO: strip off the protocol?
|
||||
return handler->HandleMessage(msg, session, handler->context);
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#include "libp2p/yamux/yamux.h"
|
||||
#include "libp2p/identify/identify.h"
|
||||
#include "mock_stream.h"
|
||||
#include "libp2p/utils/logger.h"
|
||||
|
||||
/***
|
||||
* Helpers
|
||||
|
@ -68,7 +69,7 @@ int test_yamux_identify() {
|
|||
struct Stream* yamux_stream = libp2p_yamux_stream_new(mock_stream);
|
||||
if (yamux_stream == NULL)
|
||||
goto exit;
|
||||
// TODO: Now add in another protocol
|
||||
// Now add in another protocol
|
||||
mock_stream->read = mock_identify_read_protocol;
|
||||
if (!libp2p_yamux_stream_add(yamux_stream->stream_context, libp2p_identify_stream_new(libp2p_yamux_channel_new(yamux_stream)))) {
|
||||
goto exit;
|
||||
|
@ -81,3 +82,42 @@ int test_yamux_identify() {
|
|||
mock_stream->close(mock_stream->stream_context);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
int test_yamux_incoming_protocol_request() {
|
||||
int retVal = 0;
|
||||
// setup
|
||||
struct Stream* mock_stream = mock_stream_new();
|
||||
mock_stream->read = mock_yamux_read_protocol;
|
||||
struct Stream* yamux_stream = libp2p_yamux_stream_new(mock_stream);
|
||||
if (yamux_stream == NULL)
|
||||
goto exit;
|
||||
// build the protocol handler that can handle identify protocol
|
||||
struct Libp2pVector* protocol_handlers = libp2p_utils_vector_new(1);
|
||||
struct Libp2pProtocolHandler* handler = libp2p_identify_build_protocol_handler(protocol_handlers);
|
||||
libp2p_utils_vector_add(protocol_handlers, handler);
|
||||
struct SessionContext session_context;
|
||||
session_context.default_stream = yamux_stream;
|
||||
// Someone is requesting the identity protocol
|
||||
mock_stream->read = mock_identify_read_protocol;
|
||||
struct StreamMessage* result_message;
|
||||
if (!yamux_stream->read(yamux_stream->stream_context, &result_message, 10)) {
|
||||
libp2p_logger_error("test_yamux", "Unable to read identify protocol.\n");
|
||||
goto exit;
|
||||
}
|
||||
// handle the marshaling of the protocol
|
||||
libp2p_protocol_marshal(result_message, &session_context, protocol_handlers);
|
||||
// now verify the results
|
||||
struct YamuxContext* yamux_context = (struct YamuxContext*)yamux_stream->stream_context;
|
||||
if (yamux_context->channels->total != 1) {
|
||||
libp2p_logger_error("test_yamux", "Identify protocol was not found.\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
// tear down
|
||||
retVal = 1;
|
||||
exit:
|
||||
if (yamux_stream != NULL)
|
||||
yamux_stream->close(yamux_stream->stream_context);
|
||||
mock_stream->close(mock_stream->stream_context);
|
||||
return retVal;
|
||||
}
|
||||
|
|
|
@ -116,6 +116,7 @@ int build_test_collection() {
|
|||
add_test("test_aes", test_aes, 1);
|
||||
add_test("test_yamux_stream_new", test_yamux_stream_new, 1);
|
||||
add_test("test_yamux_identify", test_yamux_identify, 1);
|
||||
add_test("test_yamux_incoming_protocol_request", test_yamux_incoming_protocol_request, 1);
|
||||
return 1;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue