import io
import unittest
from unittest.mock import patch
from src.advisor.reports.issues.dependency_version_issue import DependencyVersionIssue
from src.advisor.reports.issues.unsupported_dependency_issue import UnsupportedDependencyIssue
from src.advisor.reports.remarks.dependency_version_remark import DependencyVersionRemark
from src.advisor.reports.remarks.special_instructions_remark import SpecialInstructionsRemark
from src.advisor.reports.report import Report
from src.advisor.scanners.java_scanner import JavaScanner
class TestJavaScaner(unittest.TestCase):
def setUp(self) -> None:
self.scanner = JavaScanner()
self.report = Report('/root')
def test_accepts_file(self):
self.assertFalse(self.scanner.accepts_file('test.txt'))
self.assertTrue(self.scanner.accepts_file('pom.xml'))
def test_scan_file_object_with_unreported_dependency_finds_no_issues(self):
io_object = io.StringIO('''
my-test1
1.0
junit
junit
4.8.2
''')
self.scanner.scan_file_object('pom.xml', io_object, self.report)
self.assertEqual(0, len(self.report.issues))
self.assertEqual(0, len(self.report.remarks))
self.assertEqual(0, len(self.report.errors))
def test_scan_file_object_with_valid_versions_finds_no_issues(self):
io_object = io.StringIO('''
my-test1
1.0
com.github.luben
zstd-jni
1.2.0
org.xerial.snappy
snappy-java
1.1.8.4
''')
self.scanner.scan_file_object('pom.xml', io_object, self.report)
self.assertEqual(0, len(self.report.issues))
def test_scan_file_object_with_invalid_version_finds_issues(self):
io_object = io.StringIO('''
my-test1
1.0
com.github.luben
zstd-jni
1.1.0
org.xerial.snappy
snappy-java
1.1.3
org.lz4
lz4-java
1.4.0
''')
self.scanner.scan_file_object('pom.xml', io_object, self.report)
self.assertEqual(2, len(self.report.issues))
self.assertIsInstance(self.report.issues[0], DependencyVersionIssue)
self.assertIsInstance(self.report.issues[1], DependencyVersionIssue)
def test_scan_file_object_with_library_with_manual_build_requirement_adds_warning(self):
io_object = io.StringIO('''
my-test1
1.0
com.hadoop.gplcompression
hadoop-lzo
0.4.17
''')
self.scanner.scan_file_object('pom.xml', io_object, self.report)
self.assertEqual(1, len(self.report.remarks))
self.assertIsInstance(self.report.remarks[0], SpecialInstructionsRemark)
def test_scan_file_object_with_unsupported_library_finds_issue(self):
io_object = io.StringIO('''
my-test1
1.0
org.fusesource.leveldbjni
leveldbjni-all
1.8
''')
self.scanner.scan_file_object('pom.xml', io_object, self.report)
self.assertEqual(1, len(self.report.issues))
self.assertIsInstance(self.report.issues[0], UnsupportedDependencyIssue)
def test_scan_file_object_without_version_specified_adds_remark(self):
io_object = io.StringIO('''
my-test1
1.0
jffi
jffi
compile
''')
self.scanner.scan_file_object('pom.xml', io_object, self.report)
self.assertEqual(1, len(self.report.remarks))
self.assertIsInstance(self.report.remarks[0], DependencyVersionRemark)
def test_scan_file_object_with_version_in_property_node_adds_issue(self):
io_object = io.StringIO(r'''
my-test1
1.0
1.1.3
org.xerial.snappy
snappy-java
${snappy.version}
''')
self.scanner.scan_file_object('pom.xml', io_object, self.report)
self.assertEqual(1, len(self.report.issues))
self.assertIsInstance(self.report.issues[0], DependencyVersionIssue)
def test_scan_file_object_with_java_files_adds_language_version_remark(self):
io_object = io.StringIO('System.out.println("Hello, World!");')
self.scanner.scan_file_object('main.java', io_object, self.report)
self.assertEqual(2, len(self.report.remarks))
self.assertEqual(
f'detected java code. min version 8 is required. version 11 or above is recommended. see https://github.com/aws/aws-graviton-getting-started/blob/main/java.md for more details.',
self.report.remarks[0].description
)
self.assertEqual(
f'detected java code. we recommend using Corretto. see https://aws.amazon.com/corretto/ for more details.',
self.report.remarks[1].description
)
@patch('src.advisor.scanners.java_scanner.Utils.running_from_binary')
@patch('src.advisor.scanners.java_scanner.ReportItem')
def test_add_java_remark_from_binary(self, report_item_mock, running_from_binary_mock):
item = 'java is not installed. We need java to scan jar files for native methods'
running_from_binary_mock.return_value = True
self.scanner.add_jar_remark(self.report)
report_item_mock.assert_called_once_with(item)
@patch('src.advisor.scanners.java_scanner.Utils.running_from_binary')
@patch('src.advisor.scanners.java_scanner.ReportItem')
def test_add_java_remark_from_script(self, report_item_mock, running_from_binary_mock):
item = 'java and/or Maven are not installed. We need java and Maven to scan jar files for native methods'
running_from_binary_mock.return_value = False
self.scanner.add_jar_remark(self.report)
report_item_mock.assert_called_once_with(item)