TEST_F(ContextMapTest, AdjacentCleanupTest) { ContextMap<string> mp; std::weak_ptr<CoreContext> outerWeak; std::weak_ptr<CoreContext> innerWeak; // Add two contexts, and let one go out of scope AutoCreateContext outer; mp.Add("0", outer); outerWeak = outer; { AutoCreateContext inner; mp.Add("1", inner); innerWeak = inner; // Verify that we can find both contexts std::shared_ptr<CoreContext> outerSearched = mp.Find("0"); ASSERT_TRUE(!!outerSearched.get()) << "Outer context just added, but couldn't be found"; std::shared_ptr<CoreContext> innerSearched = mp.Find("1"); ASSERT_TRUE(!!innerSearched.get()) << "Inner context just added, but couldn't be found"; } // Inner should be 404 by now ASSERT_TRUE(innerWeak.expired()) << "Unexpected outstanding reference to the inner context"; // Try to find the outer context. This should evict the inner context. mp.Find("0"); ASSERT_EQ(1UL, mp.size()) << "Proximity eviction didn't function as expected"; }
TEST_F(ContextMapTest, VerifyWithThreadsPathological) { ContextMap<size_t> mp; // Context collection and exit race threads: vector<std::shared_ptr<CoreContext>> contexts; // Exit race controller: AutoRequired<ExitRaceSignal> signal; // Create a number of dependent contexts: for(size_t i = 0; i < 100; i++) { AutoCreateContext context; contexts.push_back(context); // Store a shared pointer mp.Add(i, context); // Start the context context->Initiate(); } // Set the signal: signal->Signal(); // Verify that the map empties once our zero-count is hit: for(size_t i = 0; i < contexts.size(); i++) { contexts[i]->SignalShutdown(true); } // Clear the context collection: contexts.clear(); EXPECT_EQ(0UL, mp.size()) << "Context map did not empty as expected"; }
// Returns the number of active contexts. int GetNumContexts() { return (int) contexts.size(); }