Author: file
Date: Sat Jul 27 11:35:39 2013
New Revision: 395602

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=395602
Log:
Finish up JSON test, make retrieval test work, tweak code some.

Modified:
    team/file/bucket/main/bucket.c
    team/file/bucket/tests/test_bucket.c

Modified: team/file/bucket/main/bucket.c
URL: 
http://svnview.digium.com/svn/asterisk/team/file/bucket/main/bucket.c?view=diff&rev=395602&r1=395601&r2=395602
==============================================================================
--- team/file/bucket/main/bucket.c (original)
+++ team/file/bucket/main/bucket.c Sat Jul 27 11:35:39 2013
@@ -84,7 +84,7 @@
 static void *bucket_wizard_retrieve(const struct ast_sorcery *sorcery, void 
*data, const char *type,
        const char *id)
 {
-       char *full_uri, *scheme_name = DEFAULT_UNSPECIFIED_SCHEME, *path, *tmp;
+       char *full_uri, *scheme_name = DEFAULT_UNSPECIFIED_SCHEME, *tmp;
        RAII_VAR(struct bucket_scheme *, scheme, NULL, ao2_cleanup);
 
        if (!(full_uri = ast_strdupa(id))) {
@@ -92,14 +92,17 @@
        }
 
        /* Assume no scheme until proven otherwise */
-       path = full_uri;
        if ((tmp = strstr(full_uri, "://"))) {
                scheme_name = full_uri;
                *tmp++ = '\0';
-               path = tmp;
-       }
-
-       if (ast_strlen_zero(scheme_name) || ast_strlen_zero(path)) {
+
+               /* If only a scheme has been specified this URI is invalid */
+               if (ast_strlen_zero(tmp)) {
+                       return NULL;
+               }
+       }
+
+       if (ast_strlen_zero(scheme_name)) {
                return NULL;
        }
 
@@ -108,7 +111,7 @@
                return NULL;
        }
 
-       return scheme->bucket->retrieve_id(sorcery, data, type, path);
+       return scheme->bucket->retrieve_id(sorcery, data, type, id);
 }
 
 /*! \brief Callback function for deleting a bucket */
@@ -143,7 +146,8 @@
        SCOPED_AO2WRLOCK(lock, schemes);
        struct bucket_scheme *scheme;
 
-       if (ast_strlen_zero(name) || !bucket || !file) {
+       if (ast_strlen_zero(name) || !bucket || !file ||
+           !bucket->create || !bucket->delete || !bucket->retrieve_id) {
                return -1;
        }
 
@@ -344,27 +348,48 @@
 struct ast_json *ast_bucket_json(const struct ast_bucket *bucket)
 {
        RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
-       struct ast_json *files, *buckets;
+       struct ast_json *id, *files, *buckets;
        struct ao2_iterator i;
        char *uri;
+       int res = 0;
 
        json = ast_sorcery_objectset_json_create(bucket_sorcery, bucket);
        if (!json) {
                return NULL;
        }
 
+       id = ast_json_string_create(ast_sorcery_object_get_id(bucket));
+       if (!id) {
+               return NULL;
+       }
+
+       if (ast_json_object_set(json, "id", id)) {
+               ast_json_unref(id);
+               return NULL;
+       }
+
        buckets = ast_json_array_create();
        if (!buckets) {
                return NULL;
        }
 
-       /* TODO: Below needs better error checking */
-
        i = ao2_iterator_init(bucket->buckets, 0);
        for (; (uri = ao2_iterator_next(&i)); ao2_ref(uri, -1)) {
-               ast_json_array_append(buckets, ast_json_string_create(uri));
+               struct ast_json *bucket_uri = ast_json_string_create(uri);
+
+               if (!bucket_uri) {
+                       res = -1;
+                       break;
+               }
+
+               ast_json_array_append(buckets, bucket_uri);
        }
        ao2_iterator_destroy(&i);
+
+       if (res) {
+               ast_json_unref(buckets);
+               return NULL;
+       }
 
        ast_json_object_set(json, "buckets", buckets);
 
@@ -375,9 +400,21 @@
 
        i = ao2_iterator_init(bucket->files, 0);
        for (; (uri = ao2_iterator_next(&i)); ao2_ref(uri, -1)) {
-               ast_json_array_append(files, ast_json_string_create(uri));
+               struct ast_json *file_uri = ast_json_string_create(uri);
+
+               if (!file_uri) {
+                       res = -1;
+                       break;
+               }
+
+               ast_json_array_append(files, file_uri);
        }
        ao2_iterator_destroy(&i);
+
+       if (res) {
+               ast_json_unref(files);
+               return NULL;
+       }
 
        ast_json_object_set(json, "files", files);
 
@@ -507,4 +544,4 @@
 failure:
        bucket_cleanup();
        return -1;
-}
+}

Modified: team/file/bucket/tests/test_bucket.c
URL: 
http://svnview.digium.com/svn/asterisk/team/file/bucket/tests/test_bucket.c?view=diff&rev=395602&r1=395601&r2=395602
==============================================================================
--- team/file/bucket/tests/test_bucket.c (original)
+++ team/file/bucket/tests/test_bucket.c Sat Jul 27 11:35:39 2013
@@ -71,6 +71,16 @@
        return 0;
 }
 
