TEST(WindowExecutor, parallelWithError) { ManualExecutor executor; std::vector<int> input; std::vector<Promise<int>> ps(10); for (size_t i = 0; i < ps.size(); i++) { input.emplace_back(i); } auto f = collect( window(&executor, input, [&](int i) { return ps[i].getFuture(); }, 3)); std::vector<std::thread> ts; boost::barrier barrier(ps.size() + 1); for (size_t i = 0; i < ps.size(); i++) { ts.emplace_back([&ps, &barrier, i]() { barrier.wait(); if (i == (ps.size() / 2)) { ps[i].setException(eggs); } else { ps[i].setValue(i); } }); } barrier.wait(); for (auto& t : ts) { t.join(); } executor.drain(); EXPECT_TRUE(f.isReady()); EXPECT_THROW(f.value(), eggs_t); }
TEST(WindowExecutor, parallel) { ManualExecutor executor; std::vector<int> input; std::vector<Promise<int>> ps(10); for (size_t i = 0; i < ps.size(); i++) { input.emplace_back(i); } auto f = collect( window(&executor, input, [&](int i) { return ps[i].getFuture(); }, 3)); std::vector<std::thread> ts; boost::barrier barrier(ps.size() + 1); for (size_t i = 0; i < ps.size(); i++) { ts.emplace_back([&ps, &barrier, i]() { barrier.wait(); ps[i].setValue(i); }); } barrier.wait(); for (auto& t : ts) { t.join(); } executor.drain(); EXPECT_TRUE(f.isReady()); for (size_t i = 0; i < ps.size(); i++) { EXPECT_EQ(i, f.value()[i]); } }