test/jdk/javax/management/remote/rest/RestAdapterPerfTest.java
author hb
Thu, 04 Jan 2018 14:39:04 +0530
branchjmx-rest-api
changeset 56006 352a4f213fc6
parent 56003 4f7f76f6be2f
permissions -rw-r--r--
1. URL decoding of URL 2. MBean info availble in MBeanCollection page 3. MBeanCollection post supports objectname filtering 4. Tests now use reflection instead of Methodhndles 3. couple of bug fixes


/* @test
 * @summary Performance test for rest adapter
 * @library /test/lib
 * @modules java.management.rest/com.oracle.jmx.remote.rest.http
 *          java.management.rest/com.oracle.jmx.remote.rest.json
 *          java.management.rest/com.oracle.jmx.remote.rest.json.parser
 *          java.management.rest/com.oracle.jmx.remote.rest.mapper
 * @build RestAdapterPerfTest RestAdapterTest
 * @run testng/othervm RestAdapterPerfTest
 */

import java.lang.reflect.InvocationTargetException;
import jdk.test.lib.Utils;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.testng.annotations.Test;

@Test
public class RestAdapterPerfTest {

    private static Random random = Utils.getRandomInstance();
    private static AtomicInteger count = new AtomicInteger(1);

    @Test
    public void testMultipleClients() throws Exception {
        RestAdapterTest test = new RestAdapterTest();
        List<Runnable> tasks = Stream.of(RestAdapterTest.class.getMethods())
                .filter(m -> m.getName().startsWith("test")).map(m -> (Runnable)() -> {
                    try {
                        m.invoke(test);
                    } catch (IllegalAccessException e) {
                    } catch (InvocationTargetException e) {
                    }
                }).collect(Collectors.toList());

        ThreadPoolExecutor es = (ThreadPoolExecutor) Executors.newFixedThreadPool(20);
        es.setThreadFactory((Runnable R) -> new Thread(R, "perf-" + count.getAndIncrement()));
        long current = System.currentTimeMillis();
        test.setupServers();
        for (int i = 0; i < 200; i++) {
            Runnable task = tasks.get(random.nextInt(tasks.size()));
            es.execute(task);
        }

        System.out.println("Submitted 200 tasks");
        es.shutdown();
        es.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
        float v = (float) (System.currentTimeMillis() - current) / (float) 1000;
        System.out.println("Total time = " + v + "s");
        test.tearDownServers();
    }
}