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
This commit is contained in:
Mike Fleetwood 2017-05-23 19:23:37 +01:00 committed by Curtis Gedak
parent dc1c49ba62
commit 8b47de8872
1 changed files with 35 additions and 1 deletions

View File

@ -142,7 +142,7 @@ std::string BinaryStringToPrint( size_t offset, const char * s, size_t len )
class PipeCaptureTest : public ::testing::Test class PipeCaptureTest : public ::testing::Test
{ {
protected: protected:
PipeCaptureTest() : eof_signalled( false ) {}; PipeCaptureTest() : eof_signalled( false ), update_signalled( 0U ) {};
virtual void SetUp(); virtual void SetUp();
virtual void TearDown(); virtual void TearDown();
@ -157,11 +157,13 @@ protected:
std::string inputstr; std::string inputstr;
Glib::ustring capturedstr; Glib::ustring capturedstr;
bool eof_signalled; bool eof_signalled;
unsigned update_signalled;
int pipefds[2]; int pipefds[2];
Glib::RefPtr<Glib::MainLoop> glib_main_loop; Glib::RefPtr<Glib::MainLoop> glib_main_loop;
public: public:
void eof_callback() { eof_signalled = true; }; void eof_callback() { eof_signalled = true; };
void update_callback_leading_match();
}; };
// Further setup PipeCaptureTest fixture before running each test. Create pipe and Glib // 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(); 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_F( PipeCaptureTest, EmptyPipe )
{ {
// Test capturing 0 bytes with no on EOF callback registered. // Test capturing 0 bytes with no on EOF callback registered.
@ -270,6 +289,21 @@ TEST_F( PipeCaptureTest, LongASCIIText )
EXPECT_TRUE( eof_signalled ); 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 } // namespace GParted
// Custom Google Test main() which also initialises the Glib threading system for // Custom Google Test main() which also initialises the Glib threading system for