// Copyright 2019 The Fuchsia 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 <lib/ddk/binding.h>
#include <zircon/status.h>
#include <zircon/syscalls.h>

#include <memory>

#include <fbl/unique_fd.h>
#include <gtest/gtest.h>

#include "integration-test.h"

namespace libdriver_integration_test {

class DeviceAddTest : public IntegrationTest {
 protected:
  Promise<void> CreateDevice(std::initializer_list<zx_device_prop_t> props,
                             zx_status_t expected_status,
                             std::unique_ptr<RootMockDevice>* root_device,
                             std::unique_ptr<MockDevice>* child_device) {
    // Copy from props into a vector owned by the lambda, since a capture "by
    // value" of props does not copy deeply.
    std::vector<zx_device_prop_t> properties(props);
    return ExpectBind(root_device, [=, properties = std::move(properties)](
                                       HookInvocation record, Completer<void> completer) {
      ActionList actions;
      actions.AppendAddMockDevice(loop_.dispatcher(), (*root_device)->path(), "first_child",
                                  std::move(properties), expected_status, std::move(completer),
                                  child_device);
      actions.AppendReturnStatus(expected_status);
      return actions;
    });
  }
};

TEST_F(DeviceAddTest, CreateDevice) {
  std::unique_ptr<RootMockDevice> root_device;
  std::unique_ptr<MockDevice> child_device;

  constexpr char kName[] = "sys/test/test/mock/first_child";

  auto promise = CreateDevice(
                     {
                         (zx_device_prop_t){BIND_PCI_VID, 0, 1234},
                     },
                     ZX_OK, &root_device, &child_device)
                     .and_then(DoWaitForPath(kName))
                     .and_then([&]() -> Promise<void> {
                       // Destroy the test device.  This should cause an unbind of the child
                       // device.
                       root_device.reset();
                       return ExpectUnbindThenRelease(child_device);
                     });

  RunPromise(std::move(promise));
}

}  // namespace libdriver_integration_test
