RTBKit
0.9
Open-source framework to create real-time ad bidding systems.
|
00001 /* json_filter_test.cc 00002 Jeremy Barnes, 5 June 2011 00003 Copyright (c) 2011 Datacratic. All rights reserved. 00004 00005 Test for JSON filters. 00006 */ 00007 00008 #define BOOST_TEST_MAIN 00009 #define BOOST_TEST_DYN_LINK 00010 00011 #include <boost/test/unit_test.hpp> 00012 #include "soa/logger/json_filter.h" 00013 #include "jml/utils/guard.h" 00014 #include "jml/arch/exception_handler.h" 00015 #include "jml/arch/timers.h" 00016 #include "jml/utils/filter_streams.h" 00017 #include "jml/utils/smart_ptr_utils.h" 00018 00019 using namespace std; 00020 using namespace ML; 00021 using namespace Datacratic; 00022 00023 string test_data; 00024 00025 size_t max_bytes = 2000000; 00026 00027 size_t default_buffer_size = 16384;//1024 * 1024; 00028 00029 BOOST_AUTO_TEST_CASE( get_stream ) 00030 { 00031 cerr << "reading in test data" << endl; 00032 filter_istream input("/mnt/shared/testdata/rtb_router-auctions-2011-Jun-29-20:46:43.log.gz"); 00033 00034 ostringstream output; 00035 00036 ML::Timer timer; 00037 00038 char buffer[default_buffer_size]; 00039 00040 size_t bytes = 0; 00041 00042 while (input && bytes < max_bytes) { 00043 input.read(buffer, default_buffer_size); 00044 int nread = input.gcount(); 00045 output.write(buffer, nread); 00046 bytes += nread; 00047 }; 00048 00049 test_data = output.str(); 00050 00051 cerr << format("read in %.2fMB in %.2f s, rate = %.2fMB/sec", 00052 test_data.length() / 1000000.0, timer.elapsed_wall(), 00053 test_data.length() / 1000000.0 / timer.elapsed_wall()) 00054 << endl; 00055 } 00056 00057 void test_filters(Filter & compressor, Filter & decompressor, 00058 const std::string & description, 00059 size_t buffer_size) 00060 { 00061 istringstream input(test_data); 00062 00063 size_t in_bytes = 0, out_bytes = 0; 00064 00065 ostringstream output; 00066 00067 ML::Timer timer; 00068 00069 compressor.onOutput = [&] (const char * buf, size_t n, FlushLevel flush, 00070 boost::function<void ()> cb) 00071 { 00072 out_bytes += n; 00073 //decompressor.process(buf, buf + n, flush, cb); 00074 output.write(buf, n); 00075 }; 00076 00077 char buffer[buffer_size]; 00078 00079 while (input) { 00080 input.read(buffer, buffer_size); 00081 int nread = input.gcount(); 00082 compressor.process(buffer, buffer + nread, FLUSH_NONE, []{}); 00083 }; 00084 00085 compressor.process("", FLUSH_FINISH, [] {}); 00086 00087 double cmp_elapsed = timer.elapsed_wall(); 00088 00089 //cerr << "cmp_elapsed = " << cmp_elapsed << " out_bytes = " 00090 // << out_bytes << endl; 00091 00092 //cerr << "wrote " << output.str().size() << " bytes" << endl; 00093 00094 size_t out_offset = 0; 00095 decompressor.onOutput = [&] (const char * buf, size_t n, FlushLevel flush, 00096 boost::function<void ()> cb) 00097 { 00098 in_bytes += n; 00099 00100 if (!std::equal(buf, buf + n, 00101 test_data.c_str() + out_offset)) { 00102 cerr << "in_bytes = " << in_bytes << endl; 00103 BOOST_REQUIRE(false); 00104 } 00105 00106 out_offset += n; 00107 00108 if (cb) cb(); 00109 }; 00110 00111 timer.restart(); 00112 00113 istringstream input2(output.str()); 00114 00115 while (input2) { 00116 input2.read(buffer, buffer_size); 00117 int nread = input2.gcount(); 00118 decompressor.process(buffer, buffer + nread, FLUSH_NONE, []{}); 00119 }; 00120 00121 //decompressor.process("", FLUSH_FINISH, [] {}); 00122 00123 double dec_elapsed = timer.elapsed_wall(); 00124 00125 cerr << format("%-20s: %6.2fMB in, %6.2fMB out, ratio %6.2f%%, ctime %6.2fs, crate %8.2fMB/s, dtime %6.2fs, drate %8.2fMB/s", 00126 description.c_str(), 00127 in_bytes / 1000000.0, out_bytes / 1000000.0, 00128 100.0 * out_bytes / in_bytes, 00129 cmp_elapsed, in_bytes / 1000000.0 / cmp_elapsed, 00130 dec_elapsed, in_bytes / 1000000.0 / dec_elapsed) 00131 << endl; 00132 } 00133 00134 #if 1 00135 BOOST_AUTO_TEST_CASE( test_gzip_filter ) 00136 { 00137 GzipCompressorFilter compressor; 00138 GzipDecompressor decompressor; 00139 00140 size_t buffer_size = default_buffer_size; 00141 00142 test_filters(compressor, decompressor, "gzip", buffer_size); 00143 } 00144 00145 #endif 00146 00147 00148 BOOST_AUTO_TEST_CASE( test_json_filter1 ) 00149 { 00150 JsonCompressor compressor; 00151 JsonDecompressor decompressor; 00152 00153 size_t buffer_size = default_buffer_size; 00154 00155 test_filters(compressor, decompressor, "Json", buffer_size); 00156 } 00157 00158 #if 1 00159 00160 #if 1 00161 BOOST_AUTO_TEST_CASE( test_bzip2_filter ) 00162 { 00163 Bzip2Compressor compressor; 00164 Bzip2Decompressor decompressor; 00165 00166 size_t buffer_size = default_buffer_size; 00167 00168 test_filters(compressor, decompressor, "bzip2", buffer_size); 00169 } 00170 00171 BOOST_AUTO_TEST_CASE( test_json_plus_bzip2_filter ) 00172 { 00173 FilterStack compressor, decompressor; 00174 compressor.push(ML::make_std_sp(new JsonCompressor())); 00175 compressor.push(ML::make_std_sp(new Bzip2Compressor())); 00176 decompressor.push(ML::make_std_sp(new Bzip2Decompressor())); 00177 decompressor.push(ML::make_std_sp(new JsonDecompressor())); 00178 00179 size_t buffer_size = default_buffer_size; 00180 00181 test_filters(compressor, decompressor, "json+bzip2", buffer_size); 00182 } 00183 #endif 00184 00185 BOOST_AUTO_TEST_CASE( test_zlib_filter ) 00186 { 00187 ZlibCompressor compressor; 00188 ZlibDecompressor decompressor; 00189 00190 size_t buffer_size = default_buffer_size; 00191 00192 test_filters(compressor, decompressor, "zlib", buffer_size); 00193 } 00194 00195 BOOST_AUTO_TEST_CASE( test_json_plus_zlib_filter ) 00196 { 00197 FilterStack compressor, decompressor; 00198 compressor.push(ML::make_std_sp(new JsonCompressor())); 00199 compressor.push(ML::make_std_sp(new ZlibCompressor())); 00200 decompressor.push(ML::make_std_sp(new ZlibDecompressor())); 00201 decompressor.push(ML::make_std_sp(new JsonDecompressor())); 00202 00203 size_t buffer_size = default_buffer_size; 00204 00205 test_filters(compressor, decompressor, "json+zlib", buffer_size); 00206 } 00207 00208 BOOST_AUTO_TEST_CASE( test_lzma1_filter ) 00209 { 00210 LzmaCompressor compressor(1); 00211 LzmaDecompressor decompressor; 00212 00213 size_t buffer_size = default_buffer_size; 00214 00215 test_filters(compressor, decompressor, "lzma1", buffer_size); 00216 } 00217 00218 BOOST_AUTO_TEST_CASE( test_json_plus_lzma1_filter ) 00219 { 00220 FilterStack compressor, decompressor; 00221 compressor.push(ML::make_std_sp(new JsonCompressor())); 00222 compressor.push(ML::make_std_sp(new LzmaCompressor(1))); 00223 decompressor.push(ML::make_std_sp(new LzmaDecompressor())); 00224 decompressor.push(ML::make_std_sp(new JsonDecompressor())); 00225 00226 size_t buffer_size = default_buffer_size; 00227 00228 test_filters(compressor, decompressor, "json+lzma1", buffer_size); 00229 } 00230 00231 BOOST_AUTO_TEST_CASE( test_lzma2_filter ) 00232 { 00233 LzmaCompressor compressor(2); 00234 LzmaDecompressor decompressor; 00235 00236 size_t buffer_size = default_buffer_size; 00237 00238 test_filters(compressor, decompressor, "lzma2", buffer_size); 00239 } 00240 00241 BOOST_AUTO_TEST_CASE( test_json_plus_lzma2_filter ) 00242 { 00243 FilterStack compressor, decompressor; 00244 compressor.push(ML::make_std_sp(new JsonCompressor())); 00245 compressor.push(ML::make_std_sp(new LzmaCompressor(2))); 00246 decompressor.push(ML::make_std_sp(new LzmaDecompressor())); 00247 decompressor.push(ML::make_std_sp(new JsonDecompressor())); 00248 00249 size_t buffer_size = default_buffer_size; 00250 00251 test_filters(compressor, decompressor, "json+lzma2", buffer_size); 00252 } 00253 00254 BOOST_AUTO_TEST_CASE( test_lzma3_filter ) 00255 { 00256 LzmaCompressor compressor(3); 00257 LzmaDecompressor decompressor; 00258 00259 size_t buffer_size = default_buffer_size; 00260 00261 test_filters(compressor, decompressor, "lzma3", buffer_size); 00262 } 00263 00264 BOOST_AUTO_TEST_CASE( test_json_plus_lzma3_filter ) 00265 { 00266 FilterStack compressor, decompressor; 00267 compressor.push(ML::make_std_sp(new JsonCompressor())); 00268 compressor.push(ML::make_std_sp(new LzmaCompressor(3))); 00269 decompressor.push(ML::make_std_sp(new LzmaDecompressor())); 00270 decompressor.push(ML::make_std_sp(new JsonDecompressor())); 00271 00272 size_t buffer_size = default_buffer_size; 00273 00274 test_filters(compressor, decompressor, "json+lzma3", buffer_size); 00275 } 00276 00277 BOOST_AUTO_TEST_CASE( test_lzma4_filter ) 00278 { 00279 LzmaCompressor compressor(4); 00280 LzmaDecompressor decompressor; 00281 00282 size_t buffer_size = default_buffer_size; 00283 00284 test_filters(compressor, decompressor, "lzma4", buffer_size); 00285 } 00286 00287 BOOST_AUTO_TEST_CASE( test_json_plus_lzma4_filter ) 00288 { 00289 FilterStack compressor, decompressor; 00290 compressor.push(ML::make_std_sp(new JsonCompressor())); 00291 compressor.push(ML::make_std_sp(new LzmaCompressor(4))); 00292 decompressor.push(ML::make_std_sp(new LzmaDecompressor())); 00293 decompressor.push(ML::make_std_sp(new JsonDecompressor())); 00294 00295 size_t buffer_size = default_buffer_size; 00296 00297 test_filters(compressor, decompressor, "json+lzma4", buffer_size); 00298 } 00299 00300 BOOST_AUTO_TEST_CASE( test_lzma5_filter ) 00301 { 00302 LzmaCompressor compressor(5); 00303 LzmaDecompressor decompressor; 00304 00305 size_t buffer_size = default_buffer_size; 00306 00307 test_filters(compressor, decompressor, "lzma5", buffer_size); 00308 } 00309 00310 BOOST_AUTO_TEST_CASE( test_json_plus_lzma5_filter ) 00311 { 00312 FilterStack compressor, decompressor; 00313 compressor.push(ML::make_std_sp(new JsonCompressor())); 00314 compressor.push(ML::make_std_sp(new LzmaCompressor(5))); 00315 decompressor.push(ML::make_std_sp(new LzmaDecompressor())); 00316 decompressor.push(ML::make_std_sp(new JsonDecompressor())); 00317 00318 size_t buffer_size = default_buffer_size; 00319 00320 test_filters(compressor, decompressor, "json+lzma5", buffer_size); 00321 } 00322 00323 BOOST_AUTO_TEST_CASE( test_lzma6_filter ) 00324 { 00325 LzmaCompressor compressor(6); 00326 LzmaDecompressor decompressor; 00327 00328 size_t buffer_size = default_buffer_size; 00329 00330 test_filters(compressor, decompressor, "lzma6", buffer_size); 00331 } 00332 00333 BOOST_AUTO_TEST_CASE( test_json_plus_lzma6_filter ) 00334 { 00335 FilterStack compressor, decompressor; 00336 compressor.push(ML::make_std_sp(new JsonCompressor())); 00337 compressor.push(ML::make_std_sp(new LzmaCompressor(6))); 00338 decompressor.push(ML::make_std_sp(new LzmaDecompressor())); 00339 decompressor.push(ML::make_std_sp(new JsonDecompressor())); 00340 00341 size_t buffer_size = default_buffer_size; 00342 00343 test_filters(compressor, decompressor, "json+lzma6", buffer_size); 00344 } 00345 00346 BOOST_AUTO_TEST_CASE( test_lzma9_filter ) 00347 { 00348 LzmaCompressor compressor(9); 00349 LzmaDecompressor decompressor; 00350 00351 size_t buffer_size = default_buffer_size; 00352 00353 test_filters(compressor, decompressor, "lzma9", buffer_size); 00354 } 00355 00356 BOOST_AUTO_TEST_CASE( test_json_plus_lzma9_filter ) 00357 { 00358 FilterStack compressor, decompressor; 00359 compressor.push(ML::make_std_sp(new JsonCompressor())); 00360 compressor.push(ML::make_std_sp(new LzmaCompressor(9))); 00361 decompressor.push(ML::make_std_sp(new LzmaDecompressor())); 00362 decompressor.push(ML::make_std_sp(new JsonDecompressor())); 00363 00364 size_t buffer_size = default_buffer_size; 00365 00366 test_filters(compressor, decompressor, "json+lzma9", buffer_size); 00367 } 00368 #endif