/* SPDX-License-Identifier: GPL-2.0-or-later */ /* Copyright (c) 2019 Martin Wilck, SUSE Linux GmbH, Nuremberg */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include "unaligned.h" #include "debug.h" #include "vector.h" #include "structs.h" #include "discovery.h" #include "globals.c" #define VPD_BUFSIZ 4096 struct vpdtest { unsigned char vpdbuf[VPD_BUFSIZ]; char wwid[WWID_SIZE]; }; static int setup(void **state) { struct vpdtest *vt = malloc(sizeof(*vt)); if (vt == NULL) return -1; *state = vt; return 0; } static int teardown(void **state) { struct vpdtest *vt = *state; free(vt); *state = NULL; return 0; } /* vendor_id should have less than 8 chars to test space handling */ static const char vendor_id[] = "Linux"; static const char test_id[] = "A123456789AbcDefB123456789AbcDefC123456789AbcDefD123456789AbcDef"; int __wrap_ioctl(int fd, unsigned long request, void *param) { int len; struct sg_io_hdr *io_hdr; unsigned char *val; len = mock(); io_hdr = (struct sg_io_hdr *)param; assert_in_range(len, 0, io_hdr->dxfer_len); val = mock_ptr_type(unsigned char *); io_hdr->status = 0; memcpy(io_hdr->dxferp, val, len); return 0; } /** * create_vpd80() - create a "unit serial number" VPD page. * @buf: VPD buffer * @bufsiz: length of VPD buffer * @id: input ID * @size: value for the "page length" field * @len: actual number of characters to use from @id * * If len < size, the content will be right aligned, as mandated by the * SPC spec. * * Return: VPD length. */ static int create_vpd80(unsigned char *buf, size_t bufsiz, const char *id, int size, int len) { assert_true(len <= size); memset(buf, 0, bufsiz); buf[1] = 0x80; put_unaligned_be16(size, buf + 2); memset(buf + 4, ' ', size - len); memcpy(buf + 4 + size - len, id, len); return size + 4; } static int _hex2bin(const char hx) { assert_true(isxdigit(hx)); if (hx >= '0' && hx <= '9') return hx - '0'; if (hx >= 'a' && hx <= 'f') return hx - 'a' + 10; if (hx >= 'A' && hx <= 'F') return hx - 'A' + 10; return -1; } static void hex2bin(unsigned char *dst, const char *src, size_t dstlen, size_t srclen) { const char *sc; unsigned char *ds; assert(srclen % 2 == 0); for (sc = src, ds = dst; sc < src + srclen && ds < dst + dstlen; sc += 2, ++ds) *ds = 16 * _hex2bin(sc[0]) + _hex2bin(sc[1]); } /** * create_t10_vendor_id_desc() - Create T10 vendor ID * @desc: descriptor buffer * @id: input ID * @n: number of characters to use for ID * (includes 8 bytes for vendor ID!) * * Create a "T10 vendor specific ID" designation descriptor. * The vendor field (8 bytes) is filled with vendor_id (above). * * Return: descriptor length. */ static int create_t10_vendor_id_desc(unsigned char *desc, const char *id, size_t n) { int vnd_len = sizeof(vendor_id) - 1; /* code set: ascii */ desc[0] = 2; /* type: 10 vendor ID */ desc[1] = 1; desc[2] = 0; desc[3] = n; memcpy(desc + 4, (const unsigned char *)vendor_id, vnd_len); memset(desc + 4 + vnd_len, ' ', 8 - vnd_len); memcpy(desc + 4 + 8, (const unsigned char *)id, n - 8); return n + 4; } /** * create_eui64_desc() - create EUI64 descriptor. * @desc, @id: see above. * @n: number of bytes (8, 12, or 16). * * Create an EUI64 designation descriptor. * * Return: descriptor length. */ static int create_eui64_desc(unsigned char *desc, const char *id, size_t n) { assert_true(n == 8 || n == 12 || n == 16); /* code set: binary */ desc[0] = 1; /* type: EUI64 */ desc[1] = 2; desc[2] = 0; desc[3] = n; hex2bin(desc + 4, id, n, 2 * n); return n + 4; } /** * create_naa_desc() - create an NAA designation descriptor * @desc, @id: see above. * @naa: Name Address Authority field (2, 3, 5, or 6). * * Return: descriptor length. */ static int create_naa_desc(unsigned char *desc, const char *id, int naa) { assert_true(naa == 2 || naa == 3 || naa == 5 || naa == 6); /* code set: binary */ desc[0] = 1; /* type: NAA */ desc[1] = 3; desc[2] = 0; desc[4] = _hex2bin(id[0]) | (naa << 4); switch (naa) { case 2: case 3: case 5: hex2bin(desc + 5, id + 1, 7, 14); desc[3] = 8; return 12; case 6: hex2bin(desc + 5, id + 1, 15, 30); desc[3] = 16; return 20; default: return 0; } } /* type and flags for SCSI name string designation descriptor */ enum { STR_EUI = 0, STR_NAA, STR_IQN, STR_MASK = 0xf, ZERO_LAST = 0x10, /* flag to zero out some bytes at string end */ }; static const char * const str_prefix[] = { [STR_EUI] = "eui.", [STR_NAA] = "naa.", [STR_IQN] = "iqn.", }; static const char byte0[] = { [STR_EUI] = '2', [STR_NAA] = '3', [STR_IQN] = '8', }; /** * create_scsi_string_desc() - create a SCSI name string descriptor. * @desc, @id: see above. * @typ: one of STR_EUI, STR_NAA, STR_IQN, possibly ORd with ZERO_LAST * @maxlen: number of characters to use from input ID. * * If ZERO_LAST is set, zero out the last byte. * * Return: descriptor length. */ static int create_scsi_string_desc(unsigned char *desc, const char *id, int typ, int maxlen) { int len, plen; int type = typ & STR_MASK; /* code set: UTF-8 */ desc[0] = 3; /* type: SCSI string */ desc[1] = 8; desc[2] = 0; assert_in_range(type, STR_EUI, STR_IQN); assert_true(maxlen % 4 == 0); len = snprintf((char *)(desc + 4), maxlen, "%s%s", str_prefix[type], id); if (len > maxlen) len = maxlen; /* zero-pad */ if (typ & ZERO_LAST) len -= 2; plen = 4 * ((len - 1) / 4) + 4; memset(desc + 4 + len, '\0', plen - len); desc[3] = plen; return plen + 4; } /** * create_vpd83() - create "device identification" VPD page * @buf, @bufsiz, @id: see above. * @type: descriptor type to use (1, 2, 3, 8) * @parm: opaque parameter (e.g. means "naa" for NAA type) * @len: designator length (exact meaning depends on designator type) * * Create a "device identification" VPD page with a single * designation descriptor. * * Return: VPD page length. */ static int create_vpd83(unsigned char *buf, size_t bufsiz, const char *id, uint8_t type, int parm, int len) { unsigned char *desc; int n = 0; memset(buf, 0, bufsiz); buf[1] = 0x83; desc = buf + 4; switch (type) { case 1: n = create_t10_vendor_id_desc(desc, id, len); break; case 2: n = create_eui64_desc(desc, id, len); break; case 3: n = create_naa_desc(desc, id, parm); break; case 8: n = create_scsi_string_desc(desc, id, parm, len); break; default: break; } put_unaligned_be16(n, buf + 2); return n + 4; } /** * assert_correct_wwid() - test that a retrieved WWID matches expectations * @test: test name * @expected: expected WWID length * @returned: WWID length as returned by code under test * @byte0, @byte1: leading chars that our code prepends to the ID * (e.g. "36" for "NAA registered extended" type) * @lowercase: set if lower case WWID is expected * @orig: original ID string, may be longer than wwid * @wwid: WWID as returned by code under test */ static void assert_correct_wwid(const char *test, int expected, int returned, int byte0, int byte1, bool lowercase, const char *orig, const char *wwid) { int ofs = 0, i; condlog(2, "%s: exp/ret: %d/%d, wwid: %s", test, expected, returned, wwid); /* * byte0 and byte1 are the leading chars that our code prepends * to the ID to indicate the designation descriptor type, . */ if (byte0 != 0) { assert_int_equal(byte0, wwid[0]); ++ofs; } if (byte1 != 0) { assert_int_equal(byte1, wwid[1]); ++ofs; } /* check matching length, and length of WWID string */ assert_int_equal(expected, returned); assert_int_equal(returned, strlen(wwid)); /* check expected string value up to expected length */ for (i = 0; i < returned - ofs; i++) assert_int_equal(wwid[ofs + i], lowercase ? tolower(orig[i]) : orig[i]); } /* * For T10 vendor ID - replace sequences of spaces with a single underscore. * Use a different implementation then libmultipath, deliberately. */ static char *subst_spaces(const char *src) { char *dst = calloc(1, strlen(src) + 1); char *p; static regex_t *re; regmatch_t match; int rc; assert_non_null(dst); if (re == NULL) { re = calloc(1, sizeof(*re)); assert_non_null(re); rc = regcomp(re, " +", REG_EXTENDED); assert_int_equal(rc, 0); } for (rc = regexec(re, src, 1, &match, 0), p = dst; rc == 0; src += match.rm_eo, rc = regexec(re, src, 1, &match, 0)) { memcpy(p, src, match.rm_so); p += match.rm_so; *p = '_'; ++p; } assert_int_equal(rc, REG_NOMATCH); strcpy(p, src); return dst; } /** * test_vpd_vnd_LEN_WLEN() - test code for VPD 83, T10 vendor ID * @LEN: ID length in the VPD page (includes 8 byte vendor ID) * @WLEN: WWID buffer size * * The input ID is modified by inserting some spaces, to be able to * test the handling of spaces by the code. This is relevant only for * a minimum input length of 24. * The expected result must be adjusted accordingly. */ #define make_test_vpd_vnd(len, wlen) \ static void test_vpd_vnd_ ## len ## _ ## wlen(void **state) \ { \ struct vpdtest *vt = *state; \ int n, ret, rc; \ int exp_len; \ char *exp_wwid, *exp_subst, *input; \ \ input = strdup(test_id); \ /* 8 vendor bytes collapsed to actual vendor ID length + 1 */ \ /* and one '1' prepended */ \ exp_len = len - 8 + sizeof(vendor_id) + 1; \ \ /* insert some spaces to test space collapsing */ \ input[15] = input[17] = input[18] = ' '; \ /* adjust expectation for space treatment */ \ /* drop char for 2nd space on offset 17/18 */ \ if (len >= 18 + 9) \ --exp_len; \ /* drop trailing single '_' if input ends with space */ \ if (len == 15 + 9 || len == 17 + 9 || len == 18 + 9) \ --exp_len; \ if (exp_len >= wlen) \ exp_len = wlen - 1; \ n = create_vpd83(vt->vpdbuf, sizeof(vt->vpdbuf), input, \ 1, 0, len); \ rc = asprintf(&exp_wwid, "%s_%s", vendor_id, input); \ assert_int_not_equal(rc, -1); \ free(input); \ /* Replace spaces, like code under test */ \ exp_subst = subst_spaces(exp_wwid); \ free(exp_wwid); \ will_return(__wrap_ioctl, n); \ will_return(__wrap_ioctl, vt->vpdbuf); \ ret = get_vpd_sgio(10, 0x83, 0, vt->wwid, wlen); \ assert_correct_wwid("test_vpd_vnd_" #len "_" #wlen, \ exp_len, ret, '1', 0, false, \ exp_subst, vt->wwid); \ free(exp_subst); \ } /** * test_vpd_str_TYP_LEN_WLEN() - test code for VPD 83, SCSI name string * @TYP: numeric value of STR_EUI, STR_NAA, STR_IQN above * @LEN: ID length the VPD page * @WLEN: WWID buffer size */ #define make_test_vpd_str(typ, len, wlen) \ static void test_vpd_str_ ## typ ## _ ## len ## _ ## wlen(void **state) \ { \ struct vpdtest *vt = *state; \ int n, ret; \ int exp_len; \ int type = typ & STR_MASK; \ \ n = create_vpd83(vt->vpdbuf, sizeof(vt->vpdbuf), test_id, \ 8, typ, len); \ exp_len = len - strlen(str_prefix[type]); \ if (typ & ZERO_LAST) \ exp_len--; \ if (exp_len >= wlen) \ exp_len = wlen - 1; \ will_return(__wrap_ioctl, n); \ will_return(__wrap_ioctl, vt->vpdbuf); \ ret = get_vpd_sgio(10, 0x83, 0, vt->wwid, wlen); \ assert_correct_wwid("test_vpd_str_" #typ "_" #len "_" #wlen, \ exp_len, ret, byte0[type], 0, \ type != STR_IQN, \ test_id, vt->wwid); \ } /** * test_vpd_naa_NAA_WLEN() - test code for VPD 83 NAA designation * @NAA: Network Name Authority (2, 3, 5, or 6) * @WLEN: WWID buffer size */ #define make_test_vpd_naa(naa, wlen) \ static void test_vpd_naa_ ## naa ## _ ## wlen(void **state) \ { \ struct vpdtest *vt = *state; \ int n, ret; \ int len, exp_len; \ \ switch (naa) { \ case 2: \ case 3: \ case 5: \ len = 17; \ break; \ case 6: \ len = 33; \ break; \ } \ /* returned size is always uneven */ \ exp_len = wlen > len ? len : \ wlen % 2 == 0 ? wlen - 1 : wlen - 2; \ \ n = create_vpd83(vt->vpdbuf, sizeof(vt->vpdbuf), test_id, \ 3, naa, 0); \ will_return(__wrap_ioctl, n); \ will_return(__wrap_ioctl, vt->vpdbuf); \ ret = get_vpd_sgio(10, 0x83, 0, vt->wwid, wlen); \ assert_correct_wwid("test_vpd_naa_" #naa "_" #wlen, \ exp_len, ret, '3', '0' + naa, true, \ test_id, vt->wwid); \ } /** * test_vpd_eui_LEN_WLEN() - test code for VPD 83, EUI64 * @LEN: EUI64 length (8, 12, or 16) * @WLEN: WWID buffer size * @SML: Use small VPD page size */ #define make_test_vpd_eui(len, wlen, sml) \ static void test_vpd_eui_ ## len ## _ ## wlen ## _ ## sml(void **state) \ { \ struct vpdtest *vt = *state; \ int n, ret; \ /* returned size is always uneven */ \ int exp_len = wlen > 2 * len + 1 ? 2 * len + 1 : \ wlen % 2 == 0 ? wlen - 1 : wlen - 2; \ \ n = create_vpd83(vt->vpdbuf, sizeof(vt->vpdbuf), test_id, \ 2, 0, len); \ if (sml) { \ /* overwrite the page size to DEFAULT_SGIO_LEN + 1 */ \ put_unaligned_be16(255, vt->vpdbuf + 2); \ /* this causes get_vpd_sgio to do a second ioctl */ \ will_return(__wrap_ioctl, n); \ will_return(__wrap_ioctl, vt->vpdbuf); \ } \ will_return(__wrap_ioctl, n); \ will_return(__wrap_ioctl, vt->vpdbuf); \ ret = get_vpd_sgio(10, 0x83, 0, vt->wwid, wlen); \ assert_correct_wwid("test_vpd_eui_" #len "_" #wlen "_" #sml, \ exp_len, ret, '2', 0, true, \ test_id, vt->wwid); \ } /** * test_vpd80_SIZE_LEN_WLEN() - test code for VPD 80 * @SIZE, @LEN: see create_vpd80() * @WLEN: WWID buffer size */ #define make_test_vpd80(size, len, wlen) \ static void test_vpd80_ ## size ## _ ## len ## _ ## wlen(void **state) \ { \ struct vpdtest *vt = *state; \ int n, ret; \ int exp_len = len > 20 ? 20 : len; \ char *input = strdup(test_id); \ \ /* insert trailing whitespace after pos 20 */ \ memset(input + 20, ' ', sizeof(test_id) - 20); \ if (exp_len >= wlen) \ exp_len = wlen - 1; \ n = create_vpd80(vt->vpdbuf, sizeof(vt->vpdbuf), input, \ size, len); \ will_return(__wrap_ioctl, n); \ will_return(__wrap_ioctl, vt->vpdbuf); \ ret = get_vpd_sgio(10, 0x80, 0, vt->wwid, wlen); \ assert_correct_wwid("test_vpd80_" #size "_" #len "_" #wlen, \ exp_len, ret, 0, 0, false, \ input, vt->wwid); \ free(input); \ } /* VPD 80 */ /* Tests without trailing whitespace: 21 WWID bytes required */ make_test_vpd80(20, 20, 30); make_test_vpd80(20, 20, 21); make_test_vpd80(20, 20, 20); make_test_vpd80(20, 20, 10); /* Tests with 4 byte trailing whitespace: 21 WWID bytes required */ make_test_vpd80(24, 24, 30); make_test_vpd80(24, 24, 25); make_test_vpd80(24, 24, 24); make_test_vpd80(24, 24, 21); make_test_vpd80(24, 24, 20); /* Tests with 4 byte leading whitespace: 17 WWID bytes required */ make_test_vpd80(20, 16, 30); make_test_vpd80(20, 16, 17); make_test_vpd80(20, 16, 16); /* Tests with 4 byte leading whitespace: 21 WWID bytes required */ make_test_vpd80(24, 20, 21); make_test_vpd80(24, 20, 20); /* Tests with leading and trailing whitespace: 21 WWID bytes required */ make_test_vpd80(30, 24, 30); make_test_vpd80(30, 24, 21); make_test_vpd80(30, 24, 20); /* VPD 83, T10 vendor ID */ make_test_vpd_vnd(40, 40); make_test_vpd_vnd(40, 30); make_test_vpd_vnd(30, 20); make_test_vpd_vnd(29, 30); make_test_vpd_vnd(28, 30); make_test_vpd_vnd(27, 30); /* space at end */ make_test_vpd_vnd(26, 30); /* space at end */ make_test_vpd_vnd(25, 30); make_test_vpd_vnd(24, 30); /* space at end */ make_test_vpd_vnd(23, 30); make_test_vpd_vnd(24, 20); make_test_vpd_vnd(23, 20); make_test_vpd_vnd(22, 20); make_test_vpd_vnd(21, 20); make_test_vpd_vnd(20, 20); make_test_vpd_vnd(19, 20); make_test_vpd_vnd(20, 10); make_test_vpd_vnd(10, 10); /* EUI64 tests */ /* small vpd page test */ make_test_vpd_eui(8, 32, 1); make_test_vpd_eui(12, 32, 1); make_test_vpd_eui(16, 40, 1); /* 64bit, WWID size: 18 */ make_test_vpd_eui(8, 32, 0); make_test_vpd_eui(8, 18, 0); make_test_vpd_eui(8, 17, 0); make_test_vpd_eui(8, 16, 0); make_test_vpd_eui(8, 10, 0); /* 96 bit, WWID size: 26 */ make_test_vpd_eui(12, 32, 0); make_test_vpd_eui(12, 26, 0); make_test_vpd_eui(12, 25, 0); make_test_vpd_eui(12, 20, 0); make_test_vpd_eui(12, 10, 0); /* 128 bit, WWID size: 34 */ make_test_vpd_eui(16, 40, 0); make_test_vpd_eui(16, 34, 0); make_test_vpd_eui(16, 33, 0); make_test_vpd_eui(16, 20, 0); /* NAA IEEE registered extended (36), WWID size: 34 */ make_test_vpd_naa(6, 40); make_test_vpd_naa(6, 34); make_test_vpd_naa(6, 33); make_test_vpd_naa(6, 32); make_test_vpd_naa(6, 20); /* NAA IEEE registered (35), WWID size: 18 */ make_test_vpd_naa(5, 20); make_test_vpd_naa(5, 18); make_test_vpd_naa(5, 17); make_test_vpd_naa(5, 16); /* NAA local (33), WWID size: 18 */ make_test_vpd_naa(3, 20); make_test_vpd_naa(3, 18); make_test_vpd_naa(3, 17); make_test_vpd_naa(3, 16); /* NAA IEEE extended (32), WWID size: 18 */ make_test_vpd_naa(2, 20); make_test_vpd_naa(2, 18); make_test_vpd_naa(2, 17); make_test_vpd_naa(2, 16); /* SCSI Name string: EUI64, WWID size: 17 */ make_test_vpd_str(0, 20, 18) make_test_vpd_str(0, 20, 17) make_test_vpd_str(0, 20, 16) make_test_vpd_str(0, 20, 15) /* SCSI Name string: EUI64, zero padded, WWID size: 16 */ make_test_vpd_str(16, 20, 18) make_test_vpd_str(16, 20, 17) make_test_vpd_str(16, 20, 16) make_test_vpd_str(16, 20, 15) /* SCSI Name string: NAA, WWID size: 17 */ make_test_vpd_str(1, 20, 18) make_test_vpd_str(1, 20, 17) make_test_vpd_str(1, 20, 16) make_test_vpd_str(1, 20, 15) /* SCSI Name string: NAA, zero padded, WWID size: 16 */ make_test_vpd_str(17, 20, 18) make_test_vpd_str(17, 20, 17) make_test_vpd_str(17, 20, 16) make_test_vpd_str(17, 20, 15) /* SCSI Name string: IQN, WWID size: 17 */ make_test_vpd_str(2, 20, 18) make_test_vpd_str(2, 20, 17) make_test_vpd_str(2, 20, 16) make_test_vpd_str(2, 20, 15) /* SCSI Name string: IQN, zero padded, WWID size: 16 */ make_test_vpd_str(18, 20, 18) make_test_vpd_str(18, 20, 17) make_test_vpd_str(18, 20, 16) make_test_vpd_str(18, 20, 15) static int test_vpd(void) { const struct CMUnitTest tests[] = { cmocka_unit_test(test_vpd80_20_20_30), cmocka_unit_test(test_vpd80_20_20_21), cmocka_unit_test(test_vpd80_20_20_20), cmocka_unit_test(test_vpd80_20_20_10), cmocka_unit_test(test_vpd80_24_24_30), cmocka_unit_test(test_vpd80_24_24_25), cmocka_unit_test(test_vpd80_24_24_24), cmocka_unit_test(test_vpd80_24_24_21), cmocka_unit_test(test_vpd80_24_24_20), cmocka_unit_test(test_vpd80_20_16_30), cmocka_unit_test(test_vpd80_20_16_17), cmocka_unit_test(test_vpd80_20_16_16), cmocka_unit_test(test_vpd80_24_20_21), cmocka_unit_test(test_vpd80_24_20_20), cmocka_unit_test(test_vpd80_30_24_30), cmocka_unit_test(test_vpd80_30_24_21), cmocka_unit_test(test_vpd80_30_24_20), cmocka_unit_test(test_vpd_vnd_40_40), cmocka_unit_test(test_vpd_vnd_40_30), cmocka_unit_test(test_vpd_vnd_30_20), cmocka_unit_test(test_vpd_vnd_29_30), cmocka_unit_test(test_vpd_vnd_28_30), cmocka_unit_test(test_vpd_vnd_27_30), cmocka_unit_test(test_vpd_vnd_26_30), cmocka_unit_test(test_vpd_vnd_25_30), cmocka_unit_test(test_vpd_vnd_24_30), cmocka_unit_test(test_vpd_vnd_23_30), cmocka_unit_test(test_vpd_vnd_24_20), cmocka_unit_test(test_vpd_vnd_23_20), cmocka_unit_test(test_vpd_vnd_22_20), cmocka_unit_test(test_vpd_vnd_21_20), cmocka_unit_test(test_vpd_vnd_20_20), cmocka_unit_test(test_vpd_vnd_19_20), cmocka_unit_test(test_vpd_vnd_20_10), cmocka_unit_test(test_vpd_vnd_10_10), cmocka_unit_test(test_vpd_eui_8_32_1), cmocka_unit_test(test_vpd_eui_12_32_1), cmocka_unit_test(test_vpd_eui_16_40_1), cmocka_unit_test(test_vpd_eui_8_32_0), cmocka_unit_test(test_vpd_eui_8_18_0), cmocka_unit_test(test_vpd_eui_8_17_0), cmocka_unit_test(test_vpd_eui_8_16_0), cmocka_unit_test(test_vpd_eui_8_10_0), cmocka_unit_test(test_vpd_eui_12_32_0), cmocka_unit_test(test_vpd_eui_12_26_0), cmocka_unit_test(test_vpd_eui_12_25_0), cmocka_unit_test(test_vpd_eui_12_20_0), cmocka_unit_test(test_vpd_eui_12_10_0), cmocka_unit_test(test_vpd_eui_16_40_0), cmocka_unit_test(test_vpd_eui_16_34_0), cmocka_unit_test(test_vpd_eui_16_33_0), cmocka_unit_test(test_vpd_eui_16_20_0), cmocka_unit_test(test_vpd_naa_6_40), cmocka_unit_test(test_vpd_naa_6_34), cmocka_unit_test(test_vpd_naa_6_33), cmocka_unit_test(test_vpd_naa_6_32), cmocka_unit_test(test_vpd_naa_6_20), cmocka_unit_test(test_vpd_naa_5_20), cmocka_unit_test(test_vpd_naa_5_18), cmocka_unit_test(test_vpd_naa_5_17), cmocka_unit_test(test_vpd_naa_5_16), cmocka_unit_test(test_vpd_naa_3_20), cmocka_unit_test(test_vpd_naa_3_18), cmocka_unit_test(test_vpd_naa_3_17), cmocka_unit_test(test_vpd_naa_3_16), cmocka_unit_test(test_vpd_naa_2_20), cmocka_unit_test(test_vpd_naa_2_18), cmocka_unit_test(test_vpd_naa_2_17), cmocka_unit_test(test_vpd_naa_2_16), cmocka_unit_test(test_vpd_str_0_20_18), cmocka_unit_test(test_vpd_str_0_20_17), cmocka_unit_test(test_vpd_str_0_20_16), cmocka_unit_test(test_vpd_str_0_20_15), cmocka_unit_test(test_vpd_str_16_20_18), cmocka_unit_test(test_vpd_str_16_20_17), cmocka_unit_test(test_vpd_str_16_20_16), cmocka_unit_test(test_vpd_str_16_20_15), cmocka_unit_test(test_vpd_str_1_20_18), cmocka_unit_test(test_vpd_str_1_20_17), cmocka_unit_test(test_vpd_str_1_20_16), cmocka_unit_test(test_vpd_str_1_20_15), cmocka_unit_test(test_vpd_str_17_20_18), cmocka_unit_test(test_vpd_str_17_20_17), cmocka_unit_test(test_vpd_str_17_20_16), cmocka_unit_test(test_vpd_str_17_20_15), cmocka_unit_test(test_vpd_str_2_20_18), cmocka_unit_test(test_vpd_str_2_20_17), cmocka_unit_test(test_vpd_str_2_20_16), cmocka_unit_test(test_vpd_str_2_20_15), cmocka_unit_test(test_vpd_str_18_20_18), cmocka_unit_test(test_vpd_str_18_20_17), cmocka_unit_test(test_vpd_str_18_20_16), cmocka_unit_test(test_vpd_str_18_20_15), }; return cmocka_run_group_tests(tests, setup, teardown); } int main(void) { int ret = 0; ret += test_vpd(); return ret; }