+str #17361: Unified http java/scala projects except marshallers

This commit is contained in:
Endre Sándor Varga 2015-05-21 17:17:55 +02:00
parent 454a393af1
commit be82e85ffc
182 changed files with 13693 additions and 0 deletions

View file

@ -0,0 +1,82 @@
/*
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.http.javadsl.server;
import org.junit.Test;
import scala.Option;
import scala.concurrent.Future;
import akka.http.javadsl.model.HttpRequest;
import akka.http.javadsl.model.headers.Authorization;
import akka.http.javadsl.testkit.*;
import static akka.http.javadsl.server.Directives.*;
public class AuthenticationDirectivesTest extends JUnitRouteTest {
HttpBasicAuthenticator<String> authenticatedUser =
new HttpBasicAuthenticator<String>("test-realm") {
@Override
public Future<Option<String>> authenticate(BasicUserCredentials credentials) {
if (credentials.available() && // no anonymous access
credentials.userName().equals("sina") &&
credentials.verifySecret("1234"))
return authenticateAs("Sina");
else return refuseAccess();
}
};
Handler1<String> helloWorldHandler =
new Handler1<String>() {
@Override
public RouteResult handle(RequestContext ctx, String user) {
return ctx.complete("Hello "+user+"!");
}
};
TestRoute route =
testRoute(
path("secure").route(
authenticatedUser.route(
handleWith(authenticatedUser, helloWorldHandler)
)
)
);
@Test
public void testCorrectUser() {
HttpRequest authenticatedRequest =
HttpRequest.GET("/secure")
.addHeader(Authorization.basic("sina", "1234"));
route.run(authenticatedRequest)
.assertStatusCode(200)
.assertEntity("Hello Sina!");
}
@Test
public void testRejectAnonymousAccess() {
route.run(HttpRequest.GET("/secure"))
.assertStatusCode(401)
.assertEntity("The resource requires authentication, which was not supplied with the request")
.assertHeaderExists("WWW-Authenticate", "Basic realm=\"test-realm\"");
}
@Test
public void testRejectUnknownUser() {
HttpRequest authenticatedRequest =
HttpRequest.GET("/secure")
.addHeader(Authorization.basic("joe", "0000"));
route.run(authenticatedRequest)
.assertStatusCode(401)
.assertEntity("The supplied authentication is invalid");
}
@Test
public void testRejectWrongPassword() {
HttpRequest authenticatedRequest =
HttpRequest.GET("/secure")
.addHeader(Authorization.basic("sina", "1235"));
route.run(authenticatedRequest)
.assertStatusCode(401)
.assertEntity("The supplied authentication is invalid");
}
}

View file

@ -0,0 +1,93 @@
/*
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.http.javadsl.server;
import static akka.http.javadsl.server.Directives.*;
import akka.actor.ActorSystem;
import akka.http.javadsl.model.HttpRequest;
import akka.http.javadsl.model.headers.AcceptEncoding;
import akka.http.javadsl.model.headers.ContentEncoding;
import akka.http.javadsl.model.headers.HttpEncodings;
import akka.stream.ActorFlowMaterializer;
import akka.util.ByteString;
import org.junit.*;
import scala.concurrent.Await;
import scala.concurrent.duration.Duration;
import akka.http.javadsl.testkit.*;
import java.util.concurrent.TimeUnit;
public class CodingDirectivesTest extends JUnitRouteTest {
static ActorSystem system;
@BeforeClass
public static void setup() {
system = ActorSystem.create("FlowGraphDocTest");
}
@AfterClass
public static void tearDown() {
system.shutdown();
system.awaitTermination();
system = null;
}
final ActorFlowMaterializer mat = ActorFlowMaterializer.create(system);
@Test
public void testAutomaticEncodingWhenNoEncodingRequested() throws Exception {
TestRoute route =
testRoute(
encodeResponse(
complete("TestString")
)
);
TestResponse response = route.run(HttpRequest.create());
response
.assertStatusCode(200);
Assert.assertEquals("TestString", response.entityBytes().utf8String());
}
@Test
public void testAutomaticEncodingWhenDeflateRequested() throws Exception {
TestRoute route =
testRoute(
encodeResponse(
complete("tester")
)
);
HttpRequest request = HttpRequest.create().addHeader(AcceptEncoding.create(HttpEncodings.DEFLATE));
TestResponse response = route.run(request);
response
.assertStatusCode(200)
.assertHeaderExists(ContentEncoding.create(HttpEncodings.DEFLATE));
ByteString decompressed =
Await.result(Coder.Deflate.decode(response.entityBytes(), mat), Duration.apply(3, TimeUnit.SECONDS));
Assert.assertEquals("tester", decompressed.utf8String());
}
@Test
public void testEncodingWhenDeflateRequestedAndGzipSupported() {
TestRoute route =
testRoute(
encodeResponse(Coder.Gzip).route(
complete("tester")
)
);
HttpRequest request = HttpRequest.create().addHeader(AcceptEncoding.create(HttpEncodings.DEFLATE));
route.run(request)
.assertStatusCode(406)
.assertEntity("Resource representation is only available with these Content-Encodings:\ngzip");
}
@Test
public void testAutomaticDecoding() {}
@Test
public void testGzipDecoding() {}
}

View file

@ -0,0 +1,69 @@
/*
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.http.javadsl.server;
import akka.dispatch.Futures;
import akka.http.javadsl.marshallers.jackson.Jackson;
import akka.http.javadsl.model.HttpRequest;
import akka.http.javadsl.model.MediaTypes;
import org.junit.Test;
import akka.http.javadsl.testkit.*;
import java.util.concurrent.Callable;
import static akka.http.javadsl.server.Directives.*;
public class CompleteTest extends JUnitRouteTest {
@Test
public void completeWithString() {
Route route = complete("Everything OK!");
HttpRequest request = HttpRequest.create();
runRoute(route, request)
.assertStatusCode(200)
.assertMediaType(MediaTypes.TEXT_PLAIN)
.assertEntity("Everything OK!");
}
@Test
public void completeAsJacksonJson() {
class Person {
public String getFirstName() { return "Peter"; }
public String getLastName() { return "Parker"; }
public int getAge() { return 138; }
}
Route route = completeAs(Jackson.json(), new Person());
HttpRequest request = HttpRequest.create();
runRoute(route, request)
.assertStatusCode(200)
.assertMediaType("application/json")
.assertEntity("{\"age\":138,\"firstName\":\"Peter\",\"lastName\":\"Parker\"}");
}
@Test
public void completeWithFuture() {
Parameter<Integer> x = Parameters.integer("x");
Parameter<Integer> y = Parameters.integer("y");
Handler2<Integer, Integer> slowCalc = new Handler2<Integer, Integer>() {
@Override
public RouteResult handle(final RequestContext ctx, final Integer x, final Integer y) {
return ctx.completeWith(Futures.future(new Callable<RouteResult>() {
@Override
public RouteResult call() throws Exception {
int result = x + y;
return ctx.complete(String.format("%d + %d = %d",x, y, result));
}
}, executionContext()));
}
};
Route route = handleWith(x, y, slowCalc);
runRoute(route, HttpRequest.GET("add?x=42&y=23"))
.assertStatusCode(200)
.assertEntity("42 + 23 = 65");
}
}

View file

@ -0,0 +1,149 @@
/*
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.http.javadsl.server;
import akka.http.scaladsl.model.HttpRequest;
import org.junit.Test;
import akka.http.javadsl.testkit.*;
import static akka.http.javadsl.server.Directives.*;
public class HandlerBindingTest extends JUnitRouteTest {
@Test
public void testHandlerWithoutExtractions() {
Route route = handleWith(
new Handler() {
@Override
public RouteResult handle(RequestContext ctx) {
return ctx.complete("Ok");
}
}
);
runRoute(route, HttpRequest.GET("/"))
.assertEntity("Ok");
}
@Test
public void testHandlerWithSomeExtractions() {
final Parameter<Integer> a = Parameters.integer("a");
final Parameter<Integer> b = Parameters.integer("b");
Route route = handleWith(
new Handler() {
@Override
public RouteResult handle(RequestContext ctx) {
return ctx.complete("Ok a:" + a.get(ctx) +" b:" + b.get(ctx));
}
}, a, b
);
runRoute(route, HttpRequest.GET("?a=23&b=42"))
.assertEntity("Ok a:23 b:42");
}
@Test
public void testHandlerIfExtractionFails() {
final Parameter<Integer> a = Parameters.integer("a");
Route route = handleWith(
new Handler() {
@Override
public RouteResult handle(RequestContext ctx) {
return ctx.complete("Ok " + a.get(ctx));
}
}, a
);
runRoute(route, HttpRequest.GET("/"))
.assertStatusCode(404)
.assertEntity("Request is missing required query parameter 'a'");
}
@Test
public void testHandler1() {
final Parameter<Integer> a = Parameters.integer("a");
Route route = handleWith(
a,
new Handler1<Integer>() {
@Override
public RouteResult handle(RequestContext ctx, Integer a) {
return ctx.complete("Ok " + a);
}
}
);
runRoute(route, HttpRequest.GET("?a=23"))
.assertStatusCode(200)
.assertEntity("Ok 23");
}
@Test
public void testHandler2() {
Route route = handleWith(
Parameters.integer("a"),
Parameters.integer("b"),
new Handler2<Integer, Integer>() {
@Override
public RouteResult handle(RequestContext ctx, Integer a, Integer b) {
return ctx.complete("Sum: " + (a + b));
}
}
);
runRoute(route, HttpRequest.GET("?a=23&b=42"))
.assertStatusCode(200)
.assertEntity("Sum: 65");
}
@Test
public void testHandler3() {
Route route = handleWith(
Parameters.integer("a"),
Parameters.integer("b"),
Parameters.integer("c"),
new Handler3<Integer, Integer, Integer>() {
@Override
public RouteResult handle(RequestContext ctx, Integer a, Integer b, Integer c) {
return ctx.complete("Sum: " + (a + b + c));
}
}
);
TestResponse response = runRoute(route, HttpRequest.GET("?a=23&b=42&c=30"));
response.assertStatusCode(200);
response.assertEntity("Sum: 95");
}
@Test
public void testHandler4() {
Route route = handleWith(
Parameters.integer("a"),
Parameters.integer("b"),
Parameters.integer("c"),
Parameters.integer("d"),
new Handler4<Integer, Integer, Integer, Integer>() {
@Override
public RouteResult handle(RequestContext ctx, Integer a, Integer b, Integer c, Integer d) {
return ctx.complete("Sum: " + (a + b + c + d));
}
}
);
runRoute(route, HttpRequest.GET("?a=23&b=42&c=30&d=45"))
.assertStatusCode(200)
.assertEntity("Sum: 140");
}
@Test
public void testReflectiveInstanceHandler() {
class Test {
public RouteResult negate(RequestContext ctx, int a) {
return ctx.complete("Negated: " + (- a));
}
}
Route route = handleWith(new Test(), "negate", Parameters.integer("a"));
runRoute(route, HttpRequest.GET("?a=23"))
.assertStatusCode(200)
.assertEntity("Negated: -23");
}
public static RouteResult squared(RequestContext ctx, int a) {
return ctx.complete("Squared: " + (a * a));
}
@Test
public void testStaticReflectiveHandler() {
Route route = handleWith(HandlerBindingTest.class, "squared", Parameters.integer("a"));
runRoute(route, HttpRequest.GET("?a=23"))
.assertStatusCode(200)
.assertEntity("Squared: 529");
}
}

View file

@ -0,0 +1,222 @@
/*
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.http.javadsl.server;
import static akka.http.javadsl.server.Directives.*;
import akka.http.javadsl.testkit.*;
import akka.http.scaladsl.model.HttpRequest;
import org.junit.Test;
import java.util.List;
import java.util.UUID;
public class PathDirectivesTest extends JUnitRouteTest {
@Test
public void testPathPrefixAndPath() {
TestRoute route =
testRoute(
pathPrefix("pet").route(
path("cat").route(complete("The cat!")),
path("dog").route(complete("The dog!")),
pathSingleSlash().route(complete("Here are only pets."))
)
);
route.run(HttpRequest.GET("/pet/"))
.assertEntity("Here are only pets.");
route.run(HttpRequest.GET("/pet")) // missing trailing slash
.assertStatusCode(404);
route.run(HttpRequest.GET("/pet/cat"))
.assertEntity("The cat!");
route.run(HttpRequest.GET("/pet/dog"))
.assertEntity("The dog!");
}
@Test
public void testRawPathPrefix() {
TestRoute route1 =
testRoute(
rawPathPrefix(PathMatchers.SLASH(), "pet", PathMatchers.SLASH(), "", PathMatchers.SLASH(), "cat").route(
complete("The cat!")
)
);
route1.run(HttpRequest.GET("/pet//cat"))
.assertEntity("The cat!");
// any suffix allowed
route1.run(HttpRequest.GET("/pet//cat/abcdefg"))
.assertEntity("The cat!");
TestRoute route2 =
testRoute(
rawPathPrefix(PathMatchers.SLASH(), "pet", PathMatchers.SLASH(), "", PathMatchers.SLASH(), "cat", PathMatchers.END()).route(
complete("The cat!")
)
);
route2.run(HttpRequest.GET("/pet//cat"))
.assertEntity("The cat!");
route2.run(HttpRequest.GET("/pet//cat/abcdefg"))
.assertStatusCode(404);
}
@Test
public void testSegment() {
PathMatcher<String> name = PathMatchers.segment();
TestRoute route =
testRoute(
path("hey", name).route(toStringEcho(name))
);
route.run(HttpRequest.GET("/hey/jude"))
.assertEntity("jude");
}
@Test
public void testSingleSlash() {
TestRoute route =
testRoute(
pathSingleSlash().route(complete("Ok"))
);
route.run(HttpRequest.GET("/"))
.assertEntity("Ok");
route.run(HttpRequest.GET("/abc"))
.assertStatusCode(404);
}
@Test
public void testIntegerMatcher() {
PathMatcher<Integer> age = PathMatchers.integerNumber();
TestRoute route =
testRoute(
path("age", age).route(toStringEcho(age))
);
route.run(HttpRequest.GET("/age/38"))
.assertEntity("38");
route.run(HttpRequest.GET("/age/abc"))
.assertStatusCode(404);
}
@Test
public void testTwoVals() {
// tests that `x` and `y` have different identities which is important for
// retrieving the values
PathMatcher<Integer> x = PathMatchers.integerNumber();
PathMatcher<Integer> y = PathMatchers.integerNumber();
TestRoute route =
testRoute(
path("multiply", x, y).route(
handleWith(x, y, new Handler2<Integer, Integer>() {
@Override
public RouteResult handle(RequestContext ctx, Integer x, Integer y) {
return ctx.complete(String.format("%d * %d = %d", x, y, x * y));
}
})
)
);
route.run(HttpRequest.GET("/multiply/3/6"))
.assertEntity("3 * 6 = 18");
}
@Test
public void testHexIntegerMatcher() {
PathMatcher<Integer> color = PathMatchers.hexIntegerNumber();
TestRoute route =
testRoute(
path("color", color).route(toStringEcho(color))
);
route.run(HttpRequest.GET("/color/a0c2ef"))
.assertEntity(Integer.toString(0xa0c2ef));
}
@Test
public void testLongMatcher() {
PathMatcher<Long> bigAge = PathMatchers.longNumber();
TestRoute route =
testRoute(
path("bigage", bigAge).route(toStringEcho(bigAge))
);
route.run(HttpRequest.GET("/bigage/12345678901"))
.assertEntity("12345678901");
}
@Test
public void testHexLongMatcher() {
PathMatcher<Long> code = PathMatchers.hexLongNumber();
TestRoute route =
testRoute(
path("code", code).route(toStringEcho(code))
);
route.run(HttpRequest.GET("/code/a0b1c2d3e4f5"))
.assertEntity(Long.toString(0xa0b1c2d3e4f5L));
}
@Test
public void testRestMatcher() {
PathMatcher<String> rest = PathMatchers.rest();
TestRoute route =
testRoute(
path("pets", rest).route(toStringEcho(rest))
);
route.run(HttpRequest.GET("/pets/afdaoisd/asda/sfasfasf/asf"))
.assertEntity("afdaoisd/asda/sfasfasf/asf");
}
@Test
public void testUUIDMatcher() {
PathMatcher<UUID> uuid = PathMatchers.uuid();
TestRoute route =
testRoute(
path("by-uuid", uuid).route(toStringEcho(uuid))
);
route.run(HttpRequest.GET("/by-uuid/6ba7b811-9dad-11d1-80b4-00c04fd430c8"))
.assertEntity("6ba7b811-9dad-11d1-80b4-00c04fd430c8");
}
@Test
public void testSegmentsMatcher() {
PathMatcher<List<String>> segments = PathMatchers.segments();
TestRoute route =
testRoute(
path("pets", segments).route(toStringEcho(segments))
);
route.run(HttpRequest.GET("/pets/cat/dog"))
.assertEntity("[cat, dog]");
}
private <T> Route toStringEcho(RequestVal<T> value) {
return handleWith(value, new Handler1<T>() {
@Override
public RouteResult handle(RequestContext ctx, T t) {
return ctx.complete(t.toString());
}
});
}
}

View file

@ -0,0 +1,79 @@
/*
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.http.javadsl.server.examples.petstore;
import akka.http.javadsl.marshallers.jackson.Jackson;
import akka.http.javadsl.model.HttpRequest;
import akka.http.javadsl.model.MediaTypes;
import akka.http.javadsl.testkit.*;
import static org.junit.Assert.*;
import akka.http.javadsl.testkit.TestRoute;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
public class PetStoreAPITest extends JUnitRouteTest {
@Test
public void testGetPet() {
TestResponse response = createRoute().run(HttpRequest.GET("/pet/1"));
response
.assertStatusCode(200)
.assertMediaType("application/json");
Pet pet = response.entityAs(Jackson.jsonAs(Pet.class));
assertEquals("cat", pet.getName());
assertEquals(1, pet.getId());
}
@Test
public void testGetMissingPet() {
createRoute().run(HttpRequest.GET("/pet/999"))
.assertStatusCode(404);
}
@Test
public void testPutPet() {
HttpRequest request =
HttpRequest.PUT("/pet/1")
.withEntity(MediaTypes.APPLICATION_JSON.toContentType(), "{\"id\": 1, \"name\": \"giraffe\"}");
TestResponse response = createRoute().run(request);
response.assertStatusCode(200);
Pet pet = response.entityAs(Jackson.jsonAs(Pet.class));
assertEquals("giraffe", pet.getName());
assertEquals(1, pet.getId());
}
@Test
public void testDeletePet() {
Map<Integer, Pet> data = createData();
HttpRequest request = HttpRequest.DELETE("/pet/0");
createRoute(data).run(request)
.assertStatusCode(200);
// test actual deletion from data store
assertFalse(data.containsKey(0));
}
private TestRoute createRoute() {
return createRoute(createData());
}
private TestRoute createRoute(Map<Integer, Pet> pets) {
return testRoute(PetStoreExample.appRoute(pets));
}
private Map<Integer, Pet> createData() {
Map<Integer, Pet> pets = new HashMap<Integer, Pet>();
Pet dog = new Pet(0, "dog");
Pet cat = new Pet(1, "cat");
pets.put(0, dog);
pets.put(1, cat);
return pets;
}
}

View file

@ -0,0 +1,22 @@
/*
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.http.javadsl.server.examples.simple;
import akka.http.javadsl.model.HttpRequest;
import akka.http.javadsl.testkit.*;
import org.junit.Test;
public class SimpleServerTest extends JUnitRouteTest {
TestRoute route = testRoute(new SimpleServerApp().createRoute());
@Test
public void testAdd() {
TestResponse response = route.run(HttpRequest.GET("/add?x=42&y=23"));
response
.assertStatusCode(200)
.assertEntity("42 + 23 = 65");
}
}