Beispiel #1
0
        // 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");
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 static bool ShouldReportResults(DirectMethodResultType resultType, HttpStatusCode statusCode)
 {
     return(!(resultType == DirectMethodResultType.LegacyDirectMethodTestResult && statusCode == HttpStatusCode.NotFound));
 }