# Copyright (c) 2010 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 dircache, logging, os, time
from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error

TPM_TSS_VERSION = "1.2"
TPM_OWNER_SECRET = "owner123"
TPM_SRK_SECRET = "srk123"

# These tests fail on the most important dogfood hardware (as of 10/10/10).

excluded_tests = [
        "Tspi_Context_GetRegisteredKeysByUUID01",
        "Tspi_Context_GetRegisteredKeysByUUID2_01",
        "Tspi_Context_LoadKeyByUUID03",
        "Tspi_Context_UnregisterKey03",
        "Tspi_NV_DefineSpace04",
        "Tspi_NV_DefineSpace11",
        "Tspi_NV_DefineSpace12",
        "Tspi_TPM_LoadMaintenancePubKey01",
        "Tspi_TPM_SetStatus01",
        "Tspi_Key_UnloadKey-trans01",
        "Tspi_Key_UnloadKey-trans02",
        "Tspi_NV_ReadValue-trans01",
        "Tspi_NV_ReadValue-trans02",
        "Tspi_NV_WriteValue-trans01",
        "Tspi_NV_WriteValue-trans02",
        "Tspi_TPM_CheckMaintenancePubKey-trans01",
        "Tspi_TPM_CheckMaintenancePubKey-trans02",
        "Tspi_TPM_CheckMaintenancePubKey-trans03",
        "Tspi_TPM_CreateMaintenanceArchive-trans01",
        "Tspi_TPM_CreateMaintenanceArchive-trans02",
        "Tspi_TPM_CreateMaintenanceArchive-trans03",
        "Tspi_TPM_Delegate_VerifyDelegation-trans03",
        "Tspi_TPM_GetAuditDigest-trans01",
        "Tspi_TPM_GetAuditDigest-trans02",
        "Tspi_TPM_GetAuditDigest-trans03",
        "Tspi_TPM_GetPubEndorsementKey-trans01",
        "Tspi_TPM_GetPubEndorsementKey-trans02",
        "Tspi_TPM_GetPubEndorsementKey-trans03",
        "Tspi_TPM_KillMaintenanceFeature-trans01",
        "Tspi_TPM_KillMaintenanceFeature-trans02",
        "Tspi_TPM_KillMaintenanceFeature-trans03",
        "Tspi_TPM_LoadMaintenancePubKey-trans01",
        "Tspi_TPM_LoadMaintenancePubKey-trans02",
        "Tspi_TPM_LoadMaintenancePubKey-trans03",
        "Tspi_TPM_OwnerGetSRKPubKey-trans01",
        "Tspi_TPM_OwnerGetSRKPubKey-trans02",
        "Tspi_TPM_SetOperatorAuth-trans01",
        "Tspi_TPM_SetOperatorAuth-trans02",
        "Tspi_TPM_SetOperatorAuth-trans03",
        "Tspi_TPM_SetStatus-trans01",
        "Tspi_TPM_SetStatus-trans02",
        "Tspi_TPM_SetStatus-trans03",
        "Tspi_ChangeAuthAsym01",
        "Tspi_ChangeAuthAsym02",
        "Tspi_ChangeAuthAsym03",
        "Tspi_GetAttribData17",
        "Tspi_SetAttribData01",
        "Tspi_Hash_TickStampBlob01",
        "Tspi_Context_GetCapability18",
        "Tspi_TPM_CollateIdentityRequest01",
        "Tspi_TPM_CollateIdentityRequest-trans01",
        "Tspi_TPM_CollateIdentityRequest-trans02",
        "Tspi_TPM_CollateIdentityRequest-trans03",
        # bad tests (incorrect exit code)
        "Tspi_NV_WriteValue-trans03",
        "Tspi_TPM_Delegate_VerifyDelegation-trans01",
        "Tspi_TPM_Delegate_VerifyDelegation-trans02",
]

def run_trousers_tests(bindir):
        # Special return codes from trousers tests.
        TEST_RETURN_SUCCESS = 0
        TEST_RETURN_NOT_IMPLEMENTED = 6
        TEST_RETURN_NOT_APPLICABLE = 126

        num_tests_considered = 0
        num_tests_passed = 0
        num_tests_failed = 0
        num_tests_not_implemented = 0
        num_tests_not_applicable = 0

        os.putenv('TESTSUITE_OWNER_SECRET', TPM_OWNER_SECRET)
        os.putenv('TESTSUITE_SRK_SECRET', TPM_SRK_SECRET)

        for test in dircache.listdir(bindir):
            if test in excluded_tests:
                    logging.info('Skipping test: %s' % test)
                    continue
            logging.info('Running test: %s' % test)
            num_tests_considered = num_tests_considered + 1
            return_code = utils.system('%s/%s -v %s' %
                                       (bindir, test, TPM_TSS_VERSION),
                                       timeout=180,  # In seconds
                                       ignore_status=True  # Want return code
                                       )
            logging.info('-- Return code: %d (%s)' % (return_code, test))
            if return_code == TEST_RETURN_SUCCESS:
                num_tests_passed = num_tests_passed + 1
            elif return_code == TEST_RETURN_NOT_IMPLEMENTED:
                num_tests_not_implemented = num_tests_not_implemented + 1
            elif return_code == TEST_RETURN_NOT_APPLICABLE:
                num_tests_not_applicable = num_tests_not_applicable + 1
            else:
                num_tests_failed = num_tests_failed + 1

        logging.info('Considered %d tests.' % num_tests_considered)
        logging.info('-- Passed: %d' % num_tests_passed)
        logging.info('-- Failed: %d' % num_tests_failed)
        logging.info('-- Not Implemented: %d' % num_tests_not_implemented)
        logging.info('-- Not Applicable: %d' % num_tests_not_applicable)

        if num_tests_failed != 0:
            raise error.TestError('Test failed (%d failures)' %
                                  num_tests_failed)
