public void IsEventDataEquivalentDetectsDifferentBodies()
        {
            var trackOneEvent = new TrackOne.EventData(new byte[] { 0x22, 0x44 });
            var trackTwoEvent = new EventData(new byte[] { 0x11, 0x33 });

            Assert.That(TrackOneComparer.IsEventDataEquivalent(trackOneEvent, trackTwoEvent), Is.False);
        }
Example #2
0
        public void IsEventDataEquivalentDetectsEqualEvents()
        {
            var body   = new byte[] { 0x22, 0x44, 0x88 };
            var offset = 27;
            var trackTwoSystemProperties = new Dictionary <string, object>();

            var trackTwoEvent = new EventData(
                eventBody: (byte[])body.Clone(),
                offset: offset,
                systemProperties: trackTwoSystemProperties,
                lastPartitionSequenceNumber: 9765551212,
                lastPartitionOffset: 54321,
                lastPartitionEnqueuedTime: DateTimeOffset.Parse("2015-10-27T00:00:00Z"));

            trackTwoEvent.Properties["test"] = "same";

            var trackOneEvent = new TrackOne.EventData((byte[])body.Clone());

            trackOneEvent.Properties["test"] = trackTwoEvent.Properties["test"];
            trackOneEvent.SystemProperties   = new TrackOne.EventData.SystemPropertiesCollection();
            trackOneEvent.SystemProperties[TrackOne.ClientConstants.OffsetName] = offset.ToString();
            trackOneEvent.LastEnqueuedOffset = trackTwoEvent.LastPartitionOffset.ToString();
            trackOneEvent.LastSequenceNumber = trackTwoEvent.LastPartitionSequenceNumber.Value;
            trackOneEvent.LastEnqueuedTime   = trackTwoEvent.LastPartitionEnqueuedTime.Value.UtcDateTime;

            Assert.That(TrackOneComparer.IsEventDataEquivalent(trackOneEvent, trackTwoEvent), Is.True);
        }
Example #3
0
 static EventData TransformEvent(TrackOne.EventData eventData) =>
 new EventData(eventData.Body,
               eventData.Properties,
               eventData.SystemProperties.WithoutTypedMembers(),
               eventData.SystemProperties.SequenceNumber,
               Int64.Parse(eventData.SystemProperties.Offset),
               new DateTimeOffset(eventData.SystemProperties.EnqueuedTimeUtc),
               eventData.SystemProperties.PartitionKey);
        public void IsEventDataEquivalentDetectsWhenOnePropertySetIsNull()
        {
            var body          = new byte[] { 0x22, 0x44, 0x88 };
            var trackOneEvent = new TrackOne.EventData((byte[])body.Clone());
            var trackTwoEvent = new EventData((byte[])body.Clone());

            trackOneEvent.Properties         = null;
            trackTwoEvent.Properties["test"] = "trackTwo";

            Assert.That(TrackOneComparer.IsEventDataEquivalent(trackOneEvent, trackTwoEvent), Is.False);
        }
Example #5
0
 static EventData TransformEvent(TrackOne.EventData eventData) =>
 new EventData(eventData.Body)
 {
     Properties       = eventData.Properties,
     SystemProperties = new EventData.SystemEventProperties
     {
         SequenceNumber = eventData.SystemProperties.SequenceNumber,
         EnqueuedTime   = new DateTimeOffset(eventData.SystemProperties.EnqueuedTimeUtc),
         Offset         = Int64.Parse(eventData.SystemProperties.Offset),
         PartitionKey   = eventData.SystemProperties.PartitionKey
     }
 };
Example #6
0
 static EventData TransformEvent(TrackOne.EventData eventData) =>
 new EventData(eventData.Body)
 {
     Properties       = eventData.Properties,
     SystemProperties = new EventData.SystemEventProperties
                        (
         eventData.SystemProperties.SequenceNumber,
         eventData.SystemProperties.EnqueuedTimeUtc,
         eventData.SystemProperties.Offset,
         eventData.SystemProperties.PartitionKey
                        )
 };
        public void IsEventDataEquivalentDetectsWhenOneSystemPropertySetIsNull()
        {
            var body          = new byte[] { 0x22, 0x44, 0x88 };
            var trackOneEvent = new TrackOne.EventData((byte[])body.Clone());
            var trackTwoEvent = new EventData((byte[])body.Clone());

            trackOneEvent.SystemProperties = new TrackOne.EventData.SystemPropertiesCollection();
            trackOneEvent.SystemProperties["something"] = "trackOne";

            trackTwoEvent.SystemProperties = null;

            Assert.That(TrackOneComparer.IsEventDataEquivalent(trackOneEvent, trackTwoEvent), Is.False);
        }
        public void IsEventDataEquivalentDetectsDifferentSystemProperties()
        {
            var body          = new byte[] { 0x22, 0x44, 0x88 };
            var trackOneEvent = new TrackOne.EventData((byte[])body.Clone());
            var trackTwoEvent = new EventData((byte[])body.Clone());

            trackOneEvent.SystemProperties = new TrackOne.EventData.SystemPropertiesCollection();
            trackOneEvent.SystemProperties[TrackOne.ClientConstants.OffsetName] = "4";

            trackTwoEvent.SystemProperties        = new EventData.SystemEventProperties();
            trackTwoEvent.SystemProperties.Offset = 27;

            Assert.That(TrackOneComparer.IsEventDataEquivalent(trackOneEvent, trackTwoEvent), Is.False);
        }
