8 #include "zypp/PluginExecutor.h"
10 BOOST_AUTO_TEST_CASE(InitialSettings)
12 PluginScript::defaultTimeout( 3 );
15 BOOST_AUTO_TEST_CASE(PluginFrameDefaultCtor)
18 BOOST_CHECK_EQUAL( bool(f), !f.empty() );
19 BOOST_CHECK_EQUAL( f.empty(), true );
20 BOOST_CHECK_EQUAL( f.command().empty(), true );
21 BOOST_CHECK_EQUAL( f.body().empty(), true );
22 BOOST_CHECK_EQUAL( f.headerEmpty(), true );
23 BOOST_CHECK_EQUAL( (f == f), true );
24 BOOST_CHECK_EQUAL( (f != f), false );
27 BOOST_AUTO_TEST_CASE(PluginFrameCtorAssign)
29 PluginFrame f( "command" );
30 BOOST_CHECK_EQUAL( bool(f), !f.empty() );
31 BOOST_CHECK_EQUAL( f.empty(), false );
32 BOOST_CHECK_EQUAL( f.command(), "command" );
33 BOOST_CHECK_EQUAL( f.body().empty(), true );
34 BOOST_CHECK_EQUAL( f.headerEmpty(), true );
35 BOOST_CHECK_EQUAL( (f == f), true );
36 BOOST_CHECK_EQUAL( (f != f), false );
38 PluginFrame g( "command", "body" );
39 BOOST_CHECK_EQUAL( bool(g), !g.empty() );
40 BOOST_CHECK_EQUAL( g.empty(), false );
41 BOOST_CHECK_EQUAL( g.command(), "command" );
42 BOOST_CHECK_EQUAL( g.body(), "body");
43 BOOST_CHECK_EQUAL( g.headerEmpty(), true );
44 BOOST_CHECK_EQUAL( (f == g), false );
45 BOOST_CHECK_EQUAL( (f != g), true );
48 BOOST_CHECK_EQUAL( (g == h), true );
50 h.addHeader( "" ); // empty KV in header is ok, if you like it
51 BOOST_CHECK_EQUAL( (g == h), false );
61 BOOST_CHECK_EQUAL( h.headerSize(), 7 );
63 h.setHeader( "b", "b" ); // replaces existing 'b:" headers
64 BOOST_CHECK_EQUAL( h.headerSize(), 6 );
66 // now write and reparse from stream:
69 std::ostringstream datas;
71 datas.str().swap( data );
73 std::istringstream datas( data );
74 PluginFrame i( datas );
75 BOOST_CHECK_EQUAL( (h == i), true );
78 void doParse( const std::string & str_r )
80 std::string data( str_r );
81 data.push_back( '\0' );
82 std::istringstream datas( data );
83 PluginFrame i( datas );
86 BOOST_AUTO_TEST_CASE(PluginFrameExceptipn)
88 BOOST_CHECK_THROW( PluginFrame( "c\nc" ), PluginFrameException );
90 BOOST_CHECK_THROW( f.addHeader( "c\nc" ), PluginFrameException );
91 BOOST_CHECK_THROW( f.addHeader( "c:c" ), PluginFrameException );
92 BOOST_CHECK_THROW( f.addHeader( "cc", "c\nc" ), PluginFrameException );
94 BOOST_CHECK_THROW( doParse( "c" ), PluginFrameException ); // no NL after command
95 BOOST_CHECK_THROW( doParse( "c\n" ), PluginFrameException ); // no NL after header
96 doParse( "c\n\n" ); // valid empy header and body
97 BOOST_CHECK_THROW( doParse( "c\nh:v\nbody" ), PluginFrameException ); // no NL after header
98 doParse( "c\nh:v\n\nbody" ); // valid
99 BOOST_CHECK_THROW( doParse( "c\nhv\n\nbody" ), PluginFrameException ); // no : in header
102 BOOST_AUTO_TEST_CASE(PluginScriptTest)
105 BOOST_CHECK_EQUAL( scr.isOpen(), false );
106 BOOST_CHECK_EQUAL( scr.getPid(), PluginScript::NotConnected );
107 BOOST_CHECK_EQUAL( scr.script(), "" );
109 BOOST_CHECK_THROW( scr.open( "bla" ), PluginScriptException ); // script does not exist
110 BOOST_CHECK_EQUAL( scr.isOpen(), false ); // stay closed
111 BOOST_CHECK_EQUAL( scr.getPid(), PluginScript::NotConnected );
112 BOOST_CHECK_EQUAL( scr.script(), "" );
114 scr.open( "/bin/cat" );
115 BOOST_CHECK_EQUAL( scr.isOpen(), true );
116 BOOST_CHECK_EQUAL( (scr.getPid() != PluginScript::NotConnected ), true );
117 BOOST_CHECK_EQUAL( scr.script(), "/bin/cat" ); // set after successfull open
119 BOOST_CHECK_THROW( scr.open( "/bin/ls" ), PluginScriptException ); // already open
120 BOOST_CHECK_EQUAL( scr.isOpen(), true ); // stay with "/bin/cat"
121 BOOST_CHECK_EQUAL( (scr.getPid() != PluginScript::NotConnected ), true );
122 BOOST_CHECK_EQUAL( scr.script(), "/bin/cat" );
126 PluginFrame r( scr.receive() );
127 BOOST_CHECK_EQUAL( f, r );
129 f.setCommand( "CMD" );
130 f.addHeader( "a","value" );
134 BOOST_CHECK_EQUAL( f, r );
137 BOOST_CHECK_EQUAL( scr.isOpen(), false );
138 BOOST_CHECK_EQUAL( scr.getPid(), PluginScript::NotConnected );
139 BOOST_CHECK_EQUAL( scr.script(), "/bin/cat" ); // not reset by close, may be reused by open()
141 scr.close(); // no exception on dupl. close.
144 BOOST_AUTO_TEST_CASE(PluginScriptSend)
146 PluginFrame f( "a" );
147 f.setBody( std::string( 1020, '0' ) );
149 PluginScript scr( "/bin/cat" );
150 BOOST_CHECK_THROW( scr.send( f ), PluginScriptNotConnected );
153 BOOST_CHECK_THROW( do { scr.send( f ); } while ( true ), PluginScriptSendTimeout );
155 ::kill( scr.getPid(), SIGKILL);
156 BOOST_CHECK_THROW( scr.send( f ), PluginScriptDiedUnexpectedly );
159 BOOST_AUTO_TEST_CASE(PluginScriptReceive)
161 PluginFrame f( "a" );
162 f.setBody( std::string( 1020, '0' ) );
164 PluginScript scr( "/bin/cat" );
166 BOOST_CHECK_THROW( scr.receive(), PluginScriptReceiveTimeout );
168 ::kill( scr.getPid(), SIGKILL);
169 BOOST_CHECK_THROW( scr.receive(), PluginScriptDiedUnexpectedly );
172 BOOST_AUTO_TEST_CASE(PluginExecutorTest)
175 BOOST_CHECK_EQUAL( (bool)exec, !exec.empty() );
176 BOOST_CHECK_EQUAL( exec.empty(), true );
177 BOOST_CHECK_EQUAL( exec.size(), 0 );
179 exec.load( "/bin/cat" );
180 BOOST_CHECK_EQUAL( (bool)exec, !exec.empty() );
181 BOOST_CHECK_EQUAL( exec.empty(), false );
182 BOOST_CHECK_EQUAL( exec.size(), 1 );
184 exec.load( "/bin/cat" );
185 BOOST_CHECK_EQUAL( exec.size(), 2 );
187 exec.send( PluginFrame( "ACK" ) );
188 BOOST_CHECK_EQUAL( exec.size(), 2 );
190 exec.send( PluginFrame( "ERROR" ) );
191 BOOST_CHECK_EQUAL( exec.size(), 0 ); // deleted failing scripts