package com.linkedin.restli.client.config; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static com.linkedin.restli.client.config.RequestConfigProviderImpl.DEFAULT_TIMEOUT; import java.util.Optional; import org.testng.annotations.Test; import com.linkedin.restli.client.InboundRequestContext; import com.linkedin.restli.client.InboundRequestContextFinder; import com.linkedin.restli.client.ParSeqRestliClientConfigBuilder; import com.linkedin.restli.common.ResourceMethod; import com.linkedin.restli.examples.greetings.client.GreetingsBuilders; import com.linkedin.restli.examples.groups.client.GroupsBuilders; public class TestRequestConfigProvider { @Test public void testFromEmptyMap() throws RequestConfigKeyParsingException { RequestConfigProvider provider = RequestConfigProvider.build(new ParSeqRestliClientConfigBuilder().build(), () -> Optional.empty()); RequestConfig rc = provider.apply(new GreetingsBuilders().get().id(0L).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(DEFAULT_TIMEOUT)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(false)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(1024)); } @Test public void testFromEmptyMapOverrideDefault() throws RequestConfigKeyParsingException { ParSeqRestliClientConfigBuilder configBuilder = new ParSeqRestliClientConfigBuilder(); configBuilder.addTimeoutMs("*.*/*.*", 1000L); configBuilder.addMaxBatchSize("*.*/*.*", 4096); configBuilder.addBatchingEnabled("*.*/*.*", true); RequestConfigProvider provider = RequestConfigProvider.build(configBuilder.build(), () -> Optional.empty()); RequestConfig rc = provider.apply(new GreetingsBuilders().get().id(0L).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(1000L)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(true)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(4096)); } @Test public void testOutboundOp() throws RequestConfigKeyParsingException { ParSeqRestliClientConfigBuilder configBuilder = new ParSeqRestliClientConfigBuilder(); configBuilder.addTimeoutMs("*.*/*.GET", 1000L); RequestConfigProvider provider = RequestConfigProvider.build(configBuilder.build(), () -> Optional.empty()); RequestConfig rc = provider.apply(new GreetingsBuilders().get().id(0L).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(1000L)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(false)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(1024)); rc = provider.apply(new GreetingsBuilders().delete().id(0L).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(DEFAULT_TIMEOUT)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(false)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(1024)); } @Test public void testOutboundName() throws RequestConfigKeyParsingException { ParSeqRestliClientConfigBuilder configBuilder = new ParSeqRestliClientConfigBuilder(); configBuilder.addTimeoutMs("*.*/greetings.*", 1000L); RequestConfigProvider provider = RequestConfigProvider.build(configBuilder.build(), () -> Optional.empty()); RequestConfig rc = provider.apply(new GreetingsBuilders().get().id(0L).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(1000L)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(false)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(1024)); rc = provider.apply(new GroupsBuilders().get().id(10).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(DEFAULT_TIMEOUT)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(false)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(1024)); } @Test public void testTimeoutForGetManyConfigs() throws RequestConfigKeyParsingException { ParSeqRestliClientConfigBuilder configBuilder = new ParSeqRestliClientConfigBuilder(); configBuilder.addTimeoutMs("*.*/*.GET", 1000L); configBuilder.addTimeoutMs("x.GET/*.GET", 1000L); configBuilder.addTimeoutMs("y.GET/x1.GET", 1000L); configBuilder.addTimeoutMs("y.GET/x2.GET", 1000L); configBuilder.addTimeoutMs("*.GET/x.GET", 1000L); configBuilder.addTimeoutMs("*.GET/x2.GET", 1000L); RequestConfigProvider provider = RequestConfigProvider.build(configBuilder.build(), () -> Optional.empty()); RequestConfig rc = provider.apply(new GreetingsBuilders().get().id(0L).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(1000L)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(false)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(1024)); rc = provider.apply(new GreetingsBuilders().delete().id(0L).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(DEFAULT_TIMEOUT)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(false)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(1024)); } @Test public void testPrioritiesWithInboundAndOutboundMatch() throws RequestConfigKeyParsingException { ParSeqRestliClientConfigBuilder configBuilder = new ParSeqRestliClientConfigBuilder(); configBuilder.addTimeoutMs("*.*/*.GET", 1000L); configBuilder.addTimeoutMs("x.GET/*.GET", 1000L); configBuilder.addTimeoutMs("y.GET/x1.GET", 1000L); configBuilder.addTimeoutMs("y.GET/x2.GET", 1000L); configBuilder.addTimeoutMs("*.GET/x.GET", 1000L); configBuilder.addTimeoutMs("*.GET/x2.GET", 1000L); configBuilder.addTimeoutMs("*.GET/greetings.GET", 1000L); configBuilder.addTimeoutMs("greetings.GET/*.GET", 1000L); configBuilder.addTimeoutMs("greetings.GET/greetings.GET", 100L); configBuilder.addTimeoutMs("*.*/greetings.DELETE", 1000L); configBuilder.addTimeoutMs("greetings.*/greetings.DELETE", 1000L); configBuilder.addTimeoutMs("*.GET/greetings.DELETE", 1000L); configBuilder.addTimeoutMs("greetings.GET/greetings.DELETE", 500L); RequestConfigProvider provider = RequestConfigProvider.build(configBuilder.build(), requestContextFinder("greetings", ResourceMethod.GET.toString().toUpperCase(), Optional.empty(), Optional.empty())); RequestConfig rc = provider.apply(new GreetingsBuilders().get().id(0L).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(100L)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(false)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(1024)); rc = provider.apply(new GreetingsBuilders().delete().id(0L).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(500L)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(false)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(1024)); } @Test public void testPrioritiesWithInboundFinderAndOutboundMatch() throws RequestConfigKeyParsingException { ParSeqRestliClientConfigBuilder configBuilder = new ParSeqRestliClientConfigBuilder(); configBuilder.addTimeoutMs("*.*/*.GET", 1000L); configBuilder.addTimeoutMs("x.GET/*.GET", 1000L); configBuilder.addTimeoutMs("y.GET/x1.GET", 1000L); configBuilder.addTimeoutMs("y.GET/x2.GET", 1000L); configBuilder.addTimeoutMs("*.GET/x.GET", 1000L); configBuilder.addTimeoutMs("*.GET/x2.GET", 1000L); configBuilder.addTimeoutMs("*.GET/greetings.GET", 1000L); configBuilder.addTimeoutMs("greetings.GET/*.GET", 1000L); configBuilder.addTimeoutMs("greetings.GET/greetings.GET", 100L); configBuilder.addTimeoutMs("*.*/greetings.DELETE", 1000L); configBuilder.addTimeoutMs("greetings.*/greetings.DELETE", 1000L); configBuilder.addTimeoutMs("*.GET/greetings.DELETE", 1000L); configBuilder.addTimeoutMs("greetings.GET/greetings.DELETE", 500L); configBuilder.addTimeoutMs("greetings.FINDER-*/greetings.GET", 500L); configBuilder.addTimeoutMs("greetings.FINDER-*/greetings.DELETE", 500L); configBuilder.addTimeoutMs("greetings.FINDER-foobar/greetings.GET", 500L); configBuilder.addTimeoutMs("greetings.FINDER-foobar/greetings.DELETE", 500L); configBuilder.addTimeoutMs("greetings.FINDER-findAll/greetings.GET", 400L); configBuilder.addTimeoutMs("greetings.FINDER-findAll/greetings.DELETE", 300L); RequestConfigProvider provider = RequestConfigProvider.build(configBuilder.build(), requestContextFinder("greetings", "FINDER", Optional.of("findAll"), Optional.empty())); RequestConfig rc = provider.apply(new GreetingsBuilders().get().id(0L).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(400L)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(false)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(1024)); rc = provider.apply(new GreetingsBuilders().delete().id(0L).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(300L)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(false)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(1024)); } @Test public void testPrioritiesWithHttpInboundAndOutboundMatch() throws RequestConfigKeyParsingException { ParSeqRestliClientConfigBuilder configBuilder = new ParSeqRestliClientConfigBuilder(); configBuilder.addTimeoutMs("*.*/*.GET", 1000L); configBuilder.addTimeoutMs("x.GET/*.GET", 1000L); configBuilder.addTimeoutMs("y.GET/x1.GET", 1000L); configBuilder.addTimeoutMs("y.GET/x2.GET", 1000L); configBuilder.addTimeoutMs("*.GET/x.GET", 1000L); configBuilder.addTimeoutMs("*.GET/x2.GET", 1000L); configBuilder.addTimeoutMs("*.GET/greetings.GET", 1000L); configBuilder.addTimeoutMs("greetings.GET/*.GET", 1000L); configBuilder.addTimeoutMs("greetings.POST/greetings.GET", 100L); configBuilder.addTimeoutMs("*.*/greetings.DELETE", 1000L); configBuilder.addTimeoutMs("greetings.*/greetings.DELETE", 1000L); configBuilder.addTimeoutMs("*.GET/greetings.DELETE", 1000L); configBuilder.addTimeoutMs("greetings.POST/greetings.DELETE", 500L); RequestConfigProvider provider = RequestConfigProvider.build(configBuilder.build(), requestContextFinder("greetings", "POST", Optional.empty(), Optional.empty())); RequestConfig rc = provider.apply(new GreetingsBuilders().get().id(0L).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(100L)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(false)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(1024)); rc = provider.apply(new GreetingsBuilders().delete().id(0L).build()); assertNotNull(rc); assertEquals(rc.getTimeoutMs().getValue(), Long.valueOf(500L)); assertEquals(rc.isBatchingEnabled().getValue(), Boolean.valueOf(false)); assertEquals(rc.getMaxBatchSize().getValue(), Integer.valueOf(1024)); } private InboundRequestContextFinder requestContextFinder(String name, String method, Optional<String> finderName, Optional<String> actionName) { return new InboundRequestContextFinder() { @Override public Optional<InboundRequestContext> find() { return Optional.of(new InboundRequestContext() { @Override public String getName() { return name; } @Override public String getMethod() { return method; } @Override public Optional<String> getFinderName() { return finderName; } @Override public Optional<String> getActionName() { return actionName; } }); } }; } }