[hal,tests] Use waitForProgramStart in tests (#8429)

Change setProgramStarted to accept a boolean so it can be set back to
false by tests. This allows properly waiting for program start in tests.
This commit is contained in:
Peter Johnson
2025-11-29 10:10:01 -08:00
committed by GitHub
parent 32d3ec0218
commit a4aad63dd4
23 changed files with 84 additions and 49 deletions

View File

@@ -21,7 +21,10 @@ inline constexpr auto kPeriod = 20_ms;
namespace {
class TimedRobotTest : public ::testing::Test {
protected:
void SetUp() override { wpi::sim::PauseTiming(); }
void SetUp() override {
wpi::sim::PauseTiming();
wpi::sim::SetProgramStarted(false);
}
void TearDown() override { wpi::sim::ResumeTiming(); }
};
@@ -84,10 +87,10 @@ TEST_F(TimedRobotTest, DisabledMode) {
MockRobot robot;
std::thread robotThread{[&] { robot.StartCompetition(); }};
wpi::sim::WaitForProgramStart();
wpi::sim::DriverStationSim::SetEnabled(false);
wpi::sim::DriverStationSim::NotifyNewData();
wpi::sim::StepTiming(0_ms); // Wait for Notifiers
EXPECT_EQ(1u, robot.m_simulationInitCount);
EXPECT_EQ(0u, robot.m_disabledInitCount);
@@ -155,12 +158,12 @@ TEST_F(TimedRobotTest, AutonomousMode) {
MockRobot robot;
std::thread robotThread{[&] { robot.StartCompetition(); }};
wpi::sim::WaitForProgramStart();
wpi::sim::DriverStationSim::SetEnabled(true);
wpi::sim::DriverStationSim::SetAutonomous(true);
wpi::sim::DriverStationSim::SetTest(false);
wpi::sim::DriverStationSim::NotifyNewData();
wpi::sim::StepTiming(0_ms); // Wait for Notifiers
EXPECT_EQ(1u, robot.m_simulationInitCount);
EXPECT_EQ(0u, robot.m_disabledInitCount);
@@ -228,12 +231,12 @@ TEST_F(TimedRobotTest, TeleopMode) {
MockRobot robot;
std::thread robotThread{[&] { robot.StartCompetition(); }};
wpi::sim::WaitForProgramStart();
wpi::sim::DriverStationSim::SetEnabled(true);
wpi::sim::DriverStationSim::SetAutonomous(false);
wpi::sim::DriverStationSim::SetTest(false);
wpi::sim::DriverStationSim::NotifyNewData();
wpi::sim::StepTiming(0_ms); // Wait for Notifiers
EXPECT_EQ(1u, robot.m_simulationInitCount);
EXPECT_EQ(0u, robot.m_disabledInitCount);
@@ -300,12 +303,12 @@ TEST_F(TimedRobotTest, TeleopMode) {
TEST_F(TimedRobotTest, TestMode) {
MockRobot robot;
std::thread robotThread{[&] { robot.StartCompetition(); }};
wpi::sim::WaitForProgramStart();
wpi::sim::DriverStationSim::SetEnabled(true);
wpi::sim::DriverStationSim::SetAutonomous(false);
wpi::sim::DriverStationSim::SetTest(true);
wpi::sim::DriverStationSim::NotifyNewData();
wpi::sim::StepTiming(0_ms); // Wait for Notifiers
EXPECT_EQ(1u, robot.m_simulationInitCount);
EXPECT_EQ(0u, robot.m_disabledInitCount);
@@ -397,13 +400,13 @@ TEST_F(TimedRobotTest, ModeChange) {
MockRobot robot;
std::thread robotThread{[&] { robot.StartCompetition(); }};
wpi::sim::WaitForProgramStart();
// Start in disabled
wpi::sim::DriverStationSim::SetEnabled(false);
wpi::sim::DriverStationSim::SetAutonomous(false);
wpi::sim::DriverStationSim::SetTest(false);
wpi::sim::DriverStationSim::NotifyNewData();
wpi::sim::StepTiming(0_ms); // Wait for Notifiers
EXPECT_EQ(0u, robot.m_disabledInitCount);
EXPECT_EQ(0u, robot.m_autonomousInitCount);
@@ -510,10 +513,10 @@ TEST_F(TimedRobotTest, AddPeriodic) {
robot.AddPeriodic([&] { callbackCount++; }, kPeriod / 2.0);
std::thread robotThread{[&] { robot.StartCompetition(); }};
wpi::sim::WaitForProgramStart();
wpi::sim::DriverStationSim::SetEnabled(false);
wpi::sim::DriverStationSim::NotifyNewData();
wpi::sim::StepTiming(0_ms); // Wait for Notifiers
EXPECT_EQ(0u, robot.m_disabledInitCount);
EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
@@ -549,10 +552,10 @@ TEST_F(TimedRobotTest, AddPeriodicWithOffset) {
// 2p | 1.25p
std::thread robotThread{[&] { robot.StartCompetition(); }};
wpi::sim::WaitForProgramStart();
wpi::sim::DriverStationSim::SetEnabled(false);
wpi::sim::DriverStationSim::NotifyNewData();
wpi::sim::StepTiming(0_ms); // Wait for Notifiers
EXPECT_EQ(0u, robot.m_disabledInitCount);
EXPECT_EQ(0u, robot.m_disabledPeriodicCount);

View File

@@ -19,7 +19,10 @@ using namespace wpi;
namespace {
class TimesliceRobotTest : public ::testing::Test {
protected:
void SetUp() override { wpi::sim::PauseTiming(); }
void SetUp() override {
wpi::sim::PauseTiming();
wpi::sim::SetProgramStarted(false);
}
void TearDown() override { wpi::sim::ResumeTiming(); }
};
@@ -51,10 +54,10 @@ TEST_F(TimesliceRobotTest, Schedule) {
robot.Schedule([&] { callbackCount2++; }, 1_ms);
std::thread robotThread{[&] { robot.StartCompetition(); }};
wpi::sim::WaitForProgramStart();
wpi::sim::DriverStationSim::SetEnabled(false);
wpi::sim::DriverStationSim::NotifyNewData();
wpi::sim::StepTiming(0_ms); // Wait for Notifiers
// Functions scheduled with addPeriodic() are delayed by one period before
// their first run (5 ms for this test's callbacks here and 20 ms for