Example #1
0
        public void PartitionKeyAssignmentIsStable(string[] partitions)
        {
            var iterationCount = 25;
            var key            = "this-is-a-key-1";
            var resolver       = new PartitionResolver();
            var expected       = resolver.AssignForPartitionKey(key, partitions);

            for (var index = 0; index < iterationCount; ++index)
            {
                Assert.That(resolver.AssignForPartitionKey(key, partitions), Is.EqualTo(expected), $"The assignment for iteration: [{ index }] was unstable.");
            }
        }
Example #2
0
        public void PartitionKeyAssignmentDistributesKeysToDifferentPartitions(string[] partitions)
        {
            using var cancellationSource = new CancellationTokenSource();
            cancellationSource.CancelAfter(EventHubsTestEnvironment.Instance.TestExecutionTimeLimit);

            var keyLength           = 20;
            var requiredAssignments = (int)Math.Floor(partitions.Length * 0.67);
            var assignedHash        = new HashSet <string>();
            var resolver            = new PartitionResolver();

            // Create the random number generator using a constant seed; this is
            // intended to allow for randomization but will also keep a consistent
            // pattern each time the tests are run.

            var rng = new Random(412);

            for (var index = 0; index < int.MaxValue; ++index)
            {
                var keyBuilder = new StringBuilder(keyLength);

                for (var charIndex = 0; charIndex < keyLength; ++charIndex)
                {
                    keyBuilder.Append((char)rng.Next(1, 256));
                }

                var key       = keyBuilder.ToString();
                var partition = resolver.AssignForPartitionKey(key, partitions);

                assignedHash.Add(partition);

                // If keys were distributed to more than one partition and the minimum number of
                // iterations was satisfied, break the loop.

                if (assignedHash.Count > requiredAssignments)
                {
                    break;
                }

                cancellationSource.Token.ThrowIfCancellationRequested();
            }

            Assert.That(assignedHash.Count, Is.GreaterThanOrEqualTo(requiredAssignments), "Partition keys should have had some level of distribution among partitions.");
        }