Skip to content

Commit d56d63a

Browse files
authored
Merge pull request #842 from cqse/ts/45214_version_user_agent
TS-45214 Send user-agent including the version
2 parents eaa4616 + d06ae11 commit d56d63a

16 files changed

Lines changed: 83 additions & 24 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ We use [semantic versioning](http://semver.org/):
55
- PATCH version when you make backwards compatible bug fixes.
66

77
# Next version
8+
- _teamscale-client_: User-Agent header now includes the specific component performing the request (e.g., "Teamscale Gradle Plugin", "Teamscale Maven Plugin") and version number
89
- _maven-plugin_: Added maven properties for `runImpacted` and `runAllTests` configuration parameters
910
- _maven-plugin_: The warning "Both baselineRevision and baselineCommit are set but only one of them is needed" was displayed incorrectly
1011
- [fix] _maven-plugin_: Coverage upload used "Now" instead of auto-resolved Git revision when no commit/revision was configured

agent/src/main/java/com/teamscale/jacoco/agent/configuration/ConfigurationViaTeamscale.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.teamscale.client.ProfilerRegistration;
1010
import com.teamscale.client.TeamscaleServiceGenerator;
1111
import com.teamscale.jacoco.agent.logging.LoggingUtils;
12+
import com.teamscale.jacoco.agent.util.AgentUtils;
1213
import com.teamscale.report.util.ILogger;
1314
import okhttp3.HttpUrl;
1415
import okhttp3.ResponseBody;
@@ -57,7 +58,8 @@ public ConfigurationViaTeamscale(ITeamscaleService teamscaleClient, ProfilerRegi
5758
String userName,
5859
String userAccessToken) throws AgentOptionReceiveException {
5960
ITeamscaleService teamscaleClient = TeamscaleServiceGenerator
60-
.createService(ITeamscaleService.class, url, userName, userAccessToken, LONG_TIMEOUT, LONG_TIMEOUT);
61+
.createService(ITeamscaleService.class, url, userName, userAccessToken, AgentUtils.USER_AGENT,
62+
LONG_TIMEOUT, LONG_TIMEOUT);
6163
try {
6264
ProcessInformation processInformation = new ProcessInformationRetriever(logger).getProcessInformation();
6365
Response<ResponseBody> response = teamscaleClient.registerProfiler(configurationId,

agent/src/main/java/com/teamscale/jacoco/agent/options/AgentOptions.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,8 @@ private void validateTestwiseCoverageConfig(Validator validator) {
402402
if (teamscaleServer.isConfiguredForSingleProjectTeamscaleUpload() ||
403403
!requireSingleProjectUploadConfig && teamscaleServer.isConfiguredForServerConnection()) {
404404
return new TeamscaleClient(teamscaleServer.url.toString(), teamscaleServer.userName,
405-
teamscaleServer.userAccessToken, teamscaleServer.project);
405+
teamscaleServer.userAccessToken, teamscaleServer.project,
406+
AgentUtils.USER_AGENT);
406407
}
407408
return null;
408409
}

agent/src/main/java/com/teamscale/jacoco/agent/upload/teamscale/TeamscaleUploader.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.teamscale.jacoco.agent.logging.LoggingUtils;
1212
import com.teamscale.jacoco.agent.upload.IUploadRetry;
1313
import com.teamscale.jacoco.agent.upload.IUploader;
14+
import com.teamscale.jacoco.agent.util.AgentUtils;
1415
import com.teamscale.jacoco.agent.util.Benchmark;
1516
import com.teamscale.report.jacoco.CoverageFile;
1617
import org.slf4j.Logger;
@@ -135,7 +136,8 @@ private boolean tryUploading(CoverageFile coverageFile, TeamscaleServer teamscal
135136
// Cannot be executed in the constructor as this causes issues in WildFly server
136137
// (See #100)
137138
ITeamscaleService api = TeamscaleServiceGenerator.createService(ITeamscaleService.class,
138-
teamscaleServer.url, teamscaleServer.userName, teamscaleServer.userAccessToken);
139+
teamscaleServer.url, teamscaleServer.userName, teamscaleServer.userAccessToken,
140+
AgentUtils.USER_AGENT);
139141
ITeamscaleServiceKt.uploadReport(api, teamscaleServer.project, teamscaleServer.commit,
140142
teamscaleServer.revision,
141143
teamscaleServer.repository, teamscaleServer.partition, EReportFormat.JACOCO,

agent/src/main/java/com/teamscale/jacoco/agent/util/AgentUtils.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.teamscale.jacoco.agent.util;
22

33
import com.teamscale.client.FileSystemUtils;
4+
import com.teamscale.client.TeamscaleServiceGenerator;
45
import com.teamscale.jacoco.agent.PreMain;
56
import com.teamscale.jacoco.agent.configuration.ProcessInformationRetriever;
67

@@ -18,11 +19,15 @@ public class AgentUtils {
1819
/** Version of this program. */
1920
public static final String VERSION;
2021

22+
/** User-Agent header value for HTTP requests. */
23+
public static final String USER_AGENT;
24+
2125
private static Path mainTempDirectory = null;
2226

2327
static {
2428
ResourceBundle bundle = ResourceBundle.getBundle("com.teamscale.jacoco.agent.app");
2529
VERSION = bundle.getString("version");
30+
USER_AGENT = TeamscaleServiceGenerator.buildUserAgent("Teamscale Java Profiler", VERSION);
2631
}
2732

2833
/**
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.teamscale.test_impacted
2+
3+
import java.util.*
4+
5+
/** Provides access to the Impacted Test Engine version at runtime. */
6+
object BuildVersion {
7+
8+
private val bundle = ResourceBundle.getBundle("com.teamscale.test_impacted.app")
9+
10+
/** The version of the Teamscale Impacted Test Engine. */
11+
val VERSION: String = bundle.getString("version")
12+
}

impacted-test-engine/src/main/kotlin/com/teamscale/test_impacted/engine/options/TestEngineOptions.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.teamscale.test_impacted.engine.options
22

33
import com.teamscale.client.CommitDescriptor
44
import com.teamscale.client.TeamscaleClient
5+
import com.teamscale.client.TeamscaleServiceGenerator
6+
import com.teamscale.test_impacted.BuildVersion
57
import com.teamscale.test_impacted.engine.ImpactedTestEngineConfiguration
68
import com.teamscale.test_impacted.engine.TestDataWriter
79
import com.teamscale.test_impacted.engine.TestEngineRegistry
@@ -122,7 +124,8 @@ class TestEngineOptions(
122124
serverOptions.userName,
123125
serverOptions.userAccessToken,
124126
serverOptions.project,
125-
File(reportDirectory, "server-request.txt")
127+
File(reportDirectory, "server-request.txt"),
128+
userAgent = TeamscaleServiceGenerator.buildUserAgent("Teamscale Impacted Test Engine", BuildVersion.VERSION)
126129
)
127130
return ImpactedTestsProvider(
128131
client, baseline, baselineRevision, endCommit, endRevision, repository, partition,
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
version=%VERSION_TOKEN_REPLACED_DURING_BUILD%

system-tests/http-redirect-test/src/test/kotlin/com/teamscale/client/HttpRedirectSystemTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class HttpRedirectSystemTest {
3333

3434
private fun checkCustomUserAgent(teamscaleMockServer: TeamscaleMockServer) {
3535
val collectedUserAgents = teamscaleMockServer.collectedUserAgents
36-
assertThat(collectedUserAgents).containsExactly(TeamscaleServiceGenerator.USER_AGENT)
36+
assertThat(collectedUserAgents).allMatch { it.matches(Regex("Teamscale Java Profiler/\\d+\\.\\d+.*")) }
3737
}
3838

3939
companion object {

teamscale-client/src/main/kotlin/com/teamscale/client/TeamscaleClient.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,14 @@ open class TeamscaleClient {
2727
user: String,
2828
accessToken: String,
2929
projectId: String?,
30+
userAgent: String,
3031
readTimeout: Duration = HttpUtils.DEFAULT_READ_TIMEOUT,
3132
writeTimeout: Duration = HttpUtils.DEFAULT_WRITE_TIMEOUT
3233
) {
3334
val url = baseUrl?.toHttpUrlOrNull() ?: throw IllegalArgumentException("Invalid URL: $baseUrl")
3435
this.projectId = projectId
3536
service = TeamscaleServiceGenerator.createService(
36-
ITeamscaleService::class.java, url, user, accessToken, readTimeout, writeTimeout
37+
ITeamscaleService::class.java, url, user, accessToken, userAgent, readTimeout, writeTimeout
3738
)
3839
}
3940

@@ -46,12 +47,13 @@ open class TeamscaleClient {
4647
projectId: String?,
4748
logfile: File?,
4849
readTimeout: Duration = HttpUtils.DEFAULT_READ_TIMEOUT,
49-
writeTimeout: Duration = HttpUtils.DEFAULT_WRITE_TIMEOUT
50+
writeTimeout: Duration = HttpUtils.DEFAULT_WRITE_TIMEOUT,
51+
userAgent: String
5052
) {
5153
val url = baseUrl?.toHttpUrlOrNull() ?: throw IllegalArgumentException("Invalid URL: $baseUrl")
5254
this.projectId = projectId
5355
service = TeamscaleServiceGenerator.createServiceWithRequestLogging(
54-
ITeamscaleService::class.java, url, user, accessToken, logfile, readTimeout, writeTimeout
56+
ITeamscaleService::class.java, url, user, accessToken, logfile, readTimeout, writeTimeout, userAgent
5557
)
5658
}
5759

0 commit comments

Comments
 (0)