chromium/tools/licenses/spdx_writer_test.py

#!/usr/bin/env python3
# Copyright 2022 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for //tools/spdx_writer.py."""

import collections
import os
import sys
import unittest

REPOSITORY_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
sys.path.append(os.path.join(REPOSITORY_ROOT, 'tools', 'licenses'))

from spdx_writer import _get_spdx_path
from spdx_writer import _Package
from spdx_writer import _SPDXJSONWriter
from test_utils import path_from_root


class SpdxPathTest(unittest.TestCase):
  def test_get_spdx_path(self):
    actual = _get_spdx_path(path_from_root('src'),
                            path_from_root('src', 'root', 'third_party', 'abc'))
    self.assertEqual(actual, os.path.join(os.sep, 'root', 'third_party', 'abc'))

  def test_get_spdx_path_error(self):
    with self.assertRaises(ValueError):
      _get_spdx_path(path_from_root('src'),
                     path_from_root('some', 'other', 'path'))


class PackageTest(unittest.TestCase):
  def setUp(self):
    super().setUp()

    self.p = _Package('abc def ghi', path_from_root('src', 'LICENSE'))

  def test_package_spdx_id(self):
    self.assertEqual(self.p.package_spdx_id, 'SPDXRef-Package-abc-def-ghi')

  def test_license_spdx_id(self):
    self.assertEqual(self.p.license_spdx_id, 'LicenseRef-abc-def-ghi')


class SPDXJSONWriterTest(unittest.TestCase):
  def setUp(self):
    super().setUp()

    root_pkg = _Package('root', path_from_root('src', 'LICENSE'))
    self.writer = _SPDXJSONWriter(path_from_root('src'), root_pkg, '', '',
                                  '', lambda _: '')

  def test_get_dedup_id(self):
    id_dict = collections.defaultdict(int)
    elem_id = 'abc'

    id1 = self.writer._get_dedup_id(elem_id, id_dict)
    self.assertEqual(id1, elem_id)

    id2 = self.writer._get_dedup_id(elem_id, id_dict)
    self.assertEqual(id2, elem_id + '-1')

  def test_get_license_id(self):
    license_path = path_from_root('src', 'p1', 'LICENSE')
    p1 = _Package('p1', license_path)

    p1_id, need_license = self.writer._get_license_id(p1)
    self.assertEqual(p1_id, p1.license_spdx_id)
    self.assertTrue(need_license)

    # Try a new package with the same license path.
    p2 = _Package('p2', license_path)
    p2_id, need_license = self.writer._get_license_id(p2)
    self.assertEqual(p2_id, p1.license_spdx_id)
    self.assertFalse(need_license)


if __name__ == '__main__':
  unittest.main()