open Pxp_reader;; open Pxp_types;; open Netchannels;; open Minilex;; let null_rid = { rid_private = None; rid_system = None; rid_system_base = None; rid_public = None } ;; (**********************************************************************) (* t00X: lexical level *) let t001 () = (* Reads from a string (without recoding it), checks active_id *) let s = "0123456789abc" in let pid = allocate_private_id() in let xid = Private pid in let channel_of_id rid = assert(rid.rid_private = Some pid); assert(rid.rid_public = None); assert(rid.rid_system = None); assert(rid.rid_system_base = None); let ch = new input_string s in (ch, None, None) in let r = new resolve_to_any_obj_channel ~channel_of_id () in r # init_rep_encoding `Enc_iso88591; r # init_warner None (new drop_warnings); let lsrc = r # open_in xid in let lb = Lazy.force lsrc.lsrc_lexbuf in let aid = r # active_id in assert(aid.rid_private = Some pid); assert(aid.rid_public = None); assert(aid.rid_system = None); assert(aid.rid_system_base = None); let c = nextchar lb in assert (c = Some '0'); ignore(nextchar lb); ignore(nextchar lb); ignore(nextchar lb); ignore(nextchar lb); ignore(nextchar lb); ignore(nextchar lb); ignore(nextchar lb); ignore(nextchar lb); let c = nextchar lb in assert (c = Some '9'); r # change_encoding ""; let c = nextchar lb in assert (c = Some 'a'); ignore(nextchar lb); let c = nextchar lb in assert (c = Some 'c'); let c = nextchar lb in assert (c = None); r # close_in; true ;; (**********************************************************************) (* t01X: acceptance algebra *) let t010() = (* A rid matches itself, and a stronger rid matches a weaker rid *) let pid = allocate_private_id() in let rid1 = { null_rid with rid_private = Some pid } in let rid2 = { null_rid with rid_system = Some "file:///this/is/a/file" } in let rid3 = { null_rid with rid_public = Some "//A//PUBIC//NAME" } in let rid12 = { null_rid with rid_private = Some pid; rid_system = Some "file:///this/is/a/file"; } in let rid23 = { null_rid with rid_system = Some "file:///this/is/a/file"; rid_public = Some "//A//PUBIC//NAME" } in let rid13 = { null_rid with rid_private = Some pid; rid_public = Some "//A//PUBIC//NAME"; } in let rid123 = { null_rid with rid_private = Some pid; rid_system = Some "file:///this/is/a/file"; rid_public = Some "//A//PUBIC//NAME" } in let matches r r' r'' = (* r matches with r', and the active_id is r'' *) let ch = new input_string "" in let res = new resolve_to_this_obj_channel ~rid:r ch in res # init_rep_encoding `Enc_iso88591; res # init_warner None (new drop_warnings); try ignore(res # open_rid r'); assert(res # active_id = r''); true with Not_competent -> false in assert (matches rid1 rid1 rid1); assert (matches rid2 rid2 rid2); assert (matches rid3 rid3 rid3); assert (matches rid12 rid12 rid12); assert (matches rid23 rid23 rid23); assert (matches rid13 rid13 rid13); assert (matches rid123 rid123 rid123); assert (matches rid1 rid12 rid1); assert (matches rid1 rid13 rid1); assert (matches rid1 rid123 rid1); assert (not(matches rid1 rid2 rid1)); assert (not(matches rid1 rid3 rid1)); assert (not(matches rid1 rid23 rid1)); assert (matches rid2 rid12 rid2); assert (matches rid2 rid23 rid2); assert (matches rid2 rid123 rid2); assert (not(matches rid2 rid1 rid2)); assert (not(matches rid2 rid3 rid2)); assert (not(matches rid2 rid13 rid2)); assert (matches rid3 rid13 rid3); assert (matches rid3 rid23 rid3); assert (matches rid3 rid123 rid3); assert (not(matches rid3 rid1 rid3)); assert (not(matches rid3 rid2 rid3)); assert (not(matches rid3 rid12 rid3)); assert (matches rid12 rid12 rid12); assert (matches rid12 rid123 rid12); assert (matches rid12 rid1 rid1); assert (matches rid12 rid2 rid2); assert (matches rid12 rid13 rid1); assert (not(matches rid12 rid3 rid1)); assert (matches rid13 rid12 rid1); assert (matches rid13 rid123 rid13); assert (matches rid13 rid1 rid1); assert (matches rid13 rid3 rid3); assert (matches rid13 rid23 rid3); assert (not(matches rid13 rid2 rid1)); assert (matches rid23 rid12 rid2); assert (matches rid23 rid123 rid23); assert (matches rid23 rid2 rid2); assert (matches rid23 rid3 rid3); assert (matches rid23 rid13 rid3); assert (not(matches rid23 rid1 rid1)); assert (matches rid123 rid12 rid12); assert (matches rid123 rid23 rid23); assert (matches rid123 rid2 rid2); assert (matches rid123 rid3 rid3); assert (matches rid123 rid13 rid13); assert (matches rid123 rid1 rid1); true ;; let t011() = (* A xid matches corresponding rid itself, and a stronger xid matches a * weaker rid *) let pid = allocate_private_id() in let rid1 = { null_rid with rid_private = Some pid } in let xid1 = Private pid in let rid2 = { null_rid with rid_system = Some "file:///this/is/a/file" } in let xid2 = System "file:///this/is/a/file" in let rid3 = { null_rid with rid_public = Some "//A//PUBIC//NAME" } in let rid12 = { null_rid with rid_private = Some pid; rid_system = Some "file:///this/is/a/file"; } in let rid23 = { null_rid with rid_system = Some "file:///this/is/a/file"; rid_public = Some "//A//PUBIC//NAME" } in let xid23 = Public("//A//PUBIC//NAME", "file:///this/is/a/file") in let rid13 = { null_rid with rid_private = Some pid; rid_public = Some "//A//PUBIC//NAME"; } in let rid123 = { null_rid with rid_private = Some pid; rid_system = Some "file:///this/is/a/file"; rid_public = Some "//A//PUBIC//NAME" } in let matches r r' r'' = (* r matches with r', and the active_id is r'' *) let ch = new input_string "" in let res = new resolve_to_this_obj_channel ~id:r ch in res # init_rep_encoding `Enc_iso88591; res # init_warner None (new drop_warnings); try ignore(res # open_rid r'); assert(res # active_id = r''); true with Not_competent -> false in assert (not(matches Anonymous rid1 rid1)); assert (not(matches Anonymous rid2 rid2)); assert (not(matches Anonymous rid3 rid3)); assert (not(matches Anonymous null_rid null_rid)); assert (matches xid1 rid1 rid1); assert (matches xid1 rid12 rid1); assert (matches xid1 rid13 rid1); assert (matches xid1 rid123 rid1); assert (not(matches xid1 rid2 rid1)); assert (not(matches xid1 rid3 rid1)); assert (not(matches xid1 rid23 rid1)); assert (matches xid2 rid2 rid2); assert (matches xid2 rid12 rid2); assert (matches xid2 rid23 rid2); assert (matches xid2 rid123 rid2); assert (not(matches xid2 rid1 rid1)); assert (not(matches xid2 rid3 rid1)); assert (not(matches xid2 rid13 rid1)); assert (matches xid23 rid2 rid2); assert (matches xid23 rid3 rid3); assert (matches xid23 rid23 rid23); assert (matches xid23 rid12 rid2); assert (matches xid23 rid13 rid3); assert (matches xid23 rid123 rid23); assert (not(matches xid23 rid1 rid1)); true ;; (**********************************************************************) (* t02X: URLs and relative resolution *) let url_syntax = { Neturl.null_url_syntax with Neturl.url_enable_scheme = Neturl.Url_part_allowed; Neturl.url_enable_host = Neturl.Url_part_allowed; Neturl.url_enable_path = Neturl.Url_part_required; Neturl.url_accepts_8bits = true; } ;; let t020 () = let u1 = Neturl.url_of_string url_syntax "http://host/x/y" in let u2 = Neturl.url_of_string url_syntax "http://host/y/z" in let u3 = Neturl.url_of_string url_syntax "/a/b" in let u4 = Neturl.url_of_string url_syntax "c" in let test_urls base url active_url = let ch = new input_string "" in let url_of_id _ = url in let base_url_of_id _ = base in let channel_of_url _ _ = ch, None, None in let res = new resolve_to_url_obj_channel ~url_of_id ~base_url_of_id ~channel_of_url () in res # init_rep_encoding `Enc_iso88591; res # init_warner None (new drop_warnings); try ignore(res # open_rid null_rid); (res # active_id).rid_system = Some active_url with Not_competent -> assert false in assert(test_urls u1 u2 "http://host/y/z"); assert(test_urls u1 u3 "http://host/a/b"); assert(test_urls u1 u4 "http://host/x/c"); true ;; let t021 () = let u1 = Neturl.url_of_string url_syntax "http://host/x/y" in let u2 = Neturl.url_of_string url_syntax "http://host/y/z" in let u3 = Neturl.url_of_string url_syntax "/a/b" in let u4 = Neturl.url_of_string url_syntax "c" in let a = new input_string "a" in let b = new input_string "b" in let c = new input_string "c" in let pid_a = allocate_private_id() in let pid_b = allocate_private_id() in let pid_c = allocate_private_id() in let url_of_id rid = match rid.rid_private with Some p when p = pid_a -> u2 | Some p when p = pid_b -> u3 | Some p when p = pid_c -> u4 | _ -> assert false in let base_url_of_id rid = match rid.rid_system_base with Some base -> Neturl.url_of_string url_syntax base | _ -> assert false in let channel_of_url _ u = match Neturl.string_of_url u with "http://host/y/z" -> a, None, None | "http://host/a/b" -> b, None, None | "http://host/a/c" -> c, None, None | _ -> assert false in let res_a = new resolve_to_url_obj_channel ~url_of_id ~base_url_of_id ~channel_of_url () in res_a # init_rep_encoding `Enc_iso88591; res_a # init_warner None (new drop_warnings); let lex_a_src = res_a # open_rid { null_rid with rid_private = Some pid_a; rid_system_base = Some "http://host/x/y" } in let lex_a = Lazy.force lex_a_src.lsrc_lexbuf in assert(nextchar lex_a = Some 'a'); let res_b = res_a # clone in let lex_b_src = res_b # open_rid { null_rid with rid_private = Some pid_b; rid_system_base = (res_a # active_id).rid_system; } in let lex_b = Lazy.force lex_b_src.lsrc_lexbuf in assert(nextchar lex_b = Some 'b'); let res_c = res_b # clone in let lex_c_src = res_c # open_rid { null_rid with rid_private = Some pid_c; rid_system_base = (res_b # active_id).rid_system; } in let lex_c = Lazy.force lex_c_src.lsrc_lexbuf in assert(nextchar lex_c = Some 'c'); true ;; let t022 () = let res_a = new resolve_as_file ~base_url_defaults_to_cwd:true () in res_a # init_rep_encoding `Enc_iso88591; res_a # init_warner None (new drop_warnings); let lex_a_src = res_a # open_rid { null_rid with rid_system = Some "t_a.dat"; rid_system_base = None; } in let lex_a = Lazy.force lex_a_src.lsrc_lexbuf in assert(nextchar lex_a = Some 'a'); let res_b = res_a # clone in let lex_b_src = res_b # open_rid { null_rid with rid_system = Some "t_b.dat"; rid_system_base = (res_a # active_id).rid_system; } in let lex_b = Lazy.force lex_b_src.lsrc_lexbuf in assert(nextchar lex_b = Some 'b'); true ;; let t023 () = let prefix = "file://" ^ Sys.getcwd() in let res_a = new norm_system_id ( new lookup_id_as_file [ Public("A", prefix ^ "/t_a.dat"), "t_a.dat"; System(prefix ^ "/t_b.dat"), "t_b.dat" ] ) in res_a # init_rep_encoding `Enc_iso88591; res_a # init_warner None (new drop_warnings); let lex_a_src = res_a # open_rid { null_rid with rid_public = Some "A"; rid_system_base = None; } in let lex_a = Lazy.force lex_a_src.lsrc_lexbuf in assert(nextchar lex_a = Some 'a'); let res_b = res_a # clone in let lex_b_src = res_b # open_rid { null_rid with rid_system = Some "./%74_b.dat"; rid_system_base = (res_a # active_id).rid_system; } in let lex_b = Lazy.force lex_b_src.lsrc_lexbuf in assert(nextchar lex_b = Some 'b'); true ;; let t024 () = let prefix = "file://" ^ Sys.getcwd() in let res_a = new rewrite_system_id [ "http://user@foo/x/y/", prefix ^ "/" ] ( new lookup_id_as_file [ Public("A", prefix ^ "/t_a.dat"), "t_a.dat"; System(prefix ^ "/t_b.dat"), "t_b.dat" ] ) in res_a # init_rep_encoding `Enc_iso88591; res_a # init_warner None (new drop_warnings); let lex_a_src = res_a # open_rid { null_rid with rid_system = Some "http://user@foo/x/y/t_a.dat"; rid_system_base = None; } in let lex_a = Lazy.force lex_a_src.lsrc_lexbuf in assert(nextchar lex_a = Some 'a'); let res_b = res_a # clone in let lex_b_src = res_b # open_rid { null_rid with rid_system = Some "./%74_b.dat"; rid_system_base = (res_a # active_id).rid_system; } in let lex_b = Lazy.force lex_b_src.lsrc_lexbuf in assert(nextchar lex_b = Some 'b'); true ;; let t025 () = let prefix = "file://" ^ Sys.getcwd() in let res_a = new rewrite_system_id [ prefix ^ "/accessible/", prefix ^ "/accessible/" ] ( new resolve_as_file() ) in res_a # init_rep_encoding `Enc_iso88591; res_a # init_warner None (new drop_warnings); (* try to open a file outside $HOME/accessible: *) try let lex_a = res_a # open_rid { null_rid with rid_system = Some (prefix ^ "/t_a.dat"); rid_system_base = None; } in assert false with Not_competent -> true ;; (**********************************************************************) (* t03X: Combination *) let t030() = (* Combine a catalog SYSTEM ID with "resolve_as_file" *) let file_pwd = "file://" ^ Sys.getcwd() ^ "/" in let res_a = new lookup_system_id_as_file [ "foo", "t_a.dat" ] in let res_b = new resolve_as_file ~base_url_defaults_to_cwd:false () in let res_c = new combine [ res_a; res_b ] in res_c # init_rep_encoding `Enc_iso88591; res_c # init_warner None (new drop_warnings); let lex_c1_src = res_c # open_rid { null_rid with rid_system = Some "foo"; rid_system_base = Some file_pwd; } in let lex_c1 = Lazy.force lex_c1_src.lsrc_lexbuf in assert(nextchar lex_c1 = Some 'a'); (* The following works because catalogs ignore system_base: *) let res_c' = res_c # clone in let lex_c1'_src = res_c' # open_rid { null_rid with rid_system = Some "foo"; rid_system_base = res_c#active_id.rid_system; } in let lex_c1' = Lazy.force lex_c1'_src.lsrc_lexbuf in assert(nextchar lex_c1' = Some 'a'); res_c' # close_in; (* But this does not work, because system_base is not absolute: *) ( try let res_c' = res_c # clone in let lex_c1'_src = res_c' # open_rid { null_rid with rid_system = Some "t_b.dat"; rid_system_base = res_c#active_id.rid_system; } in let lex_c1' = Lazy.force lex_c1'_src.lsrc_lexbuf in res_c' # close_in; assert false with Not_resolvable Neturl.Malformed_URL -> () ); res_c # close_in; let lex_c2_src = res_c # open_rid { null_rid with rid_system = Some "t_b.dat"; rid_system_base = Some file_pwd; } in let lex_c2 = Lazy.force lex_c2_src.lsrc_lexbuf in assert(nextchar lex_c2 = Some 'b'); (* The following works because catalogs ignore system_base: *) let res_c' = res_c # clone in let lex_c2'_src = res_c' # open_rid { null_rid with rid_system = Some "foo"; rid_system_base = res_c#active_id.rid_system; } in let lex_c2' = Lazy.force lex_c2'_src.lsrc_lexbuf in assert(nextchar lex_c2' = Some 'a'); res_c' # close_in; (* This is expected to work: *) let res_c' = res_c # clone in let lex_c2'_src = res_c' # open_rid { null_rid with rid_system = Some "t_a.dat"; rid_system_base = res_c#active_id.rid_system; } in let lex_c2' = Lazy.force lex_c2'_src.lsrc_lexbuf in assert(nextchar lex_c2' = Some 'a'); res_c' # close_in; res_c # close_in; true ;; let t031() = (* Combine a catalog PUBLIC ID with "resolve_as_file" *) let file_pwd = "file://" ^ Sys.getcwd() ^ "/" in let res_a = new lookup_public_id_as_file [ "foo", "t_a.dat" ] in let res_b = new resolve_as_file ~base_url_defaults_to_cwd:false () in let res_c = new combine [ res_a; res_b ] in res_c # init_rep_encoding `Enc_iso88591; res_c # init_warner None (new drop_warnings); let lex_c1_src = res_c # open_rid { null_rid with rid_public = Some "foo"; rid_system_base = Some file_pwd; } in let lex_c1 = Lazy.force lex_c1_src.lsrc_lexbuf in assert(nextchar lex_c1 = Some 'a'); (* This is expected to work: *) let res_c' = res_c # clone in let lex_c1'_src = res_c' # open_rid { null_rid with rid_public = Some "foo"; rid_system_base = res_c#active_id.rid_system; } in let lex_c1' = Lazy.force lex_c1'_src.lsrc_lexbuf in assert(nextchar lex_c1' = Some 'a'); res_c' # close_in; (* But this does not work, because system_base is None: *) ( try let res_c' = res_c # clone in let lex_c1'_src = res_c' # open_rid { null_rid with rid_system = Some "t_b.dat"; rid_system_base = res_c#active_id.rid_system; } in let lex_c1' = Lazy.force lex_c1'_src.lsrc_lexbuf in res_c' # close_in; assert false with Not_resolvable Not_found -> () ); res_c # close_in; let lex_c2_src = res_c # open_rid { null_rid with rid_system = Some "t_b.dat"; rid_system_base = Some file_pwd; } in let lex_c2 = Lazy.force lex_c2_src.lsrc_lexbuf in assert(nextchar lex_c2 = Some 'b'); (* This is expected to work: *) let res_c' = res_c # clone in let lex_c2'_src = res_c' # open_rid { null_rid with rid_public = Some "foo"; rid_system_base = res_c#active_id.rid_system; } in let lex_c2' = Lazy.force lex_c2'_src.lsrc_lexbuf in assert(nextchar lex_c2' = Some 'a'); res_c' # close_in; (* This is expected to work: *) let res_c' = res_c # clone in let lex_c2'_src = res_c' # open_rid { null_rid with rid_system = Some "t_a.dat"; rid_system_base = res_c#active_id.rid_system; } in let lex_c2' = Lazy.force lex_c2'_src.lsrc_lexbuf in assert(nextchar lex_c2' = Some 'a'); res_c' # close_in; res_c # close_in; true ;; let t032() = (* Combine a mixed PUBLIC/SYSTEM ID catalog with "resolve_as_file" *) let file_pwd = "file://" ^ Sys.getcwd() ^ "/" in let res_a = new lookup_id_as_file [ Public("foo", file_pwd ^ "foo"), "t_a.dat" ] in let res_b = new resolve_as_file ~base_url_defaults_to_cwd:false () in let res_c = new norm_system_id (new combine [ res_a; res_b ]) in res_c # init_rep_encoding `Enc_iso88591; res_c # init_warner None (new drop_warnings); let lex_c1_src = res_c # open_rid { null_rid with rid_public = Some "foo"; rid_system_base = Some file_pwd; } in let lex_c1 = Lazy.force lex_c1_src.lsrc_lexbuf in assert(nextchar lex_c1 = Some 'a'); (* This is expected to work: *) let res_c' = res_c # clone in let lex_c1'_src = res_c' # open_rid { null_rid with rid_public = Some "foo"; rid_system_base = res_c#active_id.rid_system; } in let lex_c1' = Lazy.force lex_c1'_src.lsrc_lexbuf in assert(nextchar lex_c1' = Some 'a'); res_c' # close_in; (* This is expected to work: *) let res_c' = res_c # clone in let lex_c1'_src = res_c' # open_rid { null_rid with rid_system = Some "t_b.dat"; rid_system_base = res_c#active_id.rid_system; } in let lex_c1' = Lazy.force lex_c1'_src.lsrc_lexbuf in res_c' # close_in; res_c # close_in; let lex_c2_src = res_c # open_rid { null_rid with rid_system = Some "t_b.dat"; rid_system_base = Some file_pwd; } in let lex_c2 = Lazy.force lex_c2_src.lsrc_lexbuf in assert(nextchar lex_c2 = Some 'b'); (* This is expected to work: *) let res_c' = res_c # clone in let lex_c2'_src = res_c' # open_rid { null_rid with rid_public = Some "foo"; rid_system_base = res_c#active_id.rid_system; } in let lex_c2' = Lazy.force lex_c2'_src.lsrc_lexbuf in assert(nextchar lex_c2' = Some 'a'); res_c' # close_in; (* This is expected to work: *) let res_c' = res_c # clone in let lex_c2'_src = res_c' # open_rid { null_rid with rid_system = Some "foo"; rid_system_base = res_c#active_id.rid_system; } in let lex_c2' = Lazy.force lex_c2'_src.lsrc_lexbuf in assert(nextchar lex_c2' = Some 'a'); res_c' # close_in; res_c # close_in; true ;; (**********************************************************************) let test f n = try print_string ("Rewritten Reader test " ^ n); flush stdout; if f() then print_endline " ok" else print_endline " FAILED!!!!"; with error -> print_endline (" FAILED: " ^ string_of_exn error) ;; test t001 "001";; test t010 "010";; test t011 "011";; test t020 "020";; test t021 "021";; test t022 "022";; test t023 "023";; test t024 "024";; test t025 "025";; test t030 "030";; test t031 "031";; test t032 "032";;