Skip to content

Commit

Permalink
server: use ServiceFault on request error
Browse files Browse the repository at this point in the history
  • Loading branch information
erossignon committed Aug 12, 2022
1 parent eb496c7 commit aeb0ad6
Show file tree
Hide file tree
Showing 18 changed files with 978 additions and 935 deletions.
12 changes: 10 additions & 2 deletions packages/node-opcua-client/source/private/client_session_impl.ts
Expand Up @@ -10,7 +10,7 @@ import {
ExtraDataTypeManager,
getExtensionObjectConstructor,
getExtraDataTypeManager,
promoteOpaqueStructure,
promoteOpaqueStructure
} from "node-opcua-client-dynamic-extension-object";
import { Certificate, Nonce } from "node-opcua-crypto";
import { attributeNameById, BrowseDirection, LocalizedTextLike } from "node-opcua-data-model";
Expand Down Expand Up @@ -82,7 +82,13 @@ import {
import { WriteRequest, WriteResponse, WriteValue } from "node-opcua-service-write";
import { StatusCode, StatusCodes, Callback, CallbackT } from "node-opcua-status-code";
import { ErrorCallback } from "node-opcua-status-code";
import { BrowseNextRequest, BrowseNextResponse, HistoryReadValueIdOptions, WriteValueOptions } from "node-opcua-types";
import {
BrowseNextRequest,
BrowseNextResponse,
HistoryReadValueIdOptions,
ServiceFault,
WriteValueOptions
} from "node-opcua-types";
import { buffer_ellipsis, getFunctionParameterNames, isNullOrUndefined, lowerFirstLetter } from "node-opcua-utils";
import { DataType, Variant, VariantLike } from "node-opcua-variant";

Expand Down Expand Up @@ -1540,6 +1546,7 @@ export class ClientSessionImpl extends EventEmitter implements ClientSession {
if (err && err.message.match(/BadSessionIdInvalid/) && request.constructor.name !== "ActivateSessionRequest") {
debugLog("Transaction on Invalid Session ", request.constructor.name);
request.requestHeader.requestHandle = requestHandleNotSetValue;
warningLog("client is now attempting to recreate a session");
this.recreate_session_and_reperform_transaction(request, callback);
return;
}
Expand Down Expand Up @@ -1595,6 +1602,7 @@ export class ClientSessionImpl extends EventEmitter implements ClientSession {
}
return callback(err);
}

/* istanbul ignore next */
if (!response) {
return callback(new Error("internal Error"));
Expand Down
Expand Up @@ -471,8 +471,12 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
});
session.setTriggering(setTriggeringRequest, (err: Error | null, response?: SetTriggeringResponse) => {
if (err) {
// use soft error, no exceptions
return callback(null, response);
if (response) {
// use soft error, no exceptions
return callback(null, response);
} else {
return callback(err);
}
}
// istanbul ignore next
if (!response) {
Expand Down
Expand Up @@ -18,7 +18,8 @@ import {
StatusCodes,
RegisterServerMethod,
makeApplicationUrn,
OPCUADiscoveryServer
OPCUADiscoveryServer,
ServiceFault
} from "node-opcua";
import { readCertificate, exploreCertificate } from "node-opcua-crypto";
import { checkDebugFlag, make_debugLog } from "node-opcua-debug";
Expand Down Expand Up @@ -132,13 +133,15 @@ export function t(test: any) {
}
});

function check_response(err: Error | null, response: any): void {
should.not.exist(err);
function check_error_response(err: Error | null, response: any): void {
should.exist(err);
should.not.exist(response);
(err as any).response.should.be.instanceOf(ServiceFault);
//xx console.log(response.toString());
response.responseHeader.serviceResult.should.eql(StatusCodes.BadDiscoveryUrlMissing);
(err as any).response.responseHeader.serviceResult.should.eql(StatusCodes.BadDiscoveryUrlMissing);
}

await send_registered_server_request(discoveryServerEndpointUrl, request, check_response);
await send_registered_server_request(discoveryServerEndpointUrl, request, check_error_response);
});

it("DISCO1-2 should fail to register server to the discover server if server type is Client (BadInvalidArgument)", async () => {
Expand All @@ -161,13 +164,15 @@ export function t(test: any) {
}
});

