1 /*
2  * Copyright (C) 2012 Intel Corporation
3  *
4  * Author: Jens Georg <jensg@openismus.com>
5  *
6  * SPDX-License-Identifier: LGPL-2.1-or-later
7  *
8  */
9 #include <config.h>
10 
11 #include <stdio.h>
12 #include <string.h>
13 
14 #include <libgupnp-av/gupnp-cds-last-change-parser.h>
15 
16 typedef struct {
17         GUPnPCDSLastChangeEvent event;
18         const char *object_id;
19         const char *parent_id;
20         const char *class;
21         guint32 update_id;
22         gboolean is_st_update;
23 } TestReferenceEntry;
24 
25 typedef struct {
26     const char *file_name;
27     guint entry_count;
28     TestReferenceEntry data[100];
29 } TestReference;
30 
31 TestReference test_reference_data[] = {
32     {
33             "00-cds-last-change.xml",
34             0,
35             {}
36     },
37     {
38             "01-cds-last-change.xml",
39             8,
40             {
41                     {
42                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
43                             "s002",
44                             "s001",
45                             "object.container.album",
46                             213,
47                             TRUE,
48                     },
49                     {
50                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
51                             "s001",
52                             NULL,
53                             NULL,
54                             214,
55                             TRUE,
56                     },
57                     {
58                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
59                             "s003",
60                             "s001",
61                             "object.item.audioItem",
62                             215,
63                             FALSE,
64                     },
65                     {
66                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
67                             "s004",
68                             "s002",
69                             "object.item.audioItem",
70                             216,
71                             TRUE,
72                     },
73                     {
74                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_REMOVED,
75                             "s003",
76                             NULL,
77                             NULL,
78                             217,
79                             FALSE,
80                     },
81                     {
82                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
83                             "s001",
84                             NULL,
85                             NULL,
86                             218,
87                             FALSE,
88                     },
89                     {
90                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
91                             "s004",
92                             NULL,
93                             NULL,
94                             219,
95                             TRUE,
96                     },
97                     {
98                             GUPNP_CDS_LAST_CHANGE_EVENT_ST_DONE,
99                             "s001",
100                             NULL,
101                             NULL,
102                             219,
103                             FALSE
104                     }
105             }
106     },
107     {
108             "02-cds-last-change.xml",
109             2,
110             {
111                     {
112                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
113                             "Album001",
114                             "0",
115                             "object.container.album.musicAlbum",
116                             101,
117                             FALSE,
118                     },
119                     {
120                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
121                             "0",
122                             NULL,
123                             NULL,
124                             102,
125                             FALSE
126                     }
127             }
128     },
129     {
130             "03-cds-last-change.xml",
131             4,
132             {
133                     {
134                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
135                             "Album001",
136                             "0",
137                             "object.container.album.musicAlbum",
138                             101,
139                             FALSE
140                     },
141                     {
142                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
143                             "0",
144                             NULL,
145                             NULL,
146                             102,
147                             FALSE
148                     },
149                     {
150                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
151                             "Song001",
152                             "Album001",
153                             "object.item.audioItem",
154                             103,
155                             FALSE
156                     },
157                     {
158                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
159                             "Album001",
160                             NULL,
161                             NULL,
162                             104,
163                             FALSE
164                     }
165             }
166     },
167     {
168             "04-cds-last-change.xml",
169             8,
170             {
171                     {
172                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
173                             "Album001",
174                             "0",
175                             "object.container.album.musicAlbum",
176                             101,
177                             FALSE,
178                     },
179                     {
180                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
181                             "0",
182                             NULL,
183                             NULL,
184                             102,
185                             FALSE,
186                     },
187                     {
188                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
189                             "Song001",
190                             "Album001",
191                             "object.item.audioItem",
192                             103,
193                             FALSE,
194                     },
195                     {
196                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
197                             "Album001",
198                             NULL,
199                             NULL,
200                             104,
201                             FALSE,
202                     },
203                     {
204                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
205                             "Song002",
206                             "Album001",
207                             "object.item.audioItem",
208                             105,
209                             FALSE,
210                     },
211                     {
212                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
213                             "Album001",
214                             NULL,
215                             NULL,
216                             106,
217                             FALSE,
218                     },
219                     {
220                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_REMOVED,
221                             "Song001",
222                             NULL,
223                             NULL,
224                             107,
225                             FALSE
226                     },
227                     {
228                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
229                             "Album001",
230                             NULL,
231                             NULL,
232                             108,
233                             FALSE
234                     }
235             }
236     },
237     {
238             "05-cds-last-change.xml",
239             8,
240             {
241                     {
242                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
243                             "Album001",
244                             "0",
245                             "object.container.album.musicAlbum",
246                             101,
247                             FALSE
248                     },
249                     {
250                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
251                             "0",
252                             NULL,
253                             NULL,
254                             102,
255                             FALSE
256                     },
257                     {
258                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
259                             "Song001",
260                             "Album001",
261                             "object.item.audioItem",
262                             103,
263                             FALSE
264                     },
265                     {
266                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
267                             "Album001",
268                             NULL,
269                             NULL,
270                             104,
271                             FALSE
272                     },
273                     {
274                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
275                             "Song002",
276                             "Album001",
277                             "object.item.audioItem",
278                             105,
279                             FALSE
280                     },
281                     {
282                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
283                             "Album001",
284                             NULL,
285                             NULL,
286                             106,
287                             FALSE
288                     },
289                     {
290                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_REMOVED,
291                             "Song001",
292                             NULL,
293                             NULL,
294                             107,
295                             FALSE
296                     },
297                     {
298                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
299                             "Album001",
300                             NULL,
301                             NULL,
302                             108,
303                             FALSE
304                     }
305             }
306     },
307     {
308             "06-cds-last-change.xml",
309             2,
310             {
311                     {
312                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
313                             "Song003",
314                             "Album001",
315                             "object.item.audioItem",
316                             109,
317                             FALSE
318                     },
319                     {
320                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
321                             "Album001",
322                             NULL,
323                             NULL,
324                             110,
325                             FALSE
326                     }
327             }
328     },
329     {
330             "07-cds-last-change.xml",
331             6,
332             {
333                     {
334                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_ADDED,
335                             "Song003",
336                             "Album001",
337                             "object.item.audioItem",
338                             234,
339                             TRUE
340                     },
341                     {
342                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
343                             "Album001",
344                             NULL,
345                             NULL,
346                             235,
347                             TRUE
348                     },
349                     {
350                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
351                             "Song001",
352                             NULL,
353                             NULL,
354                             236,
355                             TRUE,
356                     },
357                     {
358                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_REMOVED,
359                             "Song002",
360                             NULL,
361                             NULL,
362                             237,
363                             TRUE,
364                     },
365                     {
366                             GUPNP_CDS_LAST_CHANGE_EVENT_OBJECT_MODIFIED,
367                             "Album001",
368                             NULL,
369                             NULL,
370                             238,
371                             TRUE,
372                     },
373                     {
374                             GUPNP_CDS_LAST_CHANGE_EVENT_ST_DONE,
375                             "Album001",
376                             NULL,
377                             NULL,
378                             238,
379                             FALSE,
380                     }
381             }
382     }
383 };
384 
385 static void
compare_entries(const char * file,GList * entries)386 compare_entries (const char *file, GList *entries)
387 {
388         guint reference_size, i, j;
389         GList *it = entries;
390 
391         reference_size = G_N_ELEMENTS (test_reference_data);
392 
393         /* Find reference entries */
394         for (i = 0; i < reference_size; i++) {
395                 if (strcmp (test_reference_data[i].file_name, file) != 0)
396                         continue;
397                 g_assert_cmpint (g_list_length (entries),
398                                  ==,
399                                  test_reference_data[i].entry_count);
400                 for (j = 0;
401                      j < test_reference_data[i].entry_count;
402                      j++, it = it->next) {
403                         TestReferenceEntry* entry;
404                         entry = &test_reference_data[i].data[j];
405                         g_assert_cmpstr (entry->class, ==,
406                                          gupnp_cds_last_change_entry_get_class (it->data));
407                         g_assert_cmpstr (entry->parent_id, ==,
408                                          gupnp_cds_last_change_entry_get_parent_id (it->data));
409                         g_assert_cmpuint (entry->update_id, ==,
410                                           gupnp_cds_last_change_entry_get_update_id (it->data));
411                         g_assert_cmpstr (entry->object_id, ==,
412                                          gupnp_cds_last_change_entry_get_object_id (it->data));
413                         g_assert_cmpint (entry->event, ==,
414                                          gupnp_cds_last_change_entry_get_event (it->data));
415                         g_assert_cmpint (entry->is_st_update, ==,
416                                          gupnp_cds_last_change_entry_is_subtree_update (it->data));
417                 }
418 
419                 return;
420         }
421 
422         g_message ("No reference entry found for file %s", file);
423         g_assert_not_reached ();
424 }
425 
426 static void
test_parse_spec_samples(void)427 test_parse_spec_samples (void)
428 {
429         GDir *dir;
430         GError *error = NULL;
431         const char *file;
432         char *data_path;
433         GUPnPCDSLastChangeParser *parser;
434 
435         parser = gupnp_cds_last_change_parser_new ();
436         data_path = g_build_filename (DATA_PATH,
437                                       "data",
438                                       "cds-last-change",
439                                       NULL);
440 
441         dir = g_dir_open (data_path, 0, &error);
442         g_assert_no_error (error);
443         while ((file = g_dir_read_name (dir)) != NULL) {
444                 char *contents;
445                 gsize length;
446                 char *file_path;
447                 GList *entries;
448 
449                 if (g_str_has_prefix (file, ".") ||
450                     g_str_has_suffix (file, "~"))
451                         continue;
452 
453                 file_path = g_build_filename (data_path, file, NULL);
454 
455                 g_file_get_contents (file_path, &contents, &length, &error);
456                 g_assert_no_error (error);
457                 g_free (file_path);
458 
459                 entries = gupnp_cds_last_change_parser_parse (parser,
460                                                               contents,
461                                                               &error);
462                 g_assert_no_error (error);
463                 compare_entries (file, entries);
464                 g_list_free_full (entries,
465                                   (GDestroyNotify) gupnp_cds_last_change_entry_unref);
466                 g_free (contents);
467         }
468 
469         g_object_unref (parser);
470         g_dir_close (dir);
471         g_free (data_path);
472 }
473 
474 int
main(int argc,char * argv[])475 main (int argc, char *argv[])
476 {
477         g_test_init (&argc, &argv, NULL);
478 
479         g_test_add_func ("/cds-last-change/parse-spec-samples",
480                          test_parse_spec_samples);
481 
482         return g_test_run ();
483 }
484