blob: 7c27491438e4d11d3f25ce3f5f57b9fcdb91b816 [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 "media_capabilities/common.h"
#include <algorithm>
#include <random>
#include <utility>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <gtest/gtest.h>
namespace {
bool CreateSampleFile(const base::FilePath& path) {
const char* text = "abcdefg";
return base::WriteFile(path, text, sizeof(text)) == sizeof(text);
}
} // namespace
TEST(CommonTest, GetAllFilesWithPrefix) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
const base::FilePath& temp_path =
base::MakeAbsoluteFilePath(temp_dir.GetPath());
ASSERT_FALSE(temp_path.empty());
ASSERT_TRUE(base::CreateDirectory(temp_path.AppendASCII("video")));
const std::vector<base::FilePath> expected_paths = {
temp_path.AppendASCII("video-dec"),
temp_path.AppendASCII("video0"),
};
const std::vector<base::FilePath> expected_paths2 = {
temp_path.AppendASCII("video/a.txt"),
temp_path.AppendASCII("video/b.txt"),
};
ASSERT_TRUE(std::is_sorted(expected_paths.begin(), expected_paths.end()));
ASSERT_TRUE(std::is_sorted(expected_paths2.begin(), expected_paths2.end()));
for (const auto& path : expected_paths)
ASSERT_TRUE(CreateSampleFile(path));
for (const auto& path : expected_paths2)
ASSERT_TRUE(CreateSampleFile(path));
// Directory status
// tmp
// - video
// - a.txt
// - b.txt
// - video-dec
// - video0
auto result_paths = GetAllFilesWithPrefix(temp_path.AppendASCII("video"));
auto result_paths2 = GetAllFilesWithPrefix(temp_path.AppendASCII("video/"));
std::sort(result_paths.begin(), result_paths.end());
EXPECT_EQ(result_paths, expected_paths);
std::sort(result_paths2.begin(), result_paths2.end());
EXPECT_EQ(result_paths2, expected_paths2);
}
TEST(CommonTest, GetInterestingResolutionsUpTo) {
const struct {
std::pair<int, int> resolution;
std::vector<Resolution> expected_results;
} kTestCases[] = {
{{1280, 720}, {}},
{{1920, 1080}, {Resolution::k1080p}},
{{2560, 1440}, {Resolution::k1080p}},
{{3840, 2160}, {Resolution::k1080p, Resolution::k2160p}},
{{2160, 2160}, {Resolution::k1080p}},
};
for (const auto& t : kTestCases)
EXPECT_EQ(GetInterestingResolutionsUpTo(t.resolution), t.expected_results);
}
TEST(CommonTest, CapabilityConstructorAndToString) {
Capability cap(Profile::kH264High, true, Resolution::k1080p,
Subsampling::kYUV420, ColorDepth::k8bit);
EXPECT_EQ(cap.ToString(), "h264_high_decode_1080p");
cap = Capability(Profile::kJPEG, true, Resolution::k1080p,
Subsampling::kYUV422, ColorDepth::k8bit);
EXPECT_EQ(cap.ToString(), "jpeg_decode_1080p_422");
cap = Capability(Profile::kJPEG, false, Resolution::k1080p,
Subsampling::kYUV420, ColorDepth::k8bit);
EXPECT_EQ(cap.ToString(), "jpeg_encode_1080p");
cap = Capability(Profile::kVP9Profile2, true, Resolution::k2160p,
Subsampling::kYUV420, ColorDepth::k10bit);
EXPECT_EQ(cap.ToString(), "vp9_2_decode_2160p_10bpp");
cap = Capability(Profile::kAV1Main, true, Resolution::k1080p,
Subsampling::kYUV420, ColorDepth::k8bit);
EXPECT_EQ(cap.ToString(), "av1_main_decode_1080p");
cap = Capability(Profile::kAV1Main, true, Resolution::k2160p,
Subsampling::kYUV420, ColorDepth::k10bit);
EXPECT_EQ(cap.ToString(), "av1_main_decode_2160p_10bpp");
cap = Capability(CameraDescription::kBuiltinUSBCamera);
EXPECT_EQ(cap.ToString(), "builtin_usb_camera");
cap = Capability(CameraDescription::kVividCamera);
EXPECT_EQ(cap.ToString(), "vivid_camera");
}
TEST(CommonTest, CapabilityCompareOperators) {
const std::vector<Capability> caps = {
Capability(Profile::kH264Baseline, true, Resolution::k1080p,
Subsampling::kYUV420, ColorDepth::k8bit),
Capability(Profile::kH264Baseline, true, Resolution::k2160p,
Subsampling::kYUV420, ColorDepth::k8bit),
Capability(Profile::kH264Baseline, false, Resolution::k1080p,
Subsampling::kYUV420, ColorDepth::k8bit),
Capability(Profile::kVP8, false, Resolution::k1080p, Subsampling::kYUV420,
ColorDepth::k8bit),
Capability(Profile::kAV1Main, true, Resolution::k1080p,
Subsampling::kYUV420, ColorDepth::k10bit),
Capability(Profile::kAV1Main, true, Resolution::k2160p,
Subsampling::kYUV420, ColorDepth::k8bit),
Capability(Profile::kJPEG, true, Resolution::k1080p, Subsampling::kYUV420,
ColorDepth::k8bit),
Capability(Profile::kJPEG, false, Resolution::k1080p,
Subsampling::kYUV420, ColorDepth::k8bit),
Capability(Profile::kJPEG, false, Resolution::k1080p,
Subsampling::kYUV444, ColorDepth::k8bit),
Capability(CameraDescription::kBuiltinUSBCamera),
Capability(CameraDescription::kBuiltinMIPICamera),
Capability(CameraDescription::kBuiltinOrVividCamera),
};
for (size_t i = 0; i < caps.size(); ++i) {
EXPECT_EQ(caps[i], caps[i]);
for (size_t j = i + 1; j < caps.size(); ++j) {
EXPECT_NE(caps[i], caps[j]);
EXPECT_LT(caps[i], caps[j]) << i << ", " << j;
}
}
}
TEST(CommonTest, CapabilitySortAndUnique) {
const std::vector<Capability> expected_caps = {
Capability(Profile::kH264Baseline, true, Resolution::k1080p,
Subsampling::kYUV420, ColorDepth::k8bit),
Capability(Profile::kH264Baseline, true, Resolution::k2160p,
Subsampling::kYUV420, ColorDepth::k8bit),
Capability(Profile::kH264Baseline, false, Resolution::k1080p,
Subsampling::kYUV420, ColorDepth::k8bit),
Capability(Profile::kVP8, false, Resolution::k1080p, Subsampling::kYUV420,
ColorDepth::k8bit),
Capability(Profile::kAV1Main, true, Resolution::k1080p,
Subsampling::kYUV420, ColorDepth::k10bit),
Capability(Profile::kAV1Main, true, Resolution::k2160p,
Subsampling::kYUV420, ColorDepth::k8bit),
Capability(Profile::kJPEG, true, Resolution::k1080p, Subsampling::kYUV420,
ColorDepth::k8bit),
Capability(Profile::kJPEG, false, Resolution::k1080p,
Subsampling::kYUV420, ColorDepth::k8bit),
Capability(Profile::kJPEG, false, Resolution::k1080p,
Subsampling::kYUV444, ColorDepth::k8bit),
Capability(CameraDescription::kBuiltinUSBCamera),
Capability(CameraDescription::kBuiltinMIPICamera),
Capability(CameraDescription::kBuiltinOrVividCamera),
};
std::vector<Capability> caps = expected_caps;
auto rng = std::default_random_engine(12345);
std::shuffle(caps.begin(), caps.end(), rng);
EXPECT_NE(caps, expected_caps);
// Test sort.
std::sort(caps.begin(), caps.end());
EXPECT_EQ(caps, expected_caps);
// Test unique.
caps.insert(caps.end(), expected_caps.begin(), expected_caps.end());
std::sort(caps.begin(), caps.end());
auto last = std::unique(caps.begin(), caps.end());
caps.erase(last, caps.end());
EXPECT_EQ(caps, expected_caps);
}
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}