Line data Source code
1 : /*
2 : test_exec.c
3 : Created by Danny Goossen, Gioxa Ltd on 26/3/17.
4 :
5 : MIT License
6 :
7 : Copyright (c) 2017 deployctl, Gioxa Ltd.
8 :
9 : Permission is hereby granted, free of charge, to any person obtaining a copy
10 : of this software and associated documentation files (the "Software"), to deal
11 : in the Software without restriction, including without limitation the rights
12 : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 : copies of the Software, and to permit persons to whom the Software is
14 : furnished to do so, subject to the following conditions:
15 :
16 : The above copyright notice and this permission notice shall be included in all
17 : copies or substantial portions of the Software.
18 :
19 : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 : IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 : FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 : AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 : LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 : OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 : SOFTWARE.
26 :
27 : */
28 :
29 :
30 : #include <check.h>
31 : #include "../src/deployd.h"
32 :
33 :
34 : char * user;
35 : char * group;
36 :
37 : uid_t thisuid;
38 : gid_t thisgid;
39 3 : static void setup(void)
40 : {
41 : struct passwd *pw;
42 : struct group * grp;
43 :
44 3 : thisuid = geteuid();
45 3 : thisgid= getgid();
46 3 : grp = getgrgid(thisgid);
47 3 : pw = getpwuid (thisuid);
48 3 : user=pw->pw_name;
49 3 : group=grp->gr_name;
50 3 : }
51 :
52 :
53 :
54 1 : START_TEST(check_guid)
55 : {
56 : uid_t uid;
57 : gid_t gid;
58 1 : get_gid(&gid,user);
59 1 : get_uid(&uid,user);
60 1 : ck_assert_int_eq(uid,thisuid);
61 2 : ck_assert_int_eq(gid,thisgid);
62 2 : ck_assert_int_ne(get_gid(&gid,"fakeusername"),0);
63 2 : ck_assert_int_ne(get_uid(&uid,"fakeusername"),0);
64 : }
65 1 : END_TEST
66 :
67 1 : START_TEST(check_exec)
68 : {
69 : uid_t uid;
70 : gid_t gid;
71 1 : get_gid(&gid,user);
72 1 : get_uid(&uid,user);
73 : data_exchange_t data_exchange;
74 1 : void * opaque=&data_exchange;
75 1 : int exitcode=0;
76 : char * newarg[4];
77 1 : cJSON * env_json=NULL;
78 1 : struct trace_Struct * trace=NULL;
79 1 : init_dynamic_trace( &trace,"token","url",1);
80 :
81 1 : data_exchange.needenvp=0;
82 1 : data_exchange.gid=gid;
83 1 : data_exchange.uid=uid;
84 1 : data_exchange.env_json=env_json;
85 1 : data_exchange.paramlist=(char **)newarg;
86 1 : data_exchange.timeout=1;
87 1 : data_exchange.trace=trace;
88 1 : data_exchange.current_user=1;
89 :
90 1 : newarg[0]="/usr/bin/sh";
91 1 : newarg[1]="-c";
92 :
93 1 : newarg[3]=NULL;
94 :
95 : char this_command[256];
96 1 : data_exchange.this_command=this_command;
97 :
98 :
99 1 : sprintf(this_command,"exit OK");
100 1 : clear_dynamic_trace(trace);
101 1 : newarg[2]="[ 1 == 1 ]";
102 1 : exitcode= cmd_exec(opaque);
103 1 : alert("%s\n",get_dynamic_trace(trace));
104 1 : ck_assert_int_eq(exitcode,0);
105 1 : alert("%s\n",get_dynamic_trace(trace));
106 : //ck_assert_int_eq(0,strlen(get_dynamic_trace(trace)));
107 :
108 1 : sprintf(this_command,"exit fail");
109 1 : clear_dynamic_trace(trace);
110 1 : newarg[2]="[ 1 = 0 ]";
111 1 : exitcode= cmd_exec(opaque);
112 2 : ck_assert_int_ne(exitcode,0);
113 1 : alert("%s\n",get_dynamic_trace(trace));
114 : //ck_assert_int_eq(0,strlen(get_dynamic_trace(trace)));
115 1 : sprintf(this_command,"exit OK, stdout feedback");
116 1 : clear_dynamic_trace(trace);
117 1 : newarg[2]="echo test";
118 1 : exitcode= cmd_exec(opaque);
119 2 : ck_assert_int_eq(exitcode,0);
120 1 : alert("%s\n",get_dynamic_trace(trace));
121 : //ck_assert_int_eq(5,strlen(get_dynamic_trace(trace)));
122 :
123 1 : sprintf(this_command,"exit NOK, timeout");
124 1 : clear_dynamic_trace(trace);
125 1 : newarg[2]="sleep 2";
126 1 : exitcode= cmd_exec(opaque);
127 2 : ck_assert_int_ne(exitcode,0);
128 :
129 :
130 1 : sprintf(this_command,"exit OK, set envp");
131 1 : clear_dynamic_trace(trace);
132 1 : data_exchange.needenvp=1;
133 1 : env_json=cJSON_CreateObject();
134 1 : cJSON_AddItemToObject(env_json,"myenv_var" , cJSON_CreateString("testenvp"));
135 :
136 1 : newarg[2]="echo $myenv_var";
137 1 : exitcode= cmd_exec(opaque);
138 2 : ck_assert_int_eq(exitcode,0);
139 1 : cJSON_Delete(env_json);
140 :
141 :
142 :
143 : // one more a signal?
144 : // kill -30 %1
145 : #ifndef __APPLE__
146 1 : sprintf(this_command,"signal");
147 1 : clear_dynamic_trace(trace);
148 1 : data_exchange.needenvp=0;
149 :
150 1 : newarg[2]="kill -9 $BASHPID";
151 1 : exitcode= cmd_exec(opaque);
152 1 : printf("signal response >%s<\n",get_dynamic_trace(trace));
153 2 : ck_assert_int_ne(exitcode,0);
154 : #endif
155 : //output_buf[strlen("testenvp")]=0; // avoid the real non escaped "\n"
156 : //ck_assert_str_eq(output_buf,"testenvp");
157 1 : free_dynamic_trace(&trace);
158 :
159 : }
160 1 : END_TEST
161 :
162 1 : START_TEST(check_writefile)
163 : {
164 : uid_t uid;
165 : gid_t gid;
166 1 : get_gid(&gid,user);
167 1 : get_uid(&uid,user);
168 : data_exchange_t data_exchange;
169 1 : void * opaque=&data_exchange;
170 :
171 1 : int exitcode=0;
172 : char * newarg[11];
173 1 : cJSON * env_json=NULL;
174 : char this_command[256];
175 1 : _mkdir("test_exec_check_writefile","") ;//, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
176 :
177 1 : setdebug();
178 1 : setverbose();
179 :
180 :
181 1 : struct trace_Struct * trace=NULL;
182 1 : init_dynamic_trace( &trace,"token","url",1);
183 1 : data_exchange.needenvp=0;
184 1 : data_exchange.gid=gid;
185 1 : data_exchange.uid=uid;
186 1 : data_exchange.env_json=NULL;
187 :
188 1 : data_exchange.paramlist=(char **)newarg;
189 1 : data_exchange.timeout=3;
190 1 : data_exchange.trace=trace;
191 1 : data_exchange.this_command=this_command;
192 :
193 1 : newarg[0]="write test file";
194 1 : newarg[1]="test_exec_check_writefile/writetest.txt";
195 1 : newarg[2]="writewtest OK";
196 1 : newarg[3]=NULL;
197 1 : clear_dynamic_trace(trace);
198 1 : sprintf(this_command,"write file");
199 1 : exitcode=cmd_write(opaque);
200 1 : ck_assert_int_eq(exitcode,0);
201 : // cleanup test file
202 1 : newarg[0]="rm";
203 1 : newarg[1]="-f";
204 1 : newarg[2]="test_exec_check_writefile/writetest.txt";
205 1 : newarg[3]=NULL;
206 1 : clear_dynamic_trace(trace);
207 1 : sprintf(this_command,"cleanup");
208 1 : exitcode=cmd_exec(opaque);
209 :
210 1 : newarg[0]="write test file";
211 1 : newarg[1]="unknowndir/writetest.txt";
212 1 : newarg[2]="writewtest OK";
213 1 : newarg[3]=NULL;
214 :
215 1 : clear_dynamic_trace(trace);
216 1 : sprintf(this_command,"write file to bad dir");
217 1 : exitcode=cmd_write(opaque);
218 2 : ck_assert_int_ne(exitcode,0);
219 1 : remove("test_exec_check_writefile");
220 :
221 1 : free_dynamic_trace(&trace);
222 :
223 : }
224 1 : END_TEST
225 :
226 :
227 4 : Suite * exec_suite(void)
228 : {
229 : Suite *s;
230 : TCase *tc_core;
231 : //TCase *tc_progress;
232 4 : s = suite_create("test_exec");
233 : /* Core test case */
234 4 : tc_core = tcase_create("Core");
235 4 : tcase_add_checked_fixture(tc_core, setup,NULL);
236 : //tcase_add_unchecked_fixture(tc_core, setup, teardown);
237 4 : tcase_set_timeout(tc_core,65);
238 4 : tcase_add_test(tc_core, check_guid);
239 4 : tcase_add_test(tc_core, check_exec);
240 4 : tcase_add_test(tc_core, check_writefile);
241 4 : suite_add_tcase(s, tc_core);
242 4 : return s;
243 : }
244 :
245 :
246 4 : int main(void)
247 : {
248 : int number_failed;
249 : Suite *s;
250 : SRunner *sr;
251 :
252 4 : s = exec_suite();
253 4 : sr = srunner_create(s);
254 4 : srunner_run_all(sr, CK_VERBOSE | CK_NOFORK);
255 1 : number_failed = srunner_ntests_failed(sr);
256 1 : srunner_free(sr);
257 1 : return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
258 : }
|