Fix data races related with traces in bitrate estimator test.

BUG=3549
R=pbos@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/16019004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@6609 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
andresp@webrtc.org 2014-07-07 08:50:48 +00:00
parent bd249bc711
commit b941fe8098

View File

@ -27,6 +27,92 @@
#include "webrtc/test/frame_generator_capturer.h"
namespace webrtc {
namespace {
// Note: consider to write tests that don't depend on the trace system instead
// of re-using this class.
class TraceObserver {
public:
TraceObserver() {
Trace::set_level_filter(kTraceTerseInfo);
Trace::CreateTrace();
Trace::SetTraceCallback(&callback_);
// Call webrtc trace to initialize the tracer that would otherwise trigger a
// data-race if left to be initialized by multiple threads (i.e. threads
// spawned by test::DirectTransport members in BitrateEstimatorTest).
WEBRTC_TRACE(kTraceStateInfo,
kTraceUtility,
-1,
"Instantiate without data races.");
}
~TraceObserver() {
Trace::SetTraceCallback(NULL);
Trace::ReturnTrace();
}
void PushExpectedLogLine(const std::string& expected_log_line) {
callback_.PushExpectedLogLine(expected_log_line);
}
EventTypeWrapper Wait() {
return callback_.Wait();
}
private:
class Callback : public TraceCallback {
public:
Callback()
: crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
done_(EventWrapper::Create()) {}
virtual void Print(TraceLevel level,
const char* message,
int length) OVERRIDE {
CriticalSectionScoped lock(crit_sect_.get());
std::string msg(message);
if (msg.find("BitrateEstimator") != std::string::npos) {
received_log_lines_.push_back(msg);
}
int num_popped = 0;
while (!received_log_lines_.empty() && !expected_log_lines_.empty()) {
std::string a = received_log_lines_.front();
std::string b = expected_log_lines_.front();
received_log_lines_.pop_front();
expected_log_lines_.pop_front();
num_popped++;
EXPECT_TRUE(a.find(b) != std::string::npos);
}
if (expected_log_lines_.size() <= 0) {
if (num_popped > 0) {
done_->Set();
}
return;
}
}
EventTypeWrapper Wait() {
return done_->Wait(test::CallTest::kDefaultTimeoutMs);
}
void PushExpectedLogLine(const std::string& expected_log_line) {
CriticalSectionScoped lock(crit_sect_.get());
expected_log_lines_.push_back(expected_log_line);
}
private:
typedef std::list<std::string> Strings;
const scoped_ptr<CriticalSectionWrapper> crit_sect_;
Strings received_log_lines_ GUARDED_BY(crit_sect_);
Strings expected_log_lines_ GUARDED_BY(crit_sect_);
scoped_ptr<EventWrapper> done_;
};
Callback callback_;
};
} // namespace
static const int kTOFExtensionId = 4;
static const int kASTExtensionId = 5;
@ -48,11 +134,6 @@ class BitrateEstimatorTest : public test::CallTest {
}
virtual void SetUp() {
Trace::CreateTrace();
Trace::SetTraceCallback(&receiver_trace_);
// Reduce the chance that spurious traces will ruin the test.
Trace::set_level_filter(kTraceTerseInfo);
Call::Config receiver_call_config(&receive_transport_);
receiver_call_.reset(Call::Create(receiver_call_config));
@ -97,63 +178,11 @@ class BitrateEstimatorTest : public test::CallTest {
}
receiver_call_.reset();
Trace::SetTraceCallback(NULL);
Trace::ReturnTrace();
}
protected:
friend class Stream;
class TraceObserver : public TraceCallback {
public:
TraceObserver()
: crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
received_log_lines_(),
expected_log_lines_(),
done_(EventWrapper::Create()) {
}
void PushExpectedLogLine(const std::string& expected_log_line) {
CriticalSectionScoped lock(crit_sect_.get());
expected_log_lines_.push_back(expected_log_line);
}
virtual void Print(TraceLevel level,
const char* message,
int length) OVERRIDE {
CriticalSectionScoped lock(crit_sect_.get());
std::string msg(message);
if (msg.find("BitrateEstimator") != std::string::npos) {
received_log_lines_.push_back(msg);
}
int num_popped = 0;
while (!received_log_lines_.empty() && !expected_log_lines_.empty()) {
std::string a = received_log_lines_.front();
std::string b = expected_log_lines_.front();
received_log_lines_.pop_front();
expected_log_lines_.pop_front();
num_popped++;
EXPECT_TRUE(a.find(b) != std::string::npos);
}
if (expected_log_lines_.size() <= 0) {
if (num_popped > 0) {
done_->Set();
}
return;
}
}
EventTypeWrapper Wait() { return done_->Wait(kDefaultTimeoutMs); }
private:
typedef std::list<std::string> Strings;
const scoped_ptr<CriticalSectionWrapper> crit_sect_;
Strings received_log_lines_ GUARDED_BY(crit_sect_);
Strings expected_log_lines_ GUARDED_BY(crit_sect_);
scoped_ptr<EventWrapper> done_;
};
class Stream {
public:
explicit Stream(BitrateEstimatorTest* test)