Example #9
0
        public void IsEventDataEquivalentDetectsDifferentSystemPropertiesWithMissingTypedMember()
        {
            var body = new byte[] { 0x22, 0x44, 0x88 };
            var trackTwoSystemProperties = new Dictionary <string, object>();

            var trackTwoEvent = new EventData(
                eventBody: (byte[])body.Clone(),
                systemProperties: trackTwoSystemProperties);

            var trackOneEvent = new TrackOne.EventData((byte[])body.Clone());

            trackOneEvent.SystemProperties = new TrackOne.EventData.SystemPropertiesCollection();
            trackOneEvent.SystemProperties[TrackOne.ClientConstants.OffsetName] = "4";

            Assert.That(TrackOneComparer.IsEventDataEquivalent(trackOneEvent, trackTwoEvent), Is.False);
        }
        public void IsEventDataEquivalentDetectsEqualEvents()
        {
            var body          = new byte[] { 0x22, 0x44, 0x88 };
            var trackOneEvent = new TrackOne.EventData((byte[])body.Clone());
            var trackTwoEvent = new EventData((byte[])body.Clone());

            trackOneEvent.Properties["test"] = "same";
            trackTwoEvent.Properties["test"] = "same";

            trackOneEvent.SystemProperties = new TrackOne.EventData.SystemPropertiesCollection();
            trackOneEvent.SystemProperties["something"] = "otherSame";

            trackTwoEvent.SystemProperties = new EventData.SystemEventProperties();
            trackTwoEvent.SystemProperties["something"] = "otherSame";

            Assert.That(TrackOneComparer.IsEventDataEquivalent(trackOneEvent, trackTwoEvent), Is.True);
        }
Example #11
0
            static EventData TransformEvent(TrackOne.EventData eventData)
            {
                if (!Int64.TryParse(eventData.LastEnqueuedOffset, out var parsedLastOffset))
                {
                    parsedLastOffset = -1;
                }

                return(new EventData(eventData.Body,
                                     eventData.Properties,
                                     eventData.SystemProperties.WithoutTypedMembers(),
                                     eventData.SystemProperties.SequenceNumber,
                                     Int64.Parse(eventData.SystemProperties.Offset),
                                     new DateTimeOffset(eventData.SystemProperties.EnqueuedTimeUtc),
                                     eventData.SystemProperties.PartitionKey,
                                     (eventData.LastSequenceNumber != default ? eventData.LastSequenceNumber : default(long?)),
                                     (parsedLastOffset >= 0 ? parsedLastOffset : default(long?)),
                                     (eventData.LastEnqueuedTime != default ? new DateTimeOffset(eventData.LastEnqueuedTime) : default(DateTimeOffset?))));
            }
Example #12
0
        public void IsEventDataEquivalentDetectsDifferentSystemPropertiesWithMapMember()
        {
            var body                     = new byte[] { 0x22, 0x44, 0x88 };
            var propertyName             = "Something";
            var trackTwoSystemProperties = new Dictionary <string, object>();

            var trackTwoEvent = new EventData(
                eventBody: (byte[])body.Clone(),
                systemProperties: trackTwoSystemProperties);

            trackTwoSystemProperties[propertyName] = nameof(trackTwoSystemProperties);

            var trackOneEvent = new TrackOne.EventData((byte[])body.Clone());

            trackOneEvent.SystemProperties = new TrackOne.EventData.SystemPropertiesCollection();
            trackOneEvent.SystemProperties[propertyName] = nameof(trackOneEvent);

            Assert.That(TrackOneComparer.IsEventDataEquivalent(trackOneEvent, trackTwoEvent), Is.False);
        }
