1 /* check-sources:disable-copyright-check */
2 /*
3 * get ID with a provided buffer
4 */
5
6 #include <droplet.h>
7 #include <assert.h>
8
main(int argc,char ** argv)9 int main(int argc, char** argv)
10 {
11 int ret;
12 dpl_ctx_t* ctx;
13 dpl_dict_t* metadata = NULL;
14 char* data_buf = NULL;
15 size_t data_len;
16 char* data_buf_returned = NULL;
17 u_int data_len_returned;
18 dpl_dict_t* metadata_returned = NULL;
19 dpl_dict_var_t* metadatum = NULL;
20 dpl_option_t option;
21 dpl_sysmd_t sysmd;
22 char* force_id = NULL;
23
24 if (2 == argc) {
25 force_id = argv[1];
26 } else if (1 != argc) {
27 fprintf(stderr, "usage: idtest [id]\n");
28 ret = 1;
29 goto end;
30 }
31
32 ret = dpl_init(); // init droplet library
33 if (DPL_SUCCESS != ret) {
34 fprintf(stderr, "dpl_init failed\n");
35 ret = 1;
36 goto end;
37 }
38
39 // open default profile
40 ctx = dpl_ctx_new(NULL, // droplet directory, default: "~/.droplet"
41 NULL); // droplet profile, default: "default"
42 if (NULL == ctx) {
43 fprintf(stderr, "dpl_ctx_new failed\n");
44 ret = 1;
45 goto free_dpl;
46 }
47
48 // ctx->trace_level = ~0;
49 // ctx->trace_buffers = 1;
50
51 data_len = 10000;
52 data_buf = malloc(data_len);
53 if (NULL == data_buf) {
54 fprintf(stderr, "alloc data failed\n");
55 ret = 1;
56 goto free_all;
57 }
58
59 memset(data_buf, 'z', data_len);
60
61 metadata = dpl_dict_new(13);
62 if (NULL == metadata) {
63 fprintf(stderr, "dpl_dict_new failed\n");
64 ret = 1;
65 goto free_all;
66 }
67
68 ret = dpl_dict_add(metadata, "foo", "bar", 0);
69 if (DPL_SUCCESS != ret) {
70 fprintf(stderr, "dpl_dict_add failed\n");
71 ret = 1;
72 goto free_all;
73 }
74
75 ret = dpl_dict_add(metadata, "foo2", "qux", 0);
76 if (DPL_SUCCESS != ret) {
77 fprintf(stderr, "dpl_dict_add failed\n");
78 ret = 1;
79 goto free_all;
80 }
81
82 /**/
83
84 fprintf(stderr, "setting object+MD\n");
85
86 if (force_id) {
87 // we have a broken cloud storage with no POST
88 ret = dpl_put_id(ctx, // the context
89 NULL, // no bucket
90 force_id, // the id
91 NULL, // no option
92 DPL_FTYPE_REG, // regular object
93 NULL, // no condition
94 NULL, // no range
95 metadata, // the metadata
96 NULL, // no sysmd
97 data_buf, // object body
98 data_len); // object length
99 if (DPL_SUCCESS != ret) {
100 fprintf(stderr, "dpl_put_id failed: %s (%d)\n", dpl_status_str(ret), ret);
101 ret = 1;
102 goto free_all;
103 }
104
105 // emulate returned sysmd
106 memset(&sysmd, 0, sizeof(sysmd));
107 strncpy(sysmd.id, force_id, sizeof(sysmd.id));
108 } else {
109 ret = dpl_post_id(ctx, // the context
110 NULL, // no bucket
111 NULL, // no id
112 NULL, // no option
113 DPL_FTYPE_REG, // regular object
114 NULL, // condition
115 NULL, // range
116 metadata, // the metadata
117 NULL, // no sysmd
118 data_buf, // object body
119 data_len, // object length
120 NULL, // no query params
121 &sysmd); // the returned sysmd
122 if (DPL_SUCCESS != ret) {
123 fprintf(stderr, "dpl_post_id failed: %s (%d)\n", dpl_status_str(ret),
124 ret);
125 ret = 1;
126 goto free_all;
127 }
128
129 if (!(sysmd.mask & DPL_SYSMD_MASK_ID)) {
130 fprintf(stderr, "backend is not capable of retrieving resource id\n");
131 exit(1);
132 }
133
134 fprintf(stderr, "id=%s\n", sysmd.id);
135 }
136
137 /**/
138
139 fprintf(stderr, "getting object+MD\n");
140
141 option.mask = DPL_OPTION_NOALLOC; // provide buffer
142 data_buf_returned = malloc(data_len);
143 if (NULL == data_buf_returned) {
144 fprintf(stderr, "malloc failed\n");
145 exit(1);
146 }
147 data_len_returned = data_len;
148
149 ret = dpl_get_id(ctx, // the context
150 NULL, // no bucket
151 sysmd.id, // the key
152 &option, // options
153 DPL_FTYPE_REG, // object type
154 NULL, // no condition
155 NULL, // no range
156 &data_buf_returned, // data object
157 &data_len_returned, // data object length
158 &metadata_returned, // metadata
159 NULL); // sysmd
160 if (DPL_SUCCESS != ret) {
161 fprintf(stderr, "dpl_get_id failed: %s (%d)\n", dpl_status_str(ret), ret);
162 ret = 1;
163 goto free_all;
164 }
165
166 fprintf(stderr, "checking object\n");
167
168 if (data_len != data_len_returned) {
169 fprintf(stderr, "data lengths mismatch %d != %ld (orig)\n",
170 data_len_returned, data_len);
171 ret = 1;
172 goto free_all;
173 }
174
175 if (0 != memcmp(data_buf, data_buf_returned, data_len)) {
176 fprintf(stderr, "data content mismatch\n");
177 ret = 1;
178 goto free_all;
179 }
180
181 fprintf(stderr, "checking metadata\n");
182
183 metadatum = dpl_dict_get(metadata_returned, "foo");
184 if (NULL == metadatum) {
185 fprintf(stderr, "missing metadatum\n");
186 ret = 1;
187 goto free_all;
188 }
189
190 assert(metadatum->val->type == DPL_VALUE_STRING);
191 if (strcmp(dpl_sbuf_get_str(metadatum->val->string), "bar")) {
192 fprintf(stderr, "bad value in metadatum\n");
193 ret = 1;
194 goto free_all;
195 }
196
197 metadatum = dpl_dict_get(metadata_returned, "foo2");
198 if (NULL == metadatum) {
199 fprintf(stderr, "missing metadatum\n");
200 ret = 1;
201 goto free_all;
202 }
203
204 assert(metadatum->val->type == DPL_VALUE_STRING);
205 if (strcmp(dpl_sbuf_get_str(metadatum->val->string), "qux")) {
206 fprintf(stderr, "bad value in metadatum\n");
207 ret = 1;
208 goto free_all;
209 }
210
211 /**/
212
213 fprintf(stderr, "delete object+MD\n");
214
215 ret = dpl_delete_id(ctx, // the context
216 NULL, // no bucket
217 sysmd.id, // the key
218 NULL, // no option
219 DPL_FTYPE_UNDEF, // no matter the file type
220 NULL); // no condition
221 if (DPL_SUCCESS != ret) {
222 fprintf(stderr, "error deleting object: %s (%d)\n", dpl_status_str(ret),
223 ret);
224 ret = 1;
225 goto free_all;
226 }
227
228 ret = 0;
229
230 free_all:
231
232 if (NULL != metadata_returned) dpl_dict_free(metadata_returned);
233
234 if (NULL != data_buf_returned) free(data_buf_returned);
235
236 if (NULL != metadata) dpl_dict_free(metadata);
237
238 if (NULL != data_buf) free(data_buf);
239
240 dpl_ctx_free(ctx); // free context
241
242 free_dpl:
243 dpl_free(); // free droplet library
244
245 end:
246 return ret;
247 }
248