Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -88,10 +88,14 @@ tasks.register<Test>("integrationTest") {

val generatedVersionDir = layout.buildDirectory.dir("generated-version")

// Not "version.properties" at the jar root. stream-chat-java ships that same name, and
// ClassLoader.getResourceAsStream returns whichever jar comes first.
val sdkVersionResource = "io/getstream/stream-sdk-java/version.properties"

tasks.register("generateVersionProperties") {
doLast {
val f = layout.buildDirectory.file("generated-version/version.properties")
val propertiesFile = f.get().asFile
val propertiesFile =
layout.buildDirectory.file("generated-version/$sdkVersionResource").get().asFile
propertiesFile.parentFile.mkdirs()
val properties = Properties()
properties.setProperty("version", version.toString())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,12 +132,23 @@ public StreamHTTPClient(Properties properties, @NotNull StreamClientOptions opti
.compact();
}

// Unique to this jar. A root version.properties collides with stream-chat-java (and any
// other dependency that ships that name): the classloader returns the first match.
private static final String VERSION_RESOURCE = "/io/getstream/stream-sdk-java/version.properties";

private static @NotNull String readSdkVersion() {
var clsLoader = StreamHTTPClient.class.getClassLoader();
try (var inputStream = clsLoader.getResourceAsStream("version.properties")) {
try (var inputStream = StreamHTTPClient.class.getResourceAsStream(VERSION_RESOURCE)) {
if (inputStream == null) {
throw new IllegalStateException("missing SDK version resource " + VERSION_RESOURCE);
}
var properties = new Properties();
properties.load(inputStream);
return properties.getProperty("version");
var version = properties.getProperty("version");
if (version == null || version.isBlank()) {
throw new IllegalStateException(
"SDK version resource " + VERSION_RESOURCE + " has no version");
}
return version;
} catch (IOException ex) {
throw new IllegalStateException(ex);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ void clientInitializedOnceWithSchema() {
var inits = log.named("client.initialized");
assertEquals(1, inits.size());
String m = inits.get(0).message();
// sdk.name is a fixed constant; version is present but its value depends on version.properties.
// sdk.name is a fixed constant; version is present but its value comes from this SDK's jar.
assertTrue(m.contains("stream.sdk.name=stream-sdk-java"), m);
assertTrue(m.contains("stream.sdk.version="), m);
// Pool/timeout knobs equal the StreamClientOptions defaults for a default-options client.
Expand Down
60 changes: 60 additions & 0 deletions src/test/java/io/getstream/services/framework/SdkVersionTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package io.getstream.services.framework;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

import com.fasterxml.jackson.core.type.TypeReference;
import java.util.Map;
import java.util.Properties;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

// src/test/resources/version.properties is on the classpath ahead of the SDK jar and would be
// what ClassLoader.getResourceAsStream("version.properties") returned. The header must ignore it.
public class SdkVersionTest {
private MockWebServer server;

@BeforeEach
void setUp() throws Exception {
server = new MockWebServer();
server.start();
}

@AfterEach
void tearDown() throws Exception {
server.shutdown();
}

@Test
void clientHeaderUsesThisSdkVersionWhenAnotherVersionPropertiesIsFirst() throws Exception {
try (var decoy =
StreamHTTPClient.class.getClassLoader().getResourceAsStream("version.properties")) {
assertNotNull(decoy, "the test fixture version.properties is not on the classpath");
var decoyProps = new Properties();
decoyProps.load(decoy);
assertEquals("0.0.0-collision", decoyProps.getProperty("version"));
}

String expected;
try (var own =
StreamHTTPClient.class.getResourceAsStream(
"/io/getstream/stream-sdk-java/version.properties")) {
assertNotNull(own);
var ownProps = new Properties();
ownProps.load(own);
expected = "stream-java-client-" + ownProps.getProperty("version");
}

server.enqueue(new MockResponse().setResponseCode(200).setBody("{}"));
var client = new StreamHTTPClient("key", "012345678901234567890123456789ab");
client.setBaseUrl(server.url("/").toString());
new StreamRequest<Map<String, Object>>(
client, "GET", "/api/v2/app", null, null, new TypeReference<>() {})
.execute();

assertEquals(expected, server.takeRequest().getHeader("X-Stream-Client"));
}
}
1 change: 1 addition & 0 deletions src/test/resources/version.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
version=0.0.0-collision
Loading