public async Task SetUserIdTest() { AppCenter.UnsetInstance(); Crashes.UnsetInstance(); // Set up HttpNetworkAdapter. var typeEvent = "handledError"; var httpNetworkAdapter = new HttpNetworkAdapter(); DependencyConfiguration.HttpNetworkAdapter = httpNetworkAdapter; var startServiceTask = httpNetworkAdapter.MockRequestByLogType("startService"); var eventTask = httpNetworkAdapter.MockRequestByLogType(typeEvent); // Start App Center. AppCenter.LogLevel = LogLevel.Verbose; AppCenter.Start(Config.ResolveAppSecret(), typeof(Crashes)); var userId = "I-am-test-user-id"; AppCenter.SetUserId(userId); Crashes.TrackError(new Exception("The answert is 42")); // Wait for "startService" log to be sent. await startServiceTask; // Wait for processing event. RequestData requestData = await eventTask; var events = requestData.JsonContent?.SelectTokens($"$.logs[?(@.type == '{typeEvent}')]").ToList(); Assert.Equal(1, events?.Count()); var userIdFromLog = events?[0]["userId"]; Assert.Equal(userIdFromLog, userId); }
public async Task TrackErrorTest() { AppCenter.UnsetInstance(); Crashes.UnsetInstance(); // Set up HttpNetworkAdapter. var typeEvent = "handledError"; var httpNetworkAdapter = new HttpNetworkAdapter(); DependencyConfiguration.HttpNetworkAdapter = httpNetworkAdapter; var startServiceTask = httpNetworkAdapter.MockRequestByLogType("startService"); var eventTask = httpNetworkAdapter.MockRequestByLogType(typeEvent); // Start App Center. AppCenter.LogLevel = LogLevel.Verbose; AppCenter.Start(Config.ResolveAppSecret(), typeof(Crashes)); // Wait for "startService" log to be sent. await startServiceTask; // Check track error without attachments. Crashes.TrackError(new Exception("The answert is 1")); RequestData requestData = await eventTask; var events = requestData.JsonContent.SelectTokens($"$.logs[?(@.type == '{typeEvent}')]").ToList(); Assert.Single(events); }
public async Task TrackEventWithoutPropertiesAsync() { // Set up HttpNetworkAdapter. var httpNetworkAdapter = new HttpNetworkAdapter(expectedLogType: "event"); DependencyConfiguration.HttpNetworkAdapter = httpNetworkAdapter; // Start App Center. AppCenter.UnsetInstance(); Analytics.UnsetInstance(); AppCenter.LogLevel = LogLevel.Verbose; AppCenter.Start(_appSecret, typeof(Analytics)); // Test TrackEvent. Analytics.TrackEvent("Hello World"); // Wait for processing event. await httpNetworkAdapter.HttpResponseTask; // Verify. The start session can be in same batch as the event HTTP request so look for it inside. Assert.Equal("POST", httpNetworkAdapter.Method); var eventLogs = httpNetworkAdapter.JsonContent.SelectTokens($"$.logs[?(@.type == 'event')]").ToList(); Assert.Equal(1, eventLogs.Count()); var eventLog = eventLogs[0]; var actualEventName = (string)eventLog["name"]; Assert.Equal("Hello World", actualEventName); var typedProperties = eventLog["typedProperties"]; Assert.Null(typedProperties); Assert.Equal(1, httpNetworkAdapter.CallCount); }
public void EnableTls12WhenAlreadyEnabled() { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; HttpNetworkAdapter.EnableTls12(); // Just check no side effect. Assert.Equal(SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12, ServicePointManager.SecurityProtocol); }
public void EnableTls12WhenDisabled() { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11; HttpNetworkAdapter.EnableTls12(); // Check protocol was added, not the whole value overridden. Assert.Equal(SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12, ServicePointManager.SecurityProtocol); }
public async Task CheckForUpdateTest(UpdateTrack updateTrack, string urlDiff) { // Enable Distribute for debuggable builds. DistributeEvent?.Invoke(this, DistributeTestType.EnableDebuggableBuilds); // Setup network adapter. var httpNetworkAdapter = new HttpNetworkAdapter(); DependencyConfiguration.HttpNetworkAdapter = httpNetworkAdapter; HttpResponse response = new HttpResponse() { Content = GetReleaseJson("30", "3.0.0", false, 19), StatusCode = 200 }; var implicitCheckForUpdateTask = httpNetworkAdapter.MockRequest(request => request.Method == "GET"); var explicitCheckForUpdateTask = httpNetworkAdapter.MockRequest(request => request.Method == "GET", response); var startServiceTask = httpNetworkAdapter.MockRequestByLogType("startService"); // Start AppCenter. AppCenter.UnsetInstance(); AppCenter.LogLevel = LogLevel.Verbose; Distribute.UpdateTrack = updateTrack; // Save update token. if (updateTrack == UpdateTrack.Private) { DistributeEvent?.Invoke(this, DistributeTestType.SaveMockUpdateToken); } AppCenter.Start(Config.ResolveAppSecret(), typeof(Distribute)); // Wait for "startService" log to be sent. await startServiceTask; DistributeEvent?.Invoke(this, DistributeTestType.OnResumeActivity); // Wait when Distribute will start. await Distribute.IsEnabledAsync(); // Wait for processing event. var result = await implicitCheckForUpdateTask; // Verify response. Assert.Equal("GET", result.Method); Assert.True(result.Uri.Contains(urlDiff)); Assert.True(result.Uri.Contains(Config.ResolveAppSecret())); // Check for update. Distribute.CheckForUpdate(); // Wait for processing event. result = await explicitCheckForUpdateTask; // Verify response. Assert.Equal("GET", result.Method); Assert.True(result.Uri.Contains(urlDiff)); Assert.True(result.Uri.Contains(Config.ResolveAppSecret())); }
public async Task CheckForUpdateTest(UpdateTrack updateTrack, string urlDiff) { // Enable Distribute for debuggable builds. DistributeEvent?.Invoke(this, DistributeTestType.EnableDebuggableBuilds); // Setup network adapter. var httpNetworkAdapter = new HttpNetworkAdapter(); DependencyConfiguration.HttpNetworkAdapter = httpNetworkAdapter; var implicitCheckForUpdateTask = httpNetworkAdapter.MockRequest(request => request.Method == "GET" && request.Uri.Contains(urlDiff)); var startServiceTask = httpNetworkAdapter.MockRequestByLogType("startService"); // Start AppCenter. AppCenter.UnsetInstance(); AppCenter.LogLevel = LogLevel.Verbose; Distribute.UpdateTrack = updateTrack; // Save update token. if (updateTrack == UpdateTrack.Private) { DistributeEvent?.Invoke(this, DistributeTestType.SaveMockUpdateToken); } AppCenter.Start(Config.ResolveAppSecret(), typeof(Distribute)); // Wait for "startService" log to be sent. await startServiceTask; DistributeEvent?.Invoke(this, DistributeTestType.OnResumeActivity); // Wait when Distribute will start. await Distribute.IsEnabledAsync(); // Wait for processing event. var resultImplicit = await implicitCheckForUpdateTask; // Verify response. Assert.Equal("GET", resultImplicit.Method); Assert.Contains(urlDiff, resultImplicit.Uri); Assert.Contains(Config.ResolveAppSecret(), resultImplicit.Uri); // Wait a 5s for give time to complete internal processes // to avoid this case `A check for update is already ongoing.` await Task.Delay(5000); // Check for update. var explicitCheckForUpdateTask = httpNetworkAdapter.MockRequest(request => request.Method == "GET" && request.Uri.Contains(urlDiff)); Distribute.CheckForUpdate(); // Wait for processing event. var resultExplicit = await explicitCheckForUpdateTask; // Verify response. Assert.Equal("GET", resultExplicit.Method); Assert.Contains(urlDiff, resultExplicit.Uri); Assert.Contains(Config.ResolveAppSecret(), resultExplicit.Uri); }
public void EnableTls12WhenDisabled() { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11; var httpClientHandler = HttpNetworkAdapter.HttpMessageHandlerOverride() as HttpClientHandler; Assert.NotNull(httpClientHandler); // Check protocol was added, not the whole value overridden. Assert.Equal(SslProtocols.Tls12, httpClientHandler.SslProtocols); Assert.Equal(ServicePointManager.SecurityProtocol, SecurityProtocolType.Tls | SecurityProtocolType.Tls11); }
private static IIngestion DefaultIngestion(IHttpNetworkAdapter httpNetwork = null, INetworkStateAdapter networkState = null) { if (httpNetwork == null) { httpNetwork = new HttpNetworkAdapter(); } if (networkState == null) { networkState = new NetworkStateAdapter(); } return(new NetworkStateIngestion(new RetryableIngestion(new IngestionHttp(httpNetwork)), networkState)); }
public void EnableTls12WhenAlreadyEnabled() { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; var httpClientHandler = HttpNetworkAdapter.HttpMessageHandlerOverride() as HttpClientHandler; // Check HTTP handler protocol. Assert.NotNull(httpClientHandler); Assert.Equal(SslProtocols.Tls12, httpClientHandler.SslProtocols); // Just check no side effect. Assert.Equal(SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12, ServicePointManager.SecurityProtocol); }
public async Task TrackEventWithPropertiesAsync() { // Set up HttpNetworkAdapter. var typeEvent = "event"; var httpNetworkAdapter = new HttpNetworkAdapter(); DependencyConfiguration.HttpNetworkAdapter = httpNetworkAdapter; var startServiceTask = httpNetworkAdapter.MockRequestByLogType("startService"); var eventTask = httpNetworkAdapter.MockRequestByLogType(typeEvent); // Start App Center. AppCenter.UnsetInstance(); Analytics.UnsetInstance(); AppCenter.LogLevel = LogLevel.Verbose; AppCenter.Start(Config.ResolveAppSecret(), typeof(Analytics)); // Wait for "startService" log to be sent. await startServiceTask; // Build event properties. var properties = new Dictionary <string, string> { { "Key1", "Value1" }, { "Key2", "Value2" }, { "Key3", "Value3" } }; // Test TrackEvent. Analytics.TrackEvent("Hello World", properties); // Wait for processing event. RequestData requestData = await eventTask; // Verify. The start session can be in same batch as the event HTTP request so look for it inside. Assert.Equal("POST", requestData.Method); var eventLogs = requestData.JsonContent.SelectTokens($"$.logs[?(@.type == '{typeEvent}')]").ToList(); Assert.Equal(1, eventLogs.Count()); var eventLog = eventLogs[0]; var actualEventName = (string)eventLog["name"]; Assert.Equal("Hello World", actualEventName); var typedProperties = eventLog["typedProperties"]; Assert.NotNull(typedProperties); Assert.Equal(3, typedProperties.Count()); for (var i = 1; i <= 3; i++) { Assert.NotNull(typedProperties.SelectToken($"[?(@.name == 'Key{i}' && @.value == 'Value{i}')]")); } Assert.Equal(2, httpNetworkAdapter.CallCount); }
public async Task DisableAuthomaticCheckUpdateTest() { // Enable Distribute for debuggable builds. DistributeEvent?.Invoke(this, DistributeTestType.EnableDebuggableBuilds); // Setup network adapter. var httpNetworkAdapter = new HttpNetworkAdapter(); DependencyConfiguration.HttpNetworkAdapter = httpNetworkAdapter; HttpResponse response = new HttpResponse() { Content = GetReleaseJson("30", "3.0.0", false, 19), StatusCode = 200 }; var explicitCheckForUpdateTask = httpNetworkAdapter.MockRequest(request => request.Method == "GET", response, 30); var startServiceTask = httpNetworkAdapter.MockRequestByLogType("startService"); // Start AppCenter. AppCenter.UnsetInstance(); AppCenter.LogLevel = LogLevel.Verbose; Distribute.DisableAutomaticCheckForUpdate(); AppCenter.Start(Config.ResolveAppSecret(), typeof(Distribute)); // Wait for "startService" log to be sent. await startServiceTask; Assert.Equal(1, httpNetworkAdapter.CallCount); DistributeEvent?.Invoke(this, DistributeTestType.OnResumeActivity); // Wait when Distribute will start. await Distribute.IsEnabledAsync(); // Wait a 5s and verify that we will not have new calls. await Task.Delay(5000); Assert.Equal(1, httpNetworkAdapter.CallCount); // Check for update. Distribute.CheckForUpdate(); // Wait for processing event. var result = await explicitCheckForUpdateTask; // Verify response. Assert.Equal(2, httpNetworkAdapter.CallCount); Assert.Equal("GET", result.Method); Assert.True(result.Uri.Contains("releases/latest")); Assert.True(result.Uri.Contains(Config.ResolveAppSecret())); }
public void EnableTls12WhenAlreadyEnabled() { #if NET461 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; // Init http adapter. var httpAdapter = new HttpNetworkAdapter(); // Just check no side effect. Assert.Equal(SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12, ServicePointManager.SecurityProtocol); // Dispose http atapter. httpAdapter.Dispose(); #else Debug.WriteLine("Skip test for .netcore target framework."); #endif }
public void EnableTls12WhenDisabled() { #if NET461 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11; // Init http adapter. var httpAdapter = new HttpNetworkAdapter(); // Check protocol was added, not the whole value overridden. Assert.Equal(SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12, ServicePointManager.SecurityProtocol); // Dispose http atapter. httpAdapter.Dispose(); #else Debug.WriteLine("Skip test for .netcore target framework."); #endif }
public async Task SetUpdateTrackPrivateTest() { // Enable Distribute for debuggable builds. DistributeEvent?.Invoke(this, DistributeTestType.EnableDebuggableBuilds); // Save data to preference. DistributeEvent?.Invoke(this, DistributeTestType.CheckUpdateAsync); // Setup network adapter. var httpNetworkAdapter = new HttpNetworkAdapter(); DependencyConfiguration.HttpNetworkAdapter = httpNetworkAdapter; var eventTask = httpNetworkAdapter.MockRequest(request => request.Method == "GET"); var startServiceTask = httpNetworkAdapter.MockRequestByLogType("startService"); // Start AppCenter. AppCenter.UnsetInstance(); AppCenter.LogLevel = LogLevel.Verbose; Distribute.UpdateTrack = UpdateTrack.Private; // MockUpdateToken. DistributeEvent?.Invoke(this, DistributeTestType.SaveMockUpdateToken); AppCenter.Start(Config.ResolveAppSecret(), typeof(Distribute)); // Wait for "startService" log to be sent. await startServiceTask; DistributeEvent?.Invoke(this, DistributeTestType.OnResumeActivity); // Wait when Distribute will start. await Distribute.IsEnabledAsync(); // Wait for processing event. var result = await eventTask; // Verify response. Assert.Equal("GET", result.Method); Assert.DoesNotContain("public", result.Uri); Assert.Contains("releases/private/latest?release_hash", result.Uri); Assert.Contains(Config.ResolveAppSecret(), result.Uri); // Clear. DistributeEvent?.Invoke(this, DistributeTestType.Clear); }
public async Task TrackEventMulticlickFlowAsync() { var typeEvent = "event"; var httpNetworkAdapter = new HttpNetworkAdapter(); DependencyConfiguration.HttpNetworkAdapter = httpNetworkAdapter; var startServiceTask = httpNetworkAdapter.MockRequestByLogType("startService"); var eventTask = httpNetworkAdapter.MockRequestByLogType(typeEvent); // Start App Center. AppCenter.UnsetInstance(); Analytics.UnsetInstance(); AppCenter.LogLevel = LogLevel.Verbose; AppCenter.Start(Config.ResolveAppSecret(), typeof(Analytics)); // Wait for "startService" log to be sent. await startServiceTask; Assert.Equal(1, httpNetworkAdapter.CallCount); // Pause Analytics module. Analytics.Pause(); // Test TrackEvents. Analytics.TrackEvent("TrackEvent 1"); Analytics.TrackEvent("TrackEvent 2"); Analytics.TrackEvent("TrackEvent 3"); // Pause Analytics module again. Analytics.Pause(); // Wait for 5 seconds to allow batching happen (3 seconds), and verify nothing has been sent. Task.WaitAny(eventTask, Task.Delay(5000)); Assert.Equal(1, httpNetworkAdapter.CallCount); // Resume Analytics module. Analytics.Resume(); // Wait for processing event. var result = await eventTask; // Verify. The start session can be in same batch as the event HTTP request so look for it inside. Assert.Equal("POST", result.Method); var eventLogs = result.JsonContent.SelectTokens($"$.logs[?(@.type == '{typeEvent}')]").ToList(); // Check that the first event was sent. var actualEventName = (string)eventLogs[0]["name"]; Assert.Equal("TrackEvent 1", actualEventName); var typedProperties = eventLogs[0]["typedProperties"]; Assert.Null(typedProperties); // Check that the second event was sent. actualEventName = (string)eventLogs[1]["name"]; Assert.Equal("TrackEvent 2", actualEventName); typedProperties = eventLogs[1]["typedProperties"]; Assert.Null(typedProperties); // Check that the third event was sent. actualEventName = (string)eventLogs[2]["name"]; Assert.Equal("TrackEvent 3", actualEventName); typedProperties = eventLogs[2]["typedProperties"]; Assert.Null(typedProperties); // Check count calls. Assert.Equal(2, httpNetworkAdapter.CallCount); }
public async Task CustomPropertiesClearTest() { // Set up HttpNetworkAdapter. var typeProperty = "customProperties"; var httpNetworkAdapter = new HttpNetworkAdapter(); DependencyConfiguration.HttpNetworkAdapter = httpNetworkAdapter; var startServiceTask = httpNetworkAdapter.MockRequestByLogType("startService"); var customPropertiesTask = httpNetworkAdapter.MockRequestByLogType(typeProperty); // Start App Center. AppCenter.UnsetInstance(); Analytics.UnsetInstance(); AppCenter.LogLevel = LogLevel.Verbose; AppCenter.Start(Config.ResolveAppSecret(), typeof(Analytics)); // Wait for "startService" log to be sent. await startServiceTask; // Enable Appcenter. await AppCenter.SetEnabledAsync(true); // Verify enabled. var isEnabled = await AppCenter.IsEnabledAsync(); var isEnabledAnalytics = await Analytics.IsEnabledAsync(); Assert.True(isEnabled); Assert.True(isEnabledAnalytics); // Set custom properties. var propertiesDictionary = new Dictionary <string, object> { { "keyBoolean", true }, { "keyString", "value" }, { "keyInt", 42 }, { "keyDateTime", new DateTime() }, }; // Clear custom properties. var customPropertiesClear = new CustomProperties(); foreach (var item in propertiesDictionary) { customPropertiesClear.Clear(item.Key); } AppCenter.SetCustomProperties(customPropertiesClear); // Wait for processing event. RequestData requestData = await customPropertiesTask; Assert.Equal("POST", requestData.Method); var eventLogsClear = requestData.JsonContent.SelectTokens($"$.logs[?(@.type == '{typeProperty}')]").ToList(); // Verify the log sctructure. Assert.Equal(1, eventLogsClear.Count()); var eventLogClear = eventLogsClear[0]; var propertiesClear = eventLogClear["properties"]; Assert.NotNull(propertiesClear); Assert.Equal(4, propertiesClear.Count()); // Verify initial dictionary has the values. foreach (var item in propertiesClear) { Assert.Equal((string)item.SelectToken("type"), "clear"); } Assert.Equal(2, httpNetworkAdapter.CallCount); }
public async Task EnableDisableTest() { var httpNetworkAdapter = new HttpNetworkAdapter(); DependencyConfiguration.HttpNetworkAdapter = httpNetworkAdapter; var startServiceTask = httpNetworkAdapter.MockRequestByLogType("startService"); var startServiceTask2 = httpNetworkAdapter.MockRequestByLogType("startService"); var startServiceTask3 = httpNetworkAdapter.MockRequestByLogType("startService"); // Start App Center. AppCenter.UnsetInstance(); Analytics.UnsetInstance(); AppCenter.LogLevel = LogLevel.Verbose; AppCenter.Start(Config.ResolveAppSecret(), typeof(Analytics)); // Wait for "startService" log to be sent. Task.WaitAny(startServiceTask, Task.Delay(5000)); // Disable Appcenter. await AppCenter.SetEnabledAsync(false); // On iOS when set disabled all appcenter logs are removing from DB. We should wait here otherwise there might be a deadlock. Task.Delay(3000).Wait(); // Verify disabled. var isEnabled = await AppCenter.IsEnabledAsync(); var isEnabledAnalytics = await Analytics.IsEnabledAsync(); Assert.False(isEnabled); Assert.False(isEnabledAnalytics); // Restart SDK. AppCenter.UnsetInstance(); Analytics.UnsetInstance(); AppCenter.LogLevel = LogLevel.Verbose; AppCenter.Start(Config.ResolveAppSecret(), typeof(Analytics)); // On iOS when started in disabled mode SDK will try to remove all pending logs. We should wait here otherwise there might be a deadlock. Task.Delay(3000).Wait(); // Verify disabled. var isEnabled2 = await AppCenter.IsEnabledAsync(); var isEnabledAnalytics2 = await Analytics.IsEnabledAsync(); Assert.False(isEnabled2); Assert.False(isEnabledAnalytics2); // Enable SDK. await AppCenter.SetEnabledAsync(true); // Wait for "startService" log to be sent. Task.WaitAny(startServiceTask2, Task.Delay(5000)); // Verify enabled. var isEnabled3 = await AppCenter.IsEnabledAsync(); var isEnabledAnalytics3 = await Analytics.IsEnabledAsync(); Assert.True(isEnabled3); Assert.True(isEnabledAnalytics3); // Restart SDK. AppCenter.UnsetInstance(); Analytics.UnsetInstance(); AppCenter.LogLevel = LogLevel.Verbose; AppCenter.Start(Config.ResolveAppSecret(), typeof(Analytics)); // Wait for "startService" log to be sent. Task.WaitAny(startServiceTask3, Task.Delay(5000)); // Verify enabled. var isEnabled4 = await AppCenter.IsEnabledAsync(); var isEnabledAnalytics4 = await Analytics.IsEnabledAsync(); Assert.True(isEnabled4); Assert.True(isEnabledAnalytics4); }