![]() |
RTBKit
0.9
Open-source framework to create real-time ad bidding systems.
|
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