diff options
author | Artem Strygin <art-snake@yandex-team.ru> | 2017-09-01 16:03:58 +0300 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-09-05 15:55:27 +0000 |
commit | 16b77c7176313531609a3a062d286f555c4710a1 (patch) | |
tree | 9f2bb253cbb4f33edff7139e435abb62486b9f00 /core/fpdfapi/parser/cpdf_indirect_object_holder_unittest.cpp | |
parent | d2608a87173f00cb80830d56b52eeb588055ba3a (diff) | |
download | pdfium-16b77c7176313531609a3a062d286f555c4710a1.tar.xz |
Refactoring of CPDF_IndirectObjectHolder.
CPDF_IndirectObjectHolder is optimized.
Recursively parsing of same object has been fixed.
Change-Id: I22e5cfd6b03eee0677f2b1f8ba32bf29cad441fc
Reviewed-on: https://pdfium-review.googlesource.com/12590
Reviewed-by: dsinclair <dsinclair@chromium.org>
Commit-Queue: Art Snake <art-snake@yandex-team.ru>
Diffstat (limited to 'core/fpdfapi/parser/cpdf_indirect_object_holder_unittest.cpp')
-rw-r--r-- | core/fpdfapi/parser/cpdf_indirect_object_holder_unittest.cpp | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder_unittest.cpp b/core/fpdfapi/parser/cpdf_indirect_object_holder_unittest.cpp new file mode 100644 index 0000000000..666264f50b --- /dev/null +++ b/core/fpdfapi/parser/cpdf_indirect_object_holder_unittest.cpp @@ -0,0 +1,81 @@ +// Copyright 2017 PDFium 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 "core/fpdfapi/parser/cpdf_indirect_object_holder.h" + +#include <memory> +#include <utility> + +#include "core/fpdfapi/parser/cpdf_null.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/base/ptr_util.h" + +namespace { + +class MockIndirectObjectHolder : public CPDF_IndirectObjectHolder { + public: + MockIndirectObjectHolder() {} + ~MockIndirectObjectHolder() override {} + + MOCK_METHOD1(ParseIndirectObject, + std::unique_ptr<CPDF_Object>(uint32_t objnum)); +}; + +} // namespace + +TEST(CPDF_IndirectObjectHolderTest, RecursiveParseOfSameObject) { + MockIndirectObjectHolder mock_holder; + // ParseIndirectObject should not be called again on recursively same object + // parse request. + EXPECT_CALL(mock_holder, ParseIndirectObject(::testing::_)) + .WillOnce(::testing::WithArg<0>(::testing::Invoke( + [&mock_holder](uint32_t objnum) -> std::unique_ptr<CPDF_Object> { + const CPDF_Object* same_parse = + mock_holder.GetOrParseIndirectObject(objnum); + CHECK(!same_parse); + return pdfium::MakeUnique<CPDF_Null>(); + }))); + + EXPECT_TRUE(mock_holder.GetOrParseIndirectObject(1000)); +} + +TEST(CPDF_IndirectObjectHolderTest, GetObjectMethods) { + static constexpr uint32_t kObjNum = 1000; + MockIndirectObjectHolder mock_holder; + + EXPECT_CALL(mock_holder, ParseIndirectObject(::testing::_)).Times(0); + EXPECT_FALSE(mock_holder.GetIndirectObject(kObjNum)); + ::testing::Mock::VerifyAndClearExpectations(&mock_holder); + + EXPECT_CALL(mock_holder, ParseIndirectObject(::testing::_)) + .WillOnce(::testing::WithArg<0>(::testing::Invoke( + [](uint32_t objnum) -> std::unique_ptr<CPDF_Object> { + return pdfium::MakeUnique<CPDF_Null>(); + }))); + EXPECT_TRUE(mock_holder.GetOrParseIndirectObject(kObjNum)); + ::testing::Mock::VerifyAndClearExpectations(&mock_holder); + + EXPECT_CALL(mock_holder, ParseIndirectObject(::testing::_)).Times(0); + ASSERT_TRUE(mock_holder.GetIndirectObject(kObjNum)); + ::testing::Mock::VerifyAndClearExpectations(&mock_holder); + + EXPECT_EQ(kObjNum, mock_holder.GetIndirectObject(kObjNum)->GetObjNum()); +} + +TEST(CPDF_IndirectObjectHolderTest, ParseInvalidObjNum) { + MockIndirectObjectHolder mock_holder; + + EXPECT_CALL(mock_holder, ParseIndirectObject(::testing::_)).Times(0); + EXPECT_FALSE( + mock_holder.GetOrParseIndirectObject(CPDF_Object::kInvalidObjNum)); +} + +TEST(CPDF_IndirectObjectHolderTest, ReplaceObjectWithInvalidObjNum) { + MockIndirectObjectHolder mock_holder; + + EXPECT_CALL(mock_holder, ParseIndirectObject(::testing::_)).Times(0); + EXPECT_FALSE(mock_holder.ReplaceIndirectObjectIfHigherGeneration( + CPDF_Object::kInvalidObjNum, pdfium::MakeUnique<CPDF_Null>())); +} |