summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Shorin <kxepal@apache.org>2014-06-03 08:49:32 +0400
committerAlexander Shorin <kxepal@apache.org>2015-12-02 03:49:05 +0300
commit9f9fd63361168843638005ca04b91246d0ab6ebf (patch)
tree7c3048fd8906eb22ee91d2dff998ac01b53904d2
parent3a91b3a9250abb474ac7c690225bda233c83659e (diff)
downloadcouchdb-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.erl102
-rwxr-xr-xtest/etap/150-invalid-view-seq.t183
-rw-r--r--test/etap/Makefile.am1
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 \