1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249:
<?php
declare(strict_types=1);
namespace Test\IqrfAppModule\Model;
use App\IqrfAppModule\Model\CoordinatorParser;
use App\IqrfAppModule\Model\EmptyResponseException;
use App\IqrfAppModule\Model\InvalidOperationModeException;
use App\IqrfAppModule\Model\IqrfAppManager;
use App\IqrfAppModule\Model\OsParser;
use App\Model\CommandManager;
use App\Model\FileManager;
use DateTime;
use Nette\DI\Container;
use Tester\Assert;
use Tester\TestCase;
$container = require __DIR__ . '/../../bootstrap.php';
class IqrfAppManagerTest extends TestCase {
private $container;
private $commandManager;
private $fileManager;
private $coordinatorParser;
private $osParser;
public function __construct(Container $container) {
$this->container = $container;
}
public function setUp() {
$this->commandManager = new CommandManager(false);
$this->fileManager = new FileManager(__DIR__ . '/data/');
$this->coordinatorParser = new CoordinatorParser();
$this->osParser = new OsParser();
}
public function testValidatePacket() {
$iqrfAppManager = new IqrfAppManager($this->commandManager, $this->coordinatorParser, $this->osParser);
$validPackets = [
'01.00.06.03.ff.ff',
'01.00.06.03.ff.ff.',
];
$invalidPackets = [
'01 00 06 03 ff ff',
'01 00 06 03 ff ff.',
';01.00.06.03.ff.ff',
';01 00 06 03 ff ff',
'01.00.06.03.ff.ff;',
'01 00 06 03 ff ff;',
'; echo Test > test.log',
];
foreach ($validPackets as $packet) {
Assert::true($iqrfAppManager->validatePacket($packet));
}
foreach ($invalidPackets as $packet) {
Assert::false($iqrfAppManager->validatePacket($packet));
}
}
public function testChangeOperationMode() {
$modesSuccess = ['forwarding', 'operational', 'service'];
$outputSuccess = [
'iqrfapp "{\"ctype\":\"conf\",\"type\":\"mode\",\"cmd\":\"forwarding\"}"',
'iqrfapp "{\"ctype\":\"conf\",\"type\":\"mode\",\"cmd\":\"operational\"}"',
'iqrfapp "{\"ctype\":\"conf\",\"type\":\"mode\",\"cmd\":\"service\"}"',
];
$commandManager = \Mockery::mock(CommandManager::class);
foreach ($outputSuccess as $output) {
$commandManager->shouldReceive('send')->with($output, true)->andReturn(true);
}
$iqrfAppManager = new IqrfAppManager($commandManager, $this->coordinatorParser, $this->osParser);
foreach ($modesSuccess as $mode) {
Assert::true($iqrfAppManager->changeOperationMode($mode));
}
Assert::exception(function() use ($iqrfAppManager) {
$iqrfAppManager->changeOperationMode('invalid');
}, InvalidOperationModeException::class);
}
public function testSendRaw() {
$packet = '01.00.06.03.ff.ff';
$timeout = 1000;
$now = new DateTime();
$cmdRead = 'iqrfapp readonly timeout 200';
$cmd = 'iqrfapp "{\"ctype\":\"dpa\",\"type\":\"raw\",\"msgid\":\"' . $now->getTimestamp() . ''
. '\",\"timeout\":' . $timeout . ',\"request\":\"' . $packet . '\",'
. '\"request_ts\":\"\",\"confirmation\":\"\",\"confirmation_ts\":\"\",'
. '\"response\":\"\",\"response_ts\":\"\"}"';
$iqrfapp = 'Received: {
"ctype": "dpa",
"type": "raw",
"msgid": ' . $now->getTimestamp() . ',
"request": "' . $packet . '",
"request_ts": "2017-12-09T20:56:03.110923",
"confirmation": "",
"confirmation_ts": "",
"response": "01.00.06.83.00.00.00.00",
"response_ts": "2017-12-09T20:56:03.137869",
"status": "STATUS_NO_ERROR"
}';
$expected['response'] = '{
"ctype": "dpa",
"type": "raw",
"msgid": ' . $now->getTimestamp() . ',
"request": "' . $packet . '",
"request_ts": "2017-12-09T20:56:03.110923",
"confirmation": "",
"confirmation_ts": "",
"response": "01.00.06.83.00.00.00.00",
"response_ts": "2017-12-09T20:56:03.137869",
"status": "STATUS_NO_ERROR"
}';
$commandManager = \Mockery::mock(CommandManager::class);
$commandManager->shouldReceive('send')->with($cmdRead, true)->andReturn(null);
$commandManager->shouldReceive('send')->with($cmd, true)->andReturn($iqrfapp);
$iqrfAppManager = new IqrfAppManager($commandManager, $this->coordinatorParser, $this->osParser);
$actual = $iqrfAppManager->sendRaw($packet, $timeout);
unset($actual['request']);
Assert::equal($expected, $actual);
}
public function testParseResponse() {
$iqrfAppManager = new IqrfAppManager($this->commandManager, $this->coordinatorParser, $this->osParser);
$responseCoordinatorBonded['response'] = $this->fileManager->read('response-coordinator-bonded.json');
$arrayCoordinatorBonded = $iqrfAppManager->parseResponse($responseCoordinatorBonded);
$expectedCoordinatorBonded = [
'BondedNodes' => [
['0', '1', '1', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
],
];
Assert::equal($expectedCoordinatorBonded, $arrayCoordinatorBonded);
$responseCoordinatorBondedDiscovered['response'] = $this->fileManager->read('response-coordinator-discovered.json');
$arrayCoordinatorDiscovered = $iqrfAppManager->parseResponse($responseCoordinatorBondedDiscovered);
$expectedCoordinatorDiscovered = [
'DiscoveredNodes' => [
['0', '0', '1', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
],
];
Assert::equal($expectedCoordinatorDiscovered, $arrayCoordinatorDiscovered);
$responseOsRead['response'] = $this->fileManager->read('response-os-read.json');
$arrayOsRead = $iqrfAppManager->parseResponse($responseOsRead);
$expectedOsRead = [
'ModuleId' => '8100A405',
'OsVersion' => '3.08D',
'TrType' => 'DCTR-72D',
'McuType' => 'PIC16F1938',
'OsBuild' => '7908',
'Rssi' => -130,
'SupplyVoltage' => '3.00 V',
'Flags' => '00',
'SlotLimits' => 'f0',
];
Assert::equal($expectedOsRead, $arrayOsRead);
$packetLedrOn['response'] = $this->fileManager->read('response-ledr-on.json');
$arrayLedrOn = $iqrfAppManager->parseResponse($packetLedrOn);
Assert::null($arrayLedrOn);
$packetIoTKitSe['response'] = $this->fileManager->read('response-error.json');
$arrayIoTKitSe = $iqrfAppManager->parseResponse($packetIoTKitSe);
Assert::null($arrayIoTKitSe);
Assert::exception(function () use ($iqrfAppManager) {
$iqrfAppManager->parseResponse(['response' => '']);
}, EmptyResponseException::class);
}
}
$test = new IqrfAppManagerTest($container);
$test->run();