Skip to content

Commit 80cc6aa

Browse files
SCANPY-155 Provide properties computed during bootstrapping to the scanner engine
1 parent d339b7a commit 80cc6aa

4 files changed

Lines changed: 59 additions & 21 deletions

File tree

src/pysonar_scanner/__main__.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,16 @@
2020

2121
from pysonar_scanner import app_logging
2222
from pysonar_scanner import cache
23-
from pysonar_scanner.api import get_base_urls, SonarQubeApi
23+
from pysonar_scanner.api import get_base_urls, SonarQubeApi, BaseUrls
2424
from pysonar_scanner.configuration import configuration_loader
2525
from pysonar_scanner.configuration.configuration_loader import ConfigurationLoader
26-
from pysonar_scanner.configuration.properties import SONAR_VERBOSE
26+
from pysonar_scanner.configuration.properties import (
27+
SONAR_VERBOSE,
28+
SONAR_HOST_URL,
29+
SONAR_SCANNER_API_BASE_URL,
30+
SONAR_SCANNER_SONARCLOUD_URL,
31+
SONAR_SCANNER_PROXY_PORT,
32+
)
2733
from pysonar_scanner.scannerengine import ScannerEngine
2834

2935

@@ -35,6 +41,7 @@ def scan():
3541

3642
cache_manager = cache.get_default()
3743
api = __build_api(config)
44+
__update_config_with_api_urls(config, api.base_urls)
3845
scanner = ScannerEngine(api, cache_manager)
3946
return scanner.run(config)
4047

@@ -47,3 +54,12 @@ def __build_api(config: dict[str, any]) -> SonarQubeApi:
4754
token = configuration_loader.get_token(config)
4855
base_urls = get_base_urls(config)
4956
return SonarQubeApi(base_urls, token)
57+
58+
59+
def __update_config_with_api_urls(config, base_urls: BaseUrls):
60+
config[SONAR_HOST_URL] = base_urls.base_url
61+
config[SONAR_SCANNER_API_BASE_URL] = base_urls.api_base_url
62+
if base_urls.is_sonar_qube_cloud:
63+
config[SONAR_SCANNER_SONARCLOUD_URL] = base_urls.base_url
64+
config[SONAR_SCANNER_SONARCLOUD_URL] = base_urls.base_url
65+
config[SONAR_SCANNER_PROXY_PORT] = "443" if base_urls.base_url.startswith("https") else "80"

src/pysonar_scanner/scannerengine.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,20 @@
1717
# along with this program; if not, write to the Free Software Foundation,
1818
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1919
#
20-
from enum import Enum
2120
import json
2221
import logging
23-
from operator import le
2422
import pathlib
23+
from dataclasses import dataclass
24+
from subprocess import Popen, PIPE
2525
from threading import Thread
2626
from typing import IO, Callable, Optional
2727

28-
from dataclasses import dataclass
29-
3028
import pysonar_scanner.api as api
31-
3229
from pysonar_scanner.api import SonarQubeApi
3330
from pysonar_scanner.cache import Cache, CacheFile
31+
from pysonar_scanner.configuration.properties import SONAR_SCANNER_JAVA_EXE_PATH
3432
from pysonar_scanner.exceptions import ChecksumException, SQTooOldException
3533
from pysonar_scanner.jre import JREProvisioner, JREResolvedPath, JREResolver, JREResolverConfiguration
36-
from subprocess import Popen, PIPE
3734

3835

3936
@dataclass(frozen=True)
@@ -149,6 +146,8 @@ def __fetch_scanner_engine(self) -> pathlib.Path:
149146
def run(self, config: dict[str, any]):
150147
self.__version_check()
151148
jre_path = self.__resolve_jre(config)
149+
150+
config[SONAR_SCANNER_JAVA_EXE_PATH] = str(jre_path.path)
152151
scanner_engine_path = self.__fetch_scanner_engine()
153152
cmd = self.__build_command(jre_path, scanner_engine_path)
154153
properties_str = self.__config_to_json(config)

tests/unit/test_main.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,36 @@
2323

2424
from pysonar_scanner.__main__ import scan
2525
from pysonar_scanner.configuration.configuration_loader import ConfigurationLoader
26-
from pysonar_scanner.configuration.properties import SONAR_PROJECT_KEY, SONAR_TOKEN
26+
from pysonar_scanner.configuration.properties import (
27+
SONAR_PROJECT_KEY,
28+
SONAR_TOKEN,
29+
SONAR_HOST_URL,
30+
SONAR_SCANNER_API_BASE_URL,
31+
SONAR_SCANNER_SONARCLOUD_URL,
32+
SONAR_SCANNER_PROXY_PORT,
33+
)
2734
from pysonar_scanner.scannerengine import ScannerEngine
2835

2936

3037
class TestMain(pyfakefs.TestCase):
3138
@patch.object(ConfigurationLoader, "load", return_value={SONAR_TOKEN: "myToken", SONAR_PROJECT_KEY: "myProjectKey"})
3239
@patch.object(ScannerEngine, "run", return_value=0)
33-
def test_minimal_success_run(self, load_mock, run_mock):
40+
def test_minimal_success_run(self, run_mock, load_mock):
3441
exitcode = scan()
3542
self.assertEqual(exitcode, 0)
43+
44+
# Verify that run was called with the expected configuration
45+
run_mock.assert_called_once()
46+
config = run_mock.call_args[0][0] # Extract the configuration arg
47+
48+
# Check expected configuration with a single assertion
49+
expected_config = {
50+
SONAR_TOKEN: "myToken",
51+
SONAR_PROJECT_KEY: "myProjectKey",
52+
SONAR_HOST_URL: "https://sonarcloud.io",
53+
SONAR_SCANNER_API_BASE_URL: "https://api.sonarcloud.io",
54+
SONAR_SCANNER_SONARCLOUD_URL: "https://sonarcloud.io",
55+
SONAR_SCANNER_PROXY_PORT: "443",
56+
}
57+
58+
self.assertEqual(expected_config, config)

tests/unit/test_scannerengine.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,26 @@
1919
#
2020
import json
2121
import logging
22-
from math import log
23-
from subprocess import PIPE
24-
import unittest
2522
import pathlib
23+
import unittest
24+
from subprocess import PIPE
25+
from unittest.mock import Mock
26+
from unittest.mock import patch, MagicMock
27+
2628
import pyfakefs.fake_filesystem_unittest as pyfakefs
2729

28-
from pysonar_scanner import app_logging, cache
30+
from pysonar_scanner import cache
2931
from pysonar_scanner import scannerengine
32+
from pysonar_scanner.api import SQVersion
3033
from pysonar_scanner.exceptions import ChecksumException, SQTooOldException
31-
from pysonar_scanner.jre import JREProvisioner, JREResolvedPath, JREResolver
34+
from pysonar_scanner.jre import JREResolvedPath, JREResolver
3235
from pysonar_scanner.scannerengine import (
33-
CmdExecutor,
3436
LogLine,
3537
ScannerEngine,
3638
ScannerEngineProvisioner,
3739
default_log_line_listener,
38-
parse_log_line,
3940
)
40-
from unittest.mock import Mock
41-
42-
from pysonar_scanner.api import SQVersion
4341
from tests.unit import sq_api_utils
44-
from unittest.mock import patch, MagicMock
4542

4643

4744
class TestLogLine(unittest.TestCase):
@@ -154,6 +151,9 @@ def test_command_building(self, provision_mock, resolve_jre_mock, execute_mock):
154151
"scannerProperties": [
155152
{"key": "sonar.token", "value": "myToken"},
156153
{"key": "sonar.projectKey", "value": "myProjectKey"},
154+
{"key": "sonar.scanner.os", "value": "linux"},
155+
{"key": "sonar.scanner.arch", "value": "x64"},
156+
{"key": "sonar.scanner.javaExePath", "value": "jre/bin/java"},
157157
]
158158
}
159159
)

0 commit comments

Comments
 (0)