blob: d449242273b8d85bb286038f2ac48c2c03544122 [file] [log] [blame]
// Copyright 2021 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 "lorgnette/image_readers/png_reader.h"
#include <base/optional.h>
#include <brillo/errors/error.h>
#include <dbus/lorgnette/dbus-constants.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "lorgnette/constants.h"
#include "lorgnette/sane_client.h"
using ::testing::ContainsRegex;
namespace lorgnette {
namespace {
constexpr FrameFormat kDefaultFrameFormat = kGrayscale;
constexpr int kDefaultBytesPerLine = 100;
constexpr int kDefaultPixelsPerLine = 100;
constexpr int kDefaultLines = 10;
constexpr int kDefaultDepth = 8;
ScanParameters CreateDefaultScanParameters() {
ScanParameters parameters;
parameters.format = kDefaultFrameFormat;
parameters.bytes_per_line = kDefaultBytesPerLine;
parameters.pixels_per_line = kDefaultPixelsPerLine;
parameters.lines = kDefaultLines;
parameters.depth = kDefaultDepth;
return parameters;
}
} // namespace
TEST(PngReaderTest, CreateWithInvalidRgbBitDepth) {
ScanParameters parameters = CreateDefaultScanParameters();
parameters.format = kRGB;
parameters.depth = 1;
brillo::ErrorPtr error;
EXPECT_FALSE(PngReader::Create(&error, parameters, base::nullopt, nullptr));
ASSERT_TRUE(error);
EXPECT_EQ(error->GetDomain(), kDbusDomain);
EXPECT_EQ(error->GetCode(), kManagerServiceError);
EXPECT_EQ(error->GetMessage(),
"Cannot have bit depth of 1 with non-grayscale scan");
}
TEST(PngReaderTest, CreateWithUnknownLength) {
ScanParameters parameters = CreateDefaultScanParameters();
parameters.lines = -1;
brillo::ErrorPtr error;
EXPECT_FALSE(PngReader::Create(&error, parameters, base::nullopt, nullptr));
ASSERT_TRUE(error);
EXPECT_EQ(error->GetDomain(), kDbusDomain);
EXPECT_EQ(error->GetCode(), kManagerServiceError);
EXPECT_THAT(error->GetMessage(), ContainsRegex("unknown lengths"));
}
TEST(PngReaderTest, CreateWithNoLines) {
ScanParameters parameters = CreateDefaultScanParameters();
parameters.lines = 0;
brillo::ErrorPtr error;
EXPECT_FALSE(PngReader::Create(&error, parameters, base::nullopt, nullptr));
ASSERT_TRUE(error);
EXPECT_EQ(error->GetDomain(), kDbusDomain);
EXPECT_EQ(error->GetCode(), kManagerServiceError);
EXPECT_THAT(error->GetMessage(), ContainsRegex("0 lines"));
}
TEST(PngReaderTest, CreateWithInvalidHeight) {
ScanParameters parameters = CreateDefaultScanParameters();
parameters.lines = 65535 + 1;
brillo::ErrorPtr error;
EXPECT_FALSE(PngReader::Create(&error, parameters, base::nullopt, nullptr));
ASSERT_TRUE(error);
EXPECT_EQ(error->GetDomain(), kDbusDomain);
EXPECT_EQ(error->GetCode(), kManagerServiceError);
EXPECT_THAT(error->GetMessage(), ContainsRegex("invalid height"));
}
TEST(PngReaderTest, CreateWithNegativeWidth) {
ScanParameters parameters = CreateDefaultScanParameters();
parameters.pixels_per_line = -1;
brillo::ErrorPtr error;
EXPECT_FALSE(PngReader::Create(&error, parameters, base::nullopt, nullptr));
ASSERT_TRUE(error);
EXPECT_EQ(error->GetDomain(), kDbusDomain);
EXPECT_EQ(error->GetCode(), kManagerServiceError);
EXPECT_THAT(error->GetMessage(), ContainsRegex("invalid width"));
}
TEST(PngReaderTest, CreateWithInvalidWidth) {
ScanParameters parameters = CreateDefaultScanParameters();
parameters.pixels_per_line = 65535 + 1;
brillo::ErrorPtr error;
EXPECT_FALSE(PngReader::Create(&error, parameters, base::nullopt, nullptr));
ASSERT_TRUE(error);
EXPECT_EQ(error->GetDomain(), kDbusDomain);
EXPECT_EQ(error->GetCode(), kManagerServiceError);
EXPECT_THAT(error->GetMessage(), ContainsRegex("invalid width"));
}
TEST(PngReaderTest, CreateWithInvalidBytesPerLine) {
ScanParameters parameters = CreateDefaultScanParameters();
parameters.format = kGrayscale;
parameters.bytes_per_line = 10;
parameters.pixels_per_line = 20;
brillo::ErrorPtr error;
EXPECT_FALSE(PngReader::Create(&error, parameters, base::nullopt, nullptr));
ASSERT_TRUE(error);
EXPECT_EQ(error->GetDomain(), kDbusDomain);
EXPECT_EQ(error->GetCode(), kManagerServiceError);
EXPECT_THAT(error->GetMessage(), ContainsRegex("too small to hold"));
}
TEST(PngReaderTest, CreateWithInvalidImageSize) {
ScanParameters parameters = CreateDefaultScanParameters();
parameters.bytes_per_line = 65535;
parameters.lines = 65535;
brillo::ErrorPtr error;
EXPECT_FALSE(PngReader::Create(&error, parameters, base::nullopt, nullptr));
ASSERT_TRUE(error);
EXPECT_EQ(error->GetDomain(), kDbusDomain);
EXPECT_EQ(error->GetCode(), kManagerServiceError);
EXPECT_THAT(error->GetMessage(), ContainsRegex("too large"));
}
TEST(PngReaderTest, CreateWithInvalidBitDepth) {
ScanParameters parameters = CreateDefaultScanParameters();
parameters.bytes_per_line = kDefaultPixelsPerLine * 3;
parameters.depth = 24;
brillo::ErrorPtr error;
EXPECT_FALSE(PngReader::Create(&error, parameters, base::nullopt, nullptr));
ASSERT_TRUE(error);
EXPECT_EQ(error->GetDomain(), kDbusDomain);
EXPECT_EQ(error->GetCode(), kManagerServiceError);
EXPECT_THAT(error->GetMessage(), ContainsRegex("Invalid PNG scan bit depth"));
}
} // namespace lorgnette