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 =

“56789B123456789C123456789D123456789E123456789F123456789G123456789H123456n”+ “.….….….….….….….….…^”;

check_equals(mes, Util.error("test trim right and left", buf, 0));

buf.position(5);
mes =

“123456789A123456789B123456789C123456789D123456789E123456789F123456789G12n”+ “.….^”;

check_equals(mes, Util.error("test trim right", buf, 0));

int limit = buf.limit();
buf.limit(10);
mes =

“123456789An”+ “.….^”;

check_equals(mes,  Util.error("all before, not enough after", buf, 0));

buf.limit(limit);
buf.position(90);  
mes =

“9C123456789D123456789E123456789F123456789G123456789H123456789I123456789Jn”+ “.….….….….….….….….….….….….….….…..^”;

  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();
}

}