PHP Classes

File: tests/Integration/SubscriptionTest.php

Recommend this page to a friend!
  Packages of Gianfrancesco Aurecchia   OPC UA Client   tests/Integration/SubscriptionTest.php   Download  
File: tests/Integration/SubscriptionTest.php
Role: Example script
Content type: text/plain
Description: Example script
Class: OPC UA Client
Control devices that support the OPC UA protocol
Author: By
Last change:
Date: 19 days ago
Size: 8,403 bytes
 

Contents

Class file image Download
<?php

declare(strict_types=1);

use
PhpOpcua\Client\Tests\Integration\Helpers\TestHelper;
use
PhpOpcua\Client\Types\StatusCode;

describe('Subscription', function () {

   
it('creates a subscription with valid subscriptionId', function () {
       
$client = null;
        try {
           
$client = TestHelper::connectNoSecurity();

           
$sub = $client->createSubscription(500.0);
           
expect($sub->subscriptionId)->toBeInt()->toBeGreaterThan(0);
           
expect($sub->revisedPublishingInterval)->toBeFloat()->toBeGreaterThan(0.0);

           
// Cleanup
           
$status = $client->deleteSubscription($sub->subscriptionId);
           
expect(StatusCode::isGood($status))->toBeTrue();
        } finally {
           
TestHelper::safeDisconnect($client);
        }
    })->
group('integration');

   
it('creates a monitored item on Counter variable', function () {
       
$client = null;
        try {
           
$client = TestHelper::connectNoSecurity();

           
$sub = $client->createSubscription(500.0);
           
$subId = $sub->subscriptionId;

           
$counterNodeId = TestHelper::browseToNode($client, ['TestServer', 'Dynamic', 'Counter']);
           
$results = $client->createMonitoredItems($subId, [
                [
'nodeId' => $counterNodeId, 'clientHandle' => 1],
            ]);

           
expect($results)->toHaveCount(1);
           
expect(StatusCode::isGood($results[0]->statusCode))->toBeTrue();
           
expect($results[0]->monitoredItemId)->toBeInt()->toBeGreaterThan(0);

           
// Cleanup
           
$client->deleteMonitoredItems($subId, [$results[0]->monitoredItemId]);
           
$client->deleteSubscription($subId);
        } finally {
           
TestHelper::safeDisconnect($client);
        }
    })->
group('integration');

   
it('publishes and receives a data change notification', function () {
       
$client = null;
        try {
           
$client = TestHelper::connectNoSecurity();

           
$sub = $client->createSubscription(250.0);
           
$subId = $sub->subscriptionId;

           
$counterNodeId = TestHelper::browseToNode($client, ['TestServer', 'Dynamic', 'Counter']);
           
$monResults = $client->createMonitoredItems($subId, [
                [
'nodeId' => $counterNodeId, 'clientHandle' => 1],
            ]);
           
$monId = $monResults[0]->monitoredItemId;

           
// Wait a bit for data to accumulate, then publish
           
usleep(600_000);

           
$receivedNotification = false;
            for (
$i = 0; $i < 5; $i++) {
               
$pub = $client->publish();
                if (! empty(
$pub->notifications)) {
                   
$receivedNotification = true;
                    break;
                }
               
usleep(300_000);
            }

           
expect($receivedNotification)->toBeTrue();

           
// Cleanup
           
$client->deleteMonitoredItems($subId, [$monId]);
           
$client->deleteSubscription($subId);
        } finally {
           
TestHelper::safeDisconnect($client);
        }
    })->
group('integration');

   
it('deletes a monitored item', function () {
       
$client = null;
        try {
           
$client = TestHelper::connectNoSecurity();

           
$sub = $client->createSubscription(500.0);
           
$subId = $sub->subscriptionId;

           
$counterNodeId = TestHelper::browseToNode($client, ['TestServer', 'Dynamic', 'Counter']);
           
$monResults = $client->createMonitoredItems($subId, [
                [
'nodeId' => $counterNodeId, 'clientHandle' => 1],
            ]);
           
$monId = $monResults[0]->monitoredItemId;

           
$deleteResults = $client->deleteMonitoredItems($subId, [$monId]);
           
expect($deleteResults)->toHaveCount(1);
           
expect(StatusCode::isGood($deleteResults[0]))->toBeTrue();

           
$client->deleteSubscription($subId);
        } finally {
           
TestHelper::safeDisconnect($client);
        }
    })->
group('integration');

   
it('deletes a subscription', function () {
       
$client = null;
        try {
           
$client = TestHelper::connectNoSecurity();

           
$sub = $client->createSubscription(500.0);
           
$status = $client->deleteSubscription($sub->subscriptionId);
           
expect(StatusCode::isGood($status))->toBeTrue();
        } finally {
           
TestHelper::safeDisconnect($client);
        }
    })->
group('integration');

   
it('subscribes to multiple dynamic variables at once', function () {
       
$client = null;
        try {
           
$client = TestHelper::connectNoSecurity();

           
$sub = $client->createSubscription(500.0);
           
$subId = $sub->subscriptionId;

           
$counterNodeId = TestHelper::browseToNode($client, ['TestServer', 'Dynamic', 'Counter']);
           
$randomNodeId = TestHelper::browseToNode($client, ['TestServer', 'Dynamic', 'Random']);
           
$sineNodeId = TestHelper::browseToNode($client, ['TestServer', 'Dynamic', 'SineWave']);

           
$monResults = $client->createMonitoredItems($subId, [
                [
'nodeId' => $counterNodeId, 'clientHandle' => 1],
                [
'nodeId' => $randomNodeId, 'clientHandle' => 2],
                [
'nodeId' => $sineNodeId, 'clientHandle' => 3],
            ]);

           
expect($monResults)->toHaveCount(3);
            foreach (
$monResults as $result) {
               
expect(StatusCode::isGood($result->statusCode))->toBeTrue();
               
expect($result->monitoredItemId)->toBeInt()->toBeGreaterThan(0);
            }

           
// Cleanup
           
$monIds = array_map(fn ($r) => $r->monitoredItemId, $monResults);
           
$client->deleteMonitoredItems($subId, $monIds);
           
$client->deleteSubscription($subId);
        } finally {
           
TestHelper::safeDisconnect($client);
        }
    })->
group('integration');

   
it('modifies sampling interval on a monitored item', function () {
       
$client = null;
        try {
           
$client = TestHelper::connectNoSecurity();

           
$sub = $client->createSubscription(500.0);
           
$subId = $sub->subscriptionId;

           
$counterNodeId = TestHelper::browseToNode($client, ['TestServer', 'Dynamic', 'Counter']);
           
$monResults = $client->createMonitoredItems($subId, [
                [
'nodeId' => $counterNodeId, 'samplingInterval' => 500.0],
            ]);
           
$monId = $monResults[0]->monitoredItemId;

           
$modifyResults = $client->modifyMonitoredItems($subId, [
                [
'monitoredItemId' => $monId, 'samplingInterval' => 1000.0, 'queueSize' => 5],
            ]);

           
expect($modifyResults)->toHaveCount(1);
           
expect(StatusCode::isGood($modifyResults[0]->statusCode))->toBeTrue();
           
expect($modifyResults[0]->revisedSamplingInterval)->toBeFloat();

           
$client->deleteMonitoredItems($subId, [$monId]);
           
$client->deleteSubscription($subId);
        } finally {
           
TestHelper::safeDisconnect($client);
        }
    })->
group('integration');

   
it('configures triggering between monitored items', function () {
       
$client = null;
        try {
           
$client = TestHelper::connectNoSecurity();

           
$sub = $client->createSubscription(500.0);
           
$subId = $sub->subscriptionId;

           
$counterNodeId = TestHelper::browseToNode($client, ['TestServer', 'Dynamic', 'Counter']);
           
$randomNodeId = TestHelper::browseToNode($client, ['TestServer', 'Dynamic', 'Random']);

           
$monResults = $client->createMonitoredItems($subId, [
                [
'nodeId' => $counterNodeId, 'clientHandle' => 1],
                [
'nodeId' => $randomNodeId, 'clientHandle' => 2],
            ]);

           
$triggerId = $monResults[0]->monitoredItemId;
           
$linkedId = $monResults[1]->monitoredItemId;

           
$result = $client->setTriggering($subId, $triggerId, [$linkedId]);

           
expect($result->addResults)->toHaveCount(1);
           
expect(StatusCode::isGood($result->addResults[0]))->toBeTrue();

           
$monIds = array_map(fn ($r) => $r->monitoredItemId, $monResults);
           
$client->deleteMonitoredItems($subId, $monIds);
           
$client->deleteSubscription($subId);
        } finally {
           
TestHelper::safeDisconnect($client);
        }
    })->
group('integration');

})->
group('integration');