#!/usr/bin/python2
# Copyright 2017 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 mock
import unittest

import common
import constants
from autotest_lib.site_utils.admin_audit import verifiers
from autotest_lib.server.cros.storage import storage_validate as storage

# pylint: disable=missing-docstring


class StubHost(object):
    """Simple host"""
    def is_up(self, **args):
        return True

    def run(self, **args):
        return ''


class StubStorageStateValidator(object):
    def get_type(self):
        return "some_type"

    def get_state(self):
        return storage.STORAGE_STATE_WARNING


class VerifyDutStorageTests(unittest.TestCase):
    """Unit tests for ServoTypeLabel"""
    def test_state_is_none_till_run_verify(self):
        host = StubHost()
        verify = verifiers.VerifyDutStorage(host)
        self.assertEqual(verify.get_state(), None)

    @mock.patch('autotest_lib.server.cros.storage.'
                'storage_validate.StorageStateValidator')
    def test_get_state_after_runverify(self, validator):
        validator.return_value = StubStorageStateValidator()
        host = StubHost()
        verify = verifiers.VerifyDutStorage(host)
        verify.verify(set_label=False)
        self.assertEqual(verify.get_state(), constants.HW_STATE_ACCEPTABLE)


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