LCOV - code coverage report
Current view: top level - unit_test/test_spdm_requester - vendor_request.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 94.4 % 71 67
Test Date: 2025-06-29 08:09:00 Functions: 100.0 % 4 4

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2023-2025 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_requester_lib.h"
       9              : #include "internal/libspdm_responder_lib.h"
      10              : 
      11              : #if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES
      12              : 
      13              : #pragma pack(1)
      14              : typedef struct {
      15              :     spdm_message_header_t header;
      16              :     uint16_t standard_id;
      17              :     uint8_t vendor_id_len;
      18              :     uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH];
      19              :     uint16_t data_len;
      20              :     uint8_t data[16];
      21              : } libspdm_vendor_request_test;
      22              : 
      23              : typedef struct {
      24              :     spdm_message_header_t header;
      25              :     uint16_t standard_id;
      26              :     uint8_t vendor_id_len;
      27              :     uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH];
      28              :     uint16_t data_len;
      29              :     uint8_t data[64];
      30              : } libspdm_vendor_response_test;
      31              : #pragma pack()
      32              : 
      33              : static size_t m_libspdm_local_buffer_size;
      34              : static uint8_t m_libspdm_local_buffer[LIBSPDM_MAX_MESSAGE_VCA_BUFFER_SIZE];
      35              : 
      36            1 : static libspdm_return_t libspdm_requester_vendor_cmds_test_send_message(
      37              :     void *spdm_context, size_t request_size, const void *request,
      38              :     uint64_t timeout)
      39              : {
      40              :     libspdm_test_context_t *spdm_test_context;
      41              : 
      42            1 :     spdm_test_context = libspdm_get_test_context();
      43            1 :     switch (spdm_test_context->case_id) {
      44            1 :     case 0x1: {
      45            1 :         const uint8_t *ptr = (const uint8_t *)request;
      46              : 
      47            1 :         m_libspdm_local_buffer_size = 0;
      48            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
      49              :                          ptr, request_size);
      50            1 :         m_libspdm_local_buffer_size += request_size;
      51              :     }
      52            1 :         return LIBSPDM_STATUS_SUCCESS;
      53            0 :     default:
      54            0 :         return LIBSPDM_STATUS_SEND_FAIL;
      55              :     }
      56              : }
      57              : 
      58              : /* Acts as the Responder Integration */
      59            1 : static libspdm_return_t libspdm_requester_vendor_cmds_test_receive_message(
      60              :     void *spdm_context, size_t *response_size,
      61              :     void **response, uint64_t timeout)
      62              : {
      63              :     libspdm_test_context_t *spdm_test_context;
      64            1 :     libspdm_return_t status = LIBSPDM_STATUS_SUCCESS;
      65              : 
      66            1 :     uint32_t* session_id = NULL;
      67            1 :     bool is_app_message = false;
      68            1 :     size_t transport_message_size = sizeof(libspdm_vendor_request_test);
      69              : 
      70            1 :     spdm_test_context = libspdm_get_test_context();
      71            1 :     switch (spdm_test_context->case_id) {
      72            1 :     case 0x1: {
      73              :         libspdm_vendor_response_test *spdm_response;
      74            1 :         libspdm_vendor_request_test* spdm_request = NULL;
      75              :         size_t spdm_response_size;
      76              :         size_t transport_header_size;
      77            1 :         status = libspdm_transport_test_decode_message(
      78              :             spdm_context, &session_id, &is_app_message, true,
      79              :             m_libspdm_local_buffer_size, m_libspdm_local_buffer,
      80              :             &transport_message_size, (void **)(&spdm_request));
      81            1 :         assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
      82              : 
      83            1 :         spdm_response_size = sizeof(libspdm_vendor_response_test);
      84            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
      85            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
      86              : 
      87            1 :         libspdm_zero_mem(spdm_response, spdm_response_size);
      88            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
      89            1 :         spdm_response->header.request_response_code = SPDM_VENDOR_DEFINED_RESPONSE;
      90            1 :         spdm_response->header.param1 = 0;
      91            1 :         spdm_response->header.param2 = 0;
      92              : 
      93            1 :         spdm_response->standard_id = spdm_request->standard_id;
      94            1 :         spdm_response->vendor_id_len = spdm_request->vendor_id_len;
      95              :         /* usually 2 bytes for vendor id */
      96            1 :         assert_int_equal(spdm_response->vendor_id_len, sizeof(uint16_t));
      97            1 :         libspdm_copy_mem(spdm_response->vendor_id, spdm_request->vendor_id_len,
      98            1 :                          spdm_request->vendor_id, spdm_request->vendor_id_len);
      99            1 :         spdm_response->data_len = sizeof(spdm_response->data);
     100            1 :         libspdm_set_mem(spdm_response->data, sizeof(spdm_response->data), 0xff);
     101              : 
     102            1 :         status = libspdm_transport_test_encode_message(spdm_context, NULL, false,
     103              :                                                        false, spdm_response_size,
     104              :                                                        spdm_response,
     105              :                                                        response_size, response);
     106            1 :         assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     107              :     }
     108            1 :         return LIBSPDM_STATUS_SUCCESS;
     109              : 
     110            0 :     default:
     111            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     112              :     }
     113              : }
     114              : 
     115              : /**
     116              :  * Test 1: Sending a vendor defined request
     117              :  * Expected behavior: client returns a status of LIBSPDM_STATUS_SUCCESS and expected response
     118              :  **/
     119            1 : static void libspdm_test_requester_vendor_cmds_case1(void **state)
     120              : {
     121              :     libspdm_return_t status;
     122              :     libspdm_test_context_t *spdm_test_context;
     123              :     libspdm_context_t *spdm_context;
     124              :     libspdm_vendor_request_test request;
     125            1 :     libspdm_vendor_response_test response = {0};
     126            1 :     response.vendor_id_len = sizeof(response.vendor_id);
     127            1 :     response.data_len = sizeof(response.data);
     128              : 
     129            1 :     spdm_test_context = *state;
     130            1 :     spdm_context = spdm_test_context->spdm_context;
     131            1 :     spdm_test_context->case_id = 0x1;
     132            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     133              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     134            1 :     spdm_context->connection_info.connection_state =
     135              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     136            1 :     spdm_context->local_context.is_requester = true;
     137              : 
     138            1 :     request.standard_id = 6;
     139            1 :     request.vendor_id_len = 2;
     140            1 :     request.vendor_id[0] = 0xAA;
     141            1 :     request.vendor_id[1] = 0xAA;
     142            1 :     request.data_len = sizeof(request.data);
     143            1 :     libspdm_set_mem(request.data, sizeof(request.data), 0xAA);
     144              : 
     145            1 :     status = libspdm_vendor_send_request_receive_response(spdm_context, NULL,
     146            1 :                                                           request.standard_id,
     147            1 :                                                           request.vendor_id_len,
     148            1 :                                                           request.vendor_id, request.data_len,
     149              :                                                           request.data,
     150              :                                                           &response.standard_id,
     151              :                                                           &response.vendor_id_len,
     152              :                                                           response.vendor_id, &response.data_len,
     153              :                                                           response.data);
     154            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     155            1 :     assert_int_equal(
     156              :         spdm_context->connection_info.version >> SPDM_VERSION_NUMBER_SHIFT_BIT,
     157              :         SPDM_MESSAGE_VERSION_10);
     158              : 
     159            1 :     printf("case 1 %d\n", response.data[0]);
     160            1 : }
     161              : 
     162            1 : int libspdm_requester_vendor_cmds_test_main(void)
     163              : {
     164            1 :     const struct CMUnitTest spdm_requester_vendor_cmds_tests[] = {
     165              :         cmocka_unit_test(libspdm_test_requester_vendor_cmds_case1),
     166              :     };
     167              : 
     168            1 :     libspdm_test_context_t test_context = {
     169              :         LIBSPDM_TEST_CONTEXT_VERSION,
     170              :         true,
     171              :         libspdm_requester_vendor_cmds_test_send_message,
     172              :         libspdm_requester_vendor_cmds_test_receive_message,
     173              :     };
     174              : 
     175            1 :     libspdm_setup_test_context(&test_context);
     176              : 
     177            1 :     return cmocka_run_group_tests(spdm_requester_vendor_cmds_tests,
     178              :                                   libspdm_unit_test_group_setup,
     179              :                                   libspdm_unit_test_group_teardown);
     180              : }
     181              : 
     182              : #endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */
        

Generated by: LCOV version 2.0-1