# Copyright (C) 2019 Armin Kuster <akuster808@gmail.com>
#
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage


class Tpm2Test(OERuntimeTestCase):
    def check_endlines(self, results,  expected_endlines): 
        for line in results.splitlines():
            for el in expected_endlines:
                if line == el:
                    expected_endlines.remove(el)
                    break

        if expected_endlines:
            self.fail('Missing expected line endings:\n  %s' % '\n  '.join(expected_endlines))

    @OEHasPackage(['tpm2.0-tss'])
    @OEHasPackage(['tpm2-abrmd'])
    @OEHasPackage(['tpm2.0-tools'])
    @OEHasPackage(['ibmswtpm2'])
    @OETestDepends(['ssh.SSHTest.test_ssh'])
    def test_tpm2_sim(self):
        cmds = [
                'tpm_server &',
                'tpm2-abrmd --allow-root --tcti=mssim &'
               ]

        for cmd in cmds:
            status, output = self.target.run(cmd)
            self.assertEqual(status, 0, msg='\n'.join([cmd, output]))

    @OETestDepends(['tpm2.Tpm2Test.test_tpm2_sim'])
    def test_tpm2(self):
         (status, output) = self.target.run('tpm2_pcrlist')
         expected_endlines = []
         expected_endlines.append('sha1 :')
         expected_endlines.append('  0  : 0000000000000000000000000000000000000003')
         expected_endlines.append('  1  : 0000000000000000000000000000000000000000')

         self.check_endlines(output, expected_endlines)

