remove the check that data streams need to be > 0 since we have a use case of:

input_stream: "ALLOW:"
output_stream: "STATE_CHANGE"
PiperOrigin-RevId: 519891414
This commit is contained in:
MediaPipe Team 2023-03-27 19:12:12 -07:00 committed by Copybara-Service
parent 5f8831660f
commit 004265bbbd
2 changed files with 63 additions and 1 deletions

View File

@ -125,7 +125,6 @@ class GateCalculator : public CalculatorBase {
RET_CHECK_OK(CheckAndInitAllowDisallowInputs(cc)); RET_CHECK_OK(CheckAndInitAllowDisallowInputs(cc));
const int num_data_streams = cc->Inputs().NumEntries(""); const int num_data_streams = cc->Inputs().NumEntries("");
RET_CHECK_GE(num_data_streams, 1);
RET_CHECK_EQ(cc->Outputs().NumEntries(""), num_data_streams) RET_CHECK_EQ(cc->Outputs().NumEntries(""), num_data_streams)
<< "Number of data output streams must match with data input streams."; << "Number of data output streams must match with data input streams.";

View File

@ -52,6 +52,15 @@ class GateCalculatorTest : public ::testing::Test {
MP_ASSERT_OK(runner_->Run()) << "Calculator execution failed."; MP_ASSERT_OK(runner_->Run()) << "Calculator execution failed.";
} }
void RunTimeStepWithoutDataStream(int64_t timestamp,
const std::string& control_tag,
bool control) {
runner_->MutableInputs()
->Tag(control_tag)
.packets.push_back(MakePacket<bool>(control).At(Timestamp(timestamp)));
MP_ASSERT_OK(runner_->Run()) << "Calculator execution failed.";
}
void SetRunner(const std::string& proto) { void SetRunner(const std::string& proto) {
runner_ = absl::make_unique<CalculatorRunner>( runner_ = absl::make_unique<CalculatorRunner>(
ParseTextProtoOrDie<CalculatorGraphConfig::Node>(proto)); ParseTextProtoOrDie<CalculatorGraphConfig::Node>(proto));
@ -332,6 +341,35 @@ TEST_F(GateCalculatorTest, AllowWithStateChange) {
EXPECT_EQ(false, output[1].Get<bool>()); // Disallow. EXPECT_EQ(false, output[1].Get<bool>()); // Disallow.
} }
TEST_F(GateCalculatorTest, AllowWithStateChangeNoDataStreams) {
SetRunner(R"(
calculator: "GateCalculator"
input_stream: "ALLOW:gating_stream"
output_stream: "STATE_CHANGE:state_changed"
)");
constexpr int64_t kTimestampValue0 = 42;
RunTimeStepWithoutDataStream(kTimestampValue0, "ALLOW", false);
constexpr int64_t kTimestampValue1 = 43;
RunTimeStepWithoutDataStream(kTimestampValue1, "ALLOW", true);
constexpr int64_t kTimestampValue2 = 44;
RunTimeStepWithoutDataStream(kTimestampValue2, "ALLOW", true);
constexpr int64_t kTimestampValue3 = 45;
RunTimeStepWithoutDataStream(kTimestampValue3, "ALLOW", false);
LOG(INFO) << "a";
const std::vector<Packet>& output =
runner()->Outputs().Get("STATE_CHANGE", 0).packets;
LOG(INFO) << "s";
ASSERT_EQ(2, output.size());
LOG(INFO) << "d";
EXPECT_EQ(kTimestampValue1, output[0].Timestamp().Value());
EXPECT_EQ(kTimestampValue3, output[1].Timestamp().Value());
LOG(INFO) << "f";
EXPECT_EQ(true, output[0].Get<bool>()); // Allow.
EXPECT_EQ(false, output[1].Get<bool>()); // Disallow.
LOG(INFO) << "g";
}
TEST_F(GateCalculatorTest, DisallowWithStateChange) { TEST_F(GateCalculatorTest, DisallowWithStateChange) {
SetRunner(R"( SetRunner(R"(
calculator: "GateCalculator" calculator: "GateCalculator"
@ -359,6 +397,31 @@ TEST_F(GateCalculatorTest, DisallowWithStateChange) {
EXPECT_EQ(false, output[1].Get<bool>()); // Disallow. EXPECT_EQ(false, output[1].Get<bool>()); // Disallow.
} }
TEST_F(GateCalculatorTest, DisallowWithStateChangeNoDataStreams) {
SetRunner(R"(
calculator: "GateCalculator"
input_stream: "DISALLOW:gating_stream"
output_stream: "STATE_CHANGE:state_changed"
)");
constexpr int64_t kTimestampValue0 = 42;
RunTimeStepWithoutDataStream(kTimestampValue0, "DISALLOW", true);
constexpr int64_t kTimestampValue1 = 43;
RunTimeStepWithoutDataStream(kTimestampValue1, "DISALLOW", false);
constexpr int64_t kTimestampValue2 = 44;
RunTimeStepWithoutDataStream(kTimestampValue2, "DISALLOW", false);
constexpr int64_t kTimestampValue3 = 45;
RunTimeStepWithoutDataStream(kTimestampValue3, "DISALLOW", true);
const std::vector<Packet>& output =
runner()->Outputs().Get("STATE_CHANGE", 0).packets;
ASSERT_EQ(2, output.size());
EXPECT_EQ(kTimestampValue1, output[0].Timestamp().Value());
EXPECT_EQ(kTimestampValue3, output[1].Timestamp().Value());
EXPECT_EQ(true, output[0].Get<bool>()); // Allow.
EXPECT_EQ(false, output[1].Get<bool>()); // Disallow.
}
// Must not detect disallow value for first timestamp as a state change. // Must not detect disallow value for first timestamp as a state change.
TEST_F(GateCalculatorTest, DisallowInitialNoStateTransition) { TEST_F(GateCalculatorTest, DisallowInitialNoStateTransition) {
SetRunner(R"( SetRunner(R"(