+static void *bucket_test_wizard_retrieve_id(const struct ast_sorcery *sorcery, 
void *data, const char *type, 
+       const char *id)
+{
+       if (!strcmp(type, "bucket")) {
+               return ast_bucket_alloc(id);
+       } else {
+               return NULL;
+       }
+}
+
 static int bucket_test_wizard_delete(const struct ast_sorcery *sorcery, void 
*data, void *object)
 {
        if (bucket_test_wizard_state.deleted) {
@@ -85,12 +95,14 @@
 static struct ast_sorcery_wizard bucket_test_wizard = {
        .name = "test",
        .create = bucket_test_wizard_create,
+       .retrieve_id = bucket_test_wizard_retrieve_id,
        .delete = bucket_test_wizard_delete,
 };
 
 static struct ast_sorcery_wizard bucket_file_test_wizard = {
        .name = "test",
        .create = bucket_test_wizard_create,
+       .retrieve_id = bucket_test_wizard_retrieve_id,
        .delete = bucket_test_wizard_delete,
 };
 
@@ -293,6 +305,7 @@
 {
        RAII_VAR(struct ast_bucket *, bucket, NULL, ao2_cleanup);
        RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
+       struct ast_json_iter *field;
 
        switch (cmd) {
        case TEST_INIT:
@@ -320,7 +333,73 @@
                return AST_TEST_FAIL;
        }
 
-       /* TODO: Check contents of JSON against expected */
+       for (field = ast_json_object_iter(json); field; field = 
ast_json_object_iter_next(json, field)) {
+               struct ast_json *value = ast_json_object_iter_value(field);
+
+               if (!strcmp(ast_json_object_iter_key(field), "id")) {
+                       if (strcmp(ast_json_string_get(value), "bob")) {
+                               ast_test_status_update(test, "Expected id of 
'bob' in bucket JSON but got '%s'\n",
+                                       ast_json_string_get(value));
+                               return AST_TEST_FAIL;
+                       }
+               } else if (!strcmp(ast_json_object_iter_key(field), 
"modified")) {
+                       if (strcmp(ast_json_string_get(value), "0")) {
+                               ast_test_status_update(test, "Expected modified 
time of '0' in bucket JSON but got '%s'\n",
+                                       ast_json_string_get(value));
+                               return AST_TEST_FAIL;
+                       }
+               } else if (!strcmp(ast_json_object_iter_key(field), "created")) 
{
+                       if (strcmp(ast_json_string_get(value), "0")) {
+                               ast_test_status_update(test, "Expected created 
time of '0' in bucket JSON but got '%s'\n",
+                                       ast_json_string_get(value));
+                               return AST_TEST_FAIL;
+                       }
+               } else if (!strcmp(ast_json_object_iter_key(field), "scheme")) {
+                       if (strcmp(ast_json_string_get(value), "test")) {
+                               ast_test_status_update(test, "Expected scheme 
of 'test' in bucket JSON but got '%s'\n",
+                                       ast_json_string_get(value));
+                               return AST_TEST_FAIL;
+                       }
+               } else if (!strcmp(ast_json_object_iter_key(field), "uri")) {
+                       if (strcmp(ast_json_string_get(value), 
"test:///tmp/bob")) {
+                               ast_test_status_update(test, "Expected URI of 
'test:///tmp/bob' in bucket JSON but got '%s'\n",
+                                       ast_json_string_get(value));
+                               return AST_TEST_FAIL;
+                       }
+               } else if (!strcmp(ast_json_object_iter_key(field), "buckets")) 
{
+                       struct ast_json *uri;
+
+                       if (ast_json_array_size(value) != 1) {
+                               ast_test_status_update(test, "Expected buckets 
array size of '1' in bucket JSON but got '%zd'\n",
+                                       ast_json_array_size(value));
+                               return AST_TEST_FAIL;
+                       }
+
+                       uri = ast_json_array_get(value, 0);
+
+                       if (strcmp(ast_json_string_get(uri), 
"test:///tmp/bob/joe")) {
+                               ast_test_status_update(test, "Expected URI of 
'test:///tmp/bob/joe' in buckets array but got '%s'\n",
+                                       ast_json_string_get(value));
+                               return AST_TEST_FAIL;
+                       }
+               } else if (!strcmp(ast_json_object_iter_key(field), "files")) {
+                       struct ast_json *uri;
+
+                       if (ast_json_array_size(value) != 1) {
+                               ast_test_status_update(test, "Expected files 
array size of '1' in bucket JSON but got '%zd'\n",
+                                       ast_json_array_size(value));
+                               return AST_TEST_FAIL;
+                       }
+
+                       uri = ast_json_array_get(value, 0);
+
+                       if (strcmp(ast_json_string_get(uri), 
"test:///tmp/bob/recording.wav")) {
+                               ast_test_status_update(test, "Expected URI of 
'test:///tmp/bob/recording.wav' in buckets array but got '%s'\n",
+                                       ast_json_string_get(value));
+                               return AST_TEST_FAIL;
+                       }
+               }
+       }
 
        return AST_TEST_PASS;
 }


--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to