// Create reporting result depending on which endpoint is being used. public static TestResultBase ConstructTestResult(DirectMethodResultType directMethodResultType, Guid batchId, ulong counter, HttpStatusCode result) { string source = Settings.Current.ModuleId + ".send"; switch (directMethodResultType) { case DirectMethodResultType.DirectMethodTestResult: return(new DirectMethodTestResult( source, DateTime.UtcNow, Settings.Current.TrackingId.Expect(() => new ArgumentException("TrackingId is empty")), batchId, counter, result)); case DirectMethodResultType.LegacyDirectMethodTestResult: return(new LegacyDirectMethodTestResult( source, DateTime.UtcNow, result.ToString())); default: throw new NotImplementedException("Reporting Endpoint has an unknown type"); } }
public static async Task <int> MainAsync() { Logger.LogInformation($"Starting DirectMethodSender with the following settings:\r\n{Settings.Current}"); (CancellationTokenSource cts, ManualResetEventSlim completed, Option <object> handler) = ShutdownHandler.Init(TimeSpan.FromSeconds(5), Logger); DirectMethodSenderBase directMethodClient = null; ReporterClientBase reportClient = null; try { Guid batchId = Guid.NewGuid(); Logger.LogInformation($"Batch Id={batchId}"); Logger.LogInformation($"DirectMethodSender delay start for {Settings.Current.TestStartDelay}."); await Task.Delay(Settings.Current.TestStartDelay, cts.Token); DateTime testStartAt = DateTime.UtcNow; directMethodClient = await CreateClientAsync(Settings.Current.InvocationSource); reportClient = ReporterClientBase.Create( Logger, Settings.Current.ReportingEndpointUrl, Settings.Current.TransportType); while (!cts.Token.IsCancellationRequested && IsTestTimeUp(testStartAt)) { (HttpStatusCode resultStatusCode, ulong dmCounter) = await directMethodClient.InvokeDirectMethodAsync(Settings.Current.DirectMethodName, cts); DirectMethodResultType resultType = Settings.Current.DirectMethodResultType; if (ShouldReportResults(resultType, resultStatusCode)) { // Generate a testResult type depending on the reporting endpoint TestResultBase testResult = ConstructTestResult( resultType, batchId, dmCounter, resultStatusCode); await reportClient.SendTestResultAsync(testResult); } await Task.Delay(Settings.Current.DirectMethodDelay, cts.Token); } await cts.Token.WhenCanceled(); } catch (Exception e) { Logger.LogError(e, "Error occurred during direct method sender test setup"); } finally { // Implicit CloseAsync() directMethodClient?.Dispose(); reportClient?.Dispose(); } completed.Set(); handler.ForEach(h => GC.KeepAlive(h)); Logger.LogInformation("DirectMethodSender Main() finished."); return(0); }
static bool ShouldReportResults(DirectMethodResultType resultType, HttpStatusCode statusCode) { return(!(resultType == DirectMethodResultType.LegacyDirectMethodTestResult && statusCode == HttpStatusCode.NotFound)); }