Page Speed Optimization Libraries
1.5.27.2
|
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_