blob: b87f3995b18416ffca13e71190cfcd718db95724 [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 <base/bind.h>
#include <base/files/file.h>
#include <base/files/file_util.h>
#include <base/memory/ptr_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/test_helper.h"
namespace midis {
namespace {
const char kFakeName1[] = "Sample MIDI Device - 1";
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, int len) {
*data = buffer;
}
} // namespace
class DeviceTest : public ::testing::Test, public brillo::Daemon {
protected:
void SetUp() override {
CreateNewTempDirectory(base::FilePath::StringType(), &temp_fp_);
}
void TearDown() override { base::DeleteFile(temp_fp_, true); }
base::FilePath temp_fp_;
};
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 = base::MakeUnique<Device>(kFakeName1, 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
int main(int argc, char** argv) {
SetUpTests(&argc, argv, true);
return RUN_ALL_TESTS();
}