56ecd9c701f0ad9e34bab033ce4a910b45438612
[platform/upstream/libzypp.git] / tests / zypp / PluginFrame_test.cc
1 #include <sys/types.h>
2 #include <signal.h>
3
4 #include <iostream>
5 #include <sstream>
6
7 #include "TestSetup.h"
8 #include "zypp/PluginExecutor.h"
9
10 BOOST_AUTO_TEST_CASE(InitialSettings)
11 {
12   PluginScript::defaultTimeout( 3 );
13 }
14
15 BOOST_AUTO_TEST_CASE(PluginFrameDefaultCtor)
16 {
17   PluginFrame f;
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 );
25 }
26
27 BOOST_AUTO_TEST_CASE(PluginFrameCtorAssign)
28 {
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 );
37
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 );
46
47   PluginFrame h( g );
48   BOOST_CHECK_EQUAL( (g == h), true );
49
50   h.addHeader( "" ); // empty KV in header is ok, if you like it
51   BOOST_CHECK_EQUAL( (g == h), false );
52
53   h.addHeader({
54     { "a", "a1" },
55     { "a", "a2" },
56     { "b", "b1" },
57     { "b", "b2" },
58     { "c", "c1" },
59     { "c", "c1" }
60   });
61   BOOST_CHECK_EQUAL( h.headerSize(), 7 );
62
63   h.setHeader( "b", "b" ); // replaces existing 'b:" headers
64   BOOST_CHECK_EQUAL( h.headerSize(), 6 );
65
66   // now write and reparse from stream:
67   std::string data;
68   {
69     std::ostringstream datas;
70     h.writeTo( datas );
71     datas.str().swap( data );
72   }
73   std::istringstream datas( data );
74   PluginFrame i( datas );
75   BOOST_CHECK_EQUAL( (h == i), true );
76 }
77
78 void doParse( const std::string & str_r )
79 {
80   std::string data( str_r );
81   data.push_back( '\0' );
82   std::istringstream datas( data );
83    PluginFrame i( datas );
84 }
85
86 BOOST_AUTO_TEST_CASE(PluginFrameExceptipn)
87 {
88   BOOST_CHECK_THROW( PluginFrame( "c\nc" ), PluginFrameException );
89   PluginFrame f;
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 );
93
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
100 }
101
102 BOOST_AUTO_TEST_CASE(PluginScriptTest)
103 {
104   PluginScript scr;
105   BOOST_CHECK_EQUAL( scr.isOpen(), false );
106   BOOST_CHECK_EQUAL( scr.getPid(), PluginScript::NotConnected );
107   BOOST_CHECK_EQUAL( scr.script(), "" );
108
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(), "" );
113
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
118
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" );
123
124   PluginFrame f;
125   scr.send( f );
126   PluginFrame r( scr.receive() );
127   BOOST_CHECK_EQUAL( f, r );
128
129   f.setCommand( "CMD" );
130   f.addHeader( "a","value" );
131   f.setBody( "foo" );
132   scr.send( f );
133   r = scr.receive();
134   BOOST_CHECK_EQUAL( f, r );
135
136   scr.close();
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()
140
141   scr.close();                                                          // no exception on dupl. close.
142 }
143
144 BOOST_AUTO_TEST_CASE(PluginScriptSend)
145 {
146   PluginFrame f( "a" );
147   f.setBody( std::string( 1020, '0' ) );
148
149   PluginScript scr( "/bin/cat" );
150   BOOST_CHECK_THROW( scr.send( f ), PluginScriptNotConnected );
151
152   scr.open();
153   BOOST_CHECK_THROW( do { scr.send( f ); } while ( true ), PluginScriptSendTimeout );
154
155   ::kill( scr.getPid(), SIGKILL);
156   BOOST_CHECK_THROW( scr.send( f ), PluginScriptDiedUnexpectedly );
157 }
158
159 BOOST_AUTO_TEST_CASE(PluginScriptReceive)
160 {
161   PluginFrame f( "a" );
162   f.setBody( std::string( 1020, '0' ) );
163
164   PluginScript scr( "/bin/cat" );
165   scr.open();
166   BOOST_CHECK_THROW( scr.receive(), PluginScriptReceiveTimeout );
167
168   ::kill( scr.getPid(), SIGKILL);
169   BOOST_CHECK_THROW(  scr.receive(), PluginScriptDiedUnexpectedly );
170 }
171
172 BOOST_AUTO_TEST_CASE(PluginExecutorTest)
173 {
174   PluginExecutor exec;
175   BOOST_CHECK_EQUAL( (bool)exec, !exec.empty() );
176   BOOST_CHECK_EQUAL( exec.empty(), true );
177   BOOST_CHECK_EQUAL( exec.size(), 0 );
178
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 );
183
184   exec.load( "/bin/cat" );
185   BOOST_CHECK_EQUAL( exec.size(), 2 );
186
187   exec.send( PluginFrame( "ACK" ) );
188   BOOST_CHECK_EQUAL( exec.size(), 2 );
189
190   exec.send( PluginFrame( "ERROR" ) );
191   BOOST_CHECK_EQUAL( exec.size(), 0 );  // deleted failing scripts
192 }