From 8ecfcb6f3ed6c0cb4f8a6b93bbfc6dfc42e2f2ec Mon Sep 17 00:00:00 2001
From: Jean-Paul Calderone <exarkun@twistedmatrix.com>
Date: Wed, 1 Dec 2021 14:27:14 -0500
Subject: [PATCH] [wip]

---
 src/_zkapauthorizer/_storage_server.py        |  1 +
 .../tests/test_storage_server.py              | 57 +++++++++++++++++++
 2 files changed, 58 insertions(+)

diff --git a/src/_zkapauthorizer/_storage_server.py b/src/_zkapauthorizer/_storage_server.py
index 80d7e2d..160f3d6 100644
--- a/src/_zkapauthorizer/_storage_server.py
+++ b/src/_zkapauthorizer/_storage_server.py
@@ -248,6 +248,7 @@ class ZKAPAuthorizerStorageServer(Referenceable):
             passes,
             self._signing_key,
         )
+        # xxx write a comment
         for _ in range(len(validation.valid)):
             self._metric_spending_successes.observe(allocated_size)
 
diff --git a/src/_zkapauthorizer/tests/test_storage_server.py b/src/_zkapauthorizer/tests/test_storage_server.py
index b0be0cb..76c241a 100644
--- a/src/_zkapauthorizer/tests/test_storage_server.py
+++ b/src/_zkapauthorizer/tests/test_storage_server.py
@@ -575,6 +575,63 @@ class PassValidationTests(TestCase):
             Equals(expected_sizes),
         )
 
+    @skip("do it after #169")
+    @given(
+        storage_index=storage_indexes(),
+        secrets=tuples(
+            write_enabler_secrets(),
+            lease_renew_secrets(),
+            lease_cancel_secrets(),
+        ),
+        test_and_write_vectors_for_shares=slot_test_and_write_vectors_for_shares(),
+    )
+    def test_mutable_spending_metrics(
+        self, storage_index, secrets, test_and_write_vectors_for_shares,
+    ):
+        tw_vectors = {
+            k: v.for_call() for (k, v) in test_and_write_vectors_for_shares.items()
+        }
+        expected = get_required_new_passes_for_mutable_write(
+            self.pass_value,
+            dict.fromkeys(tw_vectors.keys(), 0),
+            tw_vectors,
+        )
+        valid_passes = make_passes(
+            self.signing_key,
+            slot_testv_and_readv_and_writev_message(storage_index),
+            list(RandomToken.create() for i in range(expected)),
+        )
+
+        before_count = read_count(self.storage_server)
+        before_bucket = read_bucket(self.storage_server, 0)
+
+        # Create an initial share to toy with.
+        test, read = self.storage_server.doRemoteCall(
+            "slot_testv_and_readv_and_writev",
+            (),
+            dict(
+                passes=valid_passes,
+                storage_index=storage_index,
+                secrets=secrets,
+                tw_vectors=tw_vectors,
+                r_vector=[],
+            ),
+        )
+
+        after_count = read_count(self.storage_server)
+        after_bucket = read_bucket(self.storage_server, 0)
+
+        self.expectThat(
+            after_count - before_count,
+            Equals(expected),
+            "Unexpected histogram sum value",
+        )
+        self.assertThat(
+            after_bucket - before_bucket,
+            Equals(expected),
+            "Unexpected histogram bucket value",
+        )
+
     @given(
         storage_index=storage_indexes(),
         renew_secret=lease_renew_secrets(),
-- 
GitLab