]> git.saurik.com Git - apt.git/commitdiff
use Google C++ Testing Framework for libapt tests
authorDavid Kalnischkies <david@kalnischkies.de>
Wed, 16 Apr 2014 15:09:37 +0000 (17:09 +0200)
committerDavid Kalnischkies <david@kalnischkies.de>
Wed, 16 Apr 2014 16:36:14 +0000 (18:36 +0200)
My commit 45df0ad2 from 26. Nov 2009 had a little remark:
"The commit also includes a very very simple testapp."
This was never intended to be permanent, but as usually…

The commit adds the needed make magic to compile gtest statically
as it is required and links it against a small runner. All previous
testcase binaries are reimplemented in gtest and combined in this
runner. While most code is a 1:1 translation some had to be rewritten
like compareversion_test.cc, but the coverage remains the same.

29 files changed:
debian/control
test/libapt/assert.h [deleted file]
test/libapt/cdrom_test.cc [new file with mode: 0644]
test/libapt/cdromfindmountpointfordevice_test.cc [deleted file]
test/libapt/cdromfindpackages_test.cc
test/libapt/cdromreducesourcelist_test.cc [deleted file]
test/libapt/commandline_test.cc
test/libapt/commandlineasstring_test.cc [deleted file]
test/libapt/compareversion_test.cc
test/libapt/configuration_test.cc
test/libapt/file-helpers.cc [new file with mode: 0644]
test/libapt/file-helpers.h [new file with mode: 0644]
test/libapt/fileutl_test.cc
test/libapt/getarchitectures_test.cc
test/libapt/getlanguages_test.cc
test/libapt/getlistoffilesindir_test.cc
test/libapt/globalerror_test.cc
test/libapt/gtest_runner.cc [new file with mode: 0644]
test/libapt/hashsums_test.cc
test/libapt/indexcopytosourcelist_test.cc
test/libapt/install_progress_test.cc
test/libapt/makefile
test/libapt/parsedepends_test.cc
test/libapt/run-tests [deleted file]
test/libapt/sourcelist_test.cc
test/libapt/strutil_test.cc
test/libapt/tagfile_test.cc
test/libapt/uri_test.cc
test/libapt/versions.lst [deleted file]

index c0526d30c5e76403f63f98e31637f517d3181fec..ff984db75850b47934a4bd76e7459c50e704ee8d 100644 (file)
@@ -9,7 +9,7 @@ Build-Depends: dpkg-dev (>= 1.15.8), debhelper (>= 8.1.3~), libdb-dev,
  gettext (>= 0.12), libcurl4-gnutls-dev (>= 7.19.4~),
  zlib1g-dev, libbz2-dev, liblzma-dev,
  xsltproc, docbook-xsl, docbook-xml, po4a (>= 0.34-2),
  gettext (>= 0.12), libcurl4-gnutls-dev (>= 7.19.4~),
  zlib1g-dev, libbz2-dev, liblzma-dev,
  xsltproc, docbook-xsl, docbook-xml, po4a (>= 0.34-2),
- autotools-dev, autoconf, automake
+ autotools-dev, autoconf, automake, libgtest-dev
 Build-Depends-Indep: doxygen, debiandoc-sgml, graphviz
 Build-Conflicts: autoconf2.13, automake1.4
 Vcs-Git: git://anonscm.debian.org/apt/apt.git
 Build-Depends-Indep: doxygen, debiandoc-sgml, graphviz
 Build-Conflicts: autoconf2.13, automake1.4
 Vcs-Git: git://anonscm.debian.org/apt/apt.git
diff --git a/test/libapt/assert.h b/test/libapt/assert.h
deleted file mode 100644 (file)
index 3e45143..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-#include <iostream>
-#include <cstdlib>
-
-#include <apt-pkg/macros.h>
-#include <apt-pkg/error.h>
-
-#if __GNUC__ >= 4
-       #pragma GCC diagnostic push
-       #pragma GCC diagnostic ignored "-Wmissing-declarations"
-#endif
-
-#define equals(x,y) assertEquals(y, x, __LINE__)
-#define equalsNot(x,y) assertEqualsNot(y, x, __LINE__)
-
-template < typename X, typename Y >
-APT_NORETURN void OutputAssertEqual(X expect, char const* compare, Y get, unsigned long const &line) {
-       std::cerr << "Test FAILED: »" << expect << "« " << compare << " »" << get << "« at line " << line << std::endl;
-       _error->DumpErrors(std::cerr);
-       std::exit(EXIT_FAILURE);
-}
-
-template < typename X, typename Y >
-void assertEquals(X expect, Y get, unsigned long const &line) {
-       if (expect == get)
-               return;
-       OutputAssertEqual(expect, "==", get, line);
-}
-
-template < typename X, typename Y >
-void assertEqualsNot(X expect, Y get, unsigned long const &line) {
-       if (expect != get)
-               return;
-       OutputAssertEqual(expect, "!=", get, line);
-}
-
-void assertEquals(unsigned int const &expect, int const &get, unsigned long const &line) {
-       if (get < 0)
-               OutputAssertEqual(expect, "==", get, line);
-       assertEquals<unsigned int const&, unsigned int const&>(expect, get, line);
-}
-
-void assertEquals(int const &expect, unsigned int const &get, unsigned long const &line) {
-       if (expect < 0)
-               OutputAssertEqual(expect, "==", get, line);
-       assertEquals<unsigned int const&, unsigned int const&>(expect, get, line);
-}
-
-void assertEquals(unsigned long const &expect, int const &get, unsigned long const &line) {
-       if (get < 0)
-               OutputAssertEqual(expect, "==", get, line);
-       assertEquals<unsigned long const&, unsigned long const&>(expect, get, line);
-}
-
-void assertEquals(int const &expect, unsigned long const &get, unsigned long const &line) {
-       if (expect < 0)
-               OutputAssertEqual(expect, "==", get, line);
-       assertEquals<unsigned long const&, unsigned long const&>(expect, get, line);
-}
-
-
-#define equalsOr2(x,y,z) assertEqualsOr2(y, z, x, __LINE__)
-
-template < typename X, typename Y >
-void OutputAssertEqualOr2(X expect1, X expect2, char const* compare, Y get, unsigned long const &line) {
-       std::cerr << "Test FAILED: »" << expect1 << "« or »" << expect2 << "« " << compare << " »" << get << "« at line " << line << std::endl;
-}
-
-template < typename X, typename Y >
-void assertEqualsOr2(X expect1, X expect2, Y get, unsigned long const &line) {
-       if (expect1 == get || expect2 == get)
-               return;
-       OutputAssertEqualOr2(expect1, expect2, "==", get, line);
-}
-
-void assertEqualsOr2(unsigned int const &expect1, unsigned int const &expect2, int const &get, unsigned long const &line) {
-       if (get < 0)
-               OutputAssertEqualOr2(expect1, expect2, "==", get, line);
-       assertEqualsOr2<unsigned int const&, unsigned int const&>(expect1, expect2, get, line);
-}
-
-void assertEqualsOr2(int const &expect1, int const &expect2, unsigned int const &get, unsigned long const &line) {
-       if (expect1 < 0 && expect2 < 0)
-               OutputAssertEqualOr2(expect1, expect2, "==", get, line);
-       assertEqualsOr2<unsigned int const&, unsigned int const&>(expect1, expect2, get, line);
-}
-
-
-#define equalsOr3(w,x,y,z) assertEqualsOr3(x, y, z, w, __LINE__)
-
-template < typename X, typename Y >
-void OutputAssertEqualOr3(X expect1, X expect2, X expect3, char const* compare, Y get, unsigned long const &line) {
-       std::cerr << "Test FAILED: »" << expect1 << "« or »" << expect2 << "« or »" << expect3 << "« " << compare << " »" << get << "« at line " << line << std::endl;
-}
-
-template < typename X, typename Y >
-void assertEqualsOr3(X expect1, X expect2, X expect3, Y get, unsigned long const &line) {
-       if (expect1 == get || expect2 == get || expect3 == get)
-               return;
-       OutputAssertEqualOr3(expect1, expect2, expect3, "==", get, line);
-}
-
-#define equalsOr4(v,w,x,y,z) assertEqualsOr4(w, x, y, z, v, __LINE__)
-
-template < typename X, typename Y >
-void OutputAssertEqualOr4(X expect1, X expect2, X expect3, X expect4, char const* compare, Y get, unsigned long const &line) {
-       std::cerr << "Test FAILED: »" << expect1 << "« or »" << expect2 << "« or »" << expect3 << "« or »" << expect4 << "« " << compare << " »" << get << "« at line " << line << std::endl;
-}
-
-template < typename X, typename Y >
-void assertEqualsOr4(X expect1, X expect2, X expect3, X expect4, Y get, unsigned long const &line) {
-       if (expect1 == get || expect2 == get || expect3 == get || expect4 == get)
-               return;
-       OutputAssertEqualOr4(expect1, expect2, expect3, expect4, "==", get, line);
-}
-
-// simple helper to quickly output a vectors
-template < typename X >
-void dumpVector(X vec) {
-       for (typename X::const_iterator v = vec.begin();
-            v != vec.end(); ++v)
-               std::cout << *v << std::endl;
-}
-
-#if __GNUC__ >= 4
-       #pragma GCC diagnostic pop
-#endif
diff --git a/test/libapt/cdrom_test.cc b/test/libapt/cdrom_test.cc
new file mode 100644 (file)
index 0000000..626ef53
--- /dev/null
@@ -0,0 +1,114 @@
+#include <config.h>
+
+#include <apt-pkg/configuration.h>
+#include <apt-pkg/cdrom.h>
+#include <apt-pkg/cdromutl.h>
+#include <apt-pkg/fileutl.h>
+
+#include <string>
+#include <string.h>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+#include "file-helpers.h"
+
+class Cdrom : public pkgCdrom {
+public:
+   std::vector<std::string> ReduceSourcelist(std::string CD,std::vector<std::string> List) {
+      pkgCdrom::ReduceSourcelist(CD, List);
+      return List;
+   }
+};
+
+TEST(CDROMTest,ReduceSourcelist)
+{
+   Cdrom cd;
+   std::vector<std::string> List;
+   std::string CD("/media/cdrom/");
+
+   std::vector<std::string> R = cd.ReduceSourcelist(CD, List);
+   EXPECT_TRUE(R.empty());
+
+   List.push_back(" wheezy main");
+   R = cd.ReduceSourcelist(CD, List);
+   ASSERT_EQ(1, R.size());
+   EXPECT_EQ(" wheezy main", R[0]);
+
+   List.push_back(" wheezy main");
+   R = cd.ReduceSourcelist(CD, List);
+   ASSERT_EQ(1, R.size());
+   EXPECT_EQ(" wheezy main", R[0]);
+
+   List.push_back(" wheezy contrib");
+   R = cd.ReduceSourcelist(CD, List);
+   ASSERT_EQ(1, R.size());
+   EXPECT_EQ(" wheezy contrib main", R[0]);
+
+   List.push_back(" wheezy-update contrib");
+   R = cd.ReduceSourcelist(CD, List);
+   ASSERT_EQ(2, R.size());
+   EXPECT_EQ(" wheezy contrib main", R[0]);
+   EXPECT_EQ(" wheezy-update contrib", R[1]);
+
+   List.push_back(" wheezy-update contrib");
+   R = cd.ReduceSourcelist(CD, List);
+   ASSERT_EQ(2, R.size());
+   EXPECT_EQ(" wheezy contrib main", R[0]);
+   EXPECT_EQ(" wheezy-update contrib", R[1]);
+
+   List.push_back(" wheezy-update non-free");
+   R = cd.ReduceSourcelist(CD, List);
+   ASSERT_EQ(2, R.size());
+   EXPECT_EQ(" wheezy contrib main", R[0]);
+   EXPECT_EQ(" wheezy-update contrib non-free", R[1]);
+
+   List.push_back(" wheezy-update main");
+   R = cd.ReduceSourcelist(CD, List);
+   ASSERT_EQ(2, R.size());
+   EXPECT_EQ(" wheezy contrib main", R[0]);
+   EXPECT_EQ(" wheezy-update contrib main non-free", R[1]);
+
+   List.push_back(" wheezy non-free");
+   R = cd.ReduceSourcelist(CD, List);
+   ASSERT_EQ(2, R.size());
+   EXPECT_EQ(" wheezy contrib main non-free", R[0]);
+   EXPECT_EQ(" wheezy-update contrib main non-free", R[1]);
+
+   List.push_back(" sid main");
+   R = cd.ReduceSourcelist(CD, List);
+   ASSERT_EQ(3, R.size());
+   EXPECT_EQ(" sid main", R[0]);
+   EXPECT_EQ(" wheezy contrib main non-free", R[1]);
+   EXPECT_EQ(" wheezy-update contrib main non-free", R[2]);
+
+   List.push_back(" sid main-reduce");
+   R = cd.ReduceSourcelist(CD, List);
+   ASSERT_EQ(3, R.size());
+   EXPECT_EQ(" sid main main-reduce", R[0]);
+   EXPECT_EQ(" wheezy contrib main non-free", R[1]);
+   EXPECT_EQ(" wheezy-update contrib main non-free", R[2]);
+}
+TEST(CDROMTest, FindMountPointForDevice)
+{
+   char * tempfile;
+   FileFd fd;
+   createTemporaryFile("mountpoints", fd, &tempfile,
+        "rootfs / rootfs rw 0 0\n"
+        "sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0\n"
+        "sysfs0 /sys0 sysfs rw,nosuid,nodev,noexec,relatime 0 0\n"
+        "/dev/disk/by-uuid/fadcbc52-6284-4874-aaaa-dcee1f05fe21 / ext4 rw,relatime,errors=remount-ro,data=ordered 0 0\n"
+        "/dev/sda1 /boot/efi vfat rw,nosuid,nodev,noexec,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=utf8,shortname=lower,quiet,utf8,errors=remount-ro,rw,nosuid,nodev,noexec,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=utf8,shortname=lower,quiet,utf8,errors=remount-ro,rw,nosuid,nodev,noexec,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=utf8,shortname=lower,quiet,utf8,errors=remount-ro,rw,nosuid,nodev,noexec,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=utf8,shortname=lower,quiet,utf8,errors=remount-ro 0 0\n"
+        "tmpfs /tmp tmpfs rw,nosuid,nodev,relatime 0 0\n");
+   _config->Set("Dir::state::Mountpoints", tempfile);
+
+   EXPECT_EQ("/", FindMountPointForDevice("rootfs"));
+   EXPECT_EQ("/", FindMountPointForDevice("/dev/disk/by-uuid/fadcbc52-6284-4874-aaaa-dcee1f05fe21"));
+   EXPECT_EQ("/sys", FindMountPointForDevice("sysfs"));
+   EXPECT_EQ("/sys0", FindMountPointForDevice("sysfs0"));
+   EXPECT_EQ("/boot/efi", FindMountPointForDevice("/dev/sda1"));
+   EXPECT_EQ("/tmp", FindMountPointForDevice("tmpfs"));
+
+   unlink(tempfile);
+   free(tempfile);
+}
diff --git a/test/libapt/cdromfindmountpointfordevice_test.cc b/test/libapt/cdromfindmountpointfordevice_test.cc
deleted file mode 100644 (file)
index 26dcd14..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <config.h>
-
-#include <apt-pkg/cdromutl.h>
-#include <apt-pkg/configuration.h>
-
-#include <string>
-#include <vector>
-
-#include "assert.h"
-
-int main(int argc, char const *argv[]) {
-       if (argc != 2) {
-               std::cout << "One parameter expected - given " << argc << std::endl;
-               return 100;
-       }
-
-       _config->Set("Dir::state::Mountpoints", argv[1]);
-       equals("/", FindMountPointForDevice("rootfs"));
-       equals("/", FindMountPointForDevice("/dev/disk/by-uuid/fadcbc52-6284-4874-aaaa-dcee1f05fe21"));
-       equals("/sys", FindMountPointForDevice("sysfs"));
-       equals("/sys0", FindMountPointForDevice("sysfs0"));
-       equals("/boot/efi", FindMountPointForDevice("/dev/sda1"));
-       equals("/tmp", FindMountPointForDevice("tmpfs"));
-
-       return 0;
-}
index 583de142338287cc4a0d597a397b2cb4a616f68b..719dd8f63c8b0063c5099f7749206f689eee061e 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <apt-pkg/cdrom.h>
 #include <apt-pkg/error.h>
 
 #include <apt-pkg/cdrom.h>
 #include <apt-pkg/error.h>
+#include <apt-pkg/fileutl.h>
 
 #include <algorithm>
 #include <string>
 
 #include <algorithm>
 #include <string>
 #include <stddef.h>
 #include <iostream>
 
 #include <stddef.h>
 #include <iostream>
 
-#include "assert.h"
+#include <gtest/gtest.h>
+
+#include "file-helpers.h"
 
 class Cdrom : public pkgCdrom {
 
 class Cdrom : public pkgCdrom {
-       public:
-       bool FindPackages(std::string const &CD,
-                         std::vector<std::string> &List,
-                         std::vector<std::string> &SList,
-                         std::vector<std::string> &SigList,
-                         std::vector<std::string> &TransList,
-                         std::string &InfoDir) {
-               bool const result = pkgCdrom::FindPackages(CD, List, SList, SigList, TransList, InfoDir, NULL, 0);
-               std::sort(List.begin(), List.end());
-               std::sort(SList.begin(), SList.end());
-               std::sort(SigList.begin(), SigList.end());
-               std::sort(TransList.begin(), TransList.end());
-               return result;
-       }
+   public:
+      bool FindPackages(std::string const &CD,
+           std::vector<std::string> &List,
+           std::vector<std::string> &SList,
+           std::vector<std::string> &SigList,
+           std::vector<std::string> &TransList,
+           std::string &InfoDir) {
+        std::string const startdir = SafeGetCWD();
+        EXPECT_FALSE(startdir.empty());
+        bool const result = pkgCdrom::FindPackages(CD, List, SList, SigList, TransList, InfoDir, NULL, 0);
+        std::sort(List.begin(), List.end());
+        std::sort(SList.begin(), SList.end());
+        std::sort(SigList.begin(), SigList.end());
+        std::sort(TransList.begin(), TransList.end());
+        EXPECT_EQ(0, chdir(startdir.c_str()));
+        return result;
+      }
 
 
-       bool DropRepeats(std::vector<std::string> &List, char const *Name) {
-               return pkgCdrom::DropRepeats(List, Name);
-       }
+      using pkgCdrom::DropRepeats;
 };
 
 };
 
-int main(int argc, char const *argv[]) {
-       if (argc != 2) {
-               std::cout << "One parameter expected - given " << argc << std::endl;
-               return 100;
-       }
+TEST(CDROMTest,FindPackages)
+{
+   std::string path;
+   createTemporaryDirectory("findpackage", path);
+
+   createDirectory(path, ".disk");
+   createDirectory(path, "pool");
+   createDirectory(path, "dists/stable/main/binary-i386");
+   createDirectory(path, "dists/stable/main/source");
+   createDirectory(path, "dists/stable/contrib/binary-amd64");
+   createDirectory(path, "dists/stable/contrib/binary-all");
+   createDirectory(path, "dists/unstable/main/binary-i386");
+   createDirectory(path, "dists/unstable/main/i18n");
+   createDirectory(path, "dists/unstable/main/source");
+   createDirectory(path, "dists/broken/non-free/source");
+   createFile(path, "dists/broken/.aptignr");
+   createFile(path, "dists/stable/main/binary-i386/Packages");
+   createFile(path, "dists/stable/main/binary-i386/Packages.bz2");
+   createFile(path, "dists/stable/main/source/Sources.xz");
+   createFile(path, "dists/stable/contrib/binary-amd64/Packages");
+   createFile(path, "dists/stable/contrib/binary-amd64/Packages.gz");
+   createFile(path, "dists/stable/contrib/binary-all/Packages");
+   createFile(path, "dists/unstable/main/binary-i386/Packages.xz");
+   createFile(path, "dists/unstable/main/binary-i386/Packages.lzma");
+   createFile(path, "dists/unstable/main/i18n/Translation-en");
+   createFile(path, "dists/unstable/main/i18n/Translation-de.bz2");
+   createFile(path, "dists/unstable/main/source/Sources.xz");
+   createFile(path, "dists/broken/non-free/source/Sources.gz");
+   createFile(path, "dists/stable/Release.gpg");
+   createFile(path, "dists/stable/Release");
+   createFile(path, "dists/unstable/InRelease");
+   createFile(path, "dists/broken/Release.gpg");
+   createLink(path, "dists/unstable", "dists/sid");
 
 
-       Cdrom cd;
-       std::vector<std::string> Packages, Sources, Signatur, Translation;
-       std::string InfoDir;
-       std::string path = argv[1];
-       equals(true, cd.FindPackages(path, Packages, Sources, Signatur, Translation, InfoDir));
-       equals(4, Packages.size());
-       equals(path + "/dists/sid/main/binary-i386/", Packages[0]);
-       equals(path + "/dists/stable/contrib/binary-amd64/", Packages[1]);
-       equals(path + "/dists/stable/main/binary-i386/", Packages[2]);
-       equals(path + "/dists/unstable/main/binary-i386/", Packages[3]);
-       equals(3, Sources.size());
-       equals(path + "/dists/sid/main/source/", Sources[0]);
-       equals(path + "/dists/stable/main/source/", Sources[1]);
-       equals(path + "/dists/unstable/main/source/", Sources[2]);
-       equals(3, Signatur.size());
-       equals(path + "/dists/sid/", Signatur[0]);
-       equals(path + "/dists/stable/", Signatur[1]);
-       equals(path + "/dists/unstable/", Signatur[2]);
-       equals(4, Translation.size());
-       equals(path + "/dists/sid/main/i18n/Translation-de", Translation[0]);
-       equals(path + "/dists/sid/main/i18n/Translation-en", Translation[1]);
-       equals(path + "/dists/unstable/main/i18n/Translation-de", Translation[2]);
-       equals(path + "/dists/unstable/main/i18n/Translation-en", Translation[3]);
-       equals(path + "/.disk/", InfoDir);
+   Cdrom cd;
+   std::vector<std::string> Packages, Sources, Signatur, Translation;
+   std::string InfoDir;
+   EXPECT_TRUE(cd.FindPackages(path, Packages, Sources, Signatur, Translation, InfoDir));
+   EXPECT_EQ(4, Packages.size());
+   EXPECT_EQ(path + "/dists/sid/main/binary-i386/", Packages[0]);
+   EXPECT_EQ(path + "/dists/stable/contrib/binary-amd64/", Packages[1]);
+   EXPECT_EQ(path + "/dists/stable/main/binary-i386/", Packages[2]);
+   EXPECT_EQ(path + "/dists/unstable/main/binary-i386/", Packages[3]);
+   EXPECT_EQ(3, Sources.size());
+   EXPECT_EQ(path + "/dists/sid/main/source/", Sources[0]);
+   EXPECT_EQ(path + "/dists/stable/main/source/", Sources[1]);
+   EXPECT_EQ(path + "/dists/unstable/main/source/", Sources[2]);
+   EXPECT_EQ(3, Signatur.size());
+   EXPECT_EQ(path + "/dists/sid/", Signatur[0]);
+   EXPECT_EQ(path + "/dists/stable/", Signatur[1]);
+   EXPECT_EQ(path + "/dists/unstable/", Signatur[2]);
+   EXPECT_EQ(4, Translation.size());
+   EXPECT_EQ(path + "/dists/sid/main/i18n/Translation-de", Translation[0]);
+   EXPECT_EQ(path + "/dists/sid/main/i18n/Translation-en", Translation[1]);
+   EXPECT_EQ(path + "/dists/unstable/main/i18n/Translation-de", Translation[2]);
+   EXPECT_EQ(path + "/dists/unstable/main/i18n/Translation-en", Translation[3]);
+   EXPECT_EQ(path + "/.disk/", InfoDir);
 
 
-       cd.DropRepeats(Packages, "Packages");
-       cd.DropRepeats(Sources, "Sources");
-       _error->PushToStack();
-       cd.DropRepeats(Signatur, "InRelease");
-       cd.DropRepeats(Signatur, "Release.gpg");
-       _error->RevertToStack();
-       _error->DumpErrors();
-       cd.DropRepeats(Translation, "");
+   cd.DropRepeats(Packages, "Packages");
+   cd.DropRepeats(Sources, "Sources");
+   _error->PushToStack();
+   cd.DropRepeats(Signatur, "InRelease");
+   cd.DropRepeats(Signatur, "Release.gpg");
+   _error->RevertToStack();
+   _error->DumpErrors();
+   cd.DropRepeats(Translation, "");
 
 
-       equals(3, Packages.size());
-       equals(path + "/dists/stable/contrib/binary-amd64/", Packages[0]);
-       equals(path + "/dists/stable/main/binary-i386/", Packages[1]);
-       equals(path + "/dists/unstable/main/binary-i386/", Packages[2]);
-       equals(2, Sources.size());
-       equals(path + "/dists/stable/main/source/", Sources[0]);
-       equals(path + "/dists/unstable/main/source/", Sources[1]);
-       equals(2, Signatur.size());
-       equals(path + "/dists/stable/", Signatur[0]);
-       equals(path + "/dists/unstable/", Signatur[1]);
-       equals(2, Translation.size());
-       equals(path + "/dists/unstable/main/i18n/Translation-de", Translation[0]);
-       equals(path + "/dists/unstable/main/i18n/Translation-en", Translation[1]);
+   EXPECT_EQ(3, Packages.size());
+   EXPECT_EQ(path + "/dists/stable/contrib/binary-amd64/", Packages[0]);
+   EXPECT_EQ(path + "/dists/stable/main/binary-i386/", Packages[1]);
+   EXPECT_EQ(path + "/dists/unstable/main/binary-i386/", Packages[2]);
+   EXPECT_EQ(2, Sources.size());
+   EXPECT_EQ(path + "/dists/stable/main/source/", Sources[0]);
+   EXPECT_EQ(path + "/dists/unstable/main/source/", Sources[1]);
+   EXPECT_EQ(2, Signatur.size());
+   EXPECT_EQ(path + "/dists/stable/", Signatur[0]);
+   EXPECT_EQ(path + "/dists/unstable/", Signatur[1]);
+   EXPECT_EQ(2, Translation.size());
+   EXPECT_EQ(path + "/dists/unstable/main/i18n/Translation-de", Translation[0]);
+   EXPECT_EQ(path + "/dists/unstable/main/i18n/Translation-en", Translation[1]);
 
 
-       return 0;
+   removeDirectory(path);
 }
 }
