public void testUDPPingRequest() {
    PingRequest pr = pingRequestFactory.createUDPPing();
    assertTrue(pr.supportsCachedPongs());

    // Test +UP +TLS
    UltrapeerSettings.MIN_CONNECT_TIME.setValue(0);
    UltrapeerSettings.FORCE_ULTRAPEER_MODE.setValue(true);
    ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(true);
    ConnectionSettings.LOCAL_IS_PRIVATE.setValue(false);
    UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.setValue(true);
    UltrapeerSettings.NEED_MIN_CONNECT_TIME.setValue(false);
    tlsManager.setIncomingTLSEnabled(true);
    assertTrue(connectionServices.isSupernode());
    pr = pingRequestFactory.createUDPPing();
    assertFalse(pr.requestsIP());
    byte[] data = pr.getSupportsCachedPongData();
    assertEquals(0x1, data[0] & 0x1);
    assertEquals(0x2, data[0] & 0x2);

    // +UP -TLS
    tlsManager.setIncomingTLSEnabled(false);
    assertTrue(connectionServices.isSupernode());
    pr = pingRequestFactory.createUDPPing();
    assertFalse(pr.requestsIP());
    data = pr.getSupportsCachedPongData();
    assertEquals(0x1, data[0] & 0x1);
    assertEquals(0x0, data[0] & 0x2);

    // Test -UP +TLS
    UltrapeerSettings.DISABLE_ULTRAPEER_MODE.setValue(true);
    UltrapeerSettings.FORCE_ULTRAPEER_MODE.setValue(false);
    tlsManager.setIncomingTLSEnabled(true);
    assertFalse(connectionServices.isSupernode());
    pr = pingRequestFactory.createUDPPing();
    assertFalse(pr.requestsIP());
    data = pr.getSupportsCachedPongData();
    assertEquals(0x0, data[0] & 0x1);
    assertEquals(0x2, data[0] & 0x2);

    // Test -UP -TLS
    tlsManager.setIncomingTLSEnabled(false);
    assertFalse(connectionServices.isSupernode());
    pr = pingRequestFactory.createUDPPing();
    assertFalse(pr.requestsIP());
    data = pr.getSupportsCachedPongData();
    assertEquals(0x0, data[0] & 0x1);
    assertEquals(0x0, data[0] & 0x2);

    ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(false);
    pr = pingRequestFactory.createUDPPing();
    assertTrue(pr.requestsIP());
  }
  public void testDoesNotAssignPassiveLeafIfDisabled() throws Exception {
    ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(true);
    DHTSettings.ENABLE_PASSIVE_LEAF_DHT_MODE.setValue(false);
    long startTime =
        System.currentTimeMillis() - DHTSettings.MIN_PASSIVE_LEAF_DHT_INITIAL_UPTIME.getValue();
    PrivilegedAccessor.setValue(nodeAssigner, "startTime", new Long(startTime));

    mockery.checking(buildBandwdithExpectations(true));
    mockery.checking(
        buildDHTExpectations(
            DHTMode.INACTIVE,
            true,
            true,
            false, // can't receive unsolicited
            DHTSettings.MIN_PASSIVE_LEAF_DHT_AVERAGE_UPTIME.getValue() + 1,
            false,
            false));

    mockery.checking(
        new Expectations() {
          {
            never(dhtManager).start(with(Matchers.any(DHTMode.class)));
          }
        });

    assignerRunnable.run();
    mockery.assertIsSatisfied();
  }
  public void testStopsDHTWhenDisabled() throws Exception {
    ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(true);
    long startTime =
        System.currentTimeMillis() - DHTSettings.MIN_ACTIVE_DHT_INITIAL_UPTIME.getValue();
    PrivilegedAccessor.setValue(nodeAssigner, "startTime", new Long(startTime));

    mockery.checking(buildBandwdithExpectations(true));
    mockery.checking(
        buildDHTExpectations(
            DHTMode.ACTIVE,
            false,
            true,
            true,
            DHTSettings.MIN_ACTIVE_DHT_AVERAGE_UPTIME.getValue() + 1,
            false,
            false));

    mockery.checking(
        new Expectations() {
          {
            one(dhtManager).stop();
          }
        });

    assignerRunnable.run();
    mockery.assertIsSatisfied();
  }
  public void testDoesNotAssignLowAverageUptime() throws Exception {
    ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(true);
    long startTime =
        System.currentTimeMillis() - DHTSettings.MIN_ACTIVE_DHT_INITIAL_UPTIME.getValue();
    PrivilegedAccessor.setValue(nodeAssigner, "startTime", new Long(startTime));

    mockery.checking(buildBandwdithExpectations(true));
    mockery.checking(
        buildDHTExpectations(
            DHTMode.INACTIVE,
            true,
            true,
            true,
            0, // no average uptime
            false,
            false));

    mockery.checking(
        new Expectations() {
          {
            never(dhtManager).start(with(Matchers.any(DHTMode.class)));
          }
        });

    assignerRunnable.run();
    mockery.assertIsSatisfied();
  }
  public void testDoesNotAssignLowInitialUptime() throws Exception {
    ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(true);

    // no initial uptime
    mockery.checking(buildBandwdithExpectations(true));
    mockery.checking(
        buildDHTExpectations(
            DHTMode.INACTIVE,
            true,
            true,
            true,
            DHTSettings.MIN_ACTIVE_DHT_AVERAGE_UPTIME.getValue() + 1,
            false,
            false));

    mockery.checking(
        new Expectations() {
          {
            never(dhtManager).start(with(Matchers.any(DHTMode.class)));
          }
        });

    assignerRunnable.run();
    mockery.assertIsSatisfied();
  }
 /**
  * @param l list to put the standard extentions we add to UDP pings
  * @return the guid to use for the ping
  */
 private GUID populateUDPGGEPList(List<NameValue<?>> l) {
   GUID guid;
   if (ConnectionSettings.EVER_ACCEPTED_INCOMING.getValue()) {
     guid = PingRequest.UDP_GUID;
   } else {
     l.add(new NameValue(GGEPKeys.GGEP_HEADER_IPPORT));
     guid = networkManager.getSolicitedGUID();
   }
   l.add(new NameValue<byte[]>(GGEPKeys.GGEP_HEADER_SUPPORT_CACHE_PONGS, getSCPData()));
   return guid;
 }
  public void testDoesNotPromoteIfNoUDP() throws Exception {
    ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(true);
    ApplicationSettings.AVERAGE_UPTIME.setValue(UltrapeerSettings.MIN_AVG_UPTIME.getValue() + 1);
    assertFalse(UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.getValue());

    mockery.checking(buildBandwdithExpectations(true));
    // no UDP support
    mockery.checking(buildUltrapeerExpectations(false, true, 0l, false, DHTMode.INACTIVE, false));
    // will not get promoted
    mockery.checking(buildPromotionExpectations(false));
    assignerRunnable.run();
    assertFalse(UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.getValue());
    mockery.assertIsSatisfied();
  }
  public void testDoesNotPromoteModemSpeed() throws Exception {
    ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(true);
    ApplicationSettings.AVERAGE_UPTIME.setValue(UltrapeerSettings.MIN_AVG_UPTIME.getValue() + 1);
    assertFalse(UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.getValue());

    // everything else fine
    // setting up bad bandwidth to simulate a modem speed
    mockery.checking(buildBandwdithExpectations(false));
    mockery.checking(buildUltrapeerExpectations(true, true, 0l, false, DHTMode.INACTIVE, false));
    mockery.checking(buildPromotionExpectations(false));

    assignerRunnable.run();
    assertFalse(UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.getValue());
    mockery.assertIsSatisfied();
  }
  public void testPromotesUltrapeer() throws Exception {
    ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(true);
    ApplicationSettings.AVERAGE_UPTIME.setValue(UltrapeerSettings.MIN_AVG_UPTIME.getValue() + 1);
    assertFalse(UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.getValue());

    // set up some conditions for ultrapeer-ness
    // all of them are required
    mockery.checking(buildBandwdithExpectations(true));
    mockery.checking(buildUltrapeerExpectations(true, true, 0l, false, DHTMode.INACTIVE, true));
    mockery.checking(buildPromotionExpectations(true));

    assignerRunnable.run();
    assertTrue(UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.getValue());
    mockery.assertIsSatisfied();
  }
  public void testDoesNotPromoteIfAverageUptimeLow() throws Exception {
    ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(true);
    // uptime bad
    ApplicationSettings.AVERAGE_UPTIME.setValue(UltrapeerSettings.MIN_AVG_UPTIME.getValue() - 1);
    assertFalse(UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.getValue());

    mockery.checking(buildBandwdithExpectations(true));
    mockery.checking(buildUltrapeerExpectations(true, true, 0L, false, DHTMode.INACTIVE, false));
    // will not get promoted
    mockery.checking(buildPromotionExpectations(false));
    assignerRunnable.run();

    // did not become capable this time either
    assertFalse(UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.getValue());
    mockery.assertIsSatisfied();
  }
  public void testDoesNotPromoteIfQueryTooSoon() throws Exception {
    ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(true);
    ApplicationSettings.AVERAGE_UPTIME.setValue(UltrapeerSettings.MIN_AVG_UPTIME.getValue() + 1);
    assertFalse(UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.getValue());

    mockery.checking(buildBandwdithExpectations(true));
    // last query now
    mockery.checking(
        buildUltrapeerExpectations(
            true, true, System.currentTimeMillis(), false, DHTMode.INACTIVE, false));
    // will not get promoted
    mockery.checking(buildPromotionExpectations(false));
    assignerRunnable.run();

    // we are ever_capable because of last time
    assertTrue(UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.getValue());
    mockery.assertIsSatisfied();
  }
  @Override
  protected void setSettings() throws Exception {

    ConnectionSettings.NUM_CONNECTIONS.setValue(4);
    SearchSettings.GUESS_ENABLED.setValue(true);
    UltrapeerSettings.DISABLE_ULTRAPEER_MODE.setValue(false);
    UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.setValue(true);
    UltrapeerSettings.FORCE_ULTRAPEER_MODE.setValue(true);
    ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(true);
    ConnectionSettings.CONNECT_ON_STARTUP.setValue(false);
    ConnectionSettings.LOCAL_IS_PRIVATE.setValue(false);
    FilterSettings.BLACK_LISTED_IP_ADDRESSES.set(new String[] {"*.*.*.*"});
    FilterSettings.WHITE_LISTED_IP_ADDRESSES.set(
        new String[] {"127.*.*.*", InetAddress.getLocalHost().getHostAddress()});

    ConnectionSettings.WATCHDOG_ACTIVE.setValue(false);
    ConnectionSettings.ALLOW_WHILE_DISCONNECTED.setValue(true);
    //        ConnectionSettings.PORT.setValue(6332);

    UltrapeerSettings.NEED_MIN_CONNECT_TIME.setValue(false);
  }
  public void testPromotesFromActiveDHTIfAllowed() throws Exception {
    // disallow switch to ultrapeer
    DHTSettings.SWITCH_TO_ULTRAPEER_PROBABILITY.setValue(1f);
    ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(true);
    ApplicationSettings.AVERAGE_UPTIME.setValue(UltrapeerSettings.MIN_AVG_UPTIME.getValue() + 1);
    assertFalse(UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.getValue());

    // pretend some time passed - the uptime counter in NodeAssigner is very hacky
    long startTime =
        System.currentTimeMillis() - DHTSettings.MIN_ACTIVE_DHT_INITIAL_UPTIME.getValue();
    PrivilegedAccessor.setValue(nodeAssigner, "startTime", new Long(startTime));

    mockery.checking(buildBandwdithExpectations(true));
    // enabled and active DHT
    mockery.checking(buildUltrapeerExpectations(true, true, 0l, true, DHTMode.ACTIVE, false));

    // but we're not an active ultrapeer and can receive solicited
    // but we've been up long enough tob e active in the DHT
    mockery.checking(
        new Expectations() {
          {
            one(connectionServices).isActiveSuperNode();
            will(returnValue(false));
            one(networkManager).canReceiveSolicited();
            will(returnValue(true));
            atLeast(1).of(cManager).getCurrentAverageUptime();
            will(returnValue(DHTSettings.MIN_ACTIVE_DHT_AVERAGE_UPTIME.getValue() + 1));
          }
        });

    // will get promoted
    mockery.checking(buildPromotionExpectations(true));

    assignerRunnable.run();

    assertTrue(UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.getValue());
    mockery.assertIsSatisfied();
  }