You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2024/10/17 21:50:04 UTC
(couchdb) 01/01: Handle another expected error in the scanner
This is an automated email from the ASF dual-hosted git repository.
vatamane pushed a commit to branch another-false-positive-for-qjs-scanner
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 12b6117ca57691bc88d9a16c390e25077b468611
Author: Nick Vatamaniuc <va...@gmail.com>
AuthorDate: Thu Oct 17 17:47:39 2024 -0400
Handle another expected error in the scanner
It's the same idea as `SyntaxError` and `TypeErorrs` above.
While at it improve the filter test to use individual ddocs for each error.
This way one error or crash won't influence the others.
---
.../src/couch_quickjs_scanner_plugin.erl | 2 ++
.../test/couch_quickjs_scanner_plugin_tests.erl | 28 +++++++++++++++-------
2 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/src/couch_quickjs/src/couch_quickjs_scanner_plugin.erl b/src/couch_quickjs/src/couch_quickjs_scanner_plugin.erl
index c9fe96a2b..2e889306b 100644
--- a/src/couch_quickjs/src/couch_quickjs_scanner_plugin.erl
+++ b/src/couch_quickjs/src/couch_quickjs_scanner_plugin.erl
@@ -544,6 +544,8 @@ expected_error({error, {_, {<<"unnamed_error">>, _}}}, {error, {_, {<<"unnamed_e
true;
expected_error({error, {_, {<<"SyntaxError">>, _}}}, {error, {_, {<<"SyntaxError">>, _}}}) ->
true;
+expected_error({error, {_, {<<"ReferenceError">>, _}}}, {error, {_, {<<"ReferenceError">>, _}}}) ->
+ true;
expected_error(_, _) ->
false.
diff --git a/src/couch_quickjs/test/couch_quickjs_scanner_plugin_tests.erl b/src/couch_quickjs/test/couch_quickjs_scanner_plugin_tests.erl
index 566666177..5e7b25744 100644
--- a/src/couch_quickjs/test/couch_quickjs_scanner_plugin_tests.erl
+++ b/src/couch_quickjs/test/couch_quickjs_scanner_plugin_tests.erl
@@ -235,7 +235,11 @@ t_filter_only({_, DbName}) ->
end.
t_filter_with_expected_error({_, DbName}) ->
- ok = add_doc(DbName, ?DDOC1, ddoc_filter_error(#{})),
+ % Put filters with errors in different ddocs so than each be tested in isolation
+ ok = add_doc(DbName, <<"_design/ddoc_custom_error">>, ddoc_filter_custom_error(#{})),
+ ok = add_doc(DbName, <<"_design/ddoc_type_error">>, ddoc_filter_type_error(#{})),
+ ok = add_doc(DbName, <<"_design/ddoc_syntax_error">>, ddoc_filter_syntax_error(#{})),
+ ok = add_doc(DbName, <<"_design/ddoc_reference_error">>, ddoc_filter_reference_error(#{})),
meck:reset(couch_scanner_server),
meck:reset(?PLUGIN),
config:set("couch_scanner_plugins", atom_to_list(?PLUGIN), "true", false),
@@ -245,9 +249,9 @@ t_filter_with_expected_error({_, DbName}) ->
true ->
?assertEqual(1, num_calls(complete, 1)),
?assertEqual(1, num_calls(db, ['_', DbName])),
- ?assertEqual(1, num_calls(ddoc, ['_', DbName, '_'])),
+ ?assertEqual(4, num_calls(ddoc, ['_', DbName, '_'])),
?assertEqual(0, couch_stats:sample([couchdb, query_server, process_error_exits])),
- ?assertEqual(10, couch_stats:sample([couchdb, query_server, process_errors])),
+ ?assertEqual(40, couch_stats:sample([couchdb, query_server, process_errors])),
?assertEqual(0, couch_stats:sample([couchdb, query_server, process_exits])),
% start, complete and no warning as we expected the error, so 2 total only
?assertEqual(2, log_calls(warning));
@@ -397,12 +401,17 @@ ddoc_filter(Doc) ->
}
}.
-ddoc_filter_error(Doc) ->
- Doc#{
- filters => #{
- f => <<"function(doc, req) {throw(\"foo\");}">>
- }
- }.
+ddoc_filter_custom_error(Doc) ->
+ Doc#{filters => #{f => <<"function(doc, req) {throw(\"foo\");}">>}}.
+
+ddoc_filter_type_error(Doc) ->
+ Doc#{filters => #{f => <<"function(doc, req){if(doc.missing.foo){return false;}}">>}}.
+
+ddoc_filter_syntax_error(Doc) ->
+ Doc#{filters => #{f => <<"function(doc, req){JSON.parse([]); return true;}">>}}.
+
+ddoc_filter_reference_error(Doc) ->
+ Doc#{filters => #{f => <<"function(doc, req){if(potato){return true;}}">>}}.
ddoc_view(Doc) ->
Doc#{
@@ -461,6 +470,7 @@ ddoc_view(Doc) ->
},
v_type_error => #{map => <<"function(doc){emit(doc.missing.foo,1);}">>},
v_syntax_error => #{map => <<"function(doc){emit(JSON.parse([]),1);}">>},
+ v_reference_error => #{map => <<"function(doc){emit(potato,1);}">>},
v_expr_fun1 => #{map => <<"(function(doc) {emit(1,2)})\n">>},
v_expr_fun2 => #{map => <<"(function(doc) {emit(3,4)});">>},
v_expr_fun3 => #{map => <<"y=9;\n(function(doc) {emit(5,y)})">>},