@@ -56,6 +56,19 @@ static const uint8_t *packet_payload(size_t index)
5656 return g_captured_packets[index].data () + sizeof (cast_header_t );
5757}
5858
59+ // テスト用にmax_payloadを計算するヘルパー
60+ static size_t calc_max_payload (void )
61+ {
62+ return g_mock_mtu - CAST_PROTOCOL_OVERHEAD;
63+ }
64+
65+ // 指定データ長に対する期待チャンク数を計算するヘルパー
66+ static size_t calc_expected_chunks (size_t data_len)
67+ {
68+ size_t mp = calc_max_payload ();
69+ return (data_len + mp - 1 ) / mp;
70+ }
71+
5972// ---------------------------------------------------------------------------
6073// テストフィクスチャ
6174// ---------------------------------------------------------------------------
@@ -78,9 +91,7 @@ class ChunkerTest : public ::testing::Test {
7891// データが max_payload の倍数 → 端数なし
7992TEST_F (ChunkerTest, ExactFitChunkCount)
8093{
81- // MTU=64, overhead=sizeof(cast_header_t)+2=13, max_payload=51
82- // データ102バイト → 102/51 = ちょうど2チャンク
83- const size_t max_payload = g_mock_mtu - CAST_PROTOCOL_OVERHEAD;
94+ const size_t max_payload = calc_max_payload ();
8495 const size_t data_len = max_payload * 2 ;
8596 std::vector<uint8_t > data (data_len, 0xAA );
8697
@@ -93,8 +104,9 @@ TEST_F(ChunkerTest, ExactFitChunkCount)
93104// データが max_payload の倍数でない → 端数あり
94105TEST_F (ChunkerTest, PartialLastChunkCount)
95106{
96- // max_payload=51, データ100バイト → ceil(100/51) = 2チャンク
97- std::vector<uint8_t > data (100 , 0xBB );
107+ const size_t max_payload = calc_max_payload ();
108+ // max_payload + 1 バイトで確実に2チャンク
109+ std::vector<uint8_t > data (max_payload + 1 , 0xBB );
98110
99111 esp_err_t ret = cast_send_frame (data.data (), data.size (), CAST_FMT_JPEG, &g_mock_transport);
100112
@@ -116,8 +128,9 @@ TEST_F(ChunkerTest, SingleChunk)
116128// 3チャンクに分割されるケース
117129TEST_F (ChunkerTest, ThreeChunks)
118130{
119- // max_payload=51, データ130バイト → ceil(130/51) = 3チャンク (51+51+28)
120- std::vector<uint8_t > data (130 , 0xDD );
131+ const size_t max_payload = calc_max_payload ();
132+ const size_t data_len = max_payload * 2 + 1 ; // 確実に3チャンク
133+ std::vector<uint8_t > data (data_len, 0xDD );
121134
122135 esp_err_t ret = cast_send_frame (data.data (), data.size (), CAST_FMT_JPEG, &g_mock_transport);
123136
@@ -131,7 +144,9 @@ TEST_F(ChunkerTest, ThreeChunks)
131144
132145TEST_F (ChunkerTest, HeaderConsistency)
133146{
134- std::vector<uint8_t > data (130 , 0x00 );
147+ const size_t max_payload = calc_max_payload ();
148+ const size_t data_len = max_payload * 2 + 1 ; // 3チャンク
149+ std::vector<uint8_t > data (data_len, 0x00 );
135150
136151 cast_send_frame (data.data (), data.size (), CAST_FMT_RGB565, &g_mock_transport);
137152
@@ -169,6 +184,11 @@ TEST_F(ChunkerTest, HeaderConsistency)
169184 EXPECT_EQ (h0->chunk_index , 0 );
170185 EXPECT_EQ (h1->chunk_index , 1 );
171186 EXPECT_EQ (h2->chunk_index , 2 );
187+
188+ // max_payload は全パケットで同じ値
189+ EXPECT_EQ (h0->max_payload , max_payload);
190+ EXPECT_EQ (h1->max_payload , max_payload);
191+ EXPECT_EQ (h2->max_payload , max_payload);
172192}
173193
174194// ===========================================================================
@@ -177,10 +197,11 @@ TEST_F(ChunkerTest, HeaderConsistency)
177197
178198TEST_F (ChunkerTest, PayloadBoundary)
179199{
180- const size_t max_payload = g_mock_mtu - CAST_PROTOCOL_OVERHEAD;
200+ const size_t max_payload = calc_max_payload ();
201+ const size_t data_len = max_payload * 2 + 10 ; // 3チャンク (末尾10バイト)
181202
182- // 0, 1, 2, ... , 129 の連番データ
183- std::vector<uint8_t > data (130 );
203+ // 0, 1, 2, ... の連番データ
204+ std::vector<uint8_t > data (data_len );
184205 for (size_t i = 0 ; i < data.size (); i++) {
185206 data[i] = (uint8_t )(i & 0xFF );
186207 }
@@ -190,9 +211,9 @@ TEST_F(ChunkerTest, PayloadBoundary)
190211 ASSERT_EQ (g_captured_packets.size (), 3u );
191212
192213 // 各チャンクの payload_len を確認
193- const size_t expect_len0 = max_payload; // 51
194- const size_t expect_len1 = max_payload; // 51
195- const size_t expect_len2 = 130 - max_payload * 2 ; // 28
214+ const size_t expect_len0 = max_payload;
215+ const size_t expect_len1 = max_payload;
216+ const size_t expect_len2 = data_len - max_payload * 2 ;
196217
197218 EXPECT_EQ (packet_header (0 )->payload_len , expect_len0);
198219 EXPECT_EQ (packet_header (1 )->payload_len , expect_len1);
@@ -201,14 +222,14 @@ TEST_F(ChunkerTest, PayloadBoundary)
201222 // チャンク0の末尾とチャンク1の先頭が連続しているか
202223 const uint8_t *p0 = packet_payload (0 );
203224 const uint8_t *p1 = packet_payload (1 );
204- EXPECT_EQ (p0[0 ], 0 ); // 先頭
205- EXPECT_EQ (p0[max_payload - 1 ], max_payload - 1 ); // チャンク0の末尾
206- EXPECT_EQ (p1[0 ], max_payload); // チャンク1の先頭 = チャンク0の続き
225+ EXPECT_EQ (p0[0 ], 0 ); // 先頭
226+ EXPECT_EQ (p0[max_payload - 1 ], ( uint8_t )( max_payload - 1 ) ); // チャンク0の末尾
227+ EXPECT_EQ (p1[0 ], ( uint8_t ) max_payload); // チャンク1の先頭 = チャンク0の続き
207228
208229 // チャンク2(最後)の先頭と末尾
209230 const uint8_t *p2 = packet_payload (2 );
210231 EXPECT_EQ (p2[0 ], (uint8_t )(max_payload * 2 ));
211- EXPECT_EQ (p2[expect_len2 - 1 ], 129 );
232+ EXPECT_EQ (p2[expect_len2 - 1 ], ( uint8_t )(data_len - 1 ) );
212233
213234 // 全ペイロードを結合して元データと一致するか
214235 std::vector<uint8_t > reassembled;
@@ -250,7 +271,8 @@ TEST_F(ChunkerTest, FrameIdIncrements)
250271// 2番目のsendで失敗 → 即座にエラーを返し、残りは送らない
251272TEST_F (ChunkerTest, SendFailureMidway)
252273{
253- std::vector<uint8_t > data (130 , 0xEE ); // 3チャンク
274+ const size_t max_payload = calc_max_payload ();
275+ std::vector<uint8_t > data (max_payload * 2 + 1 , 0xEE ); // 3チャンク
254276 g_send_fail_at = 1 ; // 2番目(index=1)のsendで失敗
255277
256278 esp_err_t ret = cast_send_frame (data.data (), data.size (), CAST_FMT_JPEG, &g_mock_transport);
@@ -294,28 +316,31 @@ TEST_F(ChunkerTest, PacketSizeNeverExceedsMtu)
294316
295317TEST_F (ChunkerTest, SmallMtu)
296318{
297- g_mock_mtu = 24 ; // overhead=13 → max_payload=11
298- const size_t max_payload = g_mock_mtu - CAST_PROTOCOL_OVERHEAD ;
319+ g_mock_mtu = 26 ; // overhead=15 → max_payload=11
320+ const size_t max_payload = calc_max_payload () ;
299321 std::vector<uint8_t > data (50 , 0x11 );
300322
301323 cast_send_frame (data.data (), data.size (), CAST_FMT_GRAYSCALE, &g_mock_transport);
302324
303- size_t expected_chunks = (50 + max_payload - 1 ) / max_payload ;
325+ size_t expected_chunks = calc_expected_chunks (50 ) ;
304326 EXPECT_EQ (g_captured_packets.size (), expected_chunks);
305327
306328 for (size_t i = 0 ; i < g_captured_packets.size (); i++) {
307329 EXPECT_LE (g_captured_packets[i].size (), g_mock_mtu);
330+ EXPECT_EQ (packet_header (i)->max_payload , max_payload);
308331 }
309332}
310333
311334TEST_F (ChunkerTest, LargeMtu)
312335{
313336 g_mock_mtu = 250 ; // ESP-NOW相当
337+ const size_t max_payload = calc_max_payload ();
314338 std::vector<uint8_t > data (200 , 0x22 );
315339
316340 cast_send_frame (data.data (), data.size (), CAST_FMT_JPEG, &g_mock_transport);
317341
318- // max_payload=237, 200 < 237 → 1チャンク
342+ // 200 < max_payload → 1チャンク
319343 EXPECT_EQ (g_captured_packets.size (), 1u );
320344 EXPECT_EQ (packet_header (0 )->payload_len , 200 );
345+ EXPECT_EQ (packet_header (0 )->max_payload , max_payload);
321346}
0 commit comments