]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/test/test/test-organization-ts/test_unit-order-shuffled-test.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / test / test / test-organization-ts / test_unit-order-shuffled-test.cpp
CommitLineData
7c673cae
FG
1// (C) Copyright Raffi Enficiaud 2016.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at
4// http://www.boost.org/LICENSE_1_0.txt)
5
6// See http://www.boost.org/libs/test for the library home page.
7//
8/// @file
9/// @brief tests order of the running unit tests under shuffling
10// ***************************************************************************
11
12// Boost.Test
13#define BOOST_TEST_MODULE test unit order shuffled test
14#include <boost/test/included/unit_test.hpp>
15#include <boost/test/unit_test_log.hpp>
16#include <boost/test/tree/visitor.hpp>
17#include <boost/test/utils/string_cast.hpp>
18
19#include <boost/test/utils/nullstream.hpp>
20typedef boost::onullstream onullstream_type;
21namespace ut = boost::unit_test;
22namespace tt = boost::test_tools;
23
24#include <cstddef>
25#include <iostream>
26
27//____________________________________________________________________________//
28
29void some_test() {}
30#define TC( name ) \
31boost::unit_test::make_test_case( boost::function<void ()>(some_test), \
32 BOOST_TEST_STRINGIZE( name ), \
33 __FILE__, __LINE__ )
34
35//____________________________________________________________________________//
36
37struct tu_order_collector : ut::test_observer {
38 virtual void test_unit_start( ut::test_unit const& tu )
39 {
40 //std::cout << "## TU: " << tu.full_name() << std::endl;
41 m_order.push_back( tu.p_id );
42 }
43
44 std::vector<ut::test_unit_id> m_order;
45};
46
47//____________________________________________________________________________//
48
49static tu_order_collector
50run_tree( ut::test_suite* master )
51{
52 std::cout << "## TU: START" << std::endl;
53 tu_order_collector c;
54 ut::framework::register_observer( c );
55
56 master->p_default_status.value = ut::test_unit::RS_ENABLED;
57 ut::framework::finalize_setup_phase( master->p_id );
58 ut::framework::impl::setup_for_execution( *master );
59
60 onullstream_type null_output;
61 ut::unit_test_log.set_stream( null_output );
62
63 ut::framework::run( master );
64 ut::unit_test_log.set_stream( std::cout );
65
66 ut::framework::deregister_observer( c );
67
68 return c;
69}
70
71//____________________________________________________________________________//
72
73struct test_tree {
74 test_tree() {
75 master = BOOST_TEST_SUITE( "master" );
76
77 std::size_t nb_ts = (std::max)(3, std::rand() % 17);
78 std::vector<ut::test_suite*> tsuites(1, master); // master is in there
79
80 for(std::size_t s = 0; s < nb_ts; s++)
81 {
82 tsuites.push_back(BOOST_TEST_SUITE( "ts1_" + boost::unit_test::utils::string_cast(s)));
83 master->add( tsuites.back() );
84 }
85
86 std::size_t nb_ts2 = (std::max)(3, std::rand() % 11);
87 for(std::size_t s = 0; s < nb_ts2; s++)
88 {
89 tsuites.push_back(BOOST_TEST_SUITE( "ts2_" + boost::unit_test::utils::string_cast(s)));
90 tsuites[std::rand() % nb_ts]->add( tsuites.back() ); // picking a random one in the first level
91 }
92
93 // generating N tests units, associating them to an aribtrary test suite
94 for(std::size_t s = 0; s < 10; s++)
95 {
96 ut::test_case* tc = boost::unit_test::make_test_case(
97 boost::function<void ()>(some_test),
98 "tc_" + boost::unit_test::utils::string_cast(s),
99 __FILE__, __LINE__ );
100 tsuites[std::rand() % tsuites.size()]->add(tc);
101 }
102
103 }
104
105 ut::test_suite* master;
106};
107
108//____________________________________________________________________________//
109BOOST_FIXTURE_TEST_CASE( test_no_seed, test_tree )
110{
111 // no seed set
b32b8144 112 ut::runtime_config::s_arguments_store.set<unsigned int>(ut::runtime_config::btrt_random_seed, 0);
7c673cae
FG
113
114 tu_order_collector res1 = run_tree( master );
115 tu_order_collector res2 = run_tree( master );
116
117 BOOST_TEST( res1.m_order == res2.m_order, tt::per_element() );
118}
119
120BOOST_FIXTURE_TEST_CASE( test_seed_to_time, test_tree )
121{
122 // seed = 1 means current time is used.
b32b8144 123 ut::runtime_config::s_arguments_store.set<unsigned int>(ut::runtime_config::btrt_random_seed, 1);
7c673cae
FG
124
125 tu_order_collector res1 = run_tree( master );
126 tu_order_collector res2 = run_tree( master );
127
128 BOOST_TEST( res1.m_order != res2.m_order ); // some elements might be the same, but not the full sequences
129}
130
131BOOST_FIXTURE_TEST_CASE( test_seed_identical, test_tree )
132{
133 // seed = 1 means current time is used.
134 unsigned int seed = static_cast<unsigned int>( std::time( 0 ) );
b32b8144 135 ut::runtime_config::s_arguments_store.set<unsigned int>(ut::runtime_config::btrt_random_seed, seed);
7c673cae
FG
136 tu_order_collector res1 = run_tree( master );
137
b32b8144 138 ut::runtime_config::s_arguments_store.set<unsigned int>(ut::runtime_config::btrt_random_seed, seed);
7c673cae
FG
139 tu_order_collector res2 = run_tree( master );
140
141 BOOST_TEST( res1.m_order == res2.m_order, tt::per_element() );
142
143 // using time seed now
b32b8144 144 ut::runtime_config::s_arguments_store.set<unsigned int>(ut::runtime_config::btrt_random_seed, 1);
7c673cae
FG
145 tu_order_collector res3 = run_tree( master );
146 BOOST_TEST( res1.m_order != res3.m_order ); // some elements might be the same, but not the full sequences
147
148
149}