Add ProducerConsumerQueue::capacity()
[folly.git] / folly / test / ProducerConsumerQueueTest.cpp
index b848690daff180c767c650b0d84491194efa35f8..b6dc84c167c3a259549f390d517c87c3975501b7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2014 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 #include <folly/ProducerConsumerQueue.h>
 
-#include <gtest/gtest.h>
-#include <vector>
 #include <atomic>
 #include <chrono>
 #include <memory>
 #include <thread>
+#include <vector>
+
 #include <glog/logging.h>
 
+#include <folly/portability/GTest.h>
+
 //////////////////////////////////////////////////////////////////////
 
 namespace {
 
-template<class T> struct TestTraits {
+template <class T> struct TestTraits {
   T limit() const { return 1 << 24; }
   T generate() const { return rand() % 26; }
 };
 
-template<> struct TestTraits<std::string> {
+template <> struct TestTraits<std::string> {
   unsigned int limit() const { return 1 << 22; }
   std::string generate() const { return std::string(12, ' '); }
 };
 
-template<class QueueType, size_t Size, bool Pop = false>
+template <class QueueType, size_t Size, bool Pop = false>
 struct PerfTest {
   typedef typename QueueType::value_type T;
 
@@ -90,13 +92,13 @@ struct PerfTest {
   TestTraits<T> traits_;
 };
 
-template<class TestType> void doTest(const char* name) {
+template <class TestType> void doTest(const char* name) {
   LOG(INFO) << "  testing: " << name;
   std::unique_ptr<TestType> const t(new TestType());
   (*t)();
 }
 
-template<class T, bool Pop = false>
+template <class T, bool Pop = false>
 void perfTestType(const char* type) {
   const size_t size = 0xfffe;
 
@@ -105,7 +107,7 @@ void perfTestType(const char* type) {
     "ProducerConsumerQueue");
 }
 
-template<class QueueType, size_t Size, bool Pop>
+template <class QueueType, size_t Size, bool Pop>
 struct CorrectnessTest {
   typedef typename QueueType::value_type T;
 
@@ -160,11 +162,11 @@ struct CorrectnessTest {
         } else {
           goto again;
         }
+        EXPECT_EQ(*data, expect);
       } else {
+        EXPECT_EQ(*data, expect);
         queue_.popFront();
       }
-
-      EXPECT_EQ(*data, expect);
     }
   }
 
@@ -195,7 +197,7 @@ struct CorrectnessTest {
   std::atomic<bool> done_;
 };
 
-template<class T, bool Pop = false>
+template <class T, bool Pop = false>
 void correctnessTestType(const std::string& type) {
   LOG(INFO) << "Type: " << type;
   doTest<CorrectnessTest<folly::ProducerConsumerQueue<T>,0xfffe,Pop> >(
@@ -205,7 +207,7 @@ void correctnessTestType(const std::string& type) {
 struct DtorChecker {
   static unsigned int numInstances;
   DtorChecker() { ++numInstances; }
-  DtorChecker(const DtorChecker& o) { ++numInstances; }
+  DtorChecker(const DtorChecker& /* o */) { ++numInstances; }
   ~DtorChecker() { --numInstances; }
 };
 
@@ -286,3 +288,8 @@ TEST(PCQ, EmptyFull) {
   EXPECT_FALSE(queue.write(3));
   EXPECT_EQ(queue.sizeGuess(), 2);
 }
+
+TEST(PCQ, Capacity) {
+  folly::ProducerConsumerQueue<int> queue(3);
+  EXPECT_EQ(queue.capacity(), 2); // PCQ max size is buffer size - 1.
+}