From 8b47de88728419daae4f249ec0f1e2f1c516d2ba Mon Sep 17 00:00:00 2001 From: Mike Fleetwood Date: Tue, 23 May 2017 19:23:37 +0100 Subject: [PATCH] Add check of PipeCapture update callback (#777973) Also ensure that the PipeCapture calls registered update callbacks and that the data so far captured matches the leading portion of the input. Bug 777973 - Segmentation fault on bad disk --- tests/test_PipeCapture.cc | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/tests/test_PipeCapture.cc b/tests/test_PipeCapture.cc index 4e909568..49b56303 100644 --- a/tests/test_PipeCapture.cc +++ b/tests/test_PipeCapture.cc @@ -142,7 +142,7 @@ std::string BinaryStringToPrint( size_t offset, const char * s, size_t len ) class PipeCaptureTest : public ::testing::Test { protected: - PipeCaptureTest() : eof_signalled( false ) {}; + PipeCaptureTest() : eof_signalled( false ), update_signalled( 0U ) {}; virtual void SetUp(); virtual void TearDown(); @@ -157,11 +157,13 @@ protected: std::string inputstr; Glib::ustring capturedstr; bool eof_signalled; + unsigned update_signalled; int pipefds[2]; Glib::RefPtr glib_main_loop; public: void eof_callback() { eof_signalled = true; }; + void update_callback_leading_match(); }; // Further setup PipeCaptureTest fixture before running each test. Create pipe and Glib @@ -223,6 +225,23 @@ void PipeCaptureTest::run_writer_thread() glib_main_loop->run(); } +// Callback fired from CapturePipe counting calls and ensuring captured string matches +// leading portion of input string. +void PipeCaptureTest::update_callback_leading_match() +{ + update_signalled ++; + EXPECT_BINARYSTRINGEQ( inputstr.substr( 0, capturedstr.raw().length() ), + capturedstr.raw() ); + if ( HasFailure() ) + // No point trying to PipeCapture the rest of the input and report + // hundreds of further failures in the same test, so end the currently + // running Glib main loop immediately. + // References: + // * Google Test, AdvancedGuide, Propagating Fatal Failures + // * Google Test, AdvancedGuide, Checking for Failures in the Current Test + glib_main_loop->quit(); +} + TEST_F( PipeCaptureTest, EmptyPipe ) { // Test capturing 0 bytes with no on EOF callback registered. @@ -270,6 +289,21 @@ TEST_F( PipeCaptureTest, LongASCIIText ) EXPECT_TRUE( eof_signalled ); } +TEST_F( PipeCaptureTest, LongASCIITextWithUpdate ) +{ + // Test capturing 1 MiB of ASCII text, that registered update callback occurs and + // intermediate captured string is a leading match for the input string. + inputstr = repeat( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_\n", 16384 ); + PipeCapture pc( pipefds[ReaderFD], capturedstr ); + pc.signal_eof.connect( sigc::mem_fun( *this, &PipeCaptureTest::eof_callback ) ); + pc.signal_update.connect( sigc::mem_fun( *this, &PipeCaptureTest::update_callback_leading_match ) ); + pc.connect_signal(); + run_writer_thread(); + EXPECT_BINARYSTRINGEQ( inputstr, capturedstr.raw() ); + EXPECT_GT( update_signalled, 0U ); + EXPECT_TRUE( eof_signalled ); +} + } // namespace GParted // Custom Google Test main() which also initialises the Glib threading system for