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
|
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
* Copyright 2023 MariaDB Corporation Ab. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
#include <yatl/lite.h>
#include <libmarias3/marias3.h>
#define NUM_BYTES 64 * 1024
/* Tests basic GET with a custom read callback */
int total_reads = 0;
static size_t read_cb(void *buf, size_t size, size_t nitems, void *userdata)
{
char** dat = (char**)userdata;
char* ptr = *dat;
memcpy(ptr, buf, size * nitems);
ptr += size * nitems;
*dat = ptr;
total_reads++;
return nitems * size;
}
int main(int argc, char *argv[])
{
int res;
int initial_reads;
uint8_t *data;
size_t length;
ms3_st *ms3;
size_t buffer_size;
char *test_string = malloc(NUM_BYTES);
char *dest = malloc(NUM_BYTES);
char* userdata = dest;
char *s3key = getenv("S3KEY");
char *s3secret = getenv("S3SECRET");
char *s3region = getenv("S3REGION");
char *s3bucket = getenv("S3BUCKET");
char *s3host = getenv("S3HOST");
char *s3noverify = getenv("S3NOVERIFY");
char *s3usehttp = getenv("S3USEHTTP");
char *s3port = getenv("S3PORT");
SKIP_IF_(!s3key, "Environment variable S3KEY missing");
SKIP_IF_(!s3secret, "Environment variable S3SECRET missing");
SKIP_IF_(!s3region, "Environment variable S3REGION missing");
SKIP_IF_(!s3bucket, "Environment variable S3BUCKET missing");
(void) argc;
(void) argv;
memset(test_string, 'a', NUM_BYTES);
memset(dest, 'b', NUM_BYTES);
ms3_library_init();
ms3 = ms3_init(s3key, s3secret, s3region, s3host);
if (s3noverify && !strcmp(s3noverify, "1"))
{
ms3_set_option(ms3, MS3_OPT_DISABLE_SSL_VERIFY, NULL);
}
if (s3usehttp && !strcmp(s3usehttp, "1"))
{
ms3_set_option(ms3, MS3_OPT_USE_HTTP, NULL);
}
if (s3port)
{
int port = atol(s3port);
ms3_set_option(ms3, MS3_OPT_PORT_NUMBER, &port);
}
ASSERT_NOT_NULL(ms3);
res = ms3_put(ms3, s3bucket, "test/read_cb.dat",
(const uint8_t *)test_string,
NUM_BYTES);
ASSERT_EQ_(res, 0, "Result: %u", res);
res = ms3_set_option(ms3, MS3_OPT_READ_CB, read_cb);
ASSERT_EQ_(res, 0, "Result: %u", res);
res = ms3_set_option(ms3, MS3_OPT_USER_DATA, &userdata);
ASSERT_EQ_(res, 0, "Result: %u", res);
length = 0;
data = 0;
res = ms3_get(ms3, s3bucket, "test/read_cb.dat", &data, &length);
ASSERT_EQ_(res, 0, "Result: %u", res);
ASSERT_EQ(data, 0);
ASSERT_EQ(length, 0);
ASSERT_EQ(memcmp(test_string, dest, NUM_BYTES), 0);
/** Test that the callbacks work with a smaller chunk size */
memset(dest, 'c', NUM_BYTES);
userdata = dest;
buffer_size = 1024;
res = ms3_set_option(ms3, MS3_OPT_BUFFER_CHUNK_SIZE, &buffer_size);
ASSERT_EQ_(res, 0, "Result: %u", res);
initial_reads = total_reads;
res = ms3_get(ms3, s3bucket, "test/read_cb.dat", &data, &length);
ASSERT_EQ_(res, 0, "Result: %u", res);
ASSERT_EQ(memcmp(test_string, dest, NUM_BYTES), 0);
ASSERT_TRUE_((total_reads - initial_reads) > initial_reads * 2,
"Expected more than %d reads but got only %d",
initial_reads * 2, total_reads - initial_reads);
res = ms3_delete(ms3, s3bucket, "test/read_cb.dat");
ASSERT_EQ_(res, 0, "Result: %u", res);
free(test_string);
free(dest);
ms3_free(data);
ms3_deinit(ms3);
ms3_library_deinit();
return 0;
}
|