]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common: write more of unit test, leave base_counters out of cache wip-rgw-labeled-perf-counters-cache
authorAli Maredia <amaredia@redhat.com>
Mon, 5 Dec 2022 21:29:43 +0000 (16:29 -0500)
committerAli Maredia <amaredia@redhat.com>
Mon, 5 Dec 2022 21:29:43 +0000 (16:29 -0500)
Signed-off-by: Ali Maredia <amaredia@redhat.com>
src/common/perf_counters_cache.h
src/test/perf_counters_cache.cc

index cbe7f84205baa4a8aa78ba82eb673a8d5fd7fca5..2e874c6d27a680c339b27e9fc0200644204099a7 100644 (file)
@@ -60,6 +60,10 @@ private:
 
 public:
 
+  size_t get_cache_size() {
+    return curr_size;
+  }
+
   PerfCounters* get(std::string key) {
     auto got = cache.find(key);
     if(got != cache.end()) {
@@ -202,13 +206,24 @@ public:
       delete it->second;
       curr_size--;
     }
+    ceph_assert(base_counters);
+    cct->get_perfcounters_collection()->remove(base_counters);
+    delete base_counters;
   }
 
   PerfCountersCache(CephContext *_cct, bool _eviction, size_t _target_size, int _lower_bound, int _upper_bound, 
       std::function<void(PerfCountersBuilder*)> _lpcb_init, std::string _base_counters_name) : cct(_cct), 
       eviction(_eviction), target_size(_target_size), lower_bound(_lower_bound), upper_bound(_upper_bound), 
       lpcb_init(_lpcb_init) {
-      base_counters = add(_base_counters_name, false);
+
+      // create base counters
+      auto lpcb = new PerfCountersBuilder(cct, _base_counters_name, lower_bound, upper_bound, false);
+      lpcb_init(lpcb);
+
+      base_counters = lpcb->create_perf_counters();
+      delete lpcb;
+
+      cct->get_perfcounters_collection()->add(base_counters);
   }
 
   ~PerfCountersCache() {}
index 534876e46167f365c55f78836009b2cb385d33b6..5858b42fcd00b557b59a67606a53ea500f13879b 100644 (file)
@@ -50,18 +50,11 @@ int main(int argc, char **argv) {
   return RUN_ALL_TESTS();
 }
 
-TEST(PerfCountersCache, NoCacheTest) {
-  AdminSocketClient client(get_rand_socket_path());
-  std::string message;
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf dump\" }", &message));
-  ASSERT_EQ("{}\n", message);
-}
-
 enum {
   TEST_PERFCOUNTERS1_ELEMENT_FIRST = 200,
-  TEST_PERFCOUNTERS1_ELEMENT_1,
-  TEST_PERFCOUNTERS1_ELEMENT_2,
-  TEST_PERFCOUNTERS1_ELEMENT_3,
+  TEST_PERFCOUNTERS_COUNTER,
+  TEST_PERFCOUNTERS_TIME,
+  TEST_PERFCOUNTERS_TIME_AVG,
   TEST_PERFCOUNTERS1_ELEMENT_LAST,
 };
 
@@ -78,16 +71,16 @@ std::string sd(const char *c)
 }
 
 void add_test_counters(PerfCountersBuilder *pcb) {
-  pcb->add_u64(TEST_PERFCOUNTERS1_ELEMENT_1, "element1");
-  pcb->add_time(TEST_PERFCOUNTERS1_ELEMENT_2, "element2");
-  pcb->add_time_avg(TEST_PERFCOUNTERS1_ELEMENT_3, "element3");
+  pcb->add_u64(TEST_PERFCOUNTERS_COUNTER, "test_counter");
+  pcb->add_time(TEST_PERFCOUNTERS_TIME, "test_time");
+  pcb->add_time_avg(TEST_PERFCOUNTERS_TIME_AVG, "test_time_avg");
 }
 
