RTBKit  0.9
Open-source framework to create real-time ad bidding systems.
testing/augmentation_list_test.cc
00001 
00009 #define BOOST_TEST_MAIN
00010 #define BOOST_TEST_DYN_LINK
00011 
00012 #include "rtbkit/common/augmentation.h"
00013 
00014 #include <boost/test/unit_test.hpp>
00015 
00016 
00017 using namespace std;
00018 using namespace ML;
00019 using namespace Datacratic;
00020 using namespace RTBKIT;
00021 
00022 
00023 struct AugmentationFixture
00024 {
00025     AccountKey accA, accBB, accBC, accBBA;
00026     string tag0, tag1, tag2;
00027     Json::Value data0, data1, data2;
00028 
00029     AugmentationFixture()
00030     {
00031         accA = { "A" };
00032         accBB = { "B", "B" };
00033         accBC = { "B", "C" };
00034         accBBA = { "B", "B", "A" };
00035 
00036         tag0 = "a-tag";
00037         tag1 = "bob-the-tag";
00038         tag2 = "not-a-tag-tag";
00039 
00040         data0 = Json::Value(Json::objectValue);
00041         data0["aug0"] = 42;
00042 
00043         data1 = Json::Value(Json::objectValue);
00044         data1["bob-the-augmentor"] = "bob-the-data-for-the-augmentor";
00045 
00046         data2 = Json::Value(Json::objectValue);
00047         Json::Value& arr = data2["another-augmentor"] = Json::Value(Json::arrayValue);
00048         arr.append(10);
00049         arr.append("this is not a number");
00050     }
00051 
00052 };
00053 
00054 void checkTags(const set<string>& tags, const initializer_list<string>& exp)
00055 {
00056     // cerr << "TAGS: { ";
00057     // for (const string& tag : tags) cerr << tag << ", ";
00058     // cerr << "} => { ";
00059     // for (const string& tag : exp) cerr << tag << ", ";
00060     // cerr << "}" << endl;
00061 
00062     BOOST_CHECK_EQUAL(tags.size(), exp.size());
00063     if (tags.size() != exp.size()) return;
00064 
00065     bool ret = equal(tags.begin(), tags.end(), exp.begin());
00066     BOOST_CHECK(ret);
00067 }
00068 
00069 void checkData(
00070         const Json::Value& data, const initializer_list<Json::Value>& exp)
00071 {
00072     // cerr << "DATA: " << data.toString();
00073     // cerr << "EXPECTED: " << endl;
00074     // for (const auto& data : exp) cerr << "\t" << data.toString();
00075 
00076     int totalFound = 0;
00077 
00078     vector<string> members = data.getMemberNames();
00079     for (const string& member : members) {
00080 
00081         bool found = false;
00082         for (const Json::Value & val : exp) {
00083             if (!val.isMember(member)) continue;
00084             BOOST_CHECK_EQUAL(val[member], data[member]);
00085             found = true;
00086             totalFound++;
00087             break;
00088         }
00089 
00090         BOOST_CHECK(found);
00091     }
00092 
00093     BOOST_CHECK_EQUAL(totalFound, exp.size());
00094 }
00095 
00096 void check(
00097         const AugmentationList & list,
00098         const AccountKey & key,
00099         const initializer_list<string>& expTags,
00100         const initializer_list<Json::Value>& expData)
00101 {
00102     auto aug = list.filterForAccount(key);
00103     checkData(aug.data, expData);
00104     checkTags(aug.tags, expTags);
00105 
00106     auto tags = list.tagsForAccount(key);
00107     BOOST_CHECK_EQUAL(tags.size(), aug.tags.size());
00108     BOOST_CHECK(equal(tags.begin(), tags.end(), aug.tags.begin()));
00109 }
00110 
00111 
00112 BOOST_FIXTURE_TEST_CASE( test_filters, AugmentationFixture )
00113 {
00114     AugmentationList list;
00115     list[AccountKey()] = { {tag0}, data0 };
00116     list[accA] = { {tag1}, data1 };
00117     list[accBB] = { {tag2}, data2 };
00118     list[accBC];
00119     list[accBBA] = { {tag1}, data1 };
00120 
00121     check(list, {}, { tag0 }, { data0 });
00122     check(list, accA, { tag0, tag1 }, { data0, data1 });
00123     check(list, accBB, { tag0, tag2 }, { data0, data2 });
00124     check(list, accBC, { tag0 }, { data0 });
00125     check(list, accBBA, { tag0, tag1, tag2 }, { data0, data1, data2 });
00126 
00127     AccountKey acc0({ "A", "B" });
00128     check(list, acc0, { tag0, tag1 }, { data0, data1 });
00129 
00130     AccountKey acc1({ "C" });
00131     check(list, acc1, { tag0 }, { data0 });
00132 }
00133 
00134 
00135 BOOST_FIXTURE_TEST_CASE( test_json, AugmentationFixture )
00136 {
00137     AugmentationList origin;
00138     origin[AccountKey()] = { {tag0}, data0 };
00139     origin[accA] = { {tag1}, data1 };
00140     origin[accBB] = { {tag2}, data2 };
00141     origin[accBC];
00142     origin[accBBA] = { {tag1}, data1 };
00143 
00144     Json::Value json = origin.toJson();
00145     cerr << json.toString();
00146 
00147     AugmentationList list = AugmentationList::fromJson(json);
00148     check(list, {},     { tag0 },             { data0 });
00149     check(list, accA,   { tag0, tag1 },       { data0, data1 });
00150     check(list, accBB,  { tag0, tag2 },       { data0, data2 });
00151     check(list, accBC,  { tag0 },             { data0 });
00152     check(list, accBBA, { tag0, tag1, tag2 }, { data0, data1, data2 });
00153 
00154     AccountKey acc0({ "A", "B" });
00155     check(list, acc0, { tag0, tag1 }, { data0, data1 });
00156 
00157     AccountKey acc1({ "C" });
00158     check(list, acc1, { tag0 }, { data0 });
00159 }
00160 
00161 
00162 BOOST_FIXTURE_TEST_CASE( test_merge, AugmentationFixture )
00163 {
00164     AugmentationList list;
00165     list[AccountKey()] = { { tag0 }, data0 };
00166     list[accA] = { { tag0 }, data0 };
00167 
00168     AugmentationList toMerge;
00169     toMerge[AccountKey()] = { { tag0, tag2 }, data1 };
00170     toMerge[accBB] = { { tag1 }, data2 };
00171 
00172     list.mergeWith(toMerge);
00173     check(list, {}, { tag0, tag2 }, { data0, data1 });
00174 
00175     {
00176         const Augmentation& aug = list[accA];
00177         checkTags(aug.tags, { tag0 });
00178         checkData(aug.data, { data0 });
00179     }
00180 
00181     {
00182         const Augmentation& aug = list[accBB];
00183         checkTags(aug.tags, { tag1 });
00184         checkData(aug.data, { data2 });
00185     }
00186 
00187 }
00188 
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator