public void GetRecentMessagesReturnsTheLastNMessages() { var cache = new RecentMessageCache(10); // Prime the cache cache.Add("room", new List<MessageViewModel>()); for (int i = 0; i < 100; i++) { cache.Add(MakeMessage("dfowler", "room", "Hello_" + i)); } var messages = cache.GetRecentMessages("room").ToList(); Assert.Equal(10, messages.Count); // The impl of the message store allocates bucket sizes optimized for the GC so it's not exact for (int i = 90, j = 0; i <= 99; i++, j++) { Assert.Equal("Hello_" + i, messages[j].Content); } }
public void ThreadSafety() { var cache = new RecentMessageCache(10); var initial = new List<MessageViewModel>(); var wh = new ManualResetEventSlim(); for (int i = 0; i < 5; i++) { initial.Add(new MessageViewModel(MakeMessage("dfowler", "room", "Hello_" + i))); } Task.Run(() => { Thread.Sleep(100); for (int i = 0; i < 5; i++) { cache.Add(MakeMessage("john", "room", "john_" + i)); } wh.Set(); }); cache.Add("room", initial); wh.Wait(); var messages = cache.GetRecentMessages("room").ToList(); Assert.Equal(10, messages.Count); Assert.Equal("john_0", messages[5].Content); Assert.Equal("john_1", messages[6].Content); Assert.Equal("john_2", messages[7].Content); Assert.Equal("john_3", messages[8].Content); Assert.Equal("john_4", messages[9].Content); }