blob: e143c8aa1c4200dedbf8e3a604aba1ee639b390a [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/media/framework/test/test_base.h"
#include "services/media/framework/util/incident.h"
namespace mojo {
namespace media {
namespace {
class IncidentTest : public TestBase {};
// Tests whether Incident::Occur and Incident::Reset have the right effect on
// Incident::occurred.
TEST_F(IncidentTest, Basics) {
Incident under_test;
EXPECT_FALSE(under_test.occurred());
under_test.Occur();
EXPECT_TRUE(under_test.occurred());
under_test.Reset();
EXPECT_FALSE(under_test.occurred());
// Incident::Run does the same thing as Incident::Occur.
under_test.Run();
EXPECT_TRUE(under_test.occurred());
under_test.Reset();
EXPECT_FALSE(under_test.occurred());
}
// Tests whether a consequence registered with Incident::When runs only after
// Incident::Occur is called.
TEST_F(IncidentTest, When_Delayed) {
Incident under_test;
// These two together should be a no-op.
under_test.Occur();
under_test.Reset();
bool consequence_ran = false;
under_test.When([&consequence_ran]() { consequence_ran = true; });
EXPECT_FALSE(consequence_ran);
under_test.Occur();
EXPECT_TRUE(consequence_ran);
}
// Tests whether a consequence registered with Incident::When runs immediately
// when Incident::Occur was called first.
TEST_F(IncidentTest, When_Immediate) {
Incident under_test;
under_test.Occur();
bool consequence_ran = false;
under_test.When([&consequence_ran]() { consequence_ran = true; });
EXPECT_TRUE(consequence_ran);
}
// Tests whether a consequence registered with Incident::When runs
// Incident::Reset is called before Incident::Occur (it shouldn't).
TEST_F(IncidentTest, When_Reset) {
Incident under_test;
bool consequence_ran = false;
under_test.When([&consequence_ran]() { consequence_ran = true; });
EXPECT_FALSE(consequence_ran);
under_test.Reset();
EXPECT_FALSE(consequence_ran);
under_test.Occur();
EXPECT_FALSE(consequence_ran);
}
// Tests whether a consequences registered with Incident::When run in the
// correct order.
TEST_F(IncidentTest, When_Order) {
Incident under_test;
int sequence_counter = 0;
under_test.When([&sequence_counter]() { EXPECT_EQ(0, sequence_counter++); });
under_test.When([&sequence_counter]() { EXPECT_EQ(1, sequence_counter++); });
under_test.When([&sequence_counter]() { EXPECT_EQ(2, sequence_counter++); });
under_test.When([&sequence_counter]() { EXPECT_EQ(3, sequence_counter++); });
under_test.Occur();
under_test.When([&sequence_counter]() { EXPECT_EQ(4, sequence_counter++); });
under_test.When([&sequence_counter]() { EXPECT_EQ(5, sequence_counter++); });
under_test.When([&sequence_counter]() { EXPECT_EQ(6, sequence_counter++); });
under_test.When([&sequence_counter]() { EXPECT_EQ(7, sequence_counter++); });
EXPECT_EQ(8, sequence_counter);
}
// Tests whether a consequence registered with Incident::When runs when
// Incident::Occur is never called and the Incident is deleted (it shouldn't).
TEST_F(IncidentTest, When_After_Delete) {
bool consequence_ran = false;
{
Incident under_test;
under_test.When([&consequence_ran]() { consequence_ran = true; });
}
EXPECT_FALSE(consequence_ran);
}
class ThreadsafeIncidentTest : public TestBase {};
// Tests whether ThreadsafeIncident::Occur and ThreadsafeIncident::Reset have
// the right effect on ThreadsafeIncident::occurred.
TEST_F(ThreadsafeIncidentTest, Basics) {
ThreadsafeIncident under_test;
EXPECT_FALSE(under_test.occurred());
under_test.Occur();
EXPECT_TRUE(under_test.occurred());
under_test.Reset();
EXPECT_FALSE(under_test.occurred());
// ThreadsafeIncident::Run does the same thing as ThreadsafeIncident::Occur.
under_test.Run();
EXPECT_TRUE(under_test.occurred());
under_test.Reset();
EXPECT_FALSE(under_test.occurred());
}
// Tests whether a consequence registered with ThreadsafeIncident::When runs
// only after ThreadsafeIncident::Occur is called.
TEST_F(ThreadsafeIncidentTest, When_Delayed) {
ThreadsafeIncident under_test;
// These two together should be a no-op.
under_test.Occur();
under_test.Reset();
bool consequence_ran = false;
under_test.When([&consequence_ran]() { consequence_ran = true; });
EXPECT_FALSE(consequence_ran);
under_test.Occur();
EXPECT_TRUE(consequence_ran);
}
// Tests whether a consequence registered with ThreadsafeIncident::When runs
// immediately when ThreadsafeIncident::Occur was called first.
TEST_F(ThreadsafeIncidentTest, When_Immediate) {
ThreadsafeIncident under_test;
under_test.Occur();
bool consequence_ran = false;
under_test.When([&consequence_ran]() { consequence_ran = true; });
EXPECT_TRUE(consequence_ran);
}
// Tests whether a consequence registered with ThreadsafeIncident::When runs
// ThreadsafeIncident::Reset is called before ThreadsafeIncident::Occur (it
// shouldn't).
TEST_F(ThreadsafeIncidentTest, When_Reset) {
ThreadsafeIncident under_test;
bool consequence_ran = false;
under_test.When([&consequence_ran]() { consequence_ran = true; });
EXPECT_FALSE(consequence_ran);
under_test.Reset();
EXPECT_FALSE(consequence_ran);
under_test.Occur();
EXPECT_FALSE(consequence_ran);
}
// Tests whether a consequences registered with ThreadsafeIncident::When run in
// the correct order.
TEST_F(ThreadsafeIncidentTest, When_Order) {
ThreadsafeIncident under_test;
int sequence_counter = 0;
under_test.When([&sequence_counter]() { EXPECT_EQ(0, sequence_counter++); });
under_test.When([&sequence_counter]() { EXPECT_EQ(1, sequence_counter++); });
under_test.When([&sequence_counter]() { EXPECT_EQ(2, sequence_counter++); });
under_test.When([&sequence_counter]() { EXPECT_EQ(3, sequence_counter++); });
under_test.Occur();
under_test.When([&sequence_counter]() { EXPECT_EQ(4, sequence_counter++); });
under_test.When([&sequence_counter]() { EXPECT_EQ(5, sequence_counter++); });
under_test.When([&sequence_counter]() { EXPECT_EQ(6, sequence_counter++); });
under_test.When([&sequence_counter]() { EXPECT_EQ(7, sequence_counter++); });
EXPECT_EQ(8, sequence_counter);
}
// Tests whether a consequence registered with ThreadsafeIncident::When runs
// when ThreadsafeIncident::Occur is never called and the ThreadsafeIncident is
// deleted (it shouldn't).
TEST_F(ThreadsafeIncidentTest, When_After_Delete) {
bool consequence_ran = false;
{
ThreadsafeIncident under_test;
under_test.When([&consequence_ran]() { consequence_ran = true; });
}
EXPECT_FALSE(consequence_ran);
}
} // namespace
} // namespace media
} // namespace mojo