diff options
Diffstat (limited to 'src/couch/test/eunit/couch_js_tests.erl')
-rw-r--r-- | src/couch/test/eunit/couch_js_tests.erl | 143 |
1 files changed, 85 insertions, 58 deletions
diff --git a/src/couch/test/eunit/couch_js_tests.erl b/src/couch/test/eunit/couch_js_tests.erl index c68d60125..1079678da 100644 --- a/src/couch/test/eunit/couch_js_tests.erl +++ b/src/couch/test/eunit/couch_js_tests.erl @@ -13,7 +13,6 @@ -module(couch_js_tests). -include_lib("eunit/include/eunit.hrl"). - couch_js_test_() -> { "Test couchjs", @@ -32,104 +31,131 @@ couch_js_test_() -> } }. - should_create_sandbox() -> % Try and detect whether we can see out of the % sandbox or not. Src = << - "function(doc) {\n" - " try {\n" - " emit(false, typeof(Couch.compile_function));\n" - " } catch (e) {\n" - " emit(true, e.message);\n" - " }\n" - "}\n" + "function(doc) {\n" + " try {\n" + " emit(false, typeof(Couch.compile_function));\n" + " } catch (e) {\n" + " emit(true, e.message);\n" + " }\n" + "}\n" >>, Proc = couch_query_servers:get_os_process(<<"javascript">>), true = couch_query_servers:proc_prompt(Proc, [<<"add_fun">>, Src]), Result = couch_query_servers:proc_prompt(Proc, [<<"map_doc">>, <<"{}">>]), ?assertEqual([[[true, <<"Couch is not defined">>]]], Result). - should_roundtrip_utf8() -> % Try round tripping UTF-8 both directions through % couchjs. These tests use hex encoded values of % Ä (C384) and Ü (C39C) so as to avoid odd editor/Erlang encoding % strangeness. Src = << - "function(doc) {\n" - " emit(doc.value, \"", 16#C3, 16#9C, "\");\n" - "}\n" + "function(doc) {\n" + " emit(doc.value, \"", + 16#C3, + 16#9C, + "\");\n" + "}\n" >>, Proc = couch_query_servers:get_os_process(<<"javascript">>), true = couch_query_servers:proc_prompt(Proc, [<<"add_fun">>, Src]), - Doc = {[ - {<<"value">>, <<16#C3, 16#84>>} - ]}, + Doc = + {[ + {<<"value">>, <<16#C3, 16#84>>} + ]}, Result = couch_query_servers:proc_prompt(Proc, [<<"map_doc">>, Doc]), ?assertEqual([[[<<16#C3, 16#84>>, <<16#C3, 16#9C>>]]], Result). - should_roundtrip_modified_utf8() -> % Mimicing the test case from the mailing list Src = << - "function(doc) {\n" - " emit(doc.value.toLowerCase(), \"", 16#C3, 16#9C, "\");\n" - "}\n" + "function(doc) {\n" + " emit(doc.value.toLowerCase(), \"", + 16#C3, + 16#9C, + "\");\n" + "}\n" >>, Proc = couch_query_servers:get_os_process(<<"javascript">>), true = couch_query_servers:proc_prompt(Proc, [<<"add_fun">>, Src]), - Doc = {[ - {<<"value">>, <<16#C3, 16#84>>} - ]}, + Doc = + {[ + {<<"value">>, <<16#C3, 16#84>>} + ]}, Result = couch_query_servers:proc_prompt(Proc, [<<"map_doc">>, Doc]), ?assertEqual([[[<<16#C3, 16#A4>>, <<16#C3, 16#9C>>]]], Result). - should_replace_broken_utf16() -> % This test reverse the surrogate pair of % the Boom emoji U+1F4A5 Src = << - "function(doc) {\n" - " emit(doc.value.split(\"\").reverse().join(\"\"), 1);\n" - "}\n" + "function(doc) {\n" + " emit(doc.value.split(\"\").reverse().join(\"\"), 1);\n" + "}\n" >>, Proc = couch_query_servers:get_os_process(<<"javascript">>), true = couch_query_servers:proc_prompt(Proc, [<<"add_fun">>, Src]), - Doc = {[ - {<<"value">>, list_to_binary(xmerl_ucs:to_utf8([16#1F4A5]))} - ]}, + Doc = + {[ + {<<"value">>, list_to_binary(xmerl_ucs:to_utf8([16#1F4A5]))} + ]}, Result = couch_query_servers:proc_prompt(Proc, [<<"map_doc">>, Doc]), % Invalid UTF-8 gets replaced with the 16#FFFD replacement % marker Markers = list_to_binary(xmerl_ucs:to_utf8([16#FFFD, 16#FFFD])), ?assertEqual([[[Markers, 1]]], Result). - should_allow_js_string_mutations() -> % This binary corresponds to this string: мама мыла раму % Which I'm told translates to: "mom was washing the frame" MomWashedTheFrame = << - 16#D0, 16#BC, 16#D0, 16#B0, 16#D0, 16#BC, 16#D0, 16#B0, 16#20, - 16#D0, 16#BC, 16#D1, 16#8B, 16#D0, 16#BB, 16#D0, 16#B0, 16#20, - 16#D1, 16#80, 16#D0, 16#B0, 16#D0, 16#BC, 16#D1, 16#83 + 16#D0, + 16#BC, + 16#D0, + 16#B0, + 16#D0, + 16#BC, + 16#D0, + 16#B0, + 16#20, + 16#D0, + 16#BC, + 16#D1, + 16#8B, + 16#D0, + 16#BB, + 16#D0, + 16#B0, + 16#20, + 16#D1, + 16#80, + 16#D0, + 16#B0, + 16#D0, + 16#BC, + 16#D1, + 16#83 >>, Mom = <<16#D0, 16#BC, 16#D0, 16#B0, 16#D0, 16#BC, 16#D0, 16#B0>>, Washed = <<16#D0, 16#BC, 16#D1, 16#8B, 16#D0, 16#BB, 16#D0, 16#B0>>, Src1 = << - "function(doc) {\n" - " emit(\"length\", doc.value.length);\n" - "}\n" + "function(doc) {\n" + " emit(\"length\", doc.value.length);\n" + "}\n" >>, Src2 = << - "function(doc) {\n" - " emit(\"substring\", doc.value.substring(5, 9));\n" - "}\n" + "function(doc) {\n" + " emit(\"substring\", doc.value.substring(5, 9));\n" + "}\n" >>, Src3 = << - "function(doc) {\n" - " emit(\"slice\", doc.value.slice(0, 4));\n" - "}\n" + "function(doc) {\n" + " emit(\"slice\", doc.value.slice(0, 4));\n" + "}\n" >>, Proc = couch_query_servers:get_os_process(<<"javascript">>), true = couch_query_servers:proc_prompt(Proc, [<<"add_fun">>, Src1]), @@ -144,29 +170,30 @@ should_allow_js_string_mutations() -> ], ?assertEqual(Expect, Result). - should_exit_on_oom() -> Src = << - "var state = [];\n" - "function(doc) {\n" - " var val = \"0123456789ABCDEF\";\n" - " for(var i = 0; i < 665535; i++) {\n" - " state.push([val, val]);\n" - " emit(null, null);\n" - " }\n" - "}\n" + "var state = [];\n" + "function(doc) {\n" + " var val = \"0123456789ABCDEF\";\n" + " for(var i = 0; i < 665535; i++) {\n" + " state.push([val, val]);\n" + " emit(null, null);\n" + " }\n" + "}\n" >>, Proc = couch_query_servers:get_os_process(<<"javascript">>), true = couch_query_servers:proc_prompt(Proc, [<<"add_fun">>, Src]), trigger_oom(Proc). trigger_oom(Proc) -> - Status = try - couch_query_servers:proc_prompt(Proc, [<<"map_doc">>, <<"{}">>]), - continue - catch throw:{os_process_error, {exit_status, 1}} -> - done - end, + Status = + try + couch_query_servers:proc_prompt(Proc, [<<"map_doc">>, <<"{}">>]), + continue + catch + throw:{os_process_error, {exit_status, 1}} -> + done + end, case Status of continue -> trigger_oom(Proc); done -> ok |