You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
2.2 KiB

// License: Apache 2.0. See LICENSE file in root directory.
// Copyright(c) 2020 Intel Corporation. All Rights Reserved.
//#cmake:dependencies rsutils
#include <thread>
#include <chrono>
#include <unit-tests/test.h>
#include <rsutils/number/stabilized-value.h>
using namespace rsutils::number;
// Test group description:
// * This tests group verifies stabilized_value class.
//
// Current test description:
// * Verify that the stabilized_value class is thread safe,
// We fill the history with the first value and then let 2 thread run.
// first thread add 66% of first value and the rest of second value.
// second thread sample the 60% stability value each time and verify all equal to first value
TEST_CASE( "multi-threading", "[stabilized value]" )
{
std::atomic< float > inserted_val_1 = { 20.0f };
std::atomic< float > inserted_val_2 = { 55.0f };
std::vector< float > values_vec;
stabilized_value< float > stab_value( 10 );
// Fill history with values (> 60% is 'inserted_val_1')
std::thread first( [&]() {
std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) );
for( int i = 0; i < 1000; i++ )
{
if( i <= 10 )
{
stab_value.add( inserted_val_1 );
continue;
}
if( i % 3 )
stab_value.add( inserted_val_1 );
else
stab_value.add( inserted_val_2 );
std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) );
}
} );
// Sample stabilized value
std::thread second( [&]() {
while( stab_value.empty() )
{
}
for( int i = 0; i < 1000; i++ )
{
values_vec.push_back( stab_value.get( 0.6f ) );
if( i % 10 )
std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) );
}
} );
if( first.joinable() )
first.join();
if( second.joinable() )
second.join();
// Verify that all samples show the > 60% number inserted 'inserted_val_1'
int count = 0;
for( auto val : values_vec )
if( val == inserted_val_1 )
count++;
CHECK( count == 1000 );
}