summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2016-08-12 10:02:28 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2016-08-12 11:12:10 +0200
commit379a36f43d3f4db4afa5ad4fb6f79b89824c999c (patch)
tree03820e0718fe0b888581c1738a61c2c6eba229c2
parent1cb047079aa2c26a8159d100348b7e69a49bc117 (diff)
ensure a good clock() value for usage and tests
We use clock() as a very cheap way of getting a "random" value, but the manpage warns that this could return -1, so we should be dealing with this. Additionally, e.g. on hurd-i386 the value increases only slowly – to slow for our fast running tests for randomness hence producing the same range in both samples, so we introduce a simple busy-wait loop (as clock is counting processor time used by the program) in the test which delays the second sample just enough making our randomness a bit more predictable.
-rw-r--r--apt-pkg/contrib/srvrec.cc2
-rw-r--r--test/libapt/srvrecs_test.cc10
2 files changed, 10 insertions, 2 deletions
diff --git a/apt-pkg/contrib/srvrec.cc b/apt-pkg/contrib/srvrec.cc
index be159bad9..327e59937 100644
--- a/apt-pkg/contrib/srvrec.cc
+++ b/apt-pkg/contrib/srvrec.cc
@@ -185,7 +185,7 @@ SrvRec PopFromSrvRecs(std::vector<SrvRec> &Recs)
[&I](SrvRec const &J) { return I->priority != J.priority; });
// clock seems random enough.
- I += clock() % std::distance(I, J);
+ I += std::max(static_cast<clock_t>(0), clock()) % std::distance(I, J);
SrvRec const selected = std::move(*I);
Recs.erase(I);
diff --git a/test/libapt/srvrecs_test.cc b/test/libapt/srvrecs_test.cc
index b3fa8102d..5253b1c34 100644
--- a/test/libapt/srvrecs_test.cc
+++ b/test/libapt/srvrecs_test.cc
@@ -53,12 +53,19 @@ TEST(SrvRecTest,Randomness)
EXPECT_EQ(testLength*2, base2.size());
std::vector<SrvRec> first_pull;
+ auto const startingClock = clock();
for (unsigned int i = 0; i < testLength; ++i)
first_pull.push_back(PopFromSrvRecs(base1));
EXPECT_TRUE(base1.empty());
EXPECT_FALSE(first_pull.empty());
EXPECT_EQ(testLength, first_pull.size());
+ // busy-wait for a cpu-clock change as we use it as "random" value
+ if (startingClock != -1)
+ for (int i = 0; i < 100000; ++i)
+ if (startingClock != clock())
+ break;
+
std::vector<SrvRec> second_pull;
for (unsigned int i = 0; i < testLength; ++i)
second_pull.push_back(PopFromSrvRecs(base2));
@@ -69,7 +76,8 @@ TEST(SrvRecTest,Randomness)
EXPECT_EQ(first_pull.size(), second_pull.size());
EXPECT_TRUE(std::all_of(first_pull.begin(), first_pull.end(), [](SrvRec const &R) { return R.priority == 20; }));
EXPECT_TRUE(std::all_of(second_pull.begin(), second_pull.end(), [](SrvRec const &R) { return R.priority == 20; }));
- EXPECT_FALSE(std::equal(first_pull.begin(), first_pull.end(), second_pull.begin()));
+ if (startingClock != -1 && startingClock != clock())
+ EXPECT_FALSE(std::equal(first_pull.begin(), first_pull.end(), second_pull.begin()));
EXPECT_TRUE(std::all_of(base2.begin(), base2.end(), [](SrvRec const &R) { return R.priority == 30; }));
}