1 /*
2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "third_party/libjingle_xmpp/xmllite/xmlnsstack.h"
12 
13 #include <iostream>
14 #include <sstream>
15 #include <string>
16 
17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "third_party/libjingle_xmpp/xmllite/xmlconstants.h"
19 
20 using jingle_xmpp::NS_XML;
21 using jingle_xmpp::NS_XMLNS;
22 using jingle_xmpp::QName;
23 using jingle_xmpp::XmlnsStack;
24 
TEST(XmlnsStackTest,TestBuiltin)25 TEST(XmlnsStackTest, TestBuiltin) {
26   XmlnsStack stack;
27 
28   EXPECT_EQ(std::string(NS_XML), stack.NsForPrefix("xml").first);
29   EXPECT_EQ(std::string(NS_XMLNS), stack.NsForPrefix("xmlns").first);
30   EXPECT_EQ("", stack.NsForPrefix("").first);
31 
32   EXPECT_EQ("xml", stack.PrefixForNs(NS_XML, false).first);
33   EXPECT_EQ("xmlns", stack.PrefixForNs(NS_XMLNS, false).first);
34   EXPECT_EQ("", stack.PrefixForNs("", false).first);
35   EXPECT_EQ("", stack.PrefixForNs("", true).first);
36 }
37 
TEST(XmlnsStackTest,TestNsForPrefix)38 TEST(XmlnsStackTest, TestNsForPrefix) {
39  XmlnsStack stack;
40   stack.AddXmlns("pre1", "ns1");
41   stack.AddXmlns("pre2", "ns2");
42   stack.AddXmlns("pre1", "ns3");
43   stack.AddXmlns("", "ns4");
44 
45   EXPECT_EQ("ns3", stack.NsForPrefix("pre1").first);
46   EXPECT_TRUE(stack.NsForPrefix("pre1").second);
47   EXPECT_EQ("ns2", stack.NsForPrefix("pre2").first);
48   EXPECT_EQ("ns4", stack.NsForPrefix("").first);
49   EXPECT_EQ("", stack.NsForPrefix("pre3").first);
50   EXPECT_FALSE(stack.NsForPrefix("pre3").second);
51 }
52 
TEST(XmlnsStackTest,TestPrefixForNs)53 TEST(XmlnsStackTest, TestPrefixForNs) {
54   XmlnsStack stack;
55   stack.AddXmlns("pre1", "ns1");
56   stack.AddXmlns("pre2", "ns2");
57   stack.AddXmlns("pre1", "ns3");
58   stack.AddXmlns("pre3", "ns2");
59   stack.AddXmlns("pre4", "ns4");
60   stack.AddXmlns("", "ns4");
61 
62   EXPECT_EQ("", stack.PrefixForNs("ns1", false).first);
63   EXPECT_FALSE(stack.PrefixForNs("ns1", false).second);
64   EXPECT_EQ("", stack.PrefixForNs("ns1", true).first);
65   EXPECT_FALSE(stack.PrefixForNs("ns1", true).second);
66   EXPECT_EQ("pre3", stack.PrefixForNs("ns2", false).first);
67   EXPECT_TRUE(stack.PrefixForNs("ns2", false).second);
68   EXPECT_EQ("pre3", stack.PrefixForNs("ns2", true).first);
69   EXPECT_TRUE(stack.PrefixForNs("ns2", true).second);
70   EXPECT_EQ("pre1", stack.PrefixForNs("ns3", false).first);
71   EXPECT_EQ("pre1", stack.PrefixForNs("ns3", true).first);
72   EXPECT_EQ("", stack.PrefixForNs("ns4", false).first);
73   EXPECT_TRUE(stack.PrefixForNs("ns4", false).second);
74   EXPECT_EQ("pre4", stack.PrefixForNs("ns4", true).first);
75   EXPECT_EQ("", stack.PrefixForNs("ns5", false).first);
76   EXPECT_FALSE(stack.PrefixForNs("ns5", false).second);
77   EXPECT_EQ("", stack.PrefixForNs("ns5", true).first);
78   EXPECT_EQ("", stack.PrefixForNs("", false).first);
79   EXPECT_EQ("", stack.PrefixForNs("", true).first);
80 
81   stack.AddXmlns("", "ns6");
82   EXPECT_EQ("", stack.PrefixForNs("ns6", false).first);
83   EXPECT_TRUE(stack.PrefixForNs("ns6", false).second);
84   EXPECT_EQ("", stack.PrefixForNs("ns6", true).first);
85   EXPECT_FALSE(stack.PrefixForNs("ns6", true).second);
86 }
87 
TEST(XmlnsStackTest,TestFrames)88 TEST(XmlnsStackTest, TestFrames) {
89   XmlnsStack stack;
90   stack.PushFrame();
91   stack.AddXmlns("pre1", "ns1");
92   stack.AddXmlns("pre2", "ns2");
93 
94   stack.PushFrame();
95   stack.AddXmlns("pre1", "ns3");
96   stack.AddXmlns("pre3", "ns2");
97   stack.AddXmlns("pre4", "ns4");
98 
99   stack.PushFrame();
100   stack.PushFrame();
101   stack.AddXmlns("", "ns4");
102 
103   // basic test
104   EXPECT_EQ("ns3", stack.NsForPrefix("pre1").first);
105   EXPECT_EQ("ns2", stack.NsForPrefix("pre2").first);
106   EXPECT_EQ("ns2", stack.NsForPrefix("pre3").first);
107   EXPECT_EQ("ns4", stack.NsForPrefix("pre4").first);
108   EXPECT_EQ("", stack.NsForPrefix("pre5").first);
109   EXPECT_FALSE(stack.NsForPrefix("pre5").second);
110   EXPECT_EQ("ns4", stack.NsForPrefix("").first);
111   EXPECT_TRUE(stack.NsForPrefix("").second);
112 
113   // pop the default xmlns definition
114   stack.PopFrame();
115   EXPECT_EQ("ns3", stack.NsForPrefix("pre1").first);
116   EXPECT_EQ("ns2", stack.NsForPrefix("pre2").first);
117   EXPECT_EQ("ns2", stack.NsForPrefix("pre3").first);
118   EXPECT_EQ("ns4", stack.NsForPrefix("pre4").first);
119   EXPECT_EQ("", stack.NsForPrefix("pre5").first);
120   EXPECT_FALSE(stack.NsForPrefix("pre5").second);
121   EXPECT_EQ("", stack.NsForPrefix("").first);
122   EXPECT_TRUE(stack.NsForPrefix("").second);
123 
124   // pop empty frame (nop)
125   stack.PopFrame();
126   EXPECT_EQ("ns3", stack.NsForPrefix("pre1").first);
127   EXPECT_EQ("ns2", stack.NsForPrefix("pre2").first);
128   EXPECT_EQ("ns2", stack.NsForPrefix("pre3").first);
129   EXPECT_EQ("ns4", stack.NsForPrefix("pre4").first);
130   EXPECT_EQ("", stack.NsForPrefix("pre5").first);
131   EXPECT_FALSE(stack.NsForPrefix("pre5").second);
132   EXPECT_EQ("", stack.NsForPrefix("").first);
133   EXPECT_TRUE(stack.NsForPrefix("").second);
134 
135   // pop frame with three defs
136   stack.PopFrame();
137   EXPECT_EQ("ns1", stack.NsForPrefix("pre1").first);
138   EXPECT_EQ("ns2", stack.NsForPrefix("pre2").first);
139   EXPECT_EQ("", stack.NsForPrefix("pre3").first);
140   EXPECT_FALSE(stack.NsForPrefix("pre3").second);
141   EXPECT_EQ("", stack.NsForPrefix("pre4").first);
142   EXPECT_FALSE(stack.NsForPrefix("pre4").second);
143   EXPECT_EQ("", stack.NsForPrefix("pre5").first);
144   EXPECT_FALSE(stack.NsForPrefix("pre5").second);
145   EXPECT_EQ("", stack.NsForPrefix("").first);
146   EXPECT_TRUE(stack.NsForPrefix("").second);
147 
148   // pop frame with last two defs
149   stack.PopFrame();
150   EXPECT_FALSE(stack.NsForPrefix("pre1").second);
151   EXPECT_FALSE(stack.NsForPrefix("pre2").second);
152   EXPECT_FALSE(stack.NsForPrefix("pre3").second);
153   EXPECT_FALSE(stack.NsForPrefix("pre4").second);
154   EXPECT_FALSE(stack.NsForPrefix("pre5").second);
155   EXPECT_TRUE(stack.NsForPrefix("").second);
156   EXPECT_EQ("", stack.NsForPrefix("pre1").first);
157   EXPECT_EQ("", stack.NsForPrefix("pre2").first);
158   EXPECT_EQ("", stack.NsForPrefix("pre3").first);
159   EXPECT_EQ("", stack.NsForPrefix("pre4").first);
160   EXPECT_EQ("", stack.NsForPrefix("pre5").first);
161   EXPECT_EQ("", stack.NsForPrefix("").first);
162 }
163 
TEST(XmlnsStackTest,TestAddNewPrefix)164 TEST(XmlnsStackTest, TestAddNewPrefix) {
165   XmlnsStack stack;
166 
167   // builtin namespaces cannot be added
168   EXPECT_FALSE(stack.AddNewPrefix("", true).second);
169   EXPECT_FALSE(stack.AddNewPrefix("", false).second);
170   EXPECT_FALSE(stack.AddNewPrefix(NS_XML, true).second);
171   EXPECT_FALSE(stack.AddNewPrefix(NS_XML, false).second);
172   EXPECT_FALSE(stack.AddNewPrefix(NS_XMLNS, true).second);
173   EXPECT_FALSE(stack.AddNewPrefix(NS_XMLNS, false).second);
174 
175   // namespaces already added cannot be added again.
176   EXPECT_EQ("foo", stack.AddNewPrefix("http://a.b.com/foo.htm", true).first);
177   EXPECT_EQ("bare", stack.AddNewPrefix("http://a.b.com/bare", false).first);
178   EXPECT_EQ("z", stack.AddNewPrefix("z", false).first);
179   EXPECT_FALSE(stack.AddNewPrefix("http://a.b.com/foo.htm", true).second);
180   EXPECT_FALSE(stack.AddNewPrefix("http://a.b.com/bare", true).second);
181   EXPECT_FALSE(stack.AddNewPrefix("z", true).second);
182   EXPECT_FALSE(stack.AddNewPrefix("http://a.b.com/foo.htm", false).second);
183   EXPECT_FALSE(stack.AddNewPrefix("http://a.b.com/bare", false).second);
184   EXPECT_FALSE(stack.AddNewPrefix("z", false).second);
185 
186   // default namespace usable by non-attributes only
187   stack.AddXmlns("", "http://my/default");
188   EXPECT_FALSE(stack.AddNewPrefix("http://my/default", false).second);
189   EXPECT_EQ("def", stack.AddNewPrefix("http://my/default", true).first);
190 
191   // namespace cannot start with 'xml'
192   EXPECT_EQ("ns", stack.AddNewPrefix("http://a.b.com/xmltest", true).first);
193   EXPECT_EQ("ns2", stack.AddNewPrefix("xmlagain", false).first);
194 
195   // verify added namespaces are still defined
196   EXPECT_EQ("http://a.b.com/foo.htm", stack.NsForPrefix("foo").first);
197   EXPECT_TRUE(stack.NsForPrefix("foo").second);
198   EXPECT_EQ("http://a.b.com/bare", stack.NsForPrefix("bare").first);
199   EXPECT_TRUE(stack.NsForPrefix("bare").second);
200   EXPECT_EQ("z", stack.NsForPrefix("z").first);
201   EXPECT_TRUE(stack.NsForPrefix("z").second);
202   EXPECT_EQ("http://my/default", stack.NsForPrefix("").first);
203   EXPECT_TRUE(stack.NsForPrefix("").second);
204   EXPECT_EQ("http://my/default", stack.NsForPrefix("def").first);
205   EXPECT_TRUE(stack.NsForPrefix("def").second);
206   EXPECT_EQ("http://a.b.com/xmltest", stack.NsForPrefix("ns").first);
207   EXPECT_TRUE(stack.NsForPrefix("ns").second);
208   EXPECT_EQ("xmlagain", stack.NsForPrefix("ns2").first);
209   EXPECT_TRUE(stack.NsForPrefix("ns2").second);
210 }
211 
TEST(XmlnsStackTest,TestFormatQName)212 TEST(XmlnsStackTest, TestFormatQName) {
213   XmlnsStack stack;
214   stack.AddXmlns("pre1", "ns1");
215   stack.AddXmlns("pre2", "ns2");
216   stack.AddXmlns("pre1", "ns3");
217   stack.AddXmlns("", "ns4");
218 
219   EXPECT_EQ("zip",
220       stack.FormatQName(QName("ns1", "zip"), false));  // no match
221   EXPECT_EQ("pre2:abracadabra",
222       stack.FormatQName(QName("ns2", "abracadabra"), false));
223   EXPECT_EQ("pre1:a",
224       stack.FormatQName(QName("ns3", "a"), false));
225   EXPECT_EQ("simple",
226       stack.FormatQName(QName("ns4", "simple"), false));
227   EXPECT_EQ("root",
228       stack.FormatQName(QName("", "root"), false));  // no match
229 
230   EXPECT_EQ("zip",
231       stack.FormatQName(QName("ns1", "zip"), true));  // no match
232   EXPECT_EQ("pre2:abracadabra",
233       stack.FormatQName(QName("ns2", "abracadabra"), true));
234   EXPECT_EQ("pre1:a",
235       stack.FormatQName(QName("ns3", "a"), true));
236   EXPECT_EQ("simple",
237       stack.FormatQName(QName("ns4", "simple"), true));  // no match
238   EXPECT_EQ("root",
239       stack.FormatQName(QName("", "root"), true));
240 }
241