示例#1
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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()));
        }
示例#7
0
        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);
        }
示例#11
0
        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);
        }
示例#12
0
        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()));
        }
示例#13
0
        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
        }
示例#14
0
        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
        }
示例#15
0
        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);
        }
示例#16
0
        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);
        }