diff options
author | Alexander Shorin <kxepal@apache.org> | 2014-06-03 08:49:32 +0400 |
---|---|---|
committer | Alexander Shorin <kxepal@apache.org> | 2015-12-02 03:49:05 +0300 |
commit | 9f9fd63361168843638005ca04b91246d0ab6ebf (patch) | |
tree | 7c3048fd8906eb22ee91d2dff998ac01b53904d2 | |
parent | 3a91b3a9250abb474ac7c690225bda233c83659e (diff) | |
download | couchdb-9f9fd63361168843638005ca04b91246d0ab6ebf.tar.gz |
Port 150-invalid-view-seq.t etap test suite to eunit
Merged into couchdb_views_tests suite.
-rw-r--r-- | test/couchdb/couchdb_views_tests.erl | 102 | ||||
-rwxr-xr-x | test/etap/150-invalid-view-seq.t | 183 | ||||
-rw-r--r-- | test/etap/Makefile.am | 1 |
3 files changed, 96 insertions, 190 deletions
diff --git a/test/couchdb/couchdb_views_tests.erl b/test/couchdb/couchdb_views_tests.erl index e44cef6ff..d10b5675b 100644 --- a/test/couchdb/couchdb_views_tests.erl +++ b/test/couchdb/couchdb_views_tests.erl @@ -36,13 +36,22 @@ setup() -> DbName = ?tempdb(), {ok, _} = couch_db:create(DbName, [?ADMIN_USER]), FooRev = create_design_doc(DbName, <<"_design/foo">>, <<"bar">>), - ok = query_view(DbName, "foo", "bar"), + query_view(DbName, "foo", "bar"), BooRev = create_design_doc(DbName, <<"_design/boo">>, <<"baz">>), - ok = query_view(DbName, "boo", "baz"), + query_view(DbName, "boo", "baz"), {DbName, {FooRev, BooRev}}. +setup_with_docs() -> + DbName = ?tempdb(), + {ok, _} = couch_db:create(DbName, [?ADMIN_USER]), + create_docs(DbName), + create_design_doc(DbName, <<"_design/foo">>, <<"bar">>), + DbName. + teardown({DbName, _}) -> - ok = couch_server:delete(DbName, []), + teardown(DbName); +teardown(DbName) when is_binary(DbName) -> + ok = couch_server:delete(DbName, [?ADMIN_USER]), ok. @@ -64,6 +73,36 @@ view_indexes_cleanup_test_() -> } }. +should_not_remember_docs_in_index_after_backup_restore_test() -> + %% COUCHDB-640 + start(), + DbName = setup_with_docs(), + + ok = backup_db_file(DbName), + create_doc(DbName), + + Body0 = query_view(DbName, "foo", "bar"), + ViewJson0 = ejson:decode(Body0), + Rows0 = couch_util:get_nested_json_value(ViewJson0, [<<"rows">>]), + ?assert(has_doc("doc1", Rows0)), + ?assert(has_doc("doc2", Rows0)), + ?assert(has_doc("doc3", Rows0)), + ?assert(has_doc("doc666", Rows0)), + + restore_backup_db_file(DbName), + + Body1 = query_view(DbName, "foo", "bar"), + ViewJson1 = ejson:decode(Body1), + Rows1 = couch_util:get_nested_json_value(ViewJson1, [<<"rows">>]), + ?assert(has_doc("doc1", Rows1)), + ?assert(has_doc("doc2", Rows1)), + ?assert(has_doc("doc3", Rows1)), + ?assertNot(has_doc("doc666", Rows1)), + + teardown(DbName), + stop(whereis(couch_server_sup)). + + should_have_two_indexes_alive_before_deletion({DbName, _}) -> view_cleanup(DbName), ?_assertEqual(2, count_index_files(DbName)). @@ -80,6 +119,38 @@ should_cleanup_all_index_files({DbName, {FooRev, BooRev}})-> ?_assertEqual(0, count_index_files(DbName)). +create_doc(DbName) -> + {ok, Db} = couch_db:open(DbName, [?ADMIN_USER]), + Doc666 = couch_doc:from_json_obj({[ + {<<"_id">>, <<"doc666">>}, + {<<"value">>, 999} + + ]}), + {ok, _} = couch_db:update_docs(Db, [Doc666]), + couch_db:ensure_full_commit(Db), + couch_db:close(Db). + +create_docs(DbName) -> + {ok, Db} = couch_db:open(DbName, [?ADMIN_USER]), + Doc1 = couch_doc:from_json_obj({[ + {<<"_id">>, <<"doc1">>}, + {<<"value">>, 1} + + ]}), + Doc2 = couch_doc:from_json_obj({[ + {<<"_id">>, <<"doc2">>}, + {<<"value">>, 2} + + ]}), + Doc3 = couch_doc:from_json_obj({[ + {<<"_id">>, <<"doc3">>}, + {<<"value">>, 3} + + ]}), + {ok, _} = couch_db:update_docs(Db, [Doc1, Doc2, Doc3]), + couch_db:ensure_full_commit(Db), + couch_db:close(Db). + create_design_doc(DbName, DDName, ViewName) -> {ok, Db} = couch_db:open(DbName, [?ADMIN_USER]), DDoc = couch_doc:from_json_obj({[ @@ -109,13 +180,13 @@ delete_design_doc(DbName, DDName, Rev) -> db_url(DbName) -> Addr = couch_config:get("httpd", "bind_address", "127.0.0.1"), Port = integer_to_list(mochiweb_socket_server:get(couch_httpd, port)), - "http://" ++ Addr ++ ":" ++ Port ++ "/" ++ binary_to_list(DbName). + "http://" ++ Addr ++ ":" ++ Port ++ "/" ++ ?b2l(DbName). query_view(DbName, DDoc, View) -> - {ok, Code, _Headers, _Body} = test_request:get( + {ok, Code, _Headers, Body} = test_request:get( db_url(DbName) ++ "/_design/" ++ DDoc ++ "/_view/" ++ View), ?assertEqual(200, Code), - ok. + Body. view_cleanup(DbName) -> {ok, Db} = couch_db:open(DbName, [?ADMIN_USER]), @@ -127,3 +198,22 @@ count_index_files(DbName) -> RootDir = couch_config:get("couchdb", "view_index_dir"), length(filelib:wildcard(RootDir ++ "/." ++ binary_to_list(DbName) ++ "_design"++"/mrview/*")). + +has_doc(DocId1, Rows) -> + DocId = iolist_to_binary(DocId1), + lists:any(fun({R}) -> lists:member({<<"id">>, DocId}, R) end, Rows). + +backup_db_file(DbName) -> + DbDir = couch_config:get("couchdb", "database_dir"), + DbFile = filename:join([DbDir, ?b2l(DbName) ++ ".couch"]), + {ok, _} = file:copy(DbFile, DbFile ++ ".backup"), + ok. + +restore_backup_db_file(DbName) -> + DbDir = couch_config:get("couchdb", "database_dir"), + stop(whereis(couch_server_sup)), + DbFile = filename:join([DbDir, ?b2l(DbName) ++ ".couch"]), + ok = file:delete(DbFile), + ok = file:rename(DbFile ++ ".backup", DbFile), + start(), + ok. diff --git a/test/etap/150-invalid-view-seq.t b/test/etap/150-invalid-view-seq.t deleted file mode 100755 index 681875aff..000000000 --- a/test/etap/150-invalid-view-seq.t +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/env escript -%% -*- erlang -*- - -% Licensed under the Apache License, Version 2.0 (the "License"); you may not -% use this file except in compliance with the License. You may obtain a copy of -% the License at -% -% http://www.apache.org/licenses/LICENSE-2.0 -% -% Unless required by applicable law or agreed to in writing, software -% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -% License for the specific language governing permissions and limitations under -% the License. - --record(user_ctx, { - name = null, - roles = [], - handler -}). - -test_db_name() -> - <<"couch_test_invalid_view_seq">>. - -main(_) -> - test_util:init_code_path(), - - etap:plan(10), - case (catch test()) of - ok -> - etap:end_tests(); - Other -> - etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), - etap:bail(Other) - end, - ok. - -%% NOTE: since during the test we stop the server, -%% a huge and ugly but harmless stack trace is sent to stderr -%% -test() -> - couch_server_sup:start_link(test_util:config_files()), - timer:sleep(1000), - delete_db(), - create_db(), - - create_docs(), - create_design_doc(), - - % make DB file backup - backup_db_file(), - - put(addr, couch_config:get("httpd", "bind_address", "127.0.0.1")), - put(port, integer_to_list(mochiweb_socket_server:get(couch_httpd, port))), - - create_new_doc(), - query_view_before_restore_backup(), - - % restore DB file backup after querying view - restore_backup_db_file(), - - query_view_after_restore_backup(), - - delete_db(), - couch_server_sup:stop(), - ok. - -admin_user_ctx() -> - {user_ctx, #user_ctx{roles=[<<"_admin">>]}}. - -create_db() -> - {ok, _} = couch_db:create(test_db_name(), [admin_user_ctx()]). - -delete_db() -> - couch_server:delete(test_db_name(), [admin_user_ctx()]). - -create_docs() -> - {ok, Db} = couch_db:open(test_db_name(), [admin_user_ctx()]), - Doc1 = couch_doc:from_json_obj({[ - {<<"_id">>, <<"doc1">>}, - {<<"value">>, 1} - - ]}), - Doc2 = couch_doc:from_json_obj({[ - {<<"_id">>, <<"doc2">>}, - {<<"value">>, 2} - - ]}), - Doc3 = couch_doc:from_json_obj({[ - {<<"_id">>, <<"doc3">>}, - {<<"value">>, 3} - - ]}), - {ok, _} = couch_db:update_docs(Db, [Doc1, Doc2, Doc3]), - couch_db:ensure_full_commit(Db), - couch_db:close(Db). - -create_design_doc() -> - {ok, Db} = couch_db:open(test_db_name(), [admin_user_ctx()]), - DDoc = couch_doc:from_json_obj({[ - {<<"_id">>, <<"_design/foo">>}, - {<<"language">>, <<"javascript">>}, - {<<"views">>, {[ - {<<"bar">>, {[ - {<<"map">>, <<"function(doc) { emit(doc.value, 1); }">>} - ]}} - ]}} - ]}), - {ok, _} = couch_db:update_docs(Db, [DDoc]), - couch_db:ensure_full_commit(Db), - couch_db:close(Db). - -backup_db_file() -> - DbFile = test_util:build_file("tmp/lib/" ++ - binary_to_list(test_db_name()) ++ ".couch"), - {ok, _} = file:copy(DbFile, DbFile ++ ".backup"), - ok. - -create_new_doc() -> - {ok, Db} = couch_db:open(test_db_name(), [admin_user_ctx()]), - Doc666 = couch_doc:from_json_obj({[ - {<<"_id">>, <<"doc666">>}, - {<<"value">>, 999} - - ]}), - {ok, _} = couch_db:update_docs(Db, [Doc666]), - couch_db:ensure_full_commit(Db), - couch_db:close(Db). - -db_url() -> - "http://" ++ get(addr) ++ ":" ++ get(port) ++ "/" ++ - binary_to_list(test_db_name()). - -query_view_before_restore_backup() -> - {ok, Code, _Headers, Body} = test_util:request( - db_url() ++ "/_design/foo/_view/bar", [], get), - etap:is(Code, 200, "Got view response before restoring backup."), - ViewJson = ejson:decode(Body), - Rows = couch_util:get_nested_json_value(ViewJson, [<<"rows">>]), - HasDoc1 = has_doc("doc1", Rows), - HasDoc2 = has_doc("doc2", Rows), - HasDoc3 = has_doc("doc3", Rows), - HasDoc666 = has_doc("doc666", Rows), - etap:is(HasDoc1, true, "Before backup restore, view has doc1"), - etap:is(HasDoc2, true, "Before backup restore, view has doc2"), - etap:is(HasDoc3, true, "Before backup restore, view has doc3"), - etap:is(HasDoc666, true, "Before backup restore, view has doc666"), - ok. - -has_doc(DocId1, Rows) -> - DocId = iolist_to_binary(DocId1), - lists:any( - fun({R}) -> lists:member({<<"id">>, DocId}, R) end, - Rows - ). - -restore_backup_db_file() -> - couch_server_sup:stop(), - timer:sleep(3000), - DbFile = test_util:build_file("tmp/lib/" ++ - binary_to_list(test_db_name()) ++ ".couch"), - ok = file:delete(DbFile), - ok = file:rename(DbFile ++ ".backup", DbFile), - couch_server_sup:start_link(test_util:config_files()), - timer:sleep(1000), - put(port, integer_to_list(mochiweb_socket_server:get(couch_httpd, port))), - ok. - -query_view_after_restore_backup() -> - {ok, Code, _Headers, Body} = test_util:request( - db_url() ++ "/_design/foo/_view/bar", [], get), - etap:is(Code, 200, "Got view response after restoring backup."), - ViewJson = ejson:decode(Body), - Rows = couch_util:get_nested_json_value(ViewJson, [<<"rows">>]), - HasDoc1 = has_doc("doc1", Rows), - HasDoc2 = has_doc("doc2", Rows), - HasDoc3 = has_doc("doc3", Rows), - HasDoc666 = has_doc("doc666", Rows), - etap:is(HasDoc1, true, "After backup restore, view has doc1"), - etap:is(HasDoc2, true, "After backup restore, view has doc2"), - etap:is(HasDoc3, true, "After backup restore, view has doc3"), - etap:is(HasDoc666, false, "After backup restore, view does not have doc666"), - ok. diff --git a/test/etap/Makefile.am b/test/etap/Makefile.am index 94ff6f2f7..bf9b3f29e 100644 --- a/test/etap/Makefile.am +++ b/test/etap/Makefile.am @@ -36,7 +36,6 @@ fixture_files = \ fixtures/test.couch tap_files = \ - 150-invalid-view-seq.t \ 160-vhosts.t \ 170-os-daemons.es \ 170-os-daemons.t \ |