mirror of
https://github.com/google/sandboxed-api.git
synced 2024-03-22 13:11:30 +08:00
188 lines
5.4 KiB
C++
188 lines
5.4 KiB
C++
|
// Copyright 2022 Google LLC
|
||
|
//
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
//
|
||
|
// https://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
#include "contrib/libraw/sandboxed.h"
|
||
|
#include "contrib/libraw/utils/utils_libraw.h"
|
||
|
#include "sandboxed_api/util/path.h"
|
||
|
#include "sandboxed_api/util/status_matchers.h"
|
||
|
#include "sandboxed_api/util/temp_file.h"
|
||
|
|
||
|
namespace {
|
||
|
|
||
|
using ::sapi::IsOk;
|
||
|
|
||
|
const struct TestVariant {
|
||
|
std::string filename;
|
||
|
ushort raw_height;
|
||
|
ushort raw_width;
|
||
|
int COLOR[4][4];
|
||
|
int color_values[4][4];
|
||
|
} kTestData[] = {{.filename = "img.raw",
|
||
|
.raw_height = 540,
|
||
|
.raw_width = 960,
|
||
|
.COLOR =
|
||
|
{
|
||
|
{0, 1, 0, 1},
|
||
|
{3, 2, 3, 2},
|
||
|
{0, 1, 0, 1},
|
||
|
{3, 2, 3, 2},
|
||
|
},
|
||
|
.color_values = {
|
||
|
{548, 1285, 554, 1253},
|
||
|
{1290, 789, 1279, 788},
|
||
|
{551, 1303, 549, 1253},
|
||
|
{1265, 809, 1257, 779},
|
||
|
}}};
|
||
|
|
||
|
class LibRawBase : public testing::Test {
|
||
|
protected:
|
||
|
std::string GetTestFilePath(const std::string& filename) {
|
||
|
return sapi::file::JoinPath(test_dir_, filename);
|
||
|
}
|
||
|
|
||
|
void SetUp() override;
|
||
|
|
||
|
const char* test_dir_;
|
||
|
};
|
||
|
|
||
|
class LibRawTestFiles : public LibRawBase,
|
||
|
public testing::WithParamInterface<TestVariant> {};
|
||
|
|
||
|
void LibRawBase::SetUp() {
|
||
|
test_dir_ = getenv("TEST_FILES_DIR");
|
||
|
ASSERT_NE(test_dir_, nullptr);
|
||
|
}
|
||
|
|
||
|
TEST_P(LibRawTestFiles, TestOpen) {
|
||
|
const TestVariant& tv = GetParam();
|
||
|
std::string test_file_path = GetTestFilePath(tv.filename);
|
||
|
|
||
|
LibRawSapiSandbox sandbox(test_file_path);
|
||
|
SAPI_ASSERT_OK(sandbox.Init());
|
||
|
|
||
|
LibRaw lr(&sandbox, test_file_path);
|
||
|
SAPI_ASSERT_OK(lr.CheckIsInit());
|
||
|
SAPI_ASSERT_OK(lr.OpenFile());
|
||
|
}
|
||
|
|
||
|
TEST_P(LibRawTestFiles, TestUnpack) {
|
||
|
const TestVariant& tv = GetParam();
|
||
|
std::string test_file_path = GetTestFilePath(tv.filename);
|
||
|
|
||
|
LibRawSapiSandbox sandbox(test_file_path);
|
||
|
SAPI_ASSERT_OK(sandbox.Init());
|
||
|
|
||
|
LibRaw lr(&sandbox, test_file_path);
|
||
|
SAPI_ASSERT_OK(lr.CheckIsInit());
|
||
|
SAPI_ASSERT_OK(lr.OpenFile());
|
||
|
SAPI_ASSERT_OK(lr.Unpack());
|
||
|
}
|
||
|
|
||
|
TEST_P(LibRawTestFiles, TestSize) {
|
||
|
const TestVariant& tv = GetParam();
|
||
|
std::string test_file_path = GetTestFilePath(tv.filename);
|
||
|
|
||
|
LibRawSapiSandbox sandbox(test_file_path);
|
||
|
SAPI_ASSERT_OK(sandbox.Init());
|
||
|
|
||
|
LibRaw lr(&sandbox, test_file_path);
|
||
|
SAPI_ASSERT_OK(lr.CheckIsInit());
|
||
|
SAPI_ASSERT_OK(lr.OpenFile());
|
||
|
SAPI_ASSERT_OK(lr.Unpack());
|
||
|
|
||
|
SAPI_ASSERT_OK_AND_ASSIGN(ushort raw_height, lr.GetRawHeight());
|
||
|
SAPI_ASSERT_OK_AND_ASSIGN(ushort raw_width, lr.GetRawWidth());
|
||
|
|
||
|
EXPECT_EQ(raw_height, tv.raw_height);
|
||
|
EXPECT_EQ(raw_width, tv.raw_width);
|
||
|
}
|
||
|
|
||
|
TEST_P(LibRawTestFiles, TestCameraList) {
|
||
|
const TestVariant& tv = GetParam();
|
||
|
std::string test_file_path = GetTestFilePath(tv.filename);
|
||
|
|
||
|
LibRawSapiSandbox sandbox(test_file_path);
|
||
|
SAPI_ASSERT_OK(sandbox.Init());
|
||
|
|
||
|
LibRaw lr(&sandbox, test_file_path);
|
||
|
SAPI_ASSERT_OK(lr.CheckIsInit());
|
||
|
|
||
|
SAPI_ASSERT_OK_AND_ASSIGN(std::vector<char*> camera_list, lr.GetCameraList());
|
||
|
|
||
|
EXPECT_FALSE(camera_list.empty());
|
||
|
}
|
||
|
|
||
|
TEST_P(LibRawTestFiles, TestColor) {
|
||
|
const TestVariant& tv = GetParam();
|
||
|
std::string test_file_path = GetTestFilePath(tv.filename);
|
||
|
|
||
|
LibRawSapiSandbox sandbox(test_file_path);
|
||
|
SAPI_ASSERT_OK(sandbox.Init());
|
||
|
|
||
|
LibRaw lr(&sandbox, test_file_path);
|
||
|
SAPI_ASSERT_OK(lr.CheckIsInit());
|
||
|
SAPI_ASSERT_OK(lr.OpenFile());
|
||
|
SAPI_ASSERT_OK(lr.Unpack());
|
||
|
|
||
|
for (int row = 0; row < 4; ++row) {
|
||
|
for (int col = 0; col < 4; ++col) {
|
||
|
SAPI_ASSERT_OK_AND_ASSIGN(int color, lr.COLOR(row, col));
|
||
|
EXPECT_EQ(color, tv.COLOR[row][col]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TEST_P(LibRawTestFiles, TestSubtractBlack) {
|
||
|
const TestVariant& tv = GetParam();
|
||
|
std::string test_file_path = GetTestFilePath(tv.filename);
|
||
|
|
||
|
LibRawSapiSandbox sandbox(test_file_path);
|
||
|
SAPI_ASSERT_OK(sandbox.Init());
|
||
|
|
||
|
LibRaw lr(&sandbox, test_file_path);
|
||
|
SAPI_ASSERT_OK(lr.CheckIsInit());
|
||
|
SAPI_ASSERT_OK(lr.OpenFile());
|
||
|
SAPI_ASSERT_OK(lr.Unpack());
|
||
|
SAPI_ASSERT_OK(lr.SubtractBlack());
|
||
|
|
||
|
libraw_data_t lr_data = lr.GetImgData();
|
||
|
|
||
|
SAPI_ASSERT_OK_AND_ASSIGN(std::vector<uint16_t> rawdata, lr.RawData());
|
||
|
|
||
|
for (int row = 0; row < 4; ++row) {
|
||
|
unsigned rcolors[48];
|
||
|
if (lr_data.idata.colors > 1) {
|
||
|
for (int c = 0; c < 48; c++) {
|
||
|
SAPI_ASSERT_OK_AND_ASSIGN(int color, lr.COLOR(row, c));
|
||
|
rcolors[c] = color;
|
||
|
}
|
||
|
} else {
|
||
|
memset(rcolors, 0, sizeof(rcolors));
|
||
|
}
|
||
|
|
||
|
for (int col = 0; col < 4; col++) {
|
||
|
int raw_idx = row * lr.GetImgData().sizes.raw_pitch / 2 + col;
|
||
|
unsigned black_level = lr_data.color.cblack[rcolors[col % 48]];
|
||
|
int color_value =
|
||
|
rawdata[raw_idx] > black_level ? rawdata[raw_idx] - black_level : 0;
|
||
|
EXPECT_EQ(color_value, tv.color_values[row][col]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
INSTANTIATE_TEST_SUITE_P(LibRawBase, LibRawTestFiles,
|
||
|
testing::ValuesIn(kTestData));
|
||
|
|
||
|
} // namespace
|