function check_response(err: Error | null, response: any) {
should.not.exist(err);
function check_error_response(err: Error | null, response: any) {
should.exist(err);
should.not.exist(response);
//xx debugLog(response.toString());
response.responseHeader.serviceResult.should.eql(StatusCodes.BadInvalidArgument);
(err as any).response.should.be.instanceOf(ServiceFault);
(err as any).response.responseHeader.serviceResult.should.eql(StatusCodes.BadInvalidArgument);
}

await send_registered_server_request(discoveryServerEndpointUrl, request, check_response);
await send_registered_server_request(discoveryServerEndpointUrl, request, check_error_response);
});

it("DISCO1-3 should fail to register server to the discover server if server name array is empty (BadServerNameMissing)", async () => {
Expand All @@ -190,12 +195,14 @@ export function t(test: any) {
}
});

function check_response(err: Error | null, response: any) {
should.not.exist(err);
response.responseHeader.serviceResult.should.eql(StatusCodes.BadServerNameMissing);
function check_error_response(err: Error | null, response: any) {
should.exist(err);
should.not.exist(response);
(err as any).response.should.be.instanceOf(ServiceFault);
(err as any).response.responseHeader.serviceResult.should.eql(StatusCodes.BadServerNameMissing);
}

await send_registered_server_request(discoveryServerEndpointUrl, request, check_response);
await send_registered_server_request(discoveryServerEndpointUrl, request, check_error_response);
});
});

