test('Make sure stop is clean from start', function(t) {
  var myFriendlyName = "Luke";
  var trmMock = new TRMMock(smallHash.toString('base64'), t, thaliServer.address().port, "dbName", myFriendlyName);
  var identityExchange = new IdentityExchange(thaliApp, thaliServer.address().port, trmMock, "dbName");
  identityExchange.on(IdentityExchange.Events.PeerIdentityExchange, function(peer) {
    t.fail('Should not have been called on PeerIdentityExchange');
  });
  identityExchange.startIdentityExchange(myFriendlyName, function(err) {
    t.notOk(err, 'Should not have gotten error on startIdentityExchange');
    identityExchange.stopIdentityExchange(function(err) {
      t.notOk(err, 'Should not have gotten error on stopIdentityExchange');
      trmMock._emitter.emit(ThaliEmitter.events.PEER_AVAILABILITY_CHANGED, { peerName: "abc;123" });
      t.equal(trmMock.state, TRMMock.states.Stopped, 'State should be Stopped');
      t.end();
    })
  })
});
test('Make sure stop is clean from stop execute identity exchange', function(t) {
  var myFriendlyName = "Jukka";
  var trmMock = new TRMMock(smallHash.toString('base64'), t, thaliServer.address().port, "dbName", myFriendlyName);
  var identityExchange = new IdentityExchange(thaliApp, thaliServer.address().port, trmMock, "dbName");
  identityExchange.on(IdentityExchange.Events.PeerIdentityExchange, function() {
    t.fail();
  });
  identityExchange.startIdentityExchange(myFriendlyName, function(err) {
    t.notOk(err);
    identityExchange.executeIdentityExchange("foo", bigHash.toString('base64'), function() {t.fail()});
    identityExchange.stopExecutingIdentityExchange();
    identityExchange.stopIdentityExchange(function(err) {
      t.notOk(err);
      trmMock._emitter.emit(ThaliEmitter.events.PEER_AVAILABILITY_CHANGED, { peerName: "abc;123" });
      t.equal(trmMock.state, TRMMock.states.Stopped);
      t.end();
    })
  })
});
  function(t) {
    var myFriendlyName = "Doug";
    var base64BigHash = bigHash.toString('base64');
    var peerAvailabilityChangedEvents = [
      { peerName: base64BigHash+";abc"},
      { peerName: "efg"},
      { peerName: base64BigHash+";def"}
    ];
    var trmMock = new TRMMock(smallHash.toString('base64'), t, thaliServer.address().port, "dbName", myFriendlyName,
      function(port, dbName, deviceName, cb) {
        peerAvailabilityChangedEvents.forEach(function(peer) {
          trmMock._emitter.emit(ThaliEmitter.events.PEER_AVAILABILITY_CHANGED, peer);
        });
        cb();
      });
    var identityExchange = new IdentityExchange(thaliApp, thaliServer.address().port, trmMock, "dbName");
    var sawAbc = false;
    var sawDef = false;
    var gotStartCallBack = false;
    function checkAllDone(){
      if (sawAbc && sawDef && gotStartCallBack) {
        t.end();
      }
    }
    identityExchange.on(IdentityExchange.Events.PeerIdentityExchange, function(peer) {
      if (peer.peerFriendlyName == "abc") {
        t.notOk(sawAbc);
        sawAbc = true;
        t.doesNotThrow(function() {
          identityExchange.executeIdentityExchange(peer.peerFriendlyName, peer.peerName, function() {
            t.fail();
          });
        });
        checkAllDone();
        return;
      }

      if (peer.peerFriendlyName == "def") {
        t.notOk(sawDef);
        sawDef = true;
        checkAllDone();
        return;
      }

      t.fail("We got an event we should not have");
    });
    identityExchange.startIdentityExchange(myFriendlyName, function(err) {
      t.notOk(err);
      gotStartCallBack = true;
      checkAllDone();
    })
  });
test('make sure startIdentityExchange sets things up properly', function(t) {
  var myFriendlyName = "Matt";
  var trmMock = new TRMMock(smallHash.toString('base64'), t, thaliServer.address().port, "dbName", myFriendlyName);
  var identityExchange = new IdentityExchange(thaliApp, thaliServer.address().port, trmMock, "dbName");
  var sawAbc = false;
  var sawDef = false;

  var peerAvailabilityEvents = [
    {
      peerName: "123;abc",
      foo: "bar1"
    },
    {
      peerName: "notlooking"
    },
    {
      peerName: "456;def",
      foo: "bar2"
    }
  ];

  request(thaliApp)
    .post(identityExchangeUtils.cbPath)
    .send({ foo: "bar"})
    .expect(404)
    .end(function(err, res) {
      t.notOk(err);

      identityExchange.startIdentityExchange(myFriendlyName, function(err) {
        t.notOk(err);

        request(thaliApp)
          .post(identityExchangeUtils.rnMinePath)
          .send({ foo: "bar"})
          .expect(400)
          .end(function(err, res) {
            t.notOk(err);

            trmMock._emitter.emit(ThaliEmitter.events.PEER_AVAILABILITY_CHANGED, peerAvailabilityEvents);
          })
      });
    });

  identityExchange.on(IdentityExchange.Events.PeerIdentityExchange, function(peer) {
    if (peer.peerFriendlyName == "abc") {
      t.notOk(sawAbc);
      t.equals(peer.peerName, "123");
      t.equals(peer.foo, "bar1");
      sawAbc = true;
    }

    if (peer.peerFriendlyName == "def") {
      t.notOk(sawDef);
      t.equals(peer.peerName, "456");
      t.equals(peer.foo, "bar2");
      sawDef = true;
    }

    if (sawAbc && sawDef) {
      t.equal(trmMock.state, TRMMock.states.Started);
      t.end();
    }
  });
});