aboutsummaryrefslogtreecommitdiffstats
path: root/libtests/buffer.cc
blob: f372e7b4432f7452a439bd398b1b295f2e57741a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <qpdf/assert_test.h>

#include <qpdf/Pl_Buffer.hh>
#include <qpdf/Pl_Count.hh>
#include <qpdf/Pl_Discard.hh>
#include <qpdf/QUtil.hh>
#include <cstring>
#include <iostream>
#include <stdexcept>
#include <stdlib.h>

static unsigned char*
uc(char const* s)
{
    return QUtil::unsigned_char_pointer(s);
}

int
main()
{
    {
        // Test that buffers can be copied by value.
        Buffer bc1(2);
        unsigned char* bc1p = bc1.getBuffer();
        bc1p[0] = 'Q';
        bc1p[1] = 'W';
        Buffer bc2(bc1);
        bc1p[0] = 'R';
        unsigned char* bc2p = bc2.getBuffer();
        assert(bc2p != bc1p);
        assert(bc2p[0] == 'Q');
        assert(bc2p[1] == 'W');
        bc2 = bc1;
        bc2p = bc2.getBuffer();
        assert(bc2p != bc1p);
        assert(bc2p[0] == 'R');
        assert(bc2p[1] == 'W');
    }

    {
        // Test that buffers can be moved.
        Buffer bm1(2);
        unsigned char* bm1p = bm1.getBuffer();
        bm1p[0] = 'Q';
        bm1p[1] = 'W';
        Buffer bm2(std::move(bm1));
        bm1p[0] = 'R';
        unsigned char* bm2p = bm2.getBuffer();
        assert(bm2p == bm1p);
        assert(bm2p[0] == 'R');

        Buffer bm3 = std::move(bm2);
        unsigned char* bm3p = bm3.getBuffer();
        assert(bm3p == bm2p);
    }

    try {
        Pl_Discard discard;
        Pl_Count count("count", &discard);
        Pl_Buffer bp1("bp1", &count);
        bp1.write(uc("12345"), 5);
        bp1.write(uc("67890"), 5);
        bp1.finish();
        std::cout << "count: " << count.getCount() << std::endl;
        bp1.write(uc("abcde"), 5);
        bp1.write(uc("fghij"), 6);
        bp1.finish();
        std::cout << "count: " << count.getCount() << std::endl;
        Buffer* b = bp1.getBuffer();
        std::cout << "size: " << b->getSize() << std::endl;
        std::cout << "data: " << b->getBuffer() << std::endl;
        delete b;
        bp1.write(uc("qwert"), 5);
        bp1.write(uc("yuiop"), 6);
        bp1.finish();
        std::cout << "count: " << count.getCount() << std::endl;
        b = bp1.getBuffer();
        std::cout << "size: " << b->getSize() << std::endl;
        std::cout << "data: " << b->getBuffer() << std::endl;
        delete b;

        Pl_Buffer bp2("bp2");
        bp2.write(uc("moo"), 3);
        bp2.write(uc("quack"), 6);
        try {
            delete bp2.getBuffer();
        } catch (std::exception& e) {
            std::cout << e.what() << std::endl;
        }
        bp2.finish();
        b = bp2.getBuffer();
        std::cout << "size: " << b->getSize() << std::endl;
        std::cout << "data: " << b->getBuffer() << std::endl;
        delete b;

        unsigned char lbuf[10];
        Buffer b1(lbuf, 10);
        if (!((b1.getBuffer() == lbuf) && (b1.getSize() == 10))) {
            throw std::logic_error("hand-created buffer is not as expected");
        }

        Pl_Buffer bp3("bp3");
        b = bp3.getBuffer();
        std::cout << "size: " << b->getSize() << std::endl;
        delete b;
        // Should be able to call getBuffer again and get an empty buffer
        b = bp3.getBuffer();
        std::cout << "size: " << b->getSize() << std::endl;
        delete b;
        // Also can write 0 and do it.
        bp3.write(uc(""), 0);
        bp3.finish();
        b = bp3.getBuffer();
        std::cout << "size: " << b->getSize() << std::endl;
        delete b;

        // Malloc buffer should behave similarly.
        Pl_Buffer bp4("bp4");
        bp4.write(uc("asdf"), 4);
        unsigned char* mbuf;
        size_t len;
        try {
            bp4.getMallocBuffer(&mbuf, &len);
            assert(false);
        } catch (std::logic_error& e) {
            std::cout << "malloc buffer logic error: " << e.what() << std::endl;
        }
        bp4.finish();
        bp4.getMallocBuffer(&mbuf, &len);
        assert(len == 4);
        assert(memcmp(mbuf, uc("asdf"), 4) == 0);
        free(mbuf);
        bp4.write(uc(""), 0);
        bp4.finish();
        bp4.getMallocBuffer(&mbuf, &len);
        assert(mbuf == nullptr);
        assert(len == 0);
    } catch (std::exception& e) {
        std::cout << "unexpected exception: " << e.what() << std::endl;
        exit(2);
    }

    std::cout << "done" << std::endl;
    return 0;
}