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