Skip to content

Commit dc6cf24

Browse files
authored
Merge pull request #13 from exceptionless/testing
Added unit tests for plugins
2 parents e12fc4a + 4582dfd commit dc6cf24

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1373
-236
lines changed

pom.xml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,41 @@
2424
<artifactId>jackson-databind</artifactId>
2525
<version>2.9.5</version>
2626
</dependency>
27+
<dependency>
28+
<groupId>ch.qos.logback</groupId>
29+
<artifactId>logback-core</artifactId>
30+
<version>1.2.3</version>
31+
</dependency>
32+
<dependency>
33+
<groupId>org.slf4j</groupId>
34+
<artifactId>slf4j-api</artifactId>
35+
<version>1.7.30</version>
36+
</dependency>
37+
<!--Test Dependencies-->
38+
<dependency>
39+
<groupId>org.junit.jupiter</groupId>
40+
<artifactId>junit-jupiter-engine</artifactId>
41+
<version>5.3.1</version>
42+
<scope>test</scope>
43+
</dependency>
44+
<dependency>
45+
<groupId>org.mockito</groupId>
46+
<artifactId>mockito-core</artifactId>
47+
<version>2.21.0</version>
48+
<scope>test</scope>
49+
</dependency>
50+
<dependency>
51+
<groupId>org.mockito</groupId>
52+
<artifactId>mockito-junit-jupiter</artifactId>
53+
<version>2.23.0</version>
54+
<scope>test</scope>
55+
</dependency>
56+
<dependency>
57+
<groupId>org.assertj</groupId>
58+
<artifactId>assertj-core</artifactId>
59+
<version>3.4.1</version>
60+
<scope>test</scope>
61+
</dependency>
2762
</dependencies>
2863

2964
<build>

samples/example-app/pom.xml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,25 @@
88
<artifactId>example-app</artifactId>
99
<version>1.0</version>
1010

11+
<dependencies>
12+
<dependency>
13+
<groupId>com.exceptionless</groupId>
14+
<artifactId>exceptionless-client</artifactId>
15+
<version>1.0</version>
16+
</dependency>
17+
</dependencies>
1118

19+
<build>
20+
<plugins>
21+
<plugin>
22+
<groupId>org.apache.maven.plugins</groupId>
23+
<artifactId>maven-compiler-plugin</artifactId>
24+
<version>3.5.1</version>
25+
<configuration>
26+
<source>11</source>
27+
<target>11</target>
28+
</configuration>
29+
</plugin>
30+
</plugins>
31+
</build>
1232
</project>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.exceptionless.sample.app;
2+
3+
import com.exceptionless.exceptionlessclient.ExceptionlessClient;
4+
5+
public class Main {
6+
public static void main(String[] args) {
7+
ExceptionlessClient client =
8+
ExceptionlessClient.from(
9+
System.getenv("EXCEPTIONLESS_SAMPLE_APP_API_KEY"),
10+
System.getenv("EXCEPTIONLESS_SAMPLE_APP_SERVER_URL"));
11+
12+
client.getConfigurationManager().useSessions();
13+
14+
client.submitSessionStart();
15+
16+
client.submitException(new RuntimeException("Test exception"));
17+
client.submitUnhandledException(new RuntimeException("Test exception"),"Test submission method");
18+
client.submitFeatureUsage("Test feature");
19+
client.submitLog("Test log");
20+
client.submitNotFound("Test resource");
21+
22+
client.submitSessionEnd("Test user id");
23+
}
24+
}

src/main/java/com/exceptionless/exceptionlessclient/ExceptionlessClient.java

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,29 @@
1111
import com.exceptionless.exceptionlessclient.models.submission.SubmissionResponse;
1212
import com.exceptionless.exceptionlessclient.plugins.EventPluginRunner;
1313
import lombok.Builder;
14+
import lombok.Getter;
15+
import org.slf4j.Logger;
16+
import org.slf4j.LoggerFactory;
1417

1518
import java.time.LocalDate;
1619
import java.util.Timer;
1720
import java.util.TimerTask;
1821

