Code Monkey home page Code Monkey logo

client-java's Introduction

Client java

DISCLAIMER: We use Google Analytics for sending anonymous usage information such as agent's and client's names, and their versions after a successful launch start. This information might help us to improve both ReportPortal backend and client sides. It is used by the ReportPortal team only and is not supposed for sharing with 3rd parties.

Maven Central CI Build codecov Join Slack chat! stackoverflow Build with Love License

The latest version: 5.2.14. Please use Maven Central link above to get the client.

JVM-based clients configuration

How to provide parameters

There are several ways to load parameters. Be aware that higher sources override lower ones. For example, properties from file can be overridden by JVM variables.

Order Source
1 JVM arguments
2 Environment variables
3 Properties file

JVM arguments

ReportPortal client does not necessarily need properties file to be configured. One of the option is to use JVM arguments which have the highest priority among configuration ways. To use them you need to specify them in command line after Java executable using -D flag. Example:

$ java -Drp.endpoint=https://rp.epam.com/ -jar my-tests.jar

Environment variables

In case of bypassing parameters through environment variables they should be specified in UPPERCASE separated by underscores (_). E.G.:

  • rp.endpoint --> RP_ENDPOINT
  • rp.skipped.issue --> RP_SKIPPED_ISSUE

Property file

The most common way to start using an agent is to copy your configuration from UI of ReportPortal at User Profile section or configure property file reportportal.properties in the following format:

rp.endpoint=https://rp.epam.com/
rp.api.key=8967de3b-fec7-47bb-9dbc-2aa4ceab8b1e
rp.launch=launch-name
rp.project=project-name
## OPTIONAL PARAMETERS
rp.reporting.callback=true
rp.enable=true
rp.description=My awesome launch
rp.attributes=key:value;value
rp.rerun=true
rp.rerun.of=ae586912-841c-48de-9391-50720c35dd5a
rp.convertimage=true
rp.mode=DEFAULT
rp.skipped.issue=true
rp.batch.size.logs=20
rp.keystore.resource=<PATH_TO_YOUR_KEYSTORE>
rp.keystore.password=<PASSWORD_OF_YOUR_KEYSTORE>

For detailed parameter description see below sections.

Default properties file should have reportportal.properties name. It can be situated in the class path (in the project directory) and if client can’t find the file it logs a warning. But you can also use your custom property file specifying file's path in rp.properties.path system property or RP_PROPERTIES_PATH environment variable. The first option has priority, so if you specify the path in both system properties and environment variables then system property value will be used.

Parameters

Common parameters