Example #13
0
        public void IsEventDataEquivalentDetectsDifferentSystemPropertiesMismatchedMembers()
        {
            var body                     = new byte[] { 0x22, 0x44, 0x88 };
            var propertyValue            = "one";
            var trackTwoSystemProperties = new Dictionary <string, object>();

            var trackTwoEvent = new EventData(
                eventBody: (byte[])body.Clone(),
                systemProperties: trackTwoSystemProperties);

            trackTwoSystemProperties["two"] = propertyValue;

            var trackOneEvent = new TrackOne.EventData((byte[])body.Clone());

            trackOneEvent.SystemProperties        = new TrackOne.EventData.SystemPropertiesCollection();
            trackOneEvent.SystemProperties["one"] = propertyValue;

            Assert.That(TrackOneComparer.IsEventDataEquivalent(trackOneEvent, trackTwoEvent), Is.False);
        }
        public void IsEventDataEquivalentDetectsEqualEvents()
        {
            var body   = new byte[] { 0x22, 0x44, 0x88 };
            var offset = 27;
            var trackTwoSystemProperties = new Dictionary <string, object>();

            var trackTwoEvent = new EventData(
                eventBody: (byte[])body.Clone(),
                offset: offset,
                systemProperties: trackTwoSystemProperties);

            var trackOneEvent = new TrackOne.EventData((byte[])body.Clone());

            trackOneEvent.Properties["test"] = "same";
            trackTwoEvent.Properties["test"] = "same";
            trackOneEvent.SystemProperties   = new TrackOne.EventData.SystemPropertiesCollection();
            trackOneEvent.SystemProperties[TrackOne.ClientConstants.OffsetName] = offset.ToString();

            Assert.That(TrackOneComparer.IsEventDataEquivalent(trackOneEvent, trackTwoEvent), Is.True);
        }