diff --git a/test/libapt/cdromreducesourcelist_test.cc b/test/libapt/cdromreducesourcelist_test.cc
deleted file mode 100644 (file)
index 196d013..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-#include <config.h>
-
-#include <apt-pkg/cdrom.h>
-
-#include <string>
-#include <vector>
-
-#include "assert.h"
-
-class Cdrom : public pkgCdrom {
-public:
-   std::vector<std::string> ReduceSourcelist(std::string CD,std::vector<std::string> List) {
-      pkgCdrom::ReduceSourcelist(CD, List);
-      return List;
-   }
-};
-
-int main() {
-   Cdrom cd;
-   std::vector<std::string> List;
-   std::string CD("/media/cdrom/");
-
-   std::vector<std::string> R = cd.ReduceSourcelist(CD, List);
-   equals(R.empty(), true);
-
-   List.push_back(" wheezy main");
-   R = cd.ReduceSourcelist(CD, List);
-   equals(R.size(), 1);
-   equals(R[0], " wheezy main");
-
-   List.push_back(" wheezy main");
-   R = cd.ReduceSourcelist(CD, List);
-   equals(R.size(), 1);
-   equals(R[0], " wheezy main");
-
-   List.push_back(" wheezy contrib");
-   R = cd.ReduceSourcelist(CD, List);
-   equals(R.size(), 1);
-   equals(R[0], " wheezy contrib main");
-
-   List.push_back(" wheezy-update contrib");
-   R = cd.ReduceSourcelist(CD, List);
-   equals(R.size(), 2);
-   equals(R[0], " wheezy contrib main");
-   equals(R[1], " wheezy-update contrib");
-
-   List.push_back(" wheezy-update contrib");
-   R = cd.ReduceSourcelist(CD, List);
-   equals(R.size(), 2);
-   equals(R[0], " wheezy contrib main");
-   equals(R[1], " wheezy-update contrib");
-
-   List.push_back(" wheezy-update non-free");
-   R = cd.ReduceSourcelist(CD, List);
-   equals(R.size(), 2);
-   equals(R[0], " wheezy contrib main");
-   equals(R[1], " wheezy-update contrib non-free");
-
-   List.push_back(" wheezy-update main");
-   R = cd.ReduceSourcelist(CD, List);
-   equals(R.size(), 2);
-   equals(R[0], " wheezy contrib main");
-   equals(R[1], " wheezy-update contrib main non-free");
-
-   List.push_back(" wheezy non-free");
-   R = cd.ReduceSourcelist(CD, List);
-   equals(R.size(), 2);
-   equals(R[0], " wheezy contrib main non-free");
-   equals(R[1], " wheezy-update contrib main non-free");
-
-   List.push_back(" sid main");
-   R = cd.ReduceSourcelist(CD, List);
-   equals(R.size(), 3);
-   equals(R[0], " sid main");
-   equals(R[1], " wheezy contrib main non-free");
-   equals(R[2], " wheezy-update contrib main non-free");
-
-   List.push_back(" sid main-reduce");
-   R = cd.ReduceSourcelist(CD, List);
-   equals(R.size(), 3);
-   equals(R[0], " sid main main-reduce");
-   equals(R[1], " wheezy contrib main non-free");
-   equals(R[2], " wheezy-update contrib main non-free");
-
-   return 0;
-}
index d8c5bc5bd6b3b081e91c06cd63cd06a30fb88d29..26e80bfdec9204ed4d6f42611bd44fd61fa97426 100644 (file)
@@ -3,33 +3,56 @@
 #include <apt-pkg/cmndline.h>
 #include <apt-pkg/configuration.h>
 
 #include <apt-pkg/cmndline.h>
 #include <apt-pkg/configuration.h>
 
-#include "assert.h"
-
-int main()
+#include <gtest/gtest.h>
+
+class CLT: public CommandLine {
+   public:
+      std::string static AsString(const char * const * const argv,
+           unsigned int const argc) {
+        std::string const static conf = "Commandline::AsString";
+        _config->Clear(conf);
+        SaveInConfig(argc, argv);
+        return _config->Find(conf);
+      }
+};
+
+#define EXPECT_CMD(x, ...) { const char * const argv[] = { __VA_ARGS__ }; EXPECT_EQ(x, CLT::AsString(argv, sizeof(argv)/sizeof(argv[0]))); }
+
+TEST(CommandLineTest,SaveInConfig)
+{
+   EXPECT_CMD("apt-get install -sf",
+        "apt-get", "install", "-sf");
+   EXPECT_CMD("apt-cache -s apt -so Debug::test=Test",
+        "apt-cache", "-s", "apt", "-so", "Debug::test=Test");
+   EXPECT_CMD("apt-cache -s apt -so Debug::test=\"Das ist ein Test\"",
+        "apt-cache", "-s", "apt", "-so", "Debug::test=Das ist ein Test");
+   EXPECT_CMD("apt-cache -s apt --hallo test=1.0",
+        "apt-cache", "-s", "apt", "--hallo", "test=1.0");
+}
+TEST(CommandLineTest,Parsing)
 {
    CommandLine::Args Args[] = {
       { 't', 0, "Test::Worked", 0 },
       { 'z', "zero", "Test::Zero", 0 },
       {0,0,0,0}
    };
 {
    CommandLine::Args Args[] = {
       { 't', 0, "Test::Worked", 0 },
       { 'z', "zero", "Test::Zero", 0 },
       {0,0,0,0}
    };
-   CommandLine CmdL(Args,_config);
+   ::Configuration c;
+   CommandLine CmdL(Args, &c);
 
    char const * argv[] = { "test", "--zero", "-t" };
    CmdL.Parse(3 , argv);
 
    char const * argv[] = { "test", "--zero", "-t" };
    CmdL.Parse(3 , argv);
-   equals(true, _config->FindB("Test::Worked", false));
-   equals(true, _config->FindB("Test::Zero", false));
+   EXPECT_TRUE(c.FindB("Test::Worked", false));
+   EXPECT_TRUE(c.FindB("Test::Zero", false));
 
 
-   _config->Clear("Test");
-   equals(false, _config->FindB("Test::Worked", false));
-   equals(false, _config->FindB("Test::Zero", false));
+   c.Clear("Test");
+   EXPECT_FALSE(c.FindB("Test::Worked", false));
+   EXPECT_FALSE(c.FindB("Test::Zero", false));
 
 
-   _config->Set("Test::Zero", true);
-   equals(true, _config->FindB("Test::Zero", false));
+   c.Set("Test::Zero", true);
+   EXPECT_TRUE(c.FindB("Test::Zero", false));
 
    char const * argv2[] = { "test", "--no-zero", "-t" };
    CmdL.Parse(3 , argv2);
 
    char const * argv2[] = { "test", "--no-zero", "-t" };
    CmdL.Parse(3 , argv2);
-   equals(true, _config->FindB("Test::Worked", false));
-   equals(false, _config->FindB("Test::Zero", false));
-
-   return 0;
+   EXPECT_TRUE(c.FindB("Test::Worked", false));
+   EXPECT_FALSE(c.FindB("Test::Zero", false));
 }
 }
diff --git a/test/libapt/commandlineasstring_test.cc b/test/libapt/commandlineasstring_test.cc
deleted file mode 100644 (file)
index 5c005e9..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-#include <config.h>
-
-#include <apt-pkg/cmndline.h>
-#include <apt-pkg/configuration.h>
-
-#include <string>
-
-#include "assert.h"
-
-class CLT: public CommandLine {
-
-       public:
-       std::string static AsString(const char * const * const argv,
-                                   unsigned int const argc) {
-               std::string const static conf = "Commandline::AsString";
-               _config->Clear(conf);
-               SaveInConfig(argc, argv);
-               return _config->Find(conf);
-       }
-};
-
-#define CMD(y,z) equals(CLT::AsString(argv, y), z);
-
-int main() {
-       {
-               const char* const argv[] = {"apt-get", "install", "-sf"};
-               CMD(3, "apt-get install -sf");
-       }
-       {
-               const char* const argv[] = {"apt-cache", "-s", "apt", "-so", "Debug::test=Test"};
-               CMD(5, "apt-cache -s apt -so Debug::test=Test");
-       }
-       {
-               const char* const argv[] = {"apt-cache", "-s", "apt", "-so", "Debug::test=Das ist ein Test"};
-               CMD(5, "apt-cache -s apt -so Debug::test=\"Das ist ein Test\"");
-       }
-       {
-               const char* const argv[] = {"apt-cache", "-s", "apt", "--hallo", "test=1.0"};
-               CMD(5, "apt-cache -s apt --hallo test=1.0");
-       }
-}
index 43b98f2409036e3837e34e90807619fbaa711cda..3b2c0c209703feeecf029fa0ec2102021facc66f 100644 (file)
 #include <unistd.h>
 #include <sys/wait.h>
 
 #include <unistd.h>
 #include <sys/wait.h>
 
+#include <gtest/gtest.h>
+
 using namespace std;
 
 using namespace std;
 
