Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
xml2json_test.cc
1 #include <gtest/gtest.h>
2 #include <sstream>
3 
4 #include "utilities/utils.h"
5 #include "utilities/xml2json.h"
6 
7 TEST(xml2json, simple) {
8  {
9  std::stringstream inxml("<a/>");
10  auto j = xml2json::xml2json(inxml);
11  EXPECT_EQ(Utils::jsonToCanonicalStr(j), R"({"a":null})");
12  }
13  {
14  std::stringstream inxml(R"(<a b="xxx"/>)");
15  auto j = xml2json::xml2json(inxml);
16  EXPECT_EQ(Utils::jsonToCanonicalStr(j), R"({"a":{"@b":"xxx"}})");
17  }
18  {
19  std::stringstream inxml(R"(<a b="xxx" c="rrr"></a>)");
20  auto j = xml2json::xml2json(inxml);
21  EXPECT_EQ(Utils::jsonToCanonicalStr(j), R"({"a":{"@b":"xxx","@c":"rrr"}})");
22  }
23  {
24  std::stringstream inxml("<a>xxx</a>");
25  auto j = xml2json::xml2json(inxml);
26  EXPECT_EQ(Utils::jsonToCanonicalStr(j), R"({"a":"xxx"})");
27  }
28  {
29  std::stringstream inxml("<a><b>xxx</b></a>");
30  auto j = xml2json::xml2json(inxml);
31  EXPECT_EQ(Utils::jsonToCanonicalStr(j), R"({"a":{"b":"xxx"}})");
32  }
33  {
34  std::stringstream inxml("<a><b>xxx</b><c>yyy</c></a>");
35  auto j = xml2json::xml2json(inxml);
36  EXPECT_EQ(Utils::jsonToCanonicalStr(j), R"({"a":{"b":"xxx","c":"yyy"}})");
37  }
38  {
39  std::stringstream inxml(R"(<a xxx="1">yy</a>)");
40  auto j = xml2json::xml2json(inxml);
41  EXPECT_EQ(Utils::jsonToCanonicalStr(j), R"({"a":{"#text":"yy","@xxx":"1"}})");
42  }
43  {
44  std::stringstream inxml(R"(<a><b>1</b><c>xx</c><b>2</b></a>)");
45  auto j = xml2json::xml2json(inxml);
46  EXPECT_EQ(Utils::jsonToCanonicalStr(j), R"({"a":{"b":["1","2"],"c":"xx"}})");
47  }
48 }
49 
50 static const std::string example_manifest = R"(
51 <?xml version="1.0" encoding="UTF-8"?>
52 <manifest>
53  <remote fetch="https://github.com" name="github" pushurl="ssh://git@github.com"/>
54  <remote fetch="git://git.openembedded.org/" name="openembedded"/>
55  <remote fetch="https://git.yoctoproject.org/git/" name="yocto"/>
56 
57  <default remote="github" revision="master"/>
58 
59  <project name="advancedtelematic/meta-updater" path="meta-updater" revision="6e1c9cf5cc59437ce07f5aec2dc62d665d218bdb" upstream="master"/>
60  <project name="advancedtelematic/meta-updater-minnowboard" path="meta-updater-minnowboard" revision="c822d05f860c3a2437236696b22ef7536c0a1311" upstream="master"/>
61  <project name="advancedtelematic/meta-updater-qemux86-64" path="meta-updater-qemux86-64" revision="162d1378659343a3ad34569c1315babe7246ec86" upstream="master"/>
62  <project name="advancedtelematic/meta-updater-raspberrypi" path="meta-updater-raspberrypi" revision="501156e6d12e3207a5acb611984dce1856a7729c" upstream="master"/>
63  <project name="meta-intel" remote="yocto" revision="eacd8eb9f762c90cec2825736e8c4d483966c4d4" upstream="master"/>
64  <project name="meta-openembedded" remote="openembedded" revision="18506b797bcfe162999223b79919e7c730875bb4" upstream="master"/>
65  <project name="meta-raspberrypi" remote="yocto" revision="254c9366b9c3309db6dc07beb80aba55e0c87f94" upstream="master"/>
66  <project name="poky" remote="yocto" revision="3a751d5564fc6ee9aef225653cc7b8630fd25a35" upstream="master"/>
67  <project name="ricardosalveti/meta-updater-riscv" path="meta-updater-riscv" revision="8164a21c04a7de91f90ada763104063540a84961" upstream="master"/>
68  <project name="riscv/meta-riscv" path="meta-riscv" revision="0ba537b9270046b1c08d2b2f1cc9a9ca96ea0328" upstream="master"/>
69 </manifest>
70 )";
71 
72 static const std::string example_json =
73  R"({"manifest":{"default":{"@remote":"github","@revision":"master"},"project":[{"@name":"advancedtelematic/meta-updater","@path":"meta-updater","@revision":"6e1c9cf5cc59437ce07f5aec2dc62d665d218bdb","@upstream":"master"},{"@name":"advancedtelematic/meta-updater-minnowboard","@path":"meta-updater-minnowboard","@revision":"c822d05f860c3a2437236696b22ef7536c0a1311","@upstream":"master"},{"@name":"advancedtelematic/meta-updater-qemux86-64","@path":"meta-updater-qemux86-64","@revision":"162d1378659343a3ad34569c1315babe7246ec86","@upstream":"master"},{"@name":"advancedtelematic/meta-updater-raspberrypi","@path":"meta-updater-raspberrypi","@revision":"501156e6d12e3207a5acb611984dce1856a7729c","@upstream":"master"},{"@name":"meta-intel","@remote":"yocto","@revision":"eacd8eb9f762c90cec2825736e8c4d483966c4d4","@upstream":"master"},{"@name":"meta-openembedded","@remote":"openembedded","@revision":"18506b797bcfe162999223b79919e7c730875bb4","@upstream":"master"},{"@name":"meta-raspberrypi","@remote":"yocto","@revision":"254c9366b9c3309db6dc07beb80aba55e0c87f94","@upstream":"master"},{"@name":"poky","@remote":"yocto","@revision":"3a751d5564fc6ee9aef225653cc7b8630fd25a35","@upstream":"master"},{"@name":"ricardosalveti/meta-updater-riscv","@path":"meta-updater-riscv","@revision":"8164a21c04a7de91f90ada763104063540a84961","@upstream":"master"},{"@name":"riscv/meta-riscv","@path":"meta-riscv","@revision":"0ba537b9270046b1c08d2b2f1cc9a9ca96ea0328","@upstream":"master"}],"remote":[{"@fetch":"https://github.com","@name":"github","@pushurl":"ssh://git@github.com"},{"@fetch":"git://git.openembedded.org/","@name":"openembedded"},{"@fetch":"https://git.yoctoproject.org/git/","@name":"yocto"}]}})";
74 
75 TEST(xml2json, manifest) {
76  std::stringstream inxml(example_manifest);
77  auto j = xml2json::xml2json(inxml);
78  EXPECT_EQ(Utils::jsonToCanonicalStr(j), example_json);
79 }
80 
81 TEST(xml2json, bad_input) {
82  {
83  // wrong xml
84  std::stringstream inxml("<a");
85  EXPECT_THROW(xml2json::xml2json(inxml), std::runtime_error);
86  }
87  {
88  // too deep
89  std::stringstream inxml("<a><a><a><a><a><a><a><a><a><a><a>xxx</a></a></a></a></a></a></a></a></a></a></a>");
90  EXPECT_THROW(xml2json::xml2json(inxml), std::runtime_error);
91  }
92 }
93 
94 #ifndef __NO_MAIN__
95 int main(int argc, char **argv) {
96  ::testing::InitGoogleTest(&argc, argv);
97  return RUN_ALL_TESTS();
98 }
99 #endif