diff options
author | Ryan Mitchell <rtmitchell@google.com> | 2018-04-27 14:53:04 -0700 |
---|---|---|
committer | Ryan Mitchell <rtmitchell@google.com> | 2018-05-02 17:53:21 +0000 |
commit | 0dcb20c72742a1de30b4984c4b8996d76cb7a428 (patch) | |
tree | d6d925dbf4fffd271e851d12720c5718cbc3a2eb /tools/aapt2/format/binary/XmlFlattener_test.cpp | |
parent | 12f404e3e33c21a4f0d634698bef94c219ec48ab (diff) |
AAPT2: Fix quoted text in res/xml assets
AAPT2 aggressively processed xml nodes and regressed from the behavior
of AAPT. This change restores AAPT's processing of xml nodes with
quotations.
Bug: 71805084
Test: Created tests in XmlFlattener_test.cpp and ran the test in the
Android Studio project given in the bug
Change-Id: Idedb4f1002e9fd705ceb5feae35289235b754b02
Diffstat (limited to 'tools/aapt2/format/binary/XmlFlattener_test.cpp')
-rw-r--r-- | tools/aapt2/format/binary/XmlFlattener_test.cpp | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/tools/aapt2/format/binary/XmlFlattener_test.cpp b/tools/aapt2/format/binary/XmlFlattener_test.cpp index 08243feb3769..25786b1659e7 100644 --- a/tools/aapt2/format/binary/XmlFlattener_test.cpp +++ b/tools/aapt2/format/binary/XmlFlattener_test.cpp @@ -286,6 +286,165 @@ TEST_F(XmlFlattenerTest, ProcessEscapedStrings) { EXPECT_THAT(tree.getText(&len), StrEq(u"\\d{5}")); } +TEST_F(XmlFlattenerTest, ProcessQuotes) { + std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom( + R"(<root> + <item>Regular text</item> + <item>"Text in double quotes"</item> + <item>'Text in single quotes'</item> + <item>Text containing "double quotes"</item> + <item>Text containing 'single quotes'</item> + </root>)"); + + size_t len; + android::ResXMLTree tree; + + XmlFlattenerOptions options; + ASSERT_TRUE(Flatten(doc.get(), &tree, options)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u"Regular text")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u"\"Text in double quotes\"")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementNamespace(&len), IsNull()); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u"'Text in single quotes'")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u"Text containing \"double quotes\"")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u"Text containing 'single quotes'")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_DOCUMENT)); +} + +TEST_F(XmlFlattenerTest, ProcessWhitepspace) { + std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom( + R"(<root> + <item> Compact Spaces </item> + <item> + A + </item> + <item>B </item> + <item>C </item> + <item> D </item> + <item> E</item> + <item> F</item> + <item> G </item> + <item> H </item> +<item> +I +</item> +<item> + + J + +</item> + <item> + </item> + </root>)"); + + size_t len; + android::ResXMLTree tree; + + XmlFlattenerOptions options; + ASSERT_TRUE(Flatten(doc.get(), &tree, options)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u" Compact Spaces ")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u" A ")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u"B ")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u"C ")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u" D ")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u" E")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u" F")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u" G ")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u" H ")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u" I ")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u" J ")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_DOCUMENT)); +} + TEST_F(XmlFlattenerTest, FlattenRawValueOnlyMakesCompiledValueToo) { std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"(<element foo="bar" />)"); |