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