1/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
2/* Tests in this file have been migrated out of maintest.c */
3/* TODO: fix warnings */
4
5#include <assert.h>
6#include <stdlib.h>
7#include <string.h>
8#include <stdio.h>
9#include <sys/queue.h>
10
11#include "lsquic.h"
12#include "lsquic_types.h"
13#include "lsquic_parse.h"
14#include "lsquic_sfcw.h"
15#include "lsquic_varint.h"
16#include "lsquic_hq.h"
17#include "lsquic_hash.h"
18#include "lsquic_stream.h"
19#include "lsquic_packet_common.h"
20#include "lsquic_packet_in.h"
21
22struct lsquic_stream_if;
23
24static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_035);
25
26lsquic_stream_t *
27lsquic_stream_new_ext (uint32_t id,
28                   struct lsquic_conn_public *conn_pub,
29                   const struct lsquic_stream_if *stream_if,
30                   void *stream_if_ctx, unsigned initial_sfcw,
31                   unsigned initial_send_off, enum stream_ctor_flags ctor_flags)
32{
33    lsquic_stream_t *stream = calloc(1, sizeof(*stream));
34    stream->id = id;
35    return stream;
36}
37
38uint64_t
39lsquic_stream_tosend_offset (const lsquic_stream_t *stream)
40{
41    return 1000;
42}
43
44int
45lsquic_stream_tosend_fin (const lsquic_stream_t *stream)
46{
47    return 0;
48}
49
50size_t
51lsquic_stream_tosend_read (lsquic_stream_t *stream, void *buf, size_t len,
52                           int *reached_fin)
53{
54    memcpy(buf, "123456789012345678901234567890", 30);
55    *reached_fin = lsquic_stream_tosend_fin(stream);
56    return 30;
57}
58
59size_t
60lsquic_stream_tosend_sz (const lsquic_stream_t *stream)
61{
62    return 30;
63}
64
65static int make_complex_packet(unsigned char *pkt_buf, int max_buf_len)
66{
67#if 0       /* What is this function testing?  Seems useless. */
68    unsigned char *p = pkt_buf;
69    unsigned char *const pend  = p + 1500;
70    lsquic_stream_t *stream = lsquic_stream_new(12345, NULL, NULL, NULL, 0, 0);
71    uint32_t stream_id = 13989;
72    uint64_t offset = 10000;
73    uint64_t conn_id = 123579;
74    const char nonce[] = "1234567890ABCDEF1234567890abcdef"; /*32 bytes*/
75    uint64_t packet_num = 1356789;
76
77    int buf_len = pf->pf_gen_reg_pkt_header(p, 100, &conn_id, NULL, (const unsigned char *) nonce, packet_num,
78                                                calc_packno_bits(packet_num, 0, 0));
79    assert(buf_len > 0);
80    p += buf_len;
81
82    buf_len = pf->pf_gen_stream_frame(p, pend - p,
83        stream->id, lsquic_stream_tosend_offset(stream),
84        lsquic_stream_tosend_fin(stream),
85        lsquic_stream_tosend_sz(stream),
86        (gsf_read_f) lsquic_stream_tosend_read,
87        stream);
88    p += buf_len;
89
90    buf_len = pf->pf_gen_window_update_frame(p, pend - p, stream_id, offset);
91    p += buf_len;
92
93    free(stream);
94
95    return p - pkt_buf;
96#endif
97    return 0;
98}
99
100
101void test_stream_frame()
102{
103    const uint8_t data[] = "123456789012345678901234567890";
104    lsquic_stream_t *stream = lsquic_stream_new(12345, NULL, NULL, NULL, 0, 0);
105    uint8_t buf[1500];
106    int buf_len = pf->pf_gen_stream_frame(buf, 1500,
107        stream->id, lsquic_stream_tosend_offset(stream),
108        lsquic_stream_tosend_fin(stream),
109        lsquic_stream_tosend_sz(stream),
110        (gsf_read_f) lsquic_stream_tosend_read,
111        stream);
112    stream_frame_t stream_frame2;
113    pf->pf_parse_stream_frame(buf, buf_len, &stream_frame2);
114    assert(0 == stream_frame2.data_frame.df_fin );
115    assert(30 == stream_frame2.data_frame.df_size );
116    assert(1000 == stream_frame2.data_frame.df_offset );
117    assert(12345 == stream_frame2.stream_id);
118    assert(memcmp(data,stream_frame2.data_frame.df_data, stream_frame2.data_frame.df_size) == 0);
119    printf("test_stream_frame passed.\n");
120    free(stream);
121}
122
123
124int
125main (void)
126{
127    uint8_t pkt_buf[1500];
128    size_t buf_len;
129    buf_len = make_complex_packet(pkt_buf, 1500);
130    (void) buf_len;
131    test_stream_frame();
132    return 0;
133}
134