1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
|
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
/* ######################################################################
Version Test - Simple program to run through a file and comare versions.
Each version is compared and the result is checked against an expected
result in the file. The format of the file is
a b Res
Where Res is -1, 1, 0. dpkg -D=1 --compare-versions a "<" b can be
used to determine what Res should be. # at the start of the line
is a comment and blank lines are skipped
The runner will also call dpkg --compare-versions to check if APT and
dpkg have (still) the same idea.
##################################################################### */
/*}}}*/
#include <config.h>
#include <apt-pkg/error.h>
#include <apt-pkg/debversion.h>
#include <apt-pkg/fileutl.h>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <gtest/gtest.h>
using namespace std;
static bool callDPKG(const char *val, const char *ref, const char &op) {
pid_t Process = ExecFork();
if (Process == 0)
{
const char * args[6];
args[0] = "/usr/bin/dpkg";
args[1] = "--compare-versions";
args[2] = val;
args[3] = (op == 1) ? ">>" : ( (op == 0) ? "=" : "<<");
args[4] = ref;
args[5] = 0;
execv(args[0], (char**) args);
exit(1);
}
int Ret;
waitpid(Process, &Ret, 0);
return WIFEXITED(Ret) == true && WEXITSTATUS(Ret) == 0;
}
#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 };
TEST(CompareVersionTest,Basic)
{
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");
/* 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, ".");
// */
/* 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");
// 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)
{
// "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...
// */
}
|