00001
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 #include "base/scoped_ptr.h"
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
00027 namespace net_instaweb {
00028
00029 class Function;
00030
00031 class SharedMemTestEnv {
00032 public:
00033 virtual ~SharedMemTestEnv();
00034 SharedMemTestEnv() {}
00035
00036 virtual AbstractSharedMem* CreateSharedMemRuntime() = 0;
00037
00043 virtual bool CreateChild(Function* callback) = 0;
00044
00047 virtual void WaitForChildren() = 0;
00048
00050 virtual void ShortSleep() = 0;
00051
00053 virtual void ChildFailed() = 0;
00054
00055 private:
00056 DISALLOW_COPY_AND_ASSIGN(SharedMemTestEnv);
00057 };
00058
00059 class SharedMemTestBase : public testing::Test {
00060 protected:
00061 typedef void (SharedMemTestBase::*TestMethod)();
00062
00063 explicit SharedMemTestBase(SharedMemTestEnv* test_env);
00064
00065 bool CreateChild(TestMethod method);
00066
00068 void TestReadWrite(bool reattach);
00069
00071 void TestLarge();
00072
00074 void TestDistinct();
00075
00077 void TestDestroy();
00078
00081 void TestCreateTwice();
00082
00084 void TestTwoKids();
00085
00087 void TestMutex();
00088
00089 private:
00090 static const int kLarge = 0x1000 - 4;
00091
00092 static const int kNumIncrements = 0xFFFFF;
00093
00094 volatile int* IntPtr(AbstractSharedMemSegment* seg, int offset) {
00095 return reinterpret_cast<volatile int*>(&seg->Base()[offset]);
00096 }
00097
00098 AbstractSharedMemSegment* CreateDefault();
00099 AbstractSharedMemSegment* AttachDefault();
00100 void DestroyDefault();
00101
00103 void WriteSeg1Child();
00104
00106 void WriteSeg2Child();
00107
00108 void TestReadWriteChild();
00109 void TestLargeChild();
00110 void TwoKidsChild1();
00111 void TwoKidsChild2();
00112
00113 bool IncrementStorm(AbstractSharedMemSegment* seg, size_t mutex_size);
00114
00115 void MutexChild();
00116
00117 scoped_ptr<SharedMemTestEnv> test_env_;
00118 scoped_ptr<AbstractSharedMem> shmem_runtime_;
00119 MockMessageHandler handler_;
00120
00121 DISALLOW_COPY_AND_ASSIGN(SharedMemTestBase);
00122 };
00123
00126 template<typename ConcreteTestEnv>
00127 class SharedMemTestTemplate : public SharedMemTestBase {
00128 public:
00129 SharedMemTestTemplate() : SharedMemTestBase(new ConcreteTestEnv) {
00130 }
00131 };
00132
00133 TYPED_TEST_CASE_P(SharedMemTestTemplate);
00134
00135 TYPED_TEST_P(SharedMemTestTemplate, TestRewrite) {
00136 SharedMemTestBase::TestReadWrite(false);
00137 }
00138
00139 TYPED_TEST_P(SharedMemTestTemplate, TestRewriteReattach) {
00140 SharedMemTestBase::TestReadWrite(true);
00141 }
00142
00143 TYPED_TEST_P(SharedMemTestTemplate, TestLarge) {
00144 SharedMemTestBase::TestLarge();
00145 }
00146
00147 TYPED_TEST_P(SharedMemTestTemplate, TestDistinct) {
00148 SharedMemTestBase::TestDistinct();
00149 }
00150
00151 TYPED_TEST_P(SharedMemTestTemplate, TestDestroy) {
00152 SharedMemTestBase::TestDestroy();
00153 }
00154
00155 TYPED_TEST_P(SharedMemTestTemplate, TestCreateTwice) {
00156 SharedMemTestBase::TestCreateTwice();
00157 }
00158
00159 TYPED_TEST_P(SharedMemTestTemplate, TestTwoKids) {
00160 SharedMemTestBase::TestTwoKids();
00161 }
00162
00163 TYPED_TEST_P(SharedMemTestTemplate, TestMutex) {
00164 SharedMemTestBase::TestMutex();
00165 }
00166
00167 REGISTER_TYPED_TEST_CASE_P(SharedMemTestTemplate, TestRewrite,
00168 TestRewriteReattach, TestLarge, TestDistinct,
00169 TestDestroy, TestCreateTwice, TestTwoKids,
00170 TestMutex);
00171
00172 }
00173
00174 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_SHARED_MEM_TEST_BASE_H_