Expand All @@ -207,7 +214,8 @@ export function t(test: any) {
let server: OPCUAServer;

before(() => {
OPCUAServer.registry.count().should.eql(0);1162
OPCUAServer.registry.count().should.eql(0);
1162;
});

after(() => {
Expand Down
Expand Up @@ -164,10 +164,10 @@ module.exports = function(test) {
const browseNextRequest = new BrowseNextRequest({
continuationPoints: null
});
g_session.performMessageTransaction(browseNextRequest, function(err, response) {
g_session.performMessageTransaction(browseNextRequest, function(err, _response) {
err.message.should.match(/BadNothingToDo/);
// console.log(response.toString());
response.responseHeader.serviceResult.should.equal(StatusCodes.BadNothingToDo);
err.response.responseHeader.serviceResult.should.equal(StatusCodes.BadNothingToDo);
callback();
});
}
Expand Down
Expand Up @@ -39,10 +39,10 @@ const {
Variant,
Subscription,
SubscriptionState,
installSessionLogging
installSessionLogging,
ServiceFault
} = require("node-opcua");


const { make_debugLog, checkDebugFlag } = require("node-opcua-debug");

const {
Expand Down Expand Up @@ -726,7 +726,8 @@ module.exports = function (test) {
},
function (callback) {
function publish_callback(err, response) {
should.exist(response);
should.not.exist(response);
err.response.should.be.instanceOf(ServiceFault);
should(err.message).match(/BadNoSubscription/);
}

Expand Down Expand Up @@ -825,7 +826,8 @@ module.exports = function (test) {
subscriptionIds: []
},
function (err, response) {
should.exist(response);
should.not.exist(response);
should.exist(err);
err.message.should.match(/BadNothingToDo/);
callback();
}
Expand Down Expand Up @@ -1518,7 +1520,8 @@ module.exports = function (test) {
});
session.createMonitoredItems(createMonitoredItemsRequest, function (err, createMonitoredItemsResponse) {
should(err.message).match(/BadNothingToDo/);
createMonitoredItemsResponse.responseHeader.serviceResult.should.eql(StatusCodes.BadNothingToDo);
should.not.exist(createMonitoredItemsResponse);
err.response.responseHeader.serviceResult.should.eql(StatusCodes.BadNothingToDo);
callback();
});
},
Expand Down Expand Up @@ -1581,7 +1584,8 @@ module.exports = function (test) {
});
session.modifyMonitoredItems(modifyMonitoredItemsRequest, function (err, modifyMonitoredItemsResponse) {
should(err.message).match(/BadNothingToDo/);
modifyMonitoredItemsResponse.responseHeader.serviceResult.should.eql(StatusCodes.BadNothingToDo);
err.response.responseHeader.serviceResult.should.eql(StatusCodes.BadNothingToDo);
should.not.exist(modifyMonitoredItemsResponse);
callback();
});
},
Expand All @@ -1600,7 +1604,8 @@ module.exports = function (test) {
});
session.deleteMonitoredItems(deleteMonitoredItemsRequest, function (err, deleteMonitoredItemsResponse) {
should(err.message).match(/BadNothingToDo/);
deleteMonitoredItemsResponse.responseHeader.serviceResult.should.eql(StatusCodes.BadNothingToDo);
err.response.responseHeader.serviceResult.should.eql(StatusCodes.BadNothingToDo);
should.not.exist(deleteMonitoredItemsResponse);
callback();
});
},
Expand Down Expand Up @@ -1793,6 +1798,7 @@ module.exports = function (test) {
requestedPublishingInterval: -1
},
function (err, createSubscriptionResponse) {
should.not.exist(err);
createSubscriptionResponse.revisedPublishingInterval.should.be.greaterThan(10);

inner_done(err);
Expand Down Expand Up @@ -1903,7 +1909,6 @@ module.exports = function (test) {

installSessionLogging(server);


endpointUrl = test.endpointUrl;
temperatureVariableId = server.temperatureVariableId;

Expand Down Expand Up @@ -2139,13 +2144,13 @@ module.exports = function (test) {
})
],
(err) => {
tracelog("inner", err ? err.message: "");
tracelog("inner", err ? err.message : "");
inner_done(err);
}
);
},
(err) => {
tracelog("done", err ? err.message: "");
tracelog("done", err ? err.message : "");
done(err);
}
);
Expand Down Expand Up @@ -4064,8 +4069,9 @@ module.exports = function (test) {
});
g_session.republish(request, function (err, response) {
should.exist(err);
response.should.be.instanceof(RepublishResponse);
response.responseHeader.serviceResult.should.eql(StatusCodes.BadMessageNotAvailable);
should.not.exist(response);
err.response.should.be.instanceof(ServiceFault);
err.response.responseHeader.serviceResult.should.eql(StatusCodes.BadMessageNotAvailable);
done();
});
}, done);
Expand All @@ -4081,8 +4087,9 @@ module.exports = function (test) {
});
g_session.republish(request, function (err, response) {
should.exist(err);
response.should.be.instanceof(RepublishResponse);
response.responseHeader.serviceResult.should.eql(StatusCodes.BadSubscriptionIdInvalid);
should.not.exist(response);
err.response.should.be.instanceof(ServiceFault);
err.response.responseHeader.serviceResult.should.eql(StatusCodes.BadSubscriptionIdInvalid);
done();
});
}, done);
Expand Down
Expand Up @@ -456,10 +456,17 @@ module.exports = function (test) {
const response1 = spy_publish_session2.getCall(1).args[1];
const response2 = spy_publish_session2.getCall(2).args[1];
const response3 = spy_publish_session2.getCall(3).args[1];

response1.responseHeader.serviceResult.should.eql(StatusCodes.BadNoSubscription);
response2.responseHeader.serviceResult.should.eql(StatusCodes.BadNoSubscription);
response3.responseHeader.serviceResult.should.eql(StatusCodes.BadNoSubscription);
should.not.exist(response1);
should.not.exist(response2);
should.not.exist(response3);

const err1 = spy_publish_session2.getCall(1).args[0];
const err2 = spy_publish_session2.getCall(2).args[0];
const err3 = spy_publish_session2.getCall(3).args[0];

err1.response.responseHeader.serviceResult.should.eql(StatusCodes.BadNoSubscription);
err2.response.responseHeader.serviceResult.should.eql(StatusCodes.BadNoSubscription);
err3.response.responseHeader.serviceResult.should.eql(StatusCodes.BadNoSubscription);
//xx console.log(response1.toString())
//xx console.log(response2.toString())
//xx console.log(response3.toString())
Expand Down
Expand Up @@ -29,6 +29,8 @@ const fail_fast_connectivity_strategy = {
const describe = require("node-opcua-leak-detector").describeWithLeakDetector;
module.exports = function (test) {
describe("Browse-Read-Write Services", function () {

/** @type {ClientSession} */
let g_session = null;

// use fail fast connectionStrategy
Expand Down Expand Up @@ -170,7 +172,7 @@ module.exports = function (test) {

g_session.read(nodesToRead, function (err, dataValues) {
if (err) {
const response = dataValues;
const response = err.response;
//dataValues.length.should.be(1);
response.responseHeader.serviceResult.should.eql(StatusCodes.BadNothingToDo);
done();
Expand Down

0 comments on commit aeb0ad6

Please sign in to comment.