blob: 532688d06f720624d49b43e43e88e2b27d88112a [file] [log] [blame]
Dichen Zhang4a66b3c2022-10-19 18:04:47 +00001/*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Dichen Zhang02dd0592023-02-10 20:16:57 +000017#include <jpegrecoverymap/jpegencoderhelper.h>
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000018#include <gtest/gtest.h>
19#include <utils/Log.h>
20
21#include <fcntl.h>
22
23namespace android::recoverymap {
24
25#define VALID_IMAGE "/sdcard/Documents/minnie-320x240.yu12"
26#define VALID_IMAGE_WIDTH 320
27#define VALID_IMAGE_HEIGHT 240
Dichen Zhanga4819142022-10-21 04:12:30 +000028#define SINGLE_CHANNEL_IMAGE "/sdcard/Documents/minnie-320x240.y"
29#define SINGLE_CHANNEL_IMAGE_WIDTH VALID_IMAGE_WIDTH
30#define SINGLE_CHANNEL_IMAGE_HEIGHT VALID_IMAGE_HEIGHT
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000031#define INVALID_SIZE_IMAGE "/sdcard/Documents/minnie-318x240.yu12"
32#define INVALID_SIZE_IMAGE_WIDTH 318
33#define INVALID_SIZE_IMAGE_HEIGHT 240
34#define JPEG_QUALITY 90
35
Dichen Zhang02dd0592023-02-10 20:16:57 +000036class JpegEncoderHelperTest : public testing::Test {
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000037public:
38 struct Image {
39 std::unique_ptr<uint8_t[]> buffer;
40 size_t width;
41 size_t height;
42 };
Dichen Zhang02dd0592023-02-10 20:16:57 +000043 JpegEncoderHelperTest();
44 ~JpegEncoderHelperTest();
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000045protected:
46 virtual void SetUp();
47 virtual void TearDown();
48
Dichen Zhanga4819142022-10-21 04:12:30 +000049 Image mValidImage, mInvalidSizeImage, mSingleChannelImage;
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000050};
51
Dichen Zhang02dd0592023-02-10 20:16:57 +000052JpegEncoderHelperTest::JpegEncoderHelperTest() {}
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000053
Dichen Zhang02dd0592023-02-10 20:16:57 +000054JpegEncoderHelperTest::~JpegEncoderHelperTest() {}
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000055
56static size_t getFileSize(int fd) {
57 struct stat st;
58 if (fstat(fd, &st) < 0) {
59 ALOGW("%s : fstat failed", __func__);
60 return 0;
61 }
62 return st.st_size; // bytes
63}
64
Dichen Zhang02dd0592023-02-10 20:16:57 +000065static bool loadFile(const char filename[], JpegEncoderHelperTest::Image* result) {
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000066 int fd = open(filename, O_CLOEXEC);
67 if (fd < 0) {
68 return false;
69 }
70 int length = getFileSize(fd);
71 if (length == 0) {
72 close(fd);
73 return false;
74 }
75 result->buffer.reset(new uint8_t[length]);
76 if (read(fd, result->buffer.get(), length) != static_cast<ssize_t>(length)) {
77 close(fd);
78 return false;
79 }
80 close(fd);
81 return true;
82}
83
Dichen Zhang02dd0592023-02-10 20:16:57 +000084void JpegEncoderHelperTest::SetUp() {
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000085 if (!loadFile(VALID_IMAGE, &mValidImage)) {
86 FAIL() << "Load file " << VALID_IMAGE << " failed";
87 }
88 mValidImage.width = VALID_IMAGE_WIDTH;
89 mValidImage.height = VALID_IMAGE_HEIGHT;
90 if (!loadFile(INVALID_SIZE_IMAGE, &mInvalidSizeImage)) {
91 FAIL() << "Load file " << INVALID_SIZE_IMAGE << " failed";
92 }
93 mInvalidSizeImage.width = INVALID_SIZE_IMAGE_WIDTH;
94 mInvalidSizeImage.height = INVALID_SIZE_IMAGE_HEIGHT;
Dichen Zhanga4819142022-10-21 04:12:30 +000095 if (!loadFile(SINGLE_CHANNEL_IMAGE, &mSingleChannelImage)) {
96 FAIL() << "Load file " << SINGLE_CHANNEL_IMAGE << " failed";
97 }
98 mSingleChannelImage.width = SINGLE_CHANNEL_IMAGE_WIDTH;
99 mSingleChannelImage.height = SINGLE_CHANNEL_IMAGE_HEIGHT;
Dichen Zhang4a66b3c2022-10-19 18:04:47 +0000100}
101
Dichen Zhang02dd0592023-02-10 20:16:57 +0000102void JpegEncoderHelperTest::TearDown() {}
Dichen Zhang4a66b3c2022-10-19 18:04:47 +0000103
Dichen Zhang02dd0592023-02-10 20:16:57 +0000104TEST_F(JpegEncoderHelperTest, validImage) {
105 JpegEncoderHelper encoder;
Dichen Zhang4a66b3c2022-10-19 18:04:47 +0000106 EXPECT_TRUE(encoder.compressImage(mValidImage.buffer.get(), mValidImage.width,
107 mValidImage.height, JPEG_QUALITY, NULL, 0));
108 ASSERT_GT(encoder.getCompressedImageSize(), static_cast<uint32_t>(0));
109}
110
Dichen Zhang02dd0592023-02-10 20:16:57 +0000111TEST_F(JpegEncoderHelperTest, invalidSizeImage) {
112 JpegEncoderHelper encoder;
Dichen Zhang4a66b3c2022-10-19 18:04:47 +0000113 EXPECT_FALSE(encoder.compressImage(mInvalidSizeImage.buffer.get(), mInvalidSizeImage.width,
114 mInvalidSizeImage.height, JPEG_QUALITY, NULL, 0));
115}
116
Dichen Zhang02dd0592023-02-10 20:16:57 +0000117TEST_F(JpegEncoderHelperTest, singleChannelImage) {
118 JpegEncoderHelper encoder;
Dichen Zhanga4819142022-10-21 04:12:30 +0000119 EXPECT_TRUE(encoder.compressImage(mSingleChannelImage.buffer.get(), mSingleChannelImage.width,
120 mSingleChannelImage.height, JPEG_QUALITY, NULL, 0, true));
121 ASSERT_GT(encoder.getCompressedImageSize(), static_cast<uint32_t>(0));
122}
123
Dichen Zhang4a66b3c2022-10-19 18:04:47 +0000124}
125