-static bool callDPkg(const char *val, const char *ref, const char &op) {
+static bool callDPKG(const char *val, const char *ref, const char &op) {
    pid_t Process = ExecFork();
    if (Process == 0)
    {
    pid_t Process = ExecFork();
    if (Process == 0)
    {
@@ -49,77 +51,130 @@ static bool callDPkg(const char *val, const char *ref, const char &op) {
    return WIFEXITED(Ret) == true && WEXITSTATUS(Ret) == 0;
 }
 
    return WIFEXITED(Ret) == true && WEXITSTATUS(Ret) == 0;
 }
 
-static void assertVersion(int const &CurLine, string const &A, string const &B, int const &Expected) {
-   int Res = debVS.CmpVersion(A.c_str(), B.c_str());
-   bool const dpkg = callDPkg(A.c_str(),B.c_str(), Expected);
-   Res = (Res < 0) ? -1 : ( (Res > 0) ? 1 : Res);
 
 
-   if (Res != Expected)
-      _error->Error("Comparison failed on line %u. '%s' '%s' '%s' %i != %i",CurLine,A.c_str(),((Expected == 1) ? "<<" : ( (Expected == 0) ? "=" : ">>")) ,B.c_str(),Res,Expected);
-   if (dpkg == false)
-      _error->Error("DPkg differ with line: %u. '%s' '%s' '%s' == false",CurLine,A.c_str(),((Expected == 1) ? "<<" : ( (Expected == 0) ? "=" : ">>")),B.c_str());
+#define EXPECT_VERSION_PART(A, compare, B) \
+{ \
+   int Res = debVS.CmpVersion(A, B); \
+   Res = (Res < 0) ? -1 : ( (Res > 0) ? 1 : Res); \
+   EXPECT_EQ(compare, Res) << "APT: A: »" << A << "« B: »" << B << "«"; \
+   EXPECT_PRED3(callDPKG, A, B, compare); \
 }
 }
+#define EXPECT_VERSION(A, compare, B) \
+   EXPECT_VERSION_PART(A, compare, B); \
+   EXPECT_VERSION_PART(B, compare * -1, A)
+
+// History-Remark: The versions used to be specified in a versions.lst file
+
+enum CompareVersionType { LESS = -1, GREATER = 1, EQUAL = 0 };
 
 
-static bool RunTest(const char *File)
+TEST(CompareVersionTest,Basic)
 {
 {
-   if (FileExists(File) == false)
-      return _error->Error("Versiontestfile %s doesn't exist!", File);
+   EXPECT_VERSION("7.6p2-4", GREATER, "7.6-0");
+   EXPECT_VERSION("1.0.3-3", GREATER, "1.0-1");
+   EXPECT_VERSION("1.3", GREATER, "1.2.2-2");
+   EXPECT_VERSION("1.3", GREATER, "1.2.2");
 
 
-   ifstream F(File,ios::in);
-   if (!F != 0)
-      return false;
+   /* disabled as dpkg doesn't like them… (versions have to start with a number)
+   EXPECT_VERSION("-", LESS, ".");
+   EXPECT_VERSION("p", LESS, "-");
+   EXPECT_VERSION("a", LESS, "-");
+   EXPECT_VERSION("z", LESS, "-");
+   EXPECT_VERSION("a", LESS, ".");
+   EXPECT_VERSION("z", LESS, ".");
+   // */
 
 
-   char Buffer[300];
-   int CurLine = 0;
-   
-   while (1)
-   {
-      F.getline(Buffer,sizeof(Buffer));
-      CurLine++;
-      if (F.eof() != 0)
-        return true;
-      if (!F != 0)
-        return _error->Error("Line %u in %s is too long",CurLine,File);
-
-      // Comment
-      if (Buffer[0] == '#' || Buffer[0] == 0)
-        continue;
-      
-      // First version
-      char *I;
-      char *Start = Buffer;
-      for (I = Buffer; *I != 0 && *I != ' '; I++);
-      string A(Start, I - Start);
-
-      if (*I == 0)
-        return _error->Error("Invalid line %u",CurLine);
-      
-      // Second version
-      I++;
-      Start = I;
-      for (I = Start; *I != 0 && *I != ' '; I++);
-      string B(Start,I - Start);
-      
-      if (*I == 0 || I[1] == 0)
-        return _error->Error("Invalid line %u",CurLine);
-      
-      // Result
-      I++;
-      int const Expected = atoi(I);
-      assertVersion(CurLine, A, B, Expected);
-      // Check the reverse as well
-      assertVersion(CurLine, B, A, Expected*-1);
-   }
+   /* disabled as dpkg doesn't like them… (versions have to start with a number)
+   EXPECT_VERSION("III-alpha9.8", LESS, "III-alpha9.8-1.5");
+   // */
+
+   // Test some properties of text strings
+   EXPECT_VERSION("0-pre", EQUAL, "0-pre");
+   EXPECT_VERSION("0-pre", LESS, "0-pree");
+
+   EXPECT_VERSION("1.1.6r2-2", GREATER, "1.1.6r-1");
+   EXPECT_VERSION("2.6b2-1", GREATER, "2.6b-2");
+
+   EXPECT_VERSION("98.1p5-1", LESS, "98.1-pre2-b6-2");
+   EXPECT_VERSION("0.4a6-2", GREATER, "0.4-1");
+
+   EXPECT_VERSION("1:3.0.5-2", LESS, "1:3.0.5.1");
 }
 }
+TEST(CompareVersionTest,Epochs)
+{
+   EXPECT_VERSION("1:0.4", GREATER, "10.3");
+   EXPECT_VERSION("1:1.25-4", LESS, "1:1.25-8");
+   EXPECT_VERSION("0:1.18.36", EQUAL, "1.18.36");
+
+   EXPECT_VERSION("1.18.36", GREATER, "1.18.35");
+   EXPECT_VERSION("0:1.18.36", GREATER, "1.18.35");
+}
+TEST(CompareVersionTest,Strangeness)
+{
+   // Funky, but allowed, characters in upstream version
+   EXPECT_VERSION("9:1.18.36:5.4-20", LESS, "10:0.5.1-22");
+   EXPECT_VERSION("9:1.18.36:5.4-20", LESS, "9:1.18.36:5.5-1");
+   EXPECT_VERSION("9:1.18.36:5.4-20", LESS, " 9:1.18.37:4.3-22");
+   EXPECT_VERSION("1.18.36-0.17.35-18", GREATER, "1.18.36-19");
+
+   // Junk
+   EXPECT_VERSION("1:1.2.13-3", LESS, "1:1.2.13-3.1");
+   EXPECT_VERSION("2.0.7pre1-4", LESS, "2.0.7r-1");
 
 
-int main(int argc, char *argv[])
+   // if a version includes a dash, it should be the debrev dash - policy says so…
+   EXPECT_VERSION("0:0-0-0", GREATER, "0-0");
+
+   // do we like strange versions? Yes we like strange versions…
+   EXPECT_VERSION("0", EQUAL, "0");
+   EXPECT_VERSION("0", EQUAL, "00");
+}
+TEST(CompareVersionTest,DebianBug)
+{
+   // #205960
+   EXPECT_VERSION("3.0~rc1-1", LESS, "3.0-1");
+   // #573592 - debian policy 5.6.12
+   EXPECT_VERSION("1.0", EQUAL, "1.0-0");
+   EXPECT_VERSION("0.2", LESS, "1.0-0");
+   EXPECT_VERSION("1.0", LESS, "1.0-0+b1");
+   EXPECT_VERSION("1.0", GREATER, "1.0-0~");
+}
+TEST(CompareVersionTest,CuptTests)
 {
 {
-   if (argc != 2)
-      return 1;
-   else
-      RunTest(argv[1]);
-
-   // Print any errors or warnings found
-   _error->DumpErrors();
-   return 0;
+   // "steal" the testcases from (old perl) cupt
+   EXPECT_VERSION("1.2.3", EQUAL, "1.2.3"); // identical
+   EXPECT_VERSION("4.4.3-2", EQUAL, "4.4.3-2"); // identical
+   EXPECT_VERSION("1:2ab:5", EQUAL, "1:2ab:5"); // this is correct...
+   EXPECT_VERSION("7:1-a:b-5", EQUAL, "7:1-a:b-5"); // and this
+   EXPECT_VERSION("57:1.2.3abYZ+~-4-5", EQUAL, "57:1.2.3abYZ+~-4-5"); // and those too
+   EXPECT_VERSION("1.2.3", EQUAL, "0:1.2.3"); // zero epoch
+   EXPECT_VERSION("1.2.3", EQUAL, "1.2.3-0"); // zero revision
+   EXPECT_VERSION("009", EQUAL, "9"); // zeroes…
+   EXPECT_VERSION("009ab5", EQUAL, "9ab5"); // there as well
+   EXPECT_VERSION("1.2.3", LESS, "1.2.3-1"); // added non-zero revision
+   EXPECT_VERSION("1.2.3", LESS, "1.2.4"); // just bigger
+   EXPECT_VERSION("1.2.4", GREATER, "1.2.3"); // order doesn't matter
+   EXPECT_VERSION("1.2.24", GREATER, "1.2.3"); // bigger, eh?
+   EXPECT_VERSION("0.10.0", GREATER, "0.8.7"); // bigger, eh?
+   EXPECT_VERSION("3.2", GREATER, "2.3"); // major number rocks
+   EXPECT_VERSION("1.3.2a", GREATER, "1.3.2"); // letters rock
+   EXPECT_VERSION("0.5.0~git", LESS, "0.5.0~git2"); // numbers rock
+   EXPECT_VERSION("2a", LESS, "21"); // but not in all places
+   EXPECT_VERSION("1.3.2a", LESS, "1.3.2b"); // but there is another letter
+   EXPECT_VERSION("1:1.2.3", GREATER, "1.2.4"); // epoch rocks
+   EXPECT_VERSION("1:1.2.3", LESS, "1:1.2.4"); // bigger anyway
+   EXPECT_VERSION("1.2a+~bCd3", LESS, "1.2a++"); // tilde doesn't rock
+   EXPECT_VERSION("1.2a+~bCd3", GREATER, "1.2a+~"); // but first is longer!
+   EXPECT_VERSION("5:2", GREATER, "304-2"); // epoch rocks
+   EXPECT_VERSION("5:2", LESS, "304:2"); // so big epoch?
+   EXPECT_VERSION("25:2", GREATER, "3:2"); // 25 > 3, obviously
+   EXPECT_VERSION("1:2:123", LESS, "1:12:3"); // 12 > 2
+   EXPECT_VERSION("1.2-5", LESS, "1.2-3-5"); // 1.2 < 1.2-3
+   EXPECT_VERSION("5.10.0", GREATER, "5.005"); // preceding zeroes don't matters
+   EXPECT_VERSION("3a9.8", LESS, "3.10.2"); // letters are before all letter symbols
+   EXPECT_VERSION("3a9.8", GREATER, "3~10"); // but after the tilde
+   EXPECT_VERSION("1.4+OOo3.0.0~", LESS, "1.4+OOo3.0.0-4"); // another tilde check
+   EXPECT_VERSION("2.4.7-1", LESS, "2.4.7-z"); // revision comparing
+   EXPECT_VERSION("1.002-1+b2", GREATER, "1.00"); // whatever...
+   /* disabled as dpkg doesn't like them… (versions with illegal char)
+   EXPECT_VERSION("2.2.4-47978_Debian_lenny", EQUAL, "2.2.4-47978_Debian_lenny"); // and underscore...
+   // */
 }
 }
index c9235500c1beee1ba9211c6fe5342c14a070b0ee..647d8a4af6377010a55f3fa2d3c632156a3be88a 100644 (file)
 #include <string>
 #include <vector>
 
 #include <string>
 #include <vector>
 
-#include "assert.h"
+#include <gtest/gtest.h>
 
 
-int main() {
+//FIXME: Test for configuration file parsing;
+// currently only integration/ tests test them implicitly
+
+TEST(ConfigurationTest,Lists)
+{
        Configuration Cnf;
        Configuration Cnf;
-       std::vector<std::string> fds;
 
        Cnf.Set("APT::Keep-Fds::",28);
        Cnf.Set("APT::Keep-Fds::",17);
        Cnf.Set("APT::Keep-Fds::2",47);
        Cnf.Set("APT::Keep-Fds::","broken");
 
        Cnf.Set("APT::Keep-Fds::",28);
        Cnf.Set("APT::Keep-Fds::",17);
        Cnf.Set("APT::Keep-Fds::2",47);
        Cnf.Set("APT::Keep-Fds::","broken");
-       fds = Cnf.FindVector("APT::Keep-Fds");
-       equals(fds[0], "28");
-       equals(fds[1], "17");
-       equals(fds[2], "47");
-       equals(fds[3], "broken");
-       equals(fds.size(), 4);
-       equals(Cnf.Exists("APT::Keep-Fds::2"), true);
-       equals(Cnf.Find("APT::Keep-Fds::2"), "47");
-       equals(Cnf.FindI("APT::Keep-Fds::2"), 47);
-       equals(Cnf.Exists("APT::Keep-Fds::3"), false);
-       equals(Cnf.Find("APT::Keep-Fds::3"), "");
-       equals(Cnf.FindI("APT::Keep-Fds::3", 56), 56);
-       equals(Cnf.Find("APT::Keep-Fds::3", "not-set"), "not-set");
+       std::vector<std::string> fds = Cnf.FindVector("APT::Keep-Fds");
+       ASSERT_EQ(4, fds.size());
+       EXPECT_EQ("28", fds[0]);
+       EXPECT_EQ("17", fds[1]);
+       EXPECT_EQ("47", fds[2]);
+       EXPECT_EQ("broken", fds[3]);
+
+       EXPECT_TRUE(Cnf.Exists("APT::Keep-Fds::2"));
+       EXPECT_EQ("47", Cnf.Find("APT::Keep-Fds::2"));
+       EXPECT_EQ(47, Cnf.FindI("APT::Keep-Fds::2"));
+       EXPECT_FALSE(Cnf.Exists("APT::Keep-Fds::3"));
+       EXPECT_EQ("", Cnf.Find("APT::Keep-Fds::3"));
+       EXPECT_EQ(56, Cnf.FindI("APT::Keep-Fds::3", 56));
+       EXPECT_EQ("not-set", Cnf.Find("APT::Keep-Fds::3", "not-set"));
 
        Cnf.Clear("APT::Keep-Fds::2");
 
        Cnf.Clear("APT::Keep-Fds::2");
+       EXPECT_TRUE(Cnf.Exists("APT::Keep-Fds::2"));
        fds = Cnf.FindVector("APT::Keep-Fds");
        fds = Cnf.FindVector("APT::Keep-Fds");
-       equals(fds[0], "28");
-       equals(fds[1], "17");
-       equals(fds[2], "");
-       equals(fds[3], "broken");
-       equals(fds.size(), 4);
-       equals(Cnf.Exists("APT::Keep-Fds::2"), true);
+       ASSERT_EQ(4, fds.size());
+       EXPECT_EQ("28", fds[0]);
+       EXPECT_EQ("17", fds[1]);
+       EXPECT_EQ("", fds[2]);
+       EXPECT_EQ("broken", fds[3]);
 
        Cnf.Clear("APT::Keep-Fds",28);
        fds = Cnf.FindVector("APT::Keep-Fds");
 
        Cnf.Clear("APT::Keep-Fds",28);
        fds = Cnf.FindVector("APT::Keep-Fds");
-       equals(fds[0], "17");
-       equals(fds[1], "");
-       equals(fds[2], "broken");
-       equals(fds.size(), 3);
+       ASSERT_EQ(3, fds.size());
+       EXPECT_EQ("17", fds[0]);
+       EXPECT_EQ("", fds[1]);
+       EXPECT_EQ("broken", fds[2]);
 
        Cnf.Clear("APT::Keep-Fds","");
 
        Cnf.Clear("APT::Keep-Fds","");
-       equals(Cnf.Exists("APT::Keep-Fds::2"), false);
+       EXPECT_FALSE(Cnf.Exists("APT::Keep-Fds::2"));
 
        Cnf.Clear("APT::Keep-Fds",17);
        Cnf.Clear("APT::Keep-Fds","broken");
        fds = Cnf.FindVector("APT::Keep-Fds");
 
        Cnf.Clear("APT::Keep-Fds",17);
        Cnf.Clear("APT::Keep-Fds","broken");
        fds = Cnf.FindVector("APT::Keep-Fds");
-       equals(fds.empty(), true);
+       EXPECT_TRUE(fds.empty());
 
        Cnf.Set("APT::Keep-Fds::",21);
        Cnf.Set("APT::Keep-Fds::",42);
        fds = Cnf.FindVector("APT::Keep-Fds");
 
        Cnf.Set("APT::Keep-Fds::",21);
        Cnf.Set("APT::Keep-Fds::",42);
        fds = Cnf.FindVector("APT::Keep-Fds");
-       equals(fds[0], "21");
-       equals(fds[1], "42");
-       equals(fds.size(), 2);
+       ASSERT_EQ(2, fds.size());
+       EXPECT_EQ("21", fds[0]);
+       EXPECT_EQ("42", fds[1]);
 
        Cnf.Clear("APT::Keep-Fds");
        fds = Cnf.FindVector("APT::Keep-Fds");
 
        Cnf.Clear("APT::Keep-Fds");
        fds = Cnf.FindVector("APT::Keep-Fds");
-       equals(fds.empty(), true);
+       EXPECT_TRUE(fds.empty());
+}
+TEST(ConfigurationTest,Integers)
+{
+       Configuration Cnf;
 
        Cnf.CndSet("APT::Version", 42);
        Cnf.CndSet("APT::Version", "66");
 
        Cnf.CndSet("APT::Version", 42);
        Cnf.CndSet("APT::Version", "66");
-       equals(Cnf.Find("APT::Version"), "42");
-       equals(Cnf.FindI("APT::Version"), 42);
-       equals(Cnf.Find("APT::Version", "33"), "42");
-       equals(Cnf.FindI("APT::Version", 33), 42);
-       equals(Cnf.Find("APT2::Version", "33"), "33");
-       equals(Cnf.FindI("APT2::Version", 33), 33);
-
-       equals(Cnf.FindFile("Dir::State"), "");
-       equals(Cnf.FindFile("Dir::Aptitude::State"), "");
+       EXPECT_EQ("42", Cnf.Find("APT::Version"));
+       EXPECT_EQ(42, Cnf.FindI("APT::Version"));
+       EXPECT_EQ("42", Cnf.Find("APT::Version", "33"));
+       EXPECT_EQ(42, Cnf.FindI("APT::Version", 33));
+       EXPECT_EQ("33", Cnf.Find("APT2::Version", "33"));
+       EXPECT_EQ(33, Cnf.FindI("APT2::Version", 33));
+}
+TEST(ConfigurationTest,DirsAndFiles)
+{
+       Configuration Cnf;
+
+       EXPECT_EQ("", Cnf.FindFile("Dir::State"));
+       EXPECT_EQ("", Cnf.FindFile("Dir::Aptitude::State"));
        Cnf.Set("Dir", "/srv/sid");
        Cnf.Set("Dir", "/srv/sid");
-       equals(Cnf.FindFile("Dir::State"), "");
+       EXPECT_EQ("", Cnf.FindFile("Dir::State"));
        Cnf.Set("Dir::State", "var/lib/apt");
        Cnf.Set("Dir::Aptitude::State", "var/lib/aptitude");
        Cnf.Set("Dir::State", "var/lib/apt");
        Cnf.Set("Dir::Aptitude::State", "var/lib/aptitude");
-       equals(Cnf.FindFile("Dir::State"), "/srv/sid/var/lib/apt");
-       equals(Cnf.FindFile("Dir::Aptitude::State"), "/srv/sid/var/lib/aptitude");
+       EXPECT_EQ("/srv/sid/var/lib/apt", Cnf.FindFile("Dir::State"));
+       EXPECT_EQ("/srv/sid/var/lib/aptitude", Cnf.FindFile("Dir::Aptitude::State"));
 
        Cnf.Set("RootDir", "/");
 
        Cnf.Set("RootDir", "/");
-       equals(Cnf.FindFile("Dir::State"), "/srv/sid/var/lib/apt");
-       equals(Cnf.FindFile("Dir::Aptitude::State"), "/srv/sid/var/lib/aptitude");
+       EXPECT_EQ("/srv/sid/var/lib/apt", Cnf.FindFile("Dir::State"));
+       EXPECT_EQ("/srv/sid/var/lib/aptitude", Cnf.FindFile("Dir::Aptitude::State"));
        Cnf.Set("RootDir", "//./////.////");
        Cnf.Set("RootDir", "//./////.////");
-       equals(Cnf.FindFile("Dir::State"), "/srv/sid/var/lib/apt");
-       equals(Cnf.FindFile("Dir::Aptitude::State"), "/srv/sid/var/lib/aptitude");
+       EXPECT_EQ("/srv/sid/var/lib/apt", Cnf.FindFile("Dir::State"));
+       EXPECT_EQ("/srv/sid/var/lib/aptitude", Cnf.FindFile("Dir::Aptitude::State"));
        Cnf.Set("RootDir", "/rootdir");
        Cnf.Set("RootDir", "/rootdir");
-       equals(Cnf.FindFile("Dir::State"), "/rootdir/srv/sid/var/lib/apt");
-       equals(Cnf.FindFile("Dir::Aptitude::State"), "/rootdir/srv/sid/var/lib/aptitude");
+       EXPECT_EQ("/rootdir/srv/sid/var/lib/apt", Cnf.FindFile("Dir::State"));
+       EXPECT_EQ("/rootdir/srv/sid/var/lib/aptitude", Cnf.FindFile("Dir::Aptitude::State"));
        Cnf.Set("RootDir", "/rootdir/");
        Cnf.Set("RootDir", "/rootdir/");
-       equals(Cnf.FindFile("Dir::State"), "/rootdir/srv/sid/var/lib/apt");
-       equals(Cnf.FindFile("Dir::Aptitude::State"), "/rootdir/srv/sid/var/lib/aptitude");
+       EXPECT_EQ("/rootdir/srv/sid/var/lib/apt", Cnf.FindFile("Dir::State"));
+       EXPECT_EQ("/rootdir/srv/sid/var/lib/aptitude", Cnf.FindFile("Dir::Aptitude::State"));
 
        Cnf.Set("Dir::State", "/dev/null");
        Cnf.Set("Dir::State::lists", "lists/");
 
        Cnf.Set("Dir::State", "/dev/null");
        Cnf.Set("Dir::State::lists", "lists/");
-       equals(Cnf.FindDir("Dir::State"), "/rootdir/dev/null");
-       equals(Cnf.FindDir("Dir::State::lists"), "/rootdir/dev/null");
-
-       Cnf.Set("Moo::Bar", "1");
-       Cnf.Clear();
-       equals(Cnf.Find("Moo::Bar"), "");
+       EXPECT_EQ("/rootdir/dev/null", Cnf.FindDir("Dir::State"));
+       EXPECT_EQ("/rootdir/dev/null", Cnf.FindDir("Dir::State::lists"));
+}
+TEST(ConfigurationTest,Vector)
+{
+       Configuration Cnf;
 
        std::vector<std::string> vec = Cnf.FindVector("Test::Vector", "");
 
        std::vector<std::string> vec = Cnf.FindVector("Test::Vector", "");
-       equals(vec.size(), 0);
+       EXPECT_EQ(0, vec.size());
        vec = Cnf.FindVector("Test::Vector", "foo");
        vec = Cnf.FindVector("Test::Vector", "foo");
-       equals(vec.size(), 1);
-       equals(vec[0], "foo");
+       ASSERT_EQ(1, vec.size());
+       EXPECT_EQ("foo", vec[0]);
        vec = Cnf.FindVector("Test::Vector", "foo,bar");
        vec = Cnf.FindVector("Test::Vector", "foo,bar");
-       equals(vec.size(), 2);
-       equals(vec[0], "foo");
-       equals(vec[1], "bar");
+       EXPECT_EQ(2, vec.size());
+       EXPECT_EQ("foo", vec[0]);
+       EXPECT_EQ("bar", vec[1]);
        Cnf.Set("Test::Vector::", "baz");
        Cnf.Set("Test::Vector::", "bob");
        Cnf.Set("Test::Vector::", "dob");
        vec = Cnf.FindVector("Test::Vector");
        Cnf.Set("Test::Vector::", "baz");
        Cnf.Set("Test::Vector::", "bob");
        Cnf.Set("Test::Vector::", "dob");
        vec = Cnf.FindVector("Test::Vector");
-       equals(vec.size(), 3);
-       equals(vec[0], "baz");
-       equals(vec[1], "bob");
-       equals(vec[2], "dob");
+       ASSERT_EQ(3, vec.size());
+       EXPECT_EQ("baz", vec[0]);
+       EXPECT_EQ("bob", vec[1]);
+       EXPECT_EQ("dob", vec[2]);
        vec = Cnf.FindVector("Test::Vector", "foo,bar");
        vec = Cnf.FindVector("Test::Vector", "foo,bar");
-       equals(vec.size(), 3);
-       equals(vec[0], "baz");
-       equals(vec[1], "bob");
-       equals(vec[2], "dob");
+       ASSERT_EQ(3, vec.size());
+       EXPECT_EQ("baz", vec[0]);
+       EXPECT_EQ("bob", vec[1]);
+       EXPECT_EQ("dob", vec[2]);
        Cnf.Set("Test::Vector", "abel,bravo");
        vec = Cnf.FindVector("Test::Vector", "foo,bar");
        Cnf.Set("Test::Vector", "abel,bravo");
        vec = Cnf.FindVector("Test::Vector", "foo,bar");
-       equals(vec.size(), 2);
-       equals(vec[0], "abel");
-       equals(vec[1], "bravo");
-
-       //FIXME: Test for configuration file parsing;
-       // currently only integration/ tests test them implicitly
-
-       return 0;
+       ASSERT_EQ(2, vec.size());
+       EXPECT_EQ("abel", vec[0]);
+       EXPECT_EQ("bravo", vec[1]);
 }
 }
diff --git a/test/libapt/file-helpers.cc b/test/libapt/file-helpers.cc
new file mode 100644 (file)
index 0000000..5edb9a9
--- /dev/null
@@ -0,0 +1,77 @@
+#include <apt-pkg/fileutl.h>
+
+#include <string>
+
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+#include <gtest/gtest.h>
+
+#include "file-helpers.h"
+
+void helperCreateTemporaryDirectory(std::string const &id, std::string &dir)
+{
+   std::string const strtempdir = GetTempDir().append("/apt-tests-").append(id).append(".XXXXXX");
+   char * tempdir = strdup(strtempdir.c_str());
+   ASSERT_STREQ(tempdir, mkdtemp(tempdir));
+   dir = tempdir;
+   free(tempdir);
+}
+void helperRemoveDirectory(std::string const &dir)
+{
+   // basic sanity check to avoid removing random directories based on earlier failures
+   if (dir.find("/apt-tests-") == std::string::npos || dir.find_first_of("*?") != std::string::npos)
+      FAIL() << "Directory '" << dir << "' seems invalid. It is therefore not removed!";
+   else
+      ASSERT_EQ(0, system(std::string("rm -rf ").append(dir).c_str()));
+}
+void helperCreateFile(std::string const &dir, std::string const &name)
+{
+   std::string file = dir;
+   file.append("/");
+   file.append(name);
+   int const fd = creat(file.c_str(), 0600);
+   ASSERT_NE(-1, fd);
+   close(fd);
+}
+void helperCreateDirectory(std::string const &dir, std::string const &name)
+{
+   std::string file = dir;
+   file.append("/");
+   file.append(name);
+   ASSERT_TRUE(CreateDirectory(dir, file));
+}
+void helperCreateLink(std::string const &dir, std::string const &targetname, std::string const &linkname)
+{
+   std::string target = dir;
+   target.append("/");
+   target.append(targetname);
+   std::string link = dir;
+   link.append("/");
+   link.append(linkname);
+   ASSERT_EQ(0, symlink(target.c_str(), link.c_str()));
+}
+void helperCreateTemporaryFile(std::string const &id, FileFd &fd, char * * const filename, char const * const content)
+{
+   std::string name("apt-test-");
+   name.append(id).append(".XXXXXXXX");
+   char * tempfile = strdup(name.c_str());
+   int tempfile_fd = mkstemp(tempfile);
+   ASSERT_NE(-1, tempfile_fd);
+   if (filename != NULL)
+      *filename = tempfile;
+   else
+   {
+      unlink(tempfile);
+      free(tempfile);
+   }
+
+   EXPECT_TRUE(fd.OpenDescriptor(tempfile_fd, FileFd::ReadWrite));
+   if (content != NULL)
+   {
+      ASSERT_TRUE(fd.Write(content, strlen(content)));
+      fd.Seek(0);
+   }
+}
diff --git a/test/libapt/file-helpers.h b/test/libapt/file-helpers.h
new file mode 100644 (file)
index 0000000..e8472d5
--- /dev/null
@@ -0,0 +1,29 @@
+#ifndef APT_TESTS_FILE_HELPERS
+#define APT_TESTS_FILE_HELPERS
+
+#include <string>
+
+#include <gtest/gtest.h>
+
+class FileFd;
+
+#define createTemporaryDirectory(id, dir) \
+   ASSERT_NO_FATAL_FAILURE(helperCreateTemporaryDirectory(id, dir))
+void helperCreateTemporaryDirectory(std::string const &id, std::string &dir);
+#define removeDirectory(dir) \
+   ASSERT_NO_FATAL_FAILURE(helperRemoveDirectory(dir))
+void helperRemoveDirectory(std::string const &dir);
+#define createFile(dir, name) \
+   ASSERT_NO_FATAL_FAILURE(helperCreateFile(dir, name))
+void helperCreateFile(std::string const &dir, std::string const &name);
+#define createDirectory(dir, name) \
+   ASSERT_NO_FATAL_FAILURE(helperCreateDirectory(dir, name))
+void helperCreateDirectory(std::string const &dir, std::string const &name);
+#define createLink(dir, targetname, linkname) \
+   ASSERT_NO_FATAL_FAILURE(helperCreateLink(dir, targetname, linkname))
+void helperCreateLink(std::string const &dir, std::string const &targetname, std::string const &linkname);
+#define createTemporaryFile(id, fd, filename, content) \
+   ASSERT_NO_FATAL_FAILURE(helperCreateTemporaryFile(id, fd, filename, content))
+void helperCreateTemporaryFile(std::string const &id, FileFd &fd, char * * const filename, char const * const content);
+
+#endif
index f3a3dd08ebbf5a22cd1cb9919b405f569eb86dcd..643c02297fbc2e8851775cceb84fb36582beea9f 100644 (file)
 
 #include <apt-pkg/error.h>
 #include <apt-pkg/fileutl.h>
 
 #include <apt-pkg/error.h>
 #include <apt-pkg/fileutl.h>
+#include <apt-pkg/strutl.h>
 #include <apt-pkg/aptconfiguration.h>
 
 #include <string>
 #include <vector>
 #include <stdlib.h>
 #include <apt-pkg/aptconfiguration.h>
 
 #include <string>
 #include <vector>
 #include <stdlib.h>
-#include <sys/stat.h>
 #include <string.h>
 
 #include <string.h>
 
-#include "assert.h"
+#include <gtest/gtest.h>
 
 
-static void assertStringEquals(char const * const expect, char const * const got, unsigned long const line) {
-       if (strncmp(expect, got, strlen(expect)) == 0)
-               return;
-       OutputAssertEqual(expect, "==", got, line);
-}
-#define strequals(x,y) assertStringEquals(x, y, __LINE__)
+#include "file-helpers.h"
 
 
-static bool
-TestFileFd(mode_t const a_umask, mode_t const ExpectedFilePermission, unsigned int const filemode, APT::Configuration::Compressor const &compressor)
+static void TestFileFd(mode_t const a_umask, mode_t const ExpectedFilePermission,
+      unsigned int const filemode, APT::Configuration::Compressor const &compressor)
 {
 {
-   FileFd f;
-   struct stat buf;
+   std::string trace;
+   strprintf(trace, "TestFileFd: Compressor: %s umask: %#o permission: %#o mode: %d", compressor.Name.c_str(), a_umask, ExpectedFilePermission, filemode);
+   SCOPED_TRACE(trace);
+
    static const char* fname = "apt-filefd-test.txt";
    if (FileExists(fname) == true)
    static const char* fname = "apt-filefd-test.txt";
    if (FileExists(fname) == true)
-      equals(unlink(fname), 0);
+      EXPECT_EQ(0, unlink(fname));
 
 
+   FileFd f;
    umask(a_umask);
    umask(a_umask);
-   equals(f.Open(fname, filemode, compressor), true);
-   equals(f.IsOpen(), true);
-   equals(f.Failed(), false);
-   equals(umask(a_umask), a_umask);
+   EXPECT_TRUE(f.Open(fname, filemode, compressor));
+   EXPECT_TRUE(f.IsOpen());
+   EXPECT_FALSE(f.Failed());
+   EXPECT_EQ(umask(a_umask), a_umask);
 
    std::string test = "This is a test!\n";
 
    std::string test = "This is a test!\n";
-   equals(f.Write(test.c_str(), test.size()), true);
-   equals(f.IsOpen(), true);
-   equals(f.Failed(), false);
+   EXPECT_TRUE(f.Write(test.c_str(), test.size()));
+   EXPECT_TRUE(f.IsOpen());
+   EXPECT_FALSE(f.Failed());
 
    f.Close();
 
    f.Close();
-   equals(f.IsOpen(), false);
-   equals(f.Failed(), false);
-
-   equals(f.Open(fname, FileFd::ReadOnly, compressor), true);
-   equals(f.IsOpen(), true);
-   equals(f.Failed(), false);
-   equals(f.Eof(), false);
-   equalsNot(f.FileSize(), 0);
-   equals(f.Failed(), false);
-   equalsNot(f.ModificationTime(), 0);
-   equals(f.Failed(), false);
+   EXPECT_FALSE(f.IsOpen());
+   EXPECT_FALSE(f.Failed());
+
+   EXPECT_TRUE(f.Open(fname, FileFd::ReadOnly, compressor));
+   EXPECT_TRUE(f.IsOpen());
+   EXPECT_FALSE(f.Failed());
+   EXPECT_FALSE(f.Eof());
+   EXPECT_NE(0, f.FileSize());
+   EXPECT_FALSE(f.Failed());
+   EXPECT_NE(0, f.ModificationTime());
+   EXPECT_FALSE(f.Failed());
 
    // ensure the memory is as predictably messed up
 
    // ensure the memory is as predictably messed up
-# define APT_INIT_READBACK \
+#define APT_INIT_READBACK \
    char readback[20]; \
    memset(readback, 'D', sizeof(readback)/sizeof(readback[0])); \
    readback[19] = '\0';
    char readback[20]; \
    memset(readback, 'D', sizeof(readback)/sizeof(readback[0])); \
    readback[19] = '\0';
+#define EXPECT_N_STR(expect, actual) \
+   EXPECT_EQ(0, strncmp(expect, actual, strlen(expect)));
+
    {
       APT_INIT_READBACK
       char const * const expect = "This";
    {
       APT_INIT_READBACK
       char const * const expect = "This";
-      equals(f.Read(readback, strlen(expect)), true);
-      equals(f.Failed(), false);
-      equals(f.Eof(), false);
-      strequals(expect, readback);
-      equals(strlen(expect), f.Tell());
+      EXPECT_TRUE(f.Read(readback, strlen(expect)));
+      EXPECT_FALSE(f.Failed());
+      EXPECT_FALSE(f.Eof());
+      EXPECT_N_STR(expect, readback);
+      EXPECT_EQ(strlen(expect), f.Tell());
    }
    {
       APT_INIT_READBACK
       char const * const expect = "test!\n";
    }
    {
       APT_INIT_READBACK
       char const * const expect = "test!\n";
-      equals(f.Skip((test.size() - f.Tell()) - strlen(expect)), true);
-      equals(f.Read(readback, strlen(expect)), true);
-      equals(f.Failed(), false);
-      equals(f.Eof(), false);
-      strequals(expect, readback);
-      equals(test.size(), f.Tell());
+      EXPECT_TRUE(f.Skip((test.size() - f.Tell()) - strlen(expect)));
+      EXPECT_TRUE(f.Read(readback, strlen(expect)));
+      EXPECT_FALSE(f.Failed());
+      EXPECT_FALSE(f.Eof());
+      EXPECT_N_STR(expect, readback);
+      EXPECT_EQ(test.size(), f.Tell());
    }
    {
       APT_INIT_READBACK
    }
    {
       APT_INIT_READBACK
-      equals(f.Seek(0), true);
-      equals(f.Eof(), false);
-      equals(f.Read(readback, 20, true), true);
-      equals(f.Failed(), false);
-      equals(f.Eof(), true);
-      strequals(test.c_str(), readback);
-      equals(f.Size(), f.Tell());
+      EXPECT_TRUE(f.Seek(0));
+      EXPECT_FALSE(f.Eof());
+      EXPECT_TRUE(f.Read(readback, 20, true));
+      EXPECT_FALSE(f.Failed());
+      EXPECT_TRUE(f.Eof());
+      EXPECT_N_STR(test.c_str(), readback);
+      EXPECT_EQ(f.Size(), f.Tell());
    }
    {
       APT_INIT_READBACK
    }
    {
       APT_INIT_READBACK
-      equals(f.Seek(0), true);
-      equals(f.Eof(), false);
-      equals(f.Read(readback, test.size(), true), true);
-      equals(f.Failed(), false);
-      equals(f.Eof(), false);
-      strequals(test.c_str(), readback);
-      equals(f.Size(), f.Tell());
+      EXPECT_TRUE(f.Seek(0));
+      EXPECT_FALSE(f.Eof());
+      EXPECT_TRUE(f.Read(readback, test.size(), true));
+      EXPECT_FALSE(f.Failed());
+      EXPECT_FALSE(f.Eof());
+      EXPECT_N_STR(test.c_str(), readback);
+      EXPECT_EQ(f.Size(), f.Tell());
    }
    {
       APT_INIT_READBACK
    }
    {
       APT_INIT_READBACK
-      equals(f.Seek(0), true);
-      equals(f.Eof(), false);
+      EXPECT_TRUE(f.Seek(0));
+      EXPECT_FALSE(f.Eof());
       unsigned long long actual;
       unsigned long long actual;
-      equals(f.Read(readback, 20, &actual), true);
-      equals(f.Failed(), false);
-      equals(f.Eof(), true);
-      equals(test.size(), actual);
-      strequals(test.c_str(), readback);
-      equals(f.Size(), f.Tell());
+      EXPECT_TRUE(f.Read(readback, 20, &actual));
+      EXPECT_FALSE(f.Failed());
+      EXPECT_TRUE(f.Eof());
+      EXPECT_EQ(test.size(), actual);
+      EXPECT_N_STR(test.c_str(), readback);
+      EXPECT_EQ(f.Size(), f.Tell());
    }
    {
       APT_INIT_READBACK
    }
    {
       APT_INIT_READBACK
-      equals(f.Seek(0), true);
-      equals(f.Eof(), false);
+      EXPECT_TRUE(f.Seek(0));
+      EXPECT_FALSE(f.Eof());
       f.ReadLine(readback, 20);
       f.ReadLine(readback, 20);
-      equals(f.Failed(), false);
-      equals(f.Eof(), false);
-      equals(test, readback);
-      equals(f.Size(), f.Tell());
+      EXPECT_FALSE(f.Failed());
+      EXPECT_FALSE(f.Eof());
+      EXPECT_EQ(test, readback);
+      EXPECT_EQ(f.Size(), f.Tell());
    }
    {
       APT_INIT_READBACK
    }
    {
       APT_INIT_READBACK
-      equals(f.Seek(0), true);
-      equals(f.Eof(), false);
+      EXPECT_TRUE(f.Seek(0));
+      EXPECT_FALSE(f.Eof());
       char const * const expect = "This";
       f.ReadLine(readback, strlen(expect) + 1);
       char const * const expect = "This";
       f.ReadLine(readback, strlen(expect) + 1);
-      equals(f.Failed(), false);
-      equals(f.Eof(), false);
-      strequals(expect, readback);
-      equals(strlen(expect), f.Tell());
+      EXPECT_FALSE(f.Failed());
+      EXPECT_FALSE(f.Eof());
+      EXPECT_N_STR(expect, readback);
+      EXPECT_EQ(strlen(expect), f.Tell());
    }
 #undef APT_INIT_READBACK
 
    f.Close();
    }
 #undef APT_INIT_READBACK
 
    f.Close();
-   equals(f.IsOpen(), false);
-   equals(f.Failed(), false);
+   EXPECT_FALSE(f.IsOpen());
+   EXPECT_FALSE(f.Failed());
 
    // regression test for permission bug LP: #1304657
 
    // regression test for permission bug LP: #1304657
-   if (stat(fname, &buf) < 0)
-   {
-      _error->Errno("stat", "failed to stat");
-      return false;
-   }
-   equals(unlink(fname), 0);
-   equals(buf.st_mode & 0777, ExpectedFilePermission);
-   return true;
+   struct stat buf;
+   EXPECT_EQ(0, stat(fname, &buf));
+   EXPECT_EQ(0, unlink(fname));
+   EXPECT_EQ(ExpectedFilePermission, buf.st_mode & 0777);
 }
 
 }
 
-static bool TestFileFd(unsigned int const filemode)
+static void TestFileFd(unsigned int const filemode)
 {
    std::vector<APT::Configuration::Compressor> compressors = APT::Configuration::getCompressors();
 
 {
    std::vector<APT::Configuration::Compressor> compressors = APT::Configuration::getCompressors();
 
@@ -159,78 +156,71 @@ static bool TestFileFd(unsigned int const filemode)
       if ((filemode & FileFd::ReadWrite) == FileFd::ReadWrite &&
            (c->Name.empty() != true && c->Binary.empty() != true))
         continue;
       if ((filemode & FileFd::ReadWrite) == FileFd::ReadWrite &&
            (c->Name.empty() != true && c->Binary.empty() != true))
         continue;
-      if (TestFileFd(0002, 0664, filemode, *c) == false ||
-           TestFileFd(0022, 0644, filemode, *c) == false ||
-           TestFileFd(0077, 0600, filemode, *c) == false ||
-           TestFileFd(0026, 0640, filemode, *c) == false)
-      {
-        _error->DumpErrors();
-        return false;
-      }
+      TestFileFd(0002, 0664, filemode, *c);
+      TestFileFd(0022, 0644, filemode, *c);
+      TestFileFd(0077, 0600, filemode, *c);
+      TestFileFd(0026, 0640, filemode, *c);
    }
    }
-   return true;
 }
 
 }
 
-int main(int const argc, char const * const * const argv)
+TEST(FileUtlTest, FileFD)
+{
+   std::string const startdir = SafeGetCWD();
+   EXPECT_FALSE(startdir.empty());
+   std::string tempdir;
+   createTemporaryDirectory("filefd", tempdir);
+   EXPECT_EQ(0, chdir(tempdir.c_str()));
+
+   TestFileFd(FileFd::WriteOnly | FileFd::Create);
+   TestFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Empty);
+   TestFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive);
+   TestFileFd(FileFd::WriteOnly | FileFd::Atomic);
+   TestFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Atomic);
+   // short-hands for ReadWrite with these modes
+   TestFileFd(FileFd::WriteEmpty);
+   TestFileFd(FileFd::WriteAny);
+   TestFileFd(FileFd::WriteTemp);
+   TestFileFd(FileFd::WriteAtomic);
+
+   EXPECT_EQ(0, chdir(startdir.c_str()));
+   removeDirectory(tempdir);
+}
+TEST(FileUtlTest, Glob)
 {
 {
-   std::string startdir;
-   if (argc > 1 && DirectoryExists(argv[1]) == true) {
-      startdir = SafeGetCWD();
-      equals(chdir(argv[1]), 0);
-   }
-   if (TestFileFd(FileFd::WriteOnly | FileFd::Create) == false ||
-        TestFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Empty) == false ||
-        TestFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive) == false ||
-        TestFileFd(FileFd::WriteOnly | FileFd::Atomic) == false ||
-        TestFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Atomic) == false ||
-        // short-hands for ReadWrite with these modes
-        TestFileFd(FileFd::WriteEmpty) == false ||
-        TestFileFd(FileFd::WriteAny) == false ||
-        TestFileFd(FileFd::WriteTemp) == false ||
-        TestFileFd(FileFd::WriteAtomic) == false)
-   {
-      return 1;
-   }
-   if (startdir.empty() == false)
-      equals(chdir(startdir.c_str()), 0);
-
    std::vector<std::string> files;
    // normal match
    std::vector<std::string> files;
    // normal match
