2017-09-22 21:00:03 +00:00
|
|
|
/* Copyright (c) 2017 LiteSpeed Technologies Inc. See LICENSE. */
|
|
|
|
/* Tests in this file have been migrated out of maintest.c */
|
|
|
|
/* TODO: fix warnings */
|
|
|
|
|
|
|
|
#include <assert.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <sys/queue.h>
|
|
|
|
|
|
|
|
#include "lsquic.h"
|
|
|
|
#include "lsquic_types.h"
|
|
|
|
#include "lsquic_alarmset.h"
|
|
|
|
#include "lsquic_parse.h"
|
|
|
|
#include "lsquic_sfcw.h"
|
|
|
|
#include "lsquic_stream.h"
|
2018-02-26 21:01:16 +00:00
|
|
|
#include "lsquic_packet_common.h"
|
2017-09-22 21:00:03 +00:00
|
|
|
#include "lsquic_packet_in.h"
|
|
|
|
|
|
|
|
struct lsquic_stream_if;
|
|
|
|
|
|
|
|
static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_037);
|
|
|
|
|
|
|
|
lsquic_stream_t *
|
|
|
|
lsquic_stream_new_ext (uint32_t id,
|
|
|
|
struct lsquic_conn_public *conn_pub,
|
|
|
|
const struct lsquic_stream_if *stream_if,
|
|
|
|
void *stream_if_ctx, unsigned initial_sfcw,
|
|
|
|
unsigned initial_send_off, enum stream_ctor_flags ctor_flags)
|
|
|
|
{
|
|
|
|
lsquic_stream_t *stream = calloc(1, sizeof(*stream));
|
|
|
|
stream->id = id;
|
|
|
|
return stream;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t
|
|
|
|
lsquic_stream_tosend_offset (const lsquic_stream_t *stream)
|
|
|
|
{
|
|
|
|
return 1000;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
lsquic_stream_tosend_fin (const lsquic_stream_t *stream)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t
|
|
|
|
lsquic_stream_tosend_read (lsquic_stream_t *stream, void *buf, size_t len,
|
|
|
|
int *reached_fin)
|
|
|
|
{
|
|
|
|
memcpy(buf, "123456789012345678901234567890", 30);
|
|
|
|
*reached_fin = lsquic_stream_tosend_fin(stream);
|
|
|
|
return 30;
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t
|
|
|
|
lsquic_stream_tosend_sz (const lsquic_stream_t *stream)
|
|
|
|
{
|
|
|
|
return 30;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int make_complex_packet(unsigned char *pkt_buf, int max_buf_len)
|
|
|
|
{
|
|
|
|
unsigned char *p = pkt_buf;
|
|
|
|
unsigned char *const pend = p + 1500;
|
|
|
|
lsquic_stream_t *stream = lsquic_stream_new(12345, NULL, NULL, NULL, 0, 0);
|
|
|
|
uint32_t stream_id = 13989;
|
|
|
|
uint64_t offset = 10000;
|
|
|
|
uint64_t conn_id = 123579;
|
|
|
|
const char nonce[] = "1234567890ABCDEF1234567890abcdef"; /*32 bytes*/
|
|
|
|
uint64_t packet_num = 1356789;
|
|
|
|
|
|
|
|
int buf_len = pf->pf_gen_reg_pkt_header(p, 100, &conn_id, NULL, (const unsigned char *) nonce, packet_num,
|
|
|
|
calc_packno_bits(packet_num, 0, 0));
|
|
|
|
assert(buf_len > 0);
|
|
|
|
p += buf_len;
|
|
|
|
|
|
|
|
buf_len = pf->pf_gen_stream_frame(p, pend - p,
|
|
|
|
stream->id, lsquic_stream_tosend_offset(stream),
|
2018-02-26 21:01:16 +00:00
|
|
|
lsquic_stream_tosend_fin(stream),
|
|
|
|
lsquic_stream_tosend_sz(stream),
|
2017-09-22 21:00:03 +00:00
|
|
|
(gsf_read_f) lsquic_stream_tosend_read,
|
|
|
|
stream);
|
|
|
|
p += buf_len;
|
|
|
|
|
|
|
|
buf_len = pf->pf_gen_window_update_frame(p, pend - p, stream_id, offset);
|
|
|
|
p += buf_len;
|
|
|
|
|
|
|
|
free(stream);
|
|
|
|
|
|
|
|
return p - pkt_buf;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void test_stream_frame()
|
|
|
|
{
|
|
|
|
const uint8_t data[] = "123456789012345678901234567890";
|
|
|
|
lsquic_stream_t *stream = lsquic_stream_new(12345, NULL, NULL, NULL, 0, 0);
|
|
|
|
uint8_t buf[1500];
|
|
|
|
int buf_len = pf->pf_gen_stream_frame(buf, 1500,
|
|
|
|
stream->id, lsquic_stream_tosend_offset(stream),
|
2018-02-26 21:01:16 +00:00
|
|
|
lsquic_stream_tosend_fin(stream),
|
|
|
|
lsquic_stream_tosend_sz(stream),
|
2017-09-22 21:00:03 +00:00
|
|
|
(gsf_read_f) lsquic_stream_tosend_read,
|
|
|
|
stream);
|
|
|
|
stream_frame_t stream_frame2;
|
|
|
|
pf->pf_parse_stream_frame(buf, buf_len, &stream_frame2);
|
|
|
|
assert(0 == stream_frame2.data_frame.df_fin );
|
|
|
|
assert(30 == stream_frame2.data_frame.df_size );
|
|
|
|
assert(1000 == stream_frame2.data_frame.df_offset );
|
|
|
|
assert(12345 == stream_frame2.stream_id);
|
|
|
|
assert(memcmp(data,stream_frame2.data_frame.df_data, stream_frame2.data_frame.df_size) == 0);
|
|
|
|
printf("test_stream_frame passed.\n");
|
|
|
|
free(stream);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
main (void)
|
|
|
|
{
|
|
|
|
uint8_t pkt_buf[1500];
|
|
|
|
size_t buf_len;
|
|
|
|
buf_len = make_complex_packet(pkt_buf, 1500);
|
|
|
|
(void) buf_len;
|
|
|
|
test_stream_frame();
|
|
|
|
return 0;
|
|
|
|
}
|