Przetestowanie kodu z użyciem Semaphore - java.util.concurrent.Semaphore

0

Hej, stworzyłem kod:

https://gist.github.com/JakubGraczyk/6d178a61bb81b9a98b95ce2d3d28cd33?fbclid=IwAR1Vn2U_Y_So8BkYG2ZPWQdd6XvbTXEDdpJgSWuXWcpC9DDHP9J67RjO8s0

  • ma wpuścić do systemu tylko x userów,
  • ma pozwolić userowi na wygenerowanie maksymalnie y żądan w danej chwili,
  • obsłuhgiwać maxymalnie z żądań od wszystkich userów.

Mogę prosić was wskazówki jak to poprawnie przetestować? Zupełnie nie mam pomysłu na ten moment, a trochę już nad tym posiedziaem

0
  1. Warto by trochę zmienić kod metody work, aby rzeczywiście można tam przekazać coś do zrobienia:
 public boolean work(String user, Runnable thisMustBeDone) throws InterruptedException {
        long startTime = new Date().getTime();
        if (tryLogin(user) && tryPassRequestFromUser(user, startTime) && trySendRequest(user, startTime)) {
            thisMustBeDone.run();
            return true;
        } else {
            return false;
        }
    }
  1. A wtedy, korzystając z semaforów(!) można zrobić test:
@Test
    public  void testConcurrency() throws InterruptedException {
        final int maxNumberOfUsers = 2;
        final int maxNumberOFRequestsPerUser = 3;
        final int maxNumberOfRequests = 4;
        final long waitTimeInMillis = 2000;
        final Semaphore holdSemaphore = new Semaphore(0);
        final RequestsLimiter limiter = new RequestsLimiter(
                maxNumberOfUsers,
                maxNumberOFRequestsPerUser,
                maxNumberOfRequests,
                waitTimeInMillis
        );


        final int testThreads = 20;
        IntStream.range(0, testThreads).forEach(
                i ->  {
            new Thread(  () -> {
                try {
                    limiter.work("user" + i, () -> {
                        System.out.println("start work for :" + i);
                        holdSemaphore.acquireUninterruptibly();
                        System.out.println("end work for :" + i);

                    });
                }  catch (InterruptedException ie ){ }
            }
            ).start();
        });
        Thread.sleep(10);

        System.out.println("waiting " + holdSemaphore.getQueueLength());
        assertTrue( holdSemaphore.getQueueLength() <= maxNumberOfRequests);

        holdSemaphore.release(testThreads);
    }

Jak widać: etwas ist nein ja. Trochę jest tych błedów, ale to już sobie znajdziesz pewnie...

1 użytkowników online, w tym zalogowanych: 0, gości: 1