blob: 8181b205b9f29a9875e88cdceb5899e97a23d072 [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 <src/lib/fxl/logging.h>
#include "garnet/bin/trace_manager/tests/trace_manager_test.h"
namespace tracing {
namespace test {
using SessionState = TraceManagerTest::SessionState;
TEST_F(TraceManagerTest, StopUninitialize) {
// There's no error result. Mostly we want to verify we don't crash/hang.
ConnectToControllerService();
controller::StopOptions stop_options{GetDefaultStopOptions()};
bool stop_completed = false;
controller()->StopTracing(std::move(stop_options), [this, &stop_completed]() {
stop_completed = true;
QuitLoop();
});
RunLoopUntilIdle();
FX_VLOGS(2) << "Loop done";
EXPECT_TRUE(stop_completed);
}
template <typename T>
void TryExtraStop(TraceManagerTest* fixture, const T& interface_ptr) {
controller::StopOptions stop_options{fixture->GetDefaultStopOptions()};
bool stop_completed = false;
interface_ptr->StopTracing(std::move(stop_options), [fixture, &stop_completed]() {
stop_completed = true;
fixture->QuitLoop();
});
fixture->RunLoopUntilIdle();
FX_VLOGS(2) << "Loop done, expecting session still stopped";
EXPECT_TRUE(stop_completed);
EXPECT_EQ(fixture->GetSessionState(), SessionState::kStopped);
}
TEST_F(TraceManagerTest, ExtraStop) {
ConnectToControllerService();
EXPECT_TRUE(AddFakeProvider(kProvider1Pid, kProvider1Name));
ASSERT_TRUE(InitializeSession());
ASSERT_TRUE(StartSession());
ASSERT_TRUE(StopSession());
// Now try stopping again.
// There's no error result. Mostly we want to verify we don't crash/hang.
TryExtraStop(this, controller());
}
TEST_F(TraceManagerTest, StopWhileStopping) {
ConnectToControllerService();
FakeProvider* provider;
EXPECT_TRUE(AddFakeProvider(kProvider1Pid, kProvider1Name, &provider));
ASSERT_TRUE(InitializeSession());
ASSERT_TRUE(StartSession());
controller::StopOptions stop1_options{GetDefaultStopOptions()};
controller()->StopTracing(std::move(stop1_options), []() {});
RunLoopUntilIdle();
// The loop will exit for the transition to kStopping.
FX_VLOGS(2) << "Loop done, expecting session stopping";
EXPECT_EQ(GetSessionState(), SessionState::kStopping);
// Now try another Stop while we're still in |kStopping|.
// The provider doesn't advance state until we tell it to, so we should
// still remain in |kStopping|.
controller::StopOptions stop2_options{GetDefaultStopOptions()};
bool stop_completed = false;
controller()->StopTracing(std::move(stop2_options), [this, &stop_completed]() {
stop_completed = true;
QuitLoop();
});
RunLoopUntilIdle();
FX_VLOGS(2) << "Stop loop done";
EXPECT_TRUE(stop_completed);
EXPECT_TRUE(GetSessionState() == SessionState::kStopping);
}
TEST_F(TraceManagerTest, StopWhileTerminating) {
ConnectToControllerService();
EXPECT_TRUE(AddFakeProvider(kProvider1Pid, kProvider1Name));
ASSERT_TRUE(InitializeSession());
ASSERT_TRUE(StartSession());
ASSERT_TRUE(StopSession());
controller::TerminateOptions options{GetDefaultTerminateOptions()};
controller()->TerminateTracing(std::move(options), [](controller::TerminateResult result) {});
RunLoopUntilIdle();
ASSERT_EQ(GetSessionState(), SessionState::kTerminating);
// Now try a Stop while we're still in |kTerminating|.
// The provider doesn't advance state until we tell it to, so we should
// still remain in |kTerminating|.
controller::StopOptions stop_options{GetDefaultStopOptions()};
bool stop_completed = false;
controller()->StopTracing(std::move(stop_options), [this, &stop_completed]() {
stop_completed = true;
QuitLoop();
});
RunLoopUntilIdle();
FX_VLOGS(2) << "Stop loop done";
EXPECT_TRUE(stop_completed);
EXPECT_TRUE(GetSessionState() == SessionState::kTerminating);
}
} // namespace test
} // namespace tracing