Page Speed Optimization Libraries  1.5.27.2
net/instaweb/util/public/shared_mem_test_base.h
Go to the documentation of this file.
00001 // Copyright 2011 Google Inc.
00016 
00017 #ifndef NET_INSTAWEB_UTIL_PUBLIC_SHARED_MEM_TEST_BASE_H_
00018 #define NET_INSTAWEB_UTIL_PUBLIC_SHARED_MEM_TEST_BASE_H_
00019 
00020 #include <cstddef>
00021 
00022 #include "net/instaweb/util/public/abstract_shared_mem.h"
00023 #include "net/instaweb/util/public/basictypes.h"
00024 #include "net/instaweb/util/public/gtest.h"
00025 #include "net/instaweb/util/public/mock_message_handler.h"
00026 #include "net/instaweb/util/public/scoped_ptr.h"
00027 
00028 namespace net_instaweb {
00029 
00030 class Function;
00031 
00032 class SharedMemTestEnv {
00033  public:
00034   virtual ~SharedMemTestEnv();
00035   SharedMemTestEnv() {}
00036 
00037   virtual AbstractSharedMem* CreateSharedMemRuntime() = 0;
00038 
00044   virtual bool CreateChild(Function* callback) = 0;
00045 
00048   virtual void WaitForChildren() = 0;
00049 
00051   virtual void ShortSleep() = 0;
00052 
00054   virtual void ChildFailed() = 0;
00055 
00056  private:
00057   DISALLOW_COPY_AND_ASSIGN(SharedMemTestEnv);
00058 };
00059 
00060 class SharedMemTestBase : public testing::Test {
00061  protected:
00062   typedef void (SharedMemTestBase::*TestMethod)();
00063 
00064   explicit SharedMemTestBase(SharedMemTestEnv* test_env);
00065 
00066   bool CreateChild(TestMethod method);
00067 
00069   void TestReadWrite(bool reattach);
00070 
00072   void TestLarge();
00073 
00075   void TestDistinct();
00076 
00078   void TestDestroy();
00079 
00082   void TestCreateTwice();
00083 
00085   void TestTwoKids();
00086 
00088   void TestMutex();
00089 
00090  private:
00091   static const int kLarge = 0x1000 - 4; 
00092 
00093   static const int kNumIncrements = 0xFFFFF;
00094 
00095   volatile int* IntPtr(AbstractSharedMemSegment* seg, int offset) {
00096     return reinterpret_cast<volatile int*>(&seg->Base()[offset]);
00097   }
00098 
00099   AbstractSharedMemSegment* CreateDefault();
00100   AbstractSharedMemSegment* AttachDefault();
00101   void DestroyDefault();
00102 
00104   void WriteSeg1Child();
00105 
00107   void WriteSeg2Child();
00108 
00109   void TestReadWriteChild();
00110   void TestLargeChild();
00111   void TwoKidsChild1();
00112   void TwoKidsChild2();
00113 
00114   bool IncrementStorm(AbstractSharedMemSegment* seg, size_t mutex_size);
00115 
00116   void MutexChild();
00117 
00118   scoped_ptr<SharedMemTestEnv> test_env_;
00119   scoped_ptr<AbstractSharedMem> shmem_runtime_;
00120   MockMessageHandler handler_;
00121 
00122   DISALLOW_COPY_AND_ASSIGN(SharedMemTestBase);
00123 };
00124 
00127 template<typename ConcreteTestEnv>
00128 class SharedMemTestTemplate : public SharedMemTestBase {
00129  public:
00130   SharedMemTestTemplate() : SharedMemTestBase(new ConcreteTestEnv) {
00131   }
00132 };
00133 
00134 TYPED_TEST_CASE_P(SharedMemTestTemplate);
00135 
00136 TYPED_TEST_P(SharedMemTestTemplate, TestRewrite) {
00137   SharedMemTestBase::TestReadWrite(false);
00138 }
00139 
00140 TYPED_TEST_P(SharedMemTestTemplate, TestRewriteReattach) {
00141   SharedMemTestBase::TestReadWrite(true);
00142 }
00143 
00144 TYPED_TEST_P(SharedMemTestTemplate, TestLarge) {
00145   SharedMemTestBase::TestLarge();
00146 }
00147 
00148 TYPED_TEST_P(SharedMemTestTemplate, TestDistinct) {
00149   SharedMemTestBase::TestDistinct();
00150 }
00151 
00152 TYPED_TEST_P(SharedMemTestTemplate, TestDestroy) {
00153   SharedMemTestBase::TestDestroy();
00154 }
00155 
00156 TYPED_TEST_P(SharedMemTestTemplate, TestCreateTwice) {
00157   SharedMemTestBase::TestCreateTwice();
00158 }
00159 
00160 TYPED_TEST_P(SharedMemTestTemplate, TestTwoKids) {
00161   SharedMemTestBase::TestTwoKids();
00162 }
00163 
00164 TYPED_TEST_P(SharedMemTestTemplate, TestMutex) {
00165   SharedMemTestBase::TestMutex();
00166 }
00167 
00168 REGISTER_TYPED_TEST_CASE_P(SharedMemTestTemplate, TestRewrite,
00169                            TestRewriteReattach, TestLarge, TestDistinct,
00170                            TestDestroy, TestCreateTwice, TestTwoKids,
00171                            TestMutex);
00172 
00173 }  
00174 
00175 #endif  ///< NET_INSTAWEB_UTIL_PUBLIC_SHARED_MEM_TEST_BASE_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines