blob: eb89aa786ee4192ae752645157f5161ab101574b [file] [log] [blame]
/** @file
*
* A brief file description
*
* @section license License
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "catch.hpp"
#include "quic/QUICFrameDispatcher.h"
#include "quic/Mock.h"
#include <memory>
TEST_CASE("QUICFrameHandler", "[quic]")
{
Ptr<IOBufferBlock> block = make_ptr<IOBufferBlock>(new_IOBufferBlock());
block->alloc();
block->fill(1);
CHECK(block->read_avail() == 1);
QUICStreamFrame streamFrame(block, 0x03, 0);
MockQUICContext context;
MockQUICConnection connection;
MockQUICStreamManager streamManager = {&connection};
MockQUICConnectionInfoProvider info;
MockQUICLossDetector lossDetector(context);
QUICFrameDispatcher quicFrameDispatcher(&info);
quicFrameDispatcher.add_handler(&connection);
quicFrameDispatcher.add_handler(&streamManager);
quicFrameDispatcher.add_handler(&lossDetector);
// Initial state
CHECK(connection.getTotalFrameCount() == 0);
CHECK(streamManager.getTotalFrameCount() == 0);
// STREAM frame
uint8_t buf[4096] = {0};
size_t len = 0;
Ptr<IOBufferBlock> ibb = streamFrame.to_io_buffer_block(sizeof(buf));
for (auto b = ibb; b; b = b->next) {
memcpy(buf + len, b->start(), b->size());
len += b->size();
}
bool should_send_ack;
bool is_flow_controlled;
quicFrameDispatcher.receive_frames(QUICEncryptionLevel::INITIAL, buf, len, should_send_ack, is_flow_controlled, nullptr, nullptr);
CHECK(connection.getTotalFrameCount() == 0);
CHECK(streamManager.getTotalFrameCount() == 1);
// CONNECTION_CLOSE frame
QUICConnectionCloseFrame connectionCloseFrame(0, 0, "", 0, nullptr);
ibb = connectionCloseFrame.to_io_buffer_block(sizeof(buf));
len = 0;
for (auto b = ibb; b; b = b->next) {
memcpy(buf + len, b->start(), b->size());
len += b->size();
}
quicFrameDispatcher.receive_frames(QUICEncryptionLevel::INITIAL, buf, len, should_send_ack, is_flow_controlled, nullptr, nullptr);
CHECK(connection.getTotalFrameCount() == 1);
CHECK(streamManager.getTotalFrameCount() == 1);
}