Emberveil source

tests/ConcurrentLoginCheck.java

import com.rs2.game.players.*;
import java.util.*;
import java.util.concurrent.*;
public final class ConcurrentLoginCheck {
 static int checks;
 static void check(boolean b,String m){checks++;if(!b)throw new AssertionError(m);}
 static Client client(String name){Client c=new Client(null,1);c.playerName=name;c.isBot=true;return c;}
 public static void main(String[] args)throws Exception {
  for(int round=0;round<10;round++) {
   Arrays.fill(PlayerHandler.players,null);Arrays.fill(PlayerHandler.playersCurrentlyOn,null);
   PlayerHandler handler=new PlayerHandler();Client pending=client("still-saving");pending.disconnected=true;PlayerHandler.players[1]=pending;
   int count=64;ExecutorService pool=Executors.newFixedThreadPool(count);CountDownLatch ready=new CountDownLatch(count),start=new CountDownLatch(1);
   List<Client> clients=new ArrayList<>();List<Future<Boolean>> results=new ArrayList<>();
   for(int i=0;i<count;i++){Client c=client("concurrent"+i);clients.add(c);results.add(pool.submit(()->{ready.countDown();start.await();return handler.newPlayerClient(c);}));}
   check(ready.await(10,TimeUnit.SECONDS),"login threads become ready");start.countDown();
   Set<Integer> slots=new HashSet<>();for(int i=0;i<count;i++){check(results.get(i).get(10,TimeUnit.SECONDS),"simultaneous login admitted");Client c=clients.get(i);check(slots.add(c.playerId),"unique player slot");check(PlayerHandler.players[c.playerId]==c,"connection never overwritten");}
   pool.shutdownNow();check(PlayerHandler.players[1]==pending,"disconnected player retained until save/cleanup");
   check(PlayerHandler.isPlayerOn("CONCURRENT0"),"duplicate lookup sees reservation before next world tick");
   check(!handler.newPlayerClient(client("Concurrent0")),"duplicate login refused atomically");
  }
  Arrays.fill(PlayerHandler.players,null);System.out.println("PASS "+checks+" concurrent login reservation, duplicate and pending-save checks");
 }
}