public function testChannelModel_IsAwareOfConnectedModels_InThreesome($data)
{
$this->simulate(function (SimulationInterface $sim) use($data) {
$loop = $sim->getLoop();
$data['master']['config']['heartbeatKeepalive'] = 100;
$master = $this->createModel($data['master'], $loop);
$slave1 = $this->createModel($data['slave1'], $loop);
$slave2 = $this->createModel($data['slave2'], $loop);
$master->on('start', function () use($master, $slave1, $slave2) {
$slave1->start();
$slave2->start();
});
$master->on('connect', function ($name) use($sim, $master) {
$sim->expect('connect', [$name, $master->isConnected($name)]);
$sim->emit('connect');
});
$master->on('disconnect', function ($name) use($sim, $master) {
$sim->expect('disconnect', [$name, $master->isConnected($name)]);
$sim->emit('disconnect');
});
$sim->delayOnce('connect', 2, function () use($sim, $master) {
$sim->expect('getConnected', [$master->getConnected()]);
});
$sim->delayOnce('disconnect', 2, function () use($sim, $master) {
$sim->expect('getConnected', [$master->getConnected()]);
});
$sim->delayOnce('down', 2, function () use($sim, $loop) {
$loop->addTimer(0.5, function () use($sim) {
$sim->done();
});
});
$slave1->on('start', function () use($sim, $slave1, $loop) {
$loop->addTimer(0.25, function () use($slave1) {
$slave1->stop();
});
});
$slave1->on('stop', function () use($sim) {
$sim->emit('down');
});
$slave2->on('start', function () use($sim, $slave2, $loop) {
$loop->addTimer(0.25, function () use($slave2) {
$slave2->stop();
});
});
$slave2->on('stop', function () use($sim) {
$sim->emit('down');
});
$sim->onStart(function () use($master) {
$master->start();
});
$sim->onStop(function () use($master, $slave1, $slave2) {
$master->stop();
});
})->expect([['connect', [self::ALIAS_B, true]], ['connect', [self::ALIAS_C, true]], ['getConnected', [[self::ALIAS_B, self::ALIAS_C]]], ['disconnect', [self::ALIAS_B, false]], ['disconnect', [self::ALIAS_C, false]], ['getConnected', [[]]]]);
}