// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "thread_annotations.h"

#include "base/memory/raw_ref.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace {

class LOCKABLE Lock {
 public:
  void Acquire() EXCLUSIVE_LOCK_FUNCTION() {}
  void Release() UNLOCK_FUNCTION() {}
};

class SCOPED_LOCKABLE AutoLock {
 public:
  AutoLock(Lock& lock) EXCLUSIVE_LOCK_FUNCTION(lock) : lock_(lock) {
    lock.Acquire();
  }
  ~AutoLock() UNLOCK_FUNCTION() { lock_->Release(); }

 private:
  const raw_ref<Lock> lock_;
};

class ThreadSafe {
 public:
  void ExplicitIncrement();
  void ImplicitIncrement();

 private:
  Lock lock_;
  int counter_ GUARDED_BY(lock_);
};

void ThreadSafe::ExplicitIncrement() {
  lock_.Acquire();
  ++counter_;
  lock_.Release();
}

void ThreadSafe::ImplicitIncrement() {
  AutoLock auto_lock(lock_);
  counter_++;
}

TEST(ThreadAnnotationsTest, ExplicitIncrement) {
  ThreadSafe thread_safe;
  thread_safe.ExplicitIncrement();
}
TEST(ThreadAnnotationsTest, ImplicitIncrement) {
  ThreadSafe thread_safe;
  thread_safe.ImplicitIncrement();
}

}  // anonymous namespace