-static PerfCountersCache* setup_test_perf_counters_cache(CephContext *cct)
+
+static PerfCountersCache* setup_test_perf_counters_cache(CephContext *cct, bool eviction = false, uint64_t target_size = 100)
 {
-  uint64_t target_size = 3;
-  bool eviction = false;
-  return new PerfCountersCache(cct, eviction, target_size, TEST_PERFCOUNTERS1_ELEMENT_FIRST, TEST_PERFCOUNTERS1_ELEMENT_LAST, add_test_counters, "test_base_counters");
+  std::string base_counters_name = "test_base_counters";
+  return new PerfCountersCache(cct, eviction, target_size, TEST_PERFCOUNTERS1_ELEMENT_FIRST, TEST_PERFCOUNTERS1_ELEMENT_LAST, add_test_counters, base_counters_name);
 }
 
 void cleanup_test(PerfCountersCache *pcc) {
@@ -95,185 +88,141 @@ void cleanup_test(PerfCountersCache *pcc) {
   delete pcc;
 }
 
-TEST(PerfCountersCache, SingleCacheEntry) {
-  PerfCountersCache *pcc = setup_test_perf_counters_cache(g_ceph_context);
-
+TEST(PerfCountersCache, NoCacheTest) {
   AdminSocketClient client(get_rand_socket_path());
   std::string message;
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\" }", &message));
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf dump\" }", &message));
+  ASSERT_EQ("{}\n", message);
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf schema\" }", &message));
   ASSERT_EQ("{}\n", message);
-  //ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &msg));
-
-
-
-  cleanup_test(pcc);
-
-  /*
-  PerfCountersCollection *coll = g_ceph_context->get_perfcounters_collection();
-  PerfCounters* fake_pf = setup_test_perfcounters1(g_ceph_context);
-  coll->add(fake_pf);
-  AdminSocketClient client(get_rand_socket_path());
-  std::string msg;
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":0,"
-           "\"element2\":0.000000000,\"element3\":{\"avgcount\":0,\"sum\":0.000000000,\"avgtime\":0.000000000}}}"), msg);
-  fake_pf->inc(TEST_PERFCOUNTERS1_ELEMENT_1);
-  fake_pf->tset(TEST_PERFCOUNTERS1_ELEMENT_2, utime_t(0, 500000000));
-  fake_pf->tinc(TEST_PERFCOUNTERS1_ELEMENT_3, utime_t(100, 0));
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":1,"
-           "\"element2\":0.500000000,\"element3\":{\"avgcount\":1,\"sum\":100.000000000,\"avgtime\":100.000000000}}}"), msg);
-  fake_pf->tinc(TEST_PERFCOUNTERS1_ELEMENT_3, utime_t());
-  fake_pf->tinc(TEST_PERFCOUNTERS1_ELEMENT_3, utime_t(20,0));
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":1,\"element2\":0.500000000,"
-           "\"element3\":{\"avgcount\":3,\"sum\":120.000000000,\"avgtime\":40.000000000}}}"), msg);
-
-  fake_pf->reset();
-  msg.clear();
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":1,"
-           "\"element2\":0.000000000,\"element3\":{\"avgcount\":0,\"sum\":0.000000000,\"avgtime\":0.000000000}}}"), msg);
-  */
 }
 
