PR libstdc++/85494 fix failing test
authorJonathan Wakely <jwakely@redhat.com>
Wed, 29 May 2019 22:00:57 +0000 (23:00 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 29 May 2019 22:00:57 +0000 (23:00 +0100)
This test now fails on mingw-w64 because it's no longer always true that
the mt19937 engine is used when _GLIBCXX_USE_DEV_RANDOM is not defined.

Add tests for all the known tokens to ensure that at least one is
accepted.

* testsuite/26_numerics/random/random_device/cons/token.cc: Fix test
that fails on mingw-w64.

From-SVN: r271756

libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/26_numerics/random/random_device/cons/token.cc

index 2005182e92695644bbcabfcfe9b084bdc7c23094..4543aea7f3724767697c74e2f7e379e4a3a7fc24 100644 (file)
@@ -1,5 +1,9 @@
 2019-05-29  Jonathan Wakely  <jwakely@redhat.com>
 
+       PR libstdc++/85494
+       * testsuite/26_numerics/random/random_device/cons/token.cc: Fix test
+       that fails on mingw-w64.
+
        PR libstdc++/88881
        * src/c++17/fs_ops.cc [_GLIBCXX_FILESYSTEM_IS_WINDOWS]
        (status(const path&, error_code&)): Use parent_path() to remove
index c1f3963e57d3d0bb3f4dce832917ef3fb89d4af3..cf5e81edd7b2460a87efbcef772a6543e213c2d0 100644 (file)
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-// 26.4.6 class random_device [rand.device]
-// 26.4.6 [3]
+// C++11 26.5.6 class random_device [rand.device]
 
 #include <random>
+#include <stdexcept>
 #include <testsuite_hooks.h>
 
 void
 test01()
 {
-#ifdef _GLIBCXX_USE_DEV_RANDOM
-  std::random_device x("/dev/random");
-#else
-  std::random_device x("0");
-#endif
+  std::random_device x("default");
 
   VERIFY( x.min() == std::numeric_limits<std::random_device::result_type>::min() );
   VERIFY( x.max() == std::numeric_limits<std::random_device::result_type>::max() );
+
+}
+
+void
+test02()
+{
+#ifdef _GLIBCXX_USE_DEV_RANDOM
+  std::random_device x1("/dev/urandom");
+  std::random_device x2("/dev/random");
+#endif
+}
+
+void
+test03()
+{
+  // At least one of these tokens should be valid.
+  const std::string tokens[] = {
+    "rdseed", "rdrand", "rand_s", "/dev/urandom", "/dev/random", "mt19337"
+  };
+  int count = 0;
+  for (const std::string& token : tokens)
+  {
+    try
+    {
+      std::random_device x(token);
+      ++count;
+    }
+    catch (const std::runtime_error&)
+    {
+    }
+  }
+  VERIFY( count != 0 );
+}
+
+void
+test04()
+{
+  bool can_use_mt19937 = true;
+  try
+  {
+    std::random_device x("mt19937");
+  }
+  catch (const std::runtime_error&)
+  {
+    can_use_mt19937 = false;
+  }
+
+  // If "mt19337" is a valid token then numeric seeds should be too.
+  if (can_use_mt19937)
+  {
+    std::random_device x1("0");
+    std::random_device x2("1234");
+    std::random_device x3("0xc0fefe");
+  }
 }
 
 int main()
 {
   test01();
-  return 0;
+  test02();
+  test03();
+  test04();
 }