mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Cellular: ATHandler to reset match URC generated errors and continue response handling
							parent
							
								
									4e6cbb8f5f
								
							
						
					
					
						commit
						c8f2ed3d30
					
				| 
						 | 
				
			
			@ -460,7 +460,7 @@ TEST_F(TestATHandler, test_ATHandler_skip_param)
 | 
			
		|||
    fh1.short_value = POLLIN;
 | 
			
		||||
    at.resp_start();
 | 
			
		||||
    at.skip_param();
 | 
			
		||||
    EXPECT_TRUE(at.get_last_error() == NSAPI_ERROR_DEVICE_ERROR);
 | 
			
		||||
    EXPECT_TRUE(at.get_last_error() == NSAPI_ERROR_OK);
 | 
			
		||||
 | 
			
		||||
    char table1[] = "ss,sssssssssssss,sssssssssssOK\r\n\0";
 | 
			
		||||
    filehandle_stub_table = table1;
 | 
			
		||||
| 
						 | 
				
			
			@ -935,15 +935,88 @@ TEST_F(TestATHandler, test_ATHandler_resp_start)
 | 
			
		|||
    filehandle_stub_table_pos = 0;
 | 
			
		||||
    at.resp_start();
 | 
			
		||||
 | 
			
		||||
    char table7[] = "ssssss\0";
 | 
			
		||||
    char table7[] = "urc: info\r\nresponseOK\r\n\0";
 | 
			
		||||
    at.flush();
 | 
			
		||||
    at.clear_error();
 | 
			
		||||
    filehandle_stub_table = table7;
 | 
			
		||||
    filehandle_stub_table_pos = 0;
 | 
			
		||||
 | 
			
		||||
    at.set_urc_handler("urc: ", NULL);
 | 
			
		||||
    at.resp_start(); // recv_buff: "responseOK\r\n\0"
 | 
			
		||||
    at.resp_stop();  // consumes to OKCRLF -> OK
 | 
			
		||||
    EXPECT_TRUE(at.get_last_error() == NSAPI_ERROR_OK);
 | 
			
		||||
 | 
			
		||||
    char table8[] = "urc: info\r\nresponse\0";
 | 
			
		||||
    at.flush();
 | 
			
		||||
    at.clear_error();
 | 
			
		||||
    at.set_urc_handler("ss", NULL);
 | 
			
		||||
    filehandle_stub_table = table8;
 | 
			
		||||
    filehandle_stub_table_pos = 0;
 | 
			
		||||
 | 
			
		||||
    at.set_urc_handler("urc: ", NULL);
 | 
			
		||||
    at.resp_start();
 | 
			
		||||
    at.resp_stop();
 | 
			
		||||
    // No stop tag(OKCRLF) found
 | 
			
		||||
    EXPECT_TRUE(at.get_last_error() == NSAPI_ERROR_DEVICE_ERROR);
 | 
			
		||||
 | 
			
		||||
    char table9[] = "urc: prefix: infoOK\r\n\0";
 | 
			
		||||
    at.flush();
 | 
			
		||||
    at.clear_error();
 | 
			
		||||
    filehandle_stub_table = table9;
 | 
			
		||||
    filehandle_stub_table_pos = 0;
 | 
			
		||||
 | 
			
		||||
    at.set_urc_handler("urc: ", NULL);
 | 
			
		||||
    at.resp_start();
 | 
			
		||||
    // Match URC consumes to CRLF -> nothing to read after that -> ERROR
 | 
			
		||||
    EXPECT_TRUE(at.get_last_error() == NSAPI_ERROR_DEVICE_ERROR);
 | 
			
		||||
 | 
			
		||||
    char table10[] = "urc: info\r\ngarbage\r\nprefix: info\r\nOK\r\n\0";
 | 
			
		||||
    at.flush();
 | 
			
		||||
    at.clear_error();
 | 
			
		||||
    filehandle_stub_table = table10;
 | 
			
		||||
    filehandle_stub_table_pos = 0;
 | 
			
		||||
 | 
			
		||||
    at.set_urc_handler("urc: ", NULL);
 | 
			
		||||
    at.resp_start("prefix"); // match URC -> consumes to first CRLF -> consumes the garbage because there is expected prefix and no match found -> then prefix match
 | 
			
		||||
    at.resp_stop(); //ends the info scope -> consumes to CRLF -> ends the resp scope -> consumes to OKCRLF
 | 
			
		||||
    EXPECT_TRUE(at.get_last_error() == NSAPI_ERROR_OK);
 | 
			
		||||
 | 
			
		||||
    // No stop tag(OKCRLF) will be found because, after match URC consumed everything to CRLF, rest of buffer
 | 
			
		||||
    // is consumed to next/last CRLF because there is expected prefix and no match found
 | 
			
		||||
    // -> nothing to read after that -> ERROR
 | 
			
		||||
    char table11[] = "urc: info\r\ngarbageprefix: infoOK\r\n\0";
 | 
			
		||||
    at.flush();
 | 
			
		||||
    at.clear_error();
 | 
			
		||||
    filehandle_stub_table = table11;
 | 
			
		||||
    filehandle_stub_table_pos = 0;
 | 
			
		||||
 | 
			
		||||
    at.set_urc_handler("urc: ", NULL);
 | 
			
		||||
    at.resp_start("prefix");
 | 
			
		||||
    EXPECT_TRUE(at.get_last_error() == NSAPI_ERROR_DEVICE_ERROR);
 | 
			
		||||
 | 
			
		||||
    // After URC match no prefix match -> try to read more -> no more to read
 | 
			
		||||
    char table12[] = "urc: infoprefix: info\0";
 | 
			
		||||
    at.flush();
 | 
			
		||||
    at.clear_error();
 | 
			
		||||
    filehandle_stub_table = table12;
 | 
			
		||||
    filehandle_stub_table_pos = 0;
 | 
			
		||||
 | 
			
		||||
    at.set_urc_handler("urc: ", NULL);
 | 
			
		||||
    at.resp_start("prefix");
 | 
			
		||||
    EXPECT_TRUE(at.get_last_error() == NSAPI_ERROR_DEVICE_ERROR);
 | 
			
		||||
 | 
			
		||||
    // Will run into mem_str check of identical strings
 | 
			
		||||
    char table13[] = "\r\n\r\n\0";
 | 
			
		||||
    at.flush();
 | 
			
		||||
    at.clear_error();
 | 
			
		||||
    filehandle_stub_table = table13;
 | 
			
		||||
    filehandle_stub_table_pos = 0;
 | 
			
		||||
 | 
			
		||||
    char buf[3];
 | 
			
		||||
    at.resp_start();
 | 
			
		||||
    EXPECT_TRUE(2 == at.read_string(buf, 3));
 | 
			
		||||
    EXPECT_TRUE(!strncmp(buf, "\r\n", 2));
 | 
			
		||||
    // Consume to delimiter or stop_tag OKCRLF fails -> ERROR
 | 
			
		||||
    EXPECT_TRUE(at.get_last_error() == NSAPI_ERROR_DEVICE_ERROR);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(TestATHandler, test_ATHandler_resp_stop)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,7 +42,7 @@ public:
 | 
			
		|||
            if (size < ret) {
 | 
			
		||||
                ret = size;
 | 
			
		||||
            }
 | 
			
		||||
            memcpy(buffer, filehandle_stub_table, ret);
 | 
			
		||||
            memcpy(buffer, filehandle_stub_table + filehandle_stub_table_pos, ret);
 | 
			
		||||
            filehandle_stub_table_pos += ret;
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -820,6 +820,8 @@ void ATHandler::resp(const char *prefix, bool check_urc)
 | 
			
		|||
 | 
			
		||||
        if (check_urc && match_urc()) {
 | 
			
		||||
            _urc_matched = true;
 | 
			
		||||
            clear_error();
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // If no match found, look for CRLF and consume everything up to and including CRLF
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue