package test.http.router.handler.body; import com.firefly.$; import com.firefly.codec.http2.model.*; import com.firefly.server.http2.HTTP2ServerBuilder; import org.junit.Assert; import org.junit.Test; import test.http.router.handler.AbstractHTTPHandlerTest; import javax.servlet.http.Part; import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; import java.nio.ByteBuffer; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Phaser; import static org.hamcrest.Matchers.*; /** * @author Pengtao Qiu */ public class TestMultiPartContentProvider extends AbstractHTTPHandlerTest { @Test public void test() { MultiPartContentProvider multiPartProvider = new MultiPartContentProvider(); System.out.println(multiPartProvider.getContentType()); multiPartProvider.addFieldPart("test1", new StringContentProvider("hello multi part1"), null); multiPartProvider.addFieldPart("test2", new StringContentProvider("hello multi part2"), null); multiPartProvider.close(); multiPartProvider.setListener(() -> System.out.println("on content")); List<ByteBuffer> list = new ArrayList<>(); for (ByteBuffer buf : multiPartProvider) { list.add(buf); } String value = $.buffer.toString(list); System.out.println(value); System.out.println(multiPartProvider.getLength()); Assert.assertThat(multiPartProvider.getLength(), greaterThan(0L)); } @Test public void testInputStreamContent() { InputStream inputStream = $.class.getResourceAsStream("/poem.txt"); InputStreamContentProvider inputStreamContentProvider = new InputStreamContentProvider(inputStream); MultiPartContentProvider multiPartProvider = new MultiPartContentProvider(); System.out.println(multiPartProvider.getContentType()); multiPartProvider.addFilePart("poetry", "poem.txt", inputStreamContentProvider, null); multiPartProvider.close(); multiPartProvider.setListener(() -> System.out.println("on content")); List<ByteBuffer> list = new ArrayList<>(); for (ByteBuffer buf : multiPartProvider) { list.add(buf); } String value = $.buffer.toString(list); Assert.assertThat(value.length(), greaterThan(0)); System.out.println(multiPartProvider.getLength()); Assert.assertThat(multiPartProvider.getLength(), lessThan(0L)); } @Test public void testPathContent() throws URISyntaxException, IOException { Path path = Paths.get($.class.getResource("/poem.txt").toURI()); System.out.println(path.toAbsolutePath()); PathContentProvider pathContentProvider = new PathContentProvider(path); MultiPartContentProvider multiPartProvider = new MultiPartContentProvider(); multiPartProvider.addFilePart("poetry", "poem.txt", pathContentProvider, null); multiPartProvider.close(); multiPartProvider.setListener(() -> System.out.println("on content")); List<ByteBuffer> list = new ArrayList<>(); for (ByteBuffer buf : multiPartProvider) { list.add(buf); } System.out.println(multiPartProvider.getLength()); Assert.assertThat(multiPartProvider.getLength(), greaterThan(0L)); Assert.assertThat(multiPartProvider.getLength(), is($.buffer.remaining(list))); } @Test public void testMultiPart() { Phaser phaser = new Phaser(3); HTTP2ServerBuilder httpServer = $.httpServer(); httpServer.router().post("/upload/string").handler(ctx -> { // small multi part data test case Assert.assertThat(ctx.getParts().size(), is(2)); Part test1 = ctx.getPart("test1"); Part test2 = ctx.getPart("test2"); try (InputStream input1 = test1.getInputStream(); InputStream input2 = test2.getInputStream()) { String value = $.io.toString(input1); System.out.println(value); Assert.assertThat(value, is("hello multi part1")); String value2 = $.io.toString(input2); System.out.println(value2); Assert.assertThat(value2, is("hello multi part2")); } catch (IOException e) { e.printStackTrace(); } ctx.end("server received multi part data"); }).router().post("/upload/poetry").handler(ctx -> { // upload poetry System.out.println(ctx.getFields()); Part poetry = ctx.getPart("poetry"); Assert.assertThat(poetry.getSubmittedFileName(), is("poem.txt")); try (InputStream inputStream = $.class.getResourceAsStream("/poem.txt"); InputStream in = poetry.getInputStream()) { String poem = $.io.toString(inputStream); System.out.println(poem); Assert.assertThat(poem, is($.io.toString(in))); } catch (IOException e) { e.printStackTrace(); } ctx.end("server received poetry"); }).listen(host, port); $.httpClient().post(uri + "/upload/string") .addFieldPart("test1", new StringContentProvider("hello multi part1"), null) .addFieldPart("test2", new StringContentProvider("hello multi part2"), null) .submit() .thenAccept(res -> { System.out.println(res.getStringBody()); Assert.assertThat(res.getStatus(), is(HttpStatus.OK_200)); phaser.arrive(); }); InputStream inputStream = $.class.getResourceAsStream("/poem.txt"); InputStreamContentProvider inputStreamContentProvider = new InputStreamContentProvider(inputStream); $.httpClient().post(uri + "/upload/poetry") .addFilePart("poetry", "poem.txt", inputStreamContentProvider, null) .submit() .thenAccept(res -> { System.out.println(res.getStringBody()); Assert.assertThat(res.getStatus(), is(HttpStatus.OK_200)); $.io.close(inputStreamContentProvider); $.io.close(inputStream); phaser.arrive(); }); phaser.arriveAndAwaitAdvance(); httpServer.stop(); $.httpClient().stop(); } }