/* * #%L * Wisdom-Framework * %% * Copyright (C) 2013 - 2014 Wisdom Framework * %% * 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. * #L% */ package org.wisdom.framework.vertx; import io.netty.handler.codec.http.DefaultFullHttpRequest; import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpVersion; import io.vertx.core.Vertx; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.wisdom.api.Controller; import org.wisdom.api.DefaultController; import org.wisdom.api.configuration.ApplicationConfiguration; import org.wisdom.api.cookies.Cookie; import org.wisdom.api.http.HeaderNames; import org.wisdom.api.http.Result; import org.wisdom.api.router.Route; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class ContextFromVertxTest { Vertx vertx = Vertx.vertx(); private ServiceAccessor accessor; private ApplicationConfiguration configuration; @Rule public RunOnVertxContext runOnVertxContext = new RunOnVertxContext(); @Before public void setUp() { accessor = mock(ServiceAccessor.class); configuration = mock(ApplicationConfiguration.class); when(configuration.getWithDefault(Cookie.APPLICATION_COOKIE_PREFIX, "wisdom")) .thenReturn("wisdom"); when(accessor.getConfiguration()).thenReturn(configuration); } @After public void tearDown() { vertx.close(); } @Test public void testId() throws Exception { HttpRequest req = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/"); ContextFromVertx context = new ContextFromVertx(vertx, vertx.getOrCreateContext(), accessor, RequestFromVertXTest.create(req)); assertThat(context.id()).isNotNegative(); long id1 = context.id(); context = new ContextFromVertx(vertx, vertx.getOrCreateContext(), accessor, RequestFromVertXTest.create(req)); assertThat(id1).isLessThan(context.id()); } @Test public void testRequest() throws Exception { HttpRequest req = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/"); ContextFromVertx context = new ContextFromVertx(vertx, vertx.getOrCreateContext(), accessor, RequestFromVertXTest.create(req)); assertThat(context.request()).isNotNull(); } @Test public void testPath() throws Exception { HttpRequest req = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/"); ContextFromVertx context = new ContextFromVertx(vertx, vertx.getOrCreateContext(), accessor, RequestFromVertXTest.create(req)); assertThat(context.path()).isEqualTo("/"); req = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/foo"); context = new ContextFromVertx(vertx, vertx.getOrCreateContext(), accessor, RequestFromVertXTest.create(req)); assertThat(context.path()).isEqualTo("/foo"); req = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/foo?k=v"); context = new ContextFromVertx(vertx, vertx.getOrCreateContext(), accessor, RequestFromVertXTest.create(req)); assertThat(context.path()).isEqualTo("/foo"); } @Test public void testCookie() throws Exception { System.out.println(Thread.currentThread().getName() + " " + vertx.getOrCreateContext() + " " + Vertx.currentContext()); String c = "mediaWiki.user.id=0kn3VaEP7XG7mbxRPNgBOe5DNfOAGaHL; centralnotice_bucket=0-4.2; " + "uls-previous-languages=%5B%22en%22%5D; mediaWiki.user.sessionId=Mu2OplNdlL98mRoHEwKGlxYsOXbyP1f0; GeoIP=::::v6"; HttpRequest req = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/"); req.headers().set(HeaderNames.COOKIE, c); ContextFromVertx context = new ContextFromVertx(vertx, vertx.getOrCreateContext(), accessor, RequestFromVertXTest.create(req)); assertThat(context.cookies().get("mediaWiki.user.id").value()).isEqualTo("0kn3VaEP7XG7mbxRPNgBOe5DNfOAGaHL"); assertThat(context.cookies().get("GeoIP").value()).isEqualTo("::::v6"); assertThat(context.cookie("mediaWiki.user.id").value()).isEqualTo("0kn3VaEP7XG7mbxRPNgBOe5DNfOAGaHL"); assertThat(context.hasCookie("GeoIP")).isTrue(); assertThat(context.cookie("GeoIP").value()).isEqualTo("::::v6"); assertThat(context.cookieValue("GeoIP")).isEqualTo("::::v6"); req = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/"); context = new ContextFromVertx(vertx, vertx.getOrCreateContext(), accessor, RequestFromVertXTest.create(req)); assertThat(context.cookies().get("GeoIP")).isNull(); assertThat(context.cookie("GeoIP")).isNull(); assertThat(context.hasCookie("GeoIP")).isFalse(); } @Test public void testParameterFromQuery() throws Exception { HttpRequest req = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/foo?k=v&i=5&b=true"); ContextFromVertx context = new ContextFromVertx(vertx, vertx.getOrCreateContext(), accessor, RequestFromVertXTest.create(req)); assertThat(context.parameter("k")).isEqualTo("v"); assertThat(context.parameter("k", "v2")).isEqualTo("v"); assertThat(context.parameter("none")).isNull(); assertThat(context.parameter("none", "v2")).isEqualTo("v2"); assertThat(context.parameterAsInteger("i")).isEqualTo(5); assertThat(context.parameterAsInteger("j")).isNull(); assertThat(context.parameterAsInteger("i", 1)).isEqualTo(5); assertThat(context.parameterAsInteger("j", 1)).isEqualTo(1); assertThat(context.parameterAsBoolean("b")).isTrue(); assertThat(context.parameterAsBoolean("b2")).isFalse(); assertThat(context.parameterAsBoolean("b", false)).isTrue(); assertThat(context.parameterAsBoolean("b2", true)).isTrue(); req = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/foo?k=v&i=5&b=true&i=6"); context = new ContextFromVertx(vertx,vertx.getOrCreateContext(), accessor, RequestFromVertXTest.create(req)); assertThat(context.parameterMultipleValues("i")).containsExactly("5", "6"); } @Test public void testHeader() throws Exception { HttpRequest req = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/"); req.headers().add(HeaderNames.ACCEPT_ENCODING, "gzip, deflate"); req.headers().add(HeaderNames.ACCEPT_LANGUAGE, "en-US"); req.headers().add(HeaderNames.ACCEPT_CHARSET, "utf-8"); req.headers().add("test", "a").add("test", "b"); ContextFromVertx context = new ContextFromVertx(vertx, vertx.getOrCreateContext(), accessor, RequestFromVertXTest.create(req)); assertThat(context.headers().containsKey(HeaderNames.ACCEPT_LANGUAGE)).isTrue(); assertThat(context.header(HeaderNames.ACCEPT_LANGUAGE)).isEqualTo("en-US"); assertThat(context.headers().get("test")).containsExactly("a", "b"); assertThat(context.headers("test")).containsExactly("a", "b"); assertThat(context.headers().get("missing")).isNull(); assertThat(context.header("missing")).isNull(); } @Test public void testThatColonAreEncodedCorrectly() throws NoSuchMethodException { HttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/foo?key=value:value"); ContextFromVertx context = new ContextFromVertx(vertx, vertx.getOrCreateContext(), accessor, RequestFromVertXTest.create(request)); assertThat(context.path()).isEqualToIgnoringCase("/foo"); request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/foo/bar:baz/x"); context = new ContextFromVertx(vertx, vertx.getOrCreateContext(), accessor, RequestFromVertXTest.create(request)); Controller controller = new MyController(); context.route(new Route(org.wisdom.api.http.HttpMethod.GET, "/foo/{p}/x", controller, MyController.class.getMethod("action"))); assertThat(context.path()).isEqualToIgnoringCase("/foo/bar:baz/x"); String p = context.parameterFromPath("p"); assertThat(p).isEqualTo("bar:baz"); p = context.parameterFromPathEncoded("p"); assertThat(p).isEqualTo("bar:baz"); } private class MyController extends DefaultController { public Result action() { return ok(); } } }