// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/printing/cups_printer_status.h"
#include <string>
#include <vector>
#include "base/test/scoped_mock_clock_override.h"
#include "base/values.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
using CupsPrinterStatusReason = CupsPrinterStatus::CupsPrinterStatusReason;
using CupsReason = CupsPrinterStatus::CupsPrinterStatusReason::Reason;
using CupsSeverity = CupsPrinterStatus::CupsPrinterStatusReason::Severity;
class CupsPrinterStatusTest : public testing::Test {
public:
CupsPrinterStatusTest() = default;
~CupsPrinterStatusTest() override = default;
protected:
base::ScopedMockClockOverride clock_;
};
// Baseline test for creating a chromeos::CupsPrinterStatus.
TEST_F(CupsPrinterStatusTest, CreateCupsPrinterStatus) {
CupsPrinterStatus cups_printer_status("id");
EXPECT_EQ("id", cups_printer_status.GetPrinterId());
EXPECT_EQ(clock_.Now(), cups_printer_status.GetTimestamp());
}
TEST_F(CupsPrinterStatusTest, AddStatusReasons) {
CupsPrinterStatus cups_printer_status("id");
cups_printer_status.AddStatusReason(
CupsPrinterStatusReason::Reason::kNoError,
CupsPrinterStatusReason::Severity::kReport);
cups_printer_status.AddStatusReason(
CupsPrinterStatusReason::Reason::kDoorOpen,
CupsPrinterStatusReason::Severity::kWarning);
EXPECT_EQ(2u, cups_printer_status.GetStatusReasons().size());
EXPECT_EQ("id", cups_printer_status.GetPrinterId());
EXPECT_EQ(clock_.Now(), cups_printer_status.GetTimestamp());
std::vector<CupsPrinterStatus::CupsPrinterStatusReason> expected_reasons{
CupsPrinterStatus::CupsPrinterStatusReason(CupsReason::kNoError,
CupsSeverity::kReport),
CupsPrinterStatus::CupsPrinterStatusReason(CupsReason::kDoorOpen,
CupsSeverity::kWarning)};
EXPECT_THAT(cups_printer_status.GetStatusReasons(), expected_reasons);
}
// Ensure that if printer returns two of the same status but each with different
// severities, make sure both are saved.
TEST_F(CupsPrinterStatusTest, SameReasonDifferentSeverity) {
CupsPrinterStatus cups_printer_status("id");
cups_printer_status.AddStatusReason(
CupsPrinterStatusReason::Reason::kDeviceError,
CupsPrinterStatusReason::Severity::kReport);
cups_printer_status.AddStatusReason(
CupsPrinterStatusReason::Reason::kDeviceError,
CupsPrinterStatusReason::Severity::kWarning);
EXPECT_EQ(2u, cups_printer_status.GetStatusReasons().size());
EXPECT_EQ("id", cups_printer_status.GetPrinterId());
EXPECT_EQ(clock_.Now(), cups_printer_status.GetTimestamp());
std::vector<CupsPrinterStatus::CupsPrinterStatusReason> expected_reasons{
CupsPrinterStatus::CupsPrinterStatusReason(CupsReason::kDeviceError,
CupsSeverity::kReport),
CupsPrinterStatus::CupsPrinterStatusReason(CupsReason::kDeviceError,
CupsSeverity::kWarning)};
EXPECT_THAT(cups_printer_status.GetStatusReasons(), expected_reasons);
}
// Ensure if printer returns the same status and severity twice, duplicates are
// not added to CupsPrinterStatus.
TEST_F(CupsPrinterStatusTest, SameReasonSameSeverity) {
CupsPrinterStatus cups_printer_status("id");
cups_printer_status.AddStatusReason(
CupsPrinterStatusReason::Reason::kPaused,
CupsPrinterStatusReason::Severity::kError);
cups_printer_status.AddStatusReason(
CupsPrinterStatusReason::Reason::kPaused,
CupsPrinterStatusReason::Severity::kError);
EXPECT_EQ(1u, cups_printer_status.GetStatusReasons().size());
EXPECT_EQ("id", cups_printer_status.GetPrinterId());
EXPECT_EQ(clock_.Now(), cups_printer_status.GetTimestamp());
std::vector<CupsPrinterStatus::CupsPrinterStatusReason> expected_reasons{
CupsPrinterStatus::CupsPrinterStatusReason(CupsReason::kPaused,
CupsSeverity::kError)};
EXPECT_THAT(cups_printer_status.GetStatusReasons(), expected_reasons);
}
// Ensure printer status can be correctly converted to a base::Value.
TEST_F(CupsPrinterStatusTest, ConvertToValue) {
const std::string printer_id = "printerId";
CupsPrinterStatus cups_printer_status(printer_id);
cups_printer_status.AddStatusReason(
CupsPrinterStatusReason::Reason::kDeviceError,
CupsPrinterStatusReason::Severity::kReport);
cups_printer_status.AddStatusReason(
CupsPrinterStatusReason::Reason::kPaused,
CupsPrinterStatusReason::Severity::kWarning);
base::Value::Dict printer_status_dict = cups_printer_status.ConvertToValue();
EXPECT_EQ(printer_id, *printer_status_dict.FindString("printerId"));
base::Value::List* status_reasons =
printer_status_dict.FindList("statusReasons");
base::Value::Dict& status_reason_dict1 = (*status_reasons)[0].GetDict();
EXPECT_EQ(static_cast<int>(CupsPrinterStatusReason::Reason::kDeviceError),
status_reason_dict1.FindInt("reason"));
EXPECT_EQ(static_cast<int>(CupsPrinterStatusReason::Severity::kReport),
status_reason_dict1.FindInt("severity"));
base::Value::Dict& status_reason_dict2 = (*status_reasons)[1].GetDict();
EXPECT_EQ(static_cast<int>(CupsPrinterStatusReason::Reason::kPaused),
status_reason_dict2.FindInt("reason"));
EXPECT_EQ(static_cast<int>(CupsPrinterStatusReason::Severity::kWarning),
status_reason_dict2.FindInt("severity"));
}
} // namespace chromeos