Example #15
0
        /// <summary>
        ///   Compares event data between its representations in track one and
        ///   track two to determine if the instances represent the same event.
        /// </summary>
        ///
        /// <param name="trackOneEvent">The track one event to consider.</param>
        /// <param name="trackTwoEvent">The track two event to consider.</param>
        ///
        /// <returns><c>true</c>, if the two events are structurally equivilent; otherwise, <c>false</c>.</returns>
        ///
        public static bool IsEventDataEquivalent(TrackOne.EventData trackOneEvent,
                                                 EventData trackTwoEvent)
        {
            // If the events are the same instance, they're equal.  This should only happen
            // if both are null, since the types differ.

            if (Object.ReferenceEquals(trackOneEvent, trackTwoEvent))
            {
                return(true);
            }

            // If one or the other is null, then they cannot be equal, since we know that
            // they are not both null.

            if ((trackOneEvent == null) || (trackTwoEvent == null))
            {
                return(false);
            }

            // If the contents of each body is not equal, the events are not
            // equal.

            var trackOneBody = trackOneEvent.Body.ToArray();
            var trackTwoBody = trackTwoEvent.Body.ToArray();

            if (trackOneBody.Length != trackTwoBody.Length)
            {
                return(false);
            }

            if (!Enumerable.SequenceEqual(trackOneBody, trackTwoBody))
            {
                return(false);
            }

            // Verify the system properties are equivilent, unless they're the same reference.

            if (!Object.ReferenceEquals(trackOneEvent.SystemProperties, trackTwoEvent.SystemProperties))
            {
                if ((trackOneEvent.SystemProperties == null) || (trackTwoEvent.SystemProperties == null))
                {
                    return(false);
                }

                // Verify that the system properties contain the same elements, assuming they are non-null.

                if (trackOneEvent.SystemProperties?.Count != trackTwoEvent.SystemProperties?.Count)
                {
                    return(false);
                }

                if (!trackOneEvent.SystemProperties.OrderBy(kvp => kvp.Key).SequenceEqual(trackTwoEvent.SystemProperties.OrderBy(kvp => kvp.Key)))
                {
                    return(false);
                }
            }

            // Since we know that the event bodies and system properties are equal, if the property sets are the
            // same instance, then we know that the events are equal.  This should only happen if both are null.

            if (Object.ReferenceEquals(trackOneEvent.Properties, trackTwoEvent.Properties))
            {
                return(true);
            }

            // If either property is null, then the events are not equal, since we know that they are
            // not both null.

            if ((trackOneEvent.Properties == null) || (trackTwoEvent.Properties == null))
            {
                return(false);
            }

            // The only meaningful comparison left is to ensure that the property sets are equivilent,
            // the outcome of this check is the final word on equality.

            if (trackOneEvent.Properties.Count != trackTwoEvent.Properties.Count)
            {
                return(false);
            }

            return(trackOneEvent.Properties.OrderBy(kvp => kvp.Key).SequenceEqual(trackTwoEvent.Properties.OrderBy(kvp => kvp.Key)));
        }
        /// <summary>
        ///   Compares event data between its representations in track one and
        ///   track two to determine if the instances represent the same event.
        /// </summary>
        ///
        /// <param name="trackOneEvent">The track one event to consider.</param>
        /// <param name="trackTwoEvent">The track two event to consider.</param>
        ///
        /// <returns><c>true</c>, if the two events are structurally equivalent; otherwise, <c>false</c>.</returns>
        ///
        public static bool IsEventDataEquivalent(TrackOne.EventData trackOneEvent,
                                                 EventData trackTwoEvent)
        {
            // If the events are the same instance, they're equal.  This should only happen
            // if both are null, since the types differ.

            if (Object.ReferenceEquals(trackOneEvent, trackTwoEvent))
            {
                return(true);
            }

            // If one or the other is null, then they cannot be equal, since we know that
            // they are not both null.

            if ((trackOneEvent == null) || (trackTwoEvent == null))
            {
                return(false);
            }

            // If the contents of each body is not equal, the events are not
            // equal.

            var trackOneBody = trackOneEvent.Body.ToArray();
            var trackTwoBody = trackTwoEvent.Body.ToArray();

            if (trackOneBody.Length != trackTwoBody.Length)
            {
                return(false);
            }

            if (!Enumerable.SequenceEqual(trackOneBody, trackTwoBody))
            {
                return(false);
            }

            // Verify the system properties are equivalent, unless they're the same reference.

            if (!Object.ReferenceEquals(trackOneEvent.SystemProperties, trackTwoEvent.SystemProperties))
            {
                if ((trackOneEvent.SystemProperties == null) || (trackTwoEvent.SystemProperties == null))
                {
                    return(false);
                }

                if (trackOneEvent.SystemProperties.WithoutTypedMembers().Count != trackTwoEvent.SystemProperties.Count)
                {
                    return(false);
                }

                foreach (var property in trackOneEvent.SystemProperties)
                {
                    if (property.Key == TrackOne.ClientConstants.EnqueuedTimeUtcName)
                    {
                        var trackOneDate = (DateTime)trackOneEvent.SystemProperties[property.Key];
                        var trackTwoDate = trackTwoEvent.EnqueuedTime;

                        if (trackOneDate != trackTwoDate.Value.UtcDateTime)
                        {
                            return(false);
                        }
                    }
                    else if (property.Key == TrackOne.ClientConstants.SequenceNumberName)
                    {
                        var trackOneSequence = (long)trackOneEvent.SystemProperties[property.Key];
                        var trackTwoSequence = trackTwoEvent.SequenceNumber;

                        if (trackOneSequence != trackTwoSequence)
                        {
                            return(false);
                        }
                    }
                    else if (property.Key == TrackOne.ClientConstants.OffsetName)
                    {
                        var trackOneOffset = (string)trackOneEvent.SystemProperties[property.Key];
                        var trackTwoOffset = trackTwoEvent.Offset?.ToString();

                        if (trackOneOffset != trackTwoOffset)
                        {
                            return(false);
                        }
                    }
                    else if (property.Key == TrackOne.ClientConstants.PartitionKeyName)
                    {
                        var trackOnePartitionKey = (string)trackOneEvent.SystemProperties[property.Key];
                        var trackTwoPartitionKey = trackTwoEvent.PartitionKey;

                        if (trackOnePartitionKey != trackTwoPartitionKey)
                        {
                            return(false);
                        }
                    }
                    else if ((!trackTwoEvent.SystemProperties.ContainsKey(property.Key)) ||
                             (trackOneEvent.SystemProperties[property.Key] != trackTwoEvent.SystemProperties[property.Key]))
                    {
                        return(false);
                    }
                }
            }

            // Since we know that the event bodies and system properties are equal, if the property sets are the
            // same instance, then we know that the events are equal.  This should only happen if both are null.

            if (Object.ReferenceEquals(trackOneEvent.Properties, trackTwoEvent.Properties))
            {
                return(true);
            }

            // If either property is null, then the events are not equal, since we know that they are
            // not both null.

            if ((trackOneEvent.Properties == null) || (trackTwoEvent.Properties == null))
            {
                return(false);
            }

            // The only meaningful comparison left is to ensure that the property sets are equivalent,
            // the outcome of this check is the final word on equality.

            if (trackOneEvent.Properties.Count != trackTwoEvent.Properties.Count)
            {
                return(false);
            }

            if (!trackOneEvent.Properties.OrderBy(kvp => kvp.Key).SequenceEqual(trackTwoEvent.Properties.OrderBy(kvp => kvp.Key)))
            {
                return(false);
            }

            // Validate the runtime metrics properties.

            return(((trackOneEvent.LastSequenceNumber != default ? trackOneEvent.LastSequenceNumber : default(long?)) == trackTwoEvent.LastPartitionSequenceNumber) &&
                   ((trackOneEvent.LastEnqueuedTime != default ? new DateTimeOffset(trackOneEvent.LastEnqueuedTime) : default(DateTimeOffset?)) == trackTwoEvent.LastPartitionEnqueuedTime) &&
                   ((trackOneEvent.LastEnqueuedOffset == trackTwoEvent.LastPartitionOffset?.ToString())));
        }
        /// <summary>
        ///   Compares event data between its representations in track one and
        ///   track two to determine if the instances represent the same event.
        /// </summary>
        ///
        /// <param name="trackOneEvent">The track one event to consider.</param>
        /// <param name="trackTwoEvent">The track two event to consider.</param>
        ///
        /// <returns><c>true</c>, if the two events are structurally equivalent; otherwise, <c>false</c>.</returns>
        ///
        public static bool IsEventDataEquivalent(TrackOne.EventData trackOneEvent,
                                                 EventData trackTwoEvent)
        {
            // If the events are the same instance, they're equal.  This should only happen
            // if both are null, since the types differ.

            if (Object.ReferenceEquals(trackOneEvent, trackTwoEvent))
            {
                return(true);
            }

            // If one or the other is null, then they cannot be equal, since we know that
            // they are not both null.

            if ((trackOneEvent == null) || (trackTwoEvent == null))
            {
                return(false);
            }

            // If the contents of each body is not equal, the events are not
            // equal.

            var trackOneBody = trackOneEvent.Body.ToArray();
            var trackTwoBody = trackTwoEvent.Body.ToArray();

            if (trackOneBody.Length != trackTwoBody.Length)
            {
                return(false);
            }

            if (!Enumerable.SequenceEqual(trackOneBody, trackTwoBody))
            {
                return(false);
            }

            // Verify the system properties are equivalent, unless they're the same reference.

            if (!Object.ReferenceEquals(trackOneEvent.SystemProperties, trackTwoEvent.SystemProperties))
            {
                if ((trackOneEvent.SystemProperties == null) || (trackTwoEvent.SystemProperties == null))
                {
                    return(false);
                }

                // Verify that the system properties contain the same elements, assuming they are non-null.

                if (trackOneEvent.SystemProperties?.Count != trackTwoEvent.SystemProperties?.Count)
                {
                    return(false);
                }

                foreach (var property in trackOneEvent.SystemProperties)
                {
                    if (property.Key == TrackOne.ClientConstants.EnqueuedTimeUtcName)
                    {
                        // It's necessary to be extra careful with EnqueuedTime property because its type
                        // differs between Track One and Track Two.

                        var trackOneDate = (DateTime)trackOneEvent.SystemProperties[property.Key];
                        var trackTwoDate = (DateTimeOffset)trackTwoEvent.SystemProperties[property.Key];

                        if (trackOneDate != trackTwoDate.UtcDateTime)
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        // Other properties have the same type in Track One and Track Two.

                        if (!trackTwoEvent.SystemProperties.ContainsKey(property.Key))
                        {
                            return(false);
                        }

                        if (!Equals(trackTwoEvent.SystemProperties[property.Key], property.Value))
                        {
                            return(false);
                        }
                    }
                }
            }

            // Since we know that the event bodies and system properties are equal, if the property sets are the
            // same instance, then we know that the events are equal.  This should only happen if both are null.

            if (Object.ReferenceEquals(trackOneEvent.Properties, trackTwoEvent.Properties))
            {
                return(true);
            }

            // If either property is null, then the events are not equal, since we know that they are
            // not both null.

            if ((trackOneEvent.Properties == null) || (trackTwoEvent.Properties == null))
            {
                return(false);
            }

            // The only meaningful comparison left is to ensure that the property sets are equivalent,
            // the outcome of this check is the final word on equality.

            if (trackOneEvent.Properties.Count != trackTwoEvent.Properties.Count)
            {
                return(false);
            }

            return(trackOneEvent.Properties.OrderBy(kvp => kvp.Key).SequenceEqual(trackTwoEvent.Properties.OrderBy(kvp => kvp.Key)));
        }