# Copyright (c) 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import unittest
import common
from autotest_lib.server.hosts import labstation_host


LabstationHost = labstation_host.LabstationHost


class MockRPMClient(object):
    """Mocking out the rpm_client to avoid actual API calls"""
    def __init__(self, expected_state=None):
        self._expected_state = expected_state

    def set_power(self, host, new_state):
        assert new_state == self._expected_state


class MockMasterSsh(object):
    def __init__(self):
        self.ssh_option = ""

    def maybe_start(self, *args, **kwargs):
        pass

    def close(self, *args, **kwargs):
        pass


class LabstationHostSkipInit(LabstationHost):
    """LabstationHostSkipInit is like a labstation host, but
    skips initialization.

    This gives us the ability to inject our own mocks during host
    setup.
    """
    def __init__(self):
        self._is_localhost = False
        self._master_ssh = MockMasterSsh()
        self.env = {}
        self.user = "a"
        self.port = 7
        self.known_hosts_file = None
        self.hostname = "a"

    def run(self, *args, **kwargs):
        class FakeResult(object):
            def __init__(self):
                self.stdout = ""
        return FakeResult()

    def wait_down(self, *args, **kwargs):
        return True

    def wait_up(self, *args, **kwargs):
        return True


class LabstationHostUnittest(unittest.TestCase):
    def test_rpm_power_on_and_wait(self):
        m = MockRPMClient(expected_state='ON')
        labstation = LabstationHostSkipInit()
        labstation.rpm_power_on_and_wait(_rpm_client=m)

    def test_rpm_power_off_and_wait(self):
        m = MockRPMClient(expected_state='OFF')
        labstation = LabstationHostSkipInit()
        labstation.rpm_power_off_and_wait(_rpm_client=m)


if __name__ == "__main__":
    unittest.main()
