text: require('jsclass')
  
  var WebSocket = require('../lib/faye/websocket'),
      fs        = require('fs'),
      http      = require('http'),
      https     = require('https')
  
  
  JS.ENV.EchoServer = function() {}
  EchoServer.prototype.listen = function(port, ssl) {
    var server = ssl
               ? https.createServer({
                   key:  fs.readFileSync(__dirname + '/server.key'),
                   cert: fs.readFileSync(__dirname + '/server.crt')
                 })
               : http.createServer()
    
    server.addListener('upgrade', function(request, socket, head) {
      var ws = new WebSocket(request, socket, head, ["echo"])
      ws.onmessage = function(event) {
        ws.send(event.data)
      }
    })
    this._httpServer = server
    server.listen(port)
  }
  EchoServer.prototype.stop = function(callback, scope) {
    this._httpServer.addListener('close', function() {
      if (callback) callback.call(scope);
    });
    this._httpServer.close();
  }
  
  
  JS.Packages(function() { with(this) {
    autoload(/.*Spec/, {from: 'spec/faye/websocket'})
  }})
  
  
  JS.require('JS.Test', function() {
    JS.Test.Unit.Assertions.define("assertBufferEqual", function(array, buffer) {
      this.assertEqual(array.length, buffer.length);
      var ary = [], n = buffer.length;
      while (n--) ary[n] = buffer[n];
      this.assertEqual(array, ary);
    })
    
    JS.require( 'ClientSpec',
                'Draft75ParserSpec',
                'Draft76ParserSpec',
                'HybiParserSpec',
                JS.Test.method('autorun'))
  })
  
  