|
| 1 | +// clang-format off |
| 2 | +#include "gtest/gtest.h" |
| 3 | +#include <unordered_map> |
| 4 | +#include <cfloat> |
| 5 | +#include "enet.h" |
| 6 | +#if defined(__linux__) |
| 7 | +#pragma push_macro("LOCK_READ") |
| 8 | +#pragma push_macro("LOCK_WRITE") |
| 9 | +#undef LOCK_READ |
| 10 | +#undef LOCK_WRITE |
| 11 | +#endif |
| 12 | +#include "stdafx.h" |
| 13 | +#include "@@headers.h" |
| 14 | +#if defined(__linux__) |
| 15 | +#pragma pop_macro("LOCK_WRITE") |
| 16 | +#pragma pop_macro("LOCK_READ") |
| 17 | +#endif |
| 18 | +// clang-format on |
| 19 | + |
| 20 | +extern ENetHost *gClient; |
| 21 | +extern ENetPeer *gClientPeer; |
| 22 | +extern bool gEnetReady; |
| 23 | +extern int gMyId; |
| 24 | +extern std::unordered_map<int, Vec2> gOtherDots; |
| 25 | + |
| 26 | +struct DotPacket { |
| 27 | + int id; |
| 28 | + Flt x; |
| 29 | + Flt y; |
| 30 | +}; |
| 31 | + |
| 32 | +void ServiceHost(ENetHost *host); |
| 33 | + |
| 34 | +TEST(ServiceHost, UpdatesDotMap) { |
| 35 | + ASSERT_EQ(enet_initialize(), 0); |
| 36 | + |
| 37 | + ENetAddress addr{}; |
| 38 | + addr.host = ENET_HOST_ANY; |
| 39 | + addr.port = 0; // let OS choose |
| 40 | + ENetHost *server = enet_host_create(&addr, 1, 1, 0, 0); |
| 41 | + ASSERT_NE(server, nullptr); |
| 42 | + |
| 43 | + gClient = enet_host_create(nullptr, 1, 1, 0, 0); |
| 44 | + ASSERT_NE(gClient, nullptr); |
| 45 | + |
| 46 | + ENetAddress connectAddr = addr; |
| 47 | + enet_address_set_host(&connectAddr, "127.0.0.1"); |
| 48 | + connectAddr.port = server->address.port; |
| 49 | + |
| 50 | + gClientPeer = enet_host_connect(gClient, &connectAddr, 1, 0); |
| 51 | + ASSERT_NE(gClientPeer, nullptr); |
| 52 | + |
| 53 | + ENetEvent event; |
| 54 | + gEnetReady = false; |
| 55 | + gMyId = -1; |
| 56 | + gOtherDots.clear(); |
| 57 | + |
| 58 | + for (int i = 0; i < 100 && !gEnetReady; i++) { |
| 59 | + ServiceHost(gClient); |
| 60 | + while (enet_host_service(server, &event, 0) > 0) { |
| 61 | + } |
| 62 | + } |
| 63 | + ASSERT_TRUE(gEnetReady); |
| 64 | + |
| 65 | + DotPacket pkt{42, 1.0f, 2.0f}; |
| 66 | + ENetPacket *p = |
| 67 | + enet_packet_create(&pkt, sizeof(pkt), ENET_PACKET_FLAG_RELIABLE); |
| 68 | + enet_host_broadcast(server, 0, p); |
| 69 | + enet_host_flush(server); |
| 70 | + |
| 71 | + bool received = false; |
| 72 | + for (int i = 0; i < 100 && !received; i++) { |
| 73 | + ServiceHost(gClient); |
| 74 | + while (enet_host_service(server, &event, 0) > 0) { |
| 75 | + } |
| 76 | + if (gOtherDots.find(42) != gOtherDots.end()) |
| 77 | + received = true; |
| 78 | + } |
| 79 | + ASSERT_TRUE(received); |
| 80 | + auto it = gOtherDots.find(42); |
| 81 | + ASSERT_NE(it, gOtherDots.end()); |
| 82 | + EXPECT_FLOAT_EQ(it->second.x, 1.0f); |
| 83 | + EXPECT_FLOAT_EQ(it->second.y, 2.0f); |
| 84 | + EXPECT_EQ(gMyId, 42); |
| 85 | + |
| 86 | + DotPacket rem{42, FLT_MAX, FLT_MAX}; |
| 87 | + ENetPacket *p2 = |
| 88 | + enet_packet_create(&rem, sizeof(rem), ENET_PACKET_FLAG_RELIABLE); |
| 89 | + enet_host_broadcast(server, 0, p2); |
| 90 | + enet_host_flush(server); |
| 91 | + |
| 92 | + for (int i = 0; i < 100 && gOtherDots.find(42) != gOtherDots.end(); i++) { |
| 93 | + ServiceHost(gClient); |
| 94 | + while (enet_host_service(server, &event, 0) > 0) { |
| 95 | + } |
| 96 | + } |
| 97 | + EXPECT_EQ(gOtherDots.count(42), 0u); |
| 98 | + |
| 99 | + enet_peer_disconnect(gClientPeer, 0); |
| 100 | + for (int i = 0; i < 10; i++) { |
| 101 | + ServiceHost(gClient); |
| 102 | + while (enet_host_service(server, &event, 0) > 0) { |
| 103 | + } |
| 104 | + } |
| 105 | + |
| 106 | + enet_host_destroy(gClient); |
| 107 | + enet_host_destroy(server); |
| 108 | + enet_deinitialize(); |
| 109 | +} |
0 commit comments