text: /* jshint strict: false, sub: true */
  /* global */
  'use strict';
  
  // /////////////////////////////////////////////////////////////////////////////
  // DISCLAIMER
  // 
  // Copyright 2016-2018 ArangoDB GmbH, Cologne, Germany
  // Copyright 2014 triagens GmbH, Cologne, Germany
  // 
  // Licensed under the Apache License, Version 2.0 (the "License")
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // 
  //     http://www.apache.org/licenses/LICENSE-2.0
  // 
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  // 
  // Copyright holder is ArangoDB GmbH, Cologne, Germany
  // 
  // @author Max Neunhoeffer
  // /////////////////////////////////////////////////////////////////////////////
  
  const functionsDocumentation = {
    'resilience_move': 'resilience "move" tests',
    'resilience_move_view': 'resilience "move view" tests',
    'resilience_repair': 'resilience "repair" tests',
    'resilience_failover': 'resilience "failover" tests',
    'resilience_failover_failure': 'resilience "failover failure" tests',
    'resilience_failover_view': 'resilience "failover view" tests',
    'resilience_transactions': 'resilience "transactions" tests',
    'resilience_sharddist': 'resilience "sharddist" tests',
    'client_resilience': 'client resilience tests',
    'active_failover': 'active failover tests'
  };
  const optionsDocumentation = [
  ];
  
  const tu = require('@arangodb/test-utils');
  
  const testPaths = {
    'resilience_move': [tu.pathForTesting('server/resilience/move')],
    'resilience_move_view': [tu.pathForTesting('server/resilience/move-view')],
    'resilience_repair': [tu.pathForTesting('server/resilience/repair')],
    'resilience_failover': [tu.pathForTesting('server/resilience/failover')],
    'resilience_failover_failure': [tu.pathForTesting('server/resilience/failover-failure')],
    'resilience_failover_view': [tu.pathForTesting('server/resilience/failover-view')],
    'resilience_transactions': [tu.pathForTesting('server/resilience/transactions')],
    'resilience_sharddist': [tu.pathForTesting('server/resilience/sharddist')],
    'client_resilience': [tu.pathForTesting('client/resilience')],
    'active_failover': [tu.pathForTesting('client/active-failover')]
  };
  
  // //////////////////////////////////////////////////////////////////////////////
  // / @brief TEST: resilience*
  // //////////////////////////////////////////////////////////////////////////////
  
  var _resilience = function(path) {
    this.func = function resilience (options) {
      let suiteName = path;
      let testCases = tu.scanTestPaths(testPaths[path], options);
      options.cluster = true;
      options.propagateInstanceInfo = true;
      if (options.test !== undefined) {
        // remove non ascii characters from our working directory:
        //                                       < A                           > Z && < a                   > z
        suiteName += '_' + options.test.replace(/[\x00-\x40]/g, "_").replace(/[\x5B-\x60]/g, "_").replace(/[\x7B-\xFF]/g, "_");
      }
      if (options.dbServers < 5) {
        options.dbServers = 5;
      }
      return tu.performTests(options, testCases, suiteName, tu.runThere, {
        'javascript.allow-external-process-control': 'true',
        'javascript.allow-port-testing': 'true',
      });
    };
  };
  
  const resilienceMove = (new _resilience('resilience_move')).func;
  const resilienceMoveView = (new _resilience('resilience_move_view')).func;
  const resilienceRepair = (new _resilience('resilience_repair')).func;
  const resilienceFailover = (new _resilience('resilience_failover')).func;
  const resilienceFailoverFailure = (new _resilience('resilience_failover_failure')).func;
  const resilienceFailoverView = (new _resilience('resilience_failover_view')).func;
  const resilienceTransactions = (new _resilience('resilience_transactions')).func;
  const resilienceSharddist = (new _resilience('resilience_sharddist')).func;
  
  // //////////////////////////////////////////////////////////////////////////////
  // / @brief TEST: client resilience
  // //////////////////////////////////////////////////////////////////////////////
  
  function clientResilience (options) {
    let testCases = tu.scanTestPaths(testPaths.client_resilience, options);
    options.cluster = true;
    if (options.coordinators < 2) {
      options.coordinators = 2;
    }
  
    return tu.performTests(options, testCases, 'client_resilience', tu.runInArangosh, {
      'javascript.allow-external-process-control': 'true',
      'javascript.allow-port-testing': 'true',
    });
  }
  
  // //////////////////////////////////////////////////////////////////////////////
  // / @brief TEST: active failover
  // //////////////////////////////////////////////////////////////////////////////
  
  function activeFailover (options) {
    if (options.cluster) {
      return {
        'active_failover': {
          'status': true,
          'message': 'skipped because of cluster',
          'skipped': true
        }
      };
    }
  
    let testCases = tu.scanTestPaths(testPaths.active_failover, options);
    options.activefailover = true;
    options.singles = 4;
    options.disableMonitor = true;
    return tu.performTests(options, testCases, 'client_resilience', tu.runInArangosh, {
      'server.authentication': 'true',
      'server.jwt-secret': 'haxxmann',
      'javascript.allow-external-process-control': 'true',
      'javascript.allow-port-testing': 'true',
    });
  }
  
  exports.setup = function (testFns, defaultFns, opts, fnDocs, optionsDoc, allTestPaths) {
    Object.assign(allTestPaths, testPaths);
    testFns['resilience_move'] = resilienceMove;
    testFns['resilience_move_view'] = resilienceMoveView;
    testFns['resilience_repair'] = resilienceRepair;
    testFns['resilience_failover'] = resilienceFailover;
    testFns['resilience_failover_failure'] = resilienceFailoverFailure;
    testFns['resilience_failover_view'] = resilienceFailoverView;
    testFns['resilience_transactions'] = resilienceTransactions;
    testFns['resilience_sharddist'] = resilienceSharddist;
    testFns['client_resilience'] = clientResilience;
    testFns['active_failover'] = activeFailover;
    for (var attrname in functionsDocumentation) { fnDocs[attrname] = functionsDocumentation[attrname]; }
    for (var i = 0; i < optionsDocumentation.length; i++) { optionsDoc.push(optionsDocumentation[i]); }
  };
  