Jan Breuer
2016-02-19 2140d423dc485e5d1f3ae2c2aa39d7e28a6069ac
Fix #74 bad handling of incomplete ARB data
3个文件已修改
139 ■■■■■ 已修改文件
libscpi/src/lexer.c 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/test/test_lexer_parser.c 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/test/test_parser.c 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/src/lexer.c
@@ -743,6 +743,8 @@
                    token->ptr = state->pos - arbitraryBlockLength;
                    token->len = arbitraryBlockLength;
                    validData = 1;
                } else {
                    validData = 0;
                }
            } else if (iseos(state)) {
                validData = 0;
libscpi/test/test_lexer_parser.c
@@ -204,7 +204,7 @@
    TEST_TOKEN("#12AB", scpiParser_parseProgramData, 3, 2, SCPI_TOKEN_ARBITRARY_BLOCK_PROGRAM_DATA);
    TEST_TOKEN("#12AB, ", scpiParser_parseProgramData, 3, 2, SCPI_TOKEN_ARBITRARY_BLOCK_PROGRAM_DATA);
    TEST_TOKEN("#13AB", scpiParser_parseProgramData, 0, 0, SCPI_TOKEN_UNKNOWN);
    TEST_TOKEN("#13AB", scpiParser_parseProgramData, 5, 0, SCPI_TOKEN_UNKNOWN);
    TEST_TOKEN("#12\r\n, ", scpiParser_parseProgramData, 3, 2, SCPI_TOKEN_ARBITRARY_BLOCK_PROGRAM_DATA);
    TEST_TOKEN("#02AB, ", scpiParser_parseProgramData, 0, 0, SCPI_TOKEN_UNKNOWN);
libscpi/test/test_parser.c
@@ -45,6 +45,17 @@
    return SCPI_RES_OK;
}
static double test_sample_received = NAN;
static scpi_result_t SCPI_Sample(scpi_t * context) {
    const char * val;
    size_t len;
    if (!SCPI_ParamArbitraryBlock(context, &val, &len, TRUE)) return SCPI_RES_ERR;
    if (len != sizeof(test_sample_received)) return SCPI_RES_ERR;
    memcpy(&test_sample_received, val, sizeof(test_sample_received));
    return SCPI_RES_OK;
}
static const scpi_command_t scpi_commands[] = {
    /* IEEE Mandated Commands (SCPI std V1999.0 4.1.1) */
    { .pattern = "*CLS", .callback = SCPI_CoreCls,},
@@ -80,6 +91,7 @@
    { .pattern = "STUB", .callback = SCPI_Stub,},
    { .pattern = "STUB?", .callback = SCPI_StubQ,},
    { .pattern = "SAMple", .callback = SCPI_Sample,},
    SCPI_CMD_LIST_END
};
@@ -1299,6 +1311,127 @@
    SCPI_ErrorClear(&scpi_context);
}
#define TEST_INCOMPLETE_ARB(_val, _part_len) do {\
    double val = _val;\
    char command_text[] = "SAMple #18[DOUBLE]\r";\
    char * command = command_text;\
    size_t command_len = strlen(command);\
    memcpy(command + 10, &val, sizeof(val));\
    test_sample_received = NAN;\
    size_t part_len = _part_len;\
    SCPI_ErrorClear(&scpi_context);\
    while (command_len) {\
        part_len = part_len > command_len ? command_len : part_len;\
        SCPI_Input(&scpi_context, command, part_len);\
        command += part_len;\
        command_len -= part_len;\
    }\
    CU_ASSERT_EQUAL(SCPI_ErrorCount(&scpi_context), 0);\
    CU_ASSERT_EQUAL(test_sample_received, val);\
} while(0)
static void testIncompleteArbitraryParameter(void) {
    TEST_INCOMPLETE_ARB(0.5, 19);
    TEST_INCOMPLETE_ARB(0.5, 18);
    TEST_INCOMPLETE_ARB(0.5, 17);
    TEST_INCOMPLETE_ARB(0.5, 16);
    TEST_INCOMPLETE_ARB(0.5, 15);
    TEST_INCOMPLETE_ARB(0.5, 14);
    TEST_INCOMPLETE_ARB(0.5, 13);
    TEST_INCOMPLETE_ARB(0.5, 12);
    TEST_INCOMPLETE_ARB(0.5, 11);
    TEST_INCOMPLETE_ARB(0.5, 10);
    TEST_INCOMPLETE_ARB(0.5, 9);
    TEST_INCOMPLETE_ARB(0.5, 8);
    TEST_INCOMPLETE_ARB(0.5, 7);
    TEST_INCOMPLETE_ARB(0.5, 6);
    TEST_INCOMPLETE_ARB(0.5, 5);
    TEST_INCOMPLETE_ARB(0.5, 4);
    TEST_INCOMPLETE_ARB(0.5, 3);
    TEST_INCOMPLETE_ARB(0.5, 2);
    TEST_INCOMPLETE_ARB(0.5, 1);
    TEST_INCOMPLETE_ARB(0.501220703125, 19);
    TEST_INCOMPLETE_ARB(0.501220703125, 18);
    TEST_INCOMPLETE_ARB(0.501220703125, 17);
    TEST_INCOMPLETE_ARB(0.501220703125, 16);
    TEST_INCOMPLETE_ARB(0.501220703125, 15);
    TEST_INCOMPLETE_ARB(0.501220703125, 14);
    TEST_INCOMPLETE_ARB(0.501220703125, 13);
    TEST_INCOMPLETE_ARB(0.501220703125, 12);
    TEST_INCOMPLETE_ARB(0.501220703125, 11);
    TEST_INCOMPLETE_ARB(0.501220703125, 10);
    TEST_INCOMPLETE_ARB(0.501220703125, 9);
    TEST_INCOMPLETE_ARB(0.501220703125, 8);
    TEST_INCOMPLETE_ARB(0.501220703125, 7);
    TEST_INCOMPLETE_ARB(0.501220703125, 6);
    TEST_INCOMPLETE_ARB(0.501220703125, 5);
    TEST_INCOMPLETE_ARB(0.501220703125, 4);
    TEST_INCOMPLETE_ARB(0.501220703125, 3);
    TEST_INCOMPLETE_ARB(0.501220703125, 2);
    TEST_INCOMPLETE_ARB(0.501220703125, 1);
    TEST_INCOMPLETE_ARB(0.500000024214387, 19);
    TEST_INCOMPLETE_ARB(0.500000024214387, 18);
    TEST_INCOMPLETE_ARB(0.500000024214387, 17);
    TEST_INCOMPLETE_ARB(0.500000024214387, 16);
    TEST_INCOMPLETE_ARB(0.500000024214387, 15);
    TEST_INCOMPLETE_ARB(0.500000024214387, 14);
    TEST_INCOMPLETE_ARB(0.500000024214387, 13);
    TEST_INCOMPLETE_ARB(0.500000024214387, 12);
    TEST_INCOMPLETE_ARB(0.500000024214387, 11);
    TEST_INCOMPLETE_ARB(0.500000024214387, 10);
    TEST_INCOMPLETE_ARB(0.500000024214387, 9);
    TEST_INCOMPLETE_ARB(0.500000024214387, 8);
    TEST_INCOMPLETE_ARB(0.500000024214387, 7);
    TEST_INCOMPLETE_ARB(0.500000024214387, 6);
    TEST_INCOMPLETE_ARB(0.500000024214387, 5);
    TEST_INCOMPLETE_ARB(0.500000024214387, 4);
    TEST_INCOMPLETE_ARB(0.500000024214387, 3);
    TEST_INCOMPLETE_ARB(0.500000024214387, 2);
    TEST_INCOMPLETE_ARB(0.500000024214387, 1);
}
#define TEST_INCOMPLETE_TEXT(_text, _part_len) do {\
    char command_text[] = "TEXT? \"\", \"" _text "\"\r";\
    char * command = command_text;\
    size_t command_len = strlen(command);\
    output_buffer_clear();\
    size_t part_len = _part_len;\
    SCPI_ErrorClear(&scpi_context);\
    while (command_len) {\
        part_len = part_len > command_len ? command_len : part_len;\
        SCPI_Input(&scpi_context, command, part_len);\
        command += part_len;\
        command_len -= part_len;\
    }\
    CU_ASSERT_EQUAL(SCPI_ErrorCount(&scpi_context), 0);\
    CU_ASSERT_STRING_EQUAL("\"" _text "\"\r\n", output_buffer);\
} while(0)
static void testIncompleteTextParameter(void) {
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 20);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 19);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 18);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 17);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 16);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 15);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 14);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 13);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 12);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 11);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 10);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 9);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 8);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 7);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 6);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 5);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 4);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 3);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 2);
    TEST_INCOMPLETE_TEXT("AbcdEfgh", 1);
}
int main() {
    unsigned int result;
    CU_pSuite pSuite = NULL;
@@ -1349,6 +1482,8 @@
            || (NULL == CU_add_test(pSuite, "SCPI_ResultArray", testResultArray))
            || (NULL == CU_add_test(pSuite, "SCPI_NumberToStr", testNumberToStr))
            || (NULL == CU_add_test(pSuite, "SCPI_ErrorQueue", testErrorQueue))
            || (NULL == CU_add_test(pSuite, "Incomplete arbitrary parameter", testIncompleteArbitraryParameter))
            || (NULL == CU_add_test(pSuite, "Incomplete text parameter", testIncompleteTextParameter))
            ) {
        CU_cleanup_registry();
        return CU_get_error();