Merge test folder of test branch
[iotivity.git] / test / src / testapp / IUTSimulatorApp / c_cpp / src / IUTSimulatorUtils.cpp
1 /******************************************************************
2 *
3 * Copyright 2018 Open Connectivity Foundation 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 "IUTSimulatorUtils.h"
22
23 template <>
24 void IUTSimulatorUtils::getInputFromUser(bool &input)
25 {
26     std::string userInput = "";
27
28     while (userInput.empty())
29     {
30         getline(std::cin, userInput);
31
32         if (userInput == "1" || toLower(userInput) == "true")
33         {
34             input = true;
35         }
36         else if (userInput == "0" || toLower(userInput) == "false")
37         {
38             input = false;
39         }
40         else
41         {
42             printInput(userInput);
43             std::cout << "Please provide boolean value, either 1 or 0 or equivalently true or false" << std::endl;
44             userInput = "";
45         }
46     }
47
48     printInput(input);
49 }
50
51 template <>
52 void IUTSimulatorUtils::getInputFromUser(std::string &input)
53 {
54     std::string userInput = "";
55     while (userInput.empty())
56     {
57         getline(std::cin, userInput);
58         input = userInput;
59     }
60
61     printInput(input);
62 }
63
64 template <>
65 bool IUTSimulatorUtils::getInputFromUser()
66 {
67     bool inputValue;
68     std::string userInput = "";
69
70     while (userInput.empty())
71     {
72         getline(std::cin, userInput);
73
74         if (userInput == "1" || toLower(userInput) == "true")
75         {
76             inputValue = true;
77         }
78         else if (userInput == "0" || toLower(userInput) == "false")
79         {
80             inputValue = false;
81         }
82         else
83         {
84             printInput(userInput);
85             std::cout << "Please provide boolean value, either 1 or 0 or equivalently true or false" << std::endl;
86             userInput = "";
87         }
88     }
89     printInput(inputValue);
90     return inputValue;
91 }
92
93
94 template <>
95 std::string IUTSimulatorUtils::getInputFromUser()
96 {
97     std::string userInput = "";
98     while (userInput.empty())
99     {
100         getline(std::cin, userInput);
101     }
102
103     printInput(userInput);
104     return userInput;
105 }
106
107 int IUTSimulatorUtils::getSelectionFromUser(string what, int min, int max)
108 {
109     int selection = getInputFromUser<int>();
110     while (selection < min || selection > max)
111     {
112         cout << "Invalid selection of " << what << ". Please select " << what << " no. between " << min << " & " << max << endl;
113         getInputFromUser(selection);
114     }
115
116     return selection;
117 }
118
119 shared_ptr< OCResource > IUTSimulatorUtils::getResourceFromUser(vector< shared_ptr< OCResource > > resources)
120 {
121     if (resources.size() > 0)
122     {
123         cout << "\t" << "Please select resource no. and press Enter:" << endl;
124         cout << "\t\t" << "0. Cancel" << endl;
125         for (unsigned i = 1; i <= resources.size(); i++)
126         {
127             cout << "\t\t" << i << ". " << resources.at(i - 1)->uniqueIdentifier() << "    (" << resources.at(i - 1)->host() << ")" << endl;
128         }
129
130         int selection = getSelectionFromUser("resource", 0, resources.size());
131         if (selection != 0)
132         {
133             return resources.at(selection - 1);
134         }
135     }
136
137     return nullptr;
138 }
139
140 shared_ptr< SampleResource > IUTSimulatorUtils::getResourceFromUser(vector< shared_ptr< SampleResource > > resources)
141 {
142     if (resources.size() > 0)
143     {
144         setlocale(LC_ALL, "");
145         cout << "\t" << "Please select resource no. and press Enter:" << endl;
146         cout << "\t\t" << "0. Cancel" << endl;
147         for (unsigned i = 1; i <= resources.size(); i++)
148         {
149             cout << "\t\t" << i << ". " << resources.at(i - 1)->getUri() << endl;
150         }
151
152         int selection = getSelectionFromUser("resource", 0, resources.size());
153         if (selection != 0)
154         {
155             return resources.at(selection - 1);
156         }
157     }
158
159     return nullptr;
160 }
161
162 shared_ptr< OCResource > IUTSimulatorUtils::getResourceByURI(vector< shared_ptr< OCResource > > resources, string resourceURI)
163 {
164     for (unsigned i = 0; i < resources.size(); i++)
165     {
166         std::ostringstream stream;
167         stream << resources.at(i)->uniqueIdentifier();
168         if (stream.str().find(resourceURI) != std::string::npos)
169         {
170             return resources.at(i);
171         }
172     }
173
174     return nullptr;
175 }
176
177 shared_ptr< SampleResource > IUTSimulatorUtils::getResourceByURI(vector< shared_ptr< SampleResource > > resources, string resourceURI)
178 {
179     for (shared_ptr< SampleResource > resource : resources)
180     {
181         if (resource->getUri() == resourceURI)
182         {
183             return resource;
184         }
185     }
186
187     return nullptr;
188 }
189
190 AttributeValue IUTSimulatorUtils::getAttributeValueFromUser()
191 {
192     AttributeValue attributeValue;
193     string valueString = "";
194     string valueArray = "";
195     char valueLine[MAX_ATTRIBUTE_VALUE_LENGTH];
196
197     cout << "Please select attribute data type no. and press Enter: " << endl;
198     cout << "\t\t 1. Integer" << endl;
199     cout << "\t\t 2. Floating Point - Single Precision" << endl;
200     cout << "\t\t 3. Floating Point - Double Precision" << endl;
201     cout << "\t\t 4. Boolean" << endl;
202     cout << "\t\t 5. String" << endl;
203     cout << "\t\t 6. Array" << endl;
204
205     int selection = getSelectionFromUser("data type", 1, 6);
206
207     cout << "Please provide Attribute Value: ";
208     switch (selection)
209     {
210         case 1:
211             attributeValue = getInputFromUser<int>();
212             break;
213         case 2:
214             attributeValue = getInputFromUser<float>();
215             break;
216         case 3:
217             attributeValue = getInputFromUser<double>();
218             break;
219         case 4:
220             attributeValue = getInputFromUser<bool>();
221             break;
222         case 5:
223             cin.getline(valueLine, sizeof(attributeValue));
224             getline(cin, valueString);
225             printInput(valueString);
226             attributeValue = valueString;
227             break;
228         case 6:
229             cin.getline(valueLine, sizeof(attributeValue));
230             getline(cin, valueArray);
231             printInput(valueArray);
232             attributeValue = valueArray;
233             break;
234     }
235
236     return attributeValue;
237 }
238
239 void IUTSimulatorUtils::setResourceHostEndpointFromUser(shared_ptr< OCResource > resource, bool isSecuredClient)
240 {
241     vector< std::string > endpointHosts = resource->getAllHosts();
242     if (isSecuredClient && endpointHosts.size() > 0)
243     {
244         resource->setHost(ResourceHelper::getOnlySecuredHost(endpointHosts));
245     }
246
247     cout << "Select one of the endpoint:" << endl;
248     cout << "\t\t" << "0. Default Endpoint: " << resource->host() << endl;
249     for (unsigned i = 1; i <= endpointHosts.size(); i++)
250     {
251         cout << "\t\t" << (i) << ". " << endpointHosts[i - 1] << endl;
252     }
253
254     int selection = getSelectionFromUser("endpoint", 0, endpointHosts.size());
255     if (selection != 0)
256     {
257         resource->setHost(endpointHosts[selection - 1]);
258     }
259 }
260
261 string IUTSimulatorUtils::toLower(string str)
262 {
263     std::transform(str.begin(), str.end(), str.begin(), ::tolower);
264     return str;
265 }
266
267
268 OCRepresentation IUTSimulatorUtils::createRepresentation(std::vector< std::pair<std::string, AttributeValue> > keysValues)
269 {
270     OCRepresentation representation;
271     for (std::pair<std::string, AttributeValue> keyValue : keysValues)
272     {
273         representation.setValue(keyValue.first, keyValue.second);
274     }
275
276     return representation;
277 }
278
279 bool IUTSimulatorUtils::isValidIpAddress(string ipAddress, OCConnectivityType ipVersion)
280 {
281     switch(ipVersion)
282     {
283         case CT_IP_USE_V4:
284             struct sockaddr_in sa;
285             return  (inet_pton(AF_INET, ipAddress.c_str(), &(sa.sin_addr)) != 0);
286         case CT_IP_USE_V6:
287             struct sockaddr_in6 sa6;
288             return  (inet_pton(AF_INET6, ipAddress.c_str(), &(sa6.sin6_addr)) != 0);
289         default:
290             return false;
291     }
292 }