blob: 2b04a04868e3b0f036282fe1c672cbf613a11bfd [file] [log] [blame] [edit]
// Copyright 2021 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "missive/scheduler/enqueue_job.h"
#include <memory>
#include <string>
#include <utility>
#include <base/functional/bind.h>
#include <base/run_loop.h>
#include <base/task/task_traits.h>
#include <base/task/thread_pool.h>
#include <base/test/task_environment.h>
#include <brillo/dbus/dbus_method_response.h>
#include <brillo/dbus/mock_dbus_method_response.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "missive/health/health_module.h"
#include "missive/health/health_module_delegate_mock.h"
#include "missive/proto/interface.pb.h"
#include "missive/proto/record_constants.pb.h"
#include "missive/storage/storage_module_interface.h"
#include "missive/util/status.h"
#include "missive/util/status_macros.h"
#include "missive/util/test_support_callbacks.h"
#include "missive/util/test_util.h"
namespace reporting {
namespace {
using ::testing::_;
using ::testing::Eq;
using ::testing::Invoke;
using ::testing::NotNull;
using ::testing::StrEq;
using ::testing::WithArgs;
class MockStorageModule : public StorageModuleInterface {
public:
static scoped_refptr<MockStorageModule> Create() {
return base::WrapRefCounted(new MockStorageModule());
}
MOCK_METHOD(void,
AddRecord,
(Priority, Record, base::OnceCallback<void(Status)>),
(override));
MOCK_METHOD(void,
Flush,
(Priority, base::OnceCallback<void(Status)>),
(override));
};
class EnqueueJobTest : public ::testing::Test {
public:
EnqueueJobTest() = default;
protected:
void SetUp() override {
response_ = std::make_unique<
brillo::dbus_utils::MockDBusMethodResponse<EnqueueRecordResponse>>();
record_.set_data("TEST_VALUE");
record_.set_destination(Destination::UPLOAD_EVENTS);
record_.set_dm_token("TEST_DM_TOKEN");
record_.set_timestamp_us(1234567);
health_module_ =
HealthModule::Create(std::make_unique<HealthModuleDelegateMock>());
storage_module_ = MockStorageModule::Create();
}
void TearDown() override {
// Let everything ongoing to finish.
task_environment_.RunUntilIdle();
}
base::test::TaskEnvironment task_environment_;
std::unique_ptr<
brillo::dbus_utils::MockDBusMethodResponse<EnqueueRecordResponse>>
response_;
Record record_;
scoped_refptr<MockStorageModule> storage_module_;
scoped_refptr<HealthModule> health_module_;
};
TEST_F(EnqueueJobTest, CompletesSuccessfully) {
response_->set_return_callback(
base::BindOnce([](const EnqueueRecordResponse& response) {
EXPECT_THAT(response.status().code(), Eq(error::OK));
}));
auto delegate = std::make_unique<EnqueueJob::EnqueueResponseDelegate>(
health_module_, std::move(response_));
EnqueueRecordRequest request;
*request.mutable_record() = record_;
request.set_priority(Priority::BACKGROUND_BATCH);
EXPECT_CALL(*storage_module_, AddRecord(Eq(Priority::BACKGROUND_BATCH),
EqualsProto(record_), _))
.WillOnce(WithArgs<2>(Invoke([](base::OnceCallback<void(Status)> cb) {
std::move(cb).Run(Status::StatusOK());
})));
auto job = EnqueueJob::Create(storage_module_, health_module_, request,
std::move(delegate));
test::TestEvent<Status> enqueued;
job->Start(enqueued.cb());
const Status status = enqueued.result();
EXPECT_OK(status) << status;
}
TEST_F(EnqueueJobTest, CancelsSuccessfully) {
Status failure_status(error::INTERNAL, "Failing for tests");
response_->set_return_callback(base::BindOnce(
[](Status failure_status, const EnqueueRecordResponse& response) {
EXPECT_THAT(response.status().code(), Eq(failure_status.error_code()));
EXPECT_THAT(response.status().error_message(),
StrEq(std::string(failure_status.error_message())));
},
failure_status));
auto delegate = std::make_unique<EnqueueJob::EnqueueResponseDelegate>(
health_module_, std::move(response_));
EnqueueRecordRequest request;
*request.mutable_record() = std::move(record_);
request.set_priority(Priority::BACKGROUND_BATCH);
auto job = EnqueueJob::Create(storage_module_, health_module_, request,
std::move(delegate));
auto status = job->Cancel(failure_status);
EXPECT_OK(status) << status;
}
} // namespace
} // namespace reporting