-   files = Glob("*.lst");
-   if (files.size() != 1)
-   {
-      _error->DumpErrors();
-      return 1;
-   }
+   files = Glob("*akefile");
+   EXPECT_EQ(1, files.size());
 
    // not there
    files = Glob("xxxyyyzzz");
 
    // not there
    files = Glob("xxxyyyzzz");
-   if (files.size() != 0 || _error->PendingError())
-   {
-      _error->DumpErrors();
-      return 1;
-   }
+   EXPECT_TRUE(files.empty());
+   EXPECT_FALSE(_error->PendingError());
 
    // many matches (number is a bit random)
    files = Glob("*.cc");
 
    // many matches (number is a bit random)
    files = Glob("*.cc");
-   if (files.size() < 10)
-   {
-      _error->DumpErrors();
-      return 1;
-   }
+   EXPECT_LT(10, files.size());
+}
+TEST(FileUtlTest, GetTempDir)
+{
+   char const * const envtmp = getenv("TMPDIR");
+   std::string old_tmpdir;
+   if (envtmp != NULL)
+      old_tmpdir = envtmp;
 
 
-   // GetTempDir()
    unsetenv("TMPDIR");
    unsetenv("TMPDIR");
-   equals(GetTempDir(), "/tmp");
+   EXPECT_EQ("/tmp", GetTempDir());
 
    setenv("TMPDIR", "", 1);
 
    setenv("TMPDIR", "", 1);
-   equals(GetTempDir(), "/tmp");
+   EXPECT_EQ("/tmp", GetTempDir());
 
    setenv("TMPDIR", "/not-there-no-really-not", 1);
 
    setenv("TMPDIR", "/not-there-no-really-not", 1);
-   equals(GetTempDir(), "/tmp");
+   EXPECT_EQ("/tmp", GetTempDir());
 
    setenv("TMPDIR", "/usr", 1);
 
    setenv("TMPDIR", "/usr", 1);
-   equals(GetTempDir(), "/usr");
+   EXPECT_EQ("/usr", GetTempDir());
 
 
-   return 0;
+   unsetenv("TMPDIR");
+   if (old_tmpdir.empty() == false)
+      setenv("TMPDIR", old_tmpdir.c_str(), 1);
 }
 }
index f4dfc6ae8d69d38a0b4241b2bb10bdce39b3e92f..53c00cd8f041e170af9833a756cce9c021811dbd 100644 (file)
@@ -6,56 +6,72 @@
 #include <string>
 #include <vector>
 
 #include <string>
 #include <vector>
 
-#include "assert.h"
+#include <gtest/gtest.h>
 
 
-int main()
+TEST(ArchitecturesTest,SimpleLists)
 {
 {
-       std::vector<std::string> vec;
-
-       _config->Set("APT::Architectures::1", "i386");
-       _config->Set("APT::Architectures::2", "amd64");
-       vec = APT::Configuration::getArchitectures(false);
-       equals(vec.size(), 2);
-       equals(vec[0], "i386");
-       equals(vec[1], "amd64");
-
-       _config->Set("APT::Architecture", "i386");
-       vec = APT::Configuration::getArchitectures(false);
-       equals(vec.size(), 2);
-       equals(vec[0], "i386");
-       equals(vec[1], "amd64");
-
-       _config->Set("APT::Architectures::2", "");
-       vec = APT::Configuration::getArchitectures(false);
-       equals(vec.size(), 1);
-       equals(vec[0], "i386");
-
-       _config->Set("APT::Architecture", "armel");
-       vec = APT::Configuration::getArchitectures(false);
-       equals(vec.size(), 2);
-       equals(vec[0], "armel");
-       equals(vec[1], "i386");
-
-       _config->Set("APT::Architectures::2", "armel");
-       vec = APT::Configuration::getArchitectures(false);
-       equals(vec.size(), 2);
-       equals(vec[0], "i386");
-       equals(vec[1], "armel");
-
-       _config->Set("APT::Architectures::2", "amd64");
-       _config->Set("APT::Architectures::3", "i386");
-       _config->Set("APT::Architectures::4", "armel");
-       _config->Set("APT::Architectures::5", "i386");
-       _config->Set("APT::Architectures::6", "amd64");
-       _config->Set("APT::Architectures::7", "armel");
-       _config->Set("APT::Architectures::8", "armel");
-       _config->Set("APT::Architectures::9", "amd64");
-       _config->Set("APT::Architectures::10", "amd64");
-       vec = APT::Configuration::getArchitectures(false);
-       equals(vec.size(), 3);
-       equals(vec[0], "i386");
-       equals(vec[1], "amd64");
-       equals(vec[2], "armel");
-
-       return 0;
+   _config->Clear();
+   std::vector<std::string> vec;
+
+   _config->Set("APT::Architectures::1", "i386");
+   _config->Set("APT::Architectures::2", "amd64");
+   vec = APT::Configuration::getArchitectures(false);
+   ASSERT_EQ(2, vec.size());
+   EXPECT_EQ("i386", vec[0]);
+   EXPECT_EQ("amd64", vec[1]);
+
+   _config->Set("APT::Architecture", "i386");
+   vec = APT::Configuration::getArchitectures(false);
+   ASSERT_EQ(2, vec.size());
+   EXPECT_EQ("i386", vec[0]);
+   EXPECT_EQ("amd64", vec[1]);
+
+   _config->Set("APT::Architectures::2", "");
+   vec = APT::Configuration::getArchitectures(false);
+   ASSERT_EQ(1, vec.size());
+   EXPECT_EQ("i386", vec[0]);
+
+   _config->Set("APT::Architecture", "armel");
+   vec = APT::Configuration::getArchitectures(false);
+   ASSERT_EQ(2, vec.size());
+   EXPECT_EQ("armel", vec[0]);
+   EXPECT_EQ("i386", vec[1]);
+
+   _config->Set("APT::Architectures::2", "armel");
+   vec = APT::Configuration::getArchitectures(false);
+   ASSERT_EQ(2, vec.size());
+   EXPECT_EQ("i386", vec[0]);
+   EXPECT_EQ("armel", vec[1]);
+
+   _config->Set("APT::Architectures", "armel,armhf");
+   vec = APT::Configuration::getArchitectures(false);
+   ASSERT_EQ(2, vec.size());
+   EXPECT_EQ("armel", vec[0]);
+   EXPECT_EQ("armhf", vec[1]);
+   _config->Clear();
+}
+TEST(ArchitecturesTest,Duplicates)
+{
+   _config->Clear();
+
+   _config->Set("APT::Architecture", "armel");
+   _config->Set("APT::Architectures::", "i386");
+   _config->Set("APT::Architectures::", "amd64");
+   _config->Set("APT::Architectures::", "i386");
+   _config->Set("APT::Architectures::", "armel");
+   _config->Set("APT::Architectures::", "i386");
+   _config->Set("APT::Architectures::", "amd64");
+   _config->Set("APT::Architectures::", "armel");
+   _config->Set("APT::Architectures::", "armel");
+   _config->Set("APT::Architectures::", "amd64");
+   _config->Set("APT::Architectures::", "amd64");
+   std::vector<std::string> vec = _config->FindVector("APT::Architectures");
+   ASSERT_EQ(10, vec.size());
+   vec = APT::Configuration::getArchitectures(false);
+   ASSERT_EQ(3, vec.size());
+   EXPECT_EQ("i386", vec[0]);
+   EXPECT_EQ("amd64", vec[1]);
+   EXPECT_EQ("armel", vec[2]);
+
+   _config->Clear();
 }
 }
index 15aa4e8799c3bfdb0fca5a3b8d3b9864e915fa3e..c50ff6ff8504db65b22e1d90061e964c48fb3cdb 100644 (file)
 
 #include <apt-pkg/aptconfiguration.h>
 #include <apt-pkg/configuration.h>
 
 #include <apt-pkg/aptconfiguration.h>
 #include <apt-pkg/configuration.h>
+#include <apt-pkg/fileutl.h>
 
 
-#include "assert.h"
+#include <algorithm>
+#include <iostream>
 #include <string>
 #include <vector>
 
 #include <string>
 #include <vector>
 
-#include <iostream>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <gtest/gtest.h>
+
+#include "file-helpers.h"
+
+TEST(LanguagesTest,Environment)
+{
+   _config->Clear();
+
+   char const* env[2];
+   env[0] = "de_DE.UTF-8";
+   env[1] = "";
+
+   std::vector<std::string> vec = APT::Configuration::getLanguages(false, false, env);
+   ASSERT_EQ(3 ,vec.size());
+   EXPECT_EQ("de_DE", vec[0]);
+   EXPECT_EQ("de", vec[1]);
+   EXPECT_EQ("en", vec[2]);
+
+   // Special: Check if the cache is actually in use
+   env[0] = "en_GB.UTF-8";
+   vec = APT::Configuration::getLanguages(false, true, env);
+   ASSERT_EQ(3, vec.size());
+   EXPECT_EQ("de_DE", vec[0]);
+   EXPECT_EQ("de", vec[1]);
+   EXPECT_EQ("en", vec[2]);
+
+   env[0] = "en_GB.UTF-8";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   ASSERT_EQ(2, vec.size());
+   EXPECT_EQ("en_GB", vec[0]);
+   EXPECT_EQ("en", vec[1]);
+
+   // esperanto
+   env[0] = "eo.UTF-8";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   ASSERT_EQ(2, vec.size());
+   EXPECT_EQ("eo", vec[0]);
+   EXPECT_EQ("en", vec[1]);
+
+   env[0] = "tr_DE@euro";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   EXPECT_EQ(3, vec.size());
+   EXPECT_EQ("tr_DE", vec[0]);
+   EXPECT_EQ("tr", vec[1]);
+   EXPECT_EQ("en", vec[2]);
+
+   env[0] = "de_NO";
+   env[1] = "de_NO:en_GB:nb_NO:nb:no_NO:no:nn_NO:nn:da:sv:en";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   EXPECT_EQ(6, vec.size());
+   EXPECT_EQ("de_NO", vec[0]);
+   EXPECT_EQ("de", vec[1]);
+   EXPECT_EQ("en_GB", vec[2]);
+   EXPECT_EQ("nb_NO", vec[3]);
+   EXPECT_EQ("nb", vec[4]);
+   EXPECT_EQ("en", vec[5]);
+
+   env[0] = "pt_PR.UTF-8";
+   env[1] = "";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   EXPECT_EQ(3, vec.size());
+   EXPECT_EQ("pt_PR", vec[0]);
+   EXPECT_EQ("pt", vec[1]);
+   EXPECT_EQ("en", vec[2]);
+
+   env[0] = "ast_DE.UTF-8";
+   vec = APT::Configuration::getLanguages(false, false, env); // bogus, but syntactical correct
+   EXPECT_EQ(3, vec.size());
+   EXPECT_EQ("ast_DE", vec[0]);
+   EXPECT_EQ("ast", vec[1]);
+   EXPECT_EQ("en", vec[2]);
+
+   env[0] = "C";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   EXPECT_EQ(1, vec.size());
+   EXPECT_EQ("en", vec[0]);
+
+   _config->Set("Acquire::Languages", "none");
+   env[0] = "C";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   EXPECT_TRUE(vec.empty());
+
+   _config->Set("Acquire::Languages", "environment");
+   env[0] = "C";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   EXPECT_EQ(1, vec.size());
+   EXPECT_EQ("en", vec[0]);
+
+   _config->Set("Acquire::Languages", "de");
+   env[0] = "C";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   EXPECT_EQ(1, vec.size());
+   EXPECT_EQ("de", vec[0]);
+
+   _config->Set("Acquire::Languages", "fr");
+   env[0] = "ast_DE.UTF-8";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   EXPECT_EQ(1, vec.size());
+   EXPECT_EQ("fr", vec[0]);
+
+   _config->Set("Acquire::Languages", "environment,en");
+   env[0] = "de_DE.UTF-8";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   EXPECT_EQ(3, vec.size());
+   EXPECT_EQ("de_DE", vec[0]);
+   EXPECT_EQ("de", vec[1]);
+   EXPECT_EQ("en", vec[2]);
+   _config->Set("Acquire::Languages", "");
+
+   _config->Set("Acquire::Languages::1", "environment");
+   _config->Set("Acquire::Languages::2", "en");
+   env[0] = "de_DE.UTF-8";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   EXPECT_EQ(3, vec.size());
+   EXPECT_EQ("de_DE", vec[0]);
+   EXPECT_EQ("de", vec[1]);
+   EXPECT_EQ("en", vec[2]);
+
+   _config->Set("Acquire::Languages::3", "de");
+   env[0] = "de_DE.UTF-8";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   EXPECT_EQ(3, vec.size());
+   EXPECT_EQ("de_DE", vec[0]);
+   EXPECT_EQ("de", vec[1]);
+   EXPECT_EQ("en", vec[2]);
+
+   _config->Clear();
+}
 
 
-int main(int argc,char *argv[])
+TEST(LanguagesTest,TranslationFiles)
 {
 {
-       if (argc != 2) {
-               std::cout << "One parameter expected - given " << argc << std::endl;
-               return 100;
-       }
-
-       char const* env[2];
-       env[0] = "de_DE.UTF-8";
-       env[1] = "";
-
-       std::vector<std::string> vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 3);
-       equals(vec[0], "de_DE");
-       equals(vec[1], "de");
-       equals(vec[2], "en");
-
-       // Special: Check if the cache is actually in use
-               env[0] = "en_GB.UTF-8";
-               vec = APT::Configuration::getLanguages(false, true, env);
-               equals(vec.size(), 3);
-               equals(vec[0], "de_DE");
-               equals(vec[1], "de");
-               equals(vec[2], "en");
-
-       env[0] = "en_GB.UTF-8";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 2);
-       equals(vec[0], "en_GB");
-       equals(vec[1], "en");
-
-       // esperanto
-       env[0] = "eo.UTF-8";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 2);
-       equals(vec[0], "eo");
-       equals(vec[1], "en");
-
-       env[0] = "tr_DE@euro";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 3);
-       equals(vec[0], "tr_DE");
-       equals(vec[1], "tr");
-       equals(vec[2], "en");
-
-       env[0] = "de_NO";
-       env[1] = "de_NO:en_GB:nb_NO:nb:no_NO:no:nn_NO:nn:da:sv:en";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 6);
-       equals(vec[0], "de_NO");
-       equals(vec[1], "de");
-       equals(vec[2], "en_GB");
-       equals(vec[3], "nb_NO");
-       equals(vec[4], "nb");
-       equals(vec[5], "en");
-
-       env[0] = "pt_PR.UTF-8";
-       env[1] = "";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 3);
-       equals(vec[0], "pt_PR");
-       equals(vec[1], "pt");
-       equals(vec[2], "en");
-
-       env[0] = "ast_DE.UTF-8";
-       vec = APT::Configuration::getLanguages(false, false, env); // bogus, but syntactical correct
-       equals(vec.size(), 3);
-       equals(vec[0], "ast_DE");
-       equals(vec[1], "ast");
-       equals(vec[2], "en");
-
-       env[0] = "C";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 1);
-       equals(vec[0], "en");
-
-       _config->Set("Acquire::Languages", "none");
-       env[0] = "C";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 0);
-
-       _config->Set("Acquire::Languages", "environment");
-       env[0] = "C";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 1);
-       equals(vec[0], "en");
-
-       _config->Set("Acquire::Languages", "de");
-       env[0] = "C";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 1);
-       equals(vec[0], "de");
-
-       _config->Set("Acquire::Languages", "fr");
-       env[0] = "ast_DE.UTF-8";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 1);
-       equals(vec[0], "fr");
-
-       _config->Set("Acquire::Languages", "environment,en");
-       env[0] = "de_DE.UTF-8";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 3);
-       equals(vec[0], "de_DE");
-       equals(vec[1], "de");
-       equals(vec[2], "en");
-       _config->Set("Acquire::Languages", "");
-
-       _config->Set("Acquire::Languages::1", "environment");
-       _config->Set("Acquire::Languages::2", "en");
-       env[0] = "de_DE.UTF-8";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 3);
-       equals(vec[0], "de_DE");
-       equals(vec[1], "de");
-       equals(vec[2], "en");
-
-       _config->Set("Acquire::Languages::3", "de");
-       env[0] = "de_DE.UTF-8";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 3);
-       equals(vec[0], "de_DE");
-       equals(vec[1], "de");
-       equals(vec[2], "en");
-
-       _config->Set("Dir::State::lists", argv[1]);
-       vec = APT::Configuration::getLanguages(true, false, env);
-       equals(vec.size(), 8);
-       equals(vec[0], "de_DE");
-       equals(vec[1], "de");
-       equals(vec[2], "en");
-       equals(vec[3], "none");
-       equalsOr4(vec[4], "pt", "tr", "ast_DE", "tlh_DE");
-       equalsOr4(vec[5], "tr", "pt", "ast_DE", "tlh_DE");
-       equalsOr4(vec[6], "tr", "pt", "ast_DE", "tlh_DE");
-       equalsOr4(vec[7], "tr", "pt", "ast_DE", "tlh_DE");
-       equalsNot(vec[4], vec[5]);
-       equalsNot(vec[4], vec[6]);
-       equalsNot(vec[4], vec[7]);
-       equalsNot(vec[5], vec[6]);
-       equalsNot(vec[5], vec[7]);
-       equalsNot(vec[6], vec[7]);
-
-       _config->Set("Acquire::Languages", "none");
-       vec = APT::Configuration::getLanguages(true, false, env);
-       equals(vec.size(), 1);
-       equals(vec[0], "none");
-       _config->Set("Acquire::Languages", "");
-
-       _config->Set("Dir::State::lists", "/non-existing-dir");
-       _config->Set("Acquire::Languages::1", "none");
-       env[0] = "de_DE.UTF-8";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 0);
-       env[0] = "de_DE.UTF-8";
-       vec = APT::Configuration::getLanguages(true, false, env);
-       equals(vec.size(), 2);
-       equals(vec[0], "en");
-       equals(vec[1], "de");
-
-       _config->Set("Acquire::Languages::1", "fr");
-       _config->Set("Acquire::Languages", "de_DE");
-       env[0] = "de_DE.UTF-8";
-       vec = APT::Configuration::getLanguages(false, false, env);
-       equals(vec.size(), 1);
-       equals(vec[0], "de_DE");
-
-       _config->Set("Acquire::Languages", "none");
-       env[0] = "de_DE.UTF-8";
-       vec = APT::Configuration::getLanguages(true, false, env);
-       equals(vec.size(), 1);
-       equals(vec[0], "none");
-
-       _config->Set("Acquire::Languages", "");
-       //FIXME: Remove support for this deprecated setting
-               _config->Set("APT::Acquire::Translation", "ast_DE");
-               env[0] = "de_DE.UTF-8";
-               vec = APT::Configuration::getLanguages(true, false, env);
-               equals(vec.size(), 2);
-               equals(vec[0], "ast_DE");
-               equals(vec[1], "en");
-               _config->Set("APT::Acquire::Translation", "none");
-               env[0] = "de_DE.UTF-8";
-               vec = APT::Configuration::getLanguages(true, false, env);
-               equals(vec.size(), 1);
-               equals(vec[0], "en");
-
-       return 0;
+   _config->Clear();
+   _config->Set("Acquire::Languages::1", "environment");
+   _config->Set("Acquire::Languages::2", "en");
+   _config->Set("Acquire::Languages::3", "de");
+
+   char const* env[2];
+   env[0] = "de_DE.UTF-8";
+   env[1] = "";
+
+   std::string tempdir;
+   createTemporaryDirectory("languages", tempdir);
+
+#define createTranslation(lang) \
+   createFile(tempdir, std::string("/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-").append(lang));
+
+   createTranslation("tr");
+   createTranslation("pt");
+   createTranslation("se~");
+   createTranslation("st.bak");
+   createTranslation("ast_DE");
+   createTranslation("tlh%5fDE");
+
+   _config->Set("Dir::State::lists", tempdir);
+   std::vector<std::string> vec = APT::Configuration::getLanguages(true, false, env);
+   EXPECT_EQ(8, vec.size());
+   EXPECT_EQ("de_DE", vec[0]);
+   EXPECT_EQ("de", vec[1]);
+   EXPECT_EQ("en", vec[2]);
+   EXPECT_EQ("none", vec[3]);
+   EXPECT_NE(vec.end(), std::find(vec.begin(), vec.end(), "pt"));
+   EXPECT_NE(vec.end(), std::find(vec.begin(), vec.end(), "tr"));
+   EXPECT_NE(vec.end(), std::find(vec.begin(), vec.end(), "ast_DE"));
+   EXPECT_NE(vec.end(), std::find(vec.begin(), vec.end(), "tlh_DE"));
+   EXPECT_NE(vec[4], vec[5]);
+   EXPECT_NE(vec[4], vec[6]);
+   EXPECT_NE(vec[4], vec[7]);
+   EXPECT_NE(vec[5], vec[6]);
+   EXPECT_NE(vec[5], vec[7]);
+   EXPECT_NE(vec[6], vec[7]);
+
+   _config->Set("Acquire::Languages", "none");
+   vec = APT::Configuration::getLanguages(true, false, env);
+   EXPECT_EQ(1, vec.size());
+   EXPECT_EQ("none", vec[0]);
+   _config->Set("Acquire::Languages", "");
+
+   _config->Set("Dir::State::lists", "/non-existing-dir");
+   _config->Set("Acquire::Languages::1", "none");
+   env[0] = "de_DE.UTF-8";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   EXPECT_TRUE(vec.empty());
+   env[0] = "de_DE.UTF-8";
+   vec = APT::Configuration::getLanguages(true, false, env);
+   EXPECT_EQ(2, vec.size());
+   EXPECT_EQ("en", vec[0]);
+   EXPECT_EQ("de", vec[1]);
+
+   _config->Set("Acquire::Languages::1", "fr");
+   _config->Set("Acquire::Languages", "de_DE");
+   env[0] = "de_DE.UTF-8";
+   vec = APT::Configuration::getLanguages(false, false, env);
+   EXPECT_EQ(1, vec.size());
+   EXPECT_EQ("de_DE", vec[0]);
+
+   _config->Set("Acquire::Languages", "none");
+   env[0] = "de_DE.UTF-8";
+   vec = APT::Configuration::getLanguages(true, false, env);
+   EXPECT_EQ(1, vec.size());
+   EXPECT_EQ("none", vec[0]);
+
+   _config->Set("Acquire::Languages", "");
+   //FIXME: Remove support for this deprecated setting
+   _config->Set("APT::Acquire::Translation", "ast_DE");
+   env[0] = "de_DE.UTF-8";
+   vec = APT::Configuration::getLanguages(true, false, env);
+   EXPECT_EQ(2, vec.size());
+   EXPECT_EQ("ast_DE", vec[0]);
+   EXPECT_EQ("en", vec[1]);
+   _config->Set("APT::Acquire::Translation", "none");
+   env[0] = "de_DE.UTF-8";
+   vec = APT::Configuration::getLanguages(true, false, env);
+   EXPECT_EQ(1, vec.size());
+   EXPECT_EQ("en", vec[0]);
+
+
+   EXPECT_EQ(0, system(std::string("rm -rf ").append(tempdir).c_str()));
+   _config->Clear();
 }
 }
