function check_open_secure_channel_fails(securityPolicy, securityMode, options, done) {

    options = options || {};
    options = _.extend(options, {
        securityMode: opcua.MessageSecurityMode.get(securityMode),
        securityPolicy: opcua.SecurityPolicy.get(securityPolicy),
        serverCertificate: serverCertificate,
        defaultSecureTokenLifetime: g_defaultSecureTokenLifetime,
        connectionStrategy: no_reconnect_connectivity_strategy

    });
    var client = new OPCUAClient(options);

    client.on("backoff", function (number, delay) {
        debugLog(" backoff attempt#", number, " retry in ", delay);
    });

    client.connect(endpointUrl, function (err) {

        if (err) {
            debugLog("Error = ", err.message);
            client.disconnect(function () {
                done();
            });

        } else {
            client.disconnect(function () {
                done(new Error("The connection's succeeded, but was expected to fail!"));
            });
        }
    });
}
function common_test(securityPolicy, securityMode, options, done) {

    //xx console.log("securityPolicy = ", securityPolicy,"securityMode = ",securityMode);

    opcua.MessageSecurityMode.get(securityMode).should.not.eql(null, "expecting supporting");

    options = options || {};
    options = _.extend(options, {
        securityMode: opcua.MessageSecurityMode.get(securityMode),
        securityPolicy: opcua.SecurityPolicy.get(securityPolicy),
        serverCertificate: serverCertificate,
        connectionStrategy: no_reconnect_connectivity_strategy

    });

    options.defaultSecureTokenLifetime = options.defaultSecureTokenLifetime || g_defaultSecureTokenLifetime;
    //xx console.log("xxxx options.defaultSecureTokenLifetime",options.defaultSecureTokenLifetime);

    var token_change = 0;
    var client = new OPCUAClient(options);

    perform_operation_on_client_session(client, endpointUrl, function (session, inner_done) {

        keep_monitoring_some_variable(session, options.defaultSecureTokenLifetime * 4 + 1000, function (err) {
            token_change.should.be.greaterThan(2);
            inner_done(err);
        });
    }, done);

    client.on("lifetime_75", function (token) {
        debugLog("received lifetime_75", JSON.stringify(token));
    });
    client.on("security_token_renewed", function () {
        token_change += 1;
    });
    client.on("close", function () {
        debugLog(" connection has been closed");
    });
}
    .alias("P", "securityPolicy")
    .alias("u", "userName")
    .alias("p", "password")
    .alias("n", "node")
    .alias("t", "timeout")

    .alias("d", "debug")
    .alias("h", "history")
    .example("simple_client  --endpoint opc.tcp://localhost:49230 -P=Basic256 -s=SIGN")
    .example("simple_client  -e opc.tcp://localhost:49230 -P=Basic256 -s=SIGN -u JoeDoe -p P@338@rd ")
    .example("simple_client  --endpoint opc.tcp://localhost:49230  -n=\"ns=0;i=2258\"")

    .argv;


var securityMode = opcua.MessageSecurityMode.get(argv.securityMode || "NONE");
if (!securityMode) {
    throw new Error("Invalid Security mode , should be " + opcua.MessageSecurityMode.enums.join(" "));
}

var securityPolicy = opcua.SecurityPolicy.get(argv.securityPolicy || "None");
if (!securityPolicy) {
    throw new Error("Invalid securityPolicy , should be " + opcua.SecurityPolicy.enums.join(" "));
}

//xx argv.securityMode   = argv.securityMode || "SIGNANDENCRYPT";
//xx argv.securityPolicy = argv.securityPolicy || "Basic128Rsa15";
var timeout = parseInt(argv.timeout) * 1000 || 20000;

var monitored_node = argv.node || "ns=1;s=PumpSpeed"; //"ns=1;s=Temperature";
function common_test_expected_server_initiated_disconnection(securityPolicy, securityMode, done) {


    opcua.MessageSecurityMode.get(securityMode).should.not.eql(null, "expecting a valid MessageSecurityMode");

    var fail_fast_connectivity_strategy = {
        maxRetry: 1,
        initialDelay: 100,
        maxDelay: 200,
        randomisationFactor: 0
    };
    var options = {
        securityMode: opcua.MessageSecurityMode.get(securityMode),
        securityPolicy: opcua.SecurityPolicy.get(securityPolicy),
        serverCertificate: serverCertificate,
        defaultSecureTokenLifetime: g_defaultSecureTokenLifetime,

        connectionStrategy: fail_fast_connectivity_strategy
    };

    var token_change = 0;
    var client = new OPCUAClient(options);

    var after_reconnection_spy = new sinon.spy();
    var start_reconnection_spy = new sinon.spy();

    perform_operation_on_client_session(client, endpointUrl, function (session, inner_done) {

        client.on("start_reconnection", start_reconnection_spy);
        client.on("after_reconnection", after_reconnection_spy);

        keep_monitoring_some_variable(session, g_defaultTestDuration, function (err) {
            console.log("err = ", err);
            // inner_done(err);
        });
        client.on("close", function () {
            debugLog("            connection has been closed");
            inner_done();
        });

    }, function (err) {

        debugLog(" RECEIVED ERROR :".yellow.bold, err);
        start_reconnection_spy.callCount.should.eql(1);
        //xx after_reconnection_spy.callCount.should.eql(1);
        should(err).be.instanceOf(Error);

        done();
    });

    client.on("backoff", function (number, delay) {
        console.log("backoff  attempt #".bgWhite.yellow,number, " retrying in ",delay/1000.0," seconds");
    });
    client.on("lifetime_75", function (token) {
        debugLog("            received lifetime_75", JSON.stringify(token));
    });
    client.on("security_token_renewed", function () {
        token_change += 1;
    });
    client.on("close", function () {
        debugLog("            connection has been closed");
    });
}