// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

var common = require('../common');
var assert = require('assert');
var net = require('net');

var tests_run = 0;

function fdPassingTest(path, port) {
  var greeting = 'howdy';
  var message = 'beep toot';
  var expectedData = ['[greeting] ' + greeting, '[echo] ' + message];

  var receiverArgs = [common.fixturesDir + '/net-fd-passing-receiver.js',
                      path,
                      greeting];
  var receiver = process.createChildProcess(process.ARGV[0], receiverArgs);

  var initializeSender = function() {
    var fdHighway = new net.Socket();

    fdHighway.addListener('connect', function() {
      var sender = net.createServer(function(socket) {
        fdHighway.sendFD(socket);
        socket.flush();
        socket.forceClose(); // want to close() the fd, not shutdown()
      });

      sender.addListener('listening', function() {
        var client = net.createConnection(port);

        client.addListener('connect', function() {
          client.write(message);
        });

        client.addListener('data', function(data) {
          assert.equal(expectedData[0], data);
          if (expectedData.length > 1) {
            expectedData.shift();
          }
          else {
            // time to shut down
            fdHighway.close();
            sender.close();
            client.forceClose();
          }
        });
      });

      tests_run += 1;
      sender.listen(port);
    });

    fdHighway.connect(path);


  };

  receiver.addListener('output', function(data) {
    var initialized = false;
    if ((! initialized) && (data == 'ready')) {
      initializeSender();
      initialized = true;
    }
  });
}

fdPassingTest('/tmp/passing-socket-test', 31075);

process.addListener('exit', function() {
  assert.equal(1, tests_run);
});