index df125fc83f01a6754a2660aa0fbb9344d38e35ce..2369c911a13ad0e58c37cc441c5603ce39bbce03 100644 (file)
 #include <vector>
 #include <iostream>
 
 #include <vector>
 #include <iostream>
 
-#include "assert.h"
+#include <gtest/gtest.h>
 
 
-#define P(x)   std::string(argv[1]).append("/").append(x)
+#include "file-helpers.h"
 
 
-int main(int argc,char *argv[])
+#define P(x)   std::string(tempdir).append("/").append(x)
+
+TEST(FileUtlTest,GetListOfFilesInDir)
 {
 {
-       if (argc != 2) {
-               std::cout << "One parameter expected - given " << argc << std::endl;
-               return 100;
-       }
-
-       // Files with no extension
-       std::vector<std::string> files = GetListOfFilesInDir(argv[1], "", true);
-       equals(files.size(), 2);
-       equals(files[0], P("01yet-anothernormalfile"));
-       equals(files[1], P("anormalfile"));
-
-       // Files with no extension - should be the same as above
-       files = GetListOfFilesInDir(argv[1], "", true, true);
-       equals(files.size(), 2);
-       equals(files[0], P("01yet-anothernormalfile"));
-       equals(files[1], P("anormalfile"));
-
-       // Files with impossible extension
-       files = GetListOfFilesInDir(argv[1], "impossible", true);
-       equals(files.size(), 0);
-
-       // Files with impossible or no extension
-       files = GetListOfFilesInDir(argv[1], "impossible", true, true);
-       equals(files.size(), 2);
-       equals(files[0], P("01yet-anothernormalfile"));
-       equals(files[1], P("anormalfile"));
-
-       // Files with list extension - nothing more
-       files = GetListOfFilesInDir(argv[1], "list", true);
-       equals(files.size(), 4);
-       equals(files[0], P("01yet-anotherapt.list"));
-       equals(files[1], P("anormalapt.list"));
-       equals(files[2], P("linkedfile.list"));
-       equals(files[3], P("multi.dot.list"));
-
-       // Files with conf or no extension
-       files = GetListOfFilesInDir(argv[1], "conf", true, true);
-       equals(files.size(), 5);
-       equals(files[0], P("01yet-anotherapt.conf"));
-       equals(files[1], P("01yet-anothernormalfile"));
-       equals(files[2], P("anormalapt.conf"));
-       equals(files[3], P("anormalfile"));
-       equals(files[4], P("multi.dot.conf"));
-
-       // Files with disabled extension - nothing more
-       files = GetListOfFilesInDir(argv[1], "disabled", true);
-       equals(files.size(), 3);
-       equals(files[0], P("disabledfile.conf.disabled"));
-       equals(files[1], P("disabledfile.disabled"));
-       equals(files[2], P("disabledfile.list.disabled"));
-
-       // Files with disabled or no extension
-       files = GetListOfFilesInDir(argv[1], "disabled", true, true);
-       equals(files.size(), 5);
-       equals(files[0], P("01yet-anothernormalfile"));
-       equals(files[1], P("anormalfile"));
-       equals(files[2], P("disabledfile.conf.disabled"));
-       equals(files[3], P("disabledfile.disabled"));
-       equals(files[4], P("disabledfile.list.disabled"));
-
-       return 0;
+   std::string tempdir;
+   createTemporaryDirectory("getlistoffiles", tempdir);
+
+   createFile(tempdir, "anormalfile");
+   createFile(tempdir, "01yet-anothernormalfile");
+   createFile(tempdir, "anormalapt.conf");
+   createFile(tempdir, "01yet-anotherapt.conf");
+   createFile(tempdir, "anormalapt.list");
+   createFile(tempdir, "01yet-anotherapt.list");
+   createFile(tempdir, "wrongextension.wron");
+   createFile(tempdir, "wrong-extension.wron");
+   createFile(tempdir, "strangefile.");
+   createFile(tempdir, "s.t.r.a.n.g.e.f.i.l.e");
+   createFile(tempdir, ".hiddenfile");
+   createFile(tempdir, ".hiddenfile.conf");
+   createFile(tempdir, ".hiddenfile.list");
+   createFile(tempdir, "multi..dot");
+   createFile(tempdir, "multi.dot.conf");
+   createFile(tempdir, "multi.dot.list");
+   createFile(tempdir, "disabledfile.disabled");
+   createFile(tempdir, "disabledfile.conf.disabled");
+   createFile(tempdir, "disabledfile.list.disabled");
+   createFile(tempdir, "invälid.conf");
+   createFile(tempdir, "invalíd");
+   createFile(tempdir, "01invalíd");
+   createDirectory(tempdir, "invaliddir");
+   createDirectory(tempdir, "directory.conf");
+   createDirectory(tempdir, "directory.list");
+   createDirectory(tempdir, "directory.wron");
+   createDirectory(tempdir, "directory.list.disabled");
+   createLink(tempdir, "anormalfile", "linkedfile.list");
+   createLink(tempdir, "invaliddir", "linkeddir.list");
+   createLink(tempdir, "non-existing-file", "brokenlink.list");
+
+   // Files with no extension
+   std::vector<std::string> files = GetListOfFilesInDir(tempdir, "", true);
+   ASSERT_EQ(2, files.size());
+   EXPECT_EQ(P("01yet-anothernormalfile"), files[0]);
+   EXPECT_EQ(P("anormalfile"), files[1]);
+
+   // Files with no extension - should be the same as above
+   files = GetListOfFilesInDir(tempdir, "", true, true);
+   ASSERT_EQ(2, files.size());
+   EXPECT_EQ(P("01yet-anothernormalfile"), files[0]);
+   EXPECT_EQ(P("anormalfile"), files[1]);
+
+   // Files with impossible extension
+   files = GetListOfFilesInDir(tempdir, "impossible", true);
+   EXPECT_TRUE(files.empty());
+
+   // Files with impossible or no extension
+   files = GetListOfFilesInDir(tempdir, "impossible", true, true);
+   ASSERT_EQ(2, files.size());
+   EXPECT_EQ(P("01yet-anothernormalfile"), files[0]);
+   EXPECT_EQ(P("anormalfile"), files[1]);
+
+   // Files with list extension - nothing more
+   files = GetListOfFilesInDir(tempdir, "list", true);
+   ASSERT_EQ(4, files.size());
+   EXPECT_EQ(P("01yet-anotherapt.list"), files[0]);
+   EXPECT_EQ(P("anormalapt.list"), files[1]);
+   EXPECT_EQ(P("linkedfile.list"), files[2]);
+   EXPECT_EQ(P("multi.dot.list"), files[3]);
+
+   // Files with conf or no extension
+   files = GetListOfFilesInDir(tempdir, "conf", true, true);
+   ASSERT_EQ(5, files.size());
+   EXPECT_EQ(P("01yet-anotherapt.conf"), files[0]);
+   EXPECT_EQ(P("01yet-anothernormalfile"), files[1]);
+   EXPECT_EQ(P("anormalapt.conf"), files[2]);
+   EXPECT_EQ(P("anormalfile"), files[3]);
+   EXPECT_EQ(P("multi.dot.conf"), files[4]);
+
+   // Files with disabled extension - nothing more
+   files = GetListOfFilesInDir(tempdir, "disabled", true);
+   ASSERT_EQ(3, files.size());
+   EXPECT_EQ(P("disabledfile.conf.disabled"), files[0]);
+   EXPECT_EQ(P("disabledfile.disabled"), files[1]);
+   EXPECT_EQ(P("disabledfile.list.disabled"), files[2]);
+
+   // Files with disabled or no extension
+   files = GetListOfFilesInDir(tempdir, "disabled", true, true);
+   ASSERT_EQ(5, files.size());
+   EXPECT_EQ(P("01yet-anothernormalfile"), files[0]);
+   EXPECT_EQ(P("anormalfile"), files[1]);
+   EXPECT_EQ(P("disabledfile.conf.disabled"), files[2]);
+   EXPECT_EQ(P("disabledfile.disabled"), files[3]);
+   EXPECT_EQ(P("disabledfile.list.disabled"), files[4]);
+
+   removeDirectory(tempdir);
 }
 }
index e913fdc12246a17a74031212bd3bdbaaf496f426..05b95db85727bfb3b07456267143580d0f49116d 100644 (file)
 #include <errno.h>
 #include <string.h>
 
 #include <errno.h>
 #include <string.h>
 
-#include "assert.h"
+#include <gtest/gtest.h>
 
 
-int main()
+TEST(GlobalErrorTest,BasicDiscard)
 {
 {
-       std::string const textOfErrnoZero(strerror(0));
+   GlobalError e;
+   EXPECT_TRUE(e.empty());
+   EXPECT_FALSE(e.PendingError());
+   EXPECT_FALSE(e.Notice("%s Notice", "A"));
+   EXPECT_TRUE(e.empty());
+   EXPECT_FALSE(e.empty(GlobalError::DEBUG));
+   EXPECT_FALSE(e.PendingError());
+   EXPECT_FALSE(e.Error("%s horrible %s %d times", "Something", "happened", 2));
+   EXPECT_TRUE(e.PendingError());
 
 
-       equals(_error->empty(), true);
-       equals(_error->PendingError(), false);
-       equals(_error->Notice("%s Notice", "A"), false);
-       equals(_error->empty(), true);
-       equals(_error->empty(GlobalError::DEBUG), false);
-       equals(_error->PendingError(), false);
-       equals(_error->Error("%s horrible %s %d times", "Something", "happened", 2), false);
-       equals(_error->PendingError(), true);
-       std::string text;
-       equals(_error->PopMessage(text), false);
-       equals(_error->PendingError(), true);
-       equals(text, "A Notice");
-       equals(_error->PopMessage(text), true);
-       equals(text, "Something horrible happened 2 times");
-       equals(_error->empty(GlobalError::DEBUG), true);
-       equals(_error->PendingError(), false);
-       equals(_error->Error("%s horrible %s %d times", "Something", "happened", 2), false);
-       equals(_error->PendingError(), true);
-       equals(_error->empty(GlobalError::FATAL), false);
-       _error->Discard();
+   std::string text;
+   EXPECT_FALSE(e.PopMessage(text));
+   EXPECT_TRUE(e.PendingError());
+   EXPECT_EQ("A Notice", text);
+   EXPECT_TRUE(e.PopMessage(text));
+   EXPECT_EQ("Something horrible happened 2 times", text);
+   EXPECT_TRUE(e.empty(GlobalError::DEBUG));
+   EXPECT_FALSE(e.PendingError());
+   EXPECT_FALSE(e.Error("%s horrible %s %d times", "Something", "happened", 2));
+   EXPECT_TRUE(e.PendingError());
+   EXPECT_FALSE(e.empty(GlobalError::FATAL));
+   e.Discard();
 
 
-       equals(_error->empty(), true);
-       equals(_error->PendingError(), false);
-       equals(_error->Notice("%s Notice", "A"), false);
-       equals(_error->Error("%s horrible %s %d times", "Something", "happened", 2), false);
-       equals(_error->PendingError(), true);
-       equals(_error->empty(GlobalError::NOTICE), false);
-       _error->PushToStack();
-       equals(_error->empty(GlobalError::NOTICE), true);
-       equals(_error->PendingError(), false);
-       equals(_error->Warning("%s Warning", "A"), false);
-       equals(_error->empty(GlobalError::ERROR), true);
-       equals(_error->PendingError(), false);
-       _error->RevertToStack();
-       equals(_error->empty(GlobalError::ERROR), false);
-       equals(_error->PendingError(), true);
-       equals(_error->PopMessage(text), false);
-       equals(_error->PendingError(), true);
-       equals(text, "A Notice");
-       equals(_error->PopMessage(text), true);
-       equals(text, "Something horrible happened 2 times");
-       equals(_error->PendingError(), false);
-       equals(_error->empty(), true);
-
-       equals(_error->Notice("%s Notice", "A"), false);
-       equals(_error->Error("%s horrible %s %d times", "Something", "happened", 2), false);
-       equals(_error->PendingError(), true);
-       equals(_error->empty(GlobalError::NOTICE), false);
-       _error->PushToStack();
-       equals(_error->empty(GlobalError::NOTICE), true);
-       equals(_error->PendingError(), false);
-       equals(_error->Warning("%s Warning", "A"), false);
-       equals(_error->empty(GlobalError::ERROR), true);
-       equals(_error->PendingError(), false);
-       _error->MergeWithStack();
-       equals(_error->empty(GlobalError::ERROR), false);
-       equals(_error->PendingError(), true);
-       equals(_error->PopMessage(text), false);
-       equals(_error->PendingError(), true);
-       equals(text, "A Notice");
-       equals(_error->PopMessage(text), true);
-       equals(text, "Something horrible happened 2 times");
-       equals(_error->PendingError(), false);
-       equals(_error->empty(), false);
-       equals(_error->PopMessage(text), false);
-       equals(text, "A Warning");
-       equals(_error->empty(), true);
-
-       errno = 0;
-       equals(_error->Errno("errno", "%s horrible %s %d times", "Something", "happened", 2), false);
-       equals(_error->empty(), false);
-       equals(_error->PendingError(), true);
-       equals(_error->PopMessage(text), true);
-       equals(_error->PendingError(), false);
-       equals(text, std::string("Something horrible happened 2 times - errno (0: ").append(textOfErrnoZero).append(")"));
-       equals(_error->empty(), true);
+   EXPECT_TRUE(e.empty());
+   EXPECT_FALSE(e.PendingError());
+}
+TEST(GlobalErrorTest,StackPushing)
+{
+   GlobalError e;
+   EXPECT_FALSE(e.Notice("%s Notice", "A"));
+   EXPECT_FALSE(e.Error("%s horrible %s %d times", "Something", "happened", 2));
+   EXPECT_TRUE(e.PendingError());
+   EXPECT_FALSE(e.empty(GlobalError::NOTICE));
+   e.PushToStack();
+   EXPECT_TRUE(e.empty(GlobalError::NOTICE));
+   EXPECT_FALSE(e.PendingError());
+   EXPECT_FALSE(e.Warning("%s Warning", "A"));
+   EXPECT_TRUE(e.empty(GlobalError::ERROR));
+   EXPECT_FALSE(e.PendingError());
+   e.RevertToStack();
+   EXPECT_FALSE(e.empty(GlobalError::ERROR));
+   EXPECT_TRUE(e.PendingError());
 
 
-       std::string longText;
-       for (size_t i = 0; i < 500; ++i)
-               longText.append("a");
-       equals(_error->Error("%s horrible %s %d times", longText.c_str(), "happened", 2), false);
-       equals(_error->PopMessage(text), true);
-       equals(text, std::string(longText).append(" horrible happened 2 times"));
+   std::string text;
+   EXPECT_FALSE(e.PopMessage(text));
+   EXPECT_TRUE(e.PendingError());
+   EXPECT_EQ("A Notice", text);
+   EXPECT_TRUE(e.PopMessage(text));
+   EXPECT_EQ("Something horrible happened 2 times", text);
+   EXPECT_FALSE(e.PendingError());
+   EXPECT_TRUE(e.empty());
 
 
-       equals(_error->Errno("errno", "%s horrible %s %d times", longText.c_str(), "happened", 2), false);
-       equals(_error->PopMessage(text), true);
-       equals(text, std::string(longText).append(" horrible happened 2 times - errno (0: ").append(textOfErrnoZero).append(")"));
+   EXPECT_FALSE(e.Notice("%s Notice", "A"));
+   EXPECT_FALSE(e.Error("%s horrible %s %d times", "Something", "happened", 2));
+   EXPECT_TRUE(e.PendingError());
+   EXPECT_FALSE(e.empty(GlobalError::NOTICE));
+   e.PushToStack();
+   EXPECT_TRUE(e.empty(GlobalError::NOTICE));
+   EXPECT_FALSE(e.PendingError());
+   EXPECT_FALSE(e.Warning("%s Warning", "A"));
+   EXPECT_TRUE(e.empty(GlobalError::ERROR));
+   EXPECT_FALSE(e.PendingError());
+   e.MergeWithStack();
+   EXPECT_FALSE(e.empty(GlobalError::ERROR));
+   EXPECT_TRUE(e.PendingError());
+   EXPECT_FALSE(e.PopMessage(text));
+   EXPECT_TRUE(e.PendingError());
+   EXPECT_EQ("A Notice", text);
+   EXPECT_TRUE(e.PopMessage(text));
+   EXPECT_EQ("Something horrible happened 2 times", text);
+   EXPECT_FALSE(e.PendingError());
+   EXPECT_FALSE(e.empty());
+   EXPECT_FALSE(e.PopMessage(text));
+   EXPECT_EQ("A Warning", text);
+   EXPECT_TRUE(e.empty());
+}
+TEST(GlobalErrorTest,Errno)
+{
+   GlobalError e;
+   std::string const textOfErrnoZero(strerror(0));
+   errno = 0;
+   EXPECT_FALSE(e.Errno("errno", "%s horrible %s %d times", "Something", "happened", 2));
+   EXPECT_FALSE(e.empty());
+   EXPECT_TRUE(e.PendingError());
+   std::string text;
+   EXPECT_TRUE(e.PopMessage(text));
+   EXPECT_FALSE(e.PendingError());
+   EXPECT_EQ(std::string("Something horrible happened 2 times - errno (0: ").append(textOfErrnoZero).append(")"), text);
+   EXPECT_TRUE(e.empty());
+}
+TEST(GlobalErrorTest,LongMessage)
+{
+   GlobalError e;
+   std::string const textOfErrnoZero(strerror(0));
+   errno = 0;
+   std::string text, longText;
+   for (size_t i = 0; i < 500; ++i)
+      longText.append("a");
+   EXPECT_FALSE(e.Error("%s horrible %s %d times", longText.c_str(), "happened", 2));
+   EXPECT_TRUE(e.PopMessage(text));
+   EXPECT_EQ(std::string(longText).append(" horrible happened 2 times"), text);
 
 
-       equals(_error->Warning("Репозиторий не обновлён и будут %d %s", 4, "test"), false);
-       equals(_error->PopMessage(text), false);
-       equals(text, "Репозиторий не обновлён и будут 4 test");
+   EXPECT_FALSE(e.Errno("errno", "%s horrible %s %d times", longText.c_str(), "happened", 2));
+   EXPECT_TRUE(e.PopMessage(text));
+   EXPECT_EQ(std::string(longText).append(" horrible happened 2 times - errno (0: ").append(textOfErrnoZero).append(")"), text);
+}
+TEST(GlobalErrorTest,UTF8Message)
+{
+   GlobalError e;
+   std::string text;
 
 
-       longText.clear();
-       for (size_t i = 0; i < 50; ++i)
-               longText.append("РезийбёбAZ");
-       equals(_error->Warning("%s", longText.c_str()), false);
-       equals(_error->PopMessage(text), false);
-       equals(text, longText);
+   EXPECT_FALSE(e.Warning("Репозиторий не обновлён и будут %d %s", 4, "test"));
+   EXPECT_FALSE(e.PopMessage(text));
+   EXPECT_EQ("Репозиторий не обновлён и будут 4 test", text);
 
 
-       return 0;
+   std::string longText;
+   for (size_t i = 0; i < 50; ++i)
+      longText.append("РезийбёбAZ");
+   EXPECT_FALSE(e.Warning("%s", longText.c_str()));
+   EXPECT_FALSE(e.PopMessage(text));
+   EXPECT_EQ(longText, text);
 }
 }
diff --git a/test/libapt/gtest_runner.cc b/test/libapt/gtest_runner.cc
new file mode 100644 (file)
index 0000000..5823c55
--- /dev/null
@@ -0,0 +1,19 @@
+#include <gtest/gtest.h>
+#include <apt-pkg/error.h>
+int main(int argc, char **argv) {
+   ::testing::InitGoogleTest(&argc, argv);
+   int result = RUN_ALL_TESTS();
+   if (_error->empty() == false)
+   {
+      std::cerr << "The test generated the following global messages:" << std::endl;
+      _error->DumpErrors(std::cerr);
+      // messages on the stack can't be right, error out
+      // even if we have no idea where this message came from
+      if (result == 0)
+      {
+        std::cerr << "All tests successful, but messages were generated, so still a failure!" << std::endl;
+        return 29;
+      }
+   }
+   return result;
+}
index d743faec6c453db6563a1e81c4e8650ad7ddfb18..c06d85e037a8d4191ab1b5eb29aa3781456e926c 100644 (file)
@@ -11,7 +11,9 @@
 #include <stdlib.h>
 #include <string>
 
 #include <stdlib.h>
 #include <string>
 
-#include "assert.h"
+#include <gtest/gtest.h>
+
+#include "file-helpers.h"
 
 template <class T> void Test(const char *In,const char *Out)
 {
 
 template <class T> void Test(const char *In,const char *Out)
 {
@@ -20,167 +22,201 @@ template <class T> void Test(const char *In,const char *Out)
    equals(Sum.Result().Value(), Out);
 }
 
    equals(Sum.Result().Value(), Out);
 }
 
