summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Vatamaniuc <vatamane@gmail.com>2022-01-21 18:09:11 -0500
committerNick Vatamaniuc <vatamane@gmail.com>2022-01-21 18:14:09 -0500
commit9057c5e9d17262c85835c86188bfee782a99700c (patch)
tree2d9dd62ed4293f47945043c77809292a14897c95
parentcca3e78ad40b01787510db10f8dd77908147b26b (diff)
downloadcouchdb-collation-view-versioning.tar.gz
Add view 2.x and 3.2.1 upgrade testscollation-view-versioning
Ensure 2.x and 3.2.1 existing view are upgraded with the new view_info map
-rw-r--r--src/couch/test/eunit/couchdb_views_tests.erl120
-rw-r--r--src/couch/test/eunit/fixtures/15a5cb17365a99cd9ddc7327c82bbd0d.viewbin0 -> 12388 bytes
-rw-r--r--src/couch/test/eunit/fixtures/db321.couchbin0 -> 28864 bytes
3 files changed, 106 insertions, 14 deletions
diff --git a/src/couch/test/eunit/couchdb_views_tests.erl b/src/couch/test/eunit/couchdb_views_tests.erl
index f4d51bdd0..0da3d4efb 100644
--- a/src/couch/test/eunit/couchdb_views_tests.erl
+++ b/src/couch/test/eunit/couchdb_views_tests.erl
@@ -38,25 +38,40 @@ setup_with_docs() ->
create_design_doc(DbName, <<"_design/foo">>, <<"bar">>),
DbName.
-setup_legacy() ->
- DbName = <<"test">>,
- DbFileName = "test.couch",
- OldDbFilePath = filename:join([?FIXTURESDIR, DbFileName]),
+% See src/couch/test/eunit/fixtures for fixture files
+%
+setup_legacy_2x() ->
+ % see src/couch/test/eunit/fixtures folder
+ DbName = "test",
OldViewName = "6cf2c2f766f87b618edf6630b00f8736.view",
- FixtureViewFilePath = filename:join([?FIXTURESDIR, OldViewName]),
NewViewName = "a1c5929f912aca32f13446122cc6ce50.view",
+ setup_legacy(DbName, OldViewName, NewViewName).
+
+setup_legacy_321() ->
+ DbName = "db321",
+ OldViewName = "15a5cb17365a99cd9ddc7327c82bbd0d.view",
+ % Note: we don't expect the signature to change
+ NewViewName = "15a5cb17365a99cd9ddc7327c82bbd0d.view",
+ setup_legacy(DbName, OldViewName, NewViewName).
+
+setup_legacy(DbName, OldViewName, NewViewName) when
+ is_list(DbName), is_list(OldViewName), is_list(NewViewName)
+->
+ DbFileName = DbName ++ ".couch",
+ OldDbFilePath = filename:join([?FIXTURESDIR, DbFileName]),
+ FixtureViewFilePath = filename:join([?FIXTURESDIR, OldViewName]),
DbDir = config:get("couchdb", "database_dir"),
ViewDir = config:get("couchdb", "view_index_dir"),
OldViewFilePath = filename:join([
ViewDir,
- ".test_design",
+ "." ++ DbName ++ "_design",
"mrview",
OldViewName
]),
NewViewFilePath = filename:join([
ViewDir,
- ".test_design",
+ "." ++ DbName ++ "_design",
"mrview",
NewViewName
]),
@@ -76,7 +91,7 @@ setup_legacy() ->
{ok, _} = file:copy(FixtureViewFilePath, OldViewFilePath),
- {DbName, Files}.
+ {?l2b(DbName), Files}.
teardown({DbName, _}) ->
teardown(DbName);
@@ -161,19 +176,37 @@ backup_restore_test_() ->
}
}.
-upgrade_test_() ->
+upgrade_2x_test_() ->
+ {
+ "Upgrade 2x tests",
+ {
+ setup,
+ fun test_util:start_couch/0,
+ fun test_util:stop_couch/1,
+ {
+ foreach,
+ fun setup_legacy_2x/0,
+ fun teardown_legacy/1,
+ [
+ fun should_upgrade_legacy_2x_view_files/1
+ ]
+ }
+ }
+ }.
+
+upgrade_321_test_() ->
{
- "Upgrade tests",
+ "Upgrade 321 tests",
{
setup,
fun test_util:start_couch/0,
fun test_util:stop_couch/1,
{
foreach,
- fun setup_legacy/0,
+ fun setup_legacy_321/0,
fun teardown_legacy/1,
[
- fun should_upgrade_legacy_view_files/1
+ fun should_upgrade_legacy_321_view_files/1
]
}
}
@@ -201,7 +234,7 @@ should_not_remember_docs_in_index_after_backup_restore(DbName) ->
?assertNot(has_doc("doc666", Rows1))
end).
-should_upgrade_legacy_view_files({DbName, Files}) ->
+should_upgrade_legacy_2x_view_files({DbName, Files}) ->
?_test(begin
[_NewDbFilePath, OldViewFilePath, NewViewFilePath] = Files,
ok = config:set("query_server_config", "commit_freq", "0", false),
@@ -231,9 +264,57 @@ should_upgrade_legacy_view_files({DbName, Files}) ->
% ensure new header
% have to wait for awhile to upgrade the index
- timer:sleep(2000),
+ wait_mrheader_record(NewViewFilePath, 3000),
+ NewHeader = read_header(NewViewFilePath),
+ ?assertMatch(#mrheader{}, NewHeader),
+
+ % assert that 2.x header was upgraded with a view_info map
+ ViewInfo = NewHeader#mrheader.view_info,
+ ?assert(is_map(ViewInfo)),
+ Ver = tuple_to_list(couch_ejson_compare:get_collator_version()),
+ ?assertMatch(#{ucol_vs := [Ver]}, ViewInfo),
+
+ NewViewStatus = hd(NewHeader#mrheader.view_states),
+ ?assertEqual(3, tuple_size(NewViewStatus))
+ end).
+
+should_upgrade_legacy_321_view_files({DbName, Files}) ->
+ ?_test(begin
+ [_NewDbFilePath, OldViewFilePath, NewViewFilePath] = Files,
+ ok = config:set("query_server_config", "commit_freq", "0", false),
+
+ % ensure old header
+ OldHeader = read_header(OldViewFilePath),
+ ?assertEqual(5, tuple_size(OldHeader)),
+ ?assertMatch(mrheader, element(1, OldHeader)),
+
+ % query view for expected results
+ Rows0 = query_view(DbName, "ddoc321", "view321"),
+ ?assertEqual(2, length(Rows0)),
+
+ % add 3 new documents
+ create_docs(DbName),
+
+ % query view for expected results
+ Rows1 = query_view(DbName, "ddoc321", "view321"),
+ ?assertEqual(5, length(Rows1)),
+
+ % ensure old file is still there
+ ?assert(filelib:is_regular(OldViewFilePath)),
+
+ % ensure new header
+
+ % have to wait for awhile to upgrade the index
+ wait_mrheader_record(NewViewFilePath, 3000),
NewHeader = read_header(NewViewFilePath),
?assertMatch(#mrheader{}, NewHeader),
+
+ % assert that 3.2.1 header was upgraded with a view_info map
+ ViewInfo = NewHeader#mrheader.view_info,
+ ?assert(is_map(ViewInfo)),
+ Ver = tuple_to_list(couch_ejson_compare:get_collator_version()),
+ ?assertMatch(#{ucol_vs := [Ver]}, ViewInfo),
+
NewViewStatus = hd(NewHeader#mrheader.view_states),
?assertEqual(3, tuple_size(NewViewStatus))
end).
@@ -750,3 +831,14 @@ copy_tree([File | Rest], Src, Dst) ->
FullDst = filename:join(Dst, File),
ok = copy_tree(FullSrc, FullDst),
copy_tree(Rest, Src, Dst).
+
+wait_mrheader_record(File, TimeoutMSec) ->
+ WaitFun = fun() ->
+ try read_header(File) of
+ #mrheader{} -> ok;
+ _Other -> wait
+ catch
+ _:_ -> wait
+ end
+ end,
+ test_util:wait(WaitFun, TimeoutMSec).
diff --git a/src/couch/test/eunit/fixtures/15a5cb17365a99cd9ddc7327c82bbd0d.view b/src/couch/test/eunit/fixtures/15a5cb17365a99cd9ddc7327c82bbd0d.view
new file mode 100644
index 000000000..33cbd401f
--- /dev/null
+++ b/src/couch/test/eunit/fixtures/15a5cb17365a99cd9ddc7327c82bbd0d.view
Binary files differ
diff --git a/src/couch/test/eunit/fixtures/db321.couch b/src/couch/test/eunit/fixtures/db321.couch
new file mode 100644
index 000000000..7db9cac17
--- /dev/null
+++ b/src/couch/test/eunit/fixtures/db321.couch
Binary files differ