// Copyright 2018 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/fpdfdoc/cpdf_metadata.h"
#include "core/fpdfapi/parser/cpdf_stream.h"
#include "testing/gtest/include/gtest/gtest.h"
TEST(CPDFMetadataTest, CheckSharedFormEmailAtTopLevel) {
static const char data[] =
"\n"
"\n"
"0\n"
"1.1\n"
"";
auto stream =
pdfium::MakeRetain(ByteStringView(data).unsigned_span());
CPDF_Metadata metadata(stream);
auto results = metadata.CheckForSharedForm();
ASSERT_EQ(1U, results.size());
EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormEmail, results[0]);
}
TEST(CPDFMetadataTest, CheckSharedFormAcrobatAtTopLevel) {
static const char data[] =
"\n"
"\n"
"1\n"
"1.1\n"
"";
auto stream =
pdfium::MakeRetain(ByteStringView(data).unsigned_span());
CPDF_Metadata metadata(stream);
auto results = metadata.CheckForSharedForm();
ASSERT_EQ(1U, results.size());
EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormAcrobat, results[0]);
}
TEST(CPDFMetadataTest, CheckSharedFormFilesystemAtTopLevel) {
static const char data[] =
"\n"
"\n"
"2\n"
"1.1\n"
"";
auto stream =
pdfium::MakeRetain(ByteStringView(data).unsigned_span());
CPDF_Metadata metadata(stream);
auto results = metadata.CheckForSharedForm();
ASSERT_EQ(1U, results.size());
EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormFilesystem, results[0]);
}
TEST(CPDFMetadataTest, CheckSharedFormWithoutWorkflow) {
static const char data[] =
"\n"
"\n"
"2\n"
"1.1\n"
"";
auto stream =
pdfium::MakeRetain(ByteStringView(data).unsigned_span());
CPDF_Metadata metadata(stream);
auto results = metadata.CheckForSharedForm();
EXPECT_EQ(0U, results.size());
}
TEST(CPDFMetadataTest, CheckSharedFormAsChild) {
static const char data[] =
"\n"
"\n"
"\n"
"0\n"
"1.1\n"
""
"";
auto stream =
pdfium::MakeRetain(ByteStringView(data).unsigned_span());
CPDF_Metadata metadata(stream);
auto results = metadata.CheckForSharedForm();
ASSERT_EQ(1U, results.size());
EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormEmail, results[0]);
}
TEST(CPDFMetadataTest, CheckSharedFormAsNoAdhoc) {
static const char data[] =
"\n"
"";
auto stream =
pdfium::MakeRetain(ByteStringView(data).unsigned_span());
CPDF_Metadata metadata(stream);
auto results = metadata.CheckForSharedForm();
EXPECT_EQ(0U, results.size());
}
TEST(CPDFMetadataTest, CheckSharedFormExceedMaxDepth) {
// Node has the depth of 130, which exceeds the maximum node depth of
// `kMaxMetaDataDepth`.
static const char kData[] =
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"0\n"
"1.1\n"
""
"";
auto stream =
pdfium::MakeRetain(ByteStringView(kData).unsigned_span());
CPDF_Metadata metadata(stream);
auto results = metadata.CheckForSharedForm();
ASSERT_EQ(0U, results.size());
}
TEST(CPDFMetadataTest, CheckSharedFormWrongNamespace) {
static const char data[] =
"\n"
"\n"
"1\n"
"1.1\n"
"";
auto stream =
pdfium::MakeRetain(ByteStringView(data).unsigned_span());
CPDF_Metadata metadata(stream);
auto results = metadata.CheckForSharedForm();
EXPECT_EQ(0U, results.size());
}
TEST(CPDFMetadataTest, CheckSharedFormMultipleErrors) {
static const char data[] =
"\n"
""
"\n"
"\n"
"0\n"
"1.1\n"
""
""
"\n"
"2\n"
"1.1\n"
""
"\n"
"1\n"
"1.1\n"
""
"";
auto stream =
pdfium::MakeRetain(ByteStringView(data).unsigned_span());
CPDF_Metadata metadata(stream);
auto results = metadata.CheckForSharedForm();
ASSERT_EQ(3U, results.size());
EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormEmail, results[0]);
EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormFilesystem, results[1]);
EXPECT_EQ(UnsupportedFeature::kDocumentSharedFormAcrobat, results[2]);
}