blob: 70089b3ccd1d6bd9bebb003b45982ba7e426619f [file] [log] [blame]
// 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