package http_parser.lolevel; import java.nio.ByteBuffer; import http_parser.HTTPException; import http_parser.Util; public class UnitTest { static void p(Object o) {System.out.println(o);} public static void testErrorFormat() { String bla = "This has an error in position 10 (the n in 'an')"; ByteBuffer buf = ByteBuffer.wrap(bla.getBytes()); buf.position(10); String mes = "This has an error in position 10 (the n in 'an')\n" + "..........^"; check_equals(mes, Util.error ("test error", buf, 0)); bla = "123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J"; buf = ByteBuffer.wrap(bla.getBytes()); buf.position(50); mes = "56789B123456789C123456789D123456789E123456789F123456789G123456789H123456\n"+ "....................................^"; check_equals(mes, Util.error("test trim right and left", buf, 0)); buf.position(5); mes = "123456789A123456789B123456789C123456789D123456789E123456789F123456789G12\n"+ ".....^"; check_equals(mes, Util.error("test trim right", buf, 0)); int limit = buf.limit(); buf.limit(10); mes = "123456789A\n"+ ".....^"; check_equals(mes, Util.error("all before, not enough after", buf, 0)); buf.limit(limit); buf.position(90); mes = "9C123456789D123456789E123456789F123456789G123456789H123456789I123456789J\n"+ "..............................................................^"; check_equals(mes, Util.error("test trim left", buf, 10)); } // Test that the error callbacks are properly called. public static void testErrorCallback () { String nothttp = "THis is certainly not valid HTTP"; ByteBuffer buf = ByteBuffer.wrap(nothttp.getBytes()); ParserSettings s = new ParserSettings(); s.on_error = new HTTPErrorCallback() { public void cb (HTTPParser p, String mes, ByteBuffer buf, int pos) { throw new HTTPException(mes); } }; // err callback HTTPParser p = new HTTPParser(); try { p.execute(s, buf); } catch (HTTPException e) { check_equals("Invalid HTTP method", e.getMessage()); } buf = ByteBuffer.wrap("GET / HTTP 1.10000".getBytes()); p = new HTTPParser(); try { p.execute(s, buf); } catch (HTTPException e) { check_equals("ridiculous http minor", e.getMessage()); } // if no error handler is defined, behave just like the above... ParserSettings s0 = new ParserSettings(); buf = ByteBuffer.wrap("THis is certainly not valid HTTP".getBytes()); p = new HTTPParser(); try { p.execute(s0, buf); } catch (HTTPException e) { check_equals("Invalid HTTP method", e.getMessage()); } buf = ByteBuffer.wrap("GET / HTTP 1.10000".getBytes()); p = new HTTPParser(); try { p.execute(s0, buf); } catch (HTTPException e) { check_equals("ridiculous http minor", e.getMessage()); } } static void check_equals(Object supposed2be, Object is) { if (!supposed2be.equals(is)) { throw new RuntimeException(is + " is supposed to be "+supposed2be); } } public static void test () { p(UnitTest.class); testErrorFormat(); testErrorCallback(); } }