RTBKit  0.9
Open-source framework to create real-time ad bidding systems.
soa/logger/testing/json_filter_test.cc
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
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator