def setUp(self):
     self.node = NodeFirefly()
     self.fw_path = '/path/to/firmware'
     cc2538_class = patch('gateway_code.utils.cc2538.CC2538').start()
     self.node.cc2538 = cc2538_class.return_value
     self.node.cc2538.flash.return_value = 0
     self.node.cc2538.reset.return_value = 0
     self.node.serial_redirection.start = Mock()
     self.node.serial_redirection.start.return_value = 0
     self.node.serial_redirection.stop = Mock()
     self.node.serial_redirection.stop.return_value = 0
    def test_basic(self, wait_tty):
        """Test basic functions of a firefly node."""
        # Reset the node
        wait_tty.return_value = 0
        assert self.node.reset() == 0
        assert wait_tty.call_count == 0

        # Node status always returns 0
        assert NodeFirefly.status() == 0
class TestNodeFirefly(unittest.TestCase):
    """Unittest class for firefly nodes."""
    def setUp(self):
        self.node = NodeFirefly()
        self.fw_path = '/path/to/firmware'
        cc2538_class = patch('gateway_code.utils.cc2538.CC2538').start()
        self.node.cc2538 = cc2538_class.return_value
        self.node.cc2538.flash.return_value = 0
        self.node.cc2538.reset.return_value = 0
        self.node.serial_redirection.start = Mock()
        self.node.serial_redirection.start.return_value = 0
        self.node.serial_redirection.stop = Mock()
        self.node.serial_redirection.stop.return_value = 0

    def tearDown(self):
        patch.stopall()

    def test_basic(self, wait_tty):
        """Test basic functions of a firefly node."""
        # Reset the node
        wait_tty.return_value = 0
        assert self.node.reset() == 0
        assert wait_tty.call_count == 0

        # Node status always returns 0
        assert NodeFirefly.status() == 0

    @patch('gateway_code.common.wait_no_tty')
    def test_setup(self, wait_no_tty, wait_tty):
        """Test setup function of a firefly node."""
        wait_no_tty.return_value = 0
        wait_tty.return_value = 0
        assert self.node.setup(self.fw_path) == 0
        wait_tty.assert_called_once()
        wait_no_tty.assert_called_once()
        self.node.cc2538.flash.assert_called_once()
        self.node.cc2538.flash.assert_called_with(self.fw_path)
        self.node.serial_redirection.start.assert_called_once()
        assert self.node.serial_redirection.stop.call_count == 0

    @patch('gateway_code.common.wait_no_tty')
    def test_teardown(self, wait_no_tty, wait_tty):
        """Test teardown of a firefly node."""
        wait_no_tty.return_value = 0
        wait_tty.return_value = 0
        # Teardown the node
        assert self.node.teardown() == 0
        self.node.cc2538.flash.assert_called_with(self.node.FW_IDLE)
        wait_tty.assert_called_once()
        wait_no_tty.assert_called_once()
        self.node.serial_redirection.stop.assert_called_once()
        assert self.node.serial_redirection.start.call_count == 0

    @patch('gateway_code.common.wait_no_tty')
    def test_flash(self, wait_no_tty, wait_tty):
        """Test flash of a firefly node."""
        wait_no_tty.return_value = 0
        wait_tty.return_value = 0
        # Flash a firmware
        assert self.node.flash(self.fw_path) == 0
        self.node.cc2538.flash.assert_called_with(self.fw_path)
        assert wait_tty.call_count == 0
        assert wait_no_tty.call_count == 0

        # Flash idle firmware
        assert self.node.flash() == 0
        self.node.cc2538.flash.assert_called_with(self.node.FW_IDLE)
        assert wait_tty.call_count == 0
        assert wait_no_tty.call_count == 0