mirror of
				https://github.com/esphome/esphome.git
				synced 2025-11-01 07:31:51 +00:00 
			
		
		
		
	Merge remote-tracking branch 'upstream/guard_wrong_total_size' into integration
This commit is contained in:
		| @@ -248,25 +248,41 @@ void APIConnection::on_disconnect_response(const DisconnectResponse &value) { | ||||
| uint16_t APIConnection::encode_message_to_buffer(ProtoMessage &msg, uint16_t message_type, APIConnection *conn, | ||||
|                                                  uint32_t remaining_size, bool is_single) { | ||||
|   // Calculate size | ||||
|   uint32_t size = 0; | ||||
|   msg.calculate_size(size); | ||||
|   uint32_t calculated_size = 0; | ||||
|   msg.calculate_size(calculated_size); | ||||
|  | ||||
|   // Cache frame sizes to avoid repeated virtual calls | ||||
|   const uint8_t header_padding = conn->helper_->frame_header_padding(); | ||||
|   const uint8_t footer_size = conn->helper_->frame_footer_size(); | ||||
|  | ||||
|   // Calculate total size with padding for buffer allocation | ||||
|   uint16_t total_size = | ||||
|       static_cast<uint16_t>(size) + conn->helper_->frame_header_padding() + conn->helper_->frame_footer_size(); | ||||
|   size_t total_calculated_size = calculated_size + header_padding + footer_size; | ||||
|  | ||||
|   // Check if it fits | ||||
|   if (total_size > remaining_size) { | ||||
|   if (total_calculated_size > remaining_size) { | ||||
|     return 0;  // Doesn't fit | ||||
|   } | ||||
|  | ||||
|   // Allocate buffer space - pass payload size, allocation functions add header/footer space | ||||
|   ProtoWriteBuffer buffer = | ||||
|       is_single ? conn->allocate_single_message_buffer(size) : conn->allocate_batch_message_buffer(size); | ||||
|   ProtoWriteBuffer buffer = is_single ? conn->allocate_single_message_buffer(calculated_size) | ||||
|                                       : conn->allocate_batch_message_buffer(calculated_size); | ||||
|  | ||||
|   // Get buffer size after allocation (which includes header padding) | ||||
|   std::vector<uint8_t> &shared_buf = conn->parent_->get_shared_buffer_ref(); | ||||
|   size_t size_before_encode = shared_buf.size(); | ||||
|  | ||||
|   // Encode directly into buffer | ||||
|   msg.encode(buffer); | ||||
|   return total_size; | ||||
|  | ||||
|   // Calculate actual encoded size (not including header that was already added) | ||||
|   size_t actual_payload_size = shared_buf.size() - size_before_encode; | ||||
|  | ||||
|   // Return actual total size (header + actual payload + footer) | ||||
|   size_t actual_total_size = header_padding + actual_payload_size + footer_size; | ||||
|  | ||||
|   // Verify that calculate_size() returned the correct value | ||||
|   assert(calculated_size == actual_payload_size); | ||||
|   return static_cast<uint16_t>(actual_total_size); | ||||
| } | ||||
|  | ||||
| #ifdef USE_BINARY_SENSOR | ||||
|   | ||||
| @@ -119,6 +119,21 @@ async def yaml_config(request: pytest.FixtureRequest, unused_tcp_port: int) -> s | ||||
|         # Add port configuration after api: | ||||
|         content = content.replace("api:", f"api:\n  port: {unused_tcp_port}") | ||||
|  | ||||
|     # Add debug build flags for integration tests to enable assertions | ||||
|     if "esphome:" in content: | ||||
|         # Check if platformio_options already exists | ||||
|         if "platformio_options:" not in content: | ||||
|             # Add platformio_options with debug flags after esphome: | ||||
|             content = content.replace( | ||||
|                 "esphome:", | ||||
|                 "esphome:\n" | ||||
|                 "  # Enable assertions for integration tests\n" | ||||
|                 "  platformio_options:\n" | ||||
|                 "    build_flags:\n" | ||||
|                 '      - "-DDEBUG"  # Enable assert() statements\n' | ||||
|                 '      - "-g"       # Add debug symbols', | ||||
|             ) | ||||
|  | ||||
|     return content | ||||
|  | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user