From de24d3cd94f325b700de7a64bc5b21a7f4ad7d5f Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@lothar.com>
Date: Tue, 26 Jun 2007 15:55:00 -0700
Subject: [PATCH] dump_uri_extension: improve test coverage of runner.py

---
 src/allmydata/scripts/runner.py   | 18 +++++++--------
 src/allmydata/test/test_system.py | 38 +++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 9 deletions(-)

diff --git a/src/allmydata/scripts/runner.py b/src/allmydata/scripts/runner.py
index 2f0ac6a0..b573dcc5 100644
--- a/src/allmydata/scripts/runner.py
+++ b/src/allmydata/scripts/runner.py
@@ -325,7 +325,7 @@ def stop(basedir, config):
     print "never saw process go away"
     return 1
 
-def dump_uri_extension(config):
+def dump_uri_extension(config, output=sys.stdout):
     from allmydata import uri
 
     filename = config['filename']
@@ -338,23 +338,23 @@ def dump_uri_extension(config):
              "share_root_hash")
     for k in keys1:
         if k in unpacked:
-            print "%19s: %s" % (k, unpacked[k])
-    print
+            print >>output, "%19s: %s" % (k, unpacked[k])
+    print >>output
     for k in keys2:
         if k in unpacked:
-            print "%19s: %s" % (k, unpacked[k])
-    print
+            print >>output, "%19s: %s" % (k, unpacked[k])
+    print >>output
     for k in keys3:
         if k in unpacked:
-            print "%19s: %s" % (k, unpacked[k])
+            print >>output, "%19s: %s" % (k, unpacked[k])
 
     leftover = set(unpacked.keys()) - set(keys1 + keys2 + keys3)
     if leftover:
-        print
+        print >>output
         for k in sorted(leftover):
-            print "%s: %s" % (k, unpacked[k])
+            print >>output, "%s: %s" % (k, unpacked[k])
 
-    print
+    print >>output
     return 0
 
 def dump_root_dirnode(basedir, config, output=sys.stdout):
diff --git a/src/allmydata/test/test_system.py b/src/allmydata/test/test_system.py
index af1bda46..509b7f46 100644
--- a/src/allmydata/test/test_system.py
+++ b/src/allmydata/test/test_system.py
@@ -1,11 +1,13 @@
 
 import os
+from cStringIO import StringIO
 from twisted.trial import unittest
 from twisted.internet import defer, reactor
 from twisted.application import service
 from allmydata import client, uri, download, upload
 from allmydata.introducer_and_vdrive import IntroducerAndVdrive
 from allmydata.util import idlib, fileutil, testutil
+from allmydata.scripts import runner
 from foolscap.eventual import flushEventualQueue
 from twisted.python import log
 from twisted.python.failure import Failure
@@ -259,6 +261,7 @@ class SystemTest(testutil.SignalMixin, unittest.TestCase):
             self.failUnlessEqual(data, DATA)
         d.addCallback(_get_done)
         d.addCallback(self._test_web)
+        d.addCallback(self._test_runner)
         return d
     test_vdrive.timeout = 1100
 
@@ -360,3 +363,38 @@ class SystemTest(testutil.SignalMixin, unittest.TestCase):
 
         return d
 
+    def _test_runner(self, res):
+        # exercise some of the diagnostic tools in runner.py
+
+        # find a uri_extension file
+        for (dirpath, dirnames, filenames) in os.walk(self.basedir):
+            if "uri_extension" in filenames:
+                break
+        else:
+            self.fail("unable to find any uri_extension files in %s"
+                      % self.basedir)
+        log.msg("test_system.SystemTest._test_runner using %s" % dirpath)
+
+        filename = os.path.join(dirpath, "uri_extension")
+        s = StringIO()
+        rc = runner.dump_uri_extension({'filename': filename}, s)
+        output = s.getvalue()
+        self.failUnlessEqual(rc, 0)
+
+        # we only upload a single file, so we can assert some things about
+        # its size and shares
+        self.failUnless("size: %d\n" % len(self.data) in output)
+        self.failUnless("num_segments: 1\n" in output)
+        # segment_size is always a multiple of needed_shares
+        self.failUnless("segment_size: 50\n" in output)
+        self.failUnless("total_shares: 100\n" in output)
+        # keys which are supposed to be present
+        for key in ("size", "num_segments", "segment_size",
+                    "needed_shares", "total_shares",
+                    "codec_name", "codec_params", "tail_codec_params",
+                    "plaintext_hash", "plaintext_root_hash",
+                    "crypttext_hash", "crypttext_root_hash",
+                    "share_root_hash",
+                    ):
+            self.failUnless("%s: " % key in output, key)
+
-- 
2.45.2