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

rnewson pushed a commit to branch auto-delete-3
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 402cd346e4a92885958d2ddb4a47e87ce55cb362
Author: Robert Newson <[email protected]>
AuthorDate: Fri May 30 17:05:17 2025 +0100

    force changes command after each state-changing command
---
 test/elixir/test/drop_seq_statem_test.exs | 46 ++++++++++++++++++-------------
 1 file changed, 27 insertions(+), 19 deletions(-)

diff --git a/test/elixir/test/drop_seq_statem_test.exs 
b/test/elixir/test/drop_seq_statem_test.exs
index 1e67cc3a7..947454c50 100644
--- a/test/elixir/test/drop_seq_statem_test.exs
+++ b/test/elixir/test/drop_seq_statem_test.exs
@@ -13,7 +13,7 @@ defmodule DropSeqStateM do
   @moduletag :without_quorum_test
   @moduletag :with_quorum_test
 
-  property "drop_seq works fine", start_size: 5, max_size: 200, numtests: 
10000 do
+  property "drop_seq works fine", start_size: 5, max_size: 30, numtests: 10000 
do
     forall cmds <- more_commands(100, commands(__MODULE__)) do
       trap_exit do
         db_name = random_db_name()
@@ -46,7 +46,8 @@ defmodule DropSeqStateM do
     current_seq: 0,
     peer_checkpoint_seq: nil,
     drop_seq: nil,
-    drop_count: 0
+    drop_count: 0,
+    changed: false
   )
 
   def initial_state() do
@@ -57,16 +58,20 @@ defmodule DropSeqStateM do
     "doc-#{Enum.random(1..20)}"
   end
 
-  def command(_state) do
-    oneof([
-      {:call, __MODULE__, :update_document, [{:var, :dbname}, doc_id()]},
-      {:call, __MODULE__, :delete_document, [{:var, :dbname}, doc_id()]},
-      {:call, __MODULE__, :update_peer_checkpoint, [{:var, :dbname}]},
-      {:call, __MODULE__, :update_drop_seq, [{:var, :dbname}]},
-      {:call, __MODULE__, :compact_db, [{:var, :dbname}]},
-      {:call, __MODULE__, :changes, [{:var, :dbname}]},
-      {:call, __MODULE__, :split_shard, [{:var, :dbname}]}
-    ])
+  def command(s) do
+    if state(s, :changed) do
+      {:call, __MODULE__, :changes, [{:var, :dbname}]}
+    else
+      oneof([
+        {:call, __MODULE__, :update_document, [{:var, :dbname}, doc_id()]},
+        {:call, __MODULE__, :delete_document, [{:var, :dbname}, doc_id()]},
+        {:call, __MODULE__, :update_peer_checkpoint, [{:var, :dbname}]},
+        {:call, __MODULE__, :update_drop_seq, [{:var, :dbname}]},
+        {:call, __MODULE__, :compact_db, [{:var, :dbname}]},
+        {:call, __MODULE__, :changes, [{:var, :dbname}]},
+        {:call, __MODULE__, :split_shard, [{:var, :dbname}]}
+      ])
+    end
   end
 
   def get_document(db_name, doc_id) do
@@ -203,7 +208,8 @@ defmodule DropSeqStateM do
     state(s,
       current_seq: state(s, :current_seq) + 1,
       docs: Enum.sort([doc_id | state(s, :docs)]),
-      deleted_docs: List.keydelete(state(s, :deleted_docs), doc_id, 0)
+      deleted_docs: List.keydelete(state(s, :deleted_docs), doc_id, 0),
+      changed: true
     )
   end
 
@@ -212,12 +218,13 @@ defmodule DropSeqStateM do
       current_seq: state(s, :current_seq) + 1,
       docs: List.delete(state(s, :docs), doc_id),
       deleted_docs:
-        Enum.sort([{doc_id, state(s, :current_seq) + 1} | state(s, 
:deleted_docs)])
+        Enum.sort([{doc_id, state(s, :current_seq) + 1} | state(s, 
:deleted_docs)]),
+      changed: true
     )
   end
 
   def next_state(s, _v, {:call, _, :update_peer_checkpoint, [_db_name]}) do
-    state(s, peer_checkpoint_seq: state(s, :current_seq))
+    state(s, peer_checkpoint_seq: state(s, :current_seq), changed: true)
   end
 
   def next_state(s, _v, {:call, _, :update_drop_seq, [_db_name]}) do
@@ -229,7 +236,7 @@ defmodule DropSeqStateM do
         do: state(s, :current_seq),
         else: state(s, :peer_checkpoint_seq)
 
-    state(s, drop_seq: drop_seq)
+    state(s, drop_seq: drop_seq, changed: true)
   end
 
   def next_state(s, _v, {:call, _, :compact_db, [_db_name]}) do
@@ -240,16 +247,17 @@ defmodule DropSeqStateM do
 
     state(s,
       deleted_docs: keep_docs,
-      drop_count: state(s, :drop_count) + length(drop_docs)
+      drop_count: state(s, :drop_count) + length(drop_docs),
+      changed: true
     )
   end
 
   def next_state(s, _v, {:call, _, :changes, [_db_name]}) do
-    s
+    state(s, changed: false)
   end
 
   def next_state(s, _v, {:call, _, :split_shard, [_db_name]}) do
-    s
+    state(s, changed: true)
   end
 
   def postcondition(s, {:call, _, :changes, [_db_name]}, {doc_ids, 
del_doc_ids}) do

Reply via email to