create an stl-compatible wrapper around aos_sync mutexes and use it

Change-Id: I1f7ec0c5366b0ef985563225365db18dec8b70bd
diff --git a/aos/common/stl_mutex_test.cc b/aos/common/stl_mutex_test.cc
new file mode 100644
index 0000000..7d84416
--- /dev/null
+++ b/aos/common/stl_mutex_test.cc
@@ -0,0 +1,74 @@
+#include "aos/common/stl_mutex.h"
+
+#include "gtest/gtest.h"
+
+#include "aos/common/queue_testutils.h"
+#include "aos/common/util/thread.h"
+#include "aos/common/die.h"
+
+namespace aos {
+namespace testing {
+
+class StlMutexDeathTest : public ::testing::Test {
+ protected:
+  void SetUp() override {
+    ::aos::common::testing::EnableTestLogging();
+    SetDieTestMode(true);
+  }
+};
+
+typedef StlMutexDeathTest StlRecursiveMutexDeathTest;
+
+// Tests that locking/unlocking without any blocking works.
+TEST(StlMutexTest, Basic) {
+  stl_mutex mutex;
+
+  mutex.lock();
+  mutex.unlock();
+
+  ASSERT_TRUE(mutex.try_lock());
+  ASSERT_FALSE(mutex.try_lock());
+  mutex.unlock();
+
+  mutex.lock();
+  ASSERT_FALSE(mutex.try_lock());
+  mutex.unlock();
+}
+
+// Tests that unlocking an unlocked mutex fails.
+TEST_F(StlMutexDeathTest, MultipleUnlock) {
+  stl_mutex mutex;
+  mutex.lock();
+  mutex.unlock();
+  EXPECT_DEATH(mutex.unlock(), ".*multiple unlock.*");
+}
+
+// Tests that locking/unlocking (including recursively) without any blocking
+// works.
+TEST(StlRecursiveMutexTest, Basic) {
+  stl_recursive_mutex mutex;
+
+  mutex.lock();
+  mutex.unlock();
+
+  ASSERT_TRUE(mutex.try_lock());
+  ASSERT_TRUE(mutex.try_lock());
+  mutex.unlock();
+  mutex.unlock();
+
+  mutex.lock();
+  ASSERT_TRUE(mutex.try_lock());
+  mutex.unlock();
+	mutex.unlock();
+}
+
+// Tests that unlocking an unlocked recursive mutex fails.
+TEST_F(StlRecursiveMutexDeathTest, MultipleUnlock) {
+  stl_recursive_mutex mutex;
+  mutex.lock();
+  mutex.unlock();
+  EXPECT_DEATH(mutex.unlock(), ".*multiple unlock.*");
+}
+
+}  // namespace testing
+}  // namespace aos