1 | //===-- XMLTest.cpp -------------------------------------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "lldb/Host/XML.h" |
10 | #include "gtest/gtest.h" |
11 | |
12 | using namespace lldb_private; |
13 | |
14 | #if LLDB_ENABLE_LIBXML2 |
15 | |
16 | static void assertGetElement(XMLNode &root, const char *element_name, |
17 | bool expected_uint_success, uint64_t expected_uint, |
18 | bool expected_double_success, |
19 | double expected_double) { |
20 | XMLNode node = root.FindFirstChildElementWithName(name: element_name); |
21 | ASSERT_TRUE(node.IsValid()); |
22 | |
23 | uint64_t uint_val; |
24 | EXPECT_EQ(node.GetElementTextAsUnsigned(uint_val, 66, 0), |
25 | expected_uint_success); |
26 | EXPECT_EQ(uint_val, expected_uint); |
27 | |
28 | double double_val; |
29 | EXPECT_EQ(node.GetElementTextAsFloat(double_val, 66.0), |
30 | expected_double_success); |
31 | EXPECT_EQ(double_val, expected_double); |
32 | |
33 | XMLNode attr_node = root.FindFirstChildElementWithName(name: "attr" ); |
34 | ASSERT_TRUE(node.IsValid()); |
35 | |
36 | EXPECT_EQ( |
37 | attr_node.GetAttributeValueAsUnsigned(element_name, uint_val, 66, 0), |
38 | expected_uint_success); |
39 | EXPECT_EQ(uint_val, expected_uint); |
40 | } |
41 | |
42 | #define ASSERT_GET(element_name, ...) \ |
43 | { \ |
44 | SCOPED_TRACE("at element/attribute " element_name); \ |
45 | assertGetElement(root, element_name, __VA_ARGS__); \ |
46 | } |
47 | |
48 | TEST(XML, GetAs) { |
49 | std::string test_xml = |
50 | "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" |
51 | "<test>\n" |
52 | " <empty/>\n" |
53 | " <text>123foo</text>\n" |
54 | " <positive-int>11</positive-int>\n" |
55 | " <negative-int>-11</negative-int>\n" |
56 | " <positive-overflow>18446744073709551616</positive-overflow>\n" |
57 | " <negative-overflow>-9223372036854775809</negative-overflow>\n" |
58 | " <hex>0x1234</hex>\n" |
59 | " <positive-float>12.5</positive-float>\n" |
60 | " <negative-float>-12.5</negative-float>\n" |
61 | " <attr empty=\"\"\n" |
62 | " text=\"123foo\"\n" |
63 | " positive-int=\"11\"\n" |
64 | " negative-int=\"-11\"\n" |
65 | " positive-overflow=\"18446744073709551616\"\n" |
66 | " negative-overflow=\"-9223372036854775809\"\n" |
67 | " hex=\"0x1234\"\n" |
68 | " positive-float=\"12.5\"\n" |
69 | " negative-float=\"-12.5\"\n" |
70 | " />\n" |
71 | "</test>\n" ; |
72 | |
73 | XMLDocument doc; |
74 | ASSERT_TRUE(doc.ParseMemory(test_xml.data(), test_xml.size())); |
75 | |
76 | XMLNode root = doc.GetRootElement(); |
77 | ASSERT_TRUE(root.IsValid()); |
78 | |
79 | ASSERT_GET("empty" , false, 66, false, 66.0); |
80 | ASSERT_GET("text" , false, 66, false, 66.0); |
81 | ASSERT_GET("positive-int" , true, 11, true, 11.0); |
82 | ASSERT_GET("negative-int" , false, 66, true, -11.0); |
83 | ASSERT_GET("positive-overflow" , false, 66, true, 18446744073709551616.0); |
84 | ASSERT_GET("negative-overflow" , false, 66, true, -9223372036854775809.0); |
85 | ASSERT_GET("hex" , true, 0x1234, true, 4660.0); |
86 | ASSERT_GET("positive-float" , false, 66, true, 12.5); |
87 | ASSERT_GET("negative-float" , false, 66, true, -12.5); |
88 | } |
89 | |
90 | #else // !LLDB_ENABLE_LIBXML2 |
91 | |
92 | TEST(XML, GracefulNoXML) { |
93 | std::string test_xml = |
94 | "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" |
95 | "<test>\n" |
96 | " <text attribute=\"123\">123</text>\n" |
97 | "</test>\n" ; |
98 | |
99 | XMLDocument doc; |
100 | ASSERT_FALSE(doc.ParseMemory(test_xml.data(), test_xml.size())); |
101 | |
102 | XMLNode root = doc.GetRootElement(); |
103 | EXPECT_FALSE(root.IsValid()); |
104 | |
105 | XMLNode node = root.FindFirstChildElementWithName("text" ); |
106 | EXPECT_FALSE(node.IsValid()); |
107 | |
108 | uint64_t uint_val; |
109 | EXPECT_FALSE(node.GetElementTextAsUnsigned(uint_val, 66, 0)); |
110 | EXPECT_EQ(uint_val, 66U); |
111 | EXPECT_FALSE(node.GetAttributeValueAsUnsigned("attribute" , uint_val, 66, 0)); |
112 | EXPECT_EQ(uint_val, 66U); |
113 | |
114 | double double_val; |
115 | EXPECT_FALSE(node.GetElementTextAsFloat(double_val, 66.0)); |
116 | EXPECT_EQ(double_val, 66.0); |
117 | } |
118 | |
119 | #endif // LLDB_ENABLE_LIBXML2 |
120 | |