#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#

# This test should cover https://bugzilla.yoctoproject.org/tr_show_case.cgi?case_id=284
# testcase. Image under test must have meta-skeleton layer in bblayers and
# IMAGE_INSTALL:append = " service" in local.conf
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.data import skipIfDataVar
from oeqa.runtime.decorator.package import OEHasPackage

class SkeletonBasicTest(OERuntimeTestCase):

    @OETestDepends(['ssh.SSHTest.test_ssh'])
    @OEHasPackage(['service'])
    @skipIfDataVar('VIRTUAL-RUNTIME_init_manager', 'systemd',
                   'Not appropiate for systemd image')
    def test_skeleton_availability(self):
        status, output = self.target.run('ls /etc/init.d/skeleton')
        msg = 'skeleton init script not found. Output:\n%s' % output
        self.assertEqual(status, 0, msg=msg)

        status, output =  self.target.run('ls /usr/sbin/skeleton-test')
        msg = 'skeleton-test not found. Output:\n%s' % output
        self.assertEqual(status, 0, msg=msg)

    @OETestDepends(['skeletoninit.SkeletonBasicTest.test_skeleton_availability'])
    def test_skeleton_script(self):
        output1 = self.target.run("/etc/init.d/skeleton start")[1]
        cmd = '%s | grep [s]keleton-test' % self.tc.target_cmds['ps']
        status, output2 = self.target.run(cmd)
        msg = ('Skeleton script could not be started:'
               '\n%s\n%s' % (output1, output2))
        self.assertEqual(status, 0, msg=msg)
