910e62b5创建于 1月15日历史提交
# Copyright 2019 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os.path
import unittest
from unittest import mock

from signing import model
from signing.test_config import TestConfig


def _get_identity_hash(i):
    if i == '[IDENTITY]':
        return 'identity'

    raise


class TestCodeSignedProduct(unittest.TestCase):

    def test_requirements_string_identifier(self):
        product = model.CodeSignedProduct('path/binary', 'binary')
        self.assertEqual('', product.requirements_string(TestConfig()))

    def test_requirements_no_identifier(self):
        product = model.CodeSignedProduct(
            'path/binary', 'binary', identifier_requirement=False)
        self.assertEqual('', product.requirements_string(TestConfig()))

    def test_requirements_string_ad_hoc(self):
        config = TestConfig(identity='-')
        product = model.CodeSignedProduct('path/binary', 'binary')
        self.assertEqual('', product.requirements_string(config))

        product = model.CodeSignedProduct(
            'path/binary', 'binary', requirements='req')
        self.assertEqual('', product.requirements_string(config))

    def test_requirements_product_requirement(self):
        product = model.CodeSignedProduct(
            'path/binary', 'binary', requirements='and another requirement')
        self.assertEqual(
            'designated => identifier "binary" and another requirement',
            product.requirements_string(TestConfig()))

    def test_requirements_config_requirement(self):

        class RequirementConfig(TestConfig):

            @property
            def codesign_requirements_basic(self):
                return 'and config requirement'

        product = model.CodeSignedProduct(
            'path/binary', 'binary', requirements='and another requirement')
        self.assertEqual(
            'designated => identifier "binary" and another requirement and config requirement',
            product.requirements_string(RequirementConfig()))

        self.assertEqual(
            '', product.requirements_string(RequirementConfig(identity='-')))


@mock.patch('signing.model._get_identity_hash', _get_identity_hash)
class TestDistribution(unittest.TestCase):

    def test_no_options(self):
        base_config = TestConfig()
        config = model.Distribution().to_config(base_config)
        self.assertEqual(base_config, config.base_config)
        self.assertEqual(base_config.app_product, config.app_product)
        self.assertEqual(base_config.base_bundle_id, config.base_bundle_id)
        self.assertEqual('provisiontest.identity',
                         config.provisioning_profile_basename)
        self.assertEqual(base_config.packaging_basename,
                         config.packaging_basename)

    def test_channel_no_customize(self):
        base_config = TestConfig()
        config = model.Distribution(
            channel='Beta', app_name_fragment='Beta').to_config(base_config)
        self.assertEqual(base_config.app_product, config.app_product)
        self.assertEqual(base_config.product, config.product)
        self.assertEqual(base_config.base_bundle_id, config.base_bundle_id)
        self.assertEqual('provisiontest.identity',
                         config.provisioning_profile_basename)
        self.assertEqual(base_config.packaging_basename,
                         config.packaging_basename)

    def test_channel_customize(self):
        base_config = TestConfig()
        config = model.Distribution(
            channel='beta',
            app_name_fragment='Beta',
            product_dirname='beta',
            creator_code='beta',
            channel_customize=True).to_config(base_config)
        self.assertEqual('App Product Beta', config.app_product)
        self.assertEqual(base_config.product, config.product)
        self.assertEqual('test.signing.bundle_id.beta', config.base_bundle_id)
        self.assertEqual('provisiontest_Beta.identity',
                         config.provisioning_profile_basename)
        self.assertEqual('AppProductBeta-99.0.9999.99',
                         config.packaging_basename)

    def test_packaging_basename_no_channel(self):
        base_config = TestConfig()
        config = model.Distribution(
            packaging_name_fragment='Canary').to_config(base_config)
        self.assertEqual(base_config, config.base_config)
        self.assertEqual(base_config.app_product, config.app_product)
        self.assertEqual(base_config.base_bundle_id, config.base_bundle_id)
        self.assertEqual('provisiontest.identity',
                         config.provisioning_profile_basename)
        self.assertEqual('AppProduct-99.0.9999.99-Canary',
                         config.packaging_basename)

    def test_packaging_basename_channel(self):
        dist = model.Distribution(
            channel='dev',
            app_name_fragment='Dev',
            packaging_name_fragment='Dev',
            product_dirname='dev',
            creator_code='dev ',
            channel_customize=True)
        config = dist.to_config(TestConfig())
        self.assertEqual('App Product Dev', config.app_product)
        self.assertEqual('Product', config.product)
        self.assertEqual('test.signing.bundle_id.dev', config.base_bundle_id)
        self.assertEqual('provisiontest_Dev.identity',
                         config.provisioning_profile_basename)
        self.assertEqual('AppProductDev-99.0.9999.99-Dev',
                         config.packaging_basename)


class TestPaths(unittest.TestCase):

    def test_construct(self):
        paths = model.Paths('[INPUT]', '/[OUTPUT]', '[WORK]')
        self.assertEqual(os.path.abspath('[INPUT]'), paths.input)
        self.assertEqual('/[OUTPUT]', paths.output)
        self.assertEqual(os.path.abspath('[WORK]'), paths.work)

    def test_packaging_dir(self):
        paths = model.Paths('/[INPUT]', '/[OUTPUT]', '/[WORK]')
        packaging_dir = paths.packaging_dir(TestConfig())
        self.assertEqual('/[INPUT]/Product Packaging', packaging_dir)

    def test_replace_work(self):
        paths = model.Paths('/[INPUT]', '/[OUTPUT]', '/[WORK]')
        self.assertEqual('/[WORK]', paths.work)
        paths2 = paths.replace_work('{WORK2}')
        self.assertEqual('/[WORK]', paths.work)
        self.assertEqual(os.path.abspath('{WORK2}'), paths2.work)


class TestPick(unittest.TestCase):

    def test_config(self):
        config = TestConfig()
        actual = model.pick(config, ['identity', 'app_product', ' missing '])
        expected = {'identity': '[IDENTITY]', 'app_product': 'App Product'}
        self.assertEqual(actual, expected)

    def test_dict(self):
        d = {'a': 1, 'b': 2, 'c': 3}
        actual = model.pick(d, ['c', 'q'])
        expected = {'c': 3}
        self.assertEqual(actual, expected)