From 7c4edac58277667005f3a5c43d6ae9e49c10b70f Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@lothar.com>
Date: Thu, 4 Dec 2008 15:01:24 -0700
Subject: [PATCH] stats: don't return booleans: it violates the schema. Add a
 test.

---
 src/allmydata/storage.py          |  4 +++-
 src/allmydata/test/test_system.py | 22 ++++++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/src/allmydata/storage.py b/src/allmydata/storage.py
index f3fd9836..faf6b5bb 100644
--- a/src/allmydata/storage.py
+++ b/src/allmydata/storage.py
@@ -866,6 +866,8 @@ class StorageServer(service.MultiService, Referenceable):
         fileutil.rm_dir(self.incomingdir)
 
     def get_stats(self):
+        # remember: RIStatsProvider requires that our return dict
+        # contains numeric values.
         stats = { 'storage_server.allocated': self.allocated_size(), }
         for category,ld in self.get_latencies().items():
             for name,v in ld.items():
@@ -896,7 +898,7 @@ class StorageServer(service.MultiService, Referenceable):
         except AttributeError:
             # os.statvfs is only available on unix
             pass
-        stats["storage_server.accepting_immutable_shares"] = writeable
+        stats["storage_server.accepting_immutable_shares"] = int(writeable)
         return stats
 
 
diff --git a/src/allmydata/test/test_system.py b/src/allmydata/test/test_system.py
index 942ffe4b..02fd446a 100644
--- a/src/allmydata/test/test_system.py
+++ b/src/allmydata/test/test_system.py
@@ -403,6 +403,28 @@ class SystemTest(SystemTestMixin, unittest.TestCase):
             return d
         d.addCallback(_upload_resumable)
 
+        def _grab_stats(ignored):
+            # the StatsProvider doesn't normally publish a FURL:
+            # instead it passes a live reference to the StatsGatherer
+            # (if and when it connects). To exercise the remote stats
+            # interface, we manually publish client0's StatsProvider
+            # and use client1 to query it.
+            sp = self.clients[0].stats_provider
+            sp_furl = self.clients[0].tub.registerReference(sp)
+            d = self.clients[1].tub.getReference(sp_furl)
+            d.addCallback(lambda sp_rref: sp_rref.callRemote("get_stats"))
+            def _got_stats(stats):
+                #print "STATS"
+                #from pprint import pprint
+                #pprint(stats)
+                s = stats["stats"]
+                self.failUnlessEqual(s["storage_server.accepting_immutable_shares"], 1)
+                c = stats["counters"]
+                self.failUnlessEqual(c["storage_server.allocate"], 2)
+            d.addCallback(_got_stats)
+            return d
+        d.addCallback(_grab_stats)
+
         return d
 
     def _find_shares(self, basedir):
-- 
2.45.2