public void DistributedTracePayload_RoundTrip(
            [Values("App", "Mobile")] string type,
            [Values("12345")] string accountId,
            [Values("1111")] string appId,
            [Random(0ul, 0xfffffffffffffffful, 1), Values(ulong.MinValue, ulong.MaxValue)] ulong parentId,
            [Random(0ul, 0xfffffffffffffffful, 1), Values(ulong.MinValue, ulong.MaxValue)] ulong guid,
            [Random(0ul, 0xfffffffffffffffful, 1), Values(ulong.MinValue, ulong.MaxValue)] ulong traceId,
            [Values("56789")] string trustKey,
            [Random(0f, 1.0f, 1), Values(0.0f, 1.0f, 0.1234567f)] float priority,
            [Values(true, false)] bool sampled,
            [Values(new[] { 1970, 1, 1, 0, 0, 1 }, new[] { 2018, 12, 31, 23, 59, 59 })] int[] time,
            [Random(0ul, 0xfffffffffffffffful, 1), Values(ulong.MinValue, ulong.MaxValue)] ulong _transactionId)
        {
            var input = DistributedTracePayload.TryBuildOutgoingPayload(type, accountId, appId, $"{guid:X8}", $"{traceId:X8}", trustKey, priority, sampled,
                                                                        new DateTime(time[0], time[1], time[2], time[3], time[4], time[5], DateTimeKind.Utc), $"{_transactionId:X8}");
            var serialized   = input.ToJson();
            var deserialized = DistributedTracePayload.TryBuildIncomingPayloadFromJson(serialized);

            Assert.That(deserialized.Version, Is.Not.Null);
            Assert.That(deserialized.Version, Has.Exactly(2).Items);
            Assert.That(deserialized.Version[0], Is.EqualTo(0));
            Assert.That(deserialized.Version[1], Is.EqualTo(1));

            Assert.That(deserialized.Type, Is.EqualTo(input.Type));
            Assert.That(deserialized.AccountId, Is.EqualTo(input.AccountId));
            Assert.That(deserialized.AppId, Is.EqualTo(input.AppId));
            Assert.That(deserialized.Guid, Is.EqualTo(input.Guid));
            Assert.That(deserialized.TraceId, Is.EqualTo(input.TraceId));
            Assert.That(deserialized.TrustKey, Is.EqualTo(input.TrustKey));
            Assert.That(deserialized.Sampled, Is.EqualTo(input.Sampled));
            Assert.That(deserialized.Timestamp, Is.EqualTo(input.Timestamp));
            Assert.That(deserialized.TransactionId, Is.EqualTo(input.TransactionId));
        }
        public void DistributedTracePayloadWithZeroBasedTimestampThrows()
        {
            var type          = "App";
            var accountId     = "12345";
            var appId         = "1111";
            var parentId      = $"{0xfffffffffffffffful:X9}";
            var guid          = $"{0xfffffffffffffffful:X9}";
            var traceId       = $"{0xfffffffffffffffful:X9}";
            var trustKey      = "56789";
            var priority      = 0f;
            var sampled       = true;
            var time          = new int[] { 1970, 1, 1, 0, 0, 0 };
            var timestamp     = new DateTime(time[0], time[1], time[2], time[3], time[4], time[5], DateTimeKind.Utc);
            var transactionId = $"{0xfffffffffffffffful:X9}";

            var input      = DistributedTracePayload.TryBuildOutgoingPayload(type, accountId, appId, $"{guid:X8}", $"{traceId:X8}", trustKey, priority, sampled, timestamp, transactionId);
            var serialized = input.ToJson();

            Assert.Throws <DistributedTraceAcceptPayloadParseException>(() => DistributedTracePayload.TryBuildIncomingPayloadFromJson(serialized));
        }
 public void DistributedTracePayload_OptionalAndRequired(string json, IConstraint constraint)
 {
     Assert.That(() => DistributedTracePayload.TryBuildIncomingPayloadFromJson(json), constraint);
 }