1053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com/* 2053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com * Copyright 2011 Google Inc. All Rights Reserved. 3053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com * 4053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com * Licensed under the Apache License, Version 2.0 (the "License"); 5053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com * you may not use this file except in compliance with the License. 6053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com * You may obtain a copy of the License at 7053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com * 8053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com * http://www.apache.org/licenses/LICENSE-2.0 9053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com * 10053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com * Unless required by applicable law or agreed to in writing, software 11053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com * distributed under the License is distributed on an "AS IS" BASIS, 12053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com * See the License for the specific language governing permissions and 14053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com * limitations under the License. 15053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com */ 16053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 17053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com#include <stdlib.h> 18053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 19053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com#include "gtest/gtest.h" 20053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com#include "sfntly/port/lock.h" 21053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com#include "test/platform_thread.h" 22053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 23053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.comnamespace sfntly { 24053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 25053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com// Basic test to make sure that Acquire()/Unlock()/Try() don't crash 26053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 27053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.comclass BasicLockTestThread : public PlatformThread::Delegate { 28053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com public: 29053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com BasicLockTestThread(Lock* lock) : lock_(lock), acquired_(0) {} 30053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 31053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com virtual void ThreadMain() { 32053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com for (int i = 0; i < 10; i++) { 33053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock_->Acquire(); 34053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com acquired_++; 35053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock_->Unlock(); 36053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 37053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com for (int i = 0; i < 10; i++) { 38053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock_->Acquire(); 39053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com acquired_++; 40053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThread::Sleep(rand() % 20); 41053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock_->Unlock(); 42053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 43053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com for (int i = 0; i < 10; i++) { 44053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com if (lock_->Try()) { 45053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com acquired_++; 46053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThread::Sleep(rand() % 20); 47053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock_->Unlock(); 48053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 49053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 50053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 51053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 52053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com int acquired() const { return acquired_; } 53053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 54053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com private: 55053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com Lock* lock_; 56053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com int acquired_; 57053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 58053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com NO_COPY_AND_ASSIGN(BasicLockTestThread); 59053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com}; 60053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 61053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.combool BasicLockTest() { 62053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com Lock lock; 63053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com BasicLockTestThread thread(&lock); 64053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThreadHandle handle = kNullThreadHandle; 65053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 66053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_TRUE(PlatformThread::Create(&thread, &handle)); 67053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 68053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com int acquired = 0; 69053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com for (int i = 0; i < 5; i++) { 70053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock.Acquire(); 71053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com acquired++; 72053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock.Unlock(); 73053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 74053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com for (int i = 0; i < 10; i++) { 75053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock.Acquire(); 76053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com acquired++; 77053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThread::Sleep(rand() % 20); 78053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock.Unlock(); 79053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 80053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com for (int i = 0; i < 10; i++) { 81053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com if (lock.Try()) { 82053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com acquired++; 83053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThread::Sleep(rand() % 20); 84053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock.Unlock(); 85053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 86053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 87053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com for (int i = 0; i < 5; i++) { 88053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock.Acquire(); 89053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com acquired++; 90053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThread::Sleep(rand() % 20); 91053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock.Unlock(); 92053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 93053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 94053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThread::Join(handle); 95053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 96053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_GE(acquired, 20); 97053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_GE(thread.acquired(), 20); 98053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 99053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com return true; 100053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com} 101053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 102053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com// Test that Try() works as expected ------------------------------------------- 103053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 104053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.comclass TryLockTestThread : public PlatformThread::Delegate { 105053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com public: 106053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com TryLockTestThread(Lock* lock) : lock_(lock), got_lock_(false) {} 107053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 108053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com virtual void ThreadMain() { 109053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com got_lock_ = lock_->Try(); 110053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com if (got_lock_) 111053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock_->Unlock(); 112053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 113053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 114053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com bool got_lock() const { return got_lock_; } 115053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 116053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com private: 117053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com Lock* lock_; 118053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com bool got_lock_; 119053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 120053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com NO_COPY_AND_ASSIGN(TryLockTestThread); 121053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com}; 122053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 123053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.combool TryLockTest() { 124053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com Lock lock; 125053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 126053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_TRUE(lock.Try()); 127053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com // We now have the lock.... 128053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 129053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com // This thread will not be able to get the lock. 130053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com { 131053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com TryLockTestThread thread(&lock); 132053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThreadHandle handle = kNullThreadHandle; 133053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 134053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_TRUE(PlatformThread::Create(&thread, &handle)); 135053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 136053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThread::Join(handle); 137053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 138053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_FALSE(thread.got_lock()); 139053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 140053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 141053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock.Unlock(); 142053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 143053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com // This thread will.... 144053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com { 145053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com TryLockTestThread thread(&lock); 146053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThreadHandle handle = kNullThreadHandle; 147053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 148053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_TRUE(PlatformThread::Create(&thread, &handle)); 149053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 150053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThread::Join(handle); 151053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 152053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_TRUE(thread.got_lock()); 153053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com // But it released it.... 154053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_TRUE(lock.Try()); 155053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 156053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 157053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock.Unlock(); 158053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com return true; 159053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com} 160053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 161053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com// Tests that locks actually exclude ------------------------------------------- 162053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 163053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.comclass MutexLockTestThread : public PlatformThread::Delegate { 164053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com public: 165053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com MutexLockTestThread(Lock* lock, int* value) : lock_(lock), value_(value) {} 166053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 167053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com // Static helper which can also be called from the main thread. 168053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com static void DoStuff(Lock* lock, int* value) { 169053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com for (int i = 0; i < 40; i++) { 170053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock->Acquire(); 171053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com int v = *value; 172053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThread::Sleep(rand() % 10); 173053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com *value = v + 1; 174053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com lock->Unlock(); 175053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 176053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 177053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 178053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com virtual void ThreadMain() { 179053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com DoStuff(lock_, value_); 180053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com } 181053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 182053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com private: 183053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com Lock* lock_; 184053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com int* value_; 185053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 186053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com NO_COPY_AND_ASSIGN(MutexLockTestThread); 187053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com}; 188053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 189053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.combool MutexTwoThreads() { 190053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com Lock lock; 191053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com int value = 0; 192053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 193053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com MutexLockTestThread thread(&lock, &value); 194053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThreadHandle handle = kNullThreadHandle; 195053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 196053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_TRUE(PlatformThread::Create(&thread, &handle)); 197053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 198053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com MutexLockTestThread::DoStuff(&lock, &value); 199053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 200053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThread::Join(handle); 201053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 202053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_EQ(2 * 40, value); 203053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com return true; 204053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com} 205053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 206053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.combool MutexFourThreads() { 207053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com Lock lock; 208053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com int value = 0; 209053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 210053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com MutexLockTestThread thread1(&lock, &value); 211053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com MutexLockTestThread thread2(&lock, &value); 212053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com MutexLockTestThread thread3(&lock, &value); 213053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThreadHandle handle1 = kNullThreadHandle; 214053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThreadHandle handle2 = kNullThreadHandle; 215053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThreadHandle handle3 = kNullThreadHandle; 216053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 217053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_TRUE(PlatformThread::Create(&thread1, &handle1)); 218053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_TRUE(PlatformThread::Create(&thread2, &handle2)); 219053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_TRUE(PlatformThread::Create(&thread3, &handle3)); 220053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 221053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com MutexLockTestThread::DoStuff(&lock, &value); 222053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 223053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThread::Join(handle1); 224053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThread::Join(handle2); 225053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com PlatformThread::Join(handle3); 226053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 227053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com EXPECT_EQ(4 * 40, value); 228053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com return true; 229053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com} 230053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 231053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com} // namespace sfntly 232053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 233053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.comTEST(LockTest, Basic) { 234053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com ASSERT_TRUE(sfntly::BasicLockTest()); 235053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com} 236053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 237053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.comTEST(LockTest, TryLock) { 238053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com ASSERT_TRUE(sfntly::TryLockTest()); 239053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com} 240053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com 241053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.comTEST(LockTest, Mutex) { 242053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com ASSERT_TRUE(sfntly::MutexTwoThreads()); 243053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com ASSERT_TRUE(sfntly::MutexFourThreads()); 244053885bde4e83c53465ea42257ba056d083afb07arthurhsu@google.com} 245