blob: fd56cc7fe9c0a3b09718b83b7e4b259dbb4fe539 [file] [log] [blame]
// Copyright 2021 The Chromium 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/formats/webm/webm_projection_parser.h"
#include "media/base/mock_media_log.h"
#include "media/formats/webm/webm_constants.h"
#include "media/formats/webm/webm_video_client.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using ::testing::StrictMock;
namespace media {
// Matchers for verifying common media log entry strings.
MATCHER(UnexpectedProjectionId, "") {
return CONTAINS_STRING(arg, "Unexpected id in Projection: 0x");
}
MATCHER(UnexpectedProjectionType, "") {
return CONTAINS_STRING(arg, "Unexpected value for ProjectionType: 0x");
}
MATCHER(UnexpectedMultipleValuesForProjectionType, "") {
return CONTAINS_STRING(arg, "Multiple values for id: 0x7671");
}
MATCHER(UnexpectedMultipleValuesForYaw, "") {
return CONTAINS_STRING(arg, "Multiple values for id: 0x7673");
}
MATCHER(UnexpectedMultipleValuesForPitch, "") {
return CONTAINS_STRING(arg, "Multiple values for id: 0x7674");
}
MATCHER(UnexpectedMultipleValuesForRoll, "") {
return CONTAINS_STRING(arg, "Multiple values for id: 0x7675");
}
MATCHER(UnexpectedProjectionYaw, "") {
return CONTAINS_STRING(arg, "Value not within valid range. id: 0x7673 val:");
}
MATCHER(UnexpectedProjectionPitch, "") {
return CONTAINS_STRING(arg, "Value not within valid range. id: 0x7674 val:");
}
MATCHER(UnexpectedProjectionRoll, "") {
return CONTAINS_STRING(arg, "Value not within valid range. id: 0x7675 val:");
}
MATCHER(MissingProjectionType, "") {
return CONTAINS_STRING(
arg, "Projection element is incomplete; ProjectionType required.");
}
MATCHER(MissingProjectionPoseYaw, "") {
return CONTAINS_STRING(
arg, "Projection element is incomplete; ProjectionPoseYaw required.");
}
MATCHER(MissingProjectionPosePitch, "") {
return CONTAINS_STRING(
arg, "Projection element is incomplete; ProjectionPosePitch required.");
}
MATCHER(MissingProjectionPoseRoll, "") {
return CONTAINS_STRING(
arg, "Projection element is incomplete; ProjectionPoseRoll required.");
}
class WebMProjectionParserTest : public testing::Test {
public:
WebMProjectionParserTest()
: projection_parser_(&media_log_), webm_video_client_(&media_log_) {}
bool OnUInt(int id, int64_t val) {
return projection_parser_.OnUInt(id, val);
}
bool OnFloat(int id, double val) {
return projection_parser_.OnFloat(id, val);
}
WebMParserClient* VideoClientOnListStart(int id) {
return webm_video_client_.OnListStart(id);
}
void VideoClientOnListEnd(int id) { webm_video_client_.OnListEnd(id); }
bool VideoClientOnUInt(int id, int64_t val) {
return webm_video_client_.OnUInt(id, val);
}
StrictMock<MockMediaLog> media_log_;
WebMProjectionParser projection_parser_;
WebMVideoClient webm_video_client_;
};
TEST_F(WebMProjectionParserTest, UnexpectedInt) {
EXPECT_MEDIA_LOG(UnexpectedProjectionId());
OnUInt(kWebMIdPrimaryBChromaticityX, 1);
}
TEST_F(WebMProjectionParserTest, UnexpectedFloat) {
EXPECT_MEDIA_LOG(UnexpectedProjectionId());
OnFloat(kWebMIdPrimaryBChromaticityX, 0);
}
TEST_F(WebMProjectionParserTest, InvalidProjectionType) {
EXPECT_MEDIA_LOG(UnexpectedProjectionType());
OnUInt(kWebMIdProjectionType, 4);
}
TEST_F(WebMProjectionParserTest, MultipleProjectionType) {
OnUInt(kWebMIdProjectionType, 1);
EXPECT_MEDIA_LOG(UnexpectedMultipleValuesForProjectionType());
OnUInt(kWebMIdProjectionType, 1);
}
TEST_F(WebMProjectionParserTest, InvalidProjectionYaw) {
EXPECT_MEDIA_LOG(UnexpectedProjectionYaw());
OnFloat(kWebMIdProjectionPoseYaw, 181);
}
TEST_F(WebMProjectionParserTest, InvalidProjectionPitch) {
EXPECT_MEDIA_LOG(UnexpectedProjectionPitch());
OnFloat(kWebMIdProjectionPosePitch, 91);
}
TEST_F(WebMProjectionParserTest, InvalidProjectionRoll) {
EXPECT_MEDIA_LOG(UnexpectedProjectionRoll());
OnFloat(kWebMIdProjectionPoseRoll, 181);
}
TEST_F(WebMProjectionParserTest, MultipleProjectionYaw) {
OnFloat(kWebMIdProjectionPoseYaw, 180);
EXPECT_MEDIA_LOG(UnexpectedMultipleValuesForYaw());
OnFloat(kWebMIdProjectionPoseYaw, 180);
}
TEST_F(WebMProjectionParserTest, MultipleProjectionPitch) {
OnFloat(kWebMIdProjectionPosePitch, 90);
EXPECT_MEDIA_LOG(UnexpectedMultipleValuesForPitch());
OnFloat(kWebMIdProjectionPosePitch, 90);
}
TEST_F(WebMProjectionParserTest, MultipleProjectionRoll) {
OnFloat(kWebMIdProjectionPoseRoll, 180);
EXPECT_MEDIA_LOG(UnexpectedMultipleValuesForRoll());
OnFloat(kWebMIdProjectionPoseRoll, 180);
}
TEST_F(WebMProjectionParserTest, MissingProjectionType) {
VideoClientOnListStart(kWebMIdProjection);
EXPECT_MEDIA_LOG(MissingProjectionType());
VideoClientOnListEnd(kWebMIdProjection);
}
TEST_F(WebMProjectionParserTest, MissingProjectionPosYaw) {
auto* parser = VideoClientOnListStart(kWebMIdProjection);
parser->OnUInt(kWebMIdProjectionType, 1);
EXPECT_MEDIA_LOG(MissingProjectionPoseYaw());
VideoClientOnListEnd(kWebMIdProjection);
}
TEST_F(WebMProjectionParserTest, MissingProjectionPosePitch) {
auto* parser = VideoClientOnListStart(kWebMIdProjection);
parser->OnUInt(kWebMIdProjectionType, 1);
parser->OnFloat(kWebMIdProjectionPoseYaw, 90);
EXPECT_MEDIA_LOG(MissingProjectionPosePitch());
VideoClientOnListEnd(kWebMIdProjection);
}
TEST_F(WebMProjectionParserTest, MissingProjectionPoseRoll) {
auto* parser = VideoClientOnListStart(kWebMIdProjection);
parser->OnUInt(kWebMIdProjectionType, 1);
parser->OnFloat(kWebMIdProjectionPoseYaw, 90);
parser->OnFloat(kWebMIdProjectionPosePitch, 90);
EXPECT_MEDIA_LOG(MissingProjectionPoseRoll());
VideoClientOnListEnd(kWebMIdProjection);
}
} // namespace media