| 1 | #include "test.h" |
| 2 | |
| 3 | #include <base/system.h> |
| 4 | |
| 5 | #include <engine/client/serverbrowser_ping_cache.h> |
| 6 | #include <engine/console.h> |
| 7 | #include <engine/engine.h> |
| 8 | #include <engine/shared/config.h> |
| 9 | #include <engine/storage.h> |
| 10 | |
| 11 | #include <gtest/gtest.h> |
| 12 | |
| 13 | #include <memory> |
| 14 | |
| 15 | TEST(ServerBrowser, PingCache) |
| 16 | { |
| 17 | CTestInfo Info; |
| 18 | Info.m_DeleteTestStorageFilesOnSuccess = true; |
| 19 | |
| 20 | auto pConsole = CreateConsole(FlagMask: CFGFLAG_CLIENT); |
| 21 | std::unique_ptr<IStorage> pStorage = Info.CreateTestStorage(); |
| 22 | ASSERT_NE(pStorage, nullptr) << "Error creating test storage" ; |
| 23 | auto pPingCache = std::unique_ptr<IServerBrowserPingCache>(CreateServerBrowserPingCache(pConsole: pConsole.get(), pStorage: pStorage.get())); |
| 24 | |
| 25 | NETADDR Localhost4, Localhost6, OtherLocalhost4, OtherLocalhost6; |
| 26 | ASSERT_FALSE(net_addr_from_str(&Localhost4, "127.0.0.1:8303" )); |
| 27 | ASSERT_FALSE(net_addr_from_str(&Localhost6, "[::1]:8304" )); |
| 28 | ASSERT_FALSE(net_addr_from_str(&OtherLocalhost4, "127.0.0.1:8305" )); |
| 29 | ASSERT_FALSE(net_addr_from_str(&OtherLocalhost6, "[::1]:8306" )); |
| 30 | EXPECT_LT(net_addr_comp(&Localhost4, &Localhost6), 0); |
| 31 | NETADDR aLocalhostBoth[2] = {Localhost4, Localhost6}; |
| 32 | |
| 33 | EXPECT_EQ(pPingCache->NumEntries(), 0); |
| 34 | EXPECT_EQ(pPingCache->GetPing(&Localhost4, 1), -1); |
| 35 | EXPECT_EQ(pPingCache->GetPing(&Localhost6, 1), -1); |
| 36 | EXPECT_EQ(pPingCache->GetPing(aLocalhostBoth, 2), -1); |
| 37 | EXPECT_EQ(pPingCache->GetPing(&OtherLocalhost4, 1), -1); |
| 38 | EXPECT_EQ(pPingCache->GetPing(&OtherLocalhost6, 1), -1); |
| 39 | |
| 40 | pPingCache->Load(); |
| 41 | |
| 42 | EXPECT_EQ(pPingCache->NumEntries(), 0); |
| 43 | EXPECT_EQ(pPingCache->GetPing(&Localhost4, 1), -1); |
| 44 | EXPECT_EQ(pPingCache->GetPing(&Localhost6, 1), -1); |
| 45 | EXPECT_EQ(pPingCache->GetPing(aLocalhostBoth, 2), -1); |
| 46 | EXPECT_EQ(pPingCache->GetPing(&OtherLocalhost4, 1), -1); |
| 47 | EXPECT_EQ(pPingCache->GetPing(&OtherLocalhost6, 1), -1); |
| 48 | |
| 49 | // Newer pings overwrite older. |
| 50 | pPingCache->CachePing(Addr: Localhost4, Ping: 123); |
| 51 | pPingCache->CachePing(Addr: Localhost4, Ping: 234); |
| 52 | pPingCache->CachePing(Addr: Localhost4, Ping: 345); |
| 53 | pPingCache->CachePing(Addr: Localhost4, Ping: 456); |
| 54 | pPingCache->CachePing(Addr: Localhost4, Ping: 567); |
| 55 | pPingCache->CachePing(Addr: Localhost4, Ping: 678); |
| 56 | pPingCache->CachePing(Addr: Localhost4, Ping: 789); |
| 57 | pPingCache->CachePing(Addr: Localhost4, Ping: 890); |
| 58 | pPingCache->CachePing(Addr: Localhost4, Ping: 901); |
| 59 | pPingCache->CachePing(Addr: Localhost4, Ping: 135); |
| 60 | pPingCache->CachePing(Addr: Localhost4, Ping: 246); |
| 61 | pPingCache->CachePing(Addr: Localhost4, Ping: 357); |
| 62 | pPingCache->CachePing(Addr: Localhost4, Ping: 468); |
| 63 | pPingCache->CachePing(Addr: Localhost4, Ping: 579); |
| 64 | pPingCache->CachePing(Addr: Localhost4, Ping: 680); |
| 65 | pPingCache->CachePing(Addr: Localhost4, Ping: 791); |
| 66 | pPingCache->CachePing(Addr: Localhost4, Ping: 802); |
| 67 | pPingCache->CachePing(Addr: Localhost4, Ping: 913); |
| 68 | |
| 69 | EXPECT_EQ(pPingCache->NumEntries(), 1); |
| 70 | EXPECT_EQ(pPingCache->GetPing(&Localhost4, 1), 913); |
| 71 | EXPECT_EQ(pPingCache->GetPing(&Localhost6, 1), -1); |
| 72 | EXPECT_EQ(pPingCache->GetPing(aLocalhostBoth, 2), 913); |
| 73 | EXPECT_EQ(pPingCache->GetPing(&OtherLocalhost4, 1), 913); |
| 74 | EXPECT_EQ(pPingCache->GetPing(&OtherLocalhost6, 1), -1); |
| 75 | |
| 76 | pPingCache->CachePing(Addr: Localhost4, Ping: 234); |
| 77 | pPingCache->CachePing(Addr: Localhost6, Ping: 345); |
| 78 | EXPECT_EQ(pPingCache->NumEntries(), 2); |
| 79 | EXPECT_EQ(pPingCache->GetPing(&Localhost4, 1), 234); |
| 80 | EXPECT_EQ(pPingCache->GetPing(&Localhost6, 1), 345); |
| 81 | EXPECT_EQ(pPingCache->GetPing(aLocalhostBoth, 2), 234); |
| 82 | EXPECT_EQ(pPingCache->GetPing(&OtherLocalhost4, 1), 234); |
| 83 | EXPECT_EQ(pPingCache->GetPing(&OtherLocalhost6, 1), 345); |
| 84 | |
| 85 | // Port doesn't matter for overwriting. |
| 86 | pPingCache->CachePing(Addr: Localhost4, Ping: 1337); |
| 87 | EXPECT_EQ(pPingCache->NumEntries(), 2); |
| 88 | EXPECT_EQ(pPingCache->GetPing(&Localhost4, 1), 1337); |
| 89 | EXPECT_EQ(pPingCache->GetPing(&Localhost6, 1), 345); |
| 90 | EXPECT_EQ(pPingCache->GetPing(aLocalhostBoth, 2), 345); |
| 91 | EXPECT_EQ(pPingCache->GetPing(&OtherLocalhost4, 1), 1337); |
| 92 | EXPECT_EQ(pPingCache->GetPing(&OtherLocalhost6, 1), 345); |
| 93 | |
| 94 | pPingCache.reset(p: CreateServerBrowserPingCache(pConsole: pConsole.get(), pStorage: pStorage.get())); |
| 95 | |
| 96 | // Persistence. |
| 97 | pPingCache->Load(); |
| 98 | EXPECT_EQ(pPingCache->NumEntries(), 2); |
| 99 | EXPECT_EQ(pPingCache->GetPing(&Localhost4, 1), 1337); |
| 100 | EXPECT_EQ(pPingCache->GetPing(&Localhost6, 1), 345); |
| 101 | EXPECT_EQ(pPingCache->GetPing(aLocalhostBoth, 2), 345); |
| 102 | EXPECT_EQ(pPingCache->GetPing(&OtherLocalhost4, 1), 1337); |
| 103 | EXPECT_EQ(pPingCache->GetPing(&OtherLocalhost6, 1), 345); |
| 104 | } |
| 105 | |