Annotation of embedaddon/strongswan/src/libimcv/suites/test_imcv_swima.c, revision 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>