merge master code to build iotivity
[platform/upstream/iotivity.git] / resource / csdk / security / unittest / iotvticalendartest.cpp
1 // Copyright 2015 Intel Mobile Communications GmbH All Rights Reserved.
2 //
3 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
18
19 //Not supported on Arduino due lack of absolute time need to implement iCalendar
20 #ifndef WITH_ARDUINO
21
22 #include "gtest/gtest.h"
23 #include "iotvticalendar.h"
24 #include "logger.h"
25
26 #define TAG  PCF("CALENDAR-UT")
27
28 static void printPeriod(IotvtICalPeriod_t *period)
29 {
30     if(NULL == period)
31     {
32         return;
33     }
34
35     OC_LOG_V(INFO, TAG, PCF("period->startDateTime.tm_year = %d"),period->startDateTime.tm_year);
36     OC_LOG_V(INFO, TAG, PCF("period->startDateTime.tm_mon = %d"),period->startDateTime.tm_mon);
37     OC_LOG_V(INFO, TAG, PCF("period->startDateTime.tm_mday = %d"),period->startDateTime.tm_mday);
38     OC_LOG_V(INFO, TAG, PCF("period->startDateTime.tm_hour = %d"),period->startDateTime.tm_hour);
39     OC_LOG_V(INFO, TAG, PCF("period->startDateTime.tm_min = %d"),period->startDateTime.tm_min);
40     OC_LOG_V(INFO, TAG, PCF("period->startDateTime.tm_sec = %d"),period->startDateTime.tm_sec);
41
42     OC_LOG_V(INFO, TAG, PCF("period->endDateTime.tm_year = %d"),period->endDateTime.tm_year);
43     OC_LOG_V(INFO, TAG, PCF("period->endDateTime.tm_mon = %d"),period->endDateTime.tm_mon);
44     OC_LOG_V(INFO, TAG, PCF("period->endDateTime.tm_mday = %d"),period->endDateTime.tm_mday);
45     OC_LOG_V(INFO, TAG, PCF("period->endDateTime.tm_hour = %d"),period->endDateTime.tm_hour);
46     OC_LOG_V(INFO, TAG, PCF("period->endDateTime.tm_min = %d"),period->endDateTime.tm_min);
47     OC_LOG_V(INFO, TAG, PCF("period->startDateTime.tm_sec = %d"),period->endDateTime.tm_sec);
48 }
49
50
51 static void printRecur(IotvtICalRecur_t *recur)
52 {
53     OC_LOG_V(INFO, TAG, PCF("recur->freq = %d"), recur->freq);
54     OC_LOG_V(INFO, TAG, PCF("recur->until.tm_year = %d"), recur->until.tm_year);
55     OC_LOG_V(INFO, TAG, PCF("recur->until.tm_mon = %d"), recur->until.tm_mon);
56     OC_LOG_V(INFO, TAG, PCF("recur->until.tm_mday = %d"), recur->until.tm_mday);
57
58     if(recur->byDay & SUNDAY)
59     {
60         OC_LOG_V(INFO, TAG, PCF("recur->byDay = %s"), "Sunday");
61     }
62     if(recur->byDay & MONDAY)
63     {
64         OC_LOG_V(INFO, TAG, PCF("recur->byDay = %s"), "Monday");
65     }
66     if(recur->byDay & TUESDAY)
67     {
68         OC_LOG_V(INFO, TAG, PCF("recur->byDay = %s"), "Tuesday");
69     }
70     if(recur->byDay & WEDNESDAY)
71     {
72         OC_LOG_V(INFO, TAG, PCF("recur->byDay = %s"), "Wednesday");
73     }
74     if(recur->byDay & THURSDAY)
75     {
76         OC_LOG_V(INFO, TAG, PCF("recur->byDay = %s"), "Thursday");
77     }
78     if(recur->byDay & FRIDAY)
79     {
80         OC_LOG_V(INFO, TAG, PCF("recur->byDay = %s"), "Friday");
81     }
82     if(recur->byDay & SATURDAY)
83     {
84         OC_LOG_V(INFO, TAG, PCF("recur->byDay = %s"), "Saturday");
85     }
86 }
87
88 //ParsePeriod Tests
89 TEST(ParsePeriodTest, ParsePeriodValidDateTime)
90 {
91     char periodStr[] = "20150629T153050/20150630T233055";
92     IotvtICalPeriod_t period = IotvtICalPeriod_t();
93     EXPECT_EQ(IOTVTICAL_SUCCESS, ParsePeriod(periodStr,&period));
94     printPeriod(&period);
95 }
96
97 TEST(ParsePeriodTest, ParsePeriodValidDate)
98 {
99     char periodStr[] = "20150629/20150630";
100     IotvtICalPeriod_t period = IotvtICalPeriod_t();
101     EXPECT_EQ(IOTVTICAL_SUCCESS, ParsePeriod(periodStr,&period));
102     printPeriod(&period);
103 }
104
105 TEST(ParsePeriodTest, ParsePeriodMismatchStartDTEndDT1)
106 {
107     char periodStr[] = "20150629T153050/20150630";
108     IotvtICalPeriod_t period = IotvtICalPeriod_t();
109     EXPECT_EQ(IOTVTICAL_INVALID_PERIOD, ParsePeriod(periodStr,&period));
110 }
111
112 TEST(ParsePeriodTest, ParsePeriodMismatchStartDTEndDT2)
113 {
114     char periodStr[] = "20150629/20150630T203055";
115     IotvtICalPeriod_t period = IotvtICalPeriod_t();
116     EXPECT_EQ(IOTVTICAL_INVALID_PERIOD, ParsePeriod(periodStr,&period));
117 }
118
119 TEST(ParsePeriodTest, ParsePeriodInvalidStartDT1)
120 {
121     char periodStr[] = "20150629T1530/20150630T203055";
122     IotvtICalPeriod_t period = IotvtICalPeriod_t();
123     EXPECT_EQ(IOTVTICAL_INVALID_PERIOD, ParsePeriod(periodStr,&period));
124 }
125
126 TEST(ParsePeriodTest, ParsePeriodInvalidEndtDT2)
127 {
128     char periodStr[] = "20150629T153050/20150630203055";
129     IotvtICalPeriod_t period = IotvtICalPeriod_t();
130     EXPECT_EQ(IOTVTICAL_INVALID_PERIOD, ParsePeriod(periodStr,&period));
131 }
132
133 TEST(ParsePeriodTest, ParsePeriodInvalidStartD3)
134 {
135     char periodStr[] = "201506/20150630";
136     IotvtICalPeriod_t period = IotvtICalPeriod_t();
137     EXPECT_EQ(IOTVTICAL_INVALID_PERIOD, ParsePeriod(periodStr,&period));
138 }
139
140 TEST(ParsePeriodTest, ParsePeriodInvalidEndD4)
141 {
142     char periodStr[] = "20150629/201530";
143     IotvtICalPeriod_t period = IotvtICalPeriod_t();
144     EXPECT_EQ(IOTVTICAL_INVALID_PERIOD, ParsePeriod(periodStr,&period));
145 }
146
147 TEST(ParsePeriodTest, ParsePeriodEndDTBeforeStartDT)
148 {
149     char periodStr[] = "20150630T203055/20150629T153050";
150     IotvtICalPeriod_t period = IotvtICalPeriod_t();
151     EXPECT_EQ(IOTVTICAL_INVALID_PERIOD, ParsePeriod(periodStr,&period));
152 }
153 TEST(ParsePeriodTest, ParsePeriodEndDBeforeStartD)
154 {
155     char periodStr[] = "20150630/20150629";
156     IotvtICalPeriod_t period = IotvtICalPeriod_t();
157     EXPECT_EQ(IOTVTICAL_INVALID_PERIOD, ParsePeriod(periodStr,&period));
158 }
159
160 TEST(ParseRecurTest, ParseRecurValid1)
161 {
162     char recurStr[] = "FREQ=DAILY; UNTIL=20150703; BYDAY=MO, WE, FR";
163     IotvtICalRecur_t recur = IotvtICalRecur_t();
164     EXPECT_EQ(IOTVTICAL_SUCCESS, ParseRecur(recurStr, &recur));
165     printRecur(&recur);
166 }
167
168 TEST(ParseRecurTest, ParseRecurValid2)
169 {
170     char recurStr[] = "FREQ=DAILY";
171     IotvtICalRecur_t recur =  IotvtICalRecur_t();
172     EXPECT_EQ(IOTVTICAL_SUCCESS, ParseRecur(recurStr, &recur));
173     printRecur(&recur);
174 }
175
176 TEST(ParseRecurTest, ParseRecurInValidFreq1)
177 {
178     char recurStr[] = "FREQ=WEEKLY; UNTIL=20150703; BYDAY=TU";
179     IotvtICalRecur_t recur = IotvtICalRecur_t();
180     EXPECT_EQ(IOTVTICAL_INVALID_RRULE, ParseRecur(recurStr, &recur));
181 }
182
183 TEST(ParseRecurTest, ParseRecurInValidFreq2)
184 {
185     char recurStr[] = "UNTIL=20150703; BYDAY=TU";
186     IotvtICalRecur_t recur =  IotvtICalRecur_t();
187     EXPECT_EQ(IOTVTICAL_INVALID_RRULE, ParseRecur(recurStr, &recur));
188 }
189
190 TEST(ParseRecurTest, ParseRecurInValidUntil)
191 {
192     char recurStr[] = "FREQ=DAILY; UNTIL=20150703T095055; BYDAY=MO, WE, FR";
193     IotvtICalRecur_t recur = IotvtICalRecur_t();
194     EXPECT_EQ(IOTVTICAL_INVALID_RRULE, ParseRecur(recurStr, &recur));
195 }
196
197 TEST(ParseRecurTest, ParseRecurInValidByday)
198 {
199     char recurStr[] = "FREQ=DAILY; UNTIL=20150703; BYDAY=";
200     IotvtICalRecur_t recur = IotvtICalRecur_t();
201     EXPECT_EQ(IOTVTICAL_INVALID_RRULE, ParseRecur(recurStr, &recur));
202 }
203
204 //FIXME: ALL IsRequestWithinValidTime tests will fail after 20151230
205 TEST(IsRequestWithinValidTimeTest, IsRequestWithinValidTimeValidPeriod1)
206 {
207     char periodStr[] = "20150630/20151230";
208     EXPECT_EQ(IOTVTICAL_VALID_ACCESS, IsRequestWithinValidTime(periodStr, NULL));
209 }
210
211 TEST(IsRequestWithinValidTimeTest, IsRequestWithinValidTimeValidPeriodAndRecur1)
212 {
213     //Daily on days MO, WE & FR from 6:00:00am to 8:00:00pm until 20151230
214     char recurStr[] = "FREQ=DAILY; UNTIL=20151230; BYDAY=MO, WE, FR";
215     char periodStr[] = "20150630T060000/20150630T200000";
216
217     time_t rt = time(0);
218     IotvtICalDateTime_t *ct = localtime(&rt);
219
220     int byDay = MONDAY | WEDNESDAY | FRIDAY;
221     int isValidWD = (0x1 << ct->tm_wday) & byDay;
222
223     if(isValidWD && 6 <= ct->tm_hour && 20>= ct->tm_hour)
224     {
225         EXPECT_EQ(IOTVTICAL_VALID_ACCESS, IsRequestWithinValidTime(periodStr, recurStr));
226     }
227     else
228     {
229         EXPECT_EQ(IOTVTICAL_INVALID_ACCESS, IsRequestWithinValidTime(periodStr, recurStr));
230     }
231 }
232
233 TEST(IsRequestWithinValidTimeTest, IsRequestWithinValidTimeValidPeriodAndRecur2)
234 {
235     //Daily forever from 6:00:00am to 8:00:00pm
236     char recurStr[] = "FREQ=DAILY";
237     char periodStr[] = "20150630T060000/20150630T200000";
238
239     time_t rt = time(0);
240     IotvtICalDateTime_t *ct = localtime(&rt);
241
242     if(6 <= ct->tm_hour && 20>= ct->tm_hour)
243     {
244         EXPECT_EQ(IOTVTICAL_VALID_ACCESS, IsRequestWithinValidTime(periodStr, recurStr));
245     }
246     else
247     {
248         EXPECT_EQ(IOTVTICAL_INVALID_ACCESS, IsRequestWithinValidTime(periodStr, recurStr));
249     }
250 }
251
252 TEST(IsRequestWithinValidTimeTest, IsRequestWithinValidTimeValidPeriodAndRecur3)
253 {
254     //Daily until 20151230 from 6:00:00am to 8:00:00pm
255     char recurStr[] = "FREQ=DAILY; UNTIL=20151230";
256     char periodStr[] = "20150630T060000/20150630T200000";
257
258     time_t rt = time(0);
259     IotvtICalDateTime_t *ct = localtime(&rt);
260
261     if(6 <= ct->tm_hour && 20>= ct->tm_hour)
262     {
263         EXPECT_EQ(IOTVTICAL_VALID_ACCESS, IsRequestWithinValidTime(periodStr, recurStr));
264     }
265     else
266     {
267         EXPECT_EQ(IOTVTICAL_INVALID_ACCESS, IsRequestWithinValidTime(periodStr, recurStr));
268     }
269 }
270
271 TEST(IsRequestWithinValidTimeTest, IsRequestWithinValidTimeValidPeriodAndRecur4)
272 {
273     //Daily forever on days MO, WE & Fr from 6:00:00am to 8:00:00pm
274     char recurStr[] = "FREQ=DAILY; BYDAY=MO, WE, FR";
275     char periodStr[] = "20150630T060000/20150630T200000";
276
277     time_t rt = time(0);
278     IotvtICalDateTime_t *ct = localtime(&rt);
279
280     int byDay = MONDAY | WEDNESDAY | FRIDAY;
281     int isValidWD = (0x1 << ct->tm_wday) & byDay;
282
283     if(isValidWD && 6 <= ct->tm_hour && 20>= ct->tm_hour)
284     {
285         EXPECT_EQ(IOTVTICAL_VALID_ACCESS, IsRequestWithinValidTime(periodStr, recurStr));
286     }
287     else
288     {
289         EXPECT_EQ(IOTVTICAL_INVALID_ACCESS, IsRequestWithinValidTime(periodStr, recurStr));
290     }
291 }
292
293 TEST(IsRequestWithinValidTimeTest, IsRequestWithinValidTimeInValidPeriodAndValidRecur)
294 {
295     //Daily forever on days MO, WE & Fr
296     char recurStr[] = "FREQ=DAILY; BYDAY=MO, WE, FR";
297     char periodStr[] = "20150630/20150730";
298
299     EXPECT_EQ(IOTVTICAL_INVALID_ACCESS, IsRequestWithinValidTime(periodStr, recurStr));
300 }
301
302 #endif