@@ -82,3 +82,155 @@ BOOST_AUTO_TEST_CASE( get_object ) {
8282 free_client (client);
8383}
8484
85+ void put_test_file (ds3_client* client, const char * file_name, const char * object_name, const char * bucket_name) {
86+ ds3_request* request = NULL ;
87+ ds3_error* error = NULL ;
88+ FILE* file = fopen (file_name, " r" );
89+
90+ // Get file size
91+ uint64_t size = get_file_size (file_name);
92+
93+ // Perform naked put object
94+ request = ds3_init_put_object_request (bucket_name, object_name, size);
95+ error = ds3_put_object_request (client, request, file, ds3_read_from_file);
96+ ds3_request_free (request);
97+ fclose (file);
98+ handle_error (error);
99+ }
100+
101+ size_t test_write_buff_counter (void * buffer, size_t size, size_t nmemb, void * user_byte_count) {
102+ int cur_byte_count = size * nmemb;
103+
104+ int * total_byte_count = (int *)user_byte_count;
105+ *total_byte_count += cur_byte_count;
106+ return cur_byte_count;
107+ }
108+
109+ BOOST_AUTO_TEST_CASE ( get_objects_with_versioning ) {
110+ printf (" -----Testing GET object with versioning-------\n " );
111+ const char * dp_name = " c_test_dp_with_versioning" ;
112+ const char * bucket_name = " test_get_object_bucket" ;
113+ const char * file_name1 = " resources/sherlock_holmes.txt" ;
114+ const char * file_name2 = " resources/beowulf.txt" ;
115+ const char * object_name = " sherlock_holmes_versioned.txt" ;
116+ ds3_request* request = NULL ;
117+ ds3_error* error = NULL ;
118+ ds3_data_policy_response* put_dp_response = NULL ;
119+ ds3_list_bucket_result_response* get_bucket_response = NULL ;
120+ ds3_bulk_object_list_response* bulk_objects_response = NULL ;
121+ ds3_master_object_list_response* bulk_get_response = NULL ;
122+
123+ ds3_client* client = get_client ();
124+
125+ // Create data policy with versioning turned on
126+ request = ds3_init_put_data_policy_spectra_s3_request (dp_name);
127+ ds3_request_set_versioning_ds3_versioning_level (request, DS3_VERSIONING_LEVEL_KEEP_MULTIPLE_VERSIONS);
128+ error = ds3_put_data_policy_spectra_s3_request (client, request, &put_dp_response);
129+ handle_error (error);
130+
131+ BOOST_CHECK (put_dp_response != NULL );
132+ ds3_str* data_policy_id = ds3_str_init (put_dp_response->id ->value );
133+
134+ ds3_request_free (request);
135+ ds3_data_policy_response_free (put_dp_response);
136+
137+ // Create data persistence rule
138+ ds3_data_persistence_rule_response* put_data_persistence_rule_response = NULL ;
139+ request = ds3_init_put_data_persistence_rule_spectra_s3_request (
140+ data_policy_id->value ,
141+ DS3_DATA_ISOLATION_LEVEL_STANDARD,
142+ TEST_SD_NAME,
143+ DS3_DATA_PERSISTENCE_RULE_TYPE_PERMANENT);
144+ error = ds3_put_data_persistence_rule_spectra_s3_request (client, request, &put_data_persistence_rule_response);
145+ handle_error (error);
146+ ds3_str* data_persistence_rule_id = ds3_str_init (put_data_persistence_rule_response->id ->value );
147+
148+ ds3_request_free (request);
149+ ds3_data_persistence_rule_response_free (put_data_persistence_rule_response);
150+
151+ // Create bucket with data policy
152+ error = create_bucket_with_data_policy (client, bucket_name, data_policy_id->value );
153+ handle_error (error);
154+
155+ // Put object twice
156+ put_test_file (client, file_name1, object_name, bucket_name);
157+ put_test_file (client, file_name2, object_name, bucket_name);
158+
159+ // Get version of an object TODO
160+ request = ds3_init_get_bucket_request (bucket_name);
161+ ds3_request_set_versions (request, True);
162+ error = ds3_get_bucket_request (client, request, &get_bucket_response);
163+ handle_error (error);
164+
165+ BOOST_CHECK_EQUAL (get_bucket_response->num_objects , 0 );
166+ BOOST_CHECK_EQUAL (get_bucket_response->num_versioned_objects , 2 );
167+
168+ ds3_request_free (request);
169+
170+
171+ // Perform bulk get with both versioned objects
172+ // TODO start
173+ bulk_objects_response = ds3_convert_object_list ((const ds3_contents_response**)get_bucket_response->versioned_objects , get_bucket_response->num_versioned_objects );
174+ ds3_list_bucket_result_response_free (get_bucket_response);
175+
176+ request = ds3_init_get_bulk_job_spectra_s3_request (bucket_name, bulk_objects_response);
177+
178+ error = ds3_get_bulk_job_spectra_s3_request (client, request, &bulk_get_response);
179+ ds3_request_free (request);
180+ ds3_bulk_object_list_response_free (bulk_objects_response);
181+ handle_error (error);
182+
183+ /* TODO uncomment once related bug is fixed
184+ ds3_master_object_list_response* chunk_response = NULL;
185+ chunk_response = ensure_available_chunks(client, bulk_get_response->job_id);
186+
187+
188+ for (uint64_t chunk_index = 0; chunk_index < chunk_response->num_objects; chunk_index++) {
189+ ds3_objects_response* chunk_object_list = chunk_response->objects[chunk_index];
190+ for (uint64_t chunk_object_index = 0; chunk_object_index < chunk_object_list->num_objects; chunk_object_index++) {
191+ ds3_bulk_object_response* current_obj = chunk_object_list->objects[chunk_object_index];
192+
193+ const uint64_t length = current_obj->length;
194+ const uint64_t offset = current_obj->offset;
195+
196+ request = ds3_init_get_object_request(chunk_response->bucket_name->value, current_obj->name->value, length);
197+ ds3_request_set_job(request, chunk_response->job_id->value);
198+ ds3_request_set_offset(request, offset);
199+ ds3_request_set_version_id(request, current_obj->id->value);
200+
201+ int byte_count = 0;
202+ error = ds3_get_object_request(client, request, &byte_count, test_write_buff_counter);
203+ ds3_request_free(request);
204+ handle_error(error);
205+
206+ BOOST_CHECK(byte_count > 0); //todo update to check for expected length for this version
207+ }
208+ }
209+
210+ ds3_master_object_list_response_free(chunk_response);
211+ */
212+ ds3_master_object_list_response_free (bulk_get_response);
213+
214+ // Delete bucket with force i.e. with objects
215+ request = ds3_init_delete_bucket_spectra_s3_request (bucket_name);
216+ ds3_request_set_force (request, True);
217+ error = ds3_delete_bucket_spectra_s3_request (client, request);
218+ handle_error (error);
219+ ds3_request_free (request);
220+
221+ // Delete data persistence rule
222+ ds3_request* delete_data_persistence_rule_request = ds3_init_delete_data_persistence_rule_spectra_s3_request (data_persistence_rule_id->value );
223+ error = ds3_delete_data_persistence_rule_spectra_s3_request (client, delete_data_persistence_rule_request);
224+ handle_error (error);
225+ ds3_request_free (delete_data_persistence_rule_request);
226+ ds3_str_free (data_persistence_rule_id);
227+
228+ // Delete DataPolicy
229+ ds3_request* delete_data_policy_request = ds3_init_delete_data_policy_spectra_s3_request (dp_name);
230+ error = ds3_delete_data_policy_spectra_s3_request (client, delete_data_policy_request);
231+ handle_error (error);
232+ ds3_request_free (delete_data_policy_request);
233+ ds3_str_free (data_policy_id);
234+
235+ free_client (client);
236+ }
0 commit comments