1922
public class ExceptionlessClient {
23+
private static final Logger LOG = LoggerFactory.getLogger(ExceptionlessClient.class);
24+
private static final String UPDATE_SETTINGS_TIMER_NAME = "update-settings-timer";
2025
private static final int UPDATE_SETTINGS_TIMER_INITIAL_DELAY = 5000;
2126

22-
private ConfigurationManager configurationManager;
23-
private EventPluginRunner eventPluginRunner;
24-
private Timer updateSettingsTimer;
27+
@Getter private final ConfigurationManager configurationManager;
28+
private final EventPluginRunner eventPluginRunner;
29+
private final Timer updateSettingsTimer;
2530

2631
@Builder
2732
public ExceptionlessClient(ConfigurationManager configurationManager) {
2833
this.configurationManager = configurationManager;
2934
this.eventPluginRunner =
3035
EventPluginRunner.builder().configurationManager(this.configurationManager).build();
31-
this.updateSettingsTimer = new Timer();
36+
this.updateSettingsTimer = new Timer(UPDATE_SETTINGS_TIMER_NAME);
3237
init();
3338
}
3439

@@ -37,7 +42,11 @@ private void init() {
3742
new TimerTask() {
3843
@Override
3944
public void run() {
40-
configurationManager.getSettingsManager().updateSettingsThreadSafe();
45+
try {
46+
configurationManager.getSettingsManager().updateSettingsThreadSafe();
47+
} catch (Exception e) {
48+
LOG.error("Error in updating settings", e);
49+
}
4150
}
4251
},
4352
UPDATE_SETTINGS_TIMER_INITIAL_DELAY,
@@ -144,14 +153,12 @@ private Event.EventBuilder createEvent() {
144153
}
145154

146155
// todo this should be async
147-
private void submitEvent(EventPluginContext eventPluginContext) {
156+
public void submitEvent(EventPluginContext eventPluginContext) {
148157
eventPluginRunner.run(eventPluginContext);
149158
}
150159

151160
public void submitSessionEnd(String sessionOrUserId) {
152-
configurationManager
153-
.getLog()
154-
.info(String.format("Submitting session end: %s", sessionOrUserId));
161+
LOG.info(String.format("Submitting session end: %s", sessionOrUserId));
155162
configurationManager.getSubmissionClient().sendHeartBeat(sessionOrUserId, true);
156163
}
157164

@@ -164,11 +171,8 @@ public SubmissionResponse updateEmailAndDescription(
164171
referenceId,
165172
UserDescription.builder().description(description).emailAddress(email).build());
166173
if (!response.isSuccess()) {
167-
configurationManager
168-
.getLog()
169-
.error(
170-
String.format(
171-
"Failed to submit user email and description for event: %s", referenceId));
174+
LOG.error(
175+
String.format("Failed to submit user email and description for event: %s", referenceId));
172176
}
173177

174178
return response;

src/main/java/com/exceptionless/exceptionlessclient/configuration/Configuration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class Configuration {
1717
@Getter private Integer submissionBatchSize;
1818
@Getter private Integer submissionClientTimeoutInMillis;
1919
@Getter private Integer settingsClientTimeoutInMillis;
20-
private PropertyChangeSupport propertyChangeSupport;
20+
private final PropertyChangeSupport propertyChangeSupport;
2121

2222
@Builder
2323
public Configuration(

src/main/java/com/exceptionless/exceptionlessclient/configuration/ConfigurationManager.java

Lines changed: 62 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
import com.exceptionless.exceptionlessclient.exceptions.ClientException;
44
import com.exceptionless.exceptionlessclient.lastreferenceidmanager.DefaultLastReferenceIdManager;
55
import com.exceptionless.exceptionlessclient.lastreferenceidmanager.LastReferenceIdManagerIF;
6-
import com.exceptionless.exceptionlessclient.logging.LogIF;
7-
import com.exceptionless.exceptionlessclient.logging.NullLog;
6+
import com.exceptionless.exceptionlessclient.logging.LogCapturerAppender;
7+
import com.exceptionless.exceptionlessclient.logging.LogCapturerIF;
8+
import com.exceptionless.exceptionlessclient.logging.NullLogCapturer;
89
import com.exceptionless.exceptionlessclient.models.EventPluginContext;
910
import com.exceptionless.exceptionlessclient.models.UserInfo;
1011
import com.exceptionless.exceptionlessclient.models.enums.EventPropertyKey;
@@ -22,36 +23,40 @@
2223
import com.exceptionless.exceptionlessclient.submission.SubmissionClientIF;
2324
import lombok.Builder;
2425
import lombok.Getter;
26+
import org.slf4j.Logger;
27+
import org.slf4j.LoggerFactory;
2528

2629
import java.util.*;
2730
import java.util.function.BiConsumer;
2831
import java.util.function.Consumer;
2932

3033
public class ConfigurationManager {
31-
@Getter private EnvironmentInfoCollectorIF environmentInfoCollector;
32-
@Getter private ErrorParserIF errorParser;
33-
@Getter private LastReferenceIdManagerIF lastReferenceIdManager;
34-
@Getter private LogIF log;
35-
@Getter private ModuleCollectorIF moduleCollector;
36-
@Getter private RequestInfoCollectorIF requestInfoCollector;
37-
@Getter private SubmissionClientIF submissionClient;
38-
@Getter private EventQueueIF queue;
39-
@Getter private Configuration configuration;
40-
@Getter private Set<String> defaultTags;
41-
@Getter private Map<String, Object> defaultData;
42-
private List<Consumer<ConfigurationManager>> onChangedHandlers;
43-
@Getter private SettingsManager settingsManager;
44-
@Getter private Set<String> userAgentBotPatterns;
45-
@Getter private PrivateInformationInclusions privateInformationInclusions;
46-
private Set<String> dataExclusions;
47-
private PluginManager pluginManager;
34+
private static final Logger LOG = LoggerFactory.getLogger(ConfigurationManager.class);
35+
36+
@Getter private final EnvironmentInfoCollectorIF environmentInfoCollector;
37+
@Getter private final ErrorParserIF errorParser;
38+
@Getter private final LastReferenceIdManagerIF lastReferenceIdManager;
39+
@Getter private final ModuleCollectorIF moduleCollector;
40+
@Getter private final RequestInfoCollectorIF requestInfoCollector;
41+
@Getter private final SubmissionClientIF submissionClient;
42+
@Getter private final EventQueueIF queue;
43+
@Getter private final Configuration configuration;
44+
@Getter private final Set<String> defaultTags;
45+
@Getter private final Map<String, Object> defaultData;
46+
private final List<Consumer<ConfigurationManager>> onChangedHandlers;
47+
@Getter private final SettingsManager settingsManager;
48+
private final Set<String> userAgentBotPatterns;
49+
@Getter private final PrivateInformationInclusions privateInformationInclusions;
50+
private final Set<String> dataExclusions;
51+
private final PluginManager pluginManager;
52+
@Getter private final StorageProviderIF storageProvider;
4853

4954
@Builder
5055
public ConfigurationManager(
5156
EnvironmentInfoCollectorIF environmentInfoCollector,
5257
ErrorParserIF errorParser,
5358
LastReferenceIdManagerIF lastReferenceIdManager,
54-
LogIF log,
59+
LogCapturerIF logCatpurer,
5560
ModuleCollectorIF moduleCollector,
5661
RequestInfoCollectorIF requestInfoCollector,
5762
SubmissionClientIF submissionClient,
@@ -61,10 +66,9 @@ public ConfigurationManager(
6166
Configuration configuration,
6267
Integer maxQueueItems,
6368
Integer processingIntervalInSecs) {
64-
this.log = log == null ? NullLog.builder().build() : log;
6569
this.environmentInfoCollector =
6670
environmentInfoCollector == null
67-
? DefaultEnvironmentInfoCollector.builder().log(this.log).build()
71+
? DefaultEnvironmentInfoCollector.builder().build()
6872
: environmentInfoCollector;
6973
this.errorParser = errorParser == null ? DefaultErrorParser.builder().build() : errorParser;
7074
this.lastReferenceIdManager =
@@ -75,48 +79,48 @@ public ConfigurationManager(
7579
moduleCollector == null ? DefaultModuleCollector.builder().build() : moduleCollector;
7680
this.requestInfoCollector =
7781
requestInfoCollector == null
78-
? DefaultRequestInfoCollector.builder().log(this.log).build()
82+
? DefaultRequestInfoCollector.builder().build()
7983
: requestInfoCollector;
84+
this.storageProvider =
85+
storageProvider == null
86+
? InMemoryStorageProvider.builder().maxQueueItems(maxQueueItems).build()
87+
: storageProvider;
88+
this.configuration =
89+
configuration == null ? Configuration.defaultConfiguration() : configuration;
8090
this.settingsManager =
8191
SettingsManager.builder()
8292
.settingsClient(
8393
settingsClient == null
8494
? DefaultSettingsClient.builder().configuration(this.configuration).build()
8595
: settingsClient)
86-
.log(log)
96+
.storageProvider(this.storageProvider)
8797
.build();
8898
this.userAgentBotPatterns = new HashSet<>();
89-
this.configuration =
90-
configuration == null ? Configuration.defaultConfiguration() : configuration;
9199
this.submissionClient =
92100
submissionClient == null
93101
? DefaultSubmissionClient.builder()
94102
.settingsManager(this.settingsManager)
95103
.configuration(this.configuration)
96-
.log(this.log)
97104
.build()
98105
: submissionClient;
99106
this.queue =
100107
queue == null
101108
? DefaultEventQueue.builder()
102109
.configuration(this.configuration)
103-
.log(this.log)
104110
.processingIntervalInSecs(processingIntervalInSecs)
105-
.storageProvider(
106-
storageProvider == null
107-
? InMemoryStorageProvider.builder().maxQueueItems(maxQueueItems).build()
108-
: storageProvider)
111+
.storageProvider(this.storageProvider)
109112
.submissionClient(this.submissionClient)
110113
.build()
111114
: queue;
112-
this.pluginManager = PluginManager.builder().log(this.log).build();
115+
this.pluginManager = PluginManager.builder().build();
113116
this.defaultData = new HashMap<>();
114117
this.defaultTags = new HashSet<>();
115118
this.onChangedHandlers = new ArrayList<>();
116119
this.dataExclusions = new HashSet<>();
117120
this.privateInformationInclusions = PrivateInformationInclusions.builder().build();
118-
this.pluginManager = PluginManager.builder().log(this.log).build();
119121
checkApiKeyIsValid();
122+
addPropertyChangeListeners();
123+
addLogCapturer(logCatpurer);
120124
}
121125

122126
private void addPropertyChangeListeners() {
@@ -134,6 +138,18 @@ private void checkApiKeyIsValid() {
134138
String.format("Apikey is not valid: [%s]", this.configuration.getApiKey()));
135139
}
136140

141+
private void addLogCapturer(LogCapturerIF logCatpurer) {
142+
logCatpurer = logCatpurer == null ? NullLogCapturer.builder().build() : logCatpurer;
143+
144+
ch.qos.logback.classic.Logger logBackRootLogger =
145+
(ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
146+
logBackRootLogger.addAppender(LogCapturerAppender.builder().logCapturer(logCatpurer).build());
147+
}
148+
149+
public void addDefaultTags(String... tags) {
150+
defaultTags.addAll(Arrays.asList(tags));
151+
}
152+
137153
public void addDataExclusions(String... exclusions) {
138154
dataExclusions.addAll(Arrays.asList(exclusions));
139155
}
@@ -148,8 +164,15 @@ public Set<String> getDataExclusions() {
148164
return combinedExclusions;
149165
}
150166

167+
public Set<String> getUserAgentBotPatterns() {
168+
Set<String> combinedPatterns =
169+
settingsManager.getSavedServerSettings().getUserAgentBotPatterns();
170+
combinedPatterns.addAll(userAgentBotPatterns);
171+
return combinedPatterns;
172+
}
173+
151174
public void submitSessionHeartbeat(String sessionOrUserId) {
152-
log.info(String.format("Submitting session heartbeat: %s", sessionOrUserId));
175+
LOG.info(String.format("Submitting session heartbeat: %s", sessionOrUserId));
153176
submissionClient.sendHeartBeat(sessionOrUserId, false);
154177
}
155178

@@ -205,12 +228,12 @@ public void setUserIdentity(UserInfo userInfo) {
205228
this.defaultData.put(EventPropertyKey.USER.value(), userInfo);
206229
}
207230

208-
public void useSession() {
231+
public void useSessions() {
209232
useSessions(30000);
210233
}
211234

212-
public void useSessions(int heartbeatInterval) {
213-
addPlugin(HeartbeatPlugin.builder().heartbeatInterval(heartbeatInterval).build());
235+
public void useSessions(int heartbeatIntervalInSecs) {
236+
addPlugin(HeartbeatPlugin.builder().heartbeatIntervalInSecs(heartbeatIntervalInSecs).build());
214237
}
215238

216239
public void onChanged(Consumer<ConfigurationManager> onChangedHandler) {
@@ -222,7 +245,7 @@ private void changed() {
222245
try {
223246
onChangedHandler.accept(this);
224247
} catch (Exception e) {
225-
log.error(String.format("Error calling on changed handler: %s", e.getMessage()), e);
248+
LOG.error(String.format("Error calling on changed handler: %s", e.getMessage()), e);
226249
}
227250
}
228251
}

0 commit comments

Comments
 (0)