chromium/build/android/gyp/gcc_preprocess_tests.py

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

This test suite contains various tests for the 'java_cpp_template' build rule,
which uses the gcc preprocessor to turn a template into Java code.
"""

import unittest
import tempfile

import gcc_preprocess


class TestPreprocess(unittest.TestCase):

  def testParsePackageName(self):
    with tempfile.NamedTemporaryFile(mode='w') as f:
      template = f.name
      f.file.write("""
package org.chromium.fake;
public class Empty {
}
""")
      f.file.flush()
      package_name, data = gcc_preprocess.ProcessJavaFile(template, [], [])
      self.assertEqual('org.chromium.fake', package_name)
      self.assertEqual(
          """
package org.chromium.fake;
public class Empty {
}
""".strip(), data.strip())

  def testMissingPackageName(self):
    with tempfile.NamedTemporaryFile(mode='w') as f:
      template = f.name
      f.file.write("""
public class Empty {
}
""")
      f.file.flush()
      with self.assertRaisesRegex(Exception,
                                  r'Could not find java package of.*'):
        gcc_preprocess.ProcessJavaFile(template, [], [])

  def testSinglePreprocessorEvaluation(self):
    with tempfile.NamedTemporaryFile(mode='w') as f:
      template = f.name
      f.file.write("""
package org.chromium.fake;
public class Sample {
#if defined(_ENABLE_ASSERTS)
    public boolean ENABLE_ASSERTS = true;
#else
    public boolean ENABLE_ASSERTS = false;
#endif
}
""")
      f.file.flush()
      defines = [
          '_ENABLE_ASSERTS',
      ]
      package_name, data = gcc_preprocess.ProcessJavaFile(template, defines, [])
      self.assertEqual('org.chromium.fake', package_name)
      self.assertEqual(
          """
package org.chromium.fake;
public class Sample {
    public boolean ENABLE_ASSERTS = true;
}
""".strip(), data.strip())

  def testNestedPreprocessorEvaluation(self):
    with tempfile.NamedTemporaryFile(mode='w') as f:
      template = f.name
      f.file.write("""
package org.chromium.fake;
#if defined(USE_FINAL)
#define MAYBE_FINAL final
#else
#define MAYBE_FINAL
#endif
public class Sample {
#if defined(_ENABLE_ASSERTS)
    public MAYBE_FINAL boolean ENABLE_ASSERTS = true;
#else
    public MAYBE_FINAL boolean ENABLE_ASSERTS = false;
#endif
}
""")
      f.file.flush()
      defines = [
          '_ENABLE_ASSERTS',
          'USE_FINAL',
      ]
      package_name, data = gcc_preprocess.ProcessJavaFile(template, defines, [])
      self.assertEqual('org.chromium.fake', package_name)
      self.assertEqual(
          """
package org.chromium.fake;
public class Sample {
    public final boolean ENABLE_ASSERTS = true;
}
""".strip(), data.strip())

  def testPreserveComments(self):
    with tempfile.NamedTemporaryFile(mode='w') as f:
      template = f.name
      f.file.write("""
// Copyright header ...
package org.chromium.fake;
/**
 * Some javadoc.
 */
public class Sample {
    // This is a comment outside the #if block.
#if defined(_ENABLE_ASSERTS)
    // Inside the #if block.
    public boolean ENABLE_ASSERTS = true;
#else
    // Inside the #else block.
    public boolean ENABLE_ASSERTS = false;
#endif
}
""")
      f.file.flush()
      defines = [
          '_ENABLE_ASSERTS',
      ]
      package_name, data = gcc_preprocess.ProcessJavaFile(template, defines, [])
      self.assertEqual('org.chromium.fake', package_name)
      self.assertEqual(
          """
// Copyright header ...
package org.chromium.fake;
/**
 * Some javadoc.
 */
public class Sample {
    // This is a comment outside the #if block.
    // Inside the #if block.
    public boolean ENABLE_ASSERTS = true;
}
""".strip(), data.strip())


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