CpeId: NoThrowType remembers last malformed string causing an exception.
authorMichael Andres <ma@suse.de>
Fri, 4 Apr 2014 10:46:39 +0000 (12:46 +0200)
committerMichael Andres <ma@suse.de>
Fri, 4 Apr 2014 10:46:39 +0000 (12:46 +0200)
tests/zypp/CpeId_test.cc
zypp/CpeId.cc
zypp/CpeId.h

index 0da6baf..0456095 100644 (file)
@@ -357,6 +357,9 @@ BOOST_AUTO_TEST_CASE(cpeid_basics)
 {
   BOOST_CHECK_THROW( CpeId( "malformed" ), std::invalid_argument );
   CpeId none( "malformed", CpeId::noThrow );
+  BOOST_CHECK_EQUAL( CpeId::NoThrowType::lastMalformed, "malformed" );
+  CpeId( "", CpeId::noThrow );
+  BOOST_CHECK_EQUAL( CpeId::NoThrowType::lastMalformed, "" );
 
   for ( const auto & c : { CpeId(), CpeId( nullptr ), CpeId( "" ), CpeId( std::string() ) } )
   {
index 64277da..9be3d88 100644 (file)
@@ -365,6 +365,8 @@ namespace zypp
   //   class CpeId
   ///////////////////////////////////////////////////////////////////
 
+  std::string CpeId::NoThrowType::lastMalformed;
+
   CpeId::CpeId()
     : _pimpl( new Impl )
   {}
@@ -376,9 +378,15 @@ namespace zypp
   CpeId::CpeId( const std::string & cpe_r, NoThrowType )
   {
     try
-    { _pimpl.reset( new Impl( cpe_r ) ); }
+    {
+      _pimpl.reset( new Impl( cpe_r ) );
+      NoThrowType::lastMalformed.clear();
+    }
     catch(...)
-    { _pimpl.reset( new Impl ); }
+    {
+      _pimpl.reset( new Impl );
+      NoThrowType::lastMalformed = cpe_r;
+    }
   }
 
   CpeId::~CpeId()
index 40e1c63..a5204d1 100644 (file)
@@ -57,7 +57,7 @@ namespace zypp
 
   public:
     /** Indicator type for non-trowing ctor. */
-    struct NoThrowType {};
+    struct NoThrowType { static std::string lastMalformed; };
     /** Indicator argument for non-trowing ctor. */
     static constexpr NoThrowType noThrow = NoThrowType();