LCOV - code coverage report
Current view: top level - tests - wrtstat_suite.cpp (source / functions) Hit Total Coverage
Test: wrtstat-coverage.info Lines: 78 88 88.6 %
Date: 2019-09-13 Functions: 19 22 86.4 %

          Line data    Source code
       1             : #include <fas/testing.hpp>
       2             : #include <wrtstat/meter_manager.hpp>
       3             : #include <wrtstat/wrtstat.hpp>
       4             : #include <wrtstat/manager/aggregator_registry.hpp>
       5             : #include <chrono>
       6             : #include <map>
       7             : 
       8             : //#define COUNT 1000000
       9             : #define COUNT 1
      10             : namespace {
      11             : 
      12           3 : UNIT(wrtstat1, "")
      13             : {
      14             :   using namespace fas::testing;
      15             : 
      16           1 :   wrtstat::meter_manager::options_type options;
      17             :   // Если resolutions now_t не совпадает, то 
      18           1 :   options.resolution = wrtstat::resolutions::microseconds;
      19             :   
      20           2 :   wrtstat::meter_manager stat(options);
      21           1 :   stat.create_composite_multi_meter<std::chrono::microseconds>(
      22             :     "a1", "a2", "a3", true).create( 
      23             :     stat.now(), 
      24             :     static_cast<wrtstat::size_type >(255),
      25             :     0l, 0l
      26             :   );
      27           1 :   t << message("DEBUG"); 
      28           1 :   t << flush;
      29             : 
      30           1 :   stat.create_size_multi_meter( "s1").create(stat.now(), 12);
      31           1 :   stat.create_value_multi_meter( "v1").create(stat.now(), 12, 0u);
      32           1 :   stat.create_value_multi_meter( "v2").create(stat.now(), 12, 1u);
      33             :   
      34           1 :   stat.create_time_multi_meter< std::chrono::nanoseconds >("t1")
      35             :       .create( stat.now(), 1u);
      36           1 :   stat.create_time_multi_meter< std::chrono::nanoseconds >( "t2")
      37             :       .create( stat.now(), 10u );
      38           2 :   t << nothing;
      39           1 : }
      40             : 
      41           3 : UNIT(wrtstat2, "")
      42             : {
      43             :   using namespace fas::testing;
      44             :   
      45           1 :   wrtstat::meter_manager::options_type opt;
      46           1 :   opt.resolution = wrtstat::resolutions::none;
      47           2 :   wrtstat::meter_manager stat(opt);
      48           1 :   wrtstat::id_t id = stat.create_aggregator( "test1", 0 );
      49             :   // bool add(id_t id, time_type ts_now, value_type v, size_type cnt)
      50           1 :   stat.add(id, 0, 0, 1);
      51           1 :   stat.add(id, 1, 0, 1);
      52           2 :   auto pag = stat.pop(id);
      53           1 :   t << is_true<assert>(pag!=nullptr) << FAS_FL;
      54           1 :   t << stop;
      55           1 :   t << equal<expect, wrtstat::value_type>(pag->count, 1) << FAS_FL;
      56           2 :   t << nothing;
      57           1 : }
      58             : 
      59             : template<typename ... Args>
      60           0 : void unused_params(const Args& ...)
      61             : {
      62             :   
      63           0 : }
      64             : 
      65           3 : UNIT(wrtstat3, "")
      66             : {
      67             :   using namespace fas::testing;
      68           1 :   t << flush;
      69           1 :   wrtstat::meter_manager::options_type opt;
      70           1 :   opt.resolution = wrtstat::resolutions::microseconds;
      71           1 :   opt.aggregation_step_ts = 1000000;
      72             :   /*opt.reducer_limit = 256;
      73             :   opt.reducer_levels = 256;
      74             :   opt.pool_size = 256;*/
      75           1 :   opt.prefixes={"a~~"/*, "b~~", "c~~", "d~~", "e~~", "f~~"*/};
      76             :   
      77           1 :   int test = 0;
      78             : //#error TODO передавать имя!! и убрать удаление счетчиков, иначе ссылка будет не дествительна, а по значению захватывать не эффективно 
      79           1 :   opt.handler=[&test, &t](const std::string& name, wrtstat::aggregated_data::ptr ag){
      80           0 :     ++test ;
      81           0 :     unused_params(t, name, ag);
      82           0 :     t << message(name) << " count=" << ag->count << " 80%=" << ag->perc80 << " 100%=" << ag->perc100 << " max=" << ag->max << " lossy=" << ag->lossy;
      83           0 :   };
      84             :   //opt.handler=[](const std::string& , wrtstat::aggregated_data::ptr ) {};
      85           2 :   wrtstat::meter_manager stat(opt);
      86             :   
      87           2 :   std::map<size_t, size_t> test_map;
      88             :   //auto meter = stat.create_multi_meter_factory<std::chrono::nanoseconds>("time1", "size1", "size2", true);
      89           2 :   auto meter = stat.create_composite_multi_meter<std::chrono::nanoseconds>("", "", "size2", true);
      90             :   //auto meter = stat.create_multi_meter_factory<std::chrono::nanoseconds>("time1");
      91             :   //auto meter = stat.create_composite_meter_factory<std::chrono::nanoseconds>("time1", "size1", "size2", false);
      92             :   //auto meter = stat.create_time_meter_factory<std::chrono::microseconds>("time1");
      93           1 :   auto start = std::chrono::steady_clock::now();
      94           2 :   for (size_t i = 0 ; i < COUNT; ++i)
      95             :   {
      96           1 :     auto m = meter.create(1UL, std::rand()%100, 0);
      97             :     //auto m = meter->create(1UL, 0UL, 0UL);
      98          11 :     for (int j=0;j<10; ++j)
      99          10 :       test_map[i]++;
     100           1 :     m.set_write_size(std::rand()%1000);
     101             :     //m.reset();
     102             :   }
     103           1 :   auto finish = std::chrono::steady_clock::now();
     104           1 :   time_t span_mks = std::chrono::duration_cast<std::chrono::microseconds>(finish -start).count();
     105           2 :   t << message("COUNT=") << COUNT << " tests=" << test << " time=" << span_mks << "mks rate=" << (COUNT*1000000L)/span_mks;
     106             :   //t << equal<assert>(test, 10) << FAS_FL;
     107           1 : }
     108             : 
     109             : 
     110           3 : UNIT(wrtstat4, "")
     111             : {
     112             :   using namespace fas::testing;
     113           1 :   t << flush;
     114           1 :   wrtstat::wrtstat::options_type opt;
     115           1 :   opt.resolution = wrtstat::resolutions::microseconds;
     116           1 :   opt.aggregation_step_ts = 1000000;
     117           1 :   opt.reducer_limit = 256;
     118           1 :   opt.reducer_levels = 256;
     119           1 :   opt.pool_size = 256;
     120           1 :   opt.prefixes={"a~~", "b~~", "c~~", "d~~", "e~~", "f~~"};
     121             :   
     122           1 :   int test = 0;
     123             : //#error TODO передавать имя!! и убрать удаление счетчиков, иначе ссылка будет не дествительна, а по значению захватывать не эффективно 
     124           1 :   opt.handler=[&test, &t](const std::string& name, wrtstat::aggregated_data::ptr ag){
     125           0 :     ++test ;
     126           0 :     unused_params(t, name, ag);
     127           0 :     t << message(name) << " count=" << ag->count << " 80%=" << ag->perc80 << " 100%=" << ag->perc100 << " max=" << ag->max << " lossy=" << ag->lossy;
     128           0 :   };
     129             :   //opt.handler=[](const std::string& , wrtstat::aggregated_data::ptr ) {};
     130           2 :   wrtstat::meter_manager stat(opt);
     131             :   
     132           2 :   std::map<size_t, size_t> test_map;
     133             :   //auto meter = stat.create_multi_meter_factory<std::chrono::nanoseconds>("time1", "size1", "size2", true);
     134           2 :   auto meter = stat.create_composite_multi_meter<std::chrono::nanoseconds>("", "", "size2", true);
     135             :   /*auto meter = stat.create_multi_meter_factory<std::chrono::nanoseconds>("time1");
     136             :   auto meter = stat.create_composite_meter_factory<std::chrono::nanoseconds>("time1", "size1", "size2", false);
     137             :   auto meter = stat.create_time_meter_factory<std::chrono::microseconds>("time1");*/
     138           1 :   auto start = std::chrono::steady_clock::now();
     139           2 :   for (size_t i = 0 ; i < COUNT; ++i)
     140             :   {
     141           1 :     auto m = meter.create(1UL, std::rand()%100, 0);
     142             :     //auto m = meter->create(1UL, 0UL, 0UL);
     143          11 :     for (int j=0;j<10; ++j)
     144          10 :       test_map[i]++;
     145           1 :     m.set_write_size(std::rand()%1000);
     146             :     //m.reset();
     147             :   }
     148             :   
     149           1 :   auto finish = std::chrono::steady_clock::now();
     150           1 :   time_t span_mks = std::chrono::duration_cast<std::chrono::microseconds>(finish -start).count();
     151           1 :   t << message("COUNT=") << COUNT << " tests=" << test << " time=" << span_mks << "mks rate=" << (COUNT*1000000L)/span_mks;
     152           1 :   t << equal<assert>( stat.aggregators_count(), 7ul) << FAS_FL;
     153             :   
     154           1 :   wrtstat::aggregator_registry::options_type opt2;
     155           2 :   wrtstat::aggregator_registry ar(opt2, 0,0,0);
     156           2 :   t << equal<assert>( ar.aggregators_count(), 0ul) << FAS_FL;
     157           1 : }
     158             : 
     159             : }
     160             : 
     161           1 : BEGIN_SUITE(wrtstat, "")
     162             :   ADD_UNIT(wrtstat1)
     163             :   ADD_UNIT(wrtstat2)
     164             :   ADD_UNIT(wrtstat3)
     165             :   ADD_UNIT(wrtstat4)
     166           7 : END_SUITE(wrtstat)
     167             : 

Generated by: LCOV version 1.10