Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
actor-incubator
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
cpp-libs
actor-incubator
Commits
f69e5759
Unverified
Commit
f69e5759
authored
Nov 28, 2019
by
Dominik Charousset
Committed by
GitHub
Nov 28, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #47
Refactor code to use new binary_serializer
parents
0a4f2108
98243583
Changes
26
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
86 additions
and
91 deletions
+86
-91
libcaf_net/caf/net/basp/application.hpp
libcaf_net/caf/net/basp/application.hpp
+0
-2
libcaf_net/caf/net/datagram_transport.hpp
libcaf_net/caf/net/datagram_transport.hpp
+3
-5
libcaf_net/caf/net/packet_writer_decorator.hpp
libcaf_net/caf/net/packet_writer_decorator.hpp
+0
-1
libcaf_net/caf/net/stream_transport.hpp
libcaf_net/caf/net/stream_transport.hpp
+3
-1
libcaf_net/caf/net/transport_worker_dispatcher.hpp
libcaf_net/caf/net/transport_worker_dispatcher.hpp
+1
-1
libcaf_net/src/application.cpp
libcaf_net/src/application.cpp
+9
-9
libcaf_net/src/host.cpp
libcaf_net/src/host.cpp
+2
-0
libcaf_net/src/multiplexer.cpp
libcaf_net/src/multiplexer.cpp
+1
-1
libcaf_net/src/pipe_socket.cpp
libcaf_net/src/pipe_socket.cpp
+3
-5
libcaf_net/src/pollset_updater.cpp
libcaf_net/src/pollset_updater.cpp
+2
-0
libcaf_net/src/stream_socket.cpp
libcaf_net/src/stream_socket.cpp
+0
-1
libcaf_net/src/udp_datagram_socket.cpp
libcaf_net/src/udp_datagram_socket.cpp
+0
-1
libcaf_net/test/application.cpp
libcaf_net/test/application.cpp
+1
-1
libcaf_net/test/datagram_transport.cpp
libcaf_net/test/datagram_transport.cpp
+4
-4
libcaf_net/test/endpoint_manager.cpp
libcaf_net/test/endpoint_manager.cpp
+9
-9
libcaf_net/test/header.cpp
libcaf_net/test/header.cpp
+2
-2
libcaf_net/test/multiplexer.cpp
libcaf_net/test/multiplexer.cpp
+1
-1
libcaf_net/test/net/basp/worker.cpp
libcaf_net/test/net/basp/worker.cpp
+2
-2
libcaf_net/test/pipe_socket.cpp
libcaf_net/test/pipe_socket.cpp
+2
-3
libcaf_net/test/stream_application.cpp
libcaf_net/test/stream_application.cpp
+8
-8
libcaf_net/test/stream_socket.cpp
libcaf_net/test/stream_socket.cpp
+8
-10
libcaf_net/test/stream_transport.cpp
libcaf_net/test/stream_transport.cpp
+4
-4
libcaf_net/test/string_application.cpp
libcaf_net/test/string_application.cpp
+9
-7
libcaf_net/test/transport_worker.cpp
libcaf_net/test/transport_worker.cpp
+4
-6
libcaf_net/test/transport_worker_dispatcher.cpp
libcaf_net/test/transport_worker_dispatcher.cpp
+1
-1
libcaf_net/test/udp_datagram_socket.cpp
libcaf_net/test/udp_datagram_socket.cpp
+7
-6
No files found.
libcaf_net/caf/net/basp/application.hpp
View file @
f69e5759
...
@@ -46,8 +46,6 @@
...
@@ -46,8 +46,6 @@
#include "caf/proxy_registry.hpp"
#include "caf/proxy_registry.hpp"
#include "caf/response_promise.hpp"
#include "caf/response_promise.hpp"
#include "caf/scoped_execution_unit.hpp"
#include "caf/scoped_execution_unit.hpp"
#include "caf/serializer_impl.hpp"
#include "caf/span.hpp"
#include "caf/unit.hpp"
#include "caf/unit.hpp"
namespace
caf
::
net
::
basp
{
namespace
caf
::
net
::
basp
{
...
...
libcaf_net/caf/net/datagram_transport.hpp
View file @
f69e5759
...
@@ -30,7 +30,6 @@
...
@@ -30,7 +30,6 @@
#include "caf/net/transport_worker_dispatcher.hpp"
#include "caf/net/transport_worker_dispatcher.hpp"
#include "caf/net/udp_datagram_socket.hpp"
#include "caf/net/udp_datagram_socket.hpp"
#include "caf/sec.hpp"
#include "caf/sec.hpp"
#include "caf/span.hpp"
namespace
caf
::
net
{
namespace
caf
::
net
{
...
@@ -81,14 +80,13 @@ public:
...
@@ -81,14 +80,13 @@ public:
bool
handle_read_event
(
endpoint_manager
&
)
override
{
bool
handle_read_event
(
endpoint_manager
&
)
override
{
CAF_LOG_TRACE
(
CAF_ARG
(
this
->
handle_
.
id
));
CAF_LOG_TRACE
(
CAF_ARG
(
this
->
handle_
.
id
));
auto
ret
=
read
(
this
->
handle_
,
make_span
(
this
->
read_buf_
)
);
auto
ret
=
read
(
this
->
handle_
,
this
->
read_buf_
);
if
(
auto
res
=
get_if
<
std
::
pair
<
size_t
,
ip_endpoint
>>
(
&
ret
))
{
if
(
auto
res
=
get_if
<
std
::
pair
<
size_t
,
ip_endpoint
>>
(
&
ret
))
{
auto
num_bytes
=
res
->
first
;
auto
num_bytes
=
res
->
first
;
CAF_LOG_DEBUG
(
"received "
<<
num_bytes
<<
" bytes"
);
CAF_LOG_DEBUG
(
"received "
<<
num_bytes
<<
" bytes"
);
auto
ep
=
res
->
second
;
auto
ep
=
res
->
second
;
this
->
read_buf_
.
resize
(
num_bytes
);
this
->
read_buf_
.
resize
(
num_bytes
);
this
->
next_layer_
.
handle_data
(
*
this
,
make_span
(
this
->
read_buf_
),
this
->
next_layer_
.
handle_data
(
*
this
,
this
->
read_buf_
,
std
::
move
(
ep
));
std
::
move
(
ep
));
prepare_next_read
();
prepare_next_read
();
}
else
{
}
else
{
auto
err
=
get
<
sec
>
(
ret
);
auto
err
=
get
<
sec
>
(
ret
);
...
@@ -183,7 +181,7 @@ private:
...
@@ -183,7 +181,7 @@ private:
while
(
!
packet_queue_
.
empty
())
{
while
(
!
packet_queue_
.
empty
())
{
auto
&
packet
=
packet_queue_
.
front
();
auto
&
packet
=
packet_queue_
.
front
();
auto
ptrs
=
packet
.
get_buffer_ptrs
();
auto
ptrs
=
packet
.
get_buffer_ptrs
();
auto
write_ret
=
write
(
this
->
handle_
,
make_span
(
ptrs
)
,
packet
.
id
);
auto
write_ret
=
write
(
this
->
handle_
,
ptrs
,
packet
.
id
);
if
(
auto
num_bytes
=
get_if
<
size_t
>
(
&
write_ret
))
{
if
(
auto
num_bytes
=
get_if
<
size_t
>
(
&
write_ret
))
{
CAF_LOG_DEBUG
(
CAF_ARG
(
this
->
handle_
.
id
)
<<
CAF_ARG
(
*
num_bytes
));
CAF_LOG_DEBUG
(
CAF_ARG
(
this
->
handle_
.
id
)
<<
CAF_ARG
(
*
num_bytes
));
CAF_LOG_WARNING_IF
(
*
num_bytes
<
packet
.
size
,
CAF_LOG_WARNING_IF
(
*
num_bytes
<
packet
.
size
,
...
...
libcaf_net/caf/net/packet_writer_decorator.hpp
View file @
f69e5759
...
@@ -21,7 +21,6 @@
...
@@ -21,7 +21,6 @@
#include "caf/net/packet_writer.hpp"
#include "caf/net/packet_writer.hpp"
#include "caf/byte.hpp"
#include "caf/byte.hpp"
#include "caf/span.hpp"
namespace
caf
::
net
{
namespace
caf
::
net
{
...
...
libcaf_net/caf/net/stream_transport.hpp
View file @
f69e5759
...
@@ -84,7 +84,9 @@ public:
...
@@ -84,7 +84,9 @@ public:
<<
CAF_ARG
(
this
->
handle_
.
id
)
<<
CAF_ARG
(
*
num_bytes
));
<<
CAF_ARG
(
this
->
handle_
.
id
)
<<
CAF_ARG
(
*
num_bytes
));
this
->
collected_
+=
*
num_bytes
;
this
->
collected_
+=
*
num_bytes
;
if
(
this
->
collected_
>=
this
->
read_threshold_
)
{
if
(
this
->
collected_
>=
this
->
read_threshold_
)
{
if
(
auto
err
=
this
->
next_layer_
.
handle_data
(
*
this
,
this
->
read_buf_
))
{
if
(
auto
err
=
this
->
next_layer_
.
handle_data
(
*
this
,
make_span
(
this
->
read_buf_
)))
{
CAF_LOG_ERROR
(
"handle_data failed: "
<<
CAF_ARG
(
err
));
CAF_LOG_ERROR
(
"handle_data failed: "
<<
CAF_ARG
(
err
));
return
false
;
return
false
;
}
}
...
...
libcaf_net/caf/net/transport_worker_dispatcher.hpp
View file @
f69e5759
...
@@ -62,7 +62,7 @@ public:
...
@@ -62,7 +62,7 @@ public:
}
}
template
<
class
Parent
>
template
<
class
Parent
>
error
handle_data
(
Parent
&
parent
,
span
<
byte
>
data
,
id_type
id
)
{
error
handle_data
(
Parent
&
parent
,
span
<
const
byte
>
data
,
id_type
id
)
{
if
(
auto
worker
=
find_worker
(
id
))
if
(
auto
worker
=
find_worker
(
id
))
return
worker
->
handle_data
(
parent
,
data
);
return
worker
->
handle_data
(
parent
,
data
);
// TODO: Where to get node_id from here?
// TODO: Where to get node_id from here?
...
...
libcaf_net/src/application.cpp
View file @
f69e5759
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
#include "caf/actor_system.hpp"
#include "caf/actor_system.hpp"
#include "caf/actor_system_config.hpp"
#include "caf/actor_system_config.hpp"
#include "caf/binary_deserializer.hpp"
#include "caf/binary_deserializer.hpp"
#include "caf/binary_serializer.hpp"
#include "caf/byte.hpp"
#include "caf/byte.hpp"
#include "caf/defaults.hpp"
#include "caf/defaults.hpp"
#include "caf/detail/network_order.hpp"
#include "caf/detail/network_order.hpp"
...
@@ -37,7 +38,6 @@
...
@@ -37,7 +38,6 @@
#include "caf/none.hpp"
#include "caf/none.hpp"
#include "caf/sec.hpp"
#include "caf/sec.hpp"
#include "caf/send.hpp"
#include "caf/send.hpp"
#include "caf/serializer_impl.hpp"
#include "caf/string_algorithms.hpp"
#include "caf/string_algorithms.hpp"
#include "caf/type_erased_tuple.hpp"
#include "caf/type_erased_tuple.hpp"
...
@@ -54,7 +54,7 @@ error application::write_message(
...
@@ -54,7 +54,7 @@ error application::write_message(
CAF_ASSERT
(
ptr
->
msg
!=
nullptr
);
CAF_ASSERT
(
ptr
->
msg
!=
nullptr
);
CAF_LOG_TRACE
(
CAF_ARG2
(
"content"
,
ptr
->
msg
->
content
()));
CAF_LOG_TRACE
(
CAF_ARG2
(
"content"
,
ptr
->
msg
->
content
()));
auto
payload_prefix
=
writer
.
next_payload_buffer
();
auto
payload_prefix
=
writer
.
next_payload_buffer
();
serializer_impl
<
buffer_type
>
sink
{
system
(),
payload_prefix
};
binary_serializer
sink
{
system
(),
payload_prefix
};
const
auto
&
src
=
ptr
->
msg
->
sender
;
const
auto
&
src
=
ptr
->
msg
->
sender
;
const
auto
&
dst
=
ptr
->
receiver
;
const
auto
&
dst
=
ptr
->
receiver
;
if
(
dst
==
nullptr
)
{
if
(
dst
==
nullptr
)
{
...
@@ -84,7 +84,7 @@ void application::resolve(packet_writer& writer, string_view path,
...
@@ -84,7 +84,7 @@ void application::resolve(packet_writer& writer, string_view path,
const
actor
&
listener
)
{
const
actor
&
listener
)
{
CAF_LOG_TRACE
(
CAF_ARG
(
path
)
<<
CAF_ARG
(
listener
));
CAF_LOG_TRACE
(
CAF_ARG
(
path
)
<<
CAF_ARG
(
listener
));
auto
payload
=
writer
.
next_payload_buffer
();
auto
payload
=
writer
.
next_payload_buffer
();
serializer_impl
<
buffer_type
>
sink
{
&
executor_
,
payload
};
binary_serializer
sink
{
&
executor_
,
payload
};
if
(
auto
err
=
sink
(
path
))
{
if
(
auto
err
=
sink
(
path
))
{
CAF_LOG_ERROR
(
"unable to serialize path"
<<
CAF_ARG
(
err
));
CAF_LOG_ERROR
(
"unable to serialize path"
<<
CAF_ARG
(
err
));
return
;
return
;
...
@@ -108,7 +108,7 @@ void application::new_proxy(packet_writer& writer, actor_id id) {
...
@@ -108,7 +108,7 @@ void application::new_proxy(packet_writer& writer, actor_id id) {
void
application
::
local_actor_down
(
packet_writer
&
writer
,
actor_id
id
,
void
application
::
local_actor_down
(
packet_writer
&
writer
,
actor_id
id
,
error
reason
)
{
error
reason
)
{
auto
payload
=
writer
.
next_payload_buffer
();
auto
payload
=
writer
.
next_payload_buffer
();
serializer_impl
<
buffer_type
>
sink
{
system
(),
payload
};
binary_serializer
sink
{
system
(),
payload
};
if
(
auto
err
=
sink
(
reason
))
if
(
auto
err
=
sink
(
reason
))
CAF_RAISE_ERROR
(
"unable to serialize an error"
);
CAF_RAISE_ERROR
(
"unable to serialize an error"
);
auto
hdr
=
writer
.
next_header_buffer
();
auto
hdr
=
writer
.
next_header_buffer
();
...
@@ -122,9 +122,9 @@ void application::local_actor_down(packet_writer& writer, actor_id id,
...
@@ -122,9 +122,9 @@ void application::local_actor_down(packet_writer& writer, actor_id id,
expected
<
std
::
vector
<
byte
>>
application
::
serialize
(
actor_system
&
sys
,
expected
<
std
::
vector
<
byte
>>
application
::
serialize
(
actor_system
&
sys
,
const
type_erased_tuple
&
x
)
{
const
type_erased_tuple
&
x
)
{
std
::
vector
<
byte
>
result
;
std
::
vector
<
byte
>
result
;
serializer_impl
<
std
::
vector
<
byte
>>
sink
{
sys
,
result
};
binary_serializer
sink
{
sys
,
result
};
if
(
auto
err
=
message
::
save
(
sink
,
x
))
if
(
auto
err
=
message
::
save
(
sink
,
x
))
return
err
;
return
err
.
value
()
;
return
result
;
return
result
;
}
}
...
@@ -307,7 +307,7 @@ error application::handle_resolve_request(packet_writer& writer, header rec_hdr,
...
@@ -307,7 +307,7 @@ error application::handle_resolve_request(packet_writer& writer, header rec_hdr,
}
}
// TODO: figure out how to obtain messaging interface.
// TODO: figure out how to obtain messaging interface.
auto
payload
=
writer
.
next_payload_buffer
();
auto
payload
=
writer
.
next_payload_buffer
();
serializer_impl
<
buffer_type
>
sink
{
&
executor_
,
payload
};
binary_serializer
sink
{
&
executor_
,
payload
};
if
(
auto
err
=
sink
(
aid
,
ifs
))
if
(
auto
err
=
sink
(
aid
,
ifs
))
return
err
;
return
err
;
auto
hdr
=
writer
.
next_header_buffer
();
auto
hdr
=
writer
.
next_header_buffer
();
...
@@ -363,7 +363,7 @@ error application::handle_monitor_message(packet_writer& writer,
...
@@ -363,7 +363,7 @@ error application::handle_monitor_message(packet_writer& writer,
}
else
{
}
else
{
error
reason
=
exit_reason
::
unknown
;
error
reason
=
exit_reason
::
unknown
;
auto
payload
=
writer
.
next_payload_buffer
();
auto
payload
=
writer
.
next_payload_buffer
();
serializer_impl
<
buffer_type
>
sink
{
&
executor_
,
payload
};
binary_serializer
sink
{
&
executor_
,
payload
};
if
(
auto
err
=
sink
(
reason
))
if
(
auto
err
=
sink
(
reason
))
return
err
;
return
err
;
auto
hdr
=
writer
.
next_header_buffer
();
auto
hdr
=
writer
.
next_header_buffer
();
...
@@ -389,7 +389,7 @@ error application::handle_down_message(packet_writer&, header received_hdr,
...
@@ -389,7 +389,7 @@ error application::handle_down_message(packet_writer&, header received_hdr,
}
}
error
application
::
generate_handshake
(
std
::
vector
<
byte
>&
buf
)
{
error
application
::
generate_handshake
(
std
::
vector
<
byte
>&
buf
)
{
serializer_impl
<
buffer_type
>
sink
{
&
executor_
,
buf
};
binary_serializer
sink
{
&
executor_
,
buf
};
return
sink
(
system
().
node
(),
return
sink
(
system
().
node
(),
get_or
(
system
().
config
(),
"middleman.app-identifiers"
,
get_or
(
system
().
config
(),
"middleman.app-identifiers"
,
defaults
::
middleman
::
app_identifiers
));
defaults
::
middleman
::
app_identifiers
));
...
...
libcaf_net/src/host.cpp
View file @
f69e5759
...
@@ -22,6 +22,8 @@
...
@@ -22,6 +22,8 @@
#include "caf/detail/net_syscall.hpp"
#include "caf/detail/net_syscall.hpp"
#include "caf/detail/socket_sys_includes.hpp"
#include "caf/detail/socket_sys_includes.hpp"
#include "caf/error.hpp"
#include "caf/error.hpp"
#include "caf/make_message.hpp"
#include "caf/message.hpp"
#include "caf/net/socket.hpp"
#include "caf/net/socket.hpp"
#include "caf/none.hpp"
#include "caf/none.hpp"
...
...
libcaf_net/src/multiplexer.cpp
View file @
f69e5759
...
@@ -274,7 +274,7 @@ void multiplexer::write_to_pipe(uint8_t opcode, const socket_manager_ptr& mgr) {
...
@@ -274,7 +274,7 @@ void multiplexer::write_to_pipe(uint8_t opcode, const socket_manager_ptr& mgr) {
{
// Lifetime scope of guard.
{
// Lifetime scope of guard.
std
::
lock_guard
<
std
::
mutex
>
guard
{
write_lock_
};
std
::
lock_guard
<
std
::
mutex
>
guard
{
write_lock_
};
if
(
write_handle_
!=
invalid_socket
)
if
(
write_handle_
!=
invalid_socket
)
res
=
write
(
write_handle_
,
make_span
(
buf
)
);
res
=
write
(
write_handle_
,
buf
);
else
else
res
=
sec
::
socket_invalid
;
res
=
sec
::
socket_invalid
;
}
}
...
...
libcaf_net/src/pipe_socket.cpp
View file @
f69e5759
...
@@ -19,19 +19,17 @@
...
@@ -19,19 +19,17 @@
#include "caf/net/pipe_socket.hpp"
#include "caf/net/pipe_socket.hpp"
#include <cstdio>
#include <cstdio>
#include <cstdlib>
#include <utility>
#include <utility>
#include "caf/byte.hpp"
#include "caf/byte.hpp"
#include "caf/config.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/detail/net_syscall.hpp"
#include "caf/detail/socket_sys_aliases.hpp"
#include "caf/detail/socket_sys_aliases.hpp"
#include "caf/detail/socket_sys_includes.hpp"
#include "caf/detail/socket_sys_includes.hpp"
#include "caf/error.hpp"
#include "caf/expected.hpp"
#include "caf/expected.hpp"
#include "caf/make_message.hpp"
#include "caf/message.hpp"
#include "caf/net/stream_socket.hpp"
#include "caf/net/stream_socket.hpp"
#include "caf/sec.hpp"
#include "caf/sec.hpp"
#include "caf/span.hpp"
#include "caf/variant.hpp"
#include "caf/variant.hpp"
namespace
caf
::
net
{
namespace
caf
::
net
{
...
...
libcaf_net/src/pollset_updater.cpp
View file @
f69e5759
...
@@ -18,6 +18,8 @@
...
@@ -18,6 +18,8 @@
#include "caf/net/pollset_updater.hpp"
#include "caf/net/pollset_updater.hpp"
#include <cstring>
#include "caf/net/multiplexer.hpp"
#include "caf/net/multiplexer.hpp"
#include "caf/sec.hpp"
#include "caf/sec.hpp"
#include "caf/span.hpp"
#include "caf/span.hpp"
...
...
libcaf_net/src/stream_socket.cpp
View file @
f69e5759
...
@@ -24,7 +24,6 @@
...
@@ -24,7 +24,6 @@
#include "caf/detail/socket_sys_includes.hpp"
#include "caf/detail/socket_sys_includes.hpp"
#include "caf/expected.hpp"
#include "caf/expected.hpp"
#include "caf/logger.hpp"
#include "caf/logger.hpp"
#include "caf/span.hpp"
#include "caf/variant.hpp"
#include "caf/variant.hpp"
#ifdef CAF_POSIX
#ifdef CAF_POSIX
...
...
libcaf_net/src/udp_datagram_socket.cpp
View file @
f69e5759
...
@@ -27,7 +27,6 @@
...
@@ -27,7 +27,6 @@
#include "caf/ip_endpoint.hpp"
#include "caf/ip_endpoint.hpp"
#include "caf/logger.hpp"
#include "caf/logger.hpp"
#include "caf/net/socket_guard.hpp"
#include "caf/net/socket_guard.hpp"
#include "caf/span.hpp"
namespace
caf
::
net
{
namespace
caf
::
net
{
...
...
libcaf_net/test/application.cpp
View file @
f69e5759
...
@@ -58,7 +58,7 @@ struct fixture : test_coordinator_fixture<>,
...
@@ -58,7 +58,7 @@ struct fixture : test_coordinator_fixture<>,
template
<
class
...
Ts
>
template
<
class
...
Ts
>
buffer_type
to_buf
(
const
Ts
&
...
xs
)
{
buffer_type
to_buf
(
const
Ts
&
...
xs
)
{
buffer_type
buf
;
buffer_type
buf
;
serializer_impl
<
buffer_type
>
sink
{
system
(),
buf
};
binary_serializer
sink
{
system
(),
buf
};
REQUIRE_OK
(
sink
(
xs
...));
REQUIRE_OK
(
sink
(
xs
...));
return
buf
;
return
buf
;
}
}
...
...
libcaf_net/test/datagram_transport.cpp
View file @
f69e5759
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
#include "caf/net/test/host_fixture.hpp"
#include "caf/net/test/host_fixture.hpp"
#include "caf/test/dsl.hpp"
#include "caf/test/dsl.hpp"
#include "caf/binary_serializer.hpp"
#include "caf/byte.hpp"
#include "caf/byte.hpp"
#include "caf/detail/socket_sys_includes.hpp"
#include "caf/detail/socket_sys_includes.hpp"
#include "caf/make_actor.hpp"
#include "caf/make_actor.hpp"
...
@@ -33,7 +34,6 @@
...
@@ -33,7 +34,6 @@
#include "caf/net/make_endpoint_manager.hpp"
#include "caf/net/make_endpoint_manager.hpp"
#include "caf/net/multiplexer.hpp"
#include "caf/net/multiplexer.hpp"
#include "caf/net/udp_datagram_socket.hpp"
#include "caf/net/udp_datagram_socket.hpp"
#include "caf/serializer_impl.hpp"
#include "caf/span.hpp"
#include "caf/span.hpp"
using
namespace
caf
;
using
namespace
caf
;
...
@@ -83,7 +83,7 @@ struct fixture : test_coordinator_fixture<>, host_fixture {
...
@@ -83,7 +83,7 @@ struct fixture : test_coordinator_fixture<>, host_fixture {
uint8_t
receive_attempts
=
0
;
uint8_t
receive_attempts
=
0
;
variant
<
std
::
pair
<
size_t
,
ip_endpoint
>
,
sec
>
read_ret
;
variant
<
std
::
pair
<
size_t
,
ip_endpoint
>
,
sec
>
read_ret
;
do
{
do
{
read_ret
=
read
(
sock
,
make_span
(
buf
)
);
read_ret
=
read
(
sock
,
buf
);
if
(
auto
read_res
=
get_if
<
std
::
pair
<
size_t
,
ip_endpoint
>>
(
&
read_ret
))
{
if
(
auto
read_res
=
get_if
<
std
::
pair
<
size_t
,
ip_endpoint
>>
(
&
read_ret
))
{
buf
.
resize
(
read_res
->
first
);
buf
.
resize
(
read_res
->
first
);
}
else
if
(
get
<
sec
>
(
read_ret
)
!=
sec
::
unavailable_or_would_block
)
{
}
else
if
(
get
<
sec
>
(
read_ret
)
!=
sec
::
unavailable_or_would_block
)
{
...
@@ -169,9 +169,9 @@ public:
...
@@ -169,9 +169,9 @@ public:
static
expected
<
buffer_type
>
serialize
(
actor_system
&
sys
,
static
expected
<
buffer_type
>
serialize
(
actor_system
&
sys
,
const
type_erased_tuple
&
x
)
{
const
type_erased_tuple
&
x
)
{
buffer_type
result
;
buffer_type
result
;
serializer_impl
<
buffer_type
>
sink
{
sys
,
result
};
binary_serializer
sink
{
sys
,
result
};
if
(
auto
err
=
message
::
save
(
sink
,
x
))
if
(
auto
err
=
message
::
save
(
sink
,
x
))
return
err
;
return
err
.
value
()
;
return
result
;
return
result
;
}
}
...
...
libcaf_net/test/endpoint_manager.cpp
View file @
f69e5759
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
#include "caf/net/test/host_fixture.hpp"
#include "caf/net/test/host_fixture.hpp"
#include "caf/test/dsl.hpp"
#include "caf/test/dsl.hpp"
#include "caf/binary_serializer.hpp"
#include "caf/byte.hpp"
#include "caf/byte.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/make_actor.hpp"
#include "caf/make_actor.hpp"
...
@@ -30,7 +31,6 @@
...
@@ -30,7 +31,6 @@
#include "caf/net/make_endpoint_manager.hpp"
#include "caf/net/make_endpoint_manager.hpp"
#include "caf/net/multiplexer.hpp"
#include "caf/net/multiplexer.hpp"
#include "caf/net/stream_socket.hpp"
#include "caf/net/stream_socket.hpp"
#include "caf/serializer_impl.hpp"
#include "caf/span.hpp"
#include "caf/span.hpp"
using
namespace
caf
;
using
namespace
caf
;
...
@@ -64,9 +64,9 @@ public:
...
@@ -64,9 +64,9 @@ public:
static
expected
<
std
::
vector
<
byte
>>
serialize
(
actor_system
&
sys
,
static
expected
<
std
::
vector
<
byte
>>
serialize
(
actor_system
&
sys
,
const
type_erased_tuple
&
x
)
{
const
type_erased_tuple
&
x
)
{
std
::
vector
<
byte
>
result
;
std
::
vector
<
byte
>
result
;
serializer_impl
<
std
::
vector
<
byte
>>
sink
{
sys
,
result
};
binary_serializer
sink
{
sys
,
result
};
if
(
auto
err
=
message
::
save
(
sink
,
x
))
if
(
auto
err
=
message
::
save
(
sink
,
x
))
return
err
;
return
err
.
value
()
;
return
result
;
return
result
;
}
}
};
};
...
@@ -94,7 +94,7 @@ public:
...
@@ -94,7 +94,7 @@ public:
template
<
class
Manager
>
template
<
class
Manager
>
bool
handle_read_event
(
Manager
&
)
{
bool
handle_read_event
(
Manager
&
)
{
auto
res
=
read
(
handle_
,
make_span
(
read_buf_
)
);
auto
res
=
read
(
handle_
,
read_buf_
);
if
(
auto
num_bytes
=
get_if
<
size_t
>
(
&
res
))
{
if
(
auto
num_bytes
=
get_if
<
size_t
>
(
&
res
))
{
data_
->
insert
(
data_
->
end
(),
read_buf_
.
begin
(),
data_
->
insert
(
data_
->
end
(),
read_buf_
.
begin
(),
read_buf_
.
begin
()
+
*
num_bytes
);
read_buf_
.
begin
()
+
*
num_bytes
);
...
@@ -109,7 +109,7 @@ public:
...
@@ -109,7 +109,7 @@ public:
auto
&
payload
=
x
->
payload
;
auto
&
payload
=
x
->
payload
;
buf_
.
insert
(
buf_
.
end
(),
payload
.
begin
(),
payload
.
end
());
buf_
.
insert
(
buf_
.
end
(),
payload
.
begin
(),
payload
.
end
());
}
}
auto
res
=
write
(
handle_
,
make_span
(
buf_
)
);
auto
res
=
write
(
handle_
,
buf_
);
if
(
auto
num_bytes
=
get_if
<
size_t
>
(
&
res
))
{
if
(
auto
num_bytes
=
get_if
<
size_t
>
(
&
res
))
{
buf_
.
erase
(
buf_
.
begin
(),
buf_
.
begin
()
+
*
num_bytes
);
buf_
.
erase
(
buf_
.
begin
(),
buf_
.
begin
()
+
*
num_bytes
);
return
buf_
.
size
()
>
0
;
return
buf_
.
size
()
>
0
;
...
@@ -168,7 +168,7 @@ CAF_TEST(send and receive) {
...
@@ -168,7 +168,7 @@ CAF_TEST(send and receive) {
auto
buf
=
std
::
make_shared
<
std
::
vector
<
byte
>>
();
auto
buf
=
std
::
make_shared
<
std
::
vector
<
byte
>>
();
auto
sockets
=
unbox
(
make_stream_socket_pair
());
auto
sockets
=
unbox
(
make_stream_socket_pair
());
nonblocking
(
sockets
.
second
,
true
);
nonblocking
(
sockets
.
second
,
true
);
CAF_CHECK_EQUAL
(
read
(
sockets
.
second
,
make_span
(
read_buf
)
),
CAF_CHECK_EQUAL
(
read
(
sockets
.
second
,
read_buf
),
sec
::
unavailable_or_would_block
);
sec
::
unavailable_or_would_block
);
auto
guard
=
detail
::
make_scope_guard
([
&
]
{
close
(
sockets
.
second
);
});
auto
guard
=
detail
::
make_scope_guard
([
&
]
{
close
(
sockets
.
second
);
});
auto
mgr
=
make_endpoint_manager
(
mpx
,
sys
,
auto
mgr
=
make_endpoint_manager
(
mpx
,
sys
,
...
@@ -183,7 +183,7 @@ CAF_TEST(send and receive) {
...
@@ -183,7 +183,7 @@ CAF_TEST(send and receive) {
CAF_CHECK_EQUAL
(
string_view
(
reinterpret_cast
<
char
*>
(
buf
->
data
()),
CAF_CHECK_EQUAL
(
string_view
(
reinterpret_cast
<
char
*>
(
buf
->
data
()),
buf
->
size
()),
buf
->
size
()),
hello_manager
);
hello_manager
);
CAF_CHECK_EQUAL
(
read
(
sockets
.
second
,
make_span
(
read_buf
)
),
hello_test
.
size
());
CAF_CHECK_EQUAL
(
read
(
sockets
.
second
,
read_buf
),
hello_test
.
size
());
CAF_CHECK_EQUAL
(
string_view
(
reinterpret_cast
<
char
*>
(
read_buf
.
data
()),
CAF_CHECK_EQUAL
(
string_view
(
reinterpret_cast
<
char
*>
(
read_buf
.
data
()),
hello_test
.
size
()),
hello_test
.
size
()),
hello_test
);
hello_test
);
...
@@ -200,7 +200,7 @@ CAF_TEST(resolve and proxy communication) {
...
@@ -200,7 +200,7 @@ CAF_TEST(resolve and proxy communication) {
CAF_CHECK_EQUAL
(
mgr
->
init
(),
none
);
CAF_CHECK_EQUAL
(
mgr
->
init
(),
none
);
CAF_CHECK_EQUAL
(
mgr
->
mask
(),
operation
::
read_write
);
CAF_CHECK_EQUAL
(
mgr
->
mask
(),
operation
::
read_write
);
run
();
run
();
CAF_CHECK_EQUAL
(
read
(
sockets
.
second
,
make_span
(
read_buf
)
),
hello_test
.
size
());
CAF_CHECK_EQUAL
(
read
(
sockets
.
second
,
read_buf
),
hello_test
.
size
());
mgr
->
resolve
(
unbox
(
make_uri
(
"test:id/42"
)),
self
);
mgr
->
resolve
(
unbox
(
make_uri
(
"test:id/42"
)),
self
);
run
();
run
();
self
->
receive
(
self
->
receive
(
...
@@ -211,7 +211,7 @@ CAF_TEST(resolve and proxy communication) {
...
@@ -211,7 +211,7 @@ CAF_TEST(resolve and proxy communication) {
after
(
std
::
chrono
::
seconds
(
0
))
>>
after
(
std
::
chrono
::
seconds
(
0
))
>>
[
&
]
{
CAF_FAIL
(
"manager did not respond with a proxy."
);
});
[
&
]
{
CAF_FAIL
(
"manager did not respond with a proxy."
);
});
run
();
run
();
auto
read_res
=
read
(
sockets
.
second
,
make_span
(
read_buf
)
);
auto
read_res
=
read
(
sockets
.
second
,
read_buf
);
if
(
!
holds_alternative
<
size_t
>
(
read_res
))
{
if
(
!
holds_alternative
<
size_t
>
(
read_res
))
{
CAF_ERROR
(
"read() returned an error: "
<<
sys
.
render
(
get
<
sec
>
(
read_res
)));
CAF_ERROR
(
"read() returned an error: "
<<
sys
.
render
(
get
<
sec
>
(
read_res
)));
return
;
return
;
...
...
libcaf_net/test/header.cpp
View file @
f69e5759
...
@@ -23,7 +23,7 @@
...
@@ -23,7 +23,7 @@
#include "caf/test/dsl.hpp"
#include "caf/test/dsl.hpp"
#include "caf/binary_deserializer.hpp"
#include "caf/binary_deserializer.hpp"
#include "caf/
serializer_impl
.hpp"
#include "caf/
binary_serializer
.hpp"
using
namespace
caf
;
using
namespace
caf
;
using
namespace
caf
::
net
;
using
namespace
caf
::
net
;
...
@@ -32,7 +32,7 @@ CAF_TEST(serialization) {
...
@@ -32,7 +32,7 @@ CAF_TEST(serialization) {
basp
::
header
x
{
basp
::
message_type
::
handshake
,
42
,
4
};
basp
::
header
x
{
basp
::
message_type
::
handshake
,
42
,
4
};
std
::
vector
<
byte
>
buf
;
std
::
vector
<
byte
>
buf
;
{
{
serializer_impl
<
std
::
vector
<
byte
>>
sink
{
nullptr
,
buf
};
binary_serializer
sink
{
nullptr
,
buf
};
CAF_CHECK_EQUAL
(
sink
(
x
),
none
);
CAF_CHECK_EQUAL
(
sink
(
x
),
none
);
}
}
CAF_CHECK_EQUAL
(
buf
.
size
(),
basp
::
header_size
);
CAF_CHECK_EQUAL
(
buf
.
size
(),
basp
::
header_size
);
...
...
libcaf_net/test/multiplexer.cpp
View file @
f69e5759
...
@@ -72,7 +72,7 @@ public:
...
@@ -72,7 +72,7 @@ public:
bool
handle_write_event
()
override
{
bool
handle_write_event
()
override
{
if
(
wr_buf_
.
size
()
==
0
)
if
(
wr_buf_
.
size
()
==
0
)
return
false
;
return
false
;
auto
res
=
write
(
handle
(),
make_span
(
wr_buf_
)
);
auto
res
=
write
(
handle
(),
wr_buf_
);
if
(
auto
num_bytes
=
get_if
<
size_t
>
(
&
res
))
{
if
(
auto
num_bytes
=
get_if
<
size_t
>
(
&
res
))
{
CAF_ASSERT
(
*
num_bytes
>
0
);
CAF_ASSERT
(
*
num_bytes
>
0
);
wr_buf_
.
erase
(
wr_buf_
.
begin
(),
wr_buf_
.
begin
()
+
*
num_bytes
);
wr_buf_
.
erase
(
wr_buf_
.
begin
(),
wr_buf_
.
begin
()
+
*
num_bytes
);
...
...
libcaf_net/test/net/basp/worker.cpp
View file @
f69e5759
...
@@ -25,10 +25,10 @@
...
@@ -25,10 +25,10 @@
#include "caf/actor_cast.hpp"
#include "caf/actor_cast.hpp"
#include "caf/actor_control_block.hpp"
#include "caf/actor_control_block.hpp"
#include "caf/actor_system.hpp"
#include "caf/actor_system.hpp"
#include "caf/binary_serializer.hpp"
#include "caf/make_actor.hpp"
#include "caf/make_actor.hpp"
#include "caf/net/basp/message_queue.hpp"
#include "caf/net/basp/message_queue.hpp"
#include "caf/proxy_registry.hpp"
#include "caf/proxy_registry.hpp"
#include "caf/serializer_impl.hpp"
using
namespace
caf
;
using
namespace
caf
;
...
@@ -109,7 +109,7 @@ CAF_TEST(deliver serialized message) {
...
@@ -109,7 +109,7 @@ CAF_TEST(deliver serialized message) {
CAF_MESSAGE
(
"create a fake message + BASP header"
);
CAF_MESSAGE
(
"create a fake message + BASP header"
);
std
::
vector
<
byte
>
payload
;
std
::
vector
<
byte
>
payload
;
std
::
vector
<
strong_actor_ptr
>
stages
;
std
::
vector
<
strong_actor_ptr
>
stages
;
serializer_impl
<
std
::
vector
<
byte
>>
sink
{
sys
,
payload
};
binary_serializer
sink
{
sys
,
payload
};
if
(
auto
err
=
sink
(
node_id
{},
self
->
id
(),
testee
.
id
(),
stages
,
if
(
auto
err
=
sink
(
node_id
{},
self
->
id
(),
testee
.
id
(),
stages
,
make_message
(
ok_atom
::
value
)))
make_message
(
ok_atom
::
value
)))
CAF_FAIL
(
"unable to serialize message: "
<<
sys
.
render
(
err
));
CAF_FAIL
(
"unable to serialize message: "
<<
sys
.
render
(
err
));
...
...
libcaf_net/test/pipe_socket.cpp
View file @
f69e5759
...
@@ -26,7 +26,6 @@
...
@@ -26,7 +26,6 @@
#include <vector>
#include <vector>
#include "caf/byte.hpp"
#include "caf/byte.hpp"
#include "caf/span.hpp"
using
namespace
caf
;
using
namespace
caf
;
using
namespace
caf
::
net
;
using
namespace
caf
::
net
;
...
@@ -41,8 +40,8 @@ CAF_TEST(send and receive) {
...
@@ -41,8 +40,8 @@ CAF_TEST(send and receive) {
pipe_socket
rd_sock
;
pipe_socket
rd_sock
;
pipe_socket
wr_sock
;
pipe_socket
wr_sock
;
std
::
tie
(
rd_sock
,
wr_sock
)
=
unbox
(
make_pipe
());
std
::
tie
(
rd_sock
,
wr_sock
)
=
unbox
(
make_pipe
());
CAF_CHECK_EQUAL
(
write
(
wr_sock
,
make_span
(
send_buf
)
),
send_buf
.
size
());
CAF_CHECK_EQUAL
(
write
(
wr_sock
,
send_buf
),
send_buf
.
size
());
CAF_CHECK_EQUAL
(
read
(
rd_sock
,
make_span
(
receive_buf
)
),
send_buf
.
size
());
CAF_CHECK_EQUAL
(
read
(
rd_sock
,
receive_buf
),
send_buf
.
size
());
CAF_CHECK
(
std
::
equal
(
send_buf
.
begin
(),
send_buf
.
end
(),
receive_buf
.
begin
()));
CAF_CHECK
(
std
::
equal
(
send_buf
.
begin
(),
send_buf
.
end
(),
receive_buf
.
begin
()));
}
}
...
...
libcaf_net/test/stream_application.cpp
View file @
f69e5759
...
@@ -82,7 +82,7 @@ struct fixture : host_fixture, test_coordinator_fixture<config> {
...
@@ -82,7 +82,7 @@ struct fixture : host_fixture, test_coordinator_fixture<config> {
template
<
class
...
Ts
>
template
<
class
...
Ts
>
buffer_type
to_buf
(
const
Ts
&
...
xs
)
{
buffer_type
to_buf
(
const
Ts
&
...
xs
)
{
buffer_type
buf
;
buffer_type
buf
;
serializer_impl
<
buffer_type
>
sink
{
system
(),
buf
};
binary_serializer
sink
{
system
(),
buf
};
REQUIRE_OK
(
sink
(
xs
...));
REQUIRE_OK
(
sink
(
xs
...));
return
buf
;
return
buf
;
}
}
...
@@ -90,7 +90,7 @@ struct fixture : host_fixture, test_coordinator_fixture<config> {
...
@@ -90,7 +90,7 @@ struct fixture : host_fixture, test_coordinator_fixture<config> {
template
<
class
...
Ts
>
template
<
class
...
Ts
>
void
mock
(
const
Ts
&
...
xs
)
{
void
mock
(
const
Ts
&
...
xs
)
{
auto
buf
=
to_buf
(
xs
...);
auto
buf
=
to_buf
(
xs
...);
if
(
fetch_size
(
write
(
sock
,
make_span
(
buf
)
))
!=
buf
.
size
())
if
(
fetch_size
(
write
(
sock
,
buf
))
!=
buf
.
size
())
CAF_FAIL
(
"unable to write "
<<
buf
.
size
()
<<
" bytes"
);
CAF_FAIL
(
"unable to write "
<<
buf
.
size
()
<<
" bytes"
);
run
();
run
();
}
}
...
@@ -103,20 +103,20 @@ struct fixture : host_fixture, test_coordinator_fixture<config> {
...
@@ -103,20 +103,20 @@ struct fixture : host_fixture, test_coordinator_fixture<config> {
static_cast
<
uint32_t
>
(
payload
.
size
()),
basp
::
version
});
static_cast
<
uint32_t
>
(
payload
.
size
()),
basp
::
version
});
CAF_CHECK_EQUAL
(
app
->
state
(),
CAF_CHECK_EQUAL
(
app
->
state
(),
basp
::
connection_state
::
await_handshake_payload
);
basp
::
connection_state
::
await_handshake_payload
);
write
(
sock
,
make_span
(
payload
)
);
write
(
sock
,
payload
);
run
();
run
();
}
}
void
consume_handshake
()
{
void
consume_handshake
()
{
buffer_type
buf
(
basp
::
header_size
);
buffer_type
buf
(
basp
::
header_size
);
if
(
fetch_size
(
read
(
sock
,
make_span
(
buf
)
))
!=
basp
::
header_size
)
if
(
fetch_size
(
read
(
sock
,
buf
))
!=
basp
::
header_size
)
CAF_FAIL
(
"unable to read "
<<
basp
::
header_size
<<
" bytes"
);
CAF_FAIL
(
"unable to read "
<<
basp
::
header_size
<<
" bytes"
);
auto
hdr
=
basp
::
header
::
from_bytes
(
buf
);
auto
hdr
=
basp
::
header
::
from_bytes
(
buf
);
if
(
hdr
.
type
!=
basp
::
message_type
::
handshake
||
hdr
.
payload_len
==
0
if
(
hdr
.
type
!=
basp
::
message_type
::
handshake
||
hdr
.
payload_len
==
0
||
hdr
.
operation_data
!=
basp
::
version
)
||
hdr
.
operation_data
!=
basp
::
version
)
CAF_FAIL
(
"invalid handshake header"
);
CAF_FAIL
(
"invalid handshake header"
);
buf
.
resize
(
hdr
.
payload_len
);
buf
.
resize
(
hdr
.
payload_len
);
if
(
fetch_size
(
read
(
sock
,
make_span
(
buf
)
))
!=
hdr
.
payload_len
)
if
(
fetch_size
(
read
(
sock
,
buf
))
!=
hdr
.
payload_len
)
CAF_FAIL
(
"unable to read "
<<
hdr
.
payload_len
<<
" bytes"
);
CAF_FAIL
(
"unable to read "
<<
hdr
.
payload_len
<<
" bytes"
);
node_id
nid
;
node_id
nid
;
std
::
vector
<
std
::
string
>
app_ids
;
std
::
vector
<
std
::
string
>
app_ids
;
...
@@ -149,7 +149,7 @@ struct fixture : host_fixture, test_coordinator_fixture<config> {
...
@@ -149,7 +149,7 @@ struct fixture : host_fixture, test_coordinator_fixture<config> {
std::tuple<unit_t>>::value) { \
std::tuple<unit_t>>::value) { \
auto payload = to_buf(__VA_ARGS__); \
auto payload = to_buf(__VA_ARGS__); \
mock(basp::header{kind, static_cast<uint32_t>(payload.size()), op}); \
mock(basp::header{kind, static_cast<uint32_t>(payload.size()), op}); \
write(sock,
make_span(payload));
\
write(sock,
payload);
\
} else { \
} else { \
mock(basp::header{kind, 0, op}); \
mock(basp::header{kind, 0, op}); \
} \
} \
...
@@ -160,7 +160,7 @@ struct fixture : host_fixture, test_coordinator_fixture<config> {
...
@@ -160,7 +160,7 @@ struct fixture : host_fixture, test_coordinator_fixture<config> {
do { \
do { \
CAF_MESSAGE("receive " << msg_type); \
CAF_MESSAGE("receive " << msg_type); \
buffer_type buf(basp::header_size); \
buffer_type buf(basp::header_size); \
if (fetch_size(read(sock,
make_span(buf))) != basp::header_size)
\
if (fetch_size(read(sock,
buf)) != basp::header_size)
\
CAF_FAIL("unable to read " << basp::header_size << " bytes"); \
CAF_FAIL("unable to read " << basp::header_size << " bytes"); \
auto hdr = basp::header::from_bytes(buf); \
auto hdr = basp::header::from_bytes(buf); \
CAF_CHECK_EQUAL(hdr.type, msg_type); \
CAF_CHECK_EQUAL(hdr.type, msg_type); \
...
@@ -168,7 +168,7 @@ struct fixture : host_fixture, test_coordinator_fixture<config> {
...
@@ -168,7 +168,7 @@ struct fixture : host_fixture, test_coordinator_fixture<config> {
if (!std::is_same<decltype(std::make_tuple(__VA_ARGS__)), \
if (!std::is_same<decltype(std::make_tuple(__VA_ARGS__)), \
std::tuple<unit_t>>::value) { \
std::tuple<unit_t>>::value) { \
buf.resize(hdr.payload_len); \
buf.resize(hdr.payload_len); \
if (fetch_size(read(sock,
make_span(buf))) != size_t{hdr.payload_len})
\
if (fetch_size(read(sock,
buf)) != size_t{hdr.payload_len})
\
CAF_FAIL("unable to read " << hdr.payload_len << " bytes"); \
CAF_FAIL("unable to read " << hdr.payload_len << " bytes"); \
binary_deserializer source{sys, buf}; \
binary_deserializer source{sys, buf}; \
if (auto err = source(__VA_ARGS__)) \
if (auto err = source(__VA_ARGS__)) \
...
...
libcaf_net/test/stream_socket.cpp
View file @
f69e5759
...
@@ -74,31 +74,29 @@ struct fixture : host_fixture {
...
@@ -74,31 +74,29 @@ struct fixture : host_fixture {
CAF_TEST_FIXTURE_SCOPE
(
network_socket_tests
,
fixture
)
CAF_TEST_FIXTURE_SCOPE
(
network_socket_tests
,
fixture
)
CAF_TEST
(
read
on
empty
sockets
)
{
CAF_TEST
(
read
on
empty
sockets
)
{
CAF_CHECK_EQUAL
(
read
(
first
,
make_span
(
rd_buf
)),
CAF_CHECK_EQUAL
(
read
(
first
,
rd_buf
),
sec
::
unavailable_or_would_block
);
sec
::
unavailable_or_would_block
);
CAF_CHECK_EQUAL
(
read
(
second
,
rd_buf
),
sec
::
unavailable_or_would_block
);
CAF_CHECK_EQUAL
(
read
(
second
,
make_span
(
rd_buf
)),
sec
::
unavailable_or_would_block
);
}
}
CAF_TEST
(
transfer
data
from
first
to
second
socket
)
{
CAF_TEST
(
transfer
data
from
first
to
second
socket
)
{
std
::
vector
<
byte
>
wr_buf
{
1
_b
,
2
_b
,
4
_b
,
8
_b
,
16
_b
,
32
_b
,
64
_b
};
std
::
vector
<
byte
>
wr_buf
{
1
_b
,
2
_b
,
4
_b
,
8
_b
,
16
_b
,
32
_b
,
64
_b
};
CAF_MESSAGE
(
"transfer data from first to second socket"
);
CAF_MESSAGE
(
"transfer data from first to second socket"
);
CAF_CHECK_EQUAL
(
write
(
first
,
make_span
(
wr_buf
)
),
wr_buf
.
size
());
CAF_CHECK_EQUAL
(
write
(
first
,
wr_buf
),
wr_buf
.
size
());
CAF_CHECK_EQUAL
(
read
(
second
,
make_span
(
rd_buf
)
),
wr_buf
.
size
());
CAF_CHECK_EQUAL
(
read
(
second
,
rd_buf
),
wr_buf
.
size
());
CAF_CHECK
(
std
::
equal
(
wr_buf
.
begin
(),
wr_buf
.
end
(),
rd_buf
.
begin
()));
CAF_CHECK
(
std
::
equal
(
wr_buf
.
begin
(),
wr_buf
.
end
(),
rd_buf
.
begin
()));
rd_buf
.
assign
(
rd_buf
.
size
(),
byte
(
0
));
rd_buf
.
assign
(
rd_buf
.
size
(),
byte
(
0
));
}
}
CAF_TEST
(
transfer
data
from
second
to
first
socket
)
{
CAF_TEST
(
transfer
data
from
second
to
first
socket
)
{
std
::
vector
<
byte
>
wr_buf
{
1
_b
,
2
_b
,
4
_b
,
8
_b
,
16
_b
,
32
_b
,
64
_b
};
std
::
vector
<
byte
>
wr_buf
{
1
_b
,
2
_b
,
4
_b
,
8
_b
,
16
_b
,
32
_b
,
64
_b
};
CAF_CHECK_EQUAL
(
write
(
second
,
make_span
(
wr_buf
)
),
wr_buf
.
size
());
CAF_CHECK_EQUAL
(
write
(
second
,
wr_buf
),
wr_buf
.
size
());
CAF_CHECK_EQUAL
(
read
(
first
,
make_span
(
rd_buf
)
),
wr_buf
.
size
());
CAF_CHECK_EQUAL
(
read
(
first
,
rd_buf
),
wr_buf
.
size
());
CAF_CHECK
(
std
::
equal
(
wr_buf
.
begin
(),
wr_buf
.
end
(),
rd_buf
.
begin
()));
CAF_CHECK
(
std
::
equal
(
wr_buf
.
begin
(),
wr_buf
.
end
(),
rd_buf
.
begin
()));
}
}
CAF_TEST
(
shut
down
first
socket
and
observe
shutdown
on
the
second
one
)
{
CAF_TEST
(
shut
down
first
socket
and
observe
shutdown
on
the
second
one
)
{
close
(
first
);
close
(
first
);
CAF_CHECK_EQUAL
(
read
(
second
,
make_span
(
rd_buf
)
),
sec
::
socket_disconnected
);
CAF_CHECK_EQUAL
(
read
(
second
,
rd_buf
),
sec
::
socket_disconnected
);
first
.
id
=
invalid_socket_id
;
first
.
id
=
invalid_socket_id
;
}
}
...
@@ -110,7 +108,7 @@ CAF_TEST(transfer data using multiple buffers) {
...
@@ -110,7 +108,7 @@ CAF_TEST(transfer data using multiple buffers) {
full_buf
.
insert
(
full_buf
.
end
(),
wr_buf_2
.
begin
(),
wr_buf_2
.
end
());
full_buf
.
insert
(
full_buf
.
end
(),
wr_buf_2
.
begin
(),
wr_buf_2
.
end
());
CAF_CHECK_EQUAL
(
write
(
second
,
{
make_span
(
wr_buf_1
),
make_span
(
wr_buf_2
)}),
CAF_CHECK_EQUAL
(
write
(
second
,
{
make_span
(
wr_buf_1
),
make_span
(
wr_buf_2
)}),
full_buf
.
size
());
full_buf
.
size
());
CAF_CHECK_EQUAL
(
read
(
first
,
make_span
(
rd_buf
)
),
full_buf
.
size
());
CAF_CHECK_EQUAL
(
read
(
first
,
rd_buf
),
full_buf
.
size
());
CAF_CHECK
(
std
::
equal
(
full_buf
.
begin
(),
full_buf
.
end
(),
rd_buf
.
begin
()));
CAF_CHECK
(
std
::
equal
(
full_buf
.
begin
(),
full_buf
.
end
(),
rd_buf
.
begin
()));
}
}
...
...
libcaf_net/test/stream_transport.cpp
View file @
f69e5759
...
@@ -24,6 +24,7 @@
...
@@ -24,6 +24,7 @@
#include "caf/test/dsl.hpp"
#include "caf/test/dsl.hpp"
#include "caf/binary_deserializer.hpp"
#include "caf/binary_deserializer.hpp"
#include "caf/binary_serializer.hpp"
#include "caf/byte.hpp"
#include "caf/byte.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/make_actor.hpp"
#include "caf/make_actor.hpp"
...
@@ -34,7 +35,6 @@
...
@@ -34,7 +35,6 @@
#include "caf/net/multiplexer.hpp"
#include "caf/net/multiplexer.hpp"
#include "caf/net/socket_guard.hpp"
#include "caf/net/socket_guard.hpp"
#include "caf/net/stream_socket.hpp"
#include "caf/net/stream_socket.hpp"
#include "caf/serializer_impl.hpp"
#include "caf/span.hpp"
#include "caf/span.hpp"
using
namespace
caf
;
using
namespace
caf
;
...
@@ -140,9 +140,9 @@ public:
...
@@ -140,9 +140,9 @@ public:
static
expected
<
buffer_type
>
serialize
(
actor_system
&
sys
,
static
expected
<
buffer_type
>
serialize
(
actor_system
&
sys
,
const
type_erased_tuple
&
x
)
{
const
type_erased_tuple
&
x
)
{
buffer_type
result
;
buffer_type
result
;
serializer_impl
<
buffer_type
>
sink
{
sys
,
result
};
binary_serializer
sink
{
sys
,
result
};
if
(
auto
err
=
message
::
save
(
sink
,
x
))
if
(
auto
err
=
message
::
save
(
sink
,
x
))
return
err
;
return
err
.
value
()
;
return
result
;
return
result
;
}
}
...
@@ -194,7 +194,7 @@ CAF_TEST(resolve and proxy communication) {
...
@@ -194,7 +194,7 @@ CAF_TEST(resolve and proxy communication) {
after
(
std
::
chrono
::
seconds
(
0
))
>>
after
(
std
::
chrono
::
seconds
(
0
))
>>
[
&
]
{
CAF_FAIL
(
"manager did not respond with a proxy."
);
});
[
&
]
{
CAF_FAIL
(
"manager did not respond with a proxy."
);
});
run
();
run
();
auto
read_res
=
read
(
recv_socket_guard
.
socket
(),
make_span
(
recv_buf
)
);
auto
read_res
=
read
(
recv_socket_guard
.
socket
(),
recv_buf
);
if
(
!
holds_alternative
<
size_t
>
(
read_res
))
if
(
!
holds_alternative
<
size_t
>
(
read_res
))
CAF_FAIL
(
"read() returned an error: "
<<
sys
.
render
(
get
<
sec
>
(
read_res
)));
CAF_FAIL
(
"read() returned an error: "
<<
sys
.
render
(
get
<
sec
>
(
read_res
)));
recv_buf
.
resize
(
get
<
size_t
>
(
read_res
));
recv_buf
.
resize
(
get
<
size_t
>
(
read_res
));
...
...
libcaf_net/test/string_application.cpp
View file @
f69e5759
...
@@ -26,6 +26,7 @@
...
@@ -26,6 +26,7 @@
#include <vector>
#include <vector>
#include "caf/binary_deserializer.hpp"
#include "caf/binary_deserializer.hpp"
#include "caf/binary_serializer.hpp"
#include "caf/byte.hpp"
#include "caf/byte.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/make_actor.hpp"
#include "caf/make_actor.hpp"
...
@@ -34,7 +35,6 @@
...
@@ -34,7 +35,6 @@
#include "caf/net/make_endpoint_manager.hpp"
#include "caf/net/make_endpoint_manager.hpp"
#include "caf/net/multiplexer.hpp"
#include "caf/net/multiplexer.hpp"
#include "caf/net/stream_socket.hpp"
#include "caf/net/stream_socket.hpp"
#include "caf/serializer_impl.hpp"
#include "caf/span.hpp"
#include "caf/span.hpp"
using
namespace
caf
;
using
namespace
caf
;
...
@@ -105,18 +105,19 @@ public:
...
@@ -105,18 +105,19 @@ public:
if
(
ptr
->
msg
==
nullptr
)
if
(
ptr
->
msg
==
nullptr
)
return
;
return
;
auto
header_buf
=
parent
.
next_header_buffer
();
auto
header_buf
=
parent
.
next_header_buffer
();
serializer_impl
<
buffer_type
>
sink
{
sys_
,
header_buf
};
binary_serializer
sink
{
sys_
,
header_buf
};
header_type
header
{
static_cast
<
uint32_t
>
(
ptr
->
payload
.
size
())};
header_type
header
{
static_cast
<
uint32_t
>
(
ptr
->
payload
.
size
())};
sink
(
header
);
if
(
auto
err
=
sink
(
header
))
CAF_FAIL
(
"serializing failed: "
<<
err
);
parent
.
write_packet
(
header_buf
,
ptr
->
payload
);
parent
.
write_packet
(
header_buf
,
ptr
->
payload
);
}
}
static
expected
<
std
::
vector
<
byte
>>
serialize
(
actor_system
&
sys
,
static
expected
<
std
::
vector
<
byte
>>
serialize
(
actor_system
&
sys
,
const
type_erased_tuple
&
x
)
{
const
type_erased_tuple
&
x
)
{
std
::
vector
<
byte
>
result
;
std
::
vector
<
byte
>
result
;
serializer_impl
<
std
::
vector
<
byte
>>
sink
{
sys
,
result
};
binary_serializer
sink
{
sys
,
result
};
if
(
auto
err
=
message
::
save
(
sink
,
x
))
if
(
auto
err
=
message
::
save
(
sink
,
x
))
return
err
;
return
err
.
value
()
;
return
result
;
return
result
;
}
}
...
@@ -152,7 +153,8 @@ public:
...
@@ -152,7 +153,8 @@ public:
if
(
data
.
size
()
!=
sizeof
(
header_type
))
if
(
data
.
size
()
!=
sizeof
(
header_type
))
CAF_FAIL
(
""
);
CAF_FAIL
(
""
);
binary_deserializer
source
{
nullptr
,
data
};
binary_deserializer
source
{
nullptr
,
data
};
source
(
header_
);
if
(
auto
err
=
source
(
header_
))
CAF_FAIL
(
"serializing failed: "
<<
err
);
if
(
header_
.
payload
==
0
)
if
(
header_
.
payload
==
0
)
Base
::
handle_packet
(
parent
,
header_
,
span
<
const
byte
>
{});
Base
::
handle_packet
(
parent
,
header_
,
span
<
const
byte
>
{});
else
else
...
@@ -214,7 +216,7 @@ CAF_TEST(receive) {
...
@@ -214,7 +216,7 @@ CAF_TEST(receive) {
auto
buf
=
std
::
make_shared
<
std
::
vector
<
byte
>>
();
auto
buf
=
std
::
make_shared
<
std
::
vector
<
byte
>>
();
auto
sockets
=
unbox
(
make_stream_socket_pair
());
auto
sockets
=
unbox
(
make_stream_socket_pair
());
nonblocking
(
sockets
.
second
,
true
);
nonblocking
(
sockets
.
second
,
true
);
CAF_CHECK_EQUAL
(
read
(
sockets
.
second
,
make_span
(
read_buf
)
),
CAF_CHECK_EQUAL
(
read
(
sockets
.
second
,
read_buf
),
sec
::
unavailable_or_would_block
);
sec
::
unavailable_or_would_block
);
CAF_MESSAGE
(
"adding both endpoint managers"
);
CAF_MESSAGE
(
"adding both endpoint managers"
);
auto
mgr1
=
make_endpoint_manager
(
mpx
,
sys
,
auto
mgr1
=
make_endpoint_manager
(
mpx
,
sys
,
...
...
libcaf_net/test/transport_worker.cpp
View file @
f69e5759
...
@@ -23,13 +23,13 @@
...
@@ -23,13 +23,13 @@
#include "caf/net/test/host_fixture.hpp"
#include "caf/net/test/host_fixture.hpp"
#include "caf/test/dsl.hpp"
#include "caf/test/dsl.hpp"
#include "caf/binary_serializer.hpp"
#include "caf/byte.hpp"
#include "caf/byte.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/ip_endpoint.hpp"
#include "caf/ip_endpoint.hpp"
#include "caf/make_actor.hpp"
#include "caf/make_actor.hpp"
#include "caf/net/actor_proxy_impl.hpp"
#include "caf/net/actor_proxy_impl.hpp"
#include "caf/net/multiplexer.hpp"
#include "caf/net/multiplexer.hpp"
#include "caf/serializer_impl.hpp"
#include "caf/span.hpp"
#include "caf/span.hpp"
using
namespace
caf
;
using
namespace
caf
;
...
@@ -105,9 +105,9 @@ public:
...
@@ -105,9 +105,9 @@ public:
static
expected
<
std
::
vector
<
byte
>>
serialize
(
actor_system
&
sys
,
static
expected
<
std
::
vector
<
byte
>>
serialize
(
actor_system
&
sys
,
const
type_erased_tuple
&
x
)
{
const
type_erased_tuple
&
x
)
{
std
::
vector
<
byte
>
result
;
std
::
vector
<
byte
>
result
;
serializer_impl
<
std
::
vector
<
byte
>>
sink
{
sys
,
result
};
binary_serializer
sink
{
sys
,
result
};
if
(
auto
err
=
message
::
save
(
sink
,
x
))
if
(
auto
err
=
message
::
save
(
sink
,
x
))
return
err
;
return
err
.
value
()
;
return
result
;
return
result
;
}
}
...
@@ -202,9 +202,7 @@ CAF_TEST(write_message) {
...
@@ -202,9 +202,7 @@ CAF_TEST(write_message) {
auto
msg
=
make_message
();
auto
msg
=
make_message
();
auto
elem
=
make_mailbox_element
(
strong_actor
,
make_message_id
(
12345
),
stack
,
auto
elem
=
make_mailbox_element
(
strong_actor
,
make_message_id
(
12345
),
stack
,
msg
);
msg
);
auto
test_span
=
make_span
(
reinterpret_cast
<
byte
*>
(
auto
test_span
=
as_bytes
(
make_span
(
hello_test
));
const_cast
<
char
*>
(
hello_test
.
data
())),
hello_test
.
size
());
std
::
vector
<
byte
>
payload
(
test_span
.
begin
(),
test_span
.
end
());
std
::
vector
<
byte
>
payload
(
test_span
.
begin
(),
test_span
.
end
());
using
message_type
=
endpoint_manager_queue
::
message
;
using
message_type
=
endpoint_manager_queue
::
message
;
auto
message
=
detail
::
make_unique
<
message_type
>
(
std
::
move
(
elem
),
nullptr
,
auto
message
=
detail
::
make_unique
<
message_type
>
(
std
::
move
(
elem
),
nullptr
,
...
...
libcaf_net/test/transport_worker_dispatcher.cpp
View file @
f69e5759
...
@@ -247,7 +247,7 @@ struct fixture : host_fixture {
...
@@ -247,7 +247,7 @@ struct fixture : host_fixture {
};
};
#define CHECK_HANDLE_DATA(testcase) \
#define CHECK_HANDLE_DATA(testcase) \
dispatcher.handle_data(dummy, span<
byte>{}, testcase.ep);
\
dispatcher.handle_data(dummy, span<
const byte>{}, testcase.ep);
\
CAF_CHECK_EQUAL(buf->size(), 1u); \
CAF_CHECK_EQUAL(buf->size(), 1u); \
CAF_CHECK_EQUAL(static_cast<byte>(testcase.worker_id), buf->at(0)); \
CAF_CHECK_EQUAL(static_cast<byte>(testcase.worker_id), buf->at(0)); \
buf->clear();
buf->clear();
...
...
libcaf_net/test/udp_datagram_socket.cpp
View file @
f69e5759
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
#include "caf/net/test/host_fixture.hpp"
#include "caf/net/test/host_fixture.hpp"
#include "caf/test/dsl.hpp"
#include "caf/test/dsl.hpp"
#include "caf/binary_serializer.hpp"
#include "caf/detail/net_syscall.hpp"
#include "caf/detail/net_syscall.hpp"
#include "caf/detail/socket_sys_includes.hpp"
#include "caf/detail/socket_sys_includes.hpp"
#include "caf/ip_address.hpp"
#include "caf/ip_address.hpp"
...
@@ -68,7 +69,7 @@ error read_from_socket(udp_datagram_socket sock, std::vector<byte>& buf) {
...
@@ -68,7 +69,7 @@ error read_from_socket(udp_datagram_socket sock, std::vector<byte>& buf) {
uint8_t
receive_attempts
=
0
;
uint8_t
receive_attempts
=
0
;
variant
<
std
::
pair
<
size_t
,
ip_endpoint
>
,
sec
>
read_ret
;
variant
<
std
::
pair
<
size_t
,
ip_endpoint
>
,
sec
>
read_ret
;
do
{
do
{
read_ret
=
read
(
sock
,
make_span
(
buf
)
);
read_ret
=
read
(
sock
,
buf
);
if
(
auto
read_res
=
get_if
<
std
::
pair
<
size_t
,
ip_endpoint
>>
(
&
read_ret
))
{
if
(
auto
read_res
=
get_if
<
std
::
pair
<
size_t
,
ip_endpoint
>>
(
&
read_ret
))
{
buf
.
resize
(
read_res
->
first
);
buf
.
resize
(
read_res
->
first
);
}
else
if
(
get
<
sec
>
(
read_ret
)
!=
sec
::
unavailable_or_would_block
)
{
}
else
if
(
get
<
sec
>
(
read_ret
)
!=
sec
::
unavailable_or_would_block
)
{
...
@@ -105,8 +106,7 @@ CAF_TEST_FIXTURE_SCOPE(udp_datagram_socket_test, fixture)
...
@@ -105,8 +106,7 @@ CAF_TEST_FIXTURE_SCOPE(udp_datagram_socket_test, fixture)
CAF_TEST
(
read
/
write
using
span
<
byte
>
)
{
CAF_TEST
(
read
/
write
using
span
<
byte
>
)
{
if
(
auto
err
=
nonblocking
(
socket_cast
<
net
::
socket
>
(
receive_socket
),
true
))
if
(
auto
err
=
nonblocking
(
socket_cast
<
net
::
socket
>
(
receive_socket
),
true
))
CAF_FAIL
(
"setting socket to nonblocking failed: "
<<
err
);
CAF_FAIL
(
"setting socket to nonblocking failed: "
<<
err
);
CAF_CHECK_EQUAL
(
read
(
receive_socket
,
make_span
(
buf
)),
CAF_CHECK_EQUAL
(
read
(
receive_socket
,
buf
),
sec
::
unavailable_or_would_block
);
sec
::
unavailable_or_would_block
);
CAF_MESSAGE
(
"sending data to "
<<
to_string
(
ep
));
CAF_MESSAGE
(
"sending data to "
<<
to_string
(
ep
));
CAF_CHECK_EQUAL
(
write
(
send_socket
,
as_bytes
(
make_span
(
hello_test
)),
ep
),
CAF_CHECK_EQUAL
(
write
(
send_socket
,
as_bytes
(
make_span
(
hello_test
)),
ep
),
hello_test
.
size
());
hello_test
.
size
());
...
@@ -119,21 +119,22 @@ CAF_TEST(read / write using span<std::vector<byte>*>) {
...
@@ -119,21 +119,22 @@ CAF_TEST(read / write using span<std::vector<byte>*>) {
// generate header and payload in separate buffers
// generate header and payload in separate buffers
header
hdr
{
hello_test
.
size
()};
header
hdr
{
hello_test
.
size
()};
std
::
vector
<
byte
>
hdr_buf
;
std
::
vector
<
byte
>
hdr_buf
;
serializer_impl
<
std
::
vector
<
byte
>>
sink
(
sys
,
hdr_buf
);
binary_serializer
sink
(
sys
,
hdr_buf
);
if
(
auto
err
=
sink
(
hdr
))
if
(
auto
err
=
sink
(
hdr
))
CAF_FAIL
(
"serializing payload failed"
<<
sys
.
render
(
err
));
CAF_FAIL
(
"serializing payload failed"
<<
sys
.
render
(
err
));
auto
bytes
=
as_bytes
(
make_span
(
hello_test
));
auto
bytes
=
as_bytes
(
make_span
(
hello_test
));
std
::
vector
<
byte
>
payload_buf
(
bytes
.
begin
(),
bytes
.
end
());
std
::
vector
<
byte
>
payload_buf
(
bytes
.
begin
(),
bytes
.
end
());
auto
packet_size
=
hdr_buf
.
size
()
+
payload_buf
.
size
();
auto
packet_size
=
hdr_buf
.
size
()
+
payload_buf
.
size
();
std
::
vector
<
std
::
vector
<
byte
>*>
bufs
{
&
hdr_buf
,
&
payload_buf
};
std
::
vector
<
std
::
vector
<
byte
>*>
bufs
{
&
hdr_buf
,
&
payload_buf
};
CAF_CHECK_EQUAL
(
write
(
send_socket
,
make_span
(
bufs
)
,
ep
),
packet_size
);
CAF_CHECK_EQUAL
(
write
(
send_socket
,
bufs
,
ep
),
packet_size
);
// receive both as one single packet.
// receive both as one single packet.
buf
.
resize
(
packet_size
);
buf
.
resize
(
packet_size
);
CAF_CHECK_EQUAL
(
read_from_socket
(
receive_socket
,
buf
),
none
);
CAF_CHECK_EQUAL
(
read_from_socket
(
receive_socket
,
buf
),
none
);
CAF_CHECK_EQUAL
(
buf
.
size
(),
packet_size
);
CAF_CHECK_EQUAL
(
buf
.
size
(),
packet_size
);
binary_deserializer
source
(
nullptr
,
buf
);
binary_deserializer
source
(
nullptr
,
buf
);
header
recv_hdr
;
header
recv_hdr
;
source
(
recv_hdr
);
if
(
auto
err
=
source
(
recv_hdr
))
CAF_FAIL
(
"serializing failed: "
<<
err
);
CAF_CHECK_EQUAL
(
hdr
.
payload_size
,
recv_hdr
.
payload_size
);
CAF_CHECK_EQUAL
(
hdr
.
payload_size
,
recv_hdr
.
payload_size
);
string_view
received
{
reinterpret_cast
<
const
char
*>
(
buf
.
data
())
string_view
received
{
reinterpret_cast
<
const
char
*>
(
buf
.
data
())
+
sizeof
(
header
),
+
sizeof
(
header
),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment