# Copyright (c) 2011 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.

# This test isn't really HW specific. It's testing /dev/watchdog API
# to make sure it works as expected. The most robust implementations is
# based on real HW but it doesn't have to be.

from __future__ import print_function

import logging

# http://docs.python.org/2/library/errno.html
import errno

from autotest_lib.client.common_lib import error
from autotest_lib.server import test
from autotest_lib.server.cros.watchdog_tester import WatchdogTester


class platform_HWwatchdog(test.test):
    """Test to make sure that /dev/watchdog will reboot the system."""

    version = 1

    def _stop_watchdog(self, client, wd_dev):
        # HW watchdog is open and closed "properly".
        try:
            client.run('echo "V" > %s' % wd_dev)
        except error.AutoservRunError as e:
            raise error.TestError('write to %s failed (%s)' %
                                  (wd_dev, errno.errorcode[e.errno]))

    def run_once(self, host=None):
        tester = WatchdogTester(host)
        # If watchdog not present, just skip this test
        if not tester.is_supported():
            error.TestNAError('%s or %s not present. Skipping test.' %
                              (tester.WD_DEV, tester.DAISYDOG_PATH))
            return

        with tester:
            self._stop_watchdog(host, tester.WD_DEV)
            tester.trigger_watchdog()