-template <class T> void TestMill(const char *Out)
+
+
+TEST(HashSumsTest,SummationStrings)
 {
 {
-   T Sum;
+#define EXPECT_SUM(Summation, In, Out) \
+   { \
+      Summation Sum; \
+      Sum.Add(In); \
+      EXPECT_EQ(Sum.Result().Value(), Out) << #Summation << " for '" << In << "'"; \
+   }
+
+   // From  FIPS PUB 180-1
+   EXPECT_SUM(SHA1Summation, "","da39a3ee5e6b4b0d3255bfef95601890afd80709");
+   EXPECT_SUM(SHA1Summation, "abc","a9993e364706816aba3e25717850c26c9cd0d89d");
+   EXPECT_SUM(SHA1Summation, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+        "84983e441c3bd26ebaae4aa1f95129e5e54670f1");
+
+   // MD5 tests from RFC 1321
+   EXPECT_SUM(MD5Summation, "","d41d8cd98f00b204e9800998ecf8427e");
+   EXPECT_SUM(MD5Summation, "a","0cc175b9c0f1b6a831c399e269772661");
+   EXPECT_SUM(MD5Summation, "abc","900150983cd24fb0d6963f7d28e17f72");
+   EXPECT_SUM(MD5Summation, "message digest","f96b697d7cb7938d525a2f31aaf161d0");
+   EXPECT_SUM(MD5Summation, "abcdefghijklmnopqrstuvwxyz","c3fcd3d76192e4007dfb496cca67e13b");
+   EXPECT_SUM(MD5Summation, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+        "d174ab98d277d9f5a5611c2c9f419d9f");
+   EXPECT_SUM(MD5Summation, "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
+        "57edf4a22be3c955ac49da2e2107b67a");
 
 
-   const unsigned char As[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
-   unsigned Count = 1000000;
-   for (; Count != 0;)
+   // SHA-256, From FIPS 180-2
+   EXPECT_SUM(SHA256Summation, "", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
+   EXPECT_SUM(SHA256Summation, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+        "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1");
+
+   // SHA-512
+   EXPECT_SUM(SHA512Summation, "",
+        "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce"
+        "47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e");
+   EXPECT_SUM(SHA512Summation, "abc",
+        "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a"
+        "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f");
+
+
+   EXPECT_SUM(MD5Summation, "The quick brown fox jumps over the lazy dog", "9e107d9d372bb6826bd81d3542a419d6");
+   EXPECT_SUM(MD5Summation, "The quick brown fox jumps over the lazy dog.", "e4d909c290d0fb1ca068ffaddf22cbd0");
+   EXPECT_SUM(SHA1Summation, "The quick brown fox jumps over the lazy dog", "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12");
+   EXPECT_SUM(SHA1Summation, "The quick brown fox jumps over the lazy cog", "de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3");
+   EXPECT_SUM(SHA256Summation, "The quick brown fox jumps over the lazy dog", "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592");
+   EXPECT_SUM(SHA256Summation, "The quick brown fox jumps over the lazy dog.", "ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c");
+   EXPECT_SUM(SHA512Summation, "The quick brown fox jumps over the lazy dog", "07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb64"
+        "2e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6");
+   EXPECT_SUM(SHA512Summation, "The quick brown fox jumps over the lazy dog.", "91ea1245f20d46ae9a037a989f54f1f790f0a47607eeb8a14d12890cea77a1bb"
+        "c6c7ed9cf205e67b7f2b8fd4c7dfd3a7a8617e45f3c463d481c7e586c39ac1ed");
+
+#undef EXPECT_SUM
+}
+TEST(HashSumsTest, Mill)
+{
+   SHA1Summation Sum1;
+
+   const unsigned char As[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+   size_t const AsCount = sizeof(As)/sizeof(As[0]) - 1;
+   size_t Count = 1000000;
+   while (Count != 0)
    {
    {
-      if (Count >= 64)
+      if (Count >= AsCount)
       {
       {
-        Sum.Add(As,64);
-        Count -= 64;
+        Sum1.Add(As, AsCount);
+        Count -= AsCount;
       }
       else
       {
       }
       else
       {
-        Sum.Add(As,Count);
+        Sum1.Add(As,Count);
         Count = 0;
       }
    }
 
         Count = 0;
       }
    }
 
-   if (stringcasecmp(Sum.Result().Value(), Out) != 0)
-      abort();
+   EXPECT_EQ("34aa973cd4c4daa4f61eeb2bdbad27316534016f", Sum1.Result().Value());
 }
 
 }
 
-int main(int argc, char** argv)
+static void getSummationString(char const * const type, std::string &sum)
 {
 {
-   if (argc != 6) {
-      std::cout << "Five parameter expected - given " << argc << std::endl;
-      return 100;
-   }
+   /* to compare our result with an independent source we call the specific binaries
+      and read their result back. We do this with a little trick by claiming that the
+      summation is a compressor – and open the 'compressed' file later on directly to
+      read out the summation sum calculated by it */
+   APT::Configuration::Compressor compress(type, ".ext", type, NULL, NULL, 99);
+   std::string name("apt-test-");
+   name.append("hashsums").append(".XXXXXX");
+   char * tempfile = strdup(name.c_str());
+   int tempfile_fd = mkstemp(tempfile);
+   close(tempfile_fd);
+   ASSERT_NE(-1, tempfile_fd);
+
+   FileFd fd;
+   ASSERT_TRUE(fd.Open(tempfile, FileFd::WriteOnly | FileFd::Empty, compress));
+   ASSERT_TRUE(fd.IsOpen());
+   FileFd input(__FILE__, FileFd::ReadOnly);
+   ASSERT_TRUE(input.IsOpen());
+   ASSERT_NE(0, input.FileSize());
+   ASSERT_TRUE(CopyFile(input, fd));
+   ASSERT_TRUE(input.IsOpen());
+   ASSERT_TRUE(fd.IsOpen());
+   ASSERT_FALSE(fd.Failed());
+   input.Close();
+   fd.Close();
+   ASSERT_TRUE(fd.Open(tempfile, FileFd::ReadOnly, FileFd::None));
+   ASSERT_TRUE(fd.IsOpen());
+   ASSERT_NE(0, fd.FileSize());
+   ASSERT_FALSE(fd.Failed());
+   unlink(tempfile);
+   free(tempfile);
+   char readback[2000];
+   unsigned long long actual;
+   ASSERT_TRUE(fd.Read(readback, sizeof(readback)/sizeof(readback[0]), &actual));
+   actual -= 4;
+   readback[actual] = '\0';
+   sum = readback;
+}
+TEST(HashSumsTest, FileBased)
+{
+   std::string summation;
 
 
-   // test HashSumValue which doesn't calculate but just stores sums
-   {
-   std::string md5sum = argv[2];
-   MD5SumValue md5(md5sum);
-   equals(md5.Value(), md5sum);
-   }
-   {
-   std::string sha1sum = argv[3];
-   SHA1SumValue sha1(sha1sum);
-   equals(sha1.Value(), sha1sum);
-   }
-   {
-   std::string sha2sum = argv[4];
-   SHA256SumValue sha2(sha2sum);
-   equals(sha2.Value(), sha2sum);
-   }
-   {
-   std::string sha2sum = argv[5];
-   SHA512SumValue sha2(sha2sum);
-   equals(sha2.Value(), sha2sum);
-   }
+   getSummationString("md5sum", summation);
+   MD5SumValue md5(summation);
+   EXPECT_EQ(md5.Value(), summation);
 
 
-   // From  FIPS PUB 180-1
-   Test<SHA1Summation>("","da39a3ee5e6b4b0d3255bfef95601890afd80709");
-   Test<SHA1Summation>("abc","a9993e364706816aba3e25717850c26c9cd0d89d");
-   Test<SHA1Summation>("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-                      "84983e441c3bd26ebaae4aa1f95129e5e54670f1");
-   TestMill<SHA1Summation>("34aa973cd4c4daa4f61eeb2bdbad27316534016f");
+   getSummationString("sha1sum", summation);
+   SHA1SumValue sha1(summation);
+   EXPECT_EQ(sha1.Value(), summation);
 
 
-   // MD5 tests from RFC 1321
-   Test<MD5Summation>("","d41d8cd98f00b204e9800998ecf8427e");
-   Test<MD5Summation>("a","0cc175b9c0f1b6a831c399e269772661");
-   Test<MD5Summation>("abc","900150983cd24fb0d6963f7d28e17f72");
-   Test<MD5Summation>("message digest","f96b697d7cb7938d525a2f31aaf161d0");
-   Test<MD5Summation>("abcdefghijklmnopqrstuvwxyz","c3fcd3d76192e4007dfb496cca67e13b");
-   Test<MD5Summation>("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
-                     "d174ab98d277d9f5a5611c2c9f419d9f");
-   Test<MD5Summation>("12345678901234567890123456789012345678901234567890123456789012345678901234567890",
-                     "57edf4a22be3c955ac49da2e2107b67a");
+   getSummationString("sha256sum", summation);
+   SHA256SumValue sha256(summation);
+   EXPECT_EQ(sha256.Value(), summation);
 
 
-   // SHA-256, From FIPS 180-2
-   Test<SHA256Summation>("", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
-   Test<SHA256Summation>("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-                        "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1");
+   getSummationString("sha512sum", summation);
+   SHA512SumValue sha512(summation);
+   EXPECT_EQ(sha512.Value(), summation);
+
+   FileFd fd(__FILE__, FileFd::ReadOnly);
+   EXPECT_TRUE(fd.IsOpen());
 
 
-   // SHA-512
-   Test<SHA512Summation>("",
-       "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce"
-       "47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e");
-   Test<SHA512Summation>(
-      "abc",
-      "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a"
-      "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f");
-
-
-   Test<MD5Summation>("The quick brown fox jumps over the lazy dog", "9e107d9d372bb6826bd81d3542a419d6");
-   Test<MD5Summation>("The quick brown fox jumps over the lazy dog.", "e4d909c290d0fb1ca068ffaddf22cbd0");
-   Test<SHA1Summation>("The quick brown fox jumps over the lazy dog", "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12");
-   Test<SHA1Summation>("The quick brown fox jumps over the lazy cog", "de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3");
-   Test<SHA256Summation>("The quick brown fox jumps over the lazy dog", "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592");
-   Test<SHA256Summation>("The quick brown fox jumps over the lazy dog.", "ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c");
-   Test<SHA512Summation>("The quick brown fox jumps over the lazy dog", "07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb64"
-                                                                       "2e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6");
-   Test<SHA512Summation>("The quick brown fox jumps over the lazy dog.", "91ea1245f20d46ae9a037a989f54f1f790f0a47607eeb8a14d12890cea77a1bb"
-                                                                        "c6c7ed9cf205e67b7f2b8fd4c7dfd3a7a8617e45f3c463d481c7e586c39ac1ed");
-
-   FileFd fd(argv[1], FileFd::ReadOnly);
-   if (fd.IsOpen() == false) {
-      std::cerr << "Can't open file for 1. testing: " << argv[1] << std::endl;
-      return 1;
-   }
    {
    {
-   Hashes hashes;
-   hashes.AddFD(fd.Fd());
-   equals(argv[2], hashes.MD5.Result().Value());
-   equals(argv[3], hashes.SHA1.Result().Value());
-   equals(argv[4], hashes.SHA256.Result().Value());
-   equals(argv[5], hashes.SHA512.Result().Value());
+      Hashes hashes;
+      hashes.AddFD(fd.Fd());
+      EXPECT_EQ(md5.Value(), hashes.MD5.Result().Value());
+      EXPECT_EQ(sha1.Value(), hashes.SHA1.Result().Value());
+      EXPECT_EQ(sha256.Value(), hashes.SHA256.Result().Value());
+      EXPECT_EQ(sha512.Value(), hashes.SHA512.Result().Value());
    }
    unsigned long sz = fd.FileSize();
    fd.Seek(0);
    {
    }
    unsigned long sz = fd.FileSize();
    fd.Seek(0);
    {
-   Hashes hashes;
-   hashes.AddFD(fd.Fd(), sz);
-   equals(argv[2], hashes.MD5.Result().Value());
-   equals(argv[3], hashes.SHA1.Result().Value());
-   equals(argv[4], hashes.SHA256.Result().Value());
-   equals(argv[5], hashes.SHA512.Result().Value());
+      Hashes hashes;
+      hashes.AddFD(fd.Fd(), sz);
+      EXPECT_EQ(md5.Value(), hashes.MD5.Result().Value());
+      EXPECT_EQ(sha1.Value(), hashes.SHA1.Result().Value());
+      EXPECT_EQ(sha256.Value(), hashes.SHA256.Result().Value());
+      EXPECT_EQ(sha512.Value(), hashes.SHA512.Result().Value());
    }
    fd.Seek(0);
    {
    }
    fd.Seek(0);
    {
-   MD5Summation md5;
-   md5.AddFD(fd.Fd());
-   equals(argv[2], md5.Result().Value());
+      MD5Summation MD5;
+      MD5.AddFD(fd.Fd());
+      EXPECT_EQ(md5.Value(), MD5.Result().Value());
    }
    fd.Seek(0);
    {
    }
    fd.Seek(0);
    {
-   SHA1Summation sha1;
-   sha1.AddFD(fd.Fd());
-   equals(argv[3], sha1.Result().Value());
+      SHA1Summation SHA1;
+      SHA1.AddFD(fd.Fd());
+      EXPECT_EQ(sha1.Value(), SHA1.Result().Value());
    }
    fd.Seek(0);
    {
    }
    fd.Seek(0);
    {
-   SHA256Summation sha2;
-   sha2.AddFD(fd.Fd());
-   equals(argv[4], sha2.Result().Value());
+      SHA256Summation SHA2;
+      SHA2.AddFD(fd.Fd());
+      EXPECT_EQ(sha256.Value(), SHA2.Result().Value());
    }
    fd.Seek(0);
    {
    }
    fd.Seek(0);
    {
-   SHA512Summation sha2;
-   sha2.AddFD(fd.Fd());
-   equals(argv[5], sha2.Result().Value());
+      SHA512Summation SHA2;
+      SHA2.AddFD(fd.Fd());
+      EXPECT_EQ(sha512.Value(), SHA2.Result().Value());
    }
    fd.Close();
 
    }
    fd.Close();
 
-   // test HashString code
    {
    {
-   HashString sha2("SHA256", argv[4]);
-   equals(sha2.VerifyFile(argv[1]), true);
+      HashString sha2("SHA256", sha256.Value());
+      EXPECT_TRUE(sha2.VerifyFile(__FILE__));
    }
    {
    }
    {
-   HashString sha2("SHA512", argv[5]);
-   equals(sha2.VerifyFile(argv[1]), true);
+      HashString sha2("SHA512", sha512.Value());
+      EXPECT_TRUE(sha2.VerifyFile(__FILE__));
    }
    {
    }
    {
-   HashString sha2("SHA256:" + std::string(argv[4]));
-   equals(sha2.VerifyFile(argv[1]), true);
+      HashString sha2("SHA256:" + sha256.Value());
+      EXPECT_TRUE(sha2.VerifyFile(__FILE__));
    }
    }
-
-   return 0;
 }
 }
-
-
index e04ab261b863b1db97bd7dda7f30e92999b53b3e..bec87601fee8e5a96de9239407ee99354d626449 100644 (file)
@@ -7,30 +7,35 @@
 #include <string>
 #include <stdio.h>
 
 #include <string>
 #include <stdio.h>
 
-#include "assert.h"
+#include <gtest/gtest.h>
 
 class NoCopy : public IndexCopy {
 
 class NoCopy : public IndexCopy {
-public:
-   std::string ConvertToSourceList(std::string CD,std::string Path) {
-      IndexCopy::ConvertToSourceList(CD, Path);
-      return Path;
-   }
-   bool GetFile(std::string &/*Filename*/, unsigned long long &/*Size*/) { return false; }
-   bool RewriteEntry(FILE * /*Target*/, std::string /*File*/) { return false; }
-   const char *GetFileName() { return NULL; }
-   const char *Type() { return NULL; }
+   public:
+      std::string ConvertToSourceList(std::string CD,std::string Path) {
+        IndexCopy::ConvertToSourceList(CD, Path);
+        return Path;
+      }
+      bool GetFile(std::string &/*Filename*/, unsigned long long &/*Size*/) { return false; }
+      bool RewriteEntry(FILE * /*Target*/, std::string /*File*/) { return false; }
+      const char *GetFileName() { return NULL; }
+      const char *Type() { return NULL; }
 
 };
 
 
 };
 
-int main() {
+TEST(IndexCopyTest, ConvertToSourceList)
+{
    NoCopy ic;
    std::string const CD("/media/cdrom/");
 
    char const * Releases[] = { "unstable", "wheezy-updates", NULL };
    char const * Components[] = { "main", "non-free", NULL };
 
    NoCopy ic;
    std::string const CD("/media/cdrom/");
 
    char const * Releases[] = { "unstable", "wheezy-updates", NULL };
    char const * Components[] = { "main", "non-free", NULL };
 
-   for (char const ** Release = Releases; *Release != NULL; ++Release) {
-      for (char const ** Component = Components; *Component != NULL; ++Component) {
+   for (char const ** Release = Releases; *Release != NULL; ++Release)
+   {
+      SCOPED_TRACE(std::string("Release ") + *Release);
+      for (char const ** Component = Components; *Component != NULL; ++Component)
+      {
+        SCOPED_TRACE(std::string("Component ") + *Component);
         std::string const Path = std::string("dists/") + *Release + "/" + *Component + "/";
         std::string const Binary = Path + "binary-";
         std::string const A = Binary + "armel/";
         std::string const Path = std::string("dists/") + *Release + "/" + *Component + "/";
         std::string const Binary = Path + "binary-";
         std::string const A = Binary + "armel/";
@@ -41,49 +46,47 @@ int main() {
 
         _config->Clear("APT");
         APT::Configuration::getArchitectures(false);
 
         _config->Clear("APT");
         APT::Configuration::getArchitectures(false);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + A), A);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + B), B);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + C), C);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + S), List);
+        EXPECT_EQ(A, ic.ConvertToSourceList("/media/cdrom/", CD + A));
+        EXPECT_EQ(B, ic.ConvertToSourceList("/media/cdrom/", CD + B));
+        EXPECT_EQ(C, ic.ConvertToSourceList("/media/cdrom/", CD + C));
+        EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + S));
 
         _config->Clear("APT");
         _config->Set("APT::Architecture", "mips");
         _config->Set("APT::Architectures::", "mips");
         APT::Configuration::getArchitectures(false);
 
         _config->Clear("APT");
         _config->Set("APT::Architecture", "mips");
         _config->Set("APT::Architectures::", "mips");
         APT::Configuration::getArchitectures(false);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + A), A);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + B), List);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + C), C);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + S), List);
+        EXPECT_EQ(A, ic.ConvertToSourceList("/media/cdrom/", CD + A));
+        EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + B));
+        EXPECT_EQ(C, ic.ConvertToSourceList("/media/cdrom/", CD + C));
+        EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + S));
 
         _config->Clear("APT");
         _config->Set("APT::Architecture", "kfreebsd-mips");
         _config->Set("APT::Architectures::", "kfreebsd-mips");
         APT::Configuration::getArchitectures(false);
 
         _config->Clear("APT");
         _config->Set("APT::Architecture", "kfreebsd-mips");
         _config->Set("APT::Architectures::", "kfreebsd-mips");
         APT::Configuration::getArchitectures(false);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + A), A);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + B), B);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + C), List);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + S), List);
+        EXPECT_EQ(A, ic.ConvertToSourceList("/media/cdrom/", CD + A));
+        EXPECT_EQ(B, ic.ConvertToSourceList("/media/cdrom/", CD + B));
+        EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + C));
+        EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + S));
 
         _config->Clear("APT");
         _config->Set("APT::Architecture", "armel");
         _config->Set("APT::Architectures::", "armel");
         APT::Configuration::getArchitectures(false);
 
         _config->Clear("APT");
         _config->Set("APT::Architecture", "armel");
         _config->Set("APT::Architectures::", "armel");
         APT::Configuration::getArchitectures(false);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + A), List);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + B), B);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + C), C);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + S), List);
+        EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + A));
+        EXPECT_EQ(B, ic.ConvertToSourceList("/media/cdrom/", CD + B));
+        EXPECT_EQ(C, ic.ConvertToSourceList("/media/cdrom/", CD + C));
+        EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + S));
 
         _config->Clear("APT");
         _config->Set("APT::Architecture", "armel");
         _config->Set("APT::Architectures::", "armel");
         _config->Set("APT::Architectures::", "mips");
         APT::Configuration::getArchitectures(false);
 
         _config->Clear("APT");
         _config->Set("APT::Architecture", "armel");
         _config->Set("APT::Architectures::", "armel");
         _config->Set("APT::Architectures::", "mips");
         APT::Configuration::getArchitectures(false);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + A), List);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + B), List);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + C), C);
-        equals(ic.ConvertToSourceList("/media/cdrom/", CD + S), List);
+        EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + A));
+        EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + B));
+        EXPECT_EQ(C, ic.ConvertToSourceList("/media/cdrom/", CD + C));
+        EXPECT_EQ(List, ic.ConvertToSourceList("/media/cdrom/", CD + S));
       }
    }
       }
    }
-
-   return 0;
 }
 }
index be1a3411e5b4d8f32a573e13f1852476404e5063..a70fc9261b8f30ee97a8cb21a1621125b55ab1f6 100644 (file)
@@ -4,27 +4,17 @@
 
 #include <string>
 
 
 #include <string>
 
-#include "assert.h"
+#include <gtest/gtest.h>
 
 
-int main() {
+TEST(InstallProgressTest, FancyGetTextProgressStr)
+{
    APT::Progress::PackageManagerFancy p;
    APT::Progress::PackageManagerFancy p;
-   std::string s;   
 
 
-   s= p.GetTextProgressStr(0.5, 60);
-   equals(s.size(), 60);
-   
-   s= p.GetTextProgressStr(0.5, 4);
-   equals(s, "[#.]");
-
-   s= p.GetTextProgressStr(0.1, 12);
-   equals(s, "[#.........]");
-   
-   s= p.GetTextProgressStr(0.9, 12);
-   equals(s, "[#########.]");
+   EXPECT_EQ(60, p.GetTextProgressStr(0.5, 60).size());
+   EXPECT_EQ("[#.]", p.GetTextProgressStr(0.5, 4));
+   EXPECT_EQ("[#.........]", p.GetTextProgressStr(0.1, 12));
+   EXPECT_EQ("[#########.]", p.GetTextProgressStr(0.9, 12));
 
    // deal with incorrect inputs gracefully (or should we die instead?)
 
    // deal with incorrect inputs gracefully (or should we die instead?)
-   s= p.GetTextProgressStr(-999, 12);
-   equals(s, "");
-
-   return 0;
+   EXPECT_EQ("", p.GetTextProgressStr(-999, 12));
 }
 }
index e03b5e6aa7a7879251fbd566c8a1a4741dae650e..69a13fd92ea183b6dd3b2622d7ef437a173462cd 100644 (file)
@@ -8,124 +8,66 @@ APT_DOMAIN=none
 include ../../buildlib/defaults.mak
 
 .PHONY: test
 include ../../buildlib/defaults.mak
 
 .PHONY: test
