blob: 4fe967ad3c321bbeaf1ef309fe9014622d665067 [file] [log] [blame]
// Copyright (c) 2020 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 "quiche/quic/qbone/bonnet/qbone_tunnel_silo.h"
#include "absl/synchronization/notification.h"
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/quic/qbone/bonnet/mock_qbone_tunnel.h"
namespace quic {
namespace {
using ::testing::Eq;
using ::testing::Invoke;
using ::testing::Return;
TEST(QboneTunnelSiloTest, SiloRunsEventLoop) {
MockQboneTunnel mock_tunnel;
absl::Notification event_loop_run;
EXPECT_CALL(mock_tunnel, WaitForEvents)
.WillRepeatedly(Invoke([&event_loop_run]() {
if (!event_loop_run.HasBeenNotified()) {
event_loop_run.Notify();
}
return false;
}));
QboneTunnelSilo silo(&mock_tunnel, false);
silo.Start();
event_loop_run.WaitForNotification();
absl::Notification client_disconnected;
EXPECT_CALL(mock_tunnel, Disconnect)
.WillOnce(Invoke([&client_disconnected]() {
client_disconnected.Notify();
return QboneTunnelInterface::ENDED;
}));
silo.Quit();
client_disconnected.WaitForNotification();
silo.Join();
}
TEST(QboneTunnelSiloTest, SiloCanShutDownAfterInit) {
MockQboneTunnel mock_tunnel;
int iteration_count = 0;
EXPECT_CALL(mock_tunnel, WaitForEvents)
.WillRepeatedly(Invoke([&iteration_count]() {
iteration_count++;
return false;
}));
EXPECT_CALL(mock_tunnel, state)
.WillOnce(Return(QboneTunnelInterface::START_REQUESTED))
.WillOnce(Return(QboneTunnelInterface::STARTED));
absl::Notification client_disconnected;
EXPECT_CALL(mock_tunnel, Disconnect)
.WillOnce(Invoke([&client_disconnected]() {
client_disconnected.Notify();
return QboneTunnelInterface::ENDED;
}));
QboneTunnelSilo silo(&mock_tunnel, true);
silo.Start();
client_disconnected.WaitForNotification();
silo.Join();
EXPECT_THAT(iteration_count, Eq(1));
}
} // namespace
} // namespace quic