/*
 * Copyright 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include <base/bind.h>
#include <base/callback.h>
#include <base/threading/platform_thread.h>
#include <gtest/gtest.h>
#include <sys/capability.h>
#include <syscall.h>

#include <condition_variable>
#include <memory>
#include <mutex>

#include "osi/include/log.h"

class BaseBindThreadTest : public ::testing::Test {
 public:
 protected:
};

namespace {
struct Vars {
  int a{0};
  int b{0};
  int c{0};

  bool operator==(const Vars& rhs) const {
    return (a == rhs.a && b == rhs.b && c == rhs.c);
  }

} g_vars;

void func() {}
void func_a(int a) { g_vars.a = a; }
void func_ab(int a, int b) {
  func_a(a);
  g_vars.b = b;
}
void func_abc(int a, int b, int c) {
  func_ab(a, b);
  g_vars.c = c;
}
}  // namespace

TEST_F(BaseBindThreadTest, simple) {
  struct Vars v;
  g_vars = {};
  base::Callback<void()> cb0 = base::Bind(&func);
  cb0.Run();
  ASSERT_EQ(g_vars, v);

  v = {};
  v.a = 1;
  g_vars = {};
  base::Callback<void()> cb1 = base::Bind(&func_a, 1);
  cb1.Run();
  ASSERT_EQ(g_vars, v);

  v = {};
  v.a = 1;
  v.b = 2;
  g_vars = {};
  base::Callback<void()> cb2 = base::Bind(&func_ab, 1, 2);
  cb2.Run();
  ASSERT_EQ(g_vars, v);

  v = {};
  v.a = 1;
  v.b = 2;
  v.c = 3;
  g_vars = {};
  base::Callback<void()> cb3 = base::Bind(&func_abc, 1, 2, 3);
  cb3.Run();
  ASSERT_EQ(g_vars, v);
}

TEST_F(BaseBindThreadTest, bind_first_arg) {
  struct Vars v;
  g_vars = {};
  base::Callback<void()> cb0 = base::Bind(&func);
  cb0.Run();
  ASSERT_EQ(g_vars, v);

  v = {};
  v.a = 1;
  g_vars = {};
  base::Callback<void()> cb1 = base::Bind(&func_a, 1);
  cb1.Run();
  ASSERT_EQ(g_vars, v);

  v = {};
  v.a = 1;
  v.b = 2;
  g_vars = {};
  base::Callback<void(int)> cb2 = base::Bind(&func_ab, 1);
  cb2.Run(2);
  ASSERT_EQ(g_vars, v);

  v = {};
  v.a = 1;
  v.b = 2;
  v.c = 3;
  g_vars = {};
  base::Callback<void(int, int)> cb3 = base::Bind(&func_abc, 1);
  cb3.Run(2, 3);
  ASSERT_EQ(g_vars, v);
}
