From fa690a51f3658f52f2d78dc8e306e1bd7b446d4f Mon Sep 17 00:00:00 2001 From: "Svetlana.Zemlyanskaya" Date: Tue, 14 Aug 2018 11:27:21 +0200 Subject: [PATCH] FUS: don't send logs from IDE built from sources --- .../EventLogExternalSettingsService.java | 2 +- .../statistic/eventLog/LogEventFilter.kt | 23 ++++- .../eventLog/LogEventRecordRequest.kt | 2 +- .../FeatureEventLogSerializationTest.kt | 85 +++++++++++++++++-- 4 files changed, 100 insertions(+), 12 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/internal/statistic/eventLog/EventLogExternalSettingsService.java b/platform/platform-impl/src/com/intellij/internal/statistic/eventLog/EventLogExternalSettingsService.java index 3ca0be2d2c8e..8177edd41c16 100644 --- a/platform/platform-impl/src/com/intellij/internal/statistic/eventLog/EventLogExternalSettingsService.java +++ b/platform/platform-impl/src/com/intellij/internal/statistic/eventLog/EventLogExternalSettingsService.java @@ -49,7 +49,7 @@ public class EventLogExternalSettingsService extends SettingsConnectionService i @NotNull public LogEventFilter getEventFilter() { final Set whitelist = getWhitelistedGroups(); - return new LogEventWhitelistFilter(whitelist); + return new LogEventCompositeFilter(new LogEventWhitelistFilter(whitelist), LogEventSnapshotBuildFilter.INSTANCE); } @NotNull diff --git a/platform/platform-impl/src/com/intellij/internal/statistic/eventLog/LogEventFilter.kt b/platform/platform-impl/src/com/intellij/internal/statistic/eventLog/LogEventFilter.kt index c44cc13b0bb4..b3edafc7ac1b 100644 --- a/platform/platform-impl/src/com/intellij/internal/statistic/eventLog/LogEventFilter.kt +++ b/platform/platform-impl/src/com/intellij/internal/statistic/eventLog/LogEventFilter.kt @@ -1,18 +1,33 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.internal.statistic.eventLog +import com.intellij.openapi.util.BuildNumber + interface LogEventFilter { - fun accepts(groupId: String) : Boolean + fun accepts(event: LogEvent) : Boolean } class LogEventWhitelistFilter(val whitelist: Set) : LogEventFilter { - override fun accepts(groupId: String): Boolean { - return whitelist.contains(groupId) + override fun accepts(event: LogEvent): Boolean { + return whitelist.contains(event.group.id) + } +} + +object LogEventSnapshotBuildFilter : LogEventFilter { + override fun accepts(event: LogEvent): Boolean { + val parts = BuildNumber.fromString(event.build).components + return parts.size != 2 || parts[1] != 0 + } +} + +class LogEventCompositeFilter(vararg val filters : LogEventFilter) : LogEventFilter { + override fun accepts(event: LogEvent): Boolean { + return filters.all { filter -> filter.accepts(event) } } } object LogEventTrueFilter : LogEventFilter { - override fun accepts(groupId: String): Boolean { + override fun accepts(event: LogEvent): Boolean { return true } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/internal/statistic/eventLog/LogEventRecordRequest.kt b/platform/platform-impl/src/com/intellij/internal/statistic/eventLog/LogEventRecordRequest.kt index 383941780742..0d23f5e8dfdf 100644 --- a/platform/platform-impl/src/com/intellij/internal/statistic/eventLog/LogEventRecordRequest.kt +++ b/platform/platform-impl/src/com/intellij/internal/statistic/eventLog/LogEventRecordRequest.kt @@ -61,7 +61,7 @@ class LogEventRecordRequest(val product : String, val user: String, val records: var line = firstLine while (line != null && recordSize + estimator.estimate(line) < maxRecordSize) { val event = LogEventSerializer.fromString(line) - if (event != null && filter.accepts(event.group.id)) { + if (event != null && filter.accepts(event)) { recordSize += estimator.estimate(line) events.add(event) } diff --git a/platform/platform-tests/testSrc/com/intellij/internal/statistics/FeatureEventLogSerializationTest.kt b/platform/platform-tests/testSrc/com/intellij/internal/statistics/FeatureEventLogSerializationTest.kt index a472b32cf0ce..90177bb7138f 100644 --- a/platform/platform-tests/testSrc/com/intellij/internal/statistics/FeatureEventLogSerializationTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/internal/statistics/FeatureEventLogSerializationTest.kt @@ -144,7 +144,7 @@ class FeatureEventLogSerializationTest { all.add(newLogEvent("session-id", "999.9999", "-1", "recorder-id-1", "1", "second")) all.add(newLogEvent("session-id", "999.9999", "-1", "recorder-id-2", "1", "third")) - testWhitelist(HashSet(), all, ArrayList()) + testWhitelistFilter(HashSet(), all, ArrayList()) } @Test @@ -163,7 +163,7 @@ class FeatureEventLogSerializationTest { val whitelist = HashSet() whitelist.add("recorder-id") - testWhitelist(whitelist, all, filtered) + testWhitelistFilter(whitelist, all, filtered) } @Test @@ -183,7 +183,7 @@ class FeatureEventLogSerializationTest { val whitelist = HashSet() whitelist.add("recorder-id") whitelist.add("recorder-id-2") - testWhitelist(whitelist, all, filtered) + testWhitelistFilter(whitelist, all, filtered) } @Test @@ -205,7 +205,68 @@ class FeatureEventLogSerializationTest { whitelist.add("recorder-id") whitelist.add("recorder-id-1") whitelist.add("recorder-id-2") - testWhitelist(whitelist, all, filtered) + testWhitelistFilter(whitelist, all, filtered) + } + + @Test + fun testPartialSnapshotBuildsFilter() { + val first = newLogEvent("session-id", "999.9999", "-1", "recorder-id", "1", "first") + val second = newLogEvent("session-id", "999.0", "-1", "recorder-id-1", "1", "second") + val third = newLogEvent("session-id", "999.9999", "-1", "recorder-id", "1", "third") + + val all = ArrayList() + all.add(first) + all.add(second) + all.add(third) + val filtered = ArrayList() + filtered.add(first) + filtered.add(third) + + testSnapshotBuilderFilter(all, filtered) + } + + @Test + fun testNoneSnapshotBuildsFilter() { + val first = newLogEvent("session-id", "999.9999", "-1", "recorder-id", "1", "first") + val second = newLogEvent("session-id", "999.01", "-1", "recorder-id-1", "1", "second") + val third = newLogEvent("session-id", "999.9999", "-1", "recorder-id", "1", "third") + + val all = ArrayList() + all.add(first) + all.add(second) + all.add(third) + testSnapshotBuilderFilter(all, all) + } + + @Test + fun testAllSnapshotBuildsFilter() { + val first = newLogEvent("session-id", "999.00", "-1", "recorder-id", "1", "first") + val second = newLogEvent("session-id", "999.0", "-1", "recorder-id-1", "1", "second") + val third = newLogEvent("session-id", "999.0", "-1", "recorder-id", "1", "third") + + val all = ArrayList() + all.add(first) + all.add(second) + all.add(third) + testSnapshotBuilderFilter(all, ArrayList()) + } + + @Test + fun testSnapshotBuildsAndWhitelistFilter() { + val first = newLogEvent("session-id", "999.9999", "-1", "recorder-id", "1", "first") + val second = newLogEvent("session-id", "999.9999", "-1", "recorder-id-1", "1", "second") + val third = newLogEvent("session-id", "999.0", "-1", "recorder-id", "1", "third") + + val all = ArrayList() + all.add(first) + all.add(second) + all.add(third) + val filtered = ArrayList() + filtered.add(first) + + val whitelist = HashSet() + whitelist.add("recorder-id") + testWhitelistAndSnapshotBuildFilter(whitelist, all, filtered) } @Test @@ -275,7 +336,19 @@ class FeatureEventLogSerializationTest { assertNull(deserialized) } - private fun testWhitelist(whitelist: Set, all: List, filtered: List) { + private fun testWhitelistFilter(whitelist: Set, all: List, filtered: List) { + testEventLogFilter(all, filtered, LogEventWhitelistFilter(whitelist)) + } + + private fun testWhitelistAndSnapshotBuildFilter(whitelist: Set, all: List, filtered: List) { + testEventLogFilter(all, filtered, LogEventCompositeFilter(LogEventWhitelistFilter(whitelist), LogEventSnapshotBuildFilter)) + } + + private fun testSnapshotBuilderFilter(all: List, filtered: List) { + testEventLogFilter(all, filtered, LogEventSnapshotBuildFilter) + } + + private fun testEventLogFilter(all: List, filtered: List, filter : LogEventFilter) { val records = ArrayList() if (!filtered.isEmpty()) { records.add(LogEventRecord(filtered)) @@ -289,7 +362,7 @@ class FeatureEventLogSerializationTest { out.append(LogEventSerializer.toString(event)).append("\n") } FileUtil.writeToFile(log, out.toString()) - val actual = LogEventRecordRequest.create(log, "IU", "user-id", 600, LogEventWhitelistFilter(whitelist)) + val actual = LogEventRecordRequest.create(log, "IU", "user-id", 600, filter) assertEquals(expected, actual) } finally {