RDK Documentation (Open Sourced RDK Components)
curlMocks.c
1 #include <curl/curl.h>
2 #include <stdarg.h>
3 #include <string.h>
4 #include <stdlib.h>
5 
6 #include "curlMocks.h"
7 
8 #undef curl_easy_setopt
9 #undef curl_easy_getinfo
10 
11 typedef struct _MockCurlInstanceData
12 {
13  /* Actual option values set by the client of curl */
14  MockCurlOpts opts;
15 
16  /* A callback provided by the user of the mock, to be called on curl_easy_perform */
17  MockCurlPerformCallback mockPerformCallback;
18  void *mockPerformUserData;
20 
21 static MockCurlInstanceData f_mockInstance;
22 
23 static struct Curl_share
24 {
25  int dummy;
26 } f_mockShare;
27 
28 /* BEGIN - methods to access mock functionality */
29 void MockCurlSetPerformCallback(MockCurlPerformCallback mockPerformCallback, void* userData)
30 {
31  f_mockInstance.mockPerformCallback = mockPerformCallback;
32  f_mockInstance.mockPerformUserData = userData;
33 }
34 
35 void MockCurlReset(void)
36 {
37  memset(&f_mockInstance, 0, sizeof(f_mockInstance));
38 }
39 
40 const MockCurlOpts* MockCurlGetOpts(void)
41 {
42  return &f_mockInstance.opts;
43 }
44 /* END - methods to access mock functionality */
45 
46 CURL *curl_easy_init(void)
47 {
48  return NULL;
49 }
50 
51 CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...)
52 {
53  va_list arg;
54  void *paramp;
55 
56  va_start(arg, option);
57  paramp = va_arg(arg, void *);
58 
59  switch (option)
60  {
61  case CURLOPT_WRITEFUNCTION:
62  f_mockInstance.opts.writeFunction = (MockCurlWriteCallback)paramp;
63  break;
64 
65  case CURLOPT_WRITEDATA:
66  f_mockInstance.opts.writeData = paramp;
67  break;
68 
69  case CURLOPT_URL:
70  strcpy(f_mockInstance.opts.url, paramp);
71  break;
72 
73  case CURLOPT_HTTPGET:
74  f_mockInstance.opts.httpGet = (long)paramp;
75  break;
76 
77  case CURLOPT_POSTFIELDSIZE:
78  f_mockInstance.opts.postFieldSize = (long)paramp;
79  break;
80 
81  case CURLOPT_POSTFIELDS:
82  strncpy(f_mockInstance.opts.postFields, paramp, f_mockInstance.opts.postFieldSize);
83  f_mockInstance.opts.postFields[f_mockInstance.opts.postFieldSize] = '\0';
84  break;
85  }
86 
87  va_end(arg);
88 
89  return CURLE_OK;
90 }
91 
92 CURLcode curl_easy_perform(CURL *curl)
93 {
94  if (f_mockInstance.mockPerformCallback)
95  {
96  f_mockInstance.mockPerformCallback(curl, f_mockInstance.opts.writeFunction, f_mockInstance.opts.writeData, f_mockInstance.mockPerformUserData);
97  }
98  return CURLE_OK;
99 }
100 
101 CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...)
102 {
103  va_list arg;
104  void *paramp;
105 
106  va_start(arg, info);
107  paramp = va_arg(arg, void *);
108 
109  switch (info)
110  {
111  case CURLINFO_RESPONSE_CODE:
112  *((long*)paramp) = 200;
113  break;
114  }
115 
116  va_end(arg);
117  return CURLE_OK;
118 }
119 
120 CURL_EXTERN char *curl_easy_unescape(CURL *handle, const char *string, int length, int *outlength)
121 {
122  char *p;
123 
124  /* Just copy the string. */
125  p = (char *)malloc(length + 1);
126  if (p != NULL)
127  {
128  strcpy(p, string);
129  *outlength = length;
130  }
131 
132  return p;
133 }
134 
135 const char *curl_easy_strerror(CURLcode code)
136 {
137  return "";
138 }
139 
140 void curl_easy_cleanup(CURL *curl)
141 {
142 }
143 
144 void curl_free(void *p)
145 {
146  free(p);
147 }
148 
149 struct curl_slist *curl_slist_append(struct curl_slist * list, const char * val)
150 {
151  if (f_mockInstance.opts.headerCount < MOCK_CURL_MAX_HEADERS)
152  {
153  size_t dataSize = strlen(val);
154  char *header = (char*)&f_mockInstance.opts.headers[f_mockInstance.opts.headerCount++];
155  memcpy(header, val, dataSize);
156  }
157  return NULL;
158 }
159 
160 void curl_slist_free_all(struct curl_slist * list)
161 {
162  f_mockInstance.opts.headerCount = 0u;
163 }
164 
165 CURLSH *curl_share_init(void)
166 {
167  return (CURLSH *)&f_mockShare;
168 }
169 
170 CURLSHcode curl_share_setopt(CURLSH *c, CURLSHoption option, ...)
171 {
172  return CURLSHE_OK;
173 }
174 
175 CURLSHcode curl_share_cleanup(CURLSH *c)
176 {
177  return CURLSHE_OK;
178 }
_MockCurlInstanceData
Definition: curlMocks.c:11
_MockCurlOpts
Definition: curlMocks.h:12
Curl_share
Definition: curlMocks.c:23