You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ju...@apache.org on 2020/07/07 11:08:10 UTC

[couchdb] branch master updated: Port view_compaction test to elixir

This is an automated email from the ASF dual-hosted git repository.

juanjo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/couchdb.git


The following commit(s) were added to refs/heads/master by this push:
     new ce22cbc  Port view_compaction test to elixir
ce22cbc is described below

commit ce22cbcc2c92de456f0a1d98c30d2ea17a3010c6
Author: Juanjo Rodriguez <ju...@apache.org>
AuthorDate: Tue Jul 7 09:04:15 2020 +0200

    Port view_compaction test to elixir
---
 test/elixir/README.md                     |   4 +-
 test/elixir/lib/couch/db_test.ex          |   1 +
 test/elixir/test/view_compaction_test.exs | 105 ++++++++++++++++++++++++++++++
 test/javascript/tests/view_compaction.js  |   1 +
 4 files changed, 109 insertions(+), 2 deletions(-)

diff --git a/test/elixir/README.md b/test/elixir/README.md
index 44cca52d..cf52943 100644
--- a/test/elixir/README.md
+++ b/test/elixir/README.md
@@ -100,7 +100,7 @@ X means done, - means partially
   - [X] Port uuids.js
   - [X] Port view_collation.js
   - [X] Port view_collation_raw.js
-  - [ ] Port view_compaction.js
+  - [X] Port view_compaction.js
   - [ ] Port view_conflicts.js
   - [ ] Port view_errors.js
   - [ ] Port view_include_docs.js
@@ -110,7 +110,7 @@ X means done, - means partially
   - [X] Port view_offsets.js
   - [X] Port view_pagination.js
   - [ ] Port view_sandboxing.js
-  - [ ] Port view_update_seq.js
+  - [X] Port view_update_seq.js
 
 # Using ExUnit to write unit tests
 
diff --git a/test/elixir/lib/couch/db_test.ex b/test/elixir/lib/couch/db_test.ex
index 23f1093..652fa6b 100644
--- a/test/elixir/lib/couch/db_test.ex
+++ b/test/elixir/lib/couch/db_test.ex
@@ -209,6 +209,7 @@ defmodule Couch.DBTest do
       )
 
     assert resp.status_code in [201, 202]
+    resp
   end
 
   def query(
diff --git a/test/elixir/test/view_compaction_test.exs b/test/elixir/test/view_compaction_test.exs
new file mode 100644
index 0000000..d2bf060
--- /dev/null
+++ b/test/elixir/test/view_compaction_test.exs
@@ -0,0 +1,105 @@
+defmodule ViewCompactionTest do
+  use CouchTestCase
+
+  @moduledoc """
+  Test CouchDB View Compaction Behavior
+  This is a port of the view_compaction.js suite
+  """
+  @num_docs 1000
+
+  @ddoc %{
+    _id: "_design/foo",
+    language: "javascript",
+    views: %{
+      view1: %{
+        map: "function(doc) { emit(doc._id, doc.value) }"
+      },
+      view2: %{
+        map:
+          "function(doc) { if (typeof(doc.integer) === 'number') {emit(doc._id, doc.integer);} }",
+        reduce: "function(keys, values, rereduce) { return sum(values); }"
+      }
+    }
+  }
+
+  defp bulk_save_for_update(db_name, docs) do
+    resp = bulk_save(db_name, docs)
+    revs = resp.body
+
+    Enum.map(docs, fn m ->
+      rev = Enum.at(revs, String.to_integer(m["_id"]))["rev"]
+
+      m
+      |> Map.put("_rev", rev)
+      |> Map.update!("integer", &(&1 + 1))
+    end)
+  end
+
+  @tag :with_db
+  test "view compaction", context do
+    db_name = context[:db_name]
+    create_doc(db_name, @ddoc)
+
+    docs = make_docs(0..(@num_docs - 1))
+    docs = bulk_save_for_update(db_name, docs)
+
+    resp = view(db_name, "foo/view1")
+    assert length(resp.body["rows"]) == @num_docs
+
+    resp = view(db_name, "foo/view2")
+    assert length(resp.body["rows"]) == 1
+
+    resp = Couch.get("/#{db_name}/_design/foo/_info")
+    assert resp.body["view_index"]["update_seq"] == @num_docs + 1
+
+    docs = bulk_save_for_update(db_name, docs)
+
+    resp = view(db_name, "foo/view1")
+    assert length(resp.body["rows"]) == @num_docs
+
+    resp = view(db_name, "foo/view2")
+    assert length(resp.body["rows"]) == 1
+
+    resp = Couch.get("/#{db_name}/_design/foo/_info")
+    assert resp.body["view_index"]["update_seq"] == 2 * @num_docs + 1
+
+    bulk_save(db_name, docs)
+    resp = view(db_name, "foo/view1")
+    assert length(resp.body["rows"]) == @num_docs
+
+    resp = view(db_name, "foo/view2")
+    assert length(resp.body["rows"]) == 1
+
+    resp = Couch.get("/#{db_name}/_design/foo/_info")
+    assert resp.body["view_index"]["update_seq"] == 3 * @num_docs + 1
+
+    disk_size_before_compact = resp.body["view_index"]["sizes"]["file"]
+    data_size_before_compact = resp.body["view_index"]["sizes"]["active"]
+
+    assert is_integer(disk_size_before_compact)
+    assert data_size_before_compact < disk_size_before_compact
+
+    resp = Couch.post("/#{db_name}/_compact/foo")
+    assert resp.body["ok"] == true
+
+    retry_until(fn ->
+      resp = Couch.get("/#{db_name}/_design/foo/_info")
+      resp.body["view_index"]["compact_running"] == false
+    end)
+
+    resp = view(db_name, "foo/view1")
+    assert length(resp.body["rows"]) == @num_docs
+
+    resp = view(db_name, "foo/view2")
+    assert length(resp.body["rows"]) == 1
+
+    resp = Couch.get("/#{db_name}/_design/foo/_info")
+    assert resp.body["view_index"]["update_seq"] == 3 * @num_docs + 1
+
+    disk_size_after_compact = resp.body["view_index"]["sizes"]["file"]
+    data_size_after_compact = resp.body["view_index"]["sizes"]["active"]
+    assert disk_size_after_compact < disk_size_before_compact
+    assert is_integer(data_size_after_compact)
+    assert data_size_after_compact < disk_size_after_compact
+  end
+end
diff --git a/test/javascript/tests/view_compaction.js b/test/javascript/tests/view_compaction.js
index d1a1e87..f2af390 100644
--- a/test/javascript/tests/view_compaction.js
+++ b/test/javascript/tests/view_compaction.js
@@ -10,6 +10,7 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.elixir = true;
 couchTests.view_compaction = function(debug) {
   if (debug) debugger;