Merge test folder of test branch
[iotivity.git] / test / src / automation / ctt / src / DUTController.c
1 /******************************************************************
2  *
3  * Copyright 2016 Granite River Labs All Rights Reserved.
4  *
5  *
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ******************************************************************/
20
21 #include <DUTController.h>
22 #include <MiniHttpServer.h>
23 #include <uv.h>
24
25 /*Static resources Start*/
26 static ResourceMap* s_resourceMapBasic = 0;
27 static ResourceMap* s_resourceMapExtended = 0;
28 static ResourceMap* s_resourceMapSetup = 0;
29 static uv_thread_t s_serverID;
30 /*Static resource End*/
31
32 /*Doc to string conversion*/
33 char* docToString(xmlDocPtr doc)
34 {
35     char* ret = 0;
36
37     if (doc != 0)
38     {
39         xmlChar* xmlbuff;
40         int buffersize;
41         xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1);
42         ret = (char*)xmlbuff;
43     }
44
45     return ret;
46 }
47
48 /*String to Doc conversion*/
49 xmlDocPtr stringToDoc(const char* str)
50 {
51     return xmlParseMemory(str, strlen(str));
52 }
53
54 /*Callback Function to be invoked for Basic HTTP request*/
55 char* onHttpRequestBasic(const char* method, const char* url, const char* body)
56 {
57     xmlDocPtr reqDoc = 0;
58     xmlDocPtr rspDoc = 0;
59     char* ret = 0;
60     ResourceCBS resourceCBS;
61
62     if (body != 0)
63     {
64         reqDoc = stringToDoc(body);
65
66         if (reqDoc == 0) goto error;
67     }
68
69     resourceCBS = getResourceCBS(s_resourceMapBasic, method, url);
70
71     if (resourceCBS.onResource)
72     {
73         rspDoc = resourceCBS.onResource(reqDoc);
74         ret = docToString(rspDoc);
75     }
76
77     if (resourceCBS.onAfterResource)
78     {
79         resourceCBS.onAfterResource(rspDoc);
80     }
81
82     goto cleanup;
83
84 error:
85     printf("Error for %s %s\n", method, url);
86
87 cleanup:
88     if (reqDoc != 0)
89     {
90         xmlFreeDoc(reqDoc);
91     }
92
93     return ret;
94 }
95
96 /*Callback Function to be invoked after executing Basic HTTP request*/
97 void onAfterHttpRequestBasic(char* rspBody)
98 {
99     free(rspBody);
100 }
101
102
103 /*Callback Function to be invoked for Setup HTTP request*/
104 char* onHttpRequestSetup(const char* method, const char* url, const char* body)
105 {
106     xmlDocPtr reqDoc = 0;
107     xmlDocPtr rspDoc = 0;
108     char* ret = 0;
109     ResourceCBS resourceCBS;
110
111     if (body != 0)
112     {
113         reqDoc = stringToDoc(body);
114
115         if (reqDoc == 0) goto error;
116     }
117
118     resourceCBS = getResourceCBS(s_resourceMapSetup, method, url);
119
120     if (resourceCBS.onResource)
121     {
122         rspDoc = resourceCBS.onResource(reqDoc);
123         ret = docToString(rspDoc);
124     }
125
126     if (resourceCBS.onAfterResource)
127     {
128         resourceCBS.onAfterResource(rspDoc);
129
130     }
131
132     goto cleanup;
133
134 error:
135     printf("Error for %s %s\n", method, url);
136
137 cleanup:
138     if (reqDoc != 0)
139     {
140         xmlFreeDoc(reqDoc);
141     }
142
143     return ret;
144 }
145
146
147 /*Callback Function to be invoked after executing Setup HTTP request*/
148 void onAfterHttpRequestSetup(char* rspBody)
149 {
150     free(rspBody);
151 }
152
153
154 /*Callback Function to be invoked for Extended HTTP request*/
155 char* onHttpRequestExtended(const char* method, const char* url, const char* body)
156 {
157     xmlDocPtr reqDoc = 0;
158     xmlDocPtr rspDoc = 0;
159     char* ret = 0;
160     ResourceCBS resourceCBS;
161
162     if (body != 0)
163     {
164         reqDoc = stringToDoc(body);
165
166         if (reqDoc == 0) goto error;
167     }
168
169     resourceCBS = getResourceCBS(s_resourceMapExtended, method, url);
170
171     if (resourceCBS.onResource)
172     {
173         rspDoc = resourceCBS.onResource(reqDoc);
174         ret = docToString(rspDoc);
175     }
176
177     if (resourceCBS.onAfterResource)
178     {
179         resourceCBS.onAfterResource(rspDoc);
180     }
181
182     goto cleanup;
183
184 error:
185     printf("Error for %s %s\n", method, url);
186
187 cleanup:
188     if (reqDoc != 0)
189     {
190         xmlFreeDoc(reqDoc);
191     }
192
193     return ret;
194 }
195
196
197 /*Callback Function to be invoked after executing Extended HTTP request*/
198 void onAfterHttpRequestExtended(char* rspBody)
199 {
200     free(rspBody);
201 }
202
203
204 /*Init DUT Controllers related to Basic,Setup and Extended*/
205 void initDutControllers()
206 {
207     s_resourceMapBasic = createResourceMap();
208     s_resourceMapSetup = createResourceMap();
209     s_resourceMapExtended = createResourceMap();
210 }
211
212 /*Dispose DUT Controllers related to Basic,Setup and Extended*/
213 void disposeDutControllers()
214 {
215     deleteResourceMap(s_resourceMapBasic);
216     deleteResourceMap(s_resourceMapSetup);
217     deleteResourceMap(s_resourceMapExtended);
218 }
219
220 /*Add Route for Basic HTTP request*/
221 void addRouteBasic(const char* method, const char* path, resourceCB onResource, afterResourceCB onAfterResource)
222 {
223     addResourceCBS(s_resourceMapBasic, method, path, onResource, onAfterResource);
224 }
225
226 /*Add Route for Setup HTTP request*/
227 void addRouteSetup(const char* method, const char* path, resourceCB onResource, afterResourceCB onAfterResource)
228 {
229     addResourceCBS(s_resourceMapSetup, method, path, onResource, onAfterResource);
230 }
231
232 /*Add Route for Extended HTTP request*/
233 void addRouteExtended(const char* method, const char* path, resourceCB onResource, afterResourceCB onAfterResource)
234 {
235     addResourceCBS(s_resourceMapExtended, method, path, onResource, onAfterResource);
236 }
237
238 /*Start DUT controller Basic*/
239 void startDutControllerBasic(const char* ip, int port)
240 {
241     startMiniHttpServerBasic(ip, port, onHttpRequestBasic, onAfterHttpRequestBasic);
242 }
243
244 /*Start DUT controller Setup*/
245 void startDutControllerSetup(const char* ip, int port)
246 {
247     startMiniHttpServerSetup(ip, port, onHttpRequestSetup, onAfterHttpRequestSetup);
248 }
249
250 /*Start DUT controller Extended*/
251 void startDutControllerExtended(const char* ip, int port)
252 {
253     startMiniHttpServerExtended(ip, port, onHttpRequestExtended, onAfterHttpRequestExtended);
254 }
255
256 /*Stop DUT controllers*/
257 void stopDutControllers()
258 {
259     stopMiniHttpServerBasic();
260     stopMiniHttpServerSetup();
261     stopMiniHttpServerExtended();
262 }