-test:
-       ./run-tests
-
-# Program for testing getLanguageCode
-PROGRAM = getLanguages${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = getlanguages_test.cc
-include $(PROGRAM_H)
-
-PROGRAM = getArchitectures${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = getarchitectures_test.cc
-include $(PROGRAM_H)
-
-# Program for testing ParseDepends
-PROGRAM = ParseDepends${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = parsedepends_test.cc
-include $(PROGRAM_H)
-
-# Program for testing GetListOfFilesInDir
-PROGRAM = GetListOfFilesInDir${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = getlistoffilesindir_test.cc
-include $(PROGRAM_H)
-
-# Program for testing CommandLine reconstruction
-PROGRAM = Commandline${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = commandline_test.cc
-include $(PROGRAM_H)
-
-# Program for testing CommandLine reconstruction
-PROGRAM = CommandlineAsString${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = commandlineasstring_test.cc
-include $(PROGRAM_H)
-
-# Program for testing debians version comparing
-PROGRAM = CompareVersion${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = compareversion_test.cc
-include $(PROGRAM_H)
-
-# test the GlobalError stack class
-PROGRAM = GlobalError${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = globalerror_test.cc
-include $(PROGRAM_H)
-
-# test the different Hashsum classes
-PROGRAM = HashSums${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = hashsums_test.cc
-include $(PROGRAM_H)
-
-# test the strutils stuff
-PROGRAM = StrUtil${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = strutil_test.cc
-include $(PROGRAM_H)
-
-# test the URI parsing stuff
-PROGRAM = URI${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = uri_test.cc
-include $(PROGRAM_H)
-
-# test the Configuration class
-PROGRAM = Configuration${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = configuration_test.cc
-include $(PROGRAM_H)
-
-# test cdroms core FindPackages
-PROGRAM = CdromFindPackages${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = cdromfindpackages_test.cc
-include $(PROGRAM_H)
-
-# test cdroms index reduction for source.list
-PROGRAM = CdromReduceSourceList${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = cdromreducesourcelist_test.cc
-include $(PROGRAM_H)
-
-# test cdroms FindMountPointForDevice for udev autodetection
-PROGRAM = CdromFindMountPointForDevice${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = cdromfindmountpointfordevice_test.cc
-include $(PROGRAM_H)
-
-# test IndexCopy::ConvertToSourceList
-PROGRAM = IndexCopyToSourceList${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = indexcopytosourcelist_test.cc
-
-# test fileutls
-PROGRAM = FileUtl${BASENAME}
-SLIBS = -lapt-pkg 
-SOURCE = fileutl_test.cc
-include $(PROGRAM_H)
-
-# test tagfile
-PROGRAM = PkgTagFile${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = tagfile_test.cc
-include $(PROGRAM_H)
-
-# test sourcelist
-PROGRAM = SourceList${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = sourcelist_test.cc
-include $(PROGRAM_H)
-
-# test install-progress
-PROGRAM = InstallProgress${BASENAME}
-SLIBS = -lapt-pkg
-SOURCE = install_progress_test.cc
-include $(PROGRAM_H)
-
+test: $(BIN)/gtest$(BASENAME)
+       MALLOC_PERTURB_=21 MALLOC_CHECK_=2 LD_LIBRARY_PATH=$(LIB) $(BIN)/gtest$(BASENAME)
+
+$(BIN)/gtest$(BASENAME): $(LIB)/gtest.a
+
+PROGRAM = gtest${BASENAME}
+SLIBS = -lapt-pkg -pthread $(LIB)/gtest.a
+LIB_MAKES = apt-pkg/makefile
+SOURCE = gtest_runner.cc $(wildcard *-helpers.cc *_test.cc)
+include $(PROGRAM_H)
+
+
+MKDIRS += $(OBJ) $(LIB)
+LOCAL=gtest
+SOURCE=gtest-all
+gtest-OBJS := $(addprefix $(OBJ)/,$(addsuffix .o,$(SOURCE)))
+
+# The rest of the file is based on the example found in
+# /usr/share/doc/libgtest-dev/examples/make/Makefile
+GTEST_DIR = /usr/src/gtest
+
+# Flags passed to the preprocessor.
+# Set Google Test's header directory as a system directory, such that
+# the compiler doesn't generate warnings in Google Test headers.
+CPPFLAGS += -isystem $(GTEST_DIR)/include
+
+# Flags passed to the C++ compiler.
+CXXFLAGS += -pthread
+# disable some flags for gtest again
+CXXFLAGS+= -Wno-missing-declarations
+CXXFLAGS+= -Wno-missing-field-initializers
+CXXFLAGS+= -Wno-suggest-attribute=pure -Wno-suggest-attribute=const -Wno-suggest-attribute=noreturn
+
+# All Google Test headers.  Usually you shouldn't change this definition.
+GTEST_HEADERS = /usr/include/gtest/*.h \
+                /usr/include/gtest/internal/*.h
+
+# House-keeping build targets.
+.PHONY: clean/gtest veryclean/gtest
+clean: clean/gtest
+clean/gtest:
+       rm -f $(gtest-OBJS)
+veryclean: veryclean/gtest
+veryclean/gtest: clean/gtest
+       rm -f $(LIB)/gtest.a
+
+# Usually you shouldn't tweak such internal variables, indicated by a
+# trailing _.
+GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)
+
+# Builds gtest.a
+# For simplicity and to avoid depending on Google Test's
+# implementation details, the dependencies specified below are
+# conservative and not optimized.  This is fine as Google Test
+# compiles fast and for ordinary users its source rarely changes.
+$(gtest-OBJS): $(GTEST_SRCS_)
+       echo Compiling $@
+       $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c -o $@ $(GTEST_DIR)/src/$(notdir $(basename $@)).cc
+
+$(LIB)/gtest.a: $(OBJ)/gtest-all.o
+       echo Building static library $@
+       -rm -f $@
+       $(AR) $(ARFLAGS) $@ $^
index 5564e2bc099dbcc04157f7be1026648f4e4d88b9..1e0afb66c0662a42a4261badc09a0fa4d7d1311f 100644 (file)
 #include <string.h>
 #include <string>
 
 #include <string.h>
 #include <string>
 
-#include "assert.h"
-
-int main() {
-       std::string Package;
-       std::string Version;
-       unsigned int Op = 5;
-       unsigned int Null = 0;
-       bool StripMultiArch = true;
-       bool ParseArchFlags = false;
-       bool ParseRestrictionsList = false;
-       _config->Set("APT::Architecture","amd64");
-       _config->Set("APT::Build-Profiles","stage1");
-
-       const char* Depends =
-               "debhelper:any (>= 5.0), "
-               "libdb-dev:any, "
-               "gettext:native (<= 0.12), "
-               "libcurl4-gnutls-dev:native | libcurl3-gnutls-dev (>> 7.15.5), "
-               "debiandoc-sgml, "
-               "apt (>= 0.7.25), "
-               "not-for-me [ !amd64 ], "
-               "only-for-me [ amd64 ], "
-               "any-for-me [ any ], "
-               "not-for-darwin [ !darwin-any ], "
-               "cpu-for-me [ any-amd64 ], "
-               "os-for-me [ linux-any ], "
-               "cpu-not-for-me [ any-armel ], "
-               "os-not-for-me [ kfreebsd-any ], "
-               "not-in-stage1 <!profile.stage1>, "
-               "not-in-stage1-or-nodoc <!profile.nodoc !profile.stage1>, "
-               "only-in-stage1 <unknown.unknown profile.stage1>, "
-               "overlord-dev:any (= 7.15.3~) | overlord-dev:native (>> 7.15.5), "
-       ;
-
-       unsigned short runner = 0;
+#include <gtest/gtest.h>
+
+static void parseDependency(bool const StripMultiArch,  bool const ParseArchFlags, bool const ParseRestrictionsList)
+{
+   std::string Package;
+   std::string Version;
+   unsigned int Op = 5;
+   unsigned int Null = 0;
+   _config->Set("APT::Architecture","amd64");
+   _config->Set("APT::Build-Profiles","stage1");
+
+   const char* Depends =
+      "debhelper:any (>= 5.0), "
+      "libdb-dev:any, "
+      "gettext:native (<= 0.12), "
+      "libcurl4-gnutls-dev:native | libcurl3-gnutls-dev (>> 7.15.5), "
+      "debiandoc-sgml, "
+      "apt (>= 0.7.25), "
+      "not-for-me [ !amd64 ], "
+      "only-for-me [ amd64 ], "
+      "any-for-me [ any ], "
+      "not-for-darwin [ !darwin-any ], "
+      "cpu-for-me [ any-amd64 ], "
+      "os-for-me [ linux-any ], "
+      "cpu-not-for-me [ any-armel ], "
+      "os-not-for-me [ kfreebsd-any ], "
+      "not-in-stage1 <!profile.stage1>, "
+      "not-in-stage1-or-nodoc <!profile.nodoc !profile.stage1>, "
+      "only-in-stage1 <unknown.unknown profile.stage1>, "
+      "overlord-dev:any (= 7.15.3~) | overlord-dev:native (>> 7.15.5), "
+      ;
+
+   // Stripping MultiArch is currently the default setting to not confuse
+   // non-MultiArch capable users of the library with "strange" extensions.
+   const char* Start = Depends;
+   const char* End = Depends + strlen(Depends);
+
+   Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+   if (StripMultiArch == true)
+      EXPECT_EQ("debhelper", Package);
+   else
+      EXPECT_EQ("debhelper:any", Package);
+   EXPECT_EQ("5.0", Version);
+   EXPECT_EQ(Null | pkgCache::Dep::GreaterEq, Op);
+
+   Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+   if (StripMultiArch == true)
+      EXPECT_EQ("libdb-dev", Package);
+   else
+      EXPECT_EQ("libdb-dev:any", Package);
+   EXPECT_EQ("", Version);
+   EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op);
+
+   Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+   if (StripMultiArch == true)
+      EXPECT_EQ("gettext", Package);
+   else
+      EXPECT_EQ("gettext:native", Package);
+   EXPECT_EQ("0.12", Version);
+   EXPECT_EQ(Null | pkgCache::Dep::LessEq, Op);
+
+   Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+   if (StripMultiArch == true)
+      EXPECT_EQ("libcurl4-gnutls-dev", Package);
+   else
+      EXPECT_EQ("libcurl4-gnutls-dev:native", Package);
+   EXPECT_EQ("", Version);
+   EXPECT_EQ(Null | pkgCache::Dep::Or, Op);
+
+   Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+   EXPECT_EQ("libcurl3-gnutls-dev", Package);
+   EXPECT_EQ("7.15.5", Version);
+   EXPECT_EQ(Null | pkgCache::Dep::Greater, Op);
+
+   Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+   EXPECT_EQ("debiandoc-sgml", Package);
+   EXPECT_EQ("", Version);
+   EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op);
+
+   Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+   EXPECT_EQ("apt", Package);
+   EXPECT_EQ("0.7.25", Version);
+   EXPECT_EQ(Null | pkgCache::Dep::GreaterEq, Op);
+
+   if (ParseArchFlags == true) {
+      Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+      EXPECT_EQ("", Package); // not-for-me
+   } else {
+      EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
+      Start = strstr(Start, ",");
+      Start++;
+   }
+
+   if (ParseArchFlags == true) {
+      Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+      EXPECT_EQ("only-for-me", Package);
+      EXPECT_EQ("", Version);
+      EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op);
+   } else {
+      EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
+      Start = strstr(Start, ",");
+      Start++;
+   }
+
+   if (ParseArchFlags == true) {
+      Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+      EXPECT_EQ("any-for-me", Package);
+      EXPECT_EQ("", Version);
+      EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op);
+   } else {
+      EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
+      Start = strstr(Start, ",");
+      Start++;
+   }
+
+   if (ParseArchFlags == true) {
+      Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+      EXPECT_EQ("not-for-darwin", Package);
+      EXPECT_EQ("", Version);
+      EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op);
+   } else {
+      EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
+      Start = strstr(Start, ",");
+      Start++;
+   }
+
+   if (ParseArchFlags == true) {
+      Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+      EXPECT_EQ("cpu-for-me", Package);
+      EXPECT_EQ("", Version);
+      EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op);
+   } else {
+      EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
+      Start = strstr(Start, ",");
+      Start++;
+   }
+
+   if (ParseArchFlags == true) {
+      Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+      EXPECT_EQ("os-for-me", Package);
+      EXPECT_EQ("", Version);
+      EXPECT_EQ(Null | pkgCache::Dep::NoOp, Op);
+   } else {
+      EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
+      Start = strstr(Start, ",");
+      Start++;
+   }
+
+   if (ParseArchFlags == true) {
+      Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+      EXPECT_EQ("", Package); // cpu-not-for-me
+   } else {
+      EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
+      Start = strstr(Start, ",");
+      Start++;
+   }
+
+   if (ParseArchFlags == true) {
+      Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+      EXPECT_EQ("", Package); // os-not-for-me
+   } else {
+      EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
+      Start = strstr(Start, ",");
+      Start++;
+   }
+
+   if (ParseRestrictionsList == true) {
+      Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+      EXPECT_EQ("", Package); // not-in-stage1
+   } else {
+      EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
+      Start = strstr(Start, ",");
+      Start++;
+   }
+
+   if (ParseRestrictionsList == true) {
+      Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+      EXPECT_EQ("", Package); // not-in-stage1-or-in-nodoc
+   } else {
+      EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
+      Start = strstr(Start, ",");
+      Start++;
+   }
+
+   if (ParseRestrictionsList == true) {
+      Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+      EXPECT_EQ("only-in-stage1", Package);
+   } else {
+      EXPECT_EQ(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
+      Start = strstr(Start, ",");
+      Start++;
+   }
+
+   Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+   if (StripMultiArch == true)
+      EXPECT_EQ("overlord-dev", Package);
+   else
+      EXPECT_EQ("overlord-dev:any", Package);
+   EXPECT_EQ("7.15.3~", Version);
+   EXPECT_EQ(Null | pkgCache::Dep::Equals | pkgCache::Dep::Or, Op);
+
+   debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
+   if (StripMultiArch == true)
+      EXPECT_EQ("overlord-dev", Package);
+   else
+      EXPECT_EQ("overlord-dev:native", Package);
+   EXPECT_EQ("7.15.5", Version);
+   EXPECT_EQ(Null | pkgCache::Dep::Greater, Op);
+}
+
+// FIXME: This testcase is too big/complex
+TEST(ParseDependsTest, Everything)
+{
+   bool StripMultiArch = true;
+   bool ParseArchFlags = false;
+   bool ParseRestrictionsList = false;
+   unsigned short runner = 0;
+
 test:
 test:
-//     std::clog << (StripMultiArch ? "NO-Multi" : "Multi") << " " << (ParseArchFlags ? "Flags" : "NO-Flags") << std::endl;
-
-       // Stripping MultiArch is currently the default setting to not confuse
-       // non-MultiArch capable users of the library with "strange" extensions.
-       const char* Start = Depends;
-       const char* End = Depends + strlen(Depends);
-
-       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-       if (StripMultiArch == true)
-               equals("debhelper", Package);
-       else
-               equals("debhelper:any", Package);
-       equals("5.0", Version);
-       equals(Null | pkgCache::Dep::GreaterEq, Op);
-
-       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-       if (StripMultiArch == true)
-               equals("libdb-dev", Package);
-       else
-               equals("libdb-dev:any", Package);
-       equals("", Version);
-       equals(Null | pkgCache::Dep::NoOp, Op);
-
-       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-       if (StripMultiArch == true)
-               equals("gettext", Package);
-       else
-               equals("gettext:native", Package);
-       equals("0.12", Version);
-       equals(Null | pkgCache::Dep::LessEq, Op);
-
-       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-       if (StripMultiArch == true)
-               equals("libcurl4-gnutls-dev", Package);
-       else
-               equals("libcurl4-gnutls-dev:native", Package);
-       equals("", Version);
-       equals(Null | pkgCache::Dep::Or, Op);
-
-       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-       equals("libcurl3-gnutls-dev", Package);
-       equals("7.15.5", Version);
-       equals(Null | pkgCache::Dep::Greater, Op);
-
-       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-       equals("debiandoc-sgml", Package);
-       equals("", Version);
-       equals(Null | pkgCache::Dep::NoOp, Op);
-
-       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-       equals("apt", Package);
-       equals("0.7.25", Version);
-       equals(Null | pkgCache::Dep::GreaterEq, Op);
-
-       if (ParseArchFlags == true) {
-               Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-               equals("", Package); // not-for-me
-       } else {
-               equals(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
-               Start = strstr(Start, ",");
-               Start++;
-       }
-
-       if (ParseArchFlags == true) {
-               Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-               equals("only-for-me", Package);
-               equals("", Version);
-               equals(Null | pkgCache::Dep::NoOp, Op);
-       } else {
-               equals(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
-               Start = strstr(Start, ",");
-               Start++;
-       }
-
-       if (ParseArchFlags == true) {
-               Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-               equals("any-for-me", Package);
-               equals("", Version);
-               equals(Null | pkgCache::Dep::NoOp, Op);
-       } else {
-               equals(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
-               Start = strstr(Start, ",");
-               Start++;
-       }
-
-       if (ParseArchFlags == true) {
-               Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-               equals("not-for-darwin", Package);
-               equals("", Version);
-               equals(Null | pkgCache::Dep::NoOp, Op);
-       } else {
-               equals(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
-               Start = strstr(Start, ",");
-               Start++;
-       }
-
-       if (ParseArchFlags == true) {
-               Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-               equals("cpu-for-me", Package);
-               equals("", Version);
-               equals(Null | pkgCache::Dep::NoOp, Op);
-       } else {
-               equals(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
-               Start = strstr(Start, ",");
-               Start++;
-       }
-
-       if (ParseArchFlags == true) {
-               Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-               equals("os-for-me", Package);
-               equals("", Version);
-               equals(Null | pkgCache::Dep::NoOp, Op);
-       } else {
-               equals(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
-               Start = strstr(Start, ",");
-               Start++;
-       }
-
-       if (ParseArchFlags == true) {
-               Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-               equals("", Package); // cpu-not-for-me
-       } else {
-               equals(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
-               Start = strstr(Start, ",");
-               Start++;
-       }
-
-       if (ParseArchFlags == true) {
-               Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-               equals("", Package); // os-not-for-me
-       } else {
-               equals(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
-               Start = strstr(Start, ",");
-               Start++;
-       }
-
-       if (ParseRestrictionsList == true) {
-               Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-               equals("", Package); // not-in-stage1
-       } else {
-               equals(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
-               Start = strstr(Start, ",");
-               Start++;
-       }
-
-       if (ParseRestrictionsList == true) {
-               Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-               equals("", Package); // not-in-stage1-or-in-nodoc
-       } else {
-               equals(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
-               Start = strstr(Start, ",");
-               Start++;
-       }
-
-       if (ParseRestrictionsList == true) {
-               Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-               equals("only-in-stage1", Package);
-       } else {
-               equals(true, 0 == debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList));
-               Start = strstr(Start, ",");
-               Start++;
-       }
-
-       Start = debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-       if (StripMultiArch == true)
-               equals("overlord-dev", Package);
-       else
-               equals("overlord-dev:any", Package);
-       equals("7.15.3~", Version);
-       equals(Null | pkgCache::Dep::Equals | pkgCache::Dep::Or, Op);
-
-       debListParser::ParseDepends(Start, End, Package, Version, Op, ParseArchFlags, StripMultiArch, ParseRestrictionsList);
-       if (StripMultiArch == true)
-               equals("overlord-dev", Package);
-       else
-               equals("overlord-dev:native", Package);
-       equals("7.15.5", Version);
-       equals(Null | pkgCache::Dep::Greater, Op);
-
-       if (StripMultiArch == false)
-               if (ParseArchFlags == false)
-                       ParseRestrictionsList = !ParseRestrictionsList;
-               ParseArchFlags = !ParseArchFlags;
-       StripMultiArch = !StripMultiArch;
-
-       runner++;
-       if (runner < 8)
-               goto test; // this is the prove: tests are really evil ;)
-
-       return 0;
+   {
+      SCOPED_TRACE(std::string("StripMultiArch: ") + (StripMultiArch ? "true" : "false"));
+      SCOPED_TRACE(std::string("ParseArchFlags: ") + (ParseArchFlags ? "true" : "false"));
+      SCOPED_TRACE(std::string("ParseRestrictionsList: ") + (ParseRestrictionsList ? "true" : "false"));
+      parseDependency(StripMultiArch, ParseArchFlags, ParseRestrictionsList);
+   }
+   if (StripMultiArch == false)
+      if (ParseArchFlags == false)
+        ParseRestrictionsList = !ParseRestrictionsList;
+   ParseArchFlags = !ParseArchFlags;
+   StripMultiArch = !StripMultiArch;
+
+   runner++;
+   if (runner < 8)
+      goto test; // this is the prove: tests are really evil ;)
 }
 }
diff --git a/test/libapt/run-tests b/test/libapt/run-tests
deleted file mode 100755 (executable)
index 574e51e..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/bin/sh
-set -e
-
-DIR=$(readlink -f $(dirname $0))
-if [ -z "$MAKELEVEL" ]; then
-       echo 'Compiling the tests …'
-       (cd $DIR && make)
-       echo 'Running all testcases …'
-fi
-LDPATH="$DIR/../../build/bin"
-EXT="_libapt_test"
-EXIT_CODE=0
-
-# detect if output is on a terminal (colorful) or better not
-if expr match "$(readlink -f /proc/$$/fd/1)" '/dev/pts/[0-9]\+' > /dev/null; then
-       COLHIGH='\033[1;35m'
-       COLRESET='\033[0m'
-       TESTOKAY='\033[1;32mOKAY\033[0m'
-       TESTFAIL='\033[1;31mFAILED\033[0m'
-else
-       COLHIGH=''
-       COLRESET=''
-       TESTOKAY='OK'
-       TESTFAIL='###FAILED###'
-fi
-
-for testapp in $(ls ${LDPATH}/*$EXT)
-do
-       name=$(basename ${testapp})
-       NAME="${COLHIGH}${name}${COLRESET}"
-       tmppath=""
-
-       if [ $name = "GetListOfFilesInDir${EXT}" ]; then
-               # TODO: very-low: move env creation to the actual test-app
-               tmppath=$(mktemp -d)
-               touch "${tmppath}/anormalfile" \
-                       "${tmppath}/01yet-anothernormalfile" \
-                       "${tmppath}/anormalapt.conf" \
-                       "${tmppath}/01yet-anotherapt.conf" \
-                       "${tmppath}/anormalapt.list" \
-                       "${tmppath}/01yet-anotherapt.list" \
-                       "${tmppath}/wrongextension.wron" \
-                       "${tmppath}/wrong-extension.wron" \
-                       "${tmppath}/strangefile." \
-                       "${tmppath}/s.t.r.a.n.g.e.f.i.l.e" \
-                       "${tmppath}/.hiddenfile" \
-                       "${tmppath}/.hiddenfile.conf" \
-                       "${tmppath}/.hiddenfile.list" \
-                       "${tmppath}/multi..dot" \
-                       "${tmppath}/multi.dot.conf" \
-                       "${tmppath}/multi.dot.list" \
-                       "${tmppath}/disabledfile.disabled" \
-                       "${tmppath}/disabledfile.conf.disabled" \
-                       "${tmppath}/disabledfile.list.disabled" \
-                       "${tmppath}/invälid.conf" \
-                       "${tmppath}/invalíd" \
-                       "${tmppath}/01invalíd"
-               mkdir "${tmppath}/invaliddir" \
-                       "${tmppath}/directory.conf" \
-                       "${tmppath}/directory.list" \
-                       "${tmppath}/directory.wron" \
-                       "${tmppath}/directory.list.disabled"
-               ln -s "${tmppath}/anormalfile" "${tmppath}/linkedfile.list"
-               ln -s "${tmppath}/non-existing-file" "${tmppath}/brokenlink.list"
-       elif [ $name = "getLanguages${EXT}" ]; then
-               tmppath=$(mktemp -d)
-               touch "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-tr" \
-                       "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-pt" \
-                       "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-se~" \
-                       "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-st.bak" \
-                       "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-ast_DE" \
-                       "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-tlh%5fDE"
-       elif [ $name = "HashSums${EXT}" ]; then
-               TMP="$(readlink -f "./${0}")"
-               tmppath="$TMP"
-               tmppath="${tmppath} $(md5sum $TMP | cut -d' ' -f 1)"
-               tmppath="${tmppath} $(sha1sum $TMP | cut -d' ' -f 1)"
-               tmppath="${tmppath} $(sha256sum $TMP | cut -d' ' -f 1)"
-               tmppath="${tmppath} $(sha512sum $TMP | cut -d' ' -f 1)"
-       elif [ $name = "CompareVersion${EXT}" ]; then
-               tmppath="${DIR}/versions.lst"
-       elif [ $name = "CdromFindPackages${EXT}" ]; then
-               tmppath=$(mktemp -d)
-               mkdir -p "${tmppath}/.disk" "${tmppath}/pool" \
-                       "${tmppath}/dists/stable/main/binary-i386" \
-                       "${tmppath}/dists/stable/main/source" \
-                       "${tmppath}/dists/stable/contrib/binary-amd64" \
-                       "${tmppath}/dists/stable/contrib/binary-all" \
-                       "${tmppath}/dists/unstable/main/binary-i386" \
-                       "${tmppath}/dists/unstable/main/i18n" \
-                       "${tmppath}/dists/unstable/main/source" \
-                       "${tmppath}/dists/broken/non-free/source"
-               touch "${tmppath}/dists/broken/.aptignr" \
-                       "${tmppath}/dists/stable/main/binary-i386/Packages" \
-                       "${tmppath}/dists/stable/main/binary-i386/Packages.bz2" \
-                       "${tmppath}/dists/stable/main/source/Sources.xz" \
-                       "${tmppath}/dists/stable/contrib/binary-amd64/Packages" \
-                       "${tmppath}/dists/stable/contrib/binary-amd64/Packages.gz" \
-                       "${tmppath}/dists/stable/contrib/binary-all/Packages" \
-                       "${tmppath}/dists/unstable/main/binary-i386/Packages.xz" \
-                       "${tmppath}/dists/unstable/main/binary-i386/Packages.lzma" \
-                       "${tmppath}/dists/unstable/main/i18n/Translation-en" \
-                       "${tmppath}/dists/unstable/main/i18n/Translation-de.bz2" \
-                       "${tmppath}/dists/unstable/main/source/Sources.xz" \
-                       "${tmppath}/dists/broken/non-free/source/Sources.gz" \
-                       "${tmppath}/dists/stable/Release.gpg" \
-                       "${tmppath}/dists/stable/Release" \
-                       "${tmppath}/dists/unstable/InRelease" \
-                       "${tmppath}/dists/broken/Release.gpg"
-               ln -s "${tmppath}/dists/unstable" "${tmppath}/dists/sid"
-       elif [ $name = "CdromFindMountPointForDevice${EXT}" ]; then
-               tmppath=$(mktemp)
-               echo 'rootfs / rootfs rw 0 0
-sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
-sysfs0 /sys0 sysfs rw,nosuid,nodev,noexec,relatime 0 0
-/dev/disk/by-uuid/fadcbc52-6284-4874-aaaa-dcee1f05fe21 / ext4 rw,relatime,errors=remount-ro,data=ordered 0 0
-/dev/sda1 /boot/efi vfat rw,nosuid,nodev,noexec,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=utf8,shortname=lower,quiet,utf8,errors=remount-ro,rw,nosuid,nodev,noexec,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=utf8,shortname=lower,quiet,utf8,errors=remount-ro,rw,nosuid,nodev,noexec,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=utf8,shortname=lower,quiet,utf8,errors=remount-ro,rw,nosuid,nodev,noexec,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=utf8,shortname=lower,quiet,utf8,errors=remount-ro 0 0
-tmpfs /tmp tmpfs rw,nosuid,nodev,relatime 0 0' > $tmppath
-       elif [ $name = "FileUtl${EXT}" ]; then
-               tmppath="$(mktemp -d)"
-       fi
-
-       echo -n "Testing with ${NAME} "
-       if MALLOC_PERTURB_=21 MALLOC_CHECK_=2 LD_LIBRARY_PATH=${LDPATH} ${testapp} ${tmppath} ; then
-               echo "$TESTOKAY"
-       else
-               echo "$TESTFAIL"
-               EXIT_CODE=1
-       fi
-
-       if [ -n "$tmppath" -a -d "$tmppath" ]; then
-               rm -rf "$tmppath"
-       fi
-done
-exit $EXIT_CODE
index 71aa54f1ee94ff7dd21a413b06f088f96e74e00d..eb2d76c43d71d01883a41629c30d3be269470699 100644 (file)
@@ -1,6 +1,5 @@
 #include <config.h>
 
 #include <config.h>
 
-#include <apt-pkg/configuration.h>
 #include <apt-pkg/sourcelist.h>
 #include <apt-pkg/fileutl.h>
 
 #include <apt-pkg/sourcelist.h>
 #include <apt-pkg/fileutl.h>
 
@@ -9,26 +8,20 @@
 #include <string.h>
 #include <unistd.h>
 
 #include <string.h>
 #include <unistd.h>
 
-#include "assert.h"
+#include <gtest/gtest.h>
 
 
-char *tempfile = NULL;
-int tempfile_fd = -1;
+#include "file-helpers.h"
 
 
-static void remove_tmpfile(void)
-{
-   if (tempfile_fd > 0)
-      close(tempfile_fd);
-   if (tempfile != NULL) {
-      unlink(tempfile);
-      free(tempfile);
-   }
-}
+class SourceList : public pkgSourceList {
+   public:
+      using pkgSourceList::ParseFileDeb822;
+};
 
 
-int main()
+TEST(SourceListTest,ParseFileDeb822)
 {
 {
-  _config->Set("APT::Sources::Use-Deb822", true);
-
-   const char contents[] = ""
+   FileFd fd;
+   char * tempfile;
+   createTemporaryFile("parsefiledeb822", fd, &tempfile,
       "Types: deb\n"
       "URIs: http://ftp.debian.org/debian\n"
       "Suites: stable\n"
       "Types: deb\n"
       "URIs: http://ftp.debian.org/debian\n"
       "Suites: stable\n"
@@ -39,22 +32,12 @@ int main()
       "Types: deb\n"
       "URIs: http://ftp.debian.org/debian\n"
       "Suites: unstable\n"
       "Types: deb\n"
       "URIs: http://ftp.debian.org/debian\n"
       "Suites: unstable\n"
-      "Sections: main non-free\n"
-      ;
-
-   FileFd fd;
-   atexit(remove_tmpfile);
-   tempfile = strdup("apt-test.XXXXXXXX");
-   tempfile_fd = mkstemp(tempfile);
-
-   /* (Re-)Open (as FileFd), write and seek to start of the temp file */
-   equals(fd.OpenDescriptor(tempfile_fd, FileFd::ReadWrite), true);
-   equals(fd.Write(contents, strlen(contents)), true);
-   equals(fd.Seek(0), true);
+      "Sections: main non-free\n");
+   fd.Close();
 
 
-   pkgSourceList sources(tempfile);
-   equals(sources.size(), 2);
+   SourceList sources;
+   EXPECT_EQ(2, sources.ParseFileDeb822(tempfile));
+   EXPECT_EQ(2, sources.size());
 
 
-   /* clean up handled by atexit handler, so just return here */
-   return 0;
+   unlink(tempfile);
 }
 }
index 618f4daba22ce4544645171b288d58d6475d4a13..bc004fd662d72d931154b01b038aa75cec94c78e 100644 (file)
@@ -1,96 +1,72 @@
 #include <config.h>
 #include <config.h>
-
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/strutl.h>
-
 #include <string>
 #include <vector>
 
 #include <string>
 #include <vector>
 
-#include "assert.h"
+#include <gtest/gtest.h>
 
 
-int main()
+TEST(StrUtilTest,DeEscapeString)
 {
 {
-   std::string input, output, expected;
-
-   // no input
-   input = "foobar";
-   expected = "foobar";
-   output = DeEscapeString(input);
-   equals(output, expected);
-
+   // nothing special
+   EXPECT_EQ("", DeEscapeString(""));
+   EXPECT_EQ("foobar", DeEscapeString("foobar"));
    // hex and octal
    // hex and octal
-   input = "foo\\040bar\\x0abaz";
-   expected = "foo bar\nbaz";
-   output = DeEscapeString(input);
-   equals(output, expected);
-
-   // at the end
-   input = "foo\\040";
-   expected = "foo ";
-   output = DeEscapeString(input);
-   equals(output, expected);
-
-   // double escape
-   input = "foo\\\\ x";
-   expected = "foo\\ x";
-   output = DeEscapeString(input);
-   equals(output, expected);
-
-   // double escape at the end
-   input = "\\\\foo\\\\";
-   expected = "\\foo\\";
-   output = DeEscapeString(input);
-   equals(output, expected);
-
-   // the string that we actually need it for
-   input = "/media/Ubuntu\\04011.04\\040amd64";
-   expected = "/media/Ubuntu 11.04 amd64";
-   output = DeEscapeString(input);
-   equals(output, expected);
+   EXPECT_EQ("foo bar\nbaz", DeEscapeString("foo\\040bar\\x0abaz"));
+   EXPECT_EQ("foo ", DeEscapeString("foo\\040"));
+   EXPECT_EQ("\nbaz", DeEscapeString("\\x0abaz"));
+   EXPECT_EQ("/media/Ubuntu 11.04 amd64", DeEscapeString("/media/Ubuntu\\04011.04\\040amd64"));
+   // double slashes
+   EXPECT_EQ("foo\\ x", DeEscapeString("foo\\\\ x"));
+   EXPECT_EQ("\\foo\\", DeEscapeString("\\\\foo\\\\"));
+}
+TEST(StrUtilTest,StringSplitBasic)
+{
+   std::vector<std::string> result = StringSplit("", "");
+   EXPECT_EQ(result.size(), 0);
 
 
-   // Split
-   input = "status: libnet1:amd64: unpacked";
-   std::vector<std::string> result = StringSplit(input, ": ");
-   equals(result[0], "status");
-   equals(result[1], "libnet1:amd64");
-   equals(result[2], "unpacked");
-   equals(result.size(), 3);
+   result = StringSplit("abc", "");
+   EXPECT_EQ(result.size(), 0);
 
 
-   input = "status: libnet1:amd64: unpacked";
-   result = StringSplit(input, "xxx");
-   equals(result[0], input);
-   equals(result.size(), 1);
+   result = StringSplit("", "abc");
+   EXPECT_EQ(result.size(), 1);
 
 
-   input = "status: libnet1:amd64: unpacked";
-   result = StringSplit(input, "");
-   equals(result.size(), 0);
+   result = StringSplit("abc", "b");
+   ASSERT_EQ(result.size(), 2);
+   EXPECT_EQ(result[0], "a");
+   EXPECT_EQ(result[1], "c");
 
 
-   input = "x:y:z";
-   result = StringSplit(input, ":", 2);
-   equals(result.size(), 2);
-   equals(result[0], "x");
-   equals(result[1], "y:z");
+   result = StringSplit("abc", "abc");
+   ASSERT_EQ(result.size(), 2);
+   EXPECT_EQ(result[0], "");
+   EXPECT_EQ(result[1], "");
+}
+TEST(StrUtilTest,StringSplitDpkgStatus)
+{
+   std::string const input = "status: libnet1:amd64: unpacked";
+   std::vector<std::string> result = StringSplit(input, "xxx");
+   ASSERT_EQ(result.size(), 1);
+   EXPECT_EQ(result[0], input);
 
 
-   input = "abc";
    result = StringSplit(input, "");
    result = StringSplit(input, "");
-   equals(result.size(), 0);
-
-   // endswith
-   bool b;
-   input = "abcd";
-   b = APT::String::Endswith(input, "d");
-   equals(b, true);
-
-   b = APT::String::Endswith(input, "cd");
-   equals(b, true);
-
-   b = APT::String::Endswith(input, "abcd");
-   equals(b, true);
-
-   b = APT::String::Endswith(input, "x");
-   equals(b, false);
-
-   b = APT::String::Endswith(input, "abcndefg");
-   equals(b, false);
-
-   return 0;
+   EXPECT_EQ(result.size(), 0);
+
+   result = StringSplit(input, ": ");
+   ASSERT_EQ(result.size(), 3);
+   EXPECT_EQ(result[0], "status");
+   EXPECT_EQ(result[1], "libnet1:amd64");
+   EXPECT_EQ(result[2], "unpacked");
+
+   result = StringSplit("x:y:z", ":", 2);
+   ASSERT_EQ(result.size(), 2);
+   EXPECT_EQ(result[0], "x");
+   EXPECT_EQ(result[1], "y:z");
+}
+TEST(StrUtilTest,EndsWith)
+{
+   using APT::String::Endswith;
+   EXPECT_TRUE(Endswith("abcd", "d"));
+   EXPECT_TRUE(Endswith("abcd", "cd"));
+   EXPECT_TRUE(Endswith("abcd", "abcd"));
+   EXPECT_FALSE(Endswith("abcd", "x"));
+   EXPECT_FALSE(Endswith("abcd", "abcndefg"));
 }
 }
index aaf46e3e93cdf48c1bd1313b8b7ddd769c378419..1bac75b55add725a26022f8ef5fe2bad065c798b 100644 (file)
@@ -8,55 +8,29 @@
 #include <string.h>
 #include <unistd.h>
 
 #include <string.h>
 #include <unistd.h>
 
-#include "assert.h"
+#include <gtest/gtest.h>
 
 
-char *tempfile = NULL;
-int tempfile_fd = -1;
+#include "file-helpers.h"
 
 
-static void remove_tmpfile(void)
-{
-   if (tempfile_fd > 0)
-      close(tempfile_fd);
-   if (tempfile != NULL) {
-      unlink(tempfile);
-      free(tempfile);
-   }
-}
-
-int main()
+TEST(TagFileTest,SingleField)
 {
    FileFd fd;
 {
    FileFd fd;
-   const char contents[] = "FieldA-12345678: the value of the field";
-   atexit(remove_tmpfile);
-   tempfile = strdup("apt-test.XXXXXXXX");
-   tempfile_fd = mkstemp(tempfile);
-
-   /* (Re-)Open (as FileFd), write and seek to start of the temp file */
-   equals(fd.OpenDescriptor(tempfile_fd, FileFd::ReadWrite), true);
-   equals(fd.Write(contents, strlen(contents)), true);
-   equals(fd.Seek(0), true);
+   createTemporaryFile("singlefield", fd, NULL, "FieldA-12345678: the value of the field");
 
    pkgTagFile tfile(&fd);
    pkgTagSection section;
 
    pkgTagFile tfile(&fd);
    pkgTagSection section;
-   equals(tfile.Step(section), true);
-  
-   /* It has one field */
-   equals(section.Count(), 1);
-
-   /* ... and it is called FieldA-12345678 */
-   equals(section.Exists("FieldA-12345678"), true);
-
-   /* its value is correct */
-   equals(section.FindS("FieldA-12345678"), std::string("the value of the field"));
-   /* A non-existent field has an empty string as value */
-   equals(section.FindS("FieldB-12345678"), std::string());
-
-   /* ... and Exists does not lie about missing fields... */
-   equalsNot(section.Exists("FieldB-12345678"), true); 
-
-   /* There is only one section in this tag file */
-   equals(tfile.Step(section), false);
-
-   /* clean up handled by atexit handler, so just return here */
-   return 0;
+   ASSERT_TRUE(tfile.Step(section));
+
+   // It has one field
+   EXPECT_EQ(1, section.Count());
+   // ... and it is called FieldA-12345678
+   EXPECT_TRUE(section.Exists("FieldA-12345678"));
+   // its value is correct
+   EXPECT_EQ("the value of the field", section.FindS("FieldA-12345678"));
+   // A non-existent field has an empty string as value
+   EXPECT_EQ("", section.FindS("FieldB-12345678"));
+   // ... and Exists does not lie about missing fields...
+   EXPECT_FALSE(section.Exists("FieldB-12345678"));
+   // There is only one section in this tag file
+   EXPECT_FALSE(tfile.Step(section));
 }
 }
index 6559f1390183a69fde67fee774f08e812a6e9314..1662f51f0e3ba3a24b6e93ba95fb79fa167c64a9 100644 (file)
 #include <config.h>
 #include <config.h>
-
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/strutl.h>
-
 #include <string>
 #include <string>
+#include <gtest/gtest.h>
 
 
-#include "assert.h"
-
-int main() {
-       // Basic stuff
-       {
-       URI U("http://www.debian.org:90/temp/test");
-       equals("http", U.Access);
-       equals("", U.User);
-       equals("", U.Password);
-       equals(90, U.Port);
-       equals("www.debian.org", U.Host);
-       equals("/temp/test", U.Path);
-       } {
-       URI U("http://jgg:foo@ualberta.ca/blah");
-       equals("http", U.Access);
-       equals("jgg", U.User);
-       equals("foo", U.Password);
-       equals(0, U.Port);
-       equals("ualberta.ca", U.Host);
-       equals("/blah", U.Path);
-       } {
-       URI U("file:/usr/bin/foo");
-       equals("file", U.Access);
-       equals("", U.User);
-       equals("", U.Password);
-       equals(0, U.Port);
-       equals("", U.Host);
-       equals("/usr/bin/foo", U.Path);
-       } {
-       URI U("cdrom:Moo Cow Rom:/debian");
-       equals("cdrom", U.Access);
-       equals("", U.User);
-       equals("", U.Password);
-       equals(0, U.Port);
-       equals("Moo Cow Rom", U.Host);
-       equals("/debian", U.Path);
-       } {
-       URI U("gzip:./bar/cow");
-       equals("gzip", U.Access);
-       equals("", U.User);
-       equals("", U.Password);
-       equals(0, U.Port);
-       equals(".", U.Host);
-       equals("/bar/cow", U.Path);
-       } {
-       URI U("ftp:ftp.fr.debian.org/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb");
-       equals("ftp", U.Access);
-       equals("", U.User);
-       equals("", U.Password);
-       equals(0, U.Port);
-       equals("ftp.fr.debian.org", U.Host);
-       equals("/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb", U.Path);
-       }
-
-       // RFC 2732 stuff
-       {
-       URI U("http://[1080::8:800:200C:417A]/foo");
-       equals("http", U.Access);
-       equals("", U.User);
-       equals("", U.Password);
-       equals(0, U.Port);
-       equals("1080::8:800:200C:417A", U.Host);
-       equals("/foo", U.Path);
-       } {
-       URI U("http://[::FFFF:129.144.52.38]:80/index.html");
-       equals("http", U.Access);
-       equals("", U.User);
-       equals("", U.Password);
-       equals(80, U.Port);
-       equals("::FFFF:129.144.52.38", U.Host);
-       equals("/index.html", U.Path);
-       } {
-       URI U("http://[::FFFF:129.144.52.38:]:80/index.html");
-       equals("http", U.Access);
-       equals("", U.User);
-       equals("", U.Password);
-       equals(80, U.Port);
-       equals("::FFFF:129.144.52.38:", U.Host);
-       equals("/index.html", U.Path);
-       } {
-       URI U("http://[::FFFF:129.144.52.38:]/index.html");
-       equals("http", U.Access);
-       equals("", U.User);
-       equals("", U.Password);
-       equals(0, U.Port);
-       equals("::FFFF:129.144.52.38:", U.Host);
-       equals("/index.html", U.Path);
-       }
-       /* My Evil Corruption of RFC 2732 to handle CDROM names! Fun for
-          the whole family! */
-       {
-       URI U("cdrom:[The Debian 1.2 disk, 1/2 R1:6]/debian/");
-       equals("cdrom", U.Access);
-       equals("", U.User);
-       equals("", U.Password);
-       equals(0, U.Port);
-       equals("The Debian 1.2 disk, 1/2 R1:6", U.Host);
-       equals("/debian/", U.Path);
-       } {
-       URI U("cdrom:Foo Bar Cow/debian/");
-       equals("cdrom", U.Access);
-       equals("", U.User);
-       equals("", U.Password);
-       equals(0, U.Port);
-       equals("Foo Bar Cow", U.Host);
-       equals("/debian/", U.Path);
-       }
-
-        // Percent-encoding.
-        {
-        URI U("ftp://foo:b%40r@example.org");
-        equals("foo", U.User);
-        equals("b@r", U.Password);
-        equals("ftp://foo:b%40r@example.org/", (std::string) U);
-        }
-
-       return 0;
+TEST(URITest, BasicHTTP)
+{
+   URI U("http://www.debian.org:90/temp/test");
+   EXPECT_EQ("http", U.Access);
+   EXPECT_EQ("", U.User);
+   EXPECT_EQ("", U.Password);
+   EXPECT_EQ(90, U.Port);
+   EXPECT_EQ("www.debian.org", U.Host);
+   EXPECT_EQ("/temp/test", U.Path);
+   // Login data
+   U = URI("http://jgg:foo@ualberta.ca/blah");
+   EXPECT_EQ("http", U.Access);
+   EXPECT_EQ("jgg", U.User);
+   EXPECT_EQ("foo", U.Password);
+   EXPECT_EQ(0, U.Port);
+   EXPECT_EQ("ualberta.ca", U.Host);
+   EXPECT_EQ("/blah", U.Path);
+}
+TEST(URITest, SingeSlashFile)
+{
+   URI U("file:/usr/bin/foo");
+   EXPECT_EQ("file", U.Access);
+   EXPECT_EQ("", U.User);
+   EXPECT_EQ("", U.Password);
+   EXPECT_EQ(0, U.Port);
+   EXPECT_EQ("", U.Host);
+   EXPECT_EQ("/usr/bin/foo", U.Path);
+}
+TEST(URITest, BasicCDROM)
+{
+   URI U("cdrom:Moo Cow Rom:/debian");
+   EXPECT_EQ("cdrom", U.Access);
+   EXPECT_EQ("", U.User);
+   EXPECT_EQ("", U.Password);
+   EXPECT_EQ(0, U.Port);
+   EXPECT_EQ("Moo Cow Rom", U.Host);
+   EXPECT_EQ("/debian", U.Path);
+}
+TEST(URITest, RelativeGzip)
+{
+   URI U("gzip:./bar/cow");
+   EXPECT_EQ("gzip", U.Access);
+   EXPECT_EQ("", U.User);
+   EXPECT_EQ("", U.Password);
+   EXPECT_EQ(0, U.Port);
+   EXPECT_EQ(".", U.Host);
+   EXPECT_EQ("/bar/cow", U.Path);
+}
+TEST(URITest, NoSlashFTP)
+{
+   URI U("ftp:ftp.fr.debian.org/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb");
+   EXPECT_EQ("ftp", U.Access);
+   EXPECT_EQ("", U.User);
+   EXPECT_EQ("", U.Password);
+   EXPECT_EQ(0, U.Port);
+   EXPECT_EQ("ftp.fr.debian.org", U.Host);
+   EXPECT_EQ("/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb", U.Path);
+}
+TEST(URITest, RFC2732)
+{
+   URI U("http://[1080::8:800:200C:417A]/foo");
+   EXPECT_EQ("http", U.Access);
+   EXPECT_EQ("", U.User);
+   EXPECT_EQ("", U.Password);
+   EXPECT_EQ(0, U.Port);
+   EXPECT_EQ("1080::8:800:200C:417A", U.Host);
+   EXPECT_EQ("/foo", U.Path);
+   // with port
+   U = URI("http://[::FFFF:129.144.52.38]:80/index.html");
+   EXPECT_EQ("http", U.Access);
+   EXPECT_EQ("", U.User);
+   EXPECT_EQ("", U.Password);
+   EXPECT_EQ(80, U.Port);
+   EXPECT_EQ("::FFFF:129.144.52.38", U.Host);
+   EXPECT_EQ("/index.html", U.Path);
+   // extra colon
+   U = URI("http://[::FFFF:129.144.52.38:]:80/index.html");
+   EXPECT_EQ("http", U.Access);
+   EXPECT_EQ("", U.User);
+   EXPECT_EQ("", U.Password);
+   EXPECT_EQ(80, U.Port);
+   EXPECT_EQ("::FFFF:129.144.52.38:", U.Host);
+   EXPECT_EQ("/index.html", U.Path);
+   // extra colon port
+   U = URI("http://[::FFFF:129.144.52.38:]/index.html");
+   EXPECT_EQ("http", U.Access);
+   EXPECT_EQ("", U.User);
+   EXPECT_EQ("", U.Password);
+   EXPECT_EQ(0, U.Port);
+   EXPECT_EQ("::FFFF:129.144.52.38:", U.Host);
+   EXPECT_EQ("/index.html", U.Path);
+   // My Evil Corruption of RFC 2732 to handle CDROM names!
+   // Fun for the whole family! */
+   U = URI("cdrom:[The Debian 1.2 disk, 1/2 R1:6]/debian/");
+   EXPECT_EQ("cdrom", U.Access);
+   EXPECT_EQ("", U.User);
+   EXPECT_EQ("", U.Password);
+   EXPECT_EQ(0, U.Port);
+   EXPECT_EQ("The Debian 1.2 disk, 1/2 R1:6", U.Host);
+   EXPECT_EQ("/debian/", U.Path);
+   // no brackets
+   U = URI("cdrom:Foo Bar Cow/debian/");
+   EXPECT_EQ("cdrom", U.Access);
+   EXPECT_EQ("", U.User);
+   EXPECT_EQ("", U.Password);
+   EXPECT_EQ(0, U.Port);
+   EXPECT_EQ("Foo Bar Cow", U.Host);
+   EXPECT_EQ("/debian/", U.Path);
+   // percent encoded
+   U = URI("ftp://foo:b%40r@example.org");
+   EXPECT_EQ("foo", U.User);
+   EXPECT_EQ("b@r", U.Password);
+   EXPECT_EQ("ftp://foo:b%40r@example.org/", (std::string) U);
 }
 }
diff --git a/test/libapt/versions.lst b/test/libapt/versions.lst
deleted file mode 100644 (file)
index 8dd8ebd..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-# List of 
-#   ver1 ver2 ret 
-# Of versions worth testing
-#  1 means that ver1 > ver2
-# -1 means that ver1 < ver2
-#  0 means that ver1 = ver2
-7.6p2-4 7.6-0 1
-1.0.3-3 1.0-1 1
-1.3 1.2.2-2 1
-1.3 1.2.2 1
-
-# Important attributes
-# disabled as dpkg --compare-versions doesn't like them… (versions have to start with a number)
-#- . -1
-#p - -1
-#a - -1
-#z - -1
-#a . -1
-#z . -1
-
-# disabled as dpkg --compare-versions doesn't like them… (versions have to start with a number)
-#III-alpha9.8 III-alpha9.8-1.5 -1
-
-# Epochs
-1:0.4 10.3 1
-1:1.25-4 1:1.25-8 -1
-0:1.18.36 1.18.36 0
-
-# native version
-1.18.36 1.18.35 1
-0:1.18.36 1.18.35 1
-
-# Funky, but allowed, characters in upstream version
-9:1.18.36:5.4-20 10:0.5.1-22 -1
-9:1.18.36:5.4-20 9:1.18.36:5.5-1 -1
-9:1.18.36:5.4-20 9:1.18.37:4.3-22 -1
-1.18.36-0.17.35-18 1.18.36-19 1
-
-# Junk
-1:1.2.13-3 1:1.2.13-3.1 -1
-2.0.7pre1-4 2.0.7r-1 -1
-
-# Test some properties of text strings
-0-pre 0-pre 0
-0-pre 0-pree -1
-
-1.1.6r2-2 1.1.6r-1 1
-2.6b2-1 2.6b-2 1
-
-98.1p5-1 98.1-pre2-b6-2 -1
-0.4a6-2 0.4-1 1
-
-1:3.0.5-2 1:3.0.5.1 -1
-
-# #205960
-3.0~rc1-1 3.0-1 -1
-
-# #573592 - debian policy 5.6.12
-1.0 1.0-0 0
-0.2 1.0-0 -1
-1.0 1.0-0+b1 -1
-1.0 1.0-0~ 1
-
-# if a version includes a dash
-# it should be the debrev dash - policy says so…
-0:0-0-0 0-0 1
-
-# do we like strange versions? Yes we like strange versions…
-0 0 0
-0 00 0
-
-# "steal" the testcases from cupt
-1.2.3 1.2.3 0 # identical
-4.4.3-2 4.4.3-2 0 # identical
-1:2ab:5 1:2ab:5 0 # this is correct...
-7:1-a:b-5 7:1-a:b-5 0 # and this
-57:1.2.3abYZ+~-4-5 57:1.2.3abYZ+~-4-5 0 # and those too
-1.2.3 0:1.2.3 0 # zero epoch
-1.2.3 1.2.3-0 0 # zero revision
-009 9 0 # zeroes...
-009ab5 9ab5 0 # there as well
-1.2.3 1.2.3-1 -1 # added non-zero revision
-1.2.3 1.2.4 -1 # just bigger
-1.2.4 1.2.3 1 # order doesn't matter
-1.2.24 1.2.3 1 # bigger, eh?
-0.10.0 0.8.7 1 # bigger, eh?
-3.2 2.3 1 # major number rocks
-1.3.2a 1.3.2 1 # letters rock
-0.5.0~git 0.5.0~git2 -1 # numbers rock
-2a 21 -1 # but not in all places
-1.3.2a 1.3.2b -1 # but there is another letter
-1:1.2.3 1.2.4 1 # epoch rocks
-1:1.2.3 1:1.2.4 -1 # bigger anyway
-1.2a+~bCd3 1.2a++ -1 # tilde doesn't rock
-1.2a+~bCd3 1.2a+~ 1 # but first is longer!
-5:2 304-2 1 # epoch rocks
-5:2 304:2 -1 # so big epoch?
-25:2 3:2 1 # 25 > 3, obviously
-1:2:123 1:12:3 -1 # 12 > 2
-1.2-5 1.2-3-5 -1 # 1.2 < 1.2-3
-5.10.0 5.005 1 # preceding zeroes don't matters
-3a9.8 3.10.2 -1 # letters are before all letter symbols
-3a9.8 3~10 1 # but after the tilde
-1.4+OOo3.0.0~ 1.4+OOo3.0.0-4 -1 # another tilde check
-2.4.7-1 2.4.7-z -1 # revision comparing
-1.002-1+b2 1.00 1 # whatever...