def test_init(self):
        path = '%s/unittest-init' % self.sandbox
        data = {'unittest': 'data'}
        reg1 = RegistrationBase(zk=self.zk, path=path, data=data)

        # Ensure that the initial state of the RegistrationBase object
        # includes the original supplied data, the encoded, and the
        # decoded data bits that will be used for comparison later.
        self.assertFalse(reg1._ephemeral)
        self.assertFalse(reg1._state)
        self.assertEquals(path, reg1._path)
        self.assertEquals(data, reg1._data)
        self.assertTrue('unittest' in reg1._encoded_data)
        self.assertTrue('unittest' in reg1._decoded_data)

        # The RegistrationBase object does not aggressively set the data
        # or path in Zookeeper at instantiation time, so the returned data
        # should be None.
        self.assertEquals(None, reg1._watcher.get()['data'])
        self.assertEquals(None, reg1._watcher.get()['stat'])

        # First, data() should return None because we havn't actively
        # registered the path.
        self.assertEquals(None, reg1.data())
        self.assertEquals({'path': path, 'stat': None,
                           'data': None, 'children': []}, reg1.get())
        self.assertFalse(reg1.state())
        self.assertEquals(None, self.zk.exists(path))

        # Tear down the object
        reg1.stop()
    def test_stop(self):
        path = '%s/unittest-update' % self.sandbox
        data = {'unittest': 'data'}
        reg1 = RegistrationBase(zk=self.zk, path=path, data=data)

        # Now register the path and wait until reg1.data() returns some data
        # other than None. If it doesn't after 5 seconds, fail.
        reg1.start()
        waituntil(reg1.data, None, 5)
        self.assertTrue(self.zk.exists(path))

        # Now, test shutting the node down
        current_stat = reg1.get()
        reg1.stop()
        waituntil(reg1.get, current_stat, 5)
        self.assertEquals(None, reg1.get()['stat'])
        self.assertFalse(reg1.state())
        self.assertEquals(None, self.zk.exists(path))
    def test_start(self):
        path = '%s/unittest-start' % self.sandbox
        data = {'unittest': 'data'}
        reg1 = RegistrationBase(zk=self.zk, path=path, data=data)

        # Now register the path and wait until reg1.data() returns some data
        # other than None. If it doesn't after 5 seconds, fail.
        reg1.start()
        waituntil(reg1.data, None, 5)

        # Now that some data is back, make sure that its correct in zookeeper,
        # and in the Registration object.
        self.assertTrue(self.zk.exists(path))
        data = self.zk.get(path)[0]
        self.assertTrue('created' in reg1.data() and 'created' in data)
        self.assertTrue('pid' in reg1.data() and 'pid' in data)
        self.assertTrue('unittest' in reg1.data() and 'unittest' in data)
        self.assertTrue(reg1.state())

        # Tear down the object
        reg1.stop()