Commit 52a5f1afe0d722a9d9db07e4339d5fa1d84ec620
1 parent
c870bc16
Rewrite new unit test for invalid function code
Showing
1 changed file
with
38 additions
and
37 deletions
tests/unit-test-client.c
| ... | ... | @@ -13,6 +13,8 @@ |
| 13 | 13 | |
| 14 | 14 | #include "unit-test.h" |
| 15 | 15 | |
| 16 | +const int EXCEPTION_RC = 2; | |
| 17 | + | |
| 16 | 18 | enum { |
| 17 | 19 | TCP, |
| 18 | 20 | TCP_PI, |
| ... | ... | @@ -457,7 +459,7 @@ int main(int argc, char *argv[]) |
| 457 | 459 | uint8_t rsp[MODBUS_RTU_MAX_ADU_LENGTH]; |
| 458 | 460 | |
| 459 | 461 | /* No response in RTU mode */ |
| 460 | - printf("1-A/4 No response from slave %d: ", INVALID_SERVER_ID); | |
| 462 | + printf("1-A/3 No response from slave %d: ", INVALID_SERVER_ID); | |
| 461 | 463 | ASSERT_TRUE(rc == -1 && errno == ETIMEDOUT, ""); |
| 462 | 464 | |
| 463 | 465 | /* The slave raises a timeout on a confirmation to ignore because if an |
| ... | ... | @@ -472,7 +474,7 @@ int main(int argc, char *argv[]) |
| 472 | 474 | modbus_send_raw_request(ctx, raw_rsp, RAW_RSP_LENGTH * sizeof(uint8_t)); |
| 473 | 475 | rc = modbus_receive_confirmation(ctx, rsp); |
| 474 | 476 | |
| 475 | - printf("1-B/4 No response from slave %d on indication/confirmation messages: ", | |
| 477 | + printf("1-B/3 No response from slave %d on indication/confirmation messages: ", | |
| 476 | 478 | INVALID_SERVER_ID); |
| 477 | 479 | ASSERT_TRUE(rc == -1 && errno == ETIMEDOUT, ""); |
| 478 | 480 | |
| ... | ... | @@ -480,12 +482,12 @@ int main(int argc, char *argv[]) |
| 480 | 482 | modbus_send_raw_request(ctx, raw_invalid_req, RAW_REQ_LENGTH * sizeof(uint8_t)); |
| 481 | 483 | rc = modbus_receive_confirmation(ctx, rsp); |
| 482 | 484 | |
| 483 | - printf("1-C/4 No response from slave %d with invalid request: ", | |
| 485 | + printf("1-C/3 No response from slave %d with invalid request: ", | |
| 484 | 486 | INVALID_SERVER_ID); |
| 485 | 487 | ASSERT_TRUE(rc == -1 && errno == ETIMEDOUT, ""); |
| 486 | 488 | } else { |
| 487 | 489 | /* Response in TCP mode */ |
| 488 | - printf("1/4 Response from slave %d: ", INVALID_SERVER_ID); | |
| 490 | + printf("1/3 Response from slave %d: ", INVALID_SERVER_ID); | |
| 489 | 491 | ASSERT_TRUE(rc == UT_REGISTERS_NB, ""); |
| 490 | 492 | } |
| 491 | 493 | |
| ... | ... | @@ -494,25 +496,13 @@ int main(int argc, char *argv[]) |
| 494 | 496 | |
| 495 | 497 | rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS, |
| 496 | 498 | UT_REGISTERS_NB, tab_rp_registers); |
| 497 | - printf("2/4 No reply after a broadcast query: "); | |
| 499 | + printf("2/3 No reply after a broadcast query: "); | |
| 498 | 500 | ASSERT_TRUE(rc == -1 && errno == ETIMEDOUT, ""); |
| 499 | 501 | |
| 500 | 502 | /* Restore slave */ |
| 501 | 503 | modbus_set_slave(ctx, use_backend == RTU ? SERVER_ID : MODBUS_TCP_SLAVE); |
| 502 | 504 | |
| 503 | - { | |
| 504 | - const int RAW_REQ_LENGTH = 6; | |
| 505 | - uint8_t raw_req[] = { use_backend == RTU ? SERVER_ID : MODBUS_TCP_SLAVE, 0x42, 0x00, 0x00, 0x00, 0x00 }; | |
| 506 | - uint8_t rsp[MODBUS_MAX_ADU_LENGTH]; | |
| 507 | - | |
| 508 | - rc = modbus_send_raw_request(ctx, raw_req, RAW_REQ_LENGTH * sizeof(uint8_t)); | |
| 509 | - ASSERT_TRUE(rc != -1, "Unable to send raw request with invalid function code"); | |
| 510 | - rc = modbus_receive_confirmation(ctx, rsp); | |
| 511 | - printf("3/4 Raise an exception on unknown function code: "); | |
| 512 | - ASSERT_TRUE(rc == -1, ""); | |
| 513 | - } | |
| 514 | - | |
| 515 | - printf("4/4 Response with an invalid TID or slave: "); | |
| 505 | + printf("3/3 Response with an invalid TID or slave: "); | |
| 516 | 506 | rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS_INVALID_TID_OR_SLAVE, |
| 517 | 507 | 1, tab_rp_registers); |
| 518 | 508 | ASSERT_TRUE(rc == -1, ""); |
| ... | ... | @@ -700,9 +690,9 @@ int test_server(modbus_t *ctx, int use_backend) |
| 700 | 690 | int i; |
| 701 | 691 | /* Read requests */ |
| 702 | 692 | const int READ_RAW_REQ_LEN = 6; |
| 693 | + const int slave = (use_backend == RTU) ? SERVER_ID : MODBUS_TCP_SLAVE; | |
| 703 | 694 | uint8_t read_raw_req[] = { |
| 704 | - /* slave */ | |
| 705 | - (use_backend == RTU) ? SERVER_ID : 0xFF, | |
| 695 | + slave, | |
| 706 | 696 | /* function, address, 5 values */ |
| 707 | 697 | MODBUS_FC_READ_HOLDING_REGISTERS, |
| 708 | 698 | UT_REGISTERS_ADDRESS >> 8, UT_REGISTERS_ADDRESS & 0xFF, |
| ... | ... | @@ -711,8 +701,7 @@ int test_server(modbus_t *ctx, int use_backend) |
| 711 | 701 | /* Write and read registers request */ |
| 712 | 702 | const int RW_RAW_REQ_LEN = 13; |
| 713 | 703 | uint8_t rw_raw_req[] = { |
| 714 | - /* slave */ | |
| 715 | - (use_backend == RTU) ? SERVER_ID : 0xFF, | |
| 704 | + slave, | |
| 716 | 705 | /* function, addr to read, nb to read */ |
| 717 | 706 | MODBUS_FC_WRITE_AND_READ_REGISTERS, |
| 718 | 707 | /* Read */ |
| ... | ... | @@ -729,8 +718,7 @@ int test_server(modbus_t *ctx, int use_backend) |
| 729 | 718 | }; |
| 730 | 719 | const int WRITE_RAW_REQ_LEN = 13; |
| 731 | 720 | uint8_t write_raw_req[] = { |
| 732 | - /* slave */ | |
| 733 | - (use_backend == RTU) ? SERVER_ID : 0xFF, | |
| 721 | + slave, | |
| 734 | 722 | /* function will be set in the loop */ |
| 735 | 723 | MODBUS_FC_WRITE_MULTIPLE_REGISTERS, |
| 736 | 724 | /* Address */ |
| ... | ... | @@ -740,6 +728,12 @@ int test_server(modbus_t *ctx, int use_backend) |
| 740 | 728 | /* Dummy data to write */ |
| 741 | 729 | 0x02, 0x2B, 0x00, 0x01, 0x00, 0x64 |
| 742 | 730 | }; |
| 731 | + const int INVALID_FC = 0x42; | |
| 732 | + const int INVALID_FC_REQ_LEN = 6; | |
| 733 | + uint8_t invalid_fc_raw_req[] = { | |
| 734 | + slave, 0x42, 0x00, 0x00, 0x00, 0x00 | |
| 735 | + }; | |
| 736 | + | |
| 743 | 737 | int req_length; |
| 744 | 738 | uint8_t rsp[MODBUS_TCP_MAX_ADU_LENGTH]; |
| 745 | 739 | int tab_read_function[] = { |
| ... | ... | @@ -767,6 +761,17 @@ int test_server(modbus_t *ctx, int use_backend) |
| 767 | 761 | |
| 768 | 762 | printf("\nTEST RAW REQUESTS:\n"); |
| 769 | 763 | |
| 764 | + uint32_t old_response_to_sec; | |
| 765 | + uint32_t old_response_to_usec; | |
| 766 | + | |
| 767 | + /* This requests can generate flushes server side so we need a higher | |
| 768 | + * response timeout than the server. The server uses the defined response | |
| 769 | + * timeout to sleep before flushing. | |
| 770 | + * The old timeouts are restored at the end. | |
| 771 | + */ | |
| 772 | + modbus_get_response_timeout(ctx, &old_response_to_sec, &old_response_to_usec); | |
| 773 | + modbus_set_response_timeout(ctx, 0, 600000); | |
| 774 | + | |
| 770 | 775 | req_length = modbus_send_raw_request(ctx, read_raw_req, READ_RAW_REQ_LEN); |
| 771 | 776 | printf("* modbus_send_raw_request: "); |
| 772 | 777 | ASSERT_TRUE(req_length == (backend_length + 5), "FAILED (%d)\n", req_length); |
| ... | ... | @@ -810,8 +815,17 @@ int test_server(modbus_t *ctx, int use_backend) |
| 810 | 815 | if (rc == -1) |
| 811 | 816 | goto close; |
| 812 | 817 | |
| 818 | + /* Test invalid function code */ | |
| 819 | + modbus_send_raw_request(ctx, invalid_fc_raw_req, INVALID_FC_REQ_LEN * sizeof(uint8_t)); | |
| 820 | + rc = modbus_receive_confirmation(ctx, rsp); | |
| 821 | + printf("Return an exception on unknown function code: "); | |
| 822 | + ASSERT_TRUE(rc == (backend_length + EXCEPTION_RC) && | |
| 823 | + rsp[backend_offset] == (0x80 + INVALID_FC), "") | |
| 824 | + | |
| 825 | + modbus_set_response_timeout(ctx, old_response_to_sec, old_response_to_usec); | |
| 813 | 826 | return 0; |
| 814 | 827 | close: |
| 828 | + modbus_set_response_timeout(ctx, old_response_to_sec, old_response_to_usec); | |
| 815 | 829 | return -1; |
| 816 | 830 | } |
| 817 | 831 | |
| ... | ... | @@ -821,19 +835,8 @@ int send_crafted_request(modbus_t *ctx, int function, |
| 821 | 835 | uint16_t max_value, uint16_t bytes, |
| 822 | 836 | int backend_length, int backend_offset) |
| 823 | 837 | { |
| 824 | - const int EXCEPTION_RC = 2; | |
| 825 | 838 | uint8_t rsp[MODBUS_TCP_MAX_ADU_LENGTH]; |
| 826 | 839 | int j; |
| 827 | - uint32_t old_response_to_sec; | |
| 828 | - uint32_t old_response_to_usec; | |
| 829 | - | |
| 830 | - /* This requests can generate flushes server side so we need a higher | |
| 831 | - * response timeout than the server. The server uses the defined response | |
| 832 | - * timeout to sleep before flushing. | |
| 833 | - * The old timeouts are restored at the end. | |
| 834 | - */ | |
| 835 | - modbus_get_response_timeout(ctx, &old_response_to_sec, &old_response_to_usec); | |
| 836 | - modbus_set_response_timeout(ctx, 0, 600000); | |
| 837 | 840 | |
| 838 | 841 | for (j=0; j<2; j++) { |
| 839 | 842 | int rc; |
| ... | ... | @@ -869,9 +872,7 @@ int send_crafted_request(modbus_t *ctx, int function, |
| 869 | 872 | rsp[backend_offset] == (0x80 + function) && |
| 870 | 873 | rsp[backend_offset + 1] == MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, ""); |
| 871 | 874 | } |
| 872 | - modbus_set_response_timeout(ctx, old_response_to_sec, old_response_to_usec); | |
| 873 | 875 | return 0; |
| 874 | 876 | close: |
| 875 | - modbus_set_response_timeout(ctx, old_response_to_sec, old_response_to_usec); | |
| 876 | 877 | return -1; |
| 877 | 878 | } | ... | ... |