test_java.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from tempfile import mkstemp
  2. import pytest
  3. from symbolic.proguard import ProguardMapper
  4. from sentry.profiles.java import deobfuscate_signature
  5. PROGUARD_SOURCE = b"""\
  6. # compiler: R8
  7. # compiler_version: 2.0.74
  8. # min_api: 16
  9. # pg_map_id: 5b46fdc
  10. # common_typos_disable
  11. # {"id":"com.android.tools.r8.mapping","version":"1.0"}
  12. org.slf4j.helpers.Util$ClassContextSecurityManager -> org.a.b.g$a:
  13. 65:65:void <init>() -> <init>
  14. 67:67:java.lang.Class[] getClassContext() -> a
  15. 69:69:java.lang.Class[] getExtraClassContext() -> a
  16. 65:65:void <init>(org.slf4j.helpers.Util$1) -> <init>
  17. """
  18. @pytest.fixture
  19. def mapper():
  20. _, mapping_file_path = mkstemp()
  21. with open(mapping_file_path, "wb") as f:
  22. f.write(PROGUARD_SOURCE)
  23. mapper = ProguardMapper.open(mapping_file_path)
  24. assert mapper.has_line_info
  25. return mapper
  26. @pytest.mark.parametrize(
  27. ["obfuscated", "expected"],
  28. [
  29. # invalid signatures
  30. ("", ""),
  31. ("()", ""),
  32. ("(L)", ""),
  33. # valid signatures
  34. ("()V", "()"),
  35. ("([I)V", "(int[])"),
  36. ("(III)V", "(int, int, int)"),
  37. ("([Ljava/lang/String;)V", "(java.lang.String[])"),
  38. ("([[J)V", "(long[][])"),
  39. ("(I)I", "(int): int"),
  40. ("([B)V", "(byte[])"),
  41. (
  42. "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
  43. "(java.lang.String, java.lang.String): java.lang.String",
  44. ),
  45. ],
  46. )
  47. def test_deobfuscate_signature(mapper, obfuscated, expected):
  48. assert deobfuscate_signature(obfuscated, mapper) == expected