Property name Type Description Required
rp.endpoint String URL of web service, where requests should be send Yes
rp.api.key String Api token of user Yes
rp.launch String A unique name of Launch (Run). Based on that name a history of runs will be created for particular name Yes
rp.project String Project name to identify scope Yes
rp.launch.uuid String A unique Launch UUID to which the whole test execution will be uploaded. No new launch will be created if the property specified. No
rp.launch.uuid.print Boolean Enables printing Launch UUID on test run start. Default False. No
rp.launch.uuid.print.output Enum Launch UUID print output. Default stdout. Possible values: stderr, stdout. No
rp.enable Boolean Enable/Disable logging to ReportPortal: rp.enable=true - enable log to RP server. Any other value means 'false': rp.enable=false - disable log to RP server. If parameter is absent in properties file then automation project results will be posted on RP. No
rp.description String Launch description No
rp.attributes String Set of attributes for specifying additional meta information for current launch. Format: key:value;value;build:12345-6. Attributes should be separated by “;”, keys and values - “:”. No
rp.reporting.async Boolean Enables asynchronous reporting. Available values - true (by default) or false. Supported only in 5+ version. No
rp.reporting.callback Boolean Enables callback reporting. Available values - true or false(by default). Supported only in 5+ vesion No
rp.rerun Boolean Enables rerun mode. Available values - true or false(by default). Supported only in 5+ version No
rp.rerun.of String Specifies UUID of launch that has to be rerun. No
rp.convertimage Boolean Colored log images can be converted to grayscale for reducing image size. Values: ‘true’ – will be converted. Any other value means ‘false’. No
rp.mode Enum ReportPortal provides possibility to specify visibility of executing launch. Currently two modes are supported: DEFAULT - all users from project can see this launch; DEBUG - all users except of Customer role can see this launch (in debug sub tab). Note: for all java based clients (TestNG, Junit) mode will be set automatically to "DEFAULT" if it is not specified. No
rp.skipped.issue Boolean ReportPortal provides feature to mark skipped tests as not 'To Investigate' items on WS side. Parameter could be equal boolean values:
  • true - skipped tests considered as issues and will be marked as 'To Investigate' on ReportPortal.
  • false - skipped tests will not be marked as 'To Investigate' on application.
  • No
    rp.batch.size.logs Integer Put logs into batches of specified size in order to rise up performance and reduce number of requests to server. Default = 10 No
    rp.batch.payload.limit Long Limit batches by payload size to avoid request rejection due to server limitations. No
    rp.rx.buffer.size Integer Internal queue size for log processing, increase this value along with log batch size if you see not all your logs passing to server. Default = 128 No
    rp.keystore.resource String Put your JKS file into resources and specify path to it No
    rp.keystore.password String Access password for JKS (certificate storage) package, mentioned above
    No

    Launch name sets once before first execution, because in common launch parts are fixed for a long time. By keeping the same launch name we will know a fixed list of suites behind it. That will allow us to have a history trend. On Report Portal UI different launch iterations will be saved with postfix "#number", like "Test Launch #1", "Test Launch #2" etc.

    If mandatory parameters are missed client will log a warning and will be initialized in inactive state.

    Multi-process join parameters

    Property name Type Description
    rp.client.join Boolean Default: true
    Enable / Disable multi-process launch join mode
    rp.client.join.mode Enum [FILE, SOCKET], Default: FILE
    Which mechanism will be used to join multi-process launches:
  • FILE - the client will create a locking file
  • SOCKET - the client will open a socket
  • rp.client.join.port Integer Default: 25464
    If client join mode set to SOCKET, this property controls port number of the socket
    rp.client.join.timeout.value Integer Default: 1.8M milliseconds (30 minutes)
    Timeout value for secondary launches. Primary launch will wait that amount of time after test execution for secondary launch finish.
    rp.client.join.timeout.unit Enum Default: MILLISECONDS
    Timeout value time unit. Should be one of values from java.util.concurrent.TimeUnit class
    rp.client.join.file.lock.name String Default: reportportal.lock
    A name of a main lock file, can be an absolute path. A client which managed to obtain that lock count itself as a primary launch process. It rewrites synchronization file with its launch ID.
    rp.client.join.file.sync.name String Default: reportportal.sync
    A name of a launch ID synchronization file, can be an absolute path. Each client waits for a lock on that file to get a launch ID (first line) and write its own ID to the end of the file.
    rp.client.join.lock.timeout.value Integer Default: 1 minute
    Files lock / connection timeout for launches.
    rp.client.join.lock.timeout.unit Enum Default: MILLISECONDS
    Timeout value time unit. Should be one of values from java.util.concurrent.TimeUnit class

    HTTP parameters

    Property name Type Description
    rp.http.proxy String A URL of a HTTP proxy to connect to the endpoint.
    rp.http.proxy.username String A username for used proxy, works only if Proxy URL is set.
    rp.http.proxy.password String Password for proxy, works only if Proxy URL and Proxy Username are set.
    rp.http.logging Boolean Default: false
    Enable / Disable HTTP logging.
    rp.http.timeout.call.value Integer Default: Infinitive
    Timeout value for the entire call: resolving DNS, connecting, writing the request body, server processing, and reading the response body. If the call requires redirects or retries all must complete within one timeout period.
    rp.http.timeout.call.unit Enum Default: MILLISECONDS
    Timeout value time unit. Should be one of values from java.util.concurrent.TimeUnit class
    rp.http.timeout.connect.value Integer Default: 10 seconds
    Connect timeout for new HTTP connections.
    rp.http.timeout.connect.unit Enum Default: MILLISECONDS
    Timeout value time unit. Should be one of values from java.util.concurrent.TimeUnit class
    rp.http.timeout.read.value Integer Default: 10 seconds
    Data read timeout for new HTTP connections.
    rp.http.timeout.read.unit Enum Default: MILLISECONDS
    Timeout value time unit. Should be one of values from java.util.concurrent.TimeUnit class
    rp.http.timeout.write.value Integer Default: 10 seconds
    Data write timeout for new HTTP connections.
    rp.http.timeout.write.unit Enum Default: MILLISECONDS
    Timeout value time unit. Should be one of values from java.util.concurrent.TimeUnit class

    Truncation parameters

    Property name Type Description
    rp.truncation.field Boolean Default: true
    Enable / disable certain field truncation to avoid API failures.
    rp.truncation.replacement String Default: ...
    Replacement pattern for truncated fields
    rp.truncation.item.name.limit Integer Default: 1024
    Maximum item names length before truncation.
    rp.truncation.attribute.limit Integer Default: 128
    Maximum attribute key and value limit (counts separately)

    Proxy configuration

    ReportPortal supports 2 options for setting Proxy configuration:

    • JVM arguments (-Dhttps.proxyHost=localhost)
    • reportportal.properties file

    JVM arguments

    ReportPortal uses OkHttp as HTTP client, which can pick up JVM proxy settings. This is the most flexible and preferable way to configure proxies, since it supports different proxy types. You can find out more about JVM proxies on Java networking and proxies page.

    Properties file

    If you need to set up just a simple HTTP proxy you can use reportportal.properties file. rp.http.proxy parameter accepts HTTP proxy URL. This parameter can override JVM proxy arguments, so watch your back.

    client-java's People

    Contributors

    aliakseishushkevichtr avatar avarabyeu avatar dagansandler avatar dmalenkov avatar dzmitryhumianiuk avatar edbarvinsky avatar groov1kk avatar hardnorth avatar ihar-kahadouski avatar maartenjanvangool avatar matt-richardson avatar pavelsakharchuk avatar pbortnik avatar pnatashap avatar raikbitters avatar yumfriez avatar

    Stargazers

     avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

    Watchers

     avatar  avatar  avatar  avatar  avatar  avatar  avatar

    client-java's Issues

    [Improve] Add more sources to Step annotaion

    Will be nice to add next feature:

    @Step("Some step {param}")
    void m(String param);

    Where now param it just method param, but cool have field or method invokation param.

    class Example {
       private String param;
    
       private String param1() {
          return "Example";
       }
    
       @Step("Some {param} step")
       public void m1() { }
       @Step("Some {param1} step")
       public void m2() { }
    }

    Maybe when we have equal names, need to define from what source should get value, f.e in @StepTemplateConfig

    Random error with async reporting

    After upgrade to client-java 5.1.22 reports are not sent to Report Portal randomly.
    Context:

    • I did´t have rp.reporting.async specified in my projects so async mode was not active
    • I upgraded to client-java 5.1.22 and started to miss launches (50% of the launches more or less)
    • If I set rp.reporting.async = false it works properly again

    Steps to Reproduce
    Steps to reproduce the behavior:

    1. Use client-java 5.1.22 and commons-model 5.8.1
    2. Set rp.reporting.async = true
    3. Arround 50% of the launches are missed

    Expected behavior
    All launches are logged in Report Portal.

    Actual behavior
    Half of the launches are logger in Report Portal

    Dependency versions

    • client-java 5.1.22
    • commons-model 5.8.1

    Additional context
    No errors are displayed in the logs. Seems like some kind of Listener is failing randomly.

    Logs from Listener attached to Test level instead of Test Method level (@Test) in case of fail in Step

    Pre-conditions:

    1. TestWithStep where Step has failure
    2. TestWithoutStep where Test itself has failure
    3. Listener should add logs in case of fail.

    Scenario:

    1. Run both tests.

    Expected behavior: Both tests has listener logs on Test Method level.
    Actual behavior: TestWithoutStep has logs on Test Method level. But TestWithStep doesn't have logs on Test Method level, instead they appears on Test level.

    Project for reproduction: https://github.com/maxski/rp-fail-in-step

    [BUG] java.lang.NoSuchFieldError caused by copying of guava library

    Faced with a problem in our project, that thru the test execution process get an Error:

    Caused by: java.lang.NoSuchFieldError: EXACT
    	at com.google.common.net.InternetDomainName.findSuffixOfType(InternetDomainName.java:170) ~[guava-27.1-jre.jar:?]
    	at com.google.common.net.InternetDomainName.<init>(InternetDomainName.java:151) ~[guava-27.1-jre.jar:?]
    	at com.google.common.net.InternetDomainName.from(InternetDomainName.java:210) ~[guava-27.1-jre.jar:?]
    ..........
    	... 15 more

    In the end of researching found, that it is caused due to wrong classpath of copying of guava modules.

    InternalReportPortalClientException: Wait for Launch start timed out

    Hi I am using the Java Client directly in my Java code and sometimes when starting the launch I get the following error:

    Caused by: com.epam.reportportal.exception.InternalReportPortalClientException: Wait for Launch start timed out
            at com.epam.reportportal.utils.Waiter.till(Waiter.java:131)
            at com.epam.reportportal.service.launch.SecondaryLaunch.waitForLaunchStart(SecondaryLaunch.java:56)
            at com.epam.reportportal.service.launch.SecondaryLaunch.start(SecondaryLaunch.java:88)
    

    I am unable to troubleshoot much further, is there additional context or common scenarios/configuration that could cause this I may be missing?

    Sample code of how I use the client.

    reportPortalClient =  ReportPortal.builder()
              .withParameters(reportPortalConfig)
              .build()
              
    launch = reportPortal.newLaunch(createNewLaunchRequest())
    
    launch.start(); // this is where my error occurs

    Some additional context. Inside the same container/virtual machine I have a single Java process that creates a new thread for each new launch we want to create. My service (Java) is creating launches for different projects, so I end up creating a new thread and a new instance of ReportPortal.class on the same machine for every launch. I am not sure how else to support creating launches in different projects.

    This is with version 5.0.11 of the client-java.

    Getting error "Cannot instantiate class com.epam.reportportal.testng.ReportPortalTestNGListener"

    While running the test in Azure Devops Pipeline, I am getting the below error
    "Cannot instantiate class com.epam.reportportal.testng.ReportPortalTestNGListener"
    org.apache.maven.surefire.booter.SurefireBooterForkException: There was an error in the forked process

    I have mentioned the listener in my POM.xml file only.
    Please help.

    Dependencies :

            <dependency>
                <groupId>com.epam.reportportal</groupId>
                <artifactId>agent-java-testng</artifactId>
                <version>5.1.1</version>
            </dependency>
            <dependency>
                <groupId>com.epam.reportportal</groupId>
                <artifactId>logger-java-log4j</artifactId>
                <version>5.1.4</version>
            </dependency>
    

    [Improve] Add for @TestCaseID abilities to add TMS link

    Issue recreated due to no answer in last issue

    Is your feature request related to a problem? Please describe.
    I would like to be able to link from the reportportal to a test case in the TMS

    Describe the solution you'd like
    Provide markdown for @testcaseid or better way make some customizer where I can say, that for all $test_case_id replace as https://tms.com/test_case_id. In RP it should looks like link with test_case_id

    I don't really understand how I can link to a test case in TMS via a link issue. API doesn't allow to attach TMS link to PASSED, and API as a whole looks weird, it's obviously made for BTS and not for TMS:

    image

    I thought it was possible by reading this documentation: https://reportportal.io/docs/work-with-reports/TestCaseId/#what-is-it-test-case-id.

    But no, you can't attach a link to the TMS through this mechanism. So I created a request for this function. If you know another way, please suggest it.

    P.S Report Portal is better than allure in everything, but this particular feature from allure is still missing.

    Separate report portal properties file according to the environment(Stg,QA,DEV)

    Is there any way we can configure our code to use reportportal.properties file according to our environment? Means we pass environment value from pom.xml whether staging or QA but we have only single reportportal.properties file being used. Can we use two separate properties files? Is any documentation available for this?

    Intermittently some Tests/Suites launches are not getting pushed to RP

    I observed that some of the tests/suite launches are not getting posted to RP and when I checked the logs related to missing test/suite I can see the error logs related RP as below

    This issue occurs intermittently and even after re-running the particular tests also not updated to existing launch.

    Report Portal Logs:

    [rp-io-8] DEBUG- io.reactivex.exceptions.UndeliverableException: The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the exception has nowhere to go to begin with. Further reading: https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling | javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake
       [testng] 04:00:07.319 [rp-io-8] DEBUG- 	at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:367)
       [testng] 04:00:07.319 [rp-io-8] DEBUG- 	at io.reactivex.internal.operators.maybe.MaybeCreate$Emitter.onError(MaybeCreate.java:87)
       [testng] [rp-io-3] ERROR com.epam.reportportal.service.Launch - [18] ReportPortal execution error
       [testng] javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake
       [testng] 	at sun.security.ssl.SSLSocketImpl.handleEOF(Unknown Source)
       [testng] 	at sun.security.ssl.SSLSocketImpl.decode(Unknown Source)
       [testng] 	at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(Unknown Source)
       [testng] 	at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
       [testng] 	at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
       [testng] 	at rp.org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:404)
       [testng] 	at rp.org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:364)
       [testng] 	at rp.org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
       [testng] 	at rp.org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374)
       [testng] 	at rp.org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
       [testng] 	at rp.org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
       [testng] 	at rp.org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
       [testng] 	at rp.org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
       [testng] 	at rp.org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
       [testng] 	at rp.org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
       [testng] 	at rp.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
       [testng] 	at rp.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
       [testng] 	at rp.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
       [testng] 	at com.epam.reportportal.restendpoint.http.HttpClientRestEndpoint$1.subscribe(HttpClientRestEndpoint.java:502)
       [testng] 	at io.reactivex.internal.operators.maybe.MaybeCreate.subscribeActual(MaybeCreate.java:45)
       [testng] 	at io.reactivex.Maybe.subscribe(Maybe.java:4290)
       [testng] 	at io.reactivex.internal.operators.maybe.MaybeSubscribeOn$SubscribeTask.run(MaybeSubscribeOn.java:54)
       [testng] 	at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38)
       [testng] 	at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26)
       [testng] 	at java.util.concurrent.FutureTask.run(Unknown Source)
       [testng] 	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
       [testng] 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
       [testng] 	at java.lang.Thread.run(Unknown Source)
       [testng] Caused by: java.io.EOFException: SSL peer shut down incorrectly
       [testng] 	at sun.security.ssl.SSLSocketInputRecord.read(Unknown Source)
       [testng] 	at sun.security.ssl.SSLSocketInputRecord.readHeader(Unknown Source)
       [testng] 	at sun.security.ssl.SSLSocketInputRecord.decode(Unknown Source)
       [testng] 	at sun.security.ssl.SSLTransport.decode(Unknown Source)
       [testng] 	... 27 more
       [testng] 
       [testng] 
       [testng] [rp-io-3] ERROR com.epam.reportportal.utils.SubscriptionUtils - Logging context completed with error 
       [testng] javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake
       [testng] 	at sun.security.ssl.SSLSocketImpl.handleEOF(Unknown Source)
       [testng] 	at sun.security.ssl.SSLSocketImpl.decode(Unknown Source)
       [testng] 	at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(Unknown Source)
       [testng] 	at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
       [testng] 	at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
       [testng] 	at rp.org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:404)
       [testng] 	at rp.org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:364)
       [testng] 	at rp.org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
       [testng] 	at rp.org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374)
       [testng] 	at rp.org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
       [testng] 	at rp.org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
       [testng] 	at rp.org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
       [testng] 	at rp.org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
       [testng] 	at rp.org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
       [testng] 	at rp.org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
       [testng] 	at rp.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
       [testng] 	at rp.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
       [testng] 	at rp.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
       [testng] 	at com.epam.reportportal.restendpoint.http.HttpClientRestEndpoint$1.subscribe(HttpClientRestEndpoint.java:502)
       [testng] 	at io.reactivex.internal.operators.maybe.MaybeCreate.subscribeActual(MaybeCreate.java:45)
       [testng] 	at io.reactivex.Maybe.subscribe(Maybe.java:4290)
       [testng] 	at io.reactivex.internal.operators.maybe.MaybeSubscribeOn$SubscribeTask.run(MaybeSubscribeOn.java:54)
       [testng] 	at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38)
       [testng] 	at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26)
       [testng] 	at java.util.concurrent.FutureTask.run(Unknown Source)
       [testng] 	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
       [testng] 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
       [testng] 	at java.lang.Thread.run(Unknown Source)
       [testng] Caused by: java.io.EOFException: SSL peer shut down incorrectly
       [testng] 	at sun.security.ssl.SSLSocketInputRecord.read(Unknown Source)
       [testng] 	at sun.security.ssl.SSLSocketInputRecord.readHeader(Unknown Source)
       [testng] 	at sun.security.ssl.SSLSocketInputRecord.decode(Unknown Source)
       [testng] 	at sun.security.ssl.SSLTransport.decode(Unknown Source)
       [testng] 	... 27 more
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at com.epam.reportportal.restendpoint.http.HttpClientRestEndpoint$1.subscribe(HttpClientRestEndpoint.java:547)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at io.reactivex.internal.operators.maybe.MaybeCreate.subscribeActual(MaybeCreate.java:45)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at io.reactivex.Maybe.subscribe(Maybe.java:4290)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at io.reactivex.internal.operators.maybe.MaybeSubscribeOn$SubscribeTask.run(MaybeSubscribeOn.java:54)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at java.util.concurrent.FutureTask.run(Unknown Source)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at java.lang.Thread.run(Unknown Source)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- Caused by: javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketImpl.handleEOF(Unknown Source)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketImpl.decode(Unknown Source)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(Unknown Source)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at rp.org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:404)
       [testng] 04:00:07.412 [rp-io-8] DEBUG- 	at rp.org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:364)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at com.epam.reportportal.restendpoint.http.HttpClientRestEndpoint$1.subscribe(HttpClientRestEndpoint.java:502)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	... 9 more
       [testng] 04:00:07.428 [rp-io-8] DEBUG- Caused by: java.io.EOFException: SSL peer shut down incorrectly
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketInputRecord.read(Unknown Source)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketInputRecord.readHeader(Unknown Source)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketInputRecord.decode(Unknown Source)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLTransport.decode(Unknown Source)
       [testng] 04:00:07.428 [rp-io-8] DEBUG- 	... 27 more
       [testng] 04:00:07.428 [rp-io-8] DEBUG- Exception in thread "rp-io-8" 
       [testng] 04:00:07.428 [rp-io-8] DEBUG- io.reactivex.exceptions.UndeliverableException: The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the exception has nowhere to go to begin with. Further reading: https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling | javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:367)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at io.reactivex.internal.operators.maybe.MaybeCreate$Emitter.onError(MaybeCreate.java:87)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at com.epam.reportportal.restendpoint.http.HttpClientRestEndpoint$1.subscribe(HttpClientRestEndpoint.java:547)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at io.reactivex.internal.operators.maybe.MaybeCreate.subscribeActual(MaybeCreate.java:45)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at io.reactivex.Maybe.subscribe(Maybe.java:4290)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at io.reactivex.internal.operators.maybe.MaybeSubscribeOn$SubscribeTask.run(MaybeSubscribeOn.java:54)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at java.util.concurrent.FutureTask.run(Unknown Source)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at java.lang.Thread.run(Unknown Source)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- Caused by: javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketImpl.handleEOF(Unknown Source)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketImpl.decode(Unknown Source)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(Unknown Source)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at rp.org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:404)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at rp.org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:364)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at rp.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at com.epam.reportportal.restendpoint.http.HttpClientRestEndpoint$1.subscribe(HttpClientRestEndpoint.java:502)
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	... 9 more
       [testng] 04:00:07.522 [rp-io-8] DEBUG- Caused by: java.io.EOFException: SSL peer shut down incorrectly
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketInputRecord.read(Unknown Source)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketInputRecord.readHeader(Unknown Source)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLSocketInputRecord.decode(Unknown Source)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	at sun.security.ssl.SSLTransport.decode(Unknown Source)
       [testng] 04:00:07.522 [rp-io-8] DEBUG- 	... 27 more
    

    Add possibility to use custom launch ID in client.

    Custom launch ID could be used with following scenarios:

    1. Several regression suites are launched in different time. All of them reports to the same single launch on Report Portal.
    2. Performance testing - parallel regression suites run from several computers that report to the same single Report Portal launch.
      Pull requests with code example:
      agent-java-cucumber
      client-java

    Remove Guava dependency

    Guava is one of the biggest Client dependencies and it looks like we use just one its class: ByteSource. Due to the fact that the dependency is an universal tool for everything we often get dependency issues and security vulnerabilities. We need to remove it by that reason.

    Header name Case issue

    Hi,
    I am having issues caused by this line.

    Collection<String> contentTypes = rs.getHeaders().get(HttpHeaders.CONTENT_TYPE);

    For some reason the server sets the header to "content-type", this is not an issue, since the RFC states field names are case-insensitive: https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2
    The code tries to get the value from the map, but nothing is returned, this causes an error in the execution:
    [ERROR] [93] ReportPortal execution error
    com.epam.reportportal.exception.ReportPortalException: Report Portal returned error
    Status code: 201
    Status message: Created
    Error Message:
    Error Type: null

    The Launch is created, but no other request is sent (would make sense, if there was an actual error).

    I think the solution might be using CaseInsensitiveMap.
    Is there a workaround?

    java.lang.NoSuchMethodError: com.epam.reportportal.utils.TestCaseIdUtils.getTestCaseId

    agent-java-testng: - 5.0.7
    testng: - 7.0.1

    The agent works up to Before Method, and after that on test start that it fails with the following message: -

    FAILED: loginWithValidCredentials
    java.lang.NoSuchMethodError: com.epam.reportportal.utils.TestCaseIdUtils.getTestCaseId(Lcom/epam/reportportal/annotations/TestCaseId;Ljava/lang/reflect/Method;Ljava/util/List;)Lcom/epam/reportportal/service/item/TestCaseIdEntry;
    at com.epam.reportportal.testng.TestNGService.lambda$getTestCaseId$21(TestNGService.java:795)
    at java.util.Optional.map(Optional.java:215)
    at com.epam.reportportal.testng.TestNGService.getTestCaseId(TestNGService.java:795)
    at com.epam.reportportal.testng.TestNGService.buildStartStepRq(TestNGService.java:327)
    at com.epam.reportportal.testng.TestNGService.startTestMethod(TestNGService.java:356)
    at com.epam.reportportal.testng.BaseTestNGListener.onTestStart(BaseTestNGListener.java:82)
    at org.testng.internal.TestListenerHelper.runTestListeners(TestListenerHelper.java:73)
    at org.testng.internal.TestInvoker.runTestResultListener(TestInvoker.java:219)
    at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:570)
    at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
    at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
    at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:816)
    at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    ===============================================
    BVT
    Tests run: 1, Failures: 1, Skips: 0
    ===============================================

    Could you please advice what is wrong here ?

    messages not logged in report portal for multi thread

    Whenever messages are are logged from different thread , its not logged in report portal

     @Test
        public void test(){
    
            //message logged properly
            LOGGER.info("test start");
    
            //not logged in reportportal
            Runnable test = () -> {
                LOGGER.info("incoming message");
            };
    
            new Thread(test).start();
    
            LOGGER.info("test done");
        }
    

    Not too sure if the issues is due internally it uses ThreadLocal
    https://github.com/reportportal/client-java/blob/develop/src/main/java/com/epam/reportportal/service/LoggingContext.java#L55

    No test logs if TestNG Test has timeout parameter

    I faced with no logs in RP when I specify timeout parameter in TestNG Test annotation. All events that are relayed to start/stop/methods reflected fine in RP, but no logging from TestNG test that I send through RP appender.
    Here is example of @Test annotation
    @Test(description = "test", dataProvider = "DataProvider", alwaysRun = true, timeout = 60)

    in DEBUG MODE
    event.getmessage() has correct message, but
    in com.epam.reportportal.service.ReportPortal.emitLog next variable is null

    LoggingContext loggingContext = LoggingContext.CONTEXT_THREAD_LOCAL.get();
    loggingContext = null
    

    after removing timeout parameter all work well

    [BUG] ReportPortalClientModule incorrect check for a null value

    client-java-3.0.7

    Incorrect instantiation of the CloseableHttpAsyncClient with a non-self-signed certificate.
    PropertiesLoader injected with a Properties object, in which the values are converted to a string (String.valueOf())

    image

    image

    Caused by: com.epam.reportportal.exception.InternalReportPortalClientException: Unable to load trust store
    	at com.epam.reportportal.guice.ReportPortalClientModule.provideHttpClient(ReportPortalClientModule.java:153)
    	at com.epam.reportportal.guice.ReportPortalClientModule$$FastClassByGuice$$20c74f8c.invoke(<generated>)
    	at rp.com.google.inject.internal.ProviderMethod$FastClassProviderMethod.doProvision(ProviderMethod.java:264)
    	at rp.com.google.inject.internal.ProviderMethod$Factory.provision(ProviderMethod.java:401)
    	at rp.com.google.inject.internal.ProviderMethod$Factory.get(ProviderMethod.java:376)
    	at rp.com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
    	at rp.com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
    	at rp.com.google.inject.internal.ProviderMethod$Factory.provision(ProviderMethod.java:402)
    	at rp.com.google.inject.internal.ProviderMethod$Factory.get(ProviderMethod.java:376)
    	at rp.com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
    	at rp.com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
    	at rp.com.google.inject.internal.ProviderMethod$Factory.provision(ProviderMethod.java:402)
    	at rp.com.google.inject.internal.ProviderMethod$Factory.get(ProviderMethod.java:376)
    	at rp.com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
    	at rp.com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
    	at rp.com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    	at rp.com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:194)
    	at rp.com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
    	at rp.com.google.inject.internal.SingleFieldInjector.inject(SingleFieldInjector.java:54)
    	at rp.com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:132)
    	at rp.com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:120)
    	at rp.com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:90)
    	at rp.com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:268)
    	at rp.com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:61)
    	at rp.com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
    	at rp.com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
    	at rp.com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    	at rp.com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:194)
    	at rp.com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
    	at rp.com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:1019)
    	at rp.com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1085)
    	at rp.com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1015)
    	... 10 more
    

    Many launches when ReuseFork is set on false

    1. Problem description:
      When we run test with maven-surefire-plugin with flag reuseForks set on FALSE than we have many launches. From my analysis I know that first thread is creating PrimaryLaunch object and second thread is creating SecondaryLaunch. Problem occurs when test from PrimaryLaunch finish, than fork is killed by maven surefire and lock file is removed. Because of that next test is starting new lock and new PrimaryLaunch.
    2. tech spec
      java 1.8
      <groovy.version>2.4.15</groovy.version>
      <spock.version>1.2-groovy-2.4</spock.version>
      Maven surefire plugin
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M6</version>
            <configuration>
              <trimStackTrace>false</trimStackTrace>
              <forkCount>2</forkCount>
              <reuseForks>false</reuseForks>
            </configuration>
          </plugin>
    

    ReportPortal dependencies:

         <groupId>com.epam.reportportal</groupId>
         <artifactId>agent-java-spock</artifactId>
         <version>5.1.0-RC-5</version>
         <exclusions>
           <exclusion>
             <groupId>com.epam.reportportal</groupId>
             <artifactId>client-java</artifactId>
           </exclusion>
         </exclusions>
       </dependency>
       <dependency>
         <groupId>com.epam.reportportal</groupId>
         <artifactId>client-java</artifactId>
         <version>5.1.10</version>
       </dependency>
    
    1. tested solutions
      3.1)I tried to create launch manually put uuid of it into lock file but without success, I got timeouts and my lock file was override.
      That solution stuck here:
    		Objects.requireNonNull(instanceUuid);
    		if (mainLock != null) {
    			if (!instanceUuid.equals(lockUuid)) {
    				writeInstanceUuid(instanceUuid);
    			}
    			return lockUuid;
    		}
    		Pair<RandomAccessFile, FileLock> syncLock = obtainLock(syncFile);
    		if (syncLock != null) {
    			try {
    				if (mainLock == null) {
    					Pair<RandomAccessFile, FileLock> lock = obtainLock(lockFile);
    					if (lock != null) {
    						// we are the main thread / process
    						lockUuid = instanceUuid;
    						mainLock = lock;
    						writeLaunchUuid(syncLock);
    						return instanceUuid;
    					} else {
    						executeOperation(new LaunchRead(instanceUuid), syncLock);
    					}
    				} else {
    					// another thread obtained main lock while we wait for .sync file
    					executeOperation(new UuidAppend(instanceUuid), syncLock);
    					return lockUuid;
    				}
    			} finally {
    				closeIo(syncLock);
    			}
    			// main lock file already locked, just close sync lock and proceed with secondary launch logic
    		}
    		return obtainLaunch(instanceUuid);```
    3.2) change rp.client.join.lock.timeout.value but it is not resistant for killing fork by plugin
    
    Could You look at this case ? 
    

    Support single test with multi-thread logging

    Hi,
    I found out that because we use vert.x in our tests and most of the requests are async and those requests response are processed by a separated thread the logs printed outside the main test Thread are not sent to ReportPortal.

    Because we are not executing the tests in parallel my easy solution has been to remove the ThreadLocal.withInitial from the LoggingContext and therefore always send logs to the current test or the last started test.

    b1zzu@d3b173f

    This has some drawbacks like a thread started from previous tests that haven't been closed correctly will send logs to the current test, but overall is a better solution for us than not sending the logs at all.

    Would then be possible to add this solution or an alternative solution as a configurable alternative?

    Mechanism to bulk upload results at the end of the test case

    Is your feature request related to a problem? Please describe.
    We have many jobs running in parallel which continuously report the tests to our ReportPortal instance. This causes the server to get overloaded due to too many concurrent requests.

    Describe the solution you'd like
    We would like to understand if there is any way we can make a call to post the test results once after the test case has been run (kind of a bulk upload). In this way, we can reduce the number of requests to the server.

    Describe alternatives you've considered
    We are aware of the feature where we can upload xml/zip files containing our test results, but is there any way we can do it directly using the API client?

    Version of RP: 5.7.3 (Hosted on EKS cluster)
    Agent: agent-java-cucumber6 v5.1.3

    StepReporter class should be Closable and has a lambda-method

    Current implementation of StepReporter is way too far from ideal. There is no option to report multi-level steps and it's necessary to finish steps manually each time (inside every agent).

    To improve this it is necessary to have a Closable interface implementation, for example:

    try(StepReporter.sendStep("Step name")) {
      doSomething();
      doSomethingElse();
    }

    Another option is to use lambdas:

    StepReporter.sendStep("Step name", () -> {
      doSomething();
      StepReporter.sendStep("Inner step name", () -> {
        doSomethingElse();
      });
    });

    java.lang.NoClassDefFoundError: com/epam/reportportal/service/LockFile$5 when running as junit standalone

    Issue when running test using junit-platform-console-standalone.jar

    Exception in thread "Thread-1" java.lang.NoClassDefFoundError: com/epam/reportportal/service/LockFile$5
            at com.epam.reportportal.service.LockFile.finishInstanceUuid(LockFile.java:275)
            at com.epam.reportportal.service.ReportPortal$PrimaryLaunch.finish(ReportPortal.java:539)
            at com.epam.reportportal.junit5.ReportPortalExtension.lambda$getShutdownHook$19(ReportPortalExtension.java:415)
            at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.ClassNotFoundException: com.epam.reportportal.service.LockFile$5
            at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
            at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:814)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
            ... 4 more
    

    The above not appearing if we run as part of mvn install

    After further investigation seems this issue triggered by the shutdown hook in ReportPortalExtension

    private static Thread getShutdownHook(Launch launch) {
        return new Thread(() -> {
            FinishExecutionRQ rq = new FinishExecutionRQ();
            rq.setEndTime(Calendar.getInstance().getTime());
            launch.finish(rq);
        });
    }
    
    

    Steps to reproduce the behavior:

    1. package the whole project as a fat jar
    2. run java -jar junit-platform-console-standalone.jar -cp $CLASSPATH --scan-classpath

    Version of Client-Java

     <dependency>
                <groupId>com.epam.reportportal</groupId>
                <artifactId>client-java</artifactId>
                <version>5.0.0-BETA-9</version>
            </dependency>
    
    <dependency>
                <groupId>com.epam.reportportal</groupId>
                <artifactId>agent-java-junit5</artifactId>
                <version>5.0.0-BETA-9</version>
            </dependency>
    
    

    Null check in @Step annotation

    If we use @step annotation without parameters injection, than StepAspect checking method parameter on null value.

    Example:

    @Step("Some example")
    void m1(String param) { }

    m1(null) -> java.lang.NullPointerException: null value in entry

    @Step("Some {param} example")
    void m2(String param) { }

    m2(null) -> java.lang.NullPointerException: null value in entry

    In second case it's ok, but for first case it's bad.

    My stack trace:

    java.lang.NullPointerException: null value in entry: integrableComponentType=null
        at rp.com.google.common.collect.CollectPreconditions.checkEntryNotNull(CollectPreconditions.java:32)
        at rp.com.google.common.collect.ImmutableMap.entryOf(ImmutableMap.java:176)
        at rp.com.google.common.collect.ImmutableMap$Builder.put(ImmutableMap.java:285)
        at com.epam.reportportal.aspect.StepNameUtils.createParamsMapping(StepNameUtils.java:70)
        at com.epam.reportportal.aspect.StepNameUtils.getStepName(StepNameUtils.java:52)
        at com.epam.reportportal.aspect.StepRequestUtils.buildStartStepRequest(StepRequestUtils.java:45)
        at com.epam.reportportal.aspect.StepAspect.startNestedStep(StepAspect.java:83)
        at como.ui.model.components.hub2.ModalComponent.cancel(ModalComponent.java:27)
        at como.ui.model.components.hub2.ModalComponent.cancel_aroundBody4(ModalComponent.java:33)
        at como.ui.model.components.hub2.ModalComponent.cancel_aroundBody5$advice(ModalComponent.java:18)
        at como.ui.model.components.hub2.ModalComponent.cancel(ModalComponent.java:1)
        at como.ui.hub2.MemberProfileTests.shouldSearchMemberByFirstAndLastNames(MemberProfileTests.java:111)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:134)
        at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:597)
        at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
        at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
        at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:816)
        at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
        at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
        at java.util.ArrayList.forEach(ArrayList.java:1257)
        at org.testng.TestRunner.privateRun(TestRunner.java:766)
        at org.testng.TestRunner.run(TestRunner.java:587)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
        at org.testng.SuiteRunner.run(SuiteRunner.java:286)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1187)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1109)
        at org.testng.TestNG.runSuites(TestNG.java:1039)
        at org.testng.TestNG.run(TestNG.java:1007)
        at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
        at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:110)

    ReportPortal fails in "open/enabled" state when properties file does NOT exist

    Although the issue being reported here is specific to the behavior within the JUnit Agent, I believe that the issue is specifically related to the PropertiesLoader.java class as a part of the client-java project.

    We have 300+ java projects, of which, we do not want to maintain reportportal properties within every project and force developers to constantly update the UUID values locally. Maintenance overhead on every project is the major concern and the primary reason for this issue and enhancement request finding.

    By default, we would like the report portal reporting features to be disabled (yes, this can easily be accomplished with the use of the rp.enabled=false property), however, we do not want to have every build that a developer executes on their local machine to be logged either. Therefore, we are enabling the feature within Jenkins only, writing the reportportal.properties file to the correct location with the appropriate derived values contained within. The Jenkins process works as expected. Right now, we have conditions of failing builds if the properties file is missing.

    The properties loader class will NOT read JVM parameters or ENV vars UNLESS the properties file is read first AND the property existed within the properties file. The desired behavior is to allow the build to continue without failing due to misconfiguration or intentional removal of the properties file.

    The desired behavior is to have reportportal disabled by default (meaning that the rp.enabled=false) and if the properties file is not present then the process should be skipped / ignored entirely.

    Developer local gradle builds fail when the properties file does not exist or does not have appropriate values with:

    `> Task :test
    log4j:WARN No appenders could be found for logger (com.epam.reportportal.service.ReportPortal).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    Exception in thread "main" java.util.ServiceConfigurationError: com.nordstrom.automation.junit.ShutdownListener: Provider com.epam.reportportal.junit.ReportPortalListener could not be instantiated
            at java.util.ServiceLoader.fail(ServiceLoader.java:232)
            at java.util.ServiceLoader.access$100(ServiceLoader.java:185)
            at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
            at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
            at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
            at com.nordstrom.automation.junit.LifecycleHooks.<clinit>(LifecycleHooks.java:45)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
            at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
    Caused by: java.lang.ExceptionInInitializerError
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
            at java.lang.Class.newInstance(Class.java:442)
            at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
            ... 9 more
    Caused by: com.google.inject.CreationException: Unable to create injector, see the following errors:
    
    1) Error in custom provider, java.lang.NullPointerException
      while locating com.epam.reportportal.junit.JUnitProvider
      at com.epam.reportportal.junit.JUnitListenersModule.configure(JUnitListenersModule.java:31)
      while locating com.epam.reportportal.junit.IListenerHandler
    Caused by: java.lang.NullPointerException
            at com.epam.reportportal.junit.JUnitProvider.get(JUnitProvider.java:44)
            at com.epam.reportportal.junit.JUnitProvider.get(JUnitProvider.java:30)
    FATAL ERROR in native method: processing of -javaagent failed
            at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:81)
            at com.google.inject.internal.BoundProviderFactory.provision(BoundProviderFactory.java:72)
            at com.google.inject.internal.ProviderInternalFactory.circularGet(ProviderInternalFactory.java:61)
            at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:62)
            at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
            at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
            at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
            at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:194)
            at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
            at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:205)
            at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:199)
            at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1085)
            at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:199)
            at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:180)
            at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
            at com.google.inject.Guice.createInjector(Guice.java:99)
            at com.google.inject.Guice.createInjector(Guice.java:73)
            at com.google.inject.Guice.createInjector(Guice.java:62)
            at com.epam.reportportal.junit.JUnitInjectorProvider$1.get(JUnitInjectorProvider.java:36)
            at com.epam.reportportal.junit.JUnitInjectorProvider$1.get(JUnitInjectorProvider.java:33)
            at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:167)
            at com.epam.reportportal.junit.JUnitInjectorProvider.getInstance(JUnitInjectorProvider.java:41)
            at com.epam.reportportal.junit.ReportPortalListener.<clinit>(ReportPortalListener.java:45)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
            at java.lang.Class.newInstance(Class.java:442)
            at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
            at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
            at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
            at com.nordstrom.automation.junit.LifecycleHooks.<clinit>(LifecycleHooks.java:45)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
            at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
    
    1. Error injecting method, com.epam.reportportal.exception.InternalReportPortalClientException:
    Cannot build ReportPortal client
      at com.epam.reportportal.junit.JUnitProvider.setReportPortalService(JUnitProvider.java:39)
      while locating com.epam.reportportal.junit.JUnitProvider
      at com.epam.reportportal.junit.JUnitListenersModule.configure(JUnitListenersModule.java:31)
      while locating com.epam.reportportal.junit.IListenerHandler
    Caused by: com.epam.reportportal.exception.InternalReportPortalClientException: Cannot build ReportPortal client
            at com.epam.reportportal.service.ReportPortal$Builder.build(ReportPortal.java:250)
            at com.epam.reportportal.junit.JUnitProvider.setReportPortalService(JUnitProvider.java:39)
            at com.epam.reportportal.junit.JUnitProvider$$FastClassByGuice$$c0d4f1fb.invoke(<generated>)
            at com.google.inject.internal.SingleMethodInjector$1.invoke(SingleMethodInjector.java:54)
            at com.google.inject.internal.SingleMethodInjector.inject(SingleMethodInjector.java:89)
            at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:132)
            at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:120)
            at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:90)
            at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:268)
            at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:61)
            at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
            at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
            at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
            at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:194)
            at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
            at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:205)
            at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:199)
            at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1085)
            at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:199)
            at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:180)
            at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
            at com.google.inject.Guice.createInjector(Guice.java:99)
            at com.google.inject.Guice.createInjector(Guice.java:73)
            at com.google.inject.Guice.createInjector(Guice.java:62)
            at com.epam.reportportal.junit.JUnitInjectorProvider$1.get(JUnitInjectorProvider.java:36)
            at com.epam.reportportal.junit.JUnitInjectorProvider$1.get(JUnitInjectorProvider.java:33)
            at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:167)
            at com.epam.reportportal.junit.JUnitInjectorProvider.getInstance(JUnitInjectorProvider.java:41)
            at com.epam.reportportal.junit.ReportPortalListener.<clinit>(ReportPortalListener.java:45)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
            at java.lang.Class.newInstance(Class.java:442)
            at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
            at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
            at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
            at com.nordstrom.automation.junit.LifecycleHooks.<clinit>(LifecycleHooks.java:45)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
            at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
    Caused by: com.epam.reportportal.exception.InternalReportPortalClientException: Cannot build ReportPortal client
            at com.epam.reportportal.service.ReportPortal$Builder.buildClient(ReportPortal.java:266)
            at com.epam.reportportal.service.ReportPortal$Builder.build(ReportPortal.java:246)
            ... 43 more
    Caused by: java.net.MalformedURLException
            at java.net.URL.<init>(URL.java:627)
            at java.net.URL.<init>(URL.java:490)
            at java.net.URL.<init>(URL.java:439)
            at com.epam.reportportal.service.ReportPortal$Builder.defaultClient(ReportPortal.java:297)
            at com.epam.reportportal.service.ReportPortal$Builder.buildClient(ReportPortal.java:259)
            ... 44 more
    Caused by: java.lang.NullPointerException
            at java.net.URL.<init>(URL.java:532)
            ... 48 more
    
    2 errors
            at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:470)
            at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:184)
            at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
            at com.google.inject.Guice.createInjector(Guice.java:99)
            at com.google.inject.Guice.createInjector(Guice.java:73)
            at com.google.inject.Guice.createInjector(Guice.java:62)
            at com.epam.reportportal.junit.JUnitInjectorProvider$1.get(JUnitInjectorProvider.java:36)
            at com.epam.reportportal.junit.JUnitInjectorProvider$1.get(JUnitInjectorProvider.java:33)
            at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:167)
            at com.epam.reportportal.junit.JUnitInjectorProvider.getInstance(JUnitInjectorProvider.java:41)
            at com.epam.reportportal.junit.ReportPortalListener.<clinit>(ReportPortalListener.java:45)
            ... 15 more
    log4j:WARN No appenders could be found for logger (com.epam.reportportal.service.ReportPortal).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    Exception in thread "main" java.util.ServiceConfigurationError: com.nordstrom.automation.junit.ShutdownListener: Provider com.epam.reportportal.junit.ReportPortalListener could not be instantiated
            at java.util.ServiceLoader.fail(ServiceLoader.java:232)
            at java.util.ServiceLoader.access$100(ServiceLoader.java:185)
            at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
            at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
            at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
            at com.nordstrom.automation.junit.LifecycleHooks.<clinit>(LifecycleHooks.java:45)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
            at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
    Caused by: java.lang.ExceptionInInitializerError
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
            at java.lang.Class.newInstance(Class.java:442)
            at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
            ... 9 more
    Caused by: com.google.inject.CreationException: Unable to create injector, see the following errors:
    
    1) Error in custom provider, java.lang.NullPointerException
      while locating com.epam.reportportal.junit.JUnitProvider
      at com.epam.reportportal.junit.JUnitListenersModule.configure(JUnitListenersModule.java:31)
      while locating com.epam.reportportal.junit.IListenerHandler
    Caused by: java.lang.NullPointerException
            at com.epam.reportportal.junit.JUnitProvider.get(JUnitProvider.java:44)
            at com.epam.reportportal.junit.JUnitProvider.get(JUnitProvider.java:30)
            at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:81)
    FATAL ERROR in native method: processing of -javaagent failed
            at com.google.inject.internal.BoundProviderFactory.provision(BoundProviderFactory.java:72)
            at com.google.inject.internal.ProviderInternalFactory.circularGet(ProviderInternalFactory.java:61)
            at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:62)
            at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
            at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
            at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
            at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:194)
            at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
            at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:205)
            at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:199)
            at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1085)
            at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:199)
            at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:180)
            at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
            at com.google.inject.Guice.createInjector(Guice.java:99)
            at com.google.inject.Guice.createInjector(Guice.java:73)
            at com.google.inject.Guice.createInjector(Guice.java:62)
            at com.epam.reportportal.junit.JUnitInjectorProvider$1.get(JUnitInjectorProvider.java:36)
            at com.epam.reportportal.junit.JUnitInjectorProvider$1.get(JUnitInjectorProvider.java:33)
            at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:167)
            at com.epam.reportportal.junit.JUnitInjectorProvider.getInstance(JUnitInjectorProvider.java:41)
            at com.epam.reportportal.junit.ReportPortalListener.<clinit>(ReportPortalListener.java:45)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
            at java.lang.Class.newInstance(Class.java:442)
            at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
            at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
            at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
            at com.nordstrom.automation.junit.LifecycleHooks.<clinit>(LifecycleHooks.java:45)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
            at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
    1. Error injecting method, com.epam.reportportal.exception.InternalReportPortalClientException:
    Cannot build ReportPortal client
      at com.epam.reportportal.junit.JUnitProvider.setReportPortalService(JUnitProvider.java:39)
      while locating com.epam.reportportal.junit.JUnitProvider
      at com.epam.reportportal.junit.JUnitListenersModule.configure(JUnitListenersModule.java:31)
      while locating com.epam.reportportal.junit.IListenerHandler
    Caused by: com.epam.reportportal.exception.InternalReportPortalClientException: Cannot build ReportPortal client
            at com.epam.reportportal.service.ReportPortal$Builder.build(ReportPortal.java:250)
            at com.epam.reportportal.junit.JUnitProvider.setReportPortalService(JUnitProvider.java:39)
            at com.epam.reportportal.junit.JUnitProvider$$FastClassByGuice$$c0d4f1fb.invoke(<generated>)
            at com.google.inject.internal.SingleMethodInjector$1.invoke(SingleMethodInjector.java:54)
            at com.google.inject.internal.SingleMethodInjector.inject(SingleMethodInjector.java:89)
            at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:132)
            at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:120)
            at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:90)
            at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:268)
            at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:61)
            at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
            at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
            at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
            at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:194)
            at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
            at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:205)
            at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:199)
            at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1085)
            at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:199)
            at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:180)
            at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
            at com.google.inject.Guice.createInjector(Guice.java:99)
            at com.google.inject.Guice.createInjector(Guice.java:73)
            at com.google.inject.Guice.createInjector(Guice.java:62)
            at com.epam.reportportal.junit.JUnitInjectorProvider$1.get(JUnitInjectorProvider.java:36)
            at com.epam.reportportal.junit.JUnitInjectorProvider$1.get(JUnitInjectorProvider.java:33)
            at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:167)
            at com.epam.reportportal.junit.JUnitInjectorProvider.getInstance(JUnitInjectorProvider.java:41)
            at com.epam.reportportal.junit.ReportPortalListener.<clinit>(ReportPortalListener.java:45)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
            at java.lang.Class.newInstance(Class.java:442)
            at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
            at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
            at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
            at com.nordstrom.automation.junit.LifecycleHooks.<clinit>(LifecycleHooks.java:45)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
            at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
    Caused by: com.epam.reportportal.exception.InternalReportPortalClientException: Cannot build ReportPortal client
            at com.epam.reportportal.service.ReportPortal$Builder.buildClient(ReportPortal.java:266)
            at com.epam.reportportal.service.ReportPortal$Builder.build(ReportPortal.java:246)
            ... 43 more
    Caused by: java.net.MalformedURLException
            at java.net.URL.<init>(URL.java:627)
            at java.net.URL.<init>(URL.java:490)
            at java.net.URL.<init>(URL.java:439)
            at com.epam.reportportal.service.ReportPortal$Builder.defaultClient(ReportPortal.java:297)
            at com.epam.reportportal.service.ReportPortal$Builder.buildClient(ReportPortal.java:259)
            ... 44 more
    Caused by: java.lang.NullPointerException
            at java.net.URL.<init>(URL.java:532)
            ... 48 more
    
    2 errors
            at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:470)
            at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:184)
            at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
            at com.google.inject.Guice.createInjector(Guice.java:99)
            at com.google.inject.Guice.createInjector(Guice.java:73)
            at com.google.inject.Guice.createInjector(Guice.java:62)
            at com.epam.reportportal.junit.JUnitInjectorProvider$1.get(JUnitInjectorProvider.java:36)
            at com.epam.reportportal.junit.JUnitInjectorProvider$1.get(JUnitInjectorProvider.java:33)
            at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:167)
            at com.epam.reportportal.junit.JUnitInjectorProvider.getInstance(JUnitInjectorProvider.java:41)
            at com.epam.reportportal.junit.ReportPortalListener.<clinit>(ReportPortalListener.java:45)
            ... 15 more
    Process 'Gradle Test Executor 3' finished with non-zero exit value 134
    org.gradle.process.internal.ExecException: Process 'Gradle Test Executor 3' finished with non-zero exit value 134
            at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:395)
            at org.gradle.process.internal.worker.DefaultWorkerProcess.onProcessStop(DefaultWorkerProcess.java:138)
            at org.gradle.process.internal.worker.DefaultWorkerProcess.access$000(DefaultWorkerProcess.java:41)
            at org.gradle.process.internal.worker.DefaultWorkerProcess$1.executionFinished(DefaultWorkerProcess.java:91)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
            at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
            at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
            at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
            at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
            at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140)
            at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
            at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
            at com.sun.proxy.$Proxy76.executionFinished(Unknown Source)
            at org.gradle.process.internal.DefaultExecHandle.setEndStateInfo(DefaultExecHandle.java:212)
            at org.gradle.process.internal.DefaultExecHandle.finished(DefaultExecHandle.java:340)
            at org.gradle.process.internal.ExecHandleRunner.completed(ExecHandleRunner.java:102)
            at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:82)
            at org.gradle.internal.operations.CurrentBuildOperationPreservingRunnable.run(CurrentBuildOperationPreservingRunnable.java:42)
            at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
            at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
            at java.lang.Thread.run(Thread.java:748)`
    

    Our current "workaround" is to produce a properties file in every project with the following required properties:

    rp.enabled=false
    rp.endpoint=http://place_holder.com:8080
    rp.project=place_holder
    rp.launch=place_holder
    rp.uuid=place_holder

    Retrieve suiteNumber to build URL

    I want to generate url to new suite after creation of it using client-java library (client-java:5.0.18, commons-model:5.3.3). I use the following template

    {base_uri}/ui/{project}/launches/all/{launchNumber}/{suiteNumber}

    launchNumber - to get it we call com.epam.reportportal.service.ReportPortalClient#getLaunchByUuid and use LaunchResource#launchId field

    Is there any way to retrieve suiteNumber?

    Refactor logging

    We need:

    1. Update how we log Item IDs, to make it possible to identify Items and their IDs. Not just log IDs, because this is not informative.
    2. Set desired logging level for RP.
    3. Batch logs by limits (max request size, max log number) only, and not by parent item ID.

    [Improve] Add the ability to call methods in the @Step annotation

    In Add more sources to Step annotaion issue a lot of work has been done, thanks to all the developers who participated in this request. But as far as I understand from the documentation and what I tried in practice, the possibility to call parameter methods has never been implemented.

    Is it possible to add the following feature:

    @Step("Asserting '{dataCheckEntry.getKey()}' year")
    private void assertYear(Map.Entry<Integer, String> dataCheckEntry) { // method entry just for example
        // Some step code
    }

    Log messages do not appear in RP for test items located directly under the launch

    When opening a test item (in my scenario tried with BEFORE_GROUPS, to be exact) at the root level of the launch, logs for that test item are not sent to RP.

    I have debugged the issue and found the root cause to be in LaunchImpl class, where the startTestItem(StartTestItemRQ rq) method doesn't call LoggingContext.init(...) like startTestItem(Maybe<String> parentId, startTestItemRQ rq) is doing in line 234

    This may be a non-conventional use case, as it is normally expected that a configuration method is nested inside some additional test item, but I believe this is a bug nonetheless, as the same does work and is possible when using the bare API and not this java client.

    @Step templating not supports `this` object reference in inner classes

    Describe the bug
    @Step annotation templating not supports this object reference in inner classes

    Steps to Reproduce
    Java Example:

    public class A {
       // Some code
    
       public abstract class B {
          private final SelenideElement switcher;
          private final String switcherName;
    
          protected B(By switcherContainer, String switcherName) {
                switcher = $(switcherContainer).$(byClassName("MuiSwitch-switchBase"));
                this.switcherName = switcherName;
          }
    
          @Step("Enabling '**this.switcherName**'")
            public B enable() {
                if (switcher.has(not(cssClass("Mui-checked")))) {
                    switcher.click(usingDefaultMethod()).shouldHave(cssClass("Mui-checked"));
                    log.debug("Clicked on '{}' switcher", switcherName);
                    log.info("'{}' was enabled", switcherName);
                }
    
                return this;
           }   
       }
    }

    Expected behavior
    In this example the expected behavior will be correct naming for step with replaced value for this.switcherName

    Actual behavior
    In ReportPortal log showing like: Enabling 'this.switcherName' without replacing

    Dependency versions
    Report-Portal client version 5.1.20. I think the same for latest versions too.

    [Improve] Add @Issue annotation

    Create logic for link Issues from java for tests like Allure but with integration JIRA plugin.

    reportportal.properties

    rp.btsUrl =https://jira.services.com/
    rp.issuesUrl = browse
    rp.btsProject = EXPL

    @test
    @issue("4211")
    public void test() { }

    Where issue value will be EXPL-4211 with issue URL https://jira.services.com/browse/EXPL-4211.

    For TestNG implementation can be added Skip Exception while test marked by @issue annotation or Issue have status OPEN, IN PROGRESS, or add logic for setup status when test will finish throwing Skip Exception.

    Not able to log messages into Report Portal is the number of logs is not a multiple of BatchLogsSize

    Describe the bug
    Hi, was trying to integrate RP and log the message for each test.
    When the BatchLogsSize is set to X, Report portal log messages only show n*X logs and reminder number of logs will not be logged.

    Steps to Reproduce
    Steps to reproduce the behavior:

    1. Update the setBatchLogsSize to 30
    2. Generate 70 dummy log messages

    Expected behavior
    For instance, for params.setBatchLogsSize(30), and total number of log messages generated in the application = 70, Report Portal shall be able to log all the 70 messages.

    Actual behavior
    For instance, for params.setBatchLogsSize(30), and total number of log messages generated in the application = 70, Report Portal will only log 60 of them.

    Dependency versions

        <dependency>
            <groupId>com.epam.reportportal</groupId>
            <artifactId>logger-java-logback</artifactId>
            <version>5.1.6</version>
        </dependency>
    
        <dependency>
            <groupId>com.epam.reportportal</groupId>
            <artifactId>client-java</artifactId>
            <version>5.1.22</version>
        </dependency>
    
        <dependency>
            <groupId>com.epam.reportportal</groupId>
            <artifactId>commons-model</artifactId>
            <version>5.8.1</version>
        </dependency>
    

    Just wondering if there is any setting what was missed or is there a way to force push the remining 10 log messages?

    Any help would be appreciated.

    Best

    Disable Google Analytics reporting by default

    Hi guys.

    With recent ReportPortal client libraries update we noticed following:

    2020-09-18 10:43:08 [pool-3-thread-1] ERROR c.e.r.s.analytics.GoogleAnalytics - Connect to www.google-analytics.com:443 [www.google-analytics.com/172.217.7.14] failed: Connection timed out: connect
    

    Looks like GoogleAnalytics reporting was silently added and activated by default? This is pretty bad move, since lots of companies are using ReportPortal are in finance sector, where such "integration" is violating company infosec policies.
    Also, when it can't reach the google servers (since the corporate proxy), it adds few seconds timeout at the end of execution, which is annoying.

    Can you please disable this integration by default or at least provide a configuration option to turn it off. Also, would be nice to see information about such features in the documentation. Thanks!

    [Improve] Add for @TestCaseID abilities to add TMS link

    Is your feature request related to a problem? Please describe.
    I would like to be able to link from the reportportal to a test case in the TMS

    Describe the solution you'd like
    Provide markdown for @testcaseid or better way make some customizer where I can say, that for all $test_case_id replace as https://tms.com/test_case_id. In RP it should looks like link with test_case_id

    java.lang.IncompatibleClassChangeError

    I am trying to use scala agent but getting the below exception

    Exception in thread "ScalaTest-dispatcher" java.lang.IncompatibleClassChangeError: Expected static method com.epam.reportportal.utils.properties.PropertiesLoader.getProperties()Ljava/util/Properties;
    at com.epam.reportportal.guice.ReportPortalClientModule.configure(ReportPortalClientModule.java:63)
    at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223)
    at com.google.inject.spi.Elements.getElements(Elements.java:101)
    at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:133)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103)
    at com.google.inject.Guice.createInjector(Guice.java:95)
    at com.google.inject.Guice.createInjector(Guice.java:72)
    at com.google.inject.Guice.createInjector(Guice.java:62)
    at com.epam.reportportal.guice.BaseInjector.(BaseInjector.java:61)
    at com.epam.reportportal.guice.Injector.(Injector.java:60)
    at com.epam.reportportal.guice.Injector.(Injector.java:34)
    at com.epam.reportportal.guice.Injector$1.get(Injector.java:44)
    at com.epam.reportportal.guice.Injector$1.get(Injector.java:40)
    at com.google.common.base.Suppliers$MemoizingSupplier.get(Suppliers.java:125)
    at com.epam.reportportal.guice.Injector.getInstance(Injector.java:53)
    at com.epam.reportportal.scalatest.RPReporter$$anon$1.get(RPReporter.scala:53)
    at com.epam.reportportal.scalatest.RPReporter$$anon$1.get(RPReporter.scala:52)
    at com.google.common.base.Suppliers$MemoizingSupplier.get(Suppliers.java:125)
    at com.epam.reportportal.scalatest.RPReporter.apply(RPReporter.scala:77)
    at org.scalatest.DispatchReporter$Propagator.$anonfun$run$10(DispatchReporter.scala:249)
    at org.scalatest.DispatchReporter$Propagator.$anonfun$run$10$adapted(DispatchReporter.scala:248)
    at scala.collection.immutable.List.foreach(List.scala:389)
    at org.scalatest.DispatchReporter$Propagator.run(DispatchReporter.scala:248)
    at java.lang.Thread.run(Thread.java:748)

    Getting NPE in StepAspect.startNestedStep while running tests in parallel

    Hi guys, I have faced with NullPointer exception in Nested steps feature, plz help with config or confirm the defect

    Problem: NPE occurs during parallel test run
    Env: RPv5.3, jdk11, mvn, agent-java-junit5 5.00, junit5 5.6.0
    Stacktrace:
    java.lang.NullPointerException at com.epam.reportportal.aspect.StepAspect.startNestedStep(StepAspect.java:86) at Test1.step1(Test1.java:32) at Test1.test1(Test1.java:19) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at com.epam.reportportal.junit5.ReportPortalExtension.interceptTestMethod(ReportPortalExtension.java:178) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:205) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:201) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:171) at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService.executeNonConcurrentTasks(ForkJoinPoolHierarchicalTestExecutorService.java:141) at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService.invokeAll(ForkJoinPoolHierarchicalTestExecutorService.java:121) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:171) at java.base/java.util.concurrent.RecursiveAction.exec(RecursiveAction.java:189) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1016) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1665) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1598) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)

    My Pom.xml
    `

    4.0.0

    <groupId>org.example</groupId>
    <artifactId>multithreadissue</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <repositories>
        <repository>
            <id>bintray</id>
            <url>http://dl.bintray.com/epam/reportportal</url>
        </repository>
    </repositories>
    
    <dependencies>
        <dependency>
            <groupId>com.epam.reportportal</groupId>
            <artifactId>agent-java-junit5</artifactId>
            <version>5.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.epam.reportportal</groupId>
            <artifactId>logger-java-logback</artifactId>
            <version>5.0.2</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-runner</artifactId>
            <version>1.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.6.0</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
                <configuration>
                    <forkCount>1</forkCount>
                    <!-- For nested steps only -->
                    <argLine>
                        -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/1.9.2/aspectjweaver-1.9.2.jar"
                    </argLine>
                    <properties>
                        <configurationParameters>
                            junit.jupiter.extensions.autodetection.enabled = true
                            junit.jupiter.execution.parallel.config.fixed.parallelism = 3
                        </configurationParameters>
                    </properties>
                </configuration>
                <dependencies>
                    <!-- For nested steps only -->
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjweaver</artifactId>
                        <version>1.9.2</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
    

    `

    Link to project on github: https://github.com/tematef/multithreadissue
    Steps to reproduce:

    1. mvn test -Djunit.jupiter.execution.parallel.enabled=true,

    with junit.jupiter.execution.parallel.enabled=false all works fine

    I need to get the launch id when saving it in the report portal

    Hey guys

    I'm needing to get the id of a launch when I save it there in the report portal
    I was taking a look here LaunchImpl.java (on line 112), after generating a new launch is it possible to generate a log to print the launch id or number in the terminal?

    Log messages not being sent to the server

    I have encountered an issue where the client stops sending log items to the server when a large number of log items are being sent to the server.

    From what I can see, when using client version 4.0.8/4.0.9, after 2560 log items are sent to the server, no more requests are made to send the additional log items.

    The issue does not reproduce when using 4.0.7 using the same exact setup.

    com.epam.reportportal.service.ReportPortal.Builder.buildEndpointUrl assumes all endpoints should be in v2 when running with async reporting

    com.epam.reportportal.service.ReportPortal.Builder.buildEndpointUrl assumes all endpoints should be in v2 when running with async reporting.
    This is not true for endpoints such as com.epam.reportportal.service.ReportPortalClient#getLaunchByUuid. Trying to invoke it when com.epam.reportportal.listeners.ListenerParameters#isAsyncReporting is true, results in HTTP error 404, due to the incorrect use of API_V2_BASE.

    In my specific scenario, I found a work-around, in the form of creating a separate ReportPortalClient with a clone of my ListenerParameters, where i tweaked setAsyncReporting(false), so i was able to successfully invoke com.epam.reportportal.service.ReportPortalClient#getLaunchByUuid from this dedicated client.

    Apply a templating mechanism for Test Case ID generation (the same as for annotation-based nested steps)

    To make @TestCaseId annotation more flexible and easy to use with POJOs and domain models it's good to apply a templating mechanism for Test Case ID generation, the same as for annotation-based nested step reporting.

    E.G.:

    @Inject
    private Container container;
    
    public Container dataProvider() {
      return container;
    }
    
    @TestCaseId("test_case[{container.name}]")
    @ParameterizedTest
    @MethodSource("dataProvider")
    public void test(Container container) {
      // test logic
    }

    Proxy authentication not supported when passed through JVM args

    Describe the bug

    We are passing proxy settings via JVM args like below:

    -Dhttps.proxyHost=host
    -Dhttps.proxyPort=port
    -Dhttps.proxyUser=user
    -Dhttps.proxyPassword=password
    -Djdk.https.auth.tunneling.disabledSchemes=
    

    But when the test suite is run, we get the below error

    [rp-io-1] ERROR com.epam.reportportal.service.Launch - [20] ReportPortal execution error
    java.io.IOException: Failed to authenticate with proxy
    	at okhttp3.internal.connection.RealConnection.createTunnel(RealConnection.kt:476)
    	at okhttp3.internal.connection.RealConnection.connectTunnel(RealConnection.kt:262)
    ...
    

    Expected behavior

    Proxy should be successfully authenticated

    We also tried to override the default client by creating a custom client and add proxy auth to that as shown below (rp.http.proxy is set in reportportal.properties).

    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    ...
    
    Authenticator proxyAuthenticator = (route, response) -> {
           String credential = Credentials.basic(authUser, authPassword, StandardCharsets.UTF_8);
           return response.request().newBuilder().header("Proxy-Authorization", credential).build();
    };
    builder.proxyAuthenticator(proxyAuthenticator);
    protected ReportPortal buildReportPortal() {
            return ReportPortal.builder()
            .withHttpClient(overridenClient(new ListenerParameters(PropertiesLoader.load())))
            .build();
        }

    But it fails since we are using client.join=true which throws InternalReportPortalClientException: Wait for Launch start timed out as per this issue: reportportal/reportportal#1286

    Versions:

    • Version of RP 5.7.3
    • Agent: agent-java-cucumber6 v5.1.3

    Report portal exception is not handled properly which leads failure to create testng report

    There are many instances where report portal expects some value or due to some validations report portal throws exception but then this is not handled properly which cause failure in testng report creation. It leads complete failure to build. To avoid such issue we had to remove report portal listener itself.

    This issue is high priority and should be resolved.

    The error logs can be found as below:

    18:53:59 06:23:59.310 [main] INFO  c.m.a.cms.helper.APIHelperUtils - WRITING THE DATA INTO JSON FILE /tmp/testcaseresult.json
    18:53:59 06:23:59.315 [RxComputationThreadPool-4] ERROR c.e.r.utils.SubscriptionUtils - [28] ReportPortal Finish test item execution error
    18:53:59 com.epam.reportportal.exception.ReportPortalException: Report Portal returned error
    18:53:59 Status code: 406
    18:53:59 Status message: Not Acceptable
    18:53:59 Error Message: Finish time 'Thu Jan 01 00:00:00 UTC 1970' is earlier than start time 'Tue Aug 13 13:15:24 UTC 2019' for resource with ID '5d52b8199bd1160001b8e043'
    18:53:59 Error Type: FINISH_TIME_EARLIER_THAN_START_TIME
    18:53:59 
    18:53:59 	at com.epam.reportportal.service.ReportPortalErrorHandler.handleError(ReportPortalErrorHandler.java:83) ~[client-java-4.0.10.jar:na]
    18:53:59 	at com.epam.reportportal.service.ReportPortalErrorHandler.handle(ReportPortalErrorHandler.java:59) ~[client-java-4.0.10.jar:na]
    18:53:59 	at com.epam.reportportal.restendpoint.http.HttpClientRestEndpoint$1.subscribe(HttpClientRestEndpoint.java:517) ~[client-java-4.0.10.jar:na]
    18:53:59 	at io.reactivex.internal.operators.maybe.MaybeCreate.subscribeActual(MaybeCreate.java:45) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at io.reactivex.Maybe.subscribe(Maybe.java:4096) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at io.reactivex.internal.operators.maybe.MaybeCache.subscribeActual(MaybeCache.java:77) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at io.reactivex.Maybe.subscribe(Maybe.java:4096) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at io.reactivex.internal.operators.maybe.MaybeSubscribeOn$SubscribeTask.run(MaybeSubscribeOn.java:54) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_144]
    18:53:59 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_144]
    18:53:59 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_144]
    18:53:59 	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_144]
    18:53:59 06:23:59.315 [RxComputationThreadPool-2] ERROR c.e.r.utils.SubscriptionUtils - [17] ReportPortal Finish test item execution error
    18:53:59 com.epam.reportportal.exception.ReportPortalException: Report Portal returned error
    18:53:59 Status code: 406
    18:53:59 Status message: Not Acceptable
    18:53:59 Error Message: Finish time 'Thu Jan 01 00:00:00 UTC 1970' is earlier than start time 'Tue Aug 13 13:21:31 UTC 2019' for resource with ID '5d52b9899bd1160001b8f454'
    18:53:59 Error Type: FINISH_TIME_EARLIER_THAN_START_TIME
    18:53:59 
    18:53:59 	at com.epam.reportportal.service.ReportPortalErrorHandler.handleError(ReportPortalErrorHandler.java:83) ~[client-java-4.0.10.jar:na]
    18:53:59 	at com.epam.reportportal.service.ReportPortalErrorHandler.handle(ReportPortalErrorHandler.java:59) ~[client-java-4.0.10.jar:na]
    18:53:59 	at com.epam.reportportal.restendpoint.http.HttpClientRestEndpoint$1.subscribe(HttpClientRestEndpoint.java:517) ~[client-java-4.0.10.jar:na]
    18:53:59 	at io.reactivex.internal.operators.maybe.MaybeCreate.subscribeActual(MaybeCreate.java:45) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at io.reactivex.Maybe.subscribe(Maybe.java:4096) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at io.reactivex.internal.operators.maybe.MaybeCache.subscribeActual(MaybeCache.java:77) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at io.reactivex.Maybe.subscribe(Maybe.java:4096) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at io.reactivex.internal.operators.maybe.MaybeSubscribeOn$SubscribeTask.run(MaybeSubscribeOn.java:54) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26) ~[rxjava-2.1.16.jar:na]
    18:53:59 	at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_144]
    18:53:59 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_144]
    18:53:59 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_144]
    18:53:59 	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_144]
    18:54:00 
    18:54:00 Results :
    18:54:00 
    18:54:00 Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
    18:54:00 
    18:54:00 [INFO] ------------------------------------------------------------------------
    18:54:00 [INFO] BUILD FAILURE
    18:54:00 [INFO] ------------------------------------------------------------------------
    18:54:00 [INFO] Total time: 01:24 h
    18:54:00 [INFO] Finished at: 2019-08-13T06:23:59-07:00
    18:54:00 [INFO] Final Memory: 83M/1008M
    18:54:00 [INFO] ------------------------------------------------------------------------
    18:54:00 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.19.1:test (default-test) on project cms-cmsfr: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.19.1:test failed: There was an error in the forked process
    18:54:00 [ERROR] java.lang.IllegalArgumentException: ItemID should not be null
    18:54:00 [ERROR] at rp.com.google.common.base.Preconditions.checkArgument(Preconditions.java:122)
    18:54:00 [ERROR] at com.epam.reportportal.service.LaunchImpl.finishTestItem(LaunchImpl.java:247)
    18:54:00 [ERROR] at com.epam.reportportal.testng.TestNGService.finishTestMethod(TestNGService.java:152)
    18:54:00 [ERROR] at com.epam.reportportal.testng.BaseTestNGListener.onTestFailure(BaseTestNGListener.java:93)
    18:54:00 [ERROR] at org.testng.internal.TestListenerHelper.runTestListeners(TestListenerHelper.java:66)
    18:54:00 [ERROR] at org.testng.internal.TestInvoker.runTestResultListener(TestInvoker.java:210)
    18:54:00 [ERROR] at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:814)
    18:54:00 [ERROR] at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:145)
    18:54:00 [ERROR] at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
    18:54:00 [ERROR] at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
    18:54:00 [ERROR] at java.util.ArrayList.forEach(ArrayList.java:1249)
    18:54:00 [ERROR] at org.testng.TestRunner.privateRun(TestRunner.java:770)
    18:54:00 [ERROR] at org.testng.TestRunner.run(TestRunner.java:591)
    18:54:00 [ERROR] at org.testng.SuiteRunner.runTest(SuiteRunner.java:402)
    18:54:00 [ERROR] at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:396)
    18:54:00 [ERROR] at org.testng.SuiteRunner.privateRun(SuiteRunner.java:355)
    18:54:00 [ERROR] at org.testng.SuiteRunner.run(SuiteRunner.java:304)
    18:54:00 [ERROR] at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
    18:54:00 [ERROR] at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
    18:54:00 [ERROR] at org.testng.TestNG.runSuitesSequentially(TestNG.java:1180)
    18:54:00 [ERROR] at org.testng.TestNG.runSuitesLocally(TestNG.java:1102)
    18:54:00 [ERROR] at org.testng.TestNG.runSuites(TestNG.java:1032)
    18:54:00 [ERROR] at org.testng.TestNG.run(TestNG.java:1000)
    18:54:00 [ERROR] at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:281)
    18:54:00 [ERROR] at org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:75)
    18:54:00 [ERROR] at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:121)
    18:54:00 [ERROR] at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:290)
    18:54:00 [ERROR] at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:242)
    18:54:00 [ERROR] at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121)
    18:54:00 [ERROR] -> [Help 1]
    18:54:00 [ERROR] 
    18:54:00 [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
    18:54:00 [ERROR] Re-run Maven using the -X switch to enable full debug logging.
    18:54:00 [ERROR] 
    18:54:00 [ERROR] For more information about the errors and possible solutions, please read the following articles:
    18:54:00 [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException
    18:54:01 
    18:54:01 [SSH] completed
    18:54:01 [SSH] exit-status: 0
    18:54:01 
    18:54:01 [SSH] script:

    Recommend Projects

    • React photo React

      A declarative, efficient, and flexible JavaScript library for building user interfaces.

    • Vue.js photo Vue.js

      🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

    • Typescript photo Typescript

      TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

    • TensorFlow photo TensorFlow

      An Open Source Machine Learning Framework for Everyone

    • Django photo Django

      The Web framework for perfectionists with deadlines.

    • D3 photo D3

      Bring data to life with SVG, Canvas and HTML. 📊📈🎉

    Recommend Topics

    • javascript

      JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

    • web

      Some thing interesting about web. New door for the world.

    • server

      A server is a program made to process requests and deliver data to clients.

    • Machine learning

      Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

    • Game

      Some thing interesting about game, make everyone happy.

    Recommend Org

    • Facebook photo Facebook

      We are working to build community through open source technology. NB: members must have two-factor auth.

    • Microsoft photo Microsoft

      Open source projects and samples from Microsoft.

    • Google photo Google

      Google ❤️ Open Source for everyone.

    • D3 photo D3

      Data-Driven Documents codes.