Annotation of embedaddon/strongswan/src/libimcv/suites/test_imcv_swima.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2017-2018 Andreas Steffen
3: * HSR Hochschule fuer Technik Rapperswil
4: *
5: * This program is free software; you can redistribute it and/or modify it
6: * under the terms of the GNU General Public License as published by the
7: * Free Software Foundation; either version 2 of the License, or (at your
8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9: *
10: * This program is distributed in the hope that it will be useful, but
11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13: * for more details.
14: */
15:
16: #include "test_suite.h"
17:
18: #include "swima/swima_record.h"
19: #include "swima/swima_data_model.h"
20: #include "swima/swima_inventory.h"
21: #include "swima/swima_event.h"
22: #include "swima/swima_events.h"
23: #include "swima/swima_collector.h"
24: #include "ietf/swima/ietf_swima_attr_req.h"
25: #include "ietf/swima/ietf_swima_attr_sw_inv.h"
26: #include "ietf/swima/ietf_swima_attr_sw_ev.h"
27:
28: static pen_type_t ita_data_model = { PEN_ITA, 0x19 };
29:
30: static char* sw_id_str[] = {
31: "strongswan.org_strongSwan_5.3.3",
32: "strongswan.org_62251aa6-1a01-479b-aea6-f3dcf0ab1f1a"
33: };
34: static char sw_locator_str[] = "/usr/share/strongswan";
35:
36: static char* sw_record_str[] = {
37: "<SoftwareIdentity tagId=\"abc\"></SoftwareIdentity>",
38: "<SoftwareIdentity tagId=\"def\"></SoftwareIdentity>"
39: };
40:
41: START_TEST(test_imcv_swima_record)
42: {
43: chunk_t sw_id, sw_locator, locator;
44: swima_record_t *sw_record, *sw_record_cp;
45: uint32_t record_id = 1;
46: uint8_t source_id = 2;
47: chunk_t record = chunk_from_str(sw_record_str[0]);
48:
49: sw_id = chunk_from_str(sw_id_str[0]);
50: sw_locator = chunk_from_str(sw_locator_str);
51:
52: /* Software Identity with Software Locator */
53: sw_record = swima_record_create(record_id, sw_id, sw_locator),
54: ck_assert(sw_record);
55: sw_record_cp = sw_record->get_ref(sw_record);
56:
57: ck_assert(record_id == sw_record->get_record_id(sw_record));
58: ck_assert_chunk_eq(sw_id, sw_record->get_sw_id(sw_record, NULL));
59: ck_assert_chunk_eq(sw_id, sw_record->get_sw_id(sw_record, &locator));
60: ck_assert_chunk_eq(locator, sw_locator);
61:
62: sw_record->set_data_model(sw_record, ita_data_model);
63: ck_assert(pen_type_equals(sw_record->get_data_model(sw_record),
64: ita_data_model));
65:
66: sw_record->set_source_id(sw_record, source_id);
67: ck_assert(source_id == sw_record->get_source_id(sw_record));
68:
69: sw_record->set_record(sw_record, record);
70: ck_assert_chunk_eq(record, sw_record->get_record(sw_record));
71:
72: sw_record->destroy(sw_record);
73: sw_record_cp->destroy(sw_record);
74:
75: /* Software Identity without Software Locator */
76: sw_record = swima_record_create(record_id, sw_id, chunk_empty),
77: ck_assert(sw_record);
78: ck_assert_chunk_eq(sw_id, sw_record->get_sw_id(sw_record, &locator));
79: ck_assert(locator.ptr == NULL && locator.len == 0);
80:
81: ck_assert(pen_type_equals(swima_data_model_iso_2015_swid_xml,
82: sw_record->get_data_model(sw_record)));
83:
84: sw_record->destroy(sw_record);
85: }
86: END_TEST
87:
88: typedef struct req_data_t req_data_t;
89:
90: struct req_data_t {
91: uint8_t flags;
92: uint32_t request_id;
93: uint32_t earliest_eid;
94: uint32_t sw_id_count;
95: chunk_t value;
96: };
97:
98: static req_data_t req_data[] = {
99: { IETF_SWIMA_ATTR_REQ_FLAG_NONE, 1, 0, 0, chunk_from_chars(
100: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
101: 0x00, 0x00)
102: },
103: { IETF_SWIMA_ATTR_REQ_FLAG_R, 2, 15, 1, chunk_from_chars(
104: 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
105: 0x00, 0x0F, 0x00, 0x1f, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67,
106: 0x73, 0x77, 0x61, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x5f, 0x73,
107: 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x53, 0x77, 0x61, 0x6e, 0x5f,
108: 0x35, 0x2e, 0x33, 0x2e, 0x33)
109: },
110: { IETF_SWIMA_ATTR_REQ_FLAG_S, 3, 256, 2, chunk_from_chars(
111: 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
112: 0x01, 0x00, 0x00, 0x1f, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67,
113: 0x73, 0x77, 0x61, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x5f, 0x73,
114: 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x53, 0x77, 0x61, 0x6e, 0x5f,
115: 0x35, 0x2e, 0x33, 0x2e, 0x33, 0x00, 0x33, 0x73, 0x74, 0x72,
116: 0x6f, 0x6e, 0x67, 0x73, 0x77, 0x61, 0x6e, 0x2e, 0x6f, 0x72,
117: 0x67, 0x5f, 0x36, 0x32, 0x32, 0x35, 0x31, 0x61, 0x61, 0x36,
118: 0x2d, 0x31, 0x61, 0x30, 0x31, 0x2d, 0x34, 0x37, 0x39, 0x62,
119: 0x2d, 0x61, 0x65, 0x61, 0x36, 0x2d, 0x66, 0x33, 0x64, 0x63,
120: 0x66, 0x30, 0x61, 0x62, 0x31, 0x66, 0x31, 0x61)
121: },
122: };
123:
124: START_TEST(test_imcv_swima_sw_req)
125: {
126: pen_type_t type;
127: pen_type_t pen_type = { PEN_IETF, IETF_ATTR_SWIMA_REQUEST };
128: pa_tnc_attr_t *attr, *attr1, *attr2;
129: ietf_swima_attr_req_t *c_attr;
130: swima_record_t *target;
131: swima_inventory_t *targets;
132: chunk_t sw_id, value;
133: enumerator_t *enumerator;
134: uint32_t offset;
135: int n;
136:
137: attr = ietf_swima_attr_req_create(req_data[_i].flags,
138: req_data[_i].request_id);
139: ck_assert(attr);
140:
141: type = attr->get_type(attr);
142: ck_assert(pen_type_equals(type, pen_type));
143:
144: ck_assert(attr->get_noskip_flag(attr) == FALSE);
145: attr->set_noskip_flag(attr, TRUE);
146: ck_assert(attr->get_noskip_flag(attr) == TRUE);
147:
148: targets = swima_inventory_create();
149: targets->set_eid(targets, req_data[_i].earliest_eid, 0);
150:
151: for (n = 0; n < req_data[_i].sw_id_count; n++)
152: {
153: sw_id = chunk_from_str(sw_id_str[n]);
154: target = swima_record_create(0, sw_id, chunk_empty);
155: targets->add(targets, target);
156: }
157: c_attr = (ietf_swima_attr_req_t*)attr;
158: c_attr->set_targets(c_attr, targets);
159: c_attr->set_targets(c_attr, targets);
160: targets->destroy(targets);
161:
162: attr->build(attr);
163: attr->build(attr);
164: value = attr->get_value(attr);
165: ck_assert_chunk_eq(value, req_data[_i].value);
166:
167: attr1 = attr->get_ref(attr);
168: attr->destroy(attr);
169:
170: attr2 = ietf_swima_attr_req_create_from_data(value.len, value);
171: ck_assert(attr2);
172:
173: attr1->destroy(attr1);
174: ck_assert(attr2->process(attr2, &offset) == SUCCESS);
175:
176: type = attr2->get_type(attr2);
177: ck_assert(pen_type_equals(type, pen_type));
178:
179: c_attr = (ietf_swima_attr_req_t*)attr2;
180: ck_assert(c_attr->get_flags(c_attr) == req_data[_i].flags);
181: ck_assert(c_attr->get_request_id(c_attr) == req_data[_i].request_id);
182:
183: targets = c_attr->get_targets(c_attr);
184: ck_assert(targets->get_eid(targets, NULL) == req_data[_i].earliest_eid);
185:
186: enumerator = targets->create_enumerator(targets);
187: ck_assert(enumerator);
188: n = 0;
189: while (enumerator->enumerate(enumerator, &target))
190: {
191: sw_id = target->get_sw_id(target, NULL);
192: ck_assert(chunk_equals(sw_id, chunk_from_str(sw_id_str[n++])));
193: }
194: enumerator->destroy(enumerator);
195:
196: attr2->destroy(attr2);
197: }
198: END_TEST
199:
200: START_TEST(test_imcv_swima_sw_req_trunc)
201: {
202: pa_tnc_attr_t *attr;
203: chunk_t data;
204: uint32_t offset = 100;
205:
206: /* Data smaller than minimum size */
207: attr = ietf_swima_attr_req_create_from_data(0, chunk_empty);
208: ck_assert(attr);
209: ck_assert(attr->process(attr, &offset) == FAILED && offset == 0);
210: attr->destroy(attr);
211:
212: /* Truncate first SW ID */
213: data = req_data[2].value;
214: data.len = 14;
215: attr = ietf_swima_attr_req_create_from_data(data.len, data);
216: ck_assert(attr);
217: ck_assert(attr->process(attr, &offset) == FAILED && offset == 12);
218: attr->destroy(attr);
219:
220: /* Truncate second SW ID */
221: data = req_data[2].value;
222: data.len = 47;
223: attr = ietf_swima_attr_req_create_from_data(data.len, data);
224: ck_assert(attr);
225: ck_assert(attr->process(attr, &offset) == FAILED && offset == 45);
226: attr->destroy(attr);
227:
228: /* Segmentation */
229: data = req_data[2].value;
230: data.len = 50;
231: attr = ietf_swima_attr_req_create_from_data(req_data[2].value.len, data);
232: ck_assert(attr);
233: ck_assert(attr->process(attr, &offset) == NEED_MORE);
234: data = chunk_skip(req_data[2].value, 50);
235: attr->add_segment(attr, data);
236: ck_assert(attr->process(attr, &offset) == SUCCESS);
237: attr->destroy(attr);
238: }
239: END_TEST
240:
241: static pen_type_t sw_inv_types[] = {
242: { PEN_IETF, IETF_ATTR_SW_INVENTORY },
243: { PEN_IETF, IETF_ATTR_SW_ID_INVENTORY }
244: };
245:
246: typedef struct sw_inv_data_t sw_inv_data_t;
247:
248: struct sw_inv_data_t {
249: uint8_t flags;
250: uint32_t request_id;
251: uint32_t eid_epoch;
252: uint32_t last_eid;
253: chunk_t value;
254: };
255:
256: static sw_inv_data_t sw_inv_data[] = {
257: { IETF_SWIMA_ATTR_SW_INV_FLAG_NONE, 0xaabbccd0, 0x87654321, 0x00000007,
258: chunk_from_chars(
259: 0x00, 0x00, 0x00, 0x00, 0xAA, 0xBB, 0xCC, 0xD0, 0x87, 0x65,
260: 0x43, 0x21, 0x00, 0x00, 0x00, 0x07)
261: },
262: { IETF_SWIMA_ATTR_SW_INV_FLAG_NONE, 0xaabbccd1, 0x87654321, 0x00000007,
263: chunk_from_chars(
264: 0x00, 0x00, 0x00, 0x00, 0xAA, 0xBB, 0xCC, 0xD1, 0x87, 0x65,
265: 0x43, 0x21, 0x00, 0x00, 0x00, 0x07)
266: },
267: { IETF_SWIMA_ATTR_SW_INV_FLAG_NONE, 0xaabbccd2, 0x12345678, 0x00000030,
268: chunk_from_chars(
269: 0x00, 0x00, 0x00, 0x01, 0xAA, 0xBB, 0xCC, 0xD2, 0x12, 0x34,
270: 0x56, 0x78, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
271: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x73, 0x74,
272: 0x72, 0x6F, 0x6E, 0x67, 0x73, 0x77, 0x61, 0x6E, 0x2E, 0x6F,
273: 0x72, 0x67, 0x5F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x53,
274: 0x77, 0x61, 0x6E, 0x5F, 0x35, 0x2E, 0x33, 0x2E, 0x33, 0x00,
275: 0x00, 0x00, 0x00, 0x00, 0x31, 0x3C, 0x53, 0x6F, 0x66, 0x74,
276: 0x77, 0x61, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6E, 0x74, 0x69,
277: 0x74, 0x79, 0x20, 0x74, 0x61, 0x67, 0x49, 0x64, 0x3D, 0x22,
278: 0x61, 0x62, 0x63, 0x22, 0x3E, 0x3C, 0x2F, 0x53, 0x6F, 0x66,
279: 0x74, 0x77, 0x61, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6E, 0x74,
280: 0x69, 0x74, 0x79, 0x3E)
281: },
282: { IETF_SWIMA_ATTR_SW_INV_FLAG_NONE, 0xaabbccd3, 0x12345678, 0x00000030,
283: chunk_from_chars(
284: 0x00, 0x00, 0x00, 0x01, 0xAA, 0xBB, 0xCC, 0xD3, 0x12, 0x34,
285: 0x56, 0x78, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
286: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x73, 0x74,
287: 0x72, 0x6F, 0x6E, 0x67, 0x73, 0x77, 0x61, 0x6E, 0x2E, 0x6F,
288: 0x72, 0x67, 0x5F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x53,
289: 0x77, 0x61, 0x6E, 0x5F, 0x35, 0x2E, 0x33, 0x2E, 0x33, 0x00,
290: 0x00)
291: },
292: { IETF_SWIMA_ATTR_SW_INV_FLAG_S_F, 0xaabbccd4, 0x12345678, 0x00000034,
293: chunk_from_chars(
294: 0x80, 0x00, 0x00, 0x02, 0xAA, 0xBB, 0xCC, 0xD4, 0x12, 0x34,
295: 0x56, 0x78, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00,
296: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x73, 0x74,
297: 0x72, 0x6F, 0x6E, 0x67, 0x73, 0x77, 0x61, 0x6E, 0x2E, 0x6F,
298: 0x72, 0x67, 0x5F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x53,
299: 0x77, 0x61, 0x6E, 0x5F, 0x35, 0x2E, 0x33, 0x2E, 0x33, 0x00,
300: 0x00, 0x00, 0x00, 0x00, 0x31, 0x3C, 0x53, 0x6F, 0x66, 0x74,
301: 0x77, 0x61, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6E, 0x74, 0x69,
302: 0x74, 0x79, 0x20, 0x74, 0x61, 0x67, 0x49, 0x64, 0x3D, 0x22,
303: 0x61, 0x62, 0x63, 0x22, 0x3E, 0x3C, 0x2F, 0x53, 0x6F, 0x66,
304: 0x74, 0x77, 0x61, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6E, 0x74,
305: 0x69, 0x74, 0x79, 0x3E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90,
306: 0x2A, 0x19, 0x11, 0x00, 0x00, 0x33, 0x73, 0x74, 0x72, 0x6F,
307: 0x6E, 0x67, 0x73, 0x77, 0x61, 0x6E, 0x2E, 0x6F, 0x72, 0x67,
308: 0x5F, 0x36, 0x32, 0x32, 0x35, 0x31, 0x61, 0x61, 0x36, 0x2D,
309: 0x31, 0x61, 0x30, 0x31, 0x2D, 0x34, 0x37, 0x39, 0x62, 0x2D,
310: 0x61, 0x65, 0x61, 0x36, 0x2D, 0x66, 0x33, 0x64, 0x63, 0x66,
311: 0x30, 0x61, 0x62, 0x31, 0x66, 0x31, 0x61, 0x00, 0x00, 0x00,
312: 0x00, 0x00, 0x31, 0x3C, 0x53, 0x6F, 0x66, 0x74, 0x77, 0x61,
313: 0x72, 0x65, 0x49, 0x64, 0x65, 0x6E, 0x74, 0x69, 0x74, 0x79,
314: 0x20, 0x74, 0x61, 0x67, 0x49, 0x64, 0x3D, 0x22, 0x64, 0x65,
315: 0x66, 0x22, 0x3E, 0x3C, 0x2F, 0x53, 0x6F, 0x66, 0x74, 0x77,
316: 0x61, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6E, 0x74, 0x69, 0x74,
317: 0x79, 0x3E)
318: },
319: { IETF_SWIMA_ATTR_SW_INV_FLAG_S_F, 0xaabbccd5, 0x12345678, 0x00000034,
320: chunk_from_chars(
321: 0x80, 0x00, 0x00, 0x02, 0xAA, 0xBB, 0xCC, 0xD5, 0x12, 0x34,
322: 0x56, 0x78, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00,
323: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x73, 0x74,
324: 0x72, 0x6F, 0x6E, 0x67, 0x73, 0x77, 0x61, 0x6E, 0x2E, 0x6F,
325: 0x72, 0x67, 0x5F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x53,
326: 0x77, 0x61, 0x6E, 0x5F, 0x35, 0x2E, 0x33, 0x2E, 0x33, 0x00,
327: 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x2A, 0x19, 0x11,
328: 0x00, 0x00, 0x33, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x73,
329: 0x77, 0x61, 0x6E, 0x2E, 0x6F, 0x72, 0x67, 0x5F, 0x36, 0x32,
330: 0x32, 0x35, 0x31, 0x61, 0x61, 0x36, 0x2D, 0x31, 0x61, 0x30,
331: 0x31, 0x2D, 0x34, 0x37, 0x39, 0x62, 0x2D, 0x61, 0x65, 0x61,
332: 0x36, 0x2D, 0x66, 0x33, 0x64, 0x63, 0x66, 0x30, 0x61, 0x62,
333: 0x31, 0x66, 0x31, 0x61, 0x00, 0x00)
334: }
335: };
336:
337: START_TEST(test_imcv_swima_inv)
338: {
339: pen_type_t type, data_model;
340: chunk_t sw_id, record, value;
341: ietf_swima_attr_sw_inv_t *c_attr;
342: pa_tnc_attr_t *attr, *attr1, *attr2;
343: swima_record_t *sw_record;
344: swima_inventory_t *sw_inv;
345: enumerator_t *enumerator;
346: uint32_t offset, epoch;
347: uint8_t source_id;
348: bool sw_id_only = _i % 2;
349: int n;
350:
351: attr = ietf_swima_attr_sw_inv_create(sw_inv_data[_i].flags,
352: sw_inv_data[_i].request_id,
353: sw_id_only);
354:
355: sw_inv = swima_inventory_create();
356: sw_inv->set_eid(sw_inv, sw_inv_data[_i].last_eid, sw_inv_data[_i].eid_epoch);
357: for (n = 0; n < _i/2; n++)
358: {
359: sw_id = chunk_from_str(sw_id_str[n]);
360: sw_record = swima_record_create(n, sw_id, chunk_empty);
361:
362: if (n == 1)
363: {
364: sw_record->set_data_model(sw_record, ita_data_model);
365: sw_record->set_source_id(sw_record, 0x11);
366: }
367: if (!sw_id_only)
368: {
369: record = chunk_from_str(sw_record_str[n]);
370: sw_record->set_record(sw_record, record);
371: }
372: sw_inv->add(sw_inv, sw_record);
373: }
374: c_attr = (ietf_swima_attr_sw_inv_t*)attr;
375: c_attr->set_inventory(c_attr, sw_inv);
376: c_attr->set_inventory(c_attr, sw_inv);
377:
378: attr->build(attr);
379: attr->build(attr);
380: sw_inv->destroy(sw_inv);
381:
382: type = attr->get_type(attr);
383: ck_assert(pen_type_equals(type, sw_inv_types[sw_id_only]));
384:
385: ck_assert(attr->get_noskip_flag(attr) == FALSE);
386: attr->set_noskip_flag(attr, TRUE);
387: ck_assert(attr->get_noskip_flag(attr) == TRUE);
388:
389: value = attr->get_value(attr);
390: ck_assert_chunk_eq(value, sw_inv_data[_i].value);
391:
392: attr1 = attr->get_ref(attr);
393: attr->destroy(attr);
394:
395: attr2 = ietf_swima_attr_sw_inv_create_from_data(value.len, value,
396: sw_id_only);
397: ck_assert(attr2);
398: attr1->destroy(attr1);
399: ck_assert(attr2->process(attr2, &offset) == SUCCESS);
400:
401: type = attr2->get_type(attr2);
402: ck_assert(pen_type_equals(type, sw_inv_types[sw_id_only]));
403:
404: c_attr = (ietf_swima_attr_sw_inv_t*)attr2;
405: ck_assert(c_attr->get_flags(c_attr) == sw_inv_data[_i].flags);
406: ck_assert(c_attr->get_record_count(c_attr) == 0);
407: ck_assert(c_attr->get_request_id(c_attr) == sw_inv_data[_i].request_id);
408:
409: sw_inv = c_attr->get_inventory(c_attr);
410: ck_assert(sw_inv->get_eid(sw_inv, NULL) == sw_inv_data[_i].last_eid);
411: ck_assert(sw_inv->get_eid(sw_inv, &epoch) == sw_inv_data[_i].last_eid);
412: ck_assert(epoch == sw_inv_data[_i].eid_epoch);
413: ck_assert(sw_inv);
414: ck_assert(sw_inv->get_count(sw_inv) == _i/2);
415:
416: enumerator = sw_inv->create_enumerator(sw_inv);
417: ck_assert(enumerator);
418:
419: n = 0;
420: while (enumerator->enumerate(enumerator, &sw_record))
421: {
422: ck_assert(sw_record->get_record_id(sw_record) == n);
423: data_model = sw_record->get_data_model(sw_record);
424: ck_assert(pen_type_equals(data_model, (n == 1) ? ita_data_model :
425: swima_data_model_iso_2015_swid_xml));
426: source_id = sw_record->get_source_id(sw_record);
427: ck_assert(source_id == (n == 1 ? 0x11 : 0x00));
428: n++;
429: }
430: enumerator->destroy(enumerator);
431: ck_assert(n == _i/2);
432:
433: attr2->destroy(attr2);
434: }
435: END_TEST
436:
437: /**
438: * Offsets in sw_inv_data[4].value
439: *
440: * 0 constant header
441: * 12 segment 1 - 12 octets
442: * 16 record_id
443: * 18 segment 2 - 6 octets
444: * 20 data_model_pen
445: * 22 segment 3 - 4 octets
446: * 23 segment 4 - 1 octet
447: * 23 data_model_type
448: * 24 segment 5 - 1 octet
449: * 24 source_id
450: * 25 segment 6 - 1 octet
451: * 25 reserved
452: * 26 sw_id
453: * 27 segment 7 - 2 octets
454: * 59 sw_locator
455: * 60 segment 8 - 33 octets
456: * 61 record
457: * 63 segment 9 - 3 octets
458: * 114 sw record 2
459: * 115 segment 10 - 52 octets
460: * 231 segment 11 - 117 octets
461: */
462:
463: START_TEST(test_imcv_swima_sw_inv_trunc)
464: {
465: pa_tnc_attr_t *attr;
466: ietf_swima_attr_sw_inv_t *c_attr;
467: chunk_t data;
468: swima_inventory_t *sw_inv;
469: size_t len = sw_inv_data[4].value.len;
470: uint32_t offset = 100;
471:
472: /* Data smaller than minimum size */
473: attr = ietf_swima_attr_sw_inv_create_from_data(0, chunk_empty, FALSE);
474: ck_assert(attr);
475: ck_assert(attr->process(attr, &offset) == FAILED && offset == 0);
476: attr->destroy(attr);
477:
478: /* Length larger than data */
479: data = sw_inv_data[4].value;
480: attr = ietf_swima_attr_sw_inv_create_from_data(len + 2, data, FALSE);
481: ck_assert(attr);
482: ck_assert(attr->process(attr, &offset) == FAILED && offset == len);
483: attr->destroy(attr);
484:
485: /* Segment 1 truncates minimum size */
486: data = sw_inv_data[4].value;
487: data.len = 12;
488: attr = ietf_swima_attr_sw_inv_create_from_data(len, data, FALSE);
489: ck_assert(attr);
490: ck_assert(attr->process(attr, &offset) == NEED_MORE);
491:
492: /* Segment 2 truncates record_id */
493: data = chunk_skip(sw_inv_data[4].value, 12);
494: data.len = 6;
495: attr->add_segment(attr, data);
496: ck_assert(attr->process(attr, &offset) == NEED_MORE);
497:
498: /* Segment 3 truncates data_model_pen */
499: data = chunk_skip(sw_inv_data[4].value, 18);
500: data.len = 4;
501: attr->add_segment(attr, data);
502: ck_assert(attr->process(attr, &offset) == NEED_MORE);
503:
504: /* Segment 4 truncates data_model_type */
505: data = chunk_skip(sw_inv_data[4].value, 22);
506: data.len = 1;
507: attr->add_segment(attr, data);
508: ck_assert(attr->process(attr, &offset) == NEED_MORE);
509:
510: /* Segment 5 truncates source_id */
511: data = chunk_skip(sw_inv_data[4].value, 23);
512: data.len = 1;
513: attr->add_segment(attr, data);
514: ck_assert(attr->process(attr, &offset) == NEED_MORE);
515:
516: /* Segment 6 truncates reserved */
517: data = chunk_skip(sw_inv_data[4].value, 24);
518: data.len = 1;
519: attr->add_segment(attr, data);
520: ck_assert(attr->process(attr, &offset) == NEED_MORE);
521:
522: /* Segment 7 truncates sw_id */
523: data = chunk_skip(sw_inv_data[4].value, 25);
524: data.len = 2;
525: attr->add_segment(attr, data);
526: ck_assert(attr->process(attr, &offset) == NEED_MORE);
527:
528: /* Segment 8 truncates sw_locator */
529: data = chunk_skip(sw_inv_data[4].value, 27);
530: data.len = 33;
531: attr->add_segment(attr, data);
532: ck_assert(attr->process(attr, &offset) == NEED_MORE);
533:
534: /* Segment 9 truncates record */
535: data = chunk_skip(sw_inv_data[4].value, 60);
536: data.len = 3;
537: attr->add_segment(attr, data);
538: ck_assert(attr->process(attr, &offset) == NEED_MORE);
539:
540: /* Segment 10 truncates second sw_record */
541: data = chunk_skip(sw_inv_data[4].value, 63);
542: data.len = 52;
543: attr->add_segment(attr, data);
544: ck_assert(attr->process(attr, &offset) == SUCCESS);
545:
546: /* Process first inventory entry */
547: c_attr = (ietf_swima_attr_sw_inv_t*)attr;
548: sw_inv = c_attr->get_inventory(c_attr);
549: ck_assert(sw_inv->get_count(sw_inv) == 1);
550: c_attr->clear_inventory(c_attr);
551:
552: /* Segment 11 truncates second sw_record */
553: data = chunk_skip(sw_inv_data[4].value, 115);
554: data.len = 117;
555: attr->add_segment(attr, data);
556: ck_assert(attr->process(attr, &offset) == SUCCESS);
557:
558: /* Process second inventory entry */
559: sw_inv = c_attr->get_inventory(c_attr);
560: ck_assert(sw_inv->get_count(sw_inv) == 1);
561: c_attr->clear_inventory(c_attr);
562:
563: attr->destroy(attr);
564: }
565: END_TEST
566:
567: static char* sw_ev_timestamp_str[] = {
568: "2017-05-30T18:09:25Z",
569: "2017-06-14T15:38:00Z"
570: };
571:
572: START_TEST(test_imcv_swima_event)
573: {
574: chunk_t sw_id, sw_timestamp, timestamp;
575: swima_event_t *sw_event, *sw_event_cp;
576: swima_record_t *sw_record;
577: uint32_t record_id = 1, eid = 7;
578: uint8_t action = SWIMA_EVENT_ACTION_CREATION;
579:
580: sw_id = chunk_from_str(sw_id_str[0]);
581: sw_timestamp = chunk_from_str(sw_ev_timestamp_str[0]);
582:
583: /* Software Identity without Software Locator */
584: sw_record = swima_record_create(record_id, sw_id, chunk_empty),
585: ck_assert(sw_record);
586:
587: sw_event = swima_event_create(eid, sw_timestamp, action, sw_record);
588: ck_assert(sw_event);
589: sw_event_cp = sw_event->get_ref(sw_event);
590:
591: ck_assert(sw_event->get_eid(sw_event, NULL) == eid);
592: ck_assert(sw_event->get_eid(sw_event, ×tamp) == eid);
593: ck_assert_chunk_eq(sw_timestamp, timestamp);
594: ck_assert(sw_event->get_action(sw_event) == action);
595: sw_event->destroy(sw_event);
596:
597: sw_record = sw_event_cp->get_sw_record(sw_event_cp);
598: ck_assert(sw_record);
599: ck_assert(sw_record->get_record_id(sw_record) == record_id);
600: ck_assert_chunk_eq(sw_record->get_sw_id(sw_record, NULL), sw_id);
601: sw_event_cp->destroy(sw_event_cp);
602: }
603: END_TEST
604:
605: static pen_type_t sw_ev_types[] = {
606: { PEN_IETF, IETF_ATTR_SW_EVENTS },
607: { PEN_IETF, IETF_ATTR_SW_ID_EVENTS }
608: };
609:
610: typedef struct sw_ev_data_t sw_ev_data_t;
611:
612: struct sw_ev_data_t {
613: uint8_t flags;
614: uint32_t request_id;
615: uint32_t eid_epoch;
616: uint32_t last_eid;
617: uint32_t last_consulted_eid;
618: chunk_t value;
619: };
620:
621: static sw_ev_data_t sw_ev_data[] = {
622: { IETF_SWIMA_ATTR_SW_EV_FLAG_NONE, 0xaabbccd0, 0x87654321, 0x00000007,
623: 0x00000007, chunk_from_chars(
624: 0x00, 0x00, 0x00, 0x00, 0xAA, 0xBB, 0xCC, 0xD0, 0x87, 0x65,
625: 0x43, 0x21, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07)
626: },
627: { IETF_SWIMA_ATTR_SW_EV_FLAG_NONE, 0xaabbccd1, 0x87654321, 0x00000007,
628: 0x00000007, chunk_from_chars(
629: 0x00, 0x00, 0x00, 0x00, 0xAA, 0xBB, 0xCC, 0xD1, 0x87, 0x65,
630: 0x43, 0x21, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07)
631: },
632: { IETF_SWIMA_ATTR_SW_EV_FLAG_NONE, 0xaabbccd2, 0x12345678, 0x00000030,
633: 0x00000030, chunk_from_chars(
634: 0x00, 0x00, 0x00, 0x01, 0xAA, 0xBB, 0xCC, 0xD2, 0x12, 0x34,
635: 0x56, 0x78, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30,
636: 0x00, 0x00, 0x00, 0x30, '2', '0', '1', '7', '-', '0',
637: '5', '-', '3', '0', 'T', '1', '8', ':', '0', '9',
638: ':', '2', '5', 'Z', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
639: 0x00, 0x00, 0x00, 0x01, 0x00, 0x1F, 0x73, 0x74, 0x72, 0x6F,
640: 0x6E, 0x67, 0x73, 0x77, 0x61, 0x6E, 0x2E, 0x6F, 0x72, 0x67,
641: 0x5F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x53, 0x77, 0x61,
642: 0x6E, 0x5F, 0x35, 0x2E, 0x33, 0x2E, 0x33, 0x00, 0x00, 0x00,
643: 0x00, 0x00, 0x31, 0x3C, 0x53, 0x6F, 0x66, 0x74, 0x77, 0x61,
644: 0x72, 0x65, 0x49, 0x64, 0x65, 0x6E, 0x74, 0x69, 0x74, 0x79,
645: 0x20, 0x74, 0x61, 0x67, 0x49, 0x64, 0x3D, 0x22, 0x61, 0x62,
646: 0x63, 0x22, 0x3E, 0x3C, 0x2F, 0x53, 0x6F, 0x66, 0x74, 0x77,
647: 0x61, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6E, 0x74, 0x69, 0x74,
648: 0x79, 0x3E)
649: },
650: { IETF_SWIMA_ATTR_SW_EV_FLAG_NONE, 0xaabbccd3, 0x12345678, 0x00000030,
651: 0x00000030, chunk_from_chars(
652: 0x00, 0x00, 0x00, 0x01, 0xAA, 0xBB, 0xCC, 0xD3, 0x12, 0x34,
653: 0x56, 0x78, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30,
654: 0x00, 0x00, 0x00, 0x30, '2', '0', '1', '7', '-', '0',
655: '5', '-', '3', '0', 'T', '1', '8', ':', '0', '9',
656: ':', '2', '5', 'Z', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
657: 0x00, 0x00, 0x00, 0x01, 0x00, 0x1F, 0x73, 0x74, 0x72, 0x6F,
658: 0x6E, 0x67, 0x73, 0x77, 0x61, 0x6E, 0x2E, 0x6F, 0x72, 0x67,
659: 0x5F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x53, 0x77, 0x61,
660: 0x6E, 0x5F, 0x35, 0x2E, 0x33, 0x2E, 0x33, 0x00, 0x00)
661: },
662: { IETF_SWIMA_ATTR_SW_EV_FLAG_S_F, 0xaabbccd4, 0x12345678, 0x00000050,
663: 0x00000034, chunk_from_chars(
664: 0x80, 0x00, 0x00, 0x02, 0xAA, 0xBB, 0xCC, 0xD4, 0x12, 0x34,
665: 0x56, 0x78, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x34,
666: 0x00, 0x00, 0x00, 0x30, '2', '0', '1', '7', '-', '0',
667: '5', '-', '3', '0', 'T', '1', '8', ':', '0', '9',
668: ':', '2', '5', 'Z', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
669: 0x00, 0x00, 0x00, 0x01, 0x00, 0x1F, 0x73, 0x74, 0x72, 0x6F,
670: 0x6E, 0x67, 0x73, 0x77, 0x61, 0x6E, 0x2E, 0x6F, 0x72, 0x67,
671: 0x5F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x53, 0x77, 0x61,
672: 0x6E, 0x5F, 0x35, 0x2E, 0x33, 0x2E, 0x33, 0x00, 0x00, 0x00,
673: 0x00, 0x00, 0x31, 0x3C, 0x53, 0x6F, 0x66, 0x74, 0x77, 0x61,
674: 0x72, 0x65, 0x49, 0x64, 0x65, 0x6E, 0x74, 0x69, 0x74, 0x79,
675: 0x20, 0x74, 0x61, 0x67, 0x49, 0x64, 0x3D, 0x22, 0x61, 0x62,
676: 0x63, 0x22, 0x3E, 0x3C, 0x2F, 0x53, 0x6F, 0x66, 0x74, 0x77,
677: 0x61, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6E, 0x74, 0x69, 0x74,
678: 0x79, 0x3E, 0x00, 0x00, 0x00, 0x34, '2', '0', '1', '7',
679: '-', '0', '6', '-', '1', '4', 'T', '1', '5', ':',
680: '3', '8', ':', '0', '0', 'Z', 0x00, 0x00, 0x00, 0x01,
681: 0x00, 0x90, 0x2A, 0x19, 0x11, 0x02, 0x00, 0x33, 0x73, 0x74,
682: 0x72, 0x6F, 0x6E, 0x67, 0x73, 0x77, 0x61, 0x6E, 0x2E, 0x6F,
683: 0x72, 0x67, 0x5F, 0x36, 0x32, 0x32, 0x35, 0x31, 0x61, 0x61,
684: 0x36, 0x2D, 0x31, 0x61, 0x30, 0x31, 0x2D, 0x34, 0x37, 0x39,
685: 0x62, 0x2D, 0x61, 0x65, 0x61, 0x36, 0x2D, 0x66, 0x33, 0x64,
686: 0x63, 0x66, 0x30, 0x61, 0x62, 0x31, 0x66, 0x31, 0x61, 0x00,
687: 0x00, 0x00, 0x00, 0x00, 0x31, 0x3C, 0x53, 0x6F, 0x66, 0x74,
688: 0x77, 0x61, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6E, 0x74, 0x69,
689: 0x74, 0x79, 0x20, 0x74, 0x61, 0x67, 0x49, 0x64, 0x3D, 0x22,
690: 0x64, 0x65, 0x66, 0x22, 0x3E, 0x3C, 0x2F, 0x53, 0x6F, 0x66,
691: 0x74, 0x77, 0x61, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6E, 0x74,
692: 0x69, 0x74, 0x79, 0x3E)
693: },
694: { IETF_SWIMA_ATTR_SW_EV_FLAG_S_F, 0xaabbccd5, 0x12345678, 0x00000050,
695: 0x00000034, chunk_from_chars(
696: 0x80, 0x00, 0x00, 0x02, 0xAA, 0xBB, 0xCC, 0xD5, 0x12, 0x34,
697: 0x56, 0x78, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x34,
698: 0x00, 0x00, 0x00, 0x30, '2', '0', '1', '7', '-', '0',
699: '5', '-', '3', '0', 'T', '1', '8', ':', '0', '9',
700: ':', '2', '5', 'Z', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
701: 0x00, 0x00, 0x00, 0x01, 0x00, 0x1F, 0x73, 0x74, 0x72, 0x6F,
702: 0x6E, 0x67, 0x73, 0x77, 0x61, 0x6E, 0x2E, 0x6F, 0x72, 0x67,
703: 0x5F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x53, 0x77, 0x61,
704: 0x6E, 0x5F, 0x35, 0x2E, 0x33, 0x2E, 0x33, 0x00, 0x00, 0x00,
705: 0x00, 0x00, 0x34, '2', '0', '1', '7', '-', '0', '6',
706: '-', '1', '4', 'T', '1', '5', ':', '3', '8', ':',
707: '0', '0', 'Z', 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x2A,
708: 0x19, 0x11, 0x02, 0x00, 0x33, 0x73, 0x74, 0x72, 0x6F, 0x6E,
709: 0x67, 0x73, 0x77, 0x61, 0x6E, 0x2E, 0x6F, 0x72, 0x67, 0x5F,
710: 0x36, 0x32, 0x32, 0x35, 0x31, 0x61, 0x61, 0x36, 0x2D, 0x31,
711: 0x61, 0x30, 0x31, 0x2D, 0x34, 0x37, 0x39, 0x62, 0x2D, 0x61,
712: 0x65, 0x61, 0x36, 0x2D, 0x66, 0x33, 0x64, 0x63, 0x66, 0x30,
713: 0x61, 0x62, 0x31, 0x66, 0x31, 0x61, 0x00, 0x00)
714: }
715: };
716:
717: START_TEST(test_imcv_swima_ev)
718: {
719: pen_type_t type, data_model;
720: chunk_t sw_id, record, timestamp, value;
721: ietf_swima_attr_sw_ev_t *c_attr;
722: pa_tnc_attr_t *attr, *attr1, *attr2;
723: swima_record_t *sw_record;
724: swima_event_t *sw_event;
725: swima_events_t *sw_ev;
726: enumerator_t *enumerator;
727: uint32_t offset, epoch, eid, last_eid;
728: uint8_t source_id, action;
729: bool sw_id_only = _i % 2;
730: int n;
731:
732: attr = ietf_swima_attr_sw_ev_create(sw_ev_data[_i].flags,
733: sw_ev_data[_i].request_id,
734: sw_id_only);
735: sw_ev = swima_events_create();
736: sw_ev->set_eid(sw_ev, sw_ev_data[_i].last_consulted_eid,
737: sw_ev_data[_i].eid_epoch);
738: if (sw_ev_data[_i].last_consulted_eid < sw_ev_data[_i].last_eid)
739: {
740: sw_ev->set_last_eid(sw_ev, sw_ev_data[_i].last_eid);
741: }
742:
743: for (n = 0; n < _i/2; n++)
744: {
745: sw_id = chunk_from_str(sw_id_str[n]);
746: sw_record = swima_record_create(n, sw_id, chunk_empty);
747:
748: if (n == 1)
749: {
750: sw_record->set_data_model(sw_record, ita_data_model);
751: sw_record->set_source_id(sw_record, 0x11);
752: }
753: if (!sw_id_only)
754: {
755: record = chunk_from_str(sw_record_str[n]);
756: sw_record->set_record(sw_record, record);
757: }
758: eid = 0x30 + 4 * n;
759: timestamp = chunk_from_str(sw_ev_timestamp_str[n]);
760: action = n + 1;
761: sw_event = swima_event_create(eid, timestamp, action, sw_record);
762: sw_ev->add(sw_ev, sw_event);
763: }
764: c_attr = (ietf_swima_attr_sw_ev_t*)attr;
765: c_attr->set_events(c_attr, sw_ev);
766: c_attr->set_events(c_attr, sw_ev);
767:
768: attr->build(attr);
769: attr->build(attr);
770: sw_ev->destroy(sw_ev);
771:
772: type = attr->get_type(attr);
773: ck_assert(pen_type_equals(type, sw_ev_types[sw_id_only]));
774:
775: ck_assert(attr->get_noskip_flag(attr) == FALSE);
776: attr->set_noskip_flag(attr, TRUE);
777: ck_assert(attr->get_noskip_flag(attr) == TRUE);
778:
779: value = attr->get_value(attr);
780: ck_assert_chunk_eq(value, sw_ev_data[_i].value);
781:
782: attr1 = attr->get_ref(attr);
783: attr->destroy(attr);
784:
785: attr2 = ietf_swima_attr_sw_ev_create_from_data(value.len, value,
786: sw_id_only);
787: ck_assert(attr2);
788: attr1->destroy(attr1);
789: ck_assert(attr2->process(attr2, &offset) == SUCCESS);
790:
791: type = attr2->get_type(attr2);
792: ck_assert(pen_type_equals(type, sw_ev_types[sw_id_only]));
793:
794: c_attr = (ietf_swima_attr_sw_ev_t*)attr2;
795: ck_assert(c_attr->get_flags(c_attr) == sw_ev_data[_i].flags);
796: ck_assert(c_attr->get_event_count(c_attr) == 0);
797: ck_assert(c_attr->get_request_id(c_attr) == sw_ev_data[_i].request_id);
798:
799: sw_ev = c_attr->get_events(c_attr);
800: ck_assert(sw_ev);
801: eid = sw_ev->get_eid(sw_ev, NULL, NULL);
802: ck_assert(eid == sw_ev_data[_i].last_consulted_eid);
803: eid = sw_ev->get_eid(sw_ev, &epoch, &last_eid);
804: ck_assert(eid == sw_ev_data[_i].last_consulted_eid);
805: ck_assert(epoch == sw_ev_data[_i].eid_epoch);
806: ck_assert(last_eid == sw_ev_data[_i].last_eid);
807: ck_assert(sw_ev->get_count(sw_ev) == _i/2);
808:
809: enumerator = sw_ev->create_enumerator(sw_ev);
810: ck_assert(enumerator);
811:
812: n = 0;
813: while (enumerator->enumerate(enumerator, &sw_event))
814: {
815: ck_assert(sw_event->get_eid(sw_event, ×tamp) == 0x30 + 4 * n);
816: ck_assert_chunk_eq(timestamp, chunk_from_str(sw_ev_timestamp_str[n]));
817: sw_record = sw_event->get_sw_record(sw_event);
818: ck_assert(sw_record);
819: ck_assert(sw_record->get_record_id(sw_record) == n);
820: data_model = sw_record->get_data_model(sw_record);
821: ck_assert(pen_type_equals(data_model, (n == 1) ? ita_data_model :
822: swima_data_model_iso_2015_swid_xml));
823: source_id = sw_record->get_source_id(sw_record);
824: ck_assert(source_id == (n == 1 ? 0x11 : 0x00));
825: n++;
826: }
827: enumerator->destroy(enumerator);
828: ck_assert(n == _i/2);
829:
830: attr2->destroy(attr2);
831: }
832: END_TEST
833:
834:
835: /**
836: * Offsets in sw_ev_data[4].value
837: *
838: * 0 constant header
839: * 16 segment 1 - 16 octets
840: * 20 eid
841: * 22 segment 2 - 6 octets
842: * 24 timestamp
843: * 26 segment 3 - 4 octets
844: * 44 record_id
845: * 46 segment 4 - 20 octets
846: * 48 data_model_pen
847: * 50 segment 5 - 4 octets
848: * 51 segment 6 - 1 octet
849: * 51 data_model_type
850: * 52 segment 7 - 1 octet
851: * 52 source_id
852: * 53 segment 8 - 1 octet
853: * 53 action
854: * 54 sw_id
855: * 55 segment 9 - 2 octets
856: * 87 sw_locator
857: * 88 segment 10 - 33 octets
858: * 89 record
859: * 91 segment 11 - 3 octets
860: * 142 sw record 2
861: * 143 segment 12 - 52 octets
862: * 284 segment 13 - 141 octets
863: */
864:
865: START_TEST(test_imcv_swima_sw_ev_trunc)
866: {
867: pa_tnc_attr_t *attr;
868: ietf_swima_attr_sw_ev_t *c_attr;
869: chunk_t data;
870: swima_events_t *sw_ev;
871: size_t len = sw_ev_data[4].value.len;
872: uint32_t offset = 100;
873:
874: /* Data smaller than minimum size */
875: attr = ietf_swima_attr_sw_ev_create_from_data(0, chunk_empty, FALSE);
876: ck_assert(attr);
877: ck_assert(attr->process(attr, &offset) == FAILED && offset == 0);
878: attr->destroy(attr);
879:
880: /* Length larger than data */
881: data = sw_ev_data[4].value;
882: attr = ietf_swima_attr_sw_ev_create_from_data(len + 2, data, FALSE);
883: ck_assert(attr);
884: ck_assert(attr->process(attr, &offset) == FAILED && offset == len);
885: attr->destroy(attr);
886:
887: /* Segment 1 truncates minimum size */
888: data = sw_ev_data[4].value;
889: data.len = 16;
890: attr = ietf_swima_attr_sw_ev_create_from_data(len, data, FALSE);
891: ck_assert(attr);
892: ck_assert(attr->process(attr, &offset) == NEED_MORE);
893:
894: /* Segment 2 truncates eid */
895: data = chunk_skip(sw_ev_data[4].value, 16);
896: data.len = 6;
897: attr->add_segment(attr, data);
898: ck_assert(attr->process(attr, &offset) == NEED_MORE);
899:
900: /* Segment 3 truncates timestamp */
901: data = chunk_skip(sw_ev_data[4].value, 22);
902: data.len = 4;
903: attr->add_segment(attr, data);
904: ck_assert(attr->process(attr, &offset) == NEED_MORE);
905:
906: /* Segment 4 truncates record_id */
907: data = chunk_skip(sw_ev_data[4].value, 26);
908: data.len = 20;
909: attr->add_segment(attr, data);
910: ck_assert(attr->process(attr, &offset) == NEED_MORE);
911:
912: /* Segment 5 truncates data_model_pen */
913: data = chunk_skip(sw_ev_data[4].value, 46);
914: data.len = 4;
915: attr->add_segment(attr, data);
916: ck_assert(attr->process(attr, &offset) == NEED_MORE);
917:
918: /* Segment 6 truncates data_model_type */
919: data = chunk_skip(sw_ev_data[4].value, 50);
920: data.len = 1;
921: attr->add_segment(attr, data);
922: ck_assert(attr->process(attr, &offset) == NEED_MORE);
923:
924: /* Segment 7 truncates source_id */
925: data = chunk_skip(sw_ev_data[4].value, 51);
926: data.len = 1;
927: attr->add_segment(attr, data);
928: ck_assert(attr->process(attr, &offset) == NEED_MORE);
929:
930: /* Segment 8 truncates action */
931: data = chunk_skip(sw_ev_data[4].value, 52);
932: data.len = 1;
933: attr->add_segment(attr, data);
934: ck_assert(attr->process(attr, &offset) == NEED_MORE);
935:
936: /* Segment 9 truncates sw_id */
937: data = chunk_skip(sw_ev_data[4].value, 53);
938: data.len = 2;
939: attr->add_segment(attr, data);
940: ck_assert(attr->process(attr, &offset) == NEED_MORE);
941:
942: /* Segment 10 truncates sw_locator */
943: data = chunk_skip(sw_ev_data[4].value, 55);
944: data.len = 33;
945: attr->add_segment(attr, data);
946: ck_assert(attr->process(attr, &offset) == NEED_MORE);
947:
948: /* Segment 11 truncates record */
949: data = chunk_skip(sw_ev_data[4].value, 88);
950: data.len = 3;
951: attr->add_segment(attr, data);
952: ck_assert(attr->process(attr, &offset) == NEED_MORE);
953:
954: /* Segment 12 truncates second sw_entry */
955: data = chunk_skip(sw_ev_data[4].value, 91);
956: data.len = 52;
957: attr->add_segment(attr, data);
958: ck_assert(attr->process(attr, &offset) == SUCCESS);
959:
960: /* Process first event entry */
961: c_attr = (ietf_swima_attr_sw_ev_t*)attr;
962: sw_ev = c_attr->get_events(c_attr);
963: ck_assert(sw_ev->get_count(sw_ev) == 1);
964: c_attr->clear_events(c_attr);
965:
966: /* Segment 13 truncates second sw_record */
967: data = chunk_skip(sw_ev_data[4].value, 143);
968: data.len = 141;
969: attr->add_segment(attr, data);
970: ck_assert(attr->process(attr, &offset) == SUCCESS);
971:
972: /* Process second event entry */
973: sw_ev = c_attr->get_events(c_attr);
974: ck_assert(sw_ev->get_count(sw_ev) == 1);
975: c_attr->clear_events(c_attr);
976: attr->destroy(attr);
977:
978: /* Invalid Action values */
979: data = chunk_clone(sw_ev_data[2].value);
980: data.ptr[53] = 0;
981: attr = ietf_swima_attr_sw_ev_create_from_data(data.len, data, FALSE);
982: ck_assert(attr);
983: ck_assert(attr->process(attr, &offset) == FAILED);
984: attr->destroy(attr);
985:
986: data.ptr[53] = SWIMA_EVENT_ACTION_LAST + 1;
987: attr = ietf_swima_attr_sw_ev_create_from_data(data.len, data, FALSE);
988: ck_assert(attr);
989: ck_assert(attr->process(attr, &offset) == FAILED && offset == 20);
990: attr->destroy(attr);
991: chunk_free(&data);
992: }
993: END_TEST
994:
995: START_TEST(test_imcv_swima_sw_collector)
996: {
997: swima_collector_t *collector;
998: swima_inventory_t *targets, *inventory;
999: swima_events_t *events;
1000: swima_record_t *sw_record;
1001: swima_event_t *sw_event;
1002: chunk_t sw_id, sw_locator, swid_tag;
1003: enumerator_t *enumerator;
1004: uint8_t source_id;
1005: int item = 0, items;
1006:
1007: targets = swima_inventory_create();
1008: collector = swima_collector_create();
1009:
1010: /* software identifier events only */
1011: events = collector->collect_events(collector, TRUE, targets);
1012: if (events)
1013: {
1014: items = events->get_count(events);
1015: DBG1(DBG_IMC, "%d software identifiers collected", items);
1016:
1017: enumerator = events->create_enumerator(events);
1018: while (enumerator->enumerate(enumerator, &sw_event))
1019: {
1020: item++;
1021: if ( item == 1 || item == items)
1022: {
1023: sw_record = sw_event->get_sw_record(sw_event);
1024: sw_id = sw_record->get_sw_id(sw_record, NULL);
1025: source_id =sw_record->get_source_id(sw_record);
1026: DBG1(DBG_IMC, "source %u: %.*s", source_id, sw_id.len, sw_id.ptr);
1027: }
1028: }
1029: enumerator->destroy(enumerator);
1030: }
1031:
1032: /* software identifier inventory only */
1033: inventory = collector->collect_inventory(collector, TRUE, targets);
1034: if (inventory)
1035: {
1036: items = inventory->get_count(inventory);
1037: DBG1(DBG_IMC, "%d software identifiers collected", items);
1038:
1039: enumerator = inventory->create_enumerator(inventory);
1040: while (enumerator->enumerate(enumerator, &sw_record))
1041: {
1042: item++;
1043: if ( item == 1 || item == items)
1044: {
1045: sw_id = sw_record->get_sw_id(sw_record, &sw_locator);
1046: source_id =sw_record->get_source_id(sw_record);
1047: DBG1(DBG_IMC, "source %u: %.*s", source_id, sw_id.len, sw_id.ptr);
1048: if (sw_locator.len > 0)
1049: {
1050: DBG1(DBG_IMC, " locator: %.*s",
1051: sw_locator.len, sw_locator.ptr);
1052: }
1053: targets->add(targets, sw_record->get_ref(sw_record));
1054: }
1055: }
1056: enumerator->destroy(enumerator);
1057: }
1058:
1059: /* targeted software inventory */
1060: inventory = collector->collect_inventory(collector, FALSE, targets);
1061: if (inventory)
1062: {
1063: items = inventory->get_count(inventory);
1064: DBG1(DBG_IMC, "%d SWID tags collected", items);
1065:
1066: enumerator = inventory->create_enumerator(inventory);
1067: while (enumerator->enumerate(enumerator, &sw_record))
1068: {
1069: sw_id = sw_record->get_sw_id(sw_record, NULL);
1070: source_id =sw_record->get_source_id(sw_record);
1071: swid_tag = sw_record->get_record(sw_record);
1072: DBG1(DBG_IMC, "source %u: %.*s", source_id, sw_id.len, sw_id.ptr);
1073: DBG2(DBG_IMC, "%B", &swid_tag);
1074: }
1075: enumerator->destroy(enumerator);
1076: }
1077:
1078: collector->destroy(collector);
1079: targets->destroy(targets);
1080: }
1081: END_TEST
1082:
1083: Suite *imcv_swima_suite_create()
1084: {
1085: Suite *s;
1086: TCase *tc;
1087:
1088: s = suite_create("imcv_swima");
1089:
1090: tc = tcase_create("sw_record");
1091: tcase_add_test(tc, test_imcv_swima_record);
1092: suite_add_tcase(s, tc);
1093:
1094: tc = tcase_create("sw_req");
1095: tcase_add_loop_test(tc, test_imcv_swima_sw_req, 0, countof(req_data));
1096: suite_add_tcase(s, tc);
1097:
1098: tc = tcase_create("sw_req_trunc");
1099: tcase_add_test(tc, test_imcv_swima_sw_req_trunc);
1100: suite_add_tcase(s, tc);
1101:
1102: tc = tcase_create("sw_inv");
1103: tcase_add_loop_test(tc, test_imcv_swima_inv, 0, 6);
1104: suite_add_tcase(s, tc);
1105:
1106: tc = tcase_create("sw_inv_trunc");
1107: tcase_add_test(tc, test_imcv_swima_sw_inv_trunc);
1108: suite_add_tcase(s, tc);
1109:
1110: tc = tcase_create("sw_event");
1111: tcase_add_test(tc, test_imcv_swima_event);
1112: suite_add_tcase(s, tc);
1113:
1114: tc = tcase_create("sw_ev");
1115: tcase_add_loop_test(tc, test_imcv_swima_ev, 0, 6);
1116: suite_add_tcase(s, tc);
1117:
1118: tc = tcase_create("sw_ev_trunc");
1119: tcase_add_test(tc, test_imcv_swima_sw_ev_trunc);
1120: suite_add_tcase(s, tc);
1121:
1122: tc = tcase_create("sw_collector");
1123: tcase_add_test(tc, test_imcv_swima_sw_collector);
1124: suite_add_tcase(s, tc);
1125:
1126: return s;
1127: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>