// Copyright 2018 The Chromium 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 "notification_helper/com_server_module.h"

#include <wrl/client.h>
#include <memory>

#include "base/win/scoped_winrt_initializer.h"
#include "chrome/install_static/install_util.h"
#include "testing/gtest/include/gtest/gtest.h"

class ComServerModuleTest : public testing::Test {
 protected:
  ComServerModuleTest() = default;

  void SetUp() override {
    winrt_initializer_ = std::make_unique<base::win::ScopedWinrtInitializer>();
    ASSERT_TRUE(winrt_initializer_->Succeeded());

    server_module_ = std::make_unique<notification_helper::ComServerModule>();

    // Since the COM class object is registered in the test, the test executable
    // is now the COM server.
    HRESULT hr = server_module_->RegisterClassObjects();
    if (SUCCEEDED(hr))
      class_registration_succeeded_ = true;

    ASSERT_HRESULT_SUCCEEDED(hr);
  }

  void TearDown() override {
    if (class_registration_succeeded_)
      server_module_->UnregisterClassObjects();

    server_module_.reset();
    winrt_initializer_.reset();
  }

  notification_helper::ComServerModule* server_module() {
    return server_module_.get();
  }

 private:
  std::unique_ptr<base::win::ScopedWinrtInitializer> winrt_initializer_;

  // The server module that holds the COM object class.
  std::unique_ptr<notification_helper::ComServerModule> server_module_;

  // A flag indicating if class registration succeeds.
  bool class_registration_succeeded_ = false;

  DISALLOW_COPY_AND_ASSIGN(ComServerModuleTest);
};

TEST_F(ComServerModuleTest, EventSignalTest) {
  // The waitable event starts unsignaled.
  ASSERT_FALSE(server_module()->IsEventSignaled());

  Microsoft::WRL::ComPtr<IUnknown> notification_activator;
  ASSERT_HRESULT_SUCCEEDED(::CoCreateInstance(
      install_static::GetToastActivatorClsid(), nullptr, CLSCTX_LOCAL_SERVER,
      IID_PPV_ARGS(&notification_activator)));

  // An object instance has been created upon the request, and is hold by the
  // server module. Therefore, the waitable event remains unsignaled.
  ASSERT_FALSE(server_module()->IsEventSignaled());

  // Release the instance object. Now that the last (and the only) instance
  // object of the module is released, the event becomes signaled.
  notification_activator.Reset();
  ASSERT_TRUE(server_module()->IsEventSignaled());
}
