1 #include <arpa/inet.h>
2
3 #include "gtest/gtest.h"
4 #include "mozilla/SHA1.h"
5 #include "nsString.h"
6 #include "nsPrintfCString.h"
7 #include "mozilla/Logging.h"
8 #include "nsNetworkLinkService.h"
9
10 using namespace mozilla;
11
StringToSockAddr(const std::string & str)12 in6_addr StringToSockAddr(const std::string& str) {
13 sockaddr_in6 ip;
14 inet_pton(AF_INET6, str.c_str(), &(ip.sin6_addr));
15 return ip.sin6_addr;
16 }
17
TEST(TestNetworkLinkIdHashingDarwin,Single)18 TEST(TestNetworkLinkIdHashingDarwin, Single)
19 {
20 // Setup
21 SHA1Sum expected_sha1;
22 SHA1Sum::Hash expected_digest;
23
24 in6_addr a1 = StringToSockAddr("2001:db8:8714:3a91::1");
25
26 // Prefix
27 expected_sha1.update(&a1, sizeof(in6_addr));
28 // Netmask
29 expected_sha1.update(&a1, sizeof(in6_addr));
30 expected_sha1.finish(expected_digest);
31
32 std::vector<prefix_and_netmask> prefixNetmaskStore;
33 prefixNetmaskStore.push_back(std::make_pair(a1, a1));
34 SHA1Sum actual_sha1;
35 // Run
36 nsNetworkLinkService::HashSortedPrefixesAndNetmasks(prefixNetmaskStore,
37 &actual_sha1);
38 SHA1Sum::Hash actual_digest;
39 actual_sha1.finish(actual_digest);
40
41 // Assert
42 ASSERT_EQ(0, memcmp(&expected_digest, &actual_digest, sizeof(SHA1Sum::Hash)));
43 }
44
TEST(TestNetworkLinkIdHashingDarwin,Multiple)45 TEST(TestNetworkLinkIdHashingDarwin, Multiple)
46 {
47 // Setup
48 SHA1Sum expected_sha1;
49 SHA1Sum::Hash expected_digest;
50
51 std::vector<in6_addr> addresses;
52 addresses.push_back(StringToSockAddr("2001:db8:8714:3a91::1"));
53 addresses.push_back(StringToSockAddr("2001:db8:8714:3a91::2"));
54 addresses.push_back(StringToSockAddr("2001:db8:8714:3a91::3"));
55 addresses.push_back(StringToSockAddr("2001:db8:8714:3a91::4"));
56
57 for (const auto& address : addresses) {
58 // Prefix
59 expected_sha1.update(&address, sizeof(in6_addr));
60 // Netmask
61 expected_sha1.update(&address, sizeof(in6_addr));
62 }
63 expected_sha1.finish(expected_digest);
64
65 // Ordered
66 std::vector<prefix_and_netmask> ordered;
67 for (const auto& address : addresses) {
68 ordered.push_back(std::make_pair(address, address));
69 }
70 SHA1Sum ordered_sha1;
71
72 // Unordered
73 std::vector<prefix_and_netmask> reversed;
74 for (auto it = addresses.rbegin(); it != addresses.rend(); ++it) {
75 reversed.push_back(std::make_pair(*it, *it));
76 }
77 SHA1Sum reversed_sha1;
78
79 // Run
80 nsNetworkLinkService::HashSortedPrefixesAndNetmasks(ordered, &ordered_sha1);
81 SHA1Sum::Hash ordered_digest;
82 ordered_sha1.finish(ordered_digest);
83
84 nsNetworkLinkService::HashSortedPrefixesAndNetmasks(reversed, &reversed_sha1);
85 SHA1Sum::Hash reversed_digest;
86 reversed_sha1.finish(reversed_digest);
87
88 // Assert
89 ASSERT_EQ(0,
90 memcmp(&expected_digest, &ordered_digest, sizeof(SHA1Sum::Hash)));
91 ASSERT_EQ(0,
92 memcmp(&expected_digest, &reversed_digest, sizeof(SHA1Sum::Hash)));
93 }
94