diff options
| author | 2021-01-24 15:17:02 -0500 | |
|---|---|---|
| committer | 2021-02-28 17:25:31 -0500 | |
| commit | 2910aa77b2feea39fc0618598e275b138a346e71 (patch) | |
| tree | 2760d0c2914c672ae2cd2450851e4feda3b053e5 /src/tests/core/network | |
| parent | Merge pull request #6007 from bunnei/ldn-error (diff) | |
| download | yuzu-2910aa77b2feea39fc0618598e275b138a346e71.tar.gz yuzu-2910aa77b2feea39fc0618598e275b138a346e71.tar.xz yuzu-2910aa77b2feea39fc0618598e275b138a346e71.zip | |
[network] Error handling reform
`network.cpp` has several error paths which either:
- report "Unhandled host socket error=n" and return `SUCCESS`, or
- switch on a few possible errors, log them, and translate them to
Errno; the same switch statement is copied and pasted in multiple
places in the code
Convert these paths to use a helper function `GetAndLogLastError`, which
is roughly the equivalent of one of the switch statements, but:
- handling more cases (both ones that were already in `Errno`, and a few
more I added), and
- using OS functions to convert the error to a string when logging, so
it'll describe the error even if it's not one of the ones in the
switch statement.
- To handle this, refactor the logic in `GetLastErrorMsg` to expose a
new function `NativeErrorToString` which takes the error number
explicitly as an argument. And improve the Windows version a bit.
Also, add a test which exercises two random error paths.
Diffstat (limited to 'src/tests/core/network')
| -rw-r--r-- | src/tests/core/network/network.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/tests/core/network/network.cpp b/src/tests/core/network/network.cpp new file mode 100644 index 000000000..b21ad8911 --- /dev/null +++ b/src/tests/core/network/network.cpp | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | // Copyright 2021 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <catch2/catch.hpp> | ||
| 6 | |||
| 7 | #include "core/network/network.h" | ||
| 8 | #include "core/network/sockets.h" | ||
| 9 | |||
| 10 | TEST_CASE("Network::Errors", "[core]") { | ||
| 11 | Network::NetworkInstance network_instance; // initialize network | ||
| 12 | |||
| 13 | Network::Socket socks[2]; | ||
| 14 | for (Network::Socket& sock : socks) { | ||
| 15 | REQUIRE(sock.Initialize(Network::Domain::INET, Network::Type::STREAM, | ||
| 16 | Network::Protocol::TCP) == Network::Errno::SUCCESS); | ||
| 17 | } | ||
| 18 | |||
| 19 | Network::SockAddrIn addr{ | ||
| 20 | Network::Domain::INET, | ||
| 21 | {127, 0, 0, 1}, | ||
| 22 | 1, // hopefully nobody running this test has something listening on port 1 | ||
| 23 | }; | ||
| 24 | REQUIRE(socks[0].Connect(addr) == Network::Errno::CONNREFUSED); | ||
| 25 | |||
| 26 | std::vector<u8> message{1, 2, 3, 4}; | ||
| 27 | REQUIRE(socks[1].Recv(0, message).second == Network::Errno::NOTCONN); | ||
| 28 | } | ||