summaryrefslogtreecommitdiff
path: root/ept/apt/recordparser-test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ept/apt/recordparser-test.cc')
-rw-r--r--ept/apt/recordparser-test.cc200
1 files changed, 200 insertions, 0 deletions
diff --git a/ept/apt/recordparser-test.cc b/ept/apt/recordparser-test.cc
new file mode 100644
index 0000000..4e01e6b
--- /dev/null
+++ b/ept/apt/recordparser-test.cc
@@ -0,0 +1,200 @@
+#include "ept/test.h"
+#include "recordparser.h"
+
+using namespace ept::tests;
+using namespace std;
+using namespace ept;
+using namespace ept::apt;
+
+namespace {
+
+const char* test_record =
+ "A:\n"
+ "D: da de di do du\n"
+ "B: b\n"
+ "C: c \n"
+ "Desc: this is the beginning\n"
+ " this is the continuation\n"
+ " this is the end\n";
+
+class Tests : public TestCase
+{
+ using TestCase::TestCase;
+
+ void register_tests() override
+ {
+ add_method("parsing", []() {
+ // Check that the fields are identified and broken up correctly
+ RecordParser p(test_record);
+
+ wassert(actual(p.record()) == test_record);
+ wassert(actual(p.size()) == 5u);
+ });
+
+ add_method("field_tuples", []() {
+ RecordParser p(test_record);
+ wassert(actual(p.field(0)) == "A:\n");
+ wassert(actual(p.field(1)) == "D: da de di do du\n");
+ wassert(actual(p.field(2)) == "B: b\n");
+ wassert(actual(p.field(3)) == "C: c \n");
+ wassert(actual(p.field(4)) == "Desc: this is the beginning\n this is the continuation\n this is the end\n");
+ });
+
+ add_method("field_keys", []() {
+ RecordParser p(test_record);
+ wassert(actual(p.name(0)) == "A");
+ wassert(actual(p.name(1)) == "D");
+ wassert(actual(p.name(2)) == "B");
+ wassert(actual(p.name(3)) == "C");
+ wassert(actual(p.name(4)) == "Desc");
+ });
+
+ add_method("field_values", []() {
+ RecordParser p(test_record);
+ wassert(actual(p[0]) == "");
+ wassert(actual(p[1]) == "da de di do du");
+ wassert(actual(p[2]) == "b");
+ wassert(actual(p[3]) == "c");
+ wassert(actual(p[4]) == "this is the beginning\n this is the continuation\n this is the end");
+ });
+
+ add_method("find_byname", []() {
+ // Check that the field search by name finds all the fields
+ RecordParser p(test_record);
+
+ wassert(actual(p.index("A")) == 0u);
+ wassert(actual(p.index("D")) == 1u);
+ wassert(actual(p.index("B")) == 2u);
+ wassert(actual(p.index("C")) == 3u);
+ wassert(actual(p.index("Desc")) == 4u);
+
+ wassert(actual(p.name(p.index("A"))) == "A");
+ wassert(actual(p.name(p.index("B"))) == "B");
+ wassert(actual(p.name(p.index("C"))) == "C");
+ wassert(actual(p.name(p.index("D"))) == "D");
+ wassert(actual(p.name(p.index("Desc"))) == "Desc");
+ });
+
+ add_method("indexing", []() {
+ RecordParser p(test_record);
+ wassert(actual(p["A"]) == "");
+ wassert(actual(p["B"]) == "b");
+ wassert(actual(p["C"]) == "c");
+ wassert(actual(p["D"]) == "da de di do du");
+ wassert(actual(p["Desc"]) == "this is the beginning\n this is the continuation\n this is the end");
+ });
+
+ add_method("missing_behaviour", []() {
+ RecordParser p(test_record);
+ // Missing fields give empty strings
+ wassert(actual(p.field(100)) == "");
+ wassert(actual(p.name(100)) == "");
+ wassert(actual(p[100]) == "");
+ wassert(actual(p["Missing"]) == "");
+ });
+
+ add_method("rescan", []() {
+ // Check that scanning twice replaces the old fields
+ std::string record =
+ "A: a\n"
+ "B: b\n"
+ "C: c\n";
+
+ RecordParser p(record);
+ wassert(actual(p.size()) == 3u);
+ wassert(actual(p["A"]) == "a");
+ wassert(actual(p["B"]) == "b");
+ wassert(actual(p["C"]) == "c");
+
+ std::string record1 =
+ "Foo: bar\n"
+ "A: different\n";
+
+ p.scan(record1);
+
+ //for (size_t i = 0; i < p.size(); ++i)
+ // cerr << ">> " << i << "==" << p.index(p.name(i)) << " " << p.name(i) << " " << p[i] << endl;
+
+ wassert(actual(p.size()) == 2u);
+ wassert(actual(p["A"]) == "different");
+ wassert(actual(p["B"]) == "");
+ wassert(actual(p["C"]) == "");
+ wassert(actual(p["Foo"]) == "bar");
+ });
+
+ add_method("real_life", []() {
+ // Real-life example
+ string record =
+ "Package: apt\n"
+ "Priority: important\n"
+ "Section: admin\n"
+ "Installed-Size: 4368\n"
+ "Maintainer: APT Development Team <deity@lists.debian.org>\n"
+ "Architecture: amd64\n"
+ "Version: 0.6.46.4-0.1\n"
+ "Replaces: libapt-pkg-doc (<< 0.3.7), libapt-pkg-dev (<< 0.3.7)\n"
+ "Provides: libapt-pkg-libc6.3-6-3.11\n"
+ "Depends: libc6 (>= 2.3.5-1), libgcc1 (>= 1:4.1.1-12), libstdc++6 (>= 4.1.1-12), debian-archive-keyring\n"
+ "Suggests: aptitude | synaptic | gnome-apt | wajig, dpkg-dev, apt-doc, bzip2\n"
+ "Filename: pool/main/a/apt/apt_0.6.46.4-0.1_amd64.deb\n"
+ "Size: 1436478\n"
+ "MD5sum: 1776421f80d6300c77a608e77a9f4a15\n"
+ "SHA1: 1bd7337d2df56d267632cf72ac930c0a4895898f\n"
+ "SHA256: b92442ab60046b4d0728245f39cc932f26e17db9f7933a5ec9aaa63172f51fda\n"
+ "Description: Advanced front-end for dpkg\n"
+ " This is Debian's next generation front-end for the dpkg package manager.\n"
+ " It provides the apt-get utility and APT dselect method that provides a\n"
+ " simpler, safer way to install and upgrade packages.\n"
+ " .\n"
+ " APT features complete installation ordering, multiple source capability\n"
+ " and several other unique features, see the Users Guide in apt-doc.\n"
+ "Build-Essential: yes\n"
+ "Tag: admin::package-management, filetransfer::ftp, filetransfer::http, hardware::storage:cd, interface::commandline, network::client, protocol::{ftp,http,ipv6}, role::program, suite::debian, use::downloading, use::searching, works-with::software:package\n";
+ RecordParser p(record);
+
+ wassert(actual(p.size()) == 19u);
+
+ string rec1;
+ for (size_t i = 0; i < p.size(); ++i)
+ rec1 += p.field(i);
+ wassert(actual(record) == rec1);
+ });
+
+ add_method("buffer_termination", []() {
+ // Various buffer termination patterns
+ std::string record =
+ "A: a\n"
+ "B: b";
+
+ RecordParser p(record);
+ wassert(actual(p.size()) == 2u);
+ wassert(actual(p["A"]) == "a");
+ wassert(actual(p["B"]) == "b");
+ });
+
+ add_method("buffer_termination2", []() {
+ std::string record =
+ "A: a\n"
+ "B: b\n\n";
+
+ RecordParser p(record);
+ wassert(actual(p.size()) == 2u);
+ wassert(actual(p["A"]) == "a");
+ wassert(actual(p["B"]) == "b");
+ });
+
+ add_method("buffer_termination3", []() {
+ std::string record =
+ "A: a\n"
+ "B: b\n\n"
+ "C: c\n";
+
+ RecordParser p(record);
+ wassert(actual(p.size()) == 2u);
+ wassert(actual(p["A"]) == "a");
+ wassert(actual(p["B"]) == "b");
+ });
+ }
+} tests("apt_recordparser");
+
+}