コード例 #1
0
ファイル: TreeProvider_Tests.cs プロジェクト: urri-x/GCloud
        public void InsertNodes_IncrementsCount()
        {
            var treeProvider = new TreeProvider();

            treeProvider.InsertNodes(new List <TreeNode>()
            {
                new TreeNode()
                {
                    Id = 1, ParentId = null, DateBegin = new DateTime(2016, 1, 1), DateEnd = null, Type = 1
                }
            });
            treeProvider.Count(1).Should().Be(1);
        }
コード例 #2
0
ファイル: TreeProvider_Tests.cs プロジェクト: urri-x/GCloud
        public void ThreadSafety_Test()
        {
            var       treeProvider = new TreeProvider();
            const int threadsCount = 10;
            const int nodesCount   = 10000;
            var       threads      = new Thread[threadsCount];
            var       startEvent   = new ManualResetEvent(false);
            var       exceptions   = new List <Exception>();
            var       id           = 0;
            var       createdNodes = new List <int>();
            var       random       = new Random();

            var threadLock = new object();

            for (var i = 0; i < threads.Length; i++)
            {
                threads[i] = new Thread(() =>
                {
                    try
                    {
                        for (var k = 0; k < nodesCount; k++)
                        {
                            int newId;
                            int?newParentId = null;
                            lock (threadLock)
                                newId = ++id;

                            lock (createdNodes)
                                if (createdNodes.Count > 10)
                                {
                                    newParentId = createdNodes[random.Next(createdNodes.Count - 1)];
                                }


                            var node = new TreeNode()
                            {
                                Id        = newId,
                                ParentId  = newParentId,
                                DateBegin = new DateTime(2010, 1, 1).AddDays(random.Next(2000)),
                                DateEnd   = null,
                                Type      = 1
                            };
                            treeProvider.InsertNodes(new List <TreeNode>()
                            {
                                node
                            });
                            lock (createdNodes)
                                createdNodes.Add(newId);
                        }
                    }
                    catch (Exception e)
                    {
                        lock (exceptions)
                            exceptions.Add(e);
                    }
                });
                threads[i].Start();
            }
            startEvent.Set();
            foreach (var t in threads)
            {
                Assert.That(t.Join(TimeSpan.FromSeconds(2)));
            }
            if (exceptions.Any())
            {
                throw new AggregateException(exceptions);
            }
            treeProvider.Count(1).Should().Be(threadsCount * nodesCount);
        }