| 423 | |
| 424 | char output[64] = {0}; |
| 425 | |
| 426 | HttpWebSocketFrameHeaderView ping; |
| 427 | ping.fin = true; |
| 428 | ping.opcode = HttpWebSocketOpcode::Ping; |
| 429 | ping.masked = false; |
| 430 | ping.payloadLength = 4; |
| 431 | |
| 432 | HttpWebSocketFrameHeaderView close; |
| 433 | close.fin = true; |
| 434 | close.opcode = HttpWebSocketOpcode::Close; |
| 435 | close.masked = false; |
| 436 | close.payloadLength = 2; |
| 437 | |
| 438 | size_t frameBytes = 0; |
| 439 | size_t totalBytes = 0; |
| 440 | |
| 441 | char pingPayload[] = {'p', 'i', 'n', 'g'}; |
| 442 | SC::uint8_t closePayload[] = {0x03, 0xE8}; |
| 443 | |
| 444 | SC_TEST_EXPECT(encodeFrame(writer, ping, {pingPayload, sizeof(pingPayload)}, {output, sizeof(output)}, frameBytes)); |
| 445 | totalBytes += frameBytes; |
| 446 | SC_TEST_EXPECT(encodeFrame(writer, close, byteSpan(closePayload, sizeof(closePayload)), |
| 447 | {output + totalBytes, sizeof(output) - totalBytes}, frameBytes)); |
| 448 | totalBytes += frameBytes; |
| 449 | |
| 450 | ReaderCollector collector; |
| 451 | HttpWebSocketFrameReader reader; |
| 452 | reader.reset(HttpWebSocketEndpointRole::Client); |
| 453 | reader.onFrameHeader.bind<ReaderCollector, &ReaderCollector::onHeader>(collector); |
| 454 | reader.onFramePayload.bind<ReaderCollector, &ReaderCollector::onPayload>(collector); |
| 455 | |
| 456 | size_t consumed = 0; |
| 457 | SC_TEST_EXPECT(reader.parse({output, totalBytes}, consumed)); |
| 458 | SC_TEST_EXPECT(consumed == totalBytes); |
| 459 | SC_TEST_EXPECT(collector.numHeaders == 2); |
| 460 | SC_TEST_EXPECT(collector.headers[0].isControlFrame()); |
| 461 | SC_TEST_EXPECT(collector.headers[1].isControlFrame()); |
| 462 | SC_TEST_EXPECT(collector.headers[0].opcode == HttpWebSocketOpcode::Ping); |
| 463 | SC_TEST_EXPECT(collector.headers[1].opcode == HttpWebSocketOpcode::Close); |
| 464 | |
| 465 | const SC::uint8_t expected[] = {'p', 'i', 'n', 'g', 0x03, 0xE8}; |
| 466 | SC_TEST_EXPECT(spansEqual(collector.payload.toSpanConst(), byteSpan(expected, sizeof(expected)))); |
| 467 | } |
| 468 | |
| 469 | void SC::HttpWebSocketFrameTest::maskingRoleValidation() |
| 470 | { |
| 471 | HttpWebSocketFrameWriter writer; |
| 472 | writer.reset(HttpWebSocketEndpointRole::Client); |
| 473 | |
| 474 | HttpWebSocketFrameHeaderView maskedHeader; |
| 475 | maskedHeader.fin = true; |
| 476 | maskedHeader.opcode = HttpWebSocketOpcode::Text; |
nothing calls this directly
no test coverage detected