| // Copyright 2017 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 <fcntl.h> |
| |
| #include <memory> |
| |
| #include <base/bind.h> |
| #include <base/files/file.h> |
| #include <base/files/file_util.h> |
| #include <base/time/time.h> |
| #include <brillo/daemons/daemon.h> |
| #include <brillo/test_helpers.h> |
| #include <gtest/gtest.h> |
| |
| #include "midis/device.h" |
| #include "midis/file_handler.h" |
| #include "midis/tests/test_helper.h" |
| |
| namespace midis { |
| |
| namespace { |
| |
| const char kFakeName1[] = "Sample MIDI Device - 1"; |
| const char kFakeManufacturer1[] = "Foo"; |
| const int kFakeSysNum1 = 2; |
| const int kFakeDevNum1 = 0; |
| const int kFakeSubdevs1 = 1; |
| const int kFakeFlags1 = 7; |
| |
| const char kFakeMidiData1[] = "0xDEADBEEF"; |
| |
| // Store the data in a string buffer inside this class. |
| void PrintReadData(std::string* data, const char* buffer, uint32_t subdevice_id, |
| size_t buf_len) { |
| *data = buffer; |
| } |
| |
| } // namespace |
| |
| class DeviceTest : public ::testing::Test { |
| protected: |
| void SetUp() override { |
| CreateNewTempDirectory(base::FilePath::StringType(), &temp_fp_); |
| message_loop_.SetAsCurrent(); |
| } |
| |
| void TearDown() override { base::DeleteFile(temp_fp_, true); } |
| |
| base::FilePath temp_fp_; |
| |
| private: |
| brillo::BaseMessageLoop message_loop_; |
| }; |
| |
| TEST_F(DeviceTest, TestHandleDeviceRead) { |
| ASSERT_FALSE(temp_fp_.empty()); |
| |
| base::FilePath dev_path = CreateFakeTempSubDir(temp_fp_, "dev/snd"); |
| ASSERT_NE(dev_path.value(), ""); |
| |
| base::FilePath dev_node_path = |
| CreateDevNodeFileName(dev_path, kFakeSysNum1, kFakeDevNum1); |
| |
| // Create a fake devnode and allow a poll on it. |
| ASSERT_EQ(0, base::WriteFile(dev_node_path, nullptr, 0)); |
| ASSERT_TRUE(base::SetPosixFilePermissions( |
| dev_node_path, S_IRGRP | S_IWGRP | S_IRUSR | S_IWUSR)); |
| |
| auto dev = |
| std::make_unique<Device>(kFakeName1, kFakeManufacturer1, kFakeSysNum1, |
| kFakeDevNum1, kFakeSubdevs1, kFakeFlags1); |
| Device::SetBaseDirForTesting(temp_fp_); |
| dev->StartMonitoring(); |
| |
| // Now we cancel the watcher task, since we want to check the function call |
| // manually. |
| const auto& subd_handler = dev->handlers_.begin(); |
| auto& fhandler = subd_handler->second; |
| std::string data; |
| fhandler->SetDeviceDataCbForTesting(base::Bind(&PrintReadData, &data)); |
| fhandler->StopMonitoring(); |
| |
| base::WriteFile(dev_node_path, kFakeMidiData1, sizeof(kFakeMidiData1)); |
| fhandler->HandleDeviceRead(subd_handler->first); |
| EXPECT_EQ(data, kFakeMidiData1); |
| } |
| |
| } // namespace midis |