-/*
-
-static PerfCounters* setup_test_perfcounters1(CephContext *cct)
-{
-  PerfCountersBuilder bld(cct, "test_perfcounter_1",
-         TEST_PERFCOUNTERS1_ELEMENT_FIRST, TEST_PERFCOUNTERS1_ELEMENT_LAST);
-  bld.add_u64(TEST_PERFCOUNTERS1_ELEMENT_1, "element1");
-  bld.add_time(TEST_PERFCOUNTERS1_ELEMENT_2, "element2");
-  bld.add_time_avg(TEST_PERFCOUNTERS1_ELEMENT_3, "element3");
-  return bld.create_perf_counters();
+TEST(PerfCountersCache, AddLabel) {
+  PerfCountersCache *pcc = setup_test_perf_counters_cache(g_ceph_context);
+  size_t cache_size = pcc->get_cache_size();
+  ASSERT_EQ(cache_size, 0);
+
+  std::string label = "testlabel1";
+  pcc->add(label);
+  cache_size = pcc->get_cache_size();
+  ASSERT_EQ(cache_size, 1);
+
+  std::string label2 = "testlabel2";
+  std::string label3 = "testlabel3";
+  pcc->add(label2);
+  pcc->add(label3);
+  cache_size = pcc->get_cache_size();
+  ASSERT_EQ(cache_size, 3);
+  cleanup_test(pcc);
 }
 
-enum {
-  TEST_PERFCOUNTERS2_ELEMENT_FIRST = 400,
-  TEST_PERFCOUNTERS2_ELEMENT_FOO,
-  TEST_PERFCOUNTERS2_ELEMENT_BAR,
-  TEST_PERFCOUNTERS2_ELEMENT_LAST,
-};
-
-static PerfCounters* setup_test_perfcounter2(CephContext *cct)
-{
-  PerfCountersBuilder bld(cct, "test_perfcounter_2",
-         TEST_PERFCOUNTERS2_ELEMENT_FIRST, TEST_PERFCOUNTERS2_ELEMENT_LAST);
-  bld.add_u64(TEST_PERFCOUNTERS2_ELEMENT_FOO, "foo");
-  bld.add_time(TEST_PERFCOUNTERS2_ELEMENT_BAR, "bar");
-  return bld.create_perf_counters();
-}
+TEST(PerfCountersCache, TestEviction) {
+  PerfCountersCache *pcc = setup_test_perf_counters_cache(g_ceph_context, true, 4);
+  std::string label1 = "testlabel1";
+  std::string label2 = "testlabel2";
+  std::string label3 = "testlabel3";
+  std::string label4 = "testlabel4";
+  std::string label5 = "testlabel5";
+  std::string label6 = "testlabel6";
+
+  pcc->add(label1);
+  pcc->add(label2);
+  pcc->add(label3);
+  pcc->add(label4);
+  size_t cache_size = pcc->get_cache_size();
+  ASSERT_EQ(cache_size, 4);
 
-TEST(PerfCounters, MultiplePerfCounters) {
-  PerfCountersCollection *coll = g_ceph_context->get_perfcounters_collection();
-  coll->clear();
-  PerfCounters* fake_pf1 = setup_test_perfcounters1(g_ceph_context);
-  PerfCounters* fake_pf2 = setup_test_perfcounter2(g_ceph_context);
-  coll->add(fake_pf1);
-  coll->add(fake_pf2);
   AdminSocketClient client(get_rand_socket_path());
-  std::string msg;
-
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":0,\"element2\":0.000000000,\"element3\":"
-           "{\"avgcount\":0,\"sum\":0.000000000,\"avgtime\":0.000000000}},\"test_perfcounter_2\":{\"foo\":0,\"bar\":0.000000000}}"), msg);
-
-  fake_pf1->inc(TEST_PERFCOUNTERS1_ELEMENT_1);
-  fake_pf1->inc(TEST_PERFCOUNTERS1_ELEMENT_1, 5);
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":6,\"element2\":0.000000000,\"element3\":"
-           "{\"avgcount\":0,\"sum\":0.000000000,\"avgtime\":0.000000000}},\"test_perfcounter_2\":{\"foo\":0,\"bar\":0.000000000}}"), msg);
-
-  coll->reset(string("test_perfcounter_1"));
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":6,\"element2\":0.000000000,\"element3\":"
-           "{\"avgcount\":0,\"sum\":0.000000000,\"avgtime\":0.000000000}},\"test_perfcounter_2\":{\"foo\":0,\"bar\":0.000000000}}"), msg);
-
-  fake_pf1->inc(TEST_PERFCOUNTERS1_ELEMENT_1);
-  fake_pf1->inc(TEST_PERFCOUNTERS1_ELEMENT_1, 6);
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":13,\"element2\":0.000000000,\"element3\":"
-           "{\"avgcount\":0,\"sum\":0.000000000,\"avgtime\":0.000000000}},\"test_perfcounter_2\":{\"foo\":0,\"bar\":0.000000000}}"), msg);
-
-  coll->reset(string("all"));
-  msg.clear();
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":13,\"element2\":0.000000000,\"element3\":"
-           "{\"avgcount\":0,\"sum\":0.000000000,\"avgtime\":0.000000000}},\"test_perfcounter_2\":{\"foo\":0,\"bar\":0.000000000}}"), msg);
-
-  coll->remove(fake_pf2);
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":13,\"element2\":0.000000000,"
-           "\"element3\":{\"avgcount\":0,\"sum\":0.000000000,\"avgtime\":0.000000000}}}"), msg);
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf schema\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":{\"type\":2,\"metric_type\":\"gauge\",\"value_type\":\"integer\",\"description\":\"\",\"nick\":\"\",\"priority\":0,\"units\":\"none\"},\"element2\":{\"type\":1,\"metric_type\":\"gauge\",\"value_type\":\"real\",\"description\":\"\",\"nick\":\"\",\"priority\":0,\"units\":\"none\"},\"element3\":{\"type\":5,\"metric_type\":\"gauge\",\"value_type\":\"real-integer-pair\",\"description\":\"\",\"nick\":\"\",\"priority\":0,\"units\":\"none\"}}}"), msg);
-  coll->clear();
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ("{}", msg);
+  std::string message;
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf dump\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"testlabel1\":{},\"testlabel2\":{},\"testlabel3\":{},\"testlabel4\":{}}", message);
+
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf schema\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"testlabel1\":{},\"testlabel2\":{},\"testlabel3\":{},\"testlabel4\":{}}", message);
+
+  pcc->add(label5);
+  pcc->add(label6);
+  cache_size = pcc->get_cache_size();
+  ASSERT_EQ(cache_size, 4);
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf dump\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"testlabel3\":{},\"testlabel4\":{},\"testlabel5\":{},\"testlabel6\":{}}", message);
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf schema\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"testlabel3\":{},\"testlabel4\":{},\"testlabel5\":{},\"testlabel6\":{}}", message);
+  cleanup_test(pcc);
 }
 
-TEST(PerfCounters, ResetPerfCounters) {
-  AdminSocketClient client(get_rand_socket_path());
-  std::string msg;
-  PerfCountersCollection *coll = g_ceph_context->get_perfcounters_collection();
-  coll->clear();
-  PerfCounters* fake_pf1 = setup_test_perfcounters1(g_ceph_context);
-  coll->add(fake_pf1);
-
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf reset\", \"var\": \"all\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"success\":\"perf reset all\"}"), msg);
-
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf reset\", \"var\": \"test_perfcounter_1\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"success\":\"perf reset test_perfcounter_1\"}"), msg);
+TEST(PerfCountersCache, TestNoEviction) {
+  PerfCountersCache *pcc = setup_test_perf_counters_cache(g_ceph_context, false, 3);
+  std::string label1 = "testlabel1";
+  std::string label2 = "testlabel2";
+  std::string label3 = "testlabel3";
+  std::string label4 = "testlabel4";
+  std::string label5 = "testlabel5";
 
-  coll->clear();
-  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf reset\", \"var\": \"test_perfcounter_1\", \"format\": \"json\" }", &msg));
-  ASSERT_EQ(sd("{\"error\":\"Not find: test_perfcounter_1\"}"), msg);
-}
-
-enum {
-  TEST_PERFCOUNTERS3_ELEMENT_FIRST = 400,
-  TEST_PERFCOUNTERS3_ELEMENT_READ,
-  TEST_PERFCOUNTERS3_ELEMENT_LAST,
-};
+  pcc->add(label1);
+  pcc->add(label2);
+  pcc->add(label3);
+  size_t cache_size = pcc->get_cache_size();
+  ASSERT_EQ(cache_size, 3);
 
-static std::shared_ptr<PerfCounters> setup_test_perfcounter3(CephContext* cct) {
-  PerfCountersBuilder bld(cct, "test_percounter_3",
-      TEST_PERFCOUNTERS3_ELEMENT_FIRST, TEST_PERFCOUNTERS3_ELEMENT_LAST);
-  bld.add_time_avg(TEST_PERFCOUNTERS3_ELEMENT_READ, "read_avg");
-  std::shared_ptr<PerfCounters> p(bld.create_perf_counters());
-  return p;
+  AdminSocketClient client(get_rand_socket_path());
+  std::string message;
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf dump\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"testlabel1\":{},\"testlabel2\":{},\"testlabel3\":{}}", message);
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf schema\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"testlabel1\":{},\"testlabel2\":{},\"testlabel3\":{}}", message);
+
+  pcc->add(label4);
+  pcc->add(label5);
+  cache_size = pcc->get_cache_size();
+  ASSERT_EQ(cache_size, 5);
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf dump\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"testlabel1\":{},\"testlabel2\":{},\"testlabel3\":{},\"testlabel4\":{},\"testlabel5\":{}}", message);
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf schema\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"testlabel1\":{},\"testlabel2\":{},\"testlabel3\":{},\"testlabel4\":{},\"testlabel5\":{}}", message);
+  cleanup_test(pcc);
 }
 
-static void counters_inc_test(std::shared_ptr<PerfCounters> fake_pf) {
-  int i = 100000;
-  utime_t t;
-
-  // set to 1 nsec
-  t.set_from_double(0.000000001);
-  while (i--) {
-    // increase by one, make sure data.u64 equal to data.avgcount
-    fake_pf->tinc(TEST_PERFCOUNTERS3_ELEMENT_READ, t);
-  }
-}
+TEST(PerfCountersCache, TestCacheCounter) {
+  PerfCountersCache *pcc = setup_test_perf_counters_cache(g_ceph_context, false, 3);
+  std::string label1 = "testlabel1";
+  std::string label2 = "testlabel2";
+  std::string label3 = "testlabel3";
 
-static void counters_readavg_test(std::shared_ptr<PerfCounters> fake_pf) {
-  int i = 100000;
+  pcc->add(label1);
+  pcc->add(label2);
 
-  while (i--) {
-    std::pair<uint64_t, uint64_t> dat = fake_pf->get_tavg_ns(TEST_PERFCOUNTERS3_ELEMENT_READ);
-    // sum and count should be identical as we increment TEST_PERCOUNTERS_ELEMENT_READ by 1 nsec eveytime
-    ASSERT_EQ(dat.first, dat.second);
-  }
-}
+  // test inc()
+  pcc->inc(label1, TEST_PERFCOUNTERS_COUNTER, 1);
+  pcc->inc(label2, TEST_PERFCOUNTERS_COUNTER, 2);
 
-TEST(PerfCounters, read_avg) {
-  std::shared_ptr<PerfCounters> fake_pf = setup_test_perfcounter3(g_ceph_context);
+  AdminSocketClient client(get_rand_socket_path());
+  std::string message;
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf dump\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"testlabel1\":{\"test_counter\":1},\"testlabel2\":{\"test_counter\":2}}", message);
+
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf schema\", \"format\": \"json\"  }", &message));
+  ASSERT_EQ("{\"testlabel1\":{\"test_counter\":{\"type\":2,\"metric_type\":\"gauge\",\"value_type\":\"integer\",\"description\":\"\",\"nick\":\"\",\"priority\":0,\"units\":\"none\"}},\"testlabel2\":{\"test_counter\":{\"type\":2,\"metric_type\":\"gauge\",\"value_type\":\"integer\",\"description\":\"\",\"nick\":\"\",\"priority\":0,\"units\":\"none\"}}}", message);
+
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"test_base_counters\":{\"test_counter\":3,\"test_time\":0.000000000,\"test_time_avg\":{\"avgcount\":0,\"sum\":0.000000000,\"avgtime\":0.000000000}}}", message);
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf schema\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"test_base_counters\":{\"test_counter\":{\"type\":2,\"metric_type\":\"gauge\",\"value_type\":\"integer\",\"description\":\"\",\"nick\":\"\",\"priority\":0,\"units\":\"none\"},\"test_time\":{\"type\":1,\"metric_type\":\"gauge\",\"value_type\":\"real\",\"description\":\"\",\"nick\":\"\",\"priority\":0,\"units\":\"none\"},\"test_time_avg\":{\"type\":5,\"metric_type\":\"gauge\",\"value_type\":\"real-integer-pair\",\"description\":\"\",\"nick\":\"\",\"priority\":0,\"units\":\"none\"}}}", message);
+
+  // test dec()
+  pcc->dec(label2, TEST_PERFCOUNTERS_COUNTER, 1);
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf dump\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"testlabel1\":{\"test_counter\":1},\"testlabel2\":{\"test_counter\":1}}", message);
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"test_base_counters\":{\"test_counter\":2,\"test_time\":0.000000000,\"test_time_avg\":{\"avgcount\":0,\"sum\":0.000000000,\"avgtime\":0.000000000}}}", message);
+
+  // test set_counters()
+  pcc->add(label3);
+  pcc->set_counter(label3, TEST_PERFCOUNTERS_COUNTER, 4);
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"labeledperf dump\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"testlabel1\":{\"test_counter\":1},\"testlabel2\":{\"test_counter\":1},\"testlabel3\":{\"test_counter\":4}}", message);
+  ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &message));
+  ASSERT_EQ("{\"test_base_counters\":{\"test_counter\":6,\"test_time\":0.000000000,\"test_time_avg\":{\"avgcount\":0,\"sum\":0.000000000,\"avgtime\":0.000000000}}}", message);
 
-  std::thread t1(counters_inc_test, fake_pf);
-  std::thread t2(counters_readavg_test, fake_pf);
-  t2.join();
-  t1.join();
+  cleanup_test(pcc);
 }
-*/