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

#include "shill/dbus/dbus_properties_proxy.h"

#include <base/memory/weak_ptr.h>
#include <base/run_loop.h>
#include <base/test/task_environment.h>
#include <gtest/gtest.h>

#include "shill/dbus/fake_properties_proxy.h"

namespace {

const char kInterface[] = "Modem";
const char kProperty1[] = "State";
const char kProperty2[] = "Model";
const brillo::VariantDictionary kTestDictionary = {
    {kProperty1, brillo::Any(1)},
    {kProperty2, brillo::Any("2")},
};

}  // namespace

namespace shill {

class DBusPropertiesProxyTest : public testing::Test {
 public:
  DBusPropertiesProxyTest()
      : dbus_properties_proxy_(
            DBusPropertiesProxy::CreateDBusPropertiesProxyForTesting()) {
    dbus_properties_proxy_->GetFakePropertiesProxyForTesting()
        ->SetDictionaryForTesting(kInterface, kTestDictionary);
  }
  ~DBusPropertiesProxyTest() override = default;

 protected:
  base::test::TaskEnvironment task_environment_{
      base::test::TaskEnvironment::ThreadingMode::MAIN_THREAD_ONLY};
  std::unique_ptr<DBusPropertiesProxy> dbus_properties_proxy_;
  FakePropertiesProxy* fake_properties_proxy_;
  base::WeakPtrFactory<DBusPropertiesProxyTest> weak_factory_{this};
};

TEST_F(DBusPropertiesProxyTest, GetAll) {
  KeyValueStore properties = dbus_properties_proxy_->GetAll(kInterface);
  EXPECT_EQ(properties.properties(), kTestDictionary);
}

TEST_F(DBusPropertiesProxyTest, GetAllAsync) {
  KeyValueStore properties;
  base::RunLoop run_loop;
  dbus_properties_proxy_->GetAllAsync(
      kInterface,
      base::Bind(
          [](base::Closure callback, KeyValueStore* result,
             const KeyValueStore& dict) {
            *result = dict;
            callback.Run();
          },
          run_loop.QuitClosure(), &properties),
      base::Bind(
          [](base::Closure callback, const Error& error) { callback.Run(); },
          run_loop.QuitClosure()));
  EXPECT_EQ(properties.properties(), kTestDictionary);
}

TEST_F(DBusPropertiesProxyTest, Get) {
  brillo::Any property1 = dbus_properties_proxy_->Get(kInterface, kProperty1);
  EXPECT_EQ(property1, kTestDictionary.at(kProperty1));
  brillo::Any property2 = dbus_properties_proxy_->Get(kInterface, kProperty2);
  EXPECT_EQ(property2, kTestDictionary.at(kProperty2));
}

TEST_F(DBusPropertiesProxyTest, GetFailed) {
  const char kBadInterface[] = "bad interface";
  const char kBadProperty[] = "bad property";
  brillo::Any property =
      dbus_properties_proxy_->Get(kBadInterface, kBadProperty);
  EXPECT_TRUE(property.IsEmpty());
}

TEST_F(DBusPropertiesProxyTest, GetAsync) {
  brillo::Any property1;
  base::RunLoop run_loop;
  dbus_properties_proxy_->GetAsync(
      kInterface, kProperty1,
      base::Bind(
          [](base::Closure callback, brillo::Any* result,
             const brillo::Any& value) {
            *result = value;
            callback.Run();
          },
          run_loop.QuitClosure(), &property1),
      base::Bind(
          [](base::Closure callback, const Error& error) { callback.Run(); },
          run_loop.QuitClosure()));
  EXPECT_EQ(property1, kTestDictionary.at(kProperty1));
}

TEST_F(DBusPropertiesProxyTest, GetAsyncFailed) {
  const char kBadInterface[] = "bad interface";
  const char kBadProperty[] = "bad property";
  brillo::Any property;
  Error error;
  base::RunLoop run_loop;
  dbus_properties_proxy_->GetAsync(
      kBadInterface, kBadProperty,
      base::Bind([](base::Closure callback, brillo::Any* result,
                    const brillo::Any& value) { callback.Run(); },
                 run_loop.QuitClosure(), &property),
      base::Bind(
          [](base::Closure callback, Error* errorp, const Error& error) {
            errorp->CopyFrom(error);
            callback.Run();
          },
          run_loop.QuitClosure(), &error));
  EXPECT_TRUE(property.IsEmpty());
  EXPECT_EQ(error.type(), Error::kOperationFailed);
}

}  // namespace shill
