// Copyright 2017 The 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/fxcrt/xml/cfx_saxreader.h" #include "core/fxcrt/cfx_memorystream.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/test_support.h" using testing::_; using testing::Eq; using testing::Return; namespace { class MockHandler : public CFX_SAXReader::HandlerIface { public: MOCK_METHOD3(OnTagEnter, CFX_SAXContext*(const CFX_ByteStringC& bsTagName, CFX_SAXItem::Type eType, uint32_t dwStartPos)); MOCK_METHOD3(OnTagAttribute, void(CFX_SAXContext* pTag, const CFX_ByteStringC& bsAttri, const CFX_ByteStringC& bsValue)); MOCK_METHOD1(OnTagBreak, void(CFX_SAXContext* pTag)); MOCK_METHOD4(OnTagData, void(CFX_SAXContext* pTag, CFX_SAXItem::Type eType, const CFX_ByteStringC& bsData, uint32_t dwStartPos)); MOCK_METHOD2(OnTagClose, void(CFX_SAXContext* pTag, uint32_t dwEndPos)); MOCK_METHOD3(OnTagEnd, void(CFX_SAXContext* pTag, const CFX_ByteStringC& bsTagName, uint32_t dwEndPos)); MOCK_METHOD4(OnTargetData, void(CFX_SAXContext* pTag, CFX_SAXItem::Type eType, const CFX_ByteStringC& bsData, uint32_t dwStartPos)); }; } // namespace class CFX_SAXReaderTest : public testing::Test { public: void SetHandler(CFX_SAXReader::HandlerIface* handler) { reader_.SetHandler(handler); } bool StartParse(char* str) { return reader_.StartParse( pdfium::MakeRetain( reinterpret_cast(str), strlen(str), false), 0, static_cast(-1), CFX_SaxParseMode_NotSkipSpace) >= 0; } int32_t ContinueParse() { int32_t ret; do { ret = reader_.ContinueParse(); } while (ret >= 0 && ret < 100); return ret; } private: CFX_SAXReader reader_; }; TEST_F(CFX_SAXReaderTest, Null) { char data[] = ""; ASSERT_FALSE(StartParse(data)); } TEST_F(CFX_SAXReaderTest, SimpleText) { MockHandler mock; SetHandler(&mock); char data[] = "clams"; ASSERT_TRUE(StartParse(data)); EXPECT_EQ(100, ContinueParse()); } TEST_F(CFX_SAXReaderTest, SimpleTag) { MockHandler mock; EXPECT_CALL(mock, OnTagEnter(Eq("clams"), _, _)); EXPECT_CALL(mock, OnTagBreak(_)); SetHandler(&mock); char data[] = ""; ASSERT_TRUE(StartParse(data)); EXPECT_EQ(100, ContinueParse()); } TEST_F(CFX_SAXReaderTest, AttributeTag) { MockHandler mock; EXPECT_CALL(mock, OnTagEnter(Eq("clams"), _, _)); EXPECT_CALL(mock, OnTagAttribute(_, Eq("size"), Eq("small"))); EXPECT_CALL(mock, OnTagAttribute(_, Eq("color"), Eq("red"))); EXPECT_CALL(mock, OnTagBreak(_)); SetHandler(&mock); char data[] = ""; ASSERT_TRUE(StartParse(data)); EXPECT_EQ(100, ContinueParse()); } TEST_F(CFX_SAXReaderTest, AttributeEntityTag) { MockHandler mock; EXPECT_CALL(mock, OnTagEnter(Eq("clams"), _, _)); EXPECT_CALL(mock, OnTagAttribute(_, Eq("predicate"), Eq("1 < 2"))); EXPECT_CALL(mock, OnTagBreak(_)); SetHandler(&mock); char data[] = ""; ASSERT_TRUE(StartParse(data)); EXPECT_EQ(100, ContinueParse()); } TEST_F(CFX_SAXReaderTest, TextWithinTag) { MockHandler mock; EXPECT_CALL(mock, OnTagEnter(Eq("b"), _, _)); EXPECT_CALL(mock, OnTagBreak(_)); EXPECT_CALL(mock, OnTagData(_, _, Eq("biff"), _)); EXPECT_CALL(mock, OnTagEnd(_, Eq("b"), _)); SetHandler(&mock); char data[] = "biff"; ASSERT_TRUE(StartParse(data)); EXPECT_EQ(100, ContinueParse()); } TEST_F(CFX_SAXReaderTest, bug_711459) { char data[] = "&ax;"; ASSERT_TRUE(StartParse(data)); EXPECT_EQ(100, ContinueParse()); }