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)