blob: c015a19358be0257752bf25e92f4d411ead2efcb [file] [log] [blame]
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
Ashlesh Gawande5a895472020-01-25 18:07:32 -08003 * Copyright (c) 2014-2020, The University of Memphis
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -05004 *
5 * This file is part of PSync.
6 * See AUTHORS.md for complete list of PSync authors and contributors.
7 *
8 * PSync is free software: you can redistribute it and/or modify it under the terms
Ashlesh Gawande0cf4b602019-01-18 15:58:17 -06009 * of the GNU Lesser General Public License as published by the Free Software Foundation,
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -050010 * either version 3 of the License, or (at your option) any later version.
11 *
12 * PSync is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Ashlesh Gawande0cf4b602019-01-18 15:58:17 -060014 * PURPOSE. See the GNU Lesser General Public License for more details.
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -050015 *
Ashlesh Gawande0cf4b602019-01-18 15:58:17 -060016 * You should have received a copy of the GNU Lesser General Public License along with
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -050017 * PSync, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 **/
19
Ashlesh Gawande78b94ad2018-12-13 15:29:19 -060020#include "PSync/detail/iblt.hpp"
21#include "PSync/detail/util.hpp"
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -050022
Davide Pesavento5b3cf762020-04-03 16:20:04 -040023#include "tests/boost-test.hpp"
24
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -050025namespace psync {
Davide Pesaventodb789562020-12-19 23:01:08 -050026namespace detail {
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -050027
28using namespace ndn;
29
30BOOST_AUTO_TEST_SUITE(TestIBLT)
31
32BOOST_AUTO_TEST_CASE(Equal)
33{
Davide Pesaventodb789562020-12-19 23:01:08 -050034 const size_t size = 10;
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -050035
Ashlesh Gawandee23b53b2020-02-16 13:47:38 -080036 IBLT iblt1(size, CompressionScheme::DEFAULT);
37 IBLT iblt2(size, CompressionScheme::DEFAULT);
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -050038 BOOST_CHECK_EQUAL(iblt1, iblt2);
39
40 std::string prefix = Name("/test/memphis").appendNumber(1).toUri();
41 uint32_t newHash = murmurHash3(11, prefix);
42 iblt1.insert(newHash);
43 iblt2.insert(newHash);
44
45 BOOST_CHECK_EQUAL(iblt1, iblt2);
46
47 Name ibfName1("sync"), ibfName2("sync");
48 iblt1.appendToName(ibfName1);
49 iblt2.appendToName(ibfName2);
50 BOOST_CHECK_EQUAL(ibfName1, ibfName2);
51}
52
Ashlesh Gawande79c5baf2020-02-16 12:29:52 -080053static const uint8_t IBF[] = {
54 // Header
55 0x08, 0xB4,
56 // Uncompressed IBF
57 0x00, 0x00, 0x00, 0x01, 0xF6, 0xA7, 0x7A, 0xBA, 0x6B, 0xA3, 0x4D, 0x63, 0x00, 0x00, 0x00, 0x00,
58 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF6, 0xA7, 0x7A, 0xBA,
62 0x6B, 0xA3, 0x4D, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
66 0x00, 0x00, 0x00, 0x01, 0xF6, 0xA7, 0x7A, 0xBA, 0x6B, 0xA3, 0x4D, 0x63, 0x00, 0x00, 0x00, 0x00,
67 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
68 0x00, 0x00, 0x00, 0x00
69};
70
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -050071BOOST_AUTO_TEST_CASE(NameAppendAndExtract)
72{
Davide Pesavento5b3cf762020-04-03 16:20:04 -040073 const int size = 10;
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -050074
Ashlesh Gawandee23b53b2020-02-16 13:47:38 -080075 IBLT iblt(size, CompressionScheme::DEFAULT);
Davide Pesavento5b3cf762020-04-03 16:20:04 -040076 auto prefix = Name("/test/memphis").appendNumber(1).toUri();
77 auto hash = murmurHash3(11, prefix);
78 iblt.insert(hash);
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -050079
Davide Pesavento5b3cf762020-04-03 16:20:04 -040080 Name ibltName("/sync");
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -050081 iblt.appendToName(ibltName);
82
Ashlesh Gawandee23b53b2020-02-16 13:47:38 -080083 IBLT rcvd(size, CompressionScheme::DEFAULT);
Davide Pesavento5b3cf762020-04-03 16:20:04 -040084 rcvd.initialize(ibltName.at(-1));
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -050085 BOOST_CHECK_EQUAL(iblt, rcvd);
86
Ashlesh Gawandee23b53b2020-02-16 13:47:38 -080087 IBLT rcvdDiffSize(20, CompressionScheme::DEFAULT);
Davide Pesavento5b3cf762020-04-03 16:20:04 -040088 BOOST_CHECK_THROW(rcvdDiffSize.initialize(ibltName.at(-1)), IBLT::Error);
Ashlesh Gawande79c5baf2020-02-16 12:29:52 -080089
Davide Pesavento5b3cf762020-04-03 16:20:04 -040090 IBLT iblt2(size, CompressionScheme::NONE);
91 iblt2.insert(hash);
92 Name ibltName2("/sync");
93 iblt2.appendToName(ibltName2);
94 BOOST_CHECK_EQUAL_COLLECTIONS(IBF, IBF + sizeof(IBF),
95 ibltName2.at(-1).wireEncode().begin(),
96 ibltName2.at(-1).wireEncode().end());
97
98 Name malformedName("/test");
Ashlesh Gawande79c5baf2020-02-16 12:29:52 -080099 auto compressed = compress(CompressionScheme::DEFAULT,
100 malformedName.wireEncode().value(),
101 malformedName.wireEncode().value_size());
Ashlesh Gawande79c5baf2020-02-16 12:29:52 -0800102 malformedName.append(compressed->data(), compressed->size());
Davide Pesavento5b3cf762020-04-03 16:20:04 -0400103 IBLT rcvd2(size, CompressionScheme::DEFAULT);
104 BOOST_CHECK_THROW(rcvd2.initialize(malformedName.at(-1)), IBLT::Error);
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -0500105}
106
107BOOST_AUTO_TEST_CASE(CopyInsertErase)
108{
Davide Pesaventodb789562020-12-19 23:01:08 -0500109 const size_t size = 10;
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -0500110
Ashlesh Gawandee23b53b2020-02-16 13:47:38 -0800111 IBLT iblt1(size, CompressionScheme::DEFAULT);
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -0500112
113 std::string prefix = Name("/test/memphis").appendNumber(1).toUri();
114 uint32_t hash1 = murmurHash3(11, prefix);
115 iblt1.insert(hash1);
116
117 IBLT iblt2(iblt1);
118 iblt2.erase(hash1);
119 prefix = Name("/test/memphis").appendNumber(2).toUri();
120 uint32_t hash3 = murmurHash3(11, prefix);
121 iblt2.insert(hash3);
122
123 iblt1.erase(hash1);
124 prefix = Name("/test/memphis").appendNumber(5).toUri();
125 uint32_t hash5 = murmurHash3(11, prefix);
126 iblt1.insert(hash5);
127
128 iblt2.erase(hash3);
129 iblt2.insert(hash5);
130
131 BOOST_CHECK_EQUAL(iblt1, iblt2);
132}
133
134BOOST_AUTO_TEST_CASE(HigherSeqTest)
135{
136 // The case where we can't recognize if the rcvd IBF has higher sequence number
137 // Relevant to full sync case
Davide Pesaventodb789562020-12-19 23:01:08 -0500138
139 const size_t size = 10;
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -0500140
Ashlesh Gawandee23b53b2020-02-16 13:47:38 -0800141 IBLT ownIBF(size, CompressionScheme::DEFAULT);
142 IBLT rcvdIBF(size, CompressionScheme::DEFAULT);
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -0500143
144 std::string prefix = Name("/test/memphis").appendNumber(3).toUri();
145 uint32_t hash1 = murmurHash3(11, prefix);
146 ownIBF.insert(hash1);
147
148 std::string prefix2 = Name("/test/memphis").appendNumber(4).toUri();
149 uint32_t hash2 = murmurHash3(11, prefix2);
150 rcvdIBF.insert(hash2);
151
152 IBLT diff = ownIBF - rcvdIBF;
153 std::set<uint32_t> positive;
154 std::set<uint32_t> negative;
155
156 BOOST_CHECK(diff.listEntries(positive, negative));
157 BOOST_CHECK(*positive.begin() == hash1);
158 BOOST_CHECK(*negative.begin() == hash2);
159}
160
161BOOST_AUTO_TEST_CASE(Difference)
162{
Davide Pesaventodb789562020-12-19 23:01:08 -0500163 const size_t size = 10;
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -0500164
Ashlesh Gawandee23b53b2020-02-16 13:47:38 -0800165 IBLT ownIBF(size, CompressionScheme::DEFAULT);
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -0500166 IBLT rcvdIBF = ownIBF;
167
168 IBLT diff = ownIBF - rcvdIBF;
169
170 std::set<uint32_t> positive; // non-empty Positive means we have some elements that the others don't
171 std::set<uint32_t> negative;
172
173 BOOST_CHECK(diff.listEntries(positive, negative));
174 BOOST_CHECK_EQUAL(positive.size(), 0);
175 BOOST_CHECK_EQUAL(negative.size(), 0);
176
177 std::string prefix = Name("/test/memphis").appendNumber(1).toUri();
178 uint32_t newHash = murmurHash3(11, prefix);
179 ownIBF.insert(newHash);
180
181 diff = ownIBF - rcvdIBF;
182 BOOST_CHECK(diff.listEntries(positive, negative));
183 BOOST_CHECK_EQUAL(positive.size(), 1);
184 BOOST_CHECK_EQUAL(negative.size(), 0);
185
186 prefix = Name("/test/csu").appendNumber(1).toUri();
187 newHash = murmurHash3(11, prefix);
188 rcvdIBF.insert(newHash);
189
190 diff = ownIBF - rcvdIBF;
191 BOOST_CHECK(diff.listEntries(positive, negative));
192 BOOST_CHECK_EQUAL(positive.size(), 1);
193 BOOST_CHECK_EQUAL(negative.size(), 1);
194}
195
196BOOST_AUTO_TEST_CASE(DifferenceBwOversizedIBFs)
197{
198 // Insert 50 elements into IBF of size 10
199 // Check that we can still list the difference
200 // even though we can't list the IBFs itself
201
Davide Pesaventodb789562020-12-19 23:01:08 -0500202 const size_t size = 10;
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -0500203
Ashlesh Gawandee23b53b2020-02-16 13:47:38 -0800204 IBLT ownIBF(size, CompressionScheme::DEFAULT);
Ashlesh Gawande0b2897e2018-06-20 14:40:47 -0500205
206 for (int i = 0; i < 50; i++) {
207 std::string prefix = Name("/test/memphis" + std::to_string(i)).appendNumber(1).toUri();
208 uint32_t newHash = murmurHash3(11, prefix);
209 ownIBF.insert(newHash);
210 }
211
212 IBLT rcvdIBF = ownIBF;
213
214 std::string prefix = Name("/test/ucla").appendNumber(1).toUri();
215 uint32_t newHash = murmurHash3(11, prefix);
216 ownIBF.insert(newHash);
217
218 IBLT diff = ownIBF - rcvdIBF;
219
220 std::set<uint32_t> positive;
221 std::set<uint32_t> negative;
222 BOOST_CHECK(diff.listEntries(positive, negative));
223 BOOST_CHECK_EQUAL(positive.size(), 1);
224 BOOST_CHECK_EQUAL(*positive.begin(), newHash);
225 BOOST_CHECK_EQUAL(negative.size(), 0);
226
227 BOOST_CHECK(!ownIBF.listEntries(positive, negative));
228 BOOST_CHECK(!rcvdIBF.listEntries(positive, negative));
229}
230
231BOOST_AUTO_TEST_SUITE_END()
232
Davide Pesaventodb789562020-12-19 23:01:08 -0500233} // namespace detail
Davide Pesavento5b3cf762020-04-03 16:20:04 -0400234} // namespace psync