From e6489b1ef26d616cc682da0ddf3acc27156e7a64 Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@allmydata.com>
Date: Tue, 4 Mar 2008 14:01:28 -0700
Subject: [PATCH] test_filenode.py : improve coverage of mutable filenode, fix
 a bug in __hash__

---
 src/allmydata/mutable.py            |  4 +--
 src/allmydata/test/test_filenode.py | 48 ++++++++++++++++++++++++++++-
 2 files changed, 49 insertions(+), 3 deletions(-)

diff --git a/src/allmydata/mutable.py b/src/allmydata/mutable.py
index 20d1bb8d..925a286a 100644
--- a/src/allmydata/mutable.py
+++ b/src/allmydata/mutable.py
@@ -1580,13 +1580,13 @@ class MutableFileNode:
         return self._uri.is_readonly()
 
     def __hash__(self):
-        return hash((self.__class__, self.uri))
+        return hash((self.__class__, self._uri))
     def __cmp__(self, them):
         if cmp(type(self), type(them)):
             return cmp(type(self), type(them))
         if cmp(self.__class__, them.__class__):
             return cmp(self.__class__, them.__class__)
-        return cmp(self.uri, them.uri)
+        return cmp(self._uri, them._uri)
 
     def get_verifier(self):
         return IMutableFileURI(self._uri).get_verifier()
diff --git a/src/allmydata/test/test_filenode.py b/src/allmydata/test/test_filenode.py
index 9929b778..46300df8 100644
--- a/src/allmydata/test/test_filenode.py
+++ b/src/allmydata/test/test_filenode.py
@@ -1,6 +1,7 @@
 
 from twisted.trial import unittest
-from allmydata import filenode, uri, download
+from allmydata import filenode, uri, download, mutable
+from allmydata.util import hashutil
 
 class NotANode:
     pass
@@ -57,3 +58,48 @@ class Node(unittest.TestCase):
         d.addCallback(_check)
         return d
 
+    def test_mutable_filenode(self):
+        client = None
+        wk = "\x00"*16
+        fp = "\x00"*32
+        rk = hashutil.ssk_readkey_hash(wk)
+        si = hashutil.ssk_storage_index_hash(rk)
+
+        u = uri.WriteableSSKFileURI("\x00"*16, "\x00"*32)
+        n = mutable.MutableFileNode(client).init_from_uri(u)
+
+        self.failUnlessEqual(n.get_writekey(), wk)
+        self.failUnlessEqual(n.get_readkey(), rk)
+        self.failUnlessEqual(n.get_storage_index(), si)
+        # these itmes are populated on first read (or create), so until that
+        # happens they'll be None
+        self.failUnlessEqual(n.get_privkey(), None)
+        self.failUnlessEqual(n.get_encprivkey(), None)
+        self.failUnlessEqual(n.get_pubkey(), None)
+
+        self.failUnlessEqual(n.get_uri(), u.to_string())
+        self.failUnlessEqual(n.get_readonly_uri(), u.get_readonly().to_string())
+        self.failUnlessEqual(n.is_mutable(), True)
+        self.failUnlessEqual(n.is_readonly(), False)
+
+        n2 = mutable.MutableFileNode(client).init_from_uri(u)
+        self.failUnlessEqual(n, n2)
+        self.failIfEqual(n, "not even the right type")
+        self.failIfEqual(n, u) # not the right class
+        d = {n: "can these be used as dictionary keys?"}
+        d[n2] = "replace the old one"
+        self.failUnlessEqual(len(d), 1)
+
+        nro = n.get_readonly()
+        self.failUnless(isinstance(nro, mutable.MutableFileNode))
+
+        self.failUnlessEqual(nro.get_readonly(), nro)
+        nro_u = nro.get_uri()
+        self.failUnlessEqual(nro_u, nro.get_readonly_uri())
+        self.failUnlessEqual(nro_u, u.get_readonly().to_string())
+        self.failUnlessEqual(nro.is_mutable(), True)
+        self.failUnlessEqual(nro.is_readonly(), True)
+
+        v = n.get_verifier()
+        self.failUnless(isinstance(v, uri.SSKVerifierURI))
+
-- 
2.45.2