]> git.saurik.com Git - apt.git/blobdiff - test/libapt/srvrecs_test.cc
abort connection on '.' target replies in SRV
[apt.git] / test / libapt / srvrecs_test.cc
index 7e43cc7572249313010bf44f3d7fee96e55c84a2..5253b1c34c1c510c0987d546b5976fa7a3144954 100644 (file)
@@ -1,33 +1,83 @@
 #include <config.h>
 
 #include <apt-pkg/srvrec.h>
 #include <config.h>
 
 #include <apt-pkg/srvrec.h>
+#include <apt-pkg/strutl.h>
 
 
-#include <string>
+#include <algorithm>
 #include <iostream>
 #include <iostream>
+#include <string>
 
 #include <gtest/gtest.h>
 
 TEST(SrvRecTest, PopFromSrvRecs)
 {
 
 #include <gtest/gtest.h>
 
 TEST(SrvRecTest, PopFromSrvRecs)
 {
-   // the PopFromSrvRecs() is using a random number so we must
-   // run it a bunch of times to ensure we are not fooled by randomness
-   std::set<std::string> selected;
-   for(int i=0;i<100;i++)
+   std::vector<SrvRec> Meep;
+   Meep.emplace_back("foo", 20, 0, 80);
+   Meep.emplace_back("bar", 20, 0, 80);
+   Meep.emplace_back("baz", 30, 0, 80);
+
+   EXPECT_EQ(Meep.size(), 3);
+   SrvRec const result = PopFromSrvRecs(Meep);
+   // ensure that pop removed one element
+   EXPECT_EQ(Meep.size(), 2);
+   EXPECT_NE(result.target, "baz");
+
+   SrvRec const result2 = PopFromSrvRecs(Meep);
+   EXPECT_NE(result.target, result2.target);
+   EXPECT_NE(result2.target, "baz");
+   EXPECT_EQ(Meep.size(), 1);
+
+   SrvRec const result3 = PopFromSrvRecs(Meep);
+   EXPECT_EQ(result3.target, "baz");
+   EXPECT_TRUE(Meep.empty());
+}
+
+TEST(SrvRecTest,Randomness)
+{
+   constexpr unsigned int testLength = 100;
+   std::vector<SrvRec> base1;
+   std::vector<SrvRec> base2;
+   std::vector<SrvRec> base3;
+   for (unsigned int i = 0; i < testLength; ++i)
    {
    {
-      std::vector<SrvRec> Meep;
-      SrvRec foo = {target:"foo", priority: 20, weight: 0, port: 80};
-      Meep.push_back(foo);
-      
-      SrvRec bar = {target:"bar", priority: 20, weight: 0, port: 80};
-      Meep.push_back(bar);
-
-      EXPECT_EQ(Meep.size(), 2);
-      SrvRec result = PopFromSrvRecs(Meep);
-      selected.insert(result.target);
-      // ensure that pop removed one element
-      EXPECT_EQ(Meep.size(), 1);
+      std::string name;
+      strprintf(name, "foo%d", i);
+      base1.emplace_back(name, 20, 0, 80);
+      base2.emplace_back(name, 20, 0, 80);
+      base3.emplace_back(name, 30, 0, 80);
    }
    }
+   EXPECT_EQ(testLength, base1.size());
+   EXPECT_EQ(testLength, base2.size());
+   EXPECT_EQ(testLength, base3.size());
+   std::move(base3.begin(), base3.end(), std::back_inserter(base2));
+   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));
+   EXPECT_FALSE(base2.empty());
+   EXPECT_FALSE(second_pull.empty());
+   EXPECT_EQ(testLength, second_pull.size());
+
+   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; }));
+   if (startingClock != -1 && startingClock != clock())
+      EXPECT_FALSE(std::equal(first_pull.begin(), first_pull.end(), second_pull.begin()));
 
 
-   // ensure that after enough runs we end up with both selected
-   EXPECT_EQ(selected.size(), 2);
+   EXPECT_TRUE(std::all_of(base2.begin(), base2.end(), [](SrvRec const &R) { return R.priority == 30; }));
 }
 }