blob: 2bf63a10bb0006466b354a2e1b339aa496f655af [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/paint_preview/common/proto_validator.h"
#include "components/paint_preview/common/proto/paint_preview.pb.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace paint_preview {
namespace {
// Generate a fully populated valid proto.
PaintPreviewProto CreatePopulatedValidProto() {
PaintPreviewProto proto;
auto* metadata = proto.mutable_metadata();
metadata->set_url("https://www.example.com/");
metadata->set_version(1);
auto* root_frame = proto.mutable_root_frame();
root_frame->set_embedding_token_low(12345);
root_frame->set_embedding_token_high(67890);
root_frame->set_is_main_frame(true);
root_frame->set_scroll_offset_x(50);
root_frame->set_scroll_offset_y(100);
root_frame->set_file_path("/foo/bar");
auto* link = root_frame->add_links();
link->set_url("https://www.chromium.org/");
auto* rect = link->mutable_rect();
rect->set_x(1);
rect->set_y(2);
rect->set_width(3);
rect->set_height(4);
const int subframe_low = 654;
const int subframe_high = 7321981;
auto* pair = root_frame->add_content_id_to_embedding_tokens();
pair->set_content_id(1);
pair->set_embedding_token_low(subframe_low);
pair->set_embedding_token_high(subframe_high);
auto* subframe = proto.add_subframes();
subframe->set_embedding_token_low(subframe_low);
subframe->set_embedding_token_high(subframe_high);
subframe->set_is_main_frame(false);
return proto;
}
} // namespace
// Rect validation fails if the rect is missing any dimension.
TEST(PaintPreviewProtoValid, RectValidation) {
auto proto = CreatePopulatedValidProto();
auto* root_frame = proto.mutable_root_frame();
auto* link_data = root_frame->mutable_links(0);
auto* rect = link_data->mutable_rect();
rect->clear_x();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
proto = CreatePopulatedValidProto();
root_frame = proto.mutable_root_frame();
link_data = root_frame->mutable_links(0);
rect = link_data->mutable_rect();
rect->clear_y();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
proto = CreatePopulatedValidProto();
root_frame = proto.mutable_root_frame();
link_data = root_frame->mutable_links(0);
rect = link_data->mutable_rect();
rect->clear_width();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
proto = CreatePopulatedValidProto();
root_frame = proto.mutable_root_frame();
link_data = root_frame->mutable_links(0);
rect = link_data->mutable_rect();
rect->clear_height();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
}
// Link validation fails if it is missing a url or rect.
TEST(PaintPreviewProtoValid, LinkDataValidation) {
auto proto = CreatePopulatedValidProto();
auto* root_frame = proto.mutable_root_frame();
auto* link_data = root_frame->mutable_links(0);
link_data->clear_url();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
proto = CreatePopulatedValidProto();
root_frame = proto.mutable_root_frame();
link_data = root_frame->mutable_links(0);
link_data->clear_rect();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
}
// Content ID and embedding token pair validation should fail if any field is
// missing.
TEST(PaintPreviewProtoValid, ContentIdEmbeddingTokenPairValidation) {
auto proto = CreatePopulatedValidProto();
auto* root_frame = proto.mutable_root_frame();
auto* pair = root_frame->mutable_content_id_to_embedding_tokens(0);
pair->clear_content_id();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
proto = CreatePopulatedValidProto();
root_frame = proto.mutable_root_frame();
pair = root_frame->mutable_content_id_to_embedding_tokens(0);
pair->clear_embedding_token_low();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
proto = CreatePopulatedValidProto();
root_frame = proto.mutable_root_frame();
pair = root_frame->mutable_content_id_to_embedding_tokens(0);
pair->clear_embedding_token_high();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
}
// Frame validation should fail if the embedding token or main frame fields are
// missing.
TEST(PaintPreviewProtoValid, PaintPreviewFrameProtoValidation) {
auto proto = CreatePopulatedValidProto();
auto* root_frame = proto.mutable_root_frame();
root_frame->clear_embedding_token_low();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
proto = CreatePopulatedValidProto();
root_frame = proto.mutable_root_frame();
root_frame->clear_embedding_token_high();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
proto = CreatePopulatedValidProto();
root_frame = proto.mutable_root_frame();
root_frame->clear_embedding_token_high();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
proto = CreatePopulatedValidProto();
root_frame = proto.mutable_root_frame();
root_frame->clear_is_main_frame();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
}
// Metadata validation fails if the url is missing.
TEST(PaintPreviewProtoValid, MetadataValidation) {
auto proto = CreatePopulatedValidProto();
auto* metadata = proto.mutable_metadata();
metadata->clear_url();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
}
// Proto validation should succeed unless the root frame, or metadata is missing
// or if a subframe is invalid.
TEST(PaintPreviewProtoValid, PaintPreviewValidation) {
auto proto = CreatePopulatedValidProto();
EXPECT_TRUE(PaintPreviewProtoValid(proto));
proto.clear_metadata();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
proto = CreatePopulatedValidProto();
proto.clear_root_frame();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
proto = CreatePopulatedValidProto();
proto.add_subframes();
EXPECT_FALSE(PaintPreviewProtoValid(proto));
}
} // namespace paint_preview