Skip to content

Commit 67dc425

Browse files
fix: Telemetry can't serialize traits anymore (#477)
* fix: Telemetry can't serialize traits anymore * Add tests
1 parent 9666590 commit 67dc425

File tree

6 files changed

+88
-25
lines changed

6 files changed

+88
-25
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ dependencies {
6464
implementation(libs.jsoup)
6565
implementation(libs.commons.text)
6666
implementation(libs.jtokkit)
67+
testImplementation(kotlin("test"))
6768
}
6869

6970
tasks.register<Exec>("updateSubmodules") {

codegpt-telemetry/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ plugins {
44

55
dependencies {
66
implementation(libs.analytics)
7+
implementation(libs.gson)
78
}

codegpt-telemetry/src/main/java/ee/carlrobert/codegpt/telemetry/core/service/segment/IdentifyTraitsPersistence.java

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ public class IdentifyTraitsPersistence {
2828
public static final IdentifyTraitsPersistence INSTANCE = new IdentifyTraitsPersistence();
2929
private static final Logger LOGGER = Logger.getInstance(IdentifyTraitsPersistence.class);
3030

31-
private static final Path FILE = Directories.PATH.resolve("segment-identify-traits.json");
31+
static Path FILE = Directories.PATH.resolve("segment-identify-traits.json");
3232

33-
private IdentifyTraits identifyTraits = null;
33+
IdentifyTraits identifyTraits = null;
34+
private Gson gson = new Gson();
3435

3536
protected IdentifyTraitsPersistence() {}
3637

@@ -41,58 +42,49 @@ public synchronized IdentifyTraits get() {
4142
return identifyTraits;
4243
}
4344

44-
public synchronized void set(IdentifyTraits identifyTraits) {
45+
public synchronized boolean set(IdentifyTraits identifyTraits) {
4546
if (Objects.equals(identifyTraits, this.identifyTraits)) {
46-
return;
47+
return true;
4748
}
4849
this.identifyTraits = identifyTraits;
49-
String string = null;
50-
if (identifyTraits != null) {
51-
string = serialize(identifyTraits);
52-
}
53-
save(string, FILE);
50+
return save(serialize(identifyTraits), FILE);
5451
}
5552

56-
private String serialize(IdentifyTraits identifyTraits) {
57-
if (identifyTraits == null) {
58-
return null;
59-
}
60-
return new Gson().toJson(identifyTraits);
53+
String serialize(IdentifyTraits identifyTraits) {
54+
return identifyTraits == null ? null : gson.toJson(identifyTraits);
6155
}
6256

63-
private IdentifyTraits deserialize(String identity) {
64-
if (identity == null) {
65-
return null;
66-
}
67-
return new Gson().fromJson(identity, IdentifyTraits.class);
57+
IdentifyTraits deserialize(String identity) {
58+
return identity == null ? null : gson.fromJson(identity, IdentifyTraits.class);
6859
}
6960

70-
private String load(Path file) {
71-
String event = null;
61+
String load(Path file) {
7262
try(Stream<String> lines = getLines(file)) {
73-
event = lines
63+
return lines
7464
.filter(l -> !l.isBlank())
7565
.findAny()
7666
.map(String::trim)
7767
.orElse(null);
7868
} catch (IOException e) {
7969
LOGGER.warn("Could not read identity file at " + file.toAbsolutePath(), e);
8070
}
81-
return event;
71+
return null;
8272
}
8373

8474
/* for testing purposes */
8575
protected Stream<String> getLines(Path file) throws IOException {
8676
return Files.lines(file);
8777
}
8878

89-
private void save(String event, Path file) {
79+
boolean save(String event, Path file) {
9080
try {
9181
createFileAndParent(file);
9282
writeFile(event, file);
83+
return true;
9384
} catch (IOException e) {
9485
LOGGER.warn("Could not write identity to file at " + FILE.toAbsolutePath(), e);
9586
}
87+
return false;
9688
}
9789

9890
/* for testing purposes */

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ checkstyle = "10.15.0"
66
commons-text = "1.11.0"
77
flexmark = "0.64.8"
88
gradle-intellij-plugin-version = "1.17.3"
9+
gson = "2.10.1"
910
jackson = "2.17.0"
1011
jsoup = "1.17.2"
1112
jtokkit = "1.0.0"
@@ -21,6 +22,7 @@ assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertj" }
2122
commons-text = { module = "org.apache.commons:commons-text", version.ref = "commons-text" }
2223
flexmark-all = { module = "com.vladsch.flexmark:flexmark-all", version.ref = "flexmark" }
2324
gradle-intellij-plugin = { module = "org.jetbrains.intellij.plugins:gradle-intellij-plugin", version.ref = "gradle-intellij-plugin-version" }
25+
gson = { module = "com.google.code.gson:gson", version.ref = "gson" }
2426
jackson-bom = { module = "com.fasterxml.jackson:jackson-bom", version.ref = "jackson" }
2527
jsoup = { module = "org.jsoup:jsoup", version.ref = "jsoup" }
2628
jtokkit = { module = "com.knuddels:jtokkit", version.ref = "jtokkit" }

src/main/java/ee/carlrobert/codegpt/actions/IncludeFilesInContextAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class IncludeFilesInContextAction extends AnAction {
4949
private static final Logger LOG = Logger.getInstance(IncludeFilesInContextAction.class);
5050

5151
public IncludeFilesInContextAction() {
52-
super(CodeGPTBundle.get("action.includeFilesInContext.title"));
52+
this("action.includeFilesInContext.title");
5353
}
5454

5555
public IncludeFilesInContextAction(String customTitleKey) {
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package ee.carlrobert.codegpt.telemetry.core.service.segment
2+
3+
import com.google.gson.Gson
4+
import com.google.gson.JsonSyntaxException
5+
import com.intellij.util.io.write
6+
import org.junit.jupiter.api.BeforeEach
7+
import org.junit.jupiter.api.Test
8+
import kotlin.io.path.Path
9+
import kotlin.io.path.createTempFile
10+
import kotlin.io.path.readText
11+
import kotlin.test.assertEquals
12+
import kotlin.test.assertFailsWith
13+
import kotlin.test.assertNull
14+
15+
private const val NOT_JSON = "}NOT]:JSON{"
16+
17+
class IdentifyTraitsPersistenceTest {
18+
private val gson = Gson()
19+
private val persistence = IdentifyTraitsPersistence.INSTANCE
20+
private val identifyTraits = IdentifyTraits("locale", "timezone", "os", "version", "distribution")
21+
22+
@BeforeEach
23+
fun setUp() {
24+
persistence.identifyTraits = null
25+
IdentifyTraitsPersistence.FILE = createTempFile()
26+
}
27+
28+
@Test
29+
fun `get returns null when file does not exist`() {
30+
IdentifyTraitsPersistence.FILE = Path(" ")
31+
assertNull(persistence.get())
32+
}
33+
34+
@Test
35+
fun `get throws JsonSyntaxException when file contains malformed JSON`() {
36+
IdentifyTraitsPersistence.FILE.write(NOT_JSON)
37+
assertFailsWith<JsonSyntaxException> {
38+
persistence.get()
39+
}
40+
}
41+
42+
@Test
43+
fun `set saves the event to the file overwriting it`() {
44+
IdentifyTraitsPersistence.FILE.write(NOT_JSON)
45+
persistence.set(identifyTraits)
46+
assertEquals(IdentifyTraitsPersistence.FILE.readText(), gson.toJson(identifyTraits))
47+
}
48+
49+
@Test
50+
fun `set saves the event to the file when file does not exist`() {
51+
persistence.set(identifyTraits)
52+
assertEquals(IdentifyTraitsPersistence.FILE.readText(), gson.toJson(identifyTraits))
53+
}
54+
55+
@Test
56+
fun `get returns the deserialized event`() {
57+
IdentifyTraitsPersistence.FILE.write(gson.toJson(identifyTraits))
58+
assertEquals(identifyTraits, persistence.get())
59+
}
60+
61+
@Test
62+
fun `set throws IOException when file cannot be written and returns false`() {
63+
IdentifyTraitsPersistence.FILE = IdentifyTraitsPersistence.FILE.resolve(" xyz ")
64+
assertEquals(persistence.set(identifyTraits), false)
65+
}
66+
67+
}

0 commit comments

Comments
 (0)