::testing::AssertionResult AwaitAssertAbandoned( const char* expr, const char*, // Unused string representation of 'duration'. const process::Future<T>& actual, const Duration& duration) { process::Owned<process::Latch> latch(new process::Latch()); actual.onAny([=]() { latch->trigger(); }); actual.onAbandoned([=]() { latch->trigger(); }); if (!latch->await(duration)) { return ::testing::AssertionFailure() << "Failed to wait " << duration << " for " << expr; } else if (actual.isDiscarded()) { return ::testing::AssertionFailure() << expr << " was discarded"; } else if (actual.isReady()) { return ::testing::AssertionFailure() << expr << " is ready (" << ::testing::PrintToString(actual.get()) << ")"; } else if (actual.isFailed()) { return ::testing::AssertionFailure() << "(" << expr << ").failure(): " << actual.failure(); } CHECK_ABANDONED(actual); return ::testing::AssertionSuccess(); }