blob: f38dab7f7a20cb7d9d1756e41f773796956a99f0 [file] [log] [blame]
Zhenkai Zhue29616f2013-01-14 15:40:57 -08001#include "sync-core.h"
Alexander Afanasyevc507ac22013-01-21 16:01:58 -08002#include "logging.h"
Alexander Afanasyevabe952a2013-01-17 17:06:32 -08003
Zhenkai Zhue29616f2013-01-14 15:40:57 -08004#include <boost/test/unit_test.hpp>
5#include <boost/filesystem.hpp>
Alexander Afanasyevf278db32013-01-21 14:41:01 -08006#include <boost/make_shared.hpp>
Zhenkai Zhue29616f2013-01-14 15:40:57 -08007
8using namespace std;
9using namespace Ccnx;
Alexander Afanasyevf278db32013-01-21 14:41:01 -080010using namespace boost;
Zhenkai Zhue29616f2013-01-14 15:40:57 -080011using namespace boost::filesystem;
12
Alexander Afanasyevfc720362013-01-24 21:49:48 -080013INIT_LOGGER("Test.SyncCore");
Alexander Afanasyevc507ac22013-01-21 16:01:58 -080014
Zhenkai Zhue29616f2013-01-14 15:40:57 -080015BOOST_AUTO_TEST_SUITE(SyncCoreTests)
16
Zhenkai Zhu9501b8b2013-01-17 12:37:00 -080017void callback(const SyncStateMsgPtr &msg)
Zhenkai Zhue29616f2013-01-14 15:40:57 -080018{
Zhenkai Zhu9501b8b2013-01-17 12:37:00 -080019 BOOST_CHECK(msg->state_size() > 0);
Zhenkai Zhu085aae72013-01-17 21:09:01 -080020 int size = msg->state_size();
21 int index = 0;
22 while (index < size)
23 {
24 SyncState state = msg->state(index);
25 BOOST_CHECK(state.has_old_seq());
26 BOOST_CHECK(state.old_seq() >= 0);
27 if (state.seq() != 0)
28 {
Alexander Afanasyevdac84922013-01-20 23:32:17 -080029 BOOST_CHECK(state.old_seq() != state.seq());
Zhenkai Zhu085aae72013-01-17 21:09:01 -080030 }
31 index++;
32 }
Zhenkai Zhue29616f2013-01-14 15:40:57 -080033}
34
Zhenkai Zhu9501b8b2013-01-17 12:37:00 -080035void checkRoots(const HashPtr &root1, const HashPtr &root2)
Zhenkai Zhue29616f2013-01-14 15:40:57 -080036{
Zhenkai Zhu9501b8b2013-01-17 12:37:00 -080037 BOOST_CHECK_EQUAL(*root1, *root2);
Zhenkai Zhue29616f2013-01-14 15:40:57 -080038}
39
40BOOST_AUTO_TEST_CASE(SyncCoreTest)
41{
Alexander Afanasyevc507ac22013-01-21 16:01:58 -080042 INIT_LOGGERS();
43
Zhenkai Zhue29616f2013-01-14 15:40:57 -080044 string dir = "./SyncCoreTest";
Zhenkai Zhu4e1c1d92013-01-17 14:12:46 -080045 // clean the test dir
46 path d(dir);
47 if (exists(d))
48 {
49 remove_all(d);
50 }
51
Zhenkai Zhu05de64a2013-01-14 15:48:23 -080052 string dir1 = "./SyncCoreTest/1";
53 string dir2 = "./SyncCoreTest/2";
Zhenkai Zhue29616f2013-01-14 15:40:57 -080054 Name user1("/joker");
55 Name loc1("/gotham1");
56 Name user2("/darkknight");
57 Name loc2("/gotham2");
58 Name syncPrefix("/broadcast/darkknight");
59 CcnxWrapperPtr c1(new CcnxWrapper());
60 CcnxWrapperPtr c2(new CcnxWrapper());
Zhenkai Zhub330aed2013-01-17 13:29:37 -080061 SyncLogPtr log1(new SyncLog(dir1, user1.toString()));
62 SyncLogPtr log2(new SyncLog(dir2, user2.toString()));
63
Alexander Afanasyevd94a8c62013-01-24 13:53:40 -080064 SyncCore *core1 = new SyncCore(log1, user1, loc1, syncPrefix, bind(callback, _1), c1);
Zhenkai Zhue29616f2013-01-14 15:40:57 -080065 usleep(10000);
Alexander Afanasyevd94a8c62013-01-24 13:53:40 -080066 SyncCore *core2 = new SyncCore(log2, user2, loc2, syncPrefix, bind(callback, _1), c2);
Alexander Afanasyevfc720362013-01-24 21:49:48 -080067
68 sleep(1);
Zhenkai Zhu9501b8b2013-01-17 12:37:00 -080069 checkRoots(core1->root(), core2->root());
Zhenkai Zhu6e7d4d22013-01-15 18:18:18 -080070
Alexander Afanasyev49a30d02013-01-21 21:38:48 -080071 // _LOG_TRACE ("\n\n\n\n\n\n----------\n");
Alexander Afanasyevc507ac22013-01-21 16:01:58 -080072
Zhenkai Zhue29616f2013-01-14 15:40:57 -080073 core1->updateLocalState(1);
74 usleep(100000);
Zhenkai Zhu9501b8b2013-01-17 12:37:00 -080075 checkRoots(core1->root(), core2->root());
76 BOOST_CHECK_EQUAL(core2->seq(user1), 1);
Alexander Afanasyevdac84922013-01-20 23:32:17 -080077 BOOST_CHECK_EQUAL(log2->LookupLocator (user1), loc1);
Zhenkai Zhue29616f2013-01-14 15:40:57 -080078
79 core1->updateLocalState(5);
80 usleep(100000);
Zhenkai Zhu9501b8b2013-01-17 12:37:00 -080081 checkRoots(core1->root(), core2->root());
82 BOOST_CHECK_EQUAL(core2->seq(user1), 5);
Alexander Afanasyevdac84922013-01-20 23:32:17 -080083 BOOST_CHECK_EQUAL(log2->LookupLocator (user1), loc1);
Zhenkai Zhue29616f2013-01-14 15:40:57 -080084
85 core2->updateLocalState(10);
86 usleep(100000);
Zhenkai Zhu9501b8b2013-01-17 12:37:00 -080087 checkRoots(core1->root(), core2->root());
88 BOOST_CHECK_EQUAL(core1->seq(user2), 10);
Alexander Afanasyevdac84922013-01-20 23:32:17 -080089 BOOST_CHECK_EQUAL(log1->LookupLocator (user2), loc2);
Zhenkai Zhue29616f2013-01-14 15:40:57 -080090
91 // simple simultaneous data generation
Alexander Afanasyev49a30d02013-01-21 21:38:48 -080092 // _LOG_TRACE ("\n\n\n\n\n\n----------Simultaneous\n");
93 _LOG_TRACE ("Simultaneous");
Alexander Afanasyevc507ac22013-01-21 16:01:58 -080094
Zhenkai Zhue29616f2013-01-14 15:40:57 -080095 core1->updateLocalState(11);
Alexander Afanasyevbeee0b42013-01-16 18:25:08 -080096 usleep(100);
Zhenkai Zhu9501b8b2013-01-17 12:37:00 -080097 core2->updateLocalState(15);
Alexander Afanasyevf278db32013-01-21 14:41:01 -080098 usleep(2000000);
Zhenkai Zhu9501b8b2013-01-17 12:37:00 -080099 checkRoots(core1->root(), core2->root());
100 BOOST_CHECK_EQUAL(core1->seq(user2), 15);
101 BOOST_CHECK_EQUAL(core2->seq(user1), 11);
Zhenkai Zhue29616f2013-01-14 15:40:57 -0800102
Alexander Afanasyevdac84922013-01-20 23:32:17 -0800103 BOOST_CHECK_EQUAL(log1->LookupLocator (user1), loc1);
104 BOOST_CHECK_EQUAL(log1->LookupLocator (user2), loc2);
105 BOOST_CHECK_EQUAL(log2->LookupLocator (user1), loc1);
106 BOOST_CHECK_EQUAL(log2->LookupLocator (user2), loc2);
Zhenkai Zhu4e1c1d92013-01-17 14:12:46 -0800107
Zhenkai Zhue29616f2013-01-14 15:40:57 -0800108 // clean the test dir
109 if (exists(d))
110 {
111 remove_all(d);
112 }
113}
114
115BOOST_AUTO_TEST_SUITE_END()