/*
* Copyright 2014 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.netflix.ribbon.http;
import com.netflix.hystrix.HystrixCommandProperties;
import com.netflix.ribbon.CacheProvider;
import com.netflix.ribbon.ClientOptions;
import com.netflix.ribbon.Ribbon;
import com.netflix.ribbon.RibbonRequest;
import com.netflix.ribbon.hystrix.HystrixObservableCommandChain;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.reactivex.netty.protocol.http.client.HttpClientRequest;
import io.reactivex.netty.protocol.http.client.HttpRequestHeaders;
import org.junit.Test;
import rx.Observable;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
public class TemplateBuilderTest {
private static class FakeCacheProvider implements CacheProvider<ByteBuf> {
String id;
FakeCacheProvider(String id) {
this.id = id;
}
@Override
public Observable<ByteBuf> get(final String key,
Map<String, Object> requestProperties) {
if (key.equals(id)) {
return Observable.just(Unpooled.buffer().writeBytes(id.getBytes(Charset.defaultCharset())));
} else {
return Observable.error(new IllegalArgumentException());
}
};
}
@Test
public void testVarReplacement() {
HttpResourceGroup group = Ribbon.createHttpResourceGroupBuilder("test").build();
HttpRequestTemplate<ByteBuf> template = group.newTemplateBuilder("testVarReplacement", ByteBuf.class)
.withMethod("GET")
.withUriTemplate("/foo/{id}?name={name}").build();
HttpClientRequest<ByteBuf> request = template
.requestBuilder()
.withRequestProperty("id", "3")
.withRequestProperty("name", "netflix")
.createClientRequest();
assertEquals("/foo/3?name=netflix", request.getUri());
}
@Test
public void testCacheKeyTemplates() {
HttpResourceGroup group = Ribbon.createHttpResourceGroupBuilder("test").build();
HttpRequestTemplate<ByteBuf> template = group.newTemplateBuilder("testCacheKeyTemplates", ByteBuf.class)
.withUriTemplate("/foo/{id}")
.withMethod("GET")
.withCacheProvider("/cache/{id}", new FakeCacheProvider("/cache/5"))
.build();
RibbonRequest<ByteBuf> request = template.requestBuilder().withRequestProperty("id", 5).build();
ByteBuf result = request.execute();
assertEquals("/cache/5", result.toString(Charset.defaultCharset()));
}
@Test
public void testHttpHeaders() {
HttpResourceGroup group = Ribbon.createHttpResourceGroupBuilder("test")
.withHeader("header1", "group").build();
HttpRequestTemplate<String> template = group.newTemplateBuilder("testHttpHeaders", String.class)
.withUriTemplate("/foo/bar")
.withMethod("GET")
.withHeader("header2", "template")
.withHeader("header1", "template").build();
HttpRequestBuilder<String> requestBuilder = template.requestBuilder();
requestBuilder.withHeader("header3", "builder").withHeader("header1", "builder");
HttpClientRequest<ByteBuf> request = requestBuilder.createClientRequest();
HttpRequestHeaders headers = request.getHeaders();
List<String> header1 = headers.getAll("header1");
assertEquals(3, header1.size());
assertEquals("group", header1.get(0));
assertEquals("template", header1.get(1));
assertEquals("builder", header1.get(2));
List<String> header2 = headers.getAll("header2");
assertEquals(1, header2.size());
assertEquals("template", header2.get(0));
List<String> header3 = headers.getAll("header3");
assertEquals(1, header3.size());
assertEquals("builder", header3.get(0));
}
@Test
public void testHystrixProperties() {
ClientOptions clientOptions = ClientOptions.create()
.withMaxAutoRetriesNextServer(1)
.withMaxAutoRetries(1)
.withConnectTimeout(1000)
.withMaxTotalConnections(400)
.withReadTimeout(2000);
HttpResourceGroup group = Ribbon.createHttpResourceGroup("test", clientOptions);
HttpRequestTemplate<ByteBuf> template = group.newTemplateBuilder("testHystrixProperties", ByteBuf.class)
.withMethod("GET")
.withUriTemplate("/foo/bar").build();
HttpRequest<ByteBuf> request = (HttpRequest<ByteBuf>) template
.requestBuilder().build();
HystrixObservableCommandChain<ByteBuf> hystrixCommandChain = request.createHystrixCommandChain();
HystrixCommandProperties props = hystrixCommandChain.getCommands().get(0).getProperties();
assertEquals(400, props.executionIsolationSemaphoreMaxConcurrentRequests().get().intValue());
assertEquals(12000, props.executionIsolationThreadTimeoutInMilliseconds().get().intValue());
}
}