]> git.meshlink.io Git - meshlink/commitdiff
Add meshlink_get_submesh API
authorLakshminarayana Gurram <38289425+lakshminarayanagurram@users.noreply.github.com>
Tue, 23 Apr 2019 04:20:09 +0000 (09:50 +0530)
committerGuus Sliepen <guus@meshlink.io>
Sat, 25 May 2019 22:11:21 +0000 (00:11 +0200)
* Add meshlink_get_submesh API

* Modify submesh test vector to test meshlink_get_submesh API

src/meshlink++.h
src/meshlink.c
src/meshlink.h
test/blackbox/common/containers.h
test/blackbox/run_blackbox_tests/run_blackbox_tests.c
test/blackbox/run_blackbox_tests/test_cases_submesh01.c
test/blackbox/run_blackbox_tests/test_cases_submesh02.c
test/blackbox/run_blackbox_tests/test_cases_submesh03.c
test/blackbox/run_blackbox_tests/test_cases_submesh04.c
test/blackbox/test_cases_submesh02/node_sim_app1node2.c
test/blackbox/test_cases_submesh02/node_sim_app2node2.c

index ac72f3cc96f46a0438a24d567fa25688257a8ade..8f4a9b003427f0c1e13f8c232ec38b60887fb21f 100644 (file)
@@ -327,6 +327,18 @@ public:
                return (node *)meshlink_get_node(handle, name);
        }
 
+       /// Get a handle for a specific submesh.
+       /** This function returns a handle for the submesh with the given name.
+        *
+        *  @param name         The name of the submesh for which a handle is requested.
+        *
+        *  @return             A pointer to a meshlink::submesh which represents the requested submesh,
+        *                      or NULL if the requested submesh does not exist.
+        */
+       submesh *get_submesh(const char *name) {
+               return (submesh *)meshlink_get_submesh(handle, name);
+       }
+
        /// Get a handle for our own node.
        /** This function returns a handle for the local node.
         *
index 8ec207842c6732bee32b25914db502c1174863d5..cd23771ab70697f565df0f93b77b26d8089c6d54 100644 (file)
@@ -1852,6 +1852,20 @@ meshlink_node_t *meshlink_get_node(meshlink_handle_t *mesh, const char *name) {
        return node;
 }
 
+meshlink_submesh_t *meshlink_get_submesh(meshlink_handle_t *mesh, const char *name) {
+       if(!mesh || !name) {
+               meshlink_errno = MESHLINK_EINVAL;
+               return NULL;
+       }
+
+       meshlink_submesh_t *submesh = NULL;
+
+       pthread_mutex_lock(&(mesh->mesh_mutex));
+       submesh = (meshlink_submesh_t *)lookup_submesh(mesh, name);
+       pthread_mutex_unlock(&(mesh->mesh_mutex));
+       return submesh;
+}
+
 meshlink_node_t **meshlink_get_all_nodes(meshlink_handle_t *mesh, meshlink_node_t **nodes, size_t *nmemb) {
        if(!mesh || !nmemb || (*nmemb && !nodes)) {
                meshlink_errno = MESHLINK_EINVAL;
index 43d269cea76492134c08e4c8ffd9684a69502e52..a672118bec62abfc9a2e27bb79d0157b34d02c1e 100644 (file)
@@ -441,6 +441,19 @@ extern meshlink_node_t *meshlink_get_self(meshlink_handle_t *mesh);
  */
 extern meshlink_node_t *meshlink_get_node(meshlink_handle_t *mesh, const char *name);
 
+/// Get a handle for a specific submesh.
+/** This function returns a handle for the submesh with the given name.
+ *
+ *  @param mesh         A handle which represents an instance of MeshLink.
+ *  @param name         The name of the submesh for which a handle is requested.
+ *                      After this function returns, the application is free to overwrite or free @a name @a.
+ *
+ *  @return             A pointer to a meshlink_submesh_t which represents the requested submesh,
+ *                      or NULL if the requested submesh does not exist.
+ *                      The pointer is guaranteed to be valid until meshlink_close() is called.
+ */
+extern meshlink_submesh_t *meshlink_get_submesh(meshlink_handle_t *mesh, const char *name);
+
 /// Get the fingerprint of a node's public key.
 /** This function returns a fingerprint of the node's public key.
  *  It should be treated as an opaque blob.
index 8a54e6a32a546aa6afb2bf92a0b36102670e1ee1..c807bbfff09ed497f29dea33e688884a09f4fc9d 100644 (file)
@@ -49,6 +49,7 @@ extern void setup_containers(void **state);
 extern void destroy_containers(void);
 extern void restart_all_containers(void);
 extern char *invite_in_container(const char *inviter, const char *invitee);
+extern char *submesh_invite_in_container(const char *inviter, const char *invitee, const char *submesh);
 extern void node_sim_in_container(const char *node, const char *device_class, const char *invite_url);
 extern void node_sim_in_container_event(const char *node, const char *device_class,
                                         const char *invite_url, const char *clientId, const char *import);
index edf0f95dc977d28278ce6108ecdaf3d2c429465b..29c662bb3a3f0f934e1a573b2477513d3878967b 100644 (file)
@@ -134,13 +134,14 @@ int main(int argc, char *argv[]) {
        failed_tests += test_meshlink_channel_close();
 
        failed_tests += test_meshlink_channel_conn();
+       */
        failed_tests += test_optimal_pmtu();
 
        failed_tests += test_cases_submesh01();
        failed_tests += test_cases_submesh02();
        failed_tests += test_cases_submesh03();
        failed_tests += test_cases_submesh04();
-       */
+
        failed_tests += test_meshlink_autoconnect();
 
        failed_tests += test_optimal_pmtu();
index 00f415255a4116e526bcd74801869d502438b95d..c9854a1257244408dc0be0206a7d65054ae050c8 100644 (file)
@@ -113,7 +113,7 @@ static bool event_cb(mesh_event_payload_t payload) {
        assert(change_state(&node_status[payload.client_id], payload.mesh_event));
 
        if(payload.mesh_event == NODE_JOINED) {
-               signal_node_start(node_status, 1, 5, node_ids);
+               signal_node_start(node_status, 1, 5, (char **)node_ids);
        }
 
        if(check_nodes_finished(node_status, 6)) {
@@ -188,4 +188,4 @@ int test_cases_submesh01(void) {
        total_tests += sizeof(blackbox_group0_tests) / sizeof(blackbox_group0_tests[0]);
 
        return cmocka_run_group_tests(blackbox_group0_tests, black_box_group0_setup, black_box_group0_teardown);
-}
\ No newline at end of file
+}
index 13c87d0dbc096a1a603d341071a5e7a726c1d089..da475749511d9995b2896de66744019f14546b1e 100644 (file)
@@ -113,7 +113,7 @@ static bool event_cb(mesh_event_payload_t payload) {
        assert(change_state(&node_status[payload.client_id], payload.mesh_event));
 
        if(payload.mesh_event == NODE_JOINED) {
-               signal_node_start(node_status, 1, 5, node_ids);
+               signal_node_start(node_status, 1, 5, (char **)node_ids);
        }
 
        if(check_nodes_finished(node_status, 6)) {
@@ -191,4 +191,4 @@ int test_cases_submesh02(void) {
        total_tests += sizeof(blackbox_group0_tests) / sizeof(blackbox_group0_tests[0]);
 
        return cmocka_run_group_tests(blackbox_group0_tests, black_box_group0_setup, black_box_group0_teardown);
-}
\ No newline at end of file
+}
index 76b6ef9e852e05467359c45f9b0073168beb9f76..1f51479f5d23e41f2eff6006035934998d08448c 100644 (file)
@@ -113,7 +113,7 @@ static bool event_cb(mesh_event_payload_t payload) {
        assert(change_state(&node_status[payload.client_id], payload.mesh_event));
 
        if(payload.mesh_event == NODE_JOINED) {
-               signal_node_start(node_status, 1, 2, node_ids);
+               signal_node_start(node_status, 1, 2, (char **)node_ids);
        }
 
        if(check_nodes_finished(node_status, 3)) {
@@ -186,4 +186,4 @@ int test_cases_submesh03(void) {
        total_tests += sizeof(blackbox_group0_tests) / sizeof(blackbox_group0_tests[0]);
 
        return cmocka_run_group_tests(blackbox_group0_tests, black_box_group0_setup, black_box_group0_teardown);
-}
\ No newline at end of file
+}
index 96c117a58480a05694a9e5489d998db20df013c3..1f37071bbad3868252f4a9abb23bf805f0b37e63 100644 (file)
@@ -97,7 +97,7 @@ static bool event_cb(mesh_event_payload_t payload) {
        assert(change_state(&node_status[payload.client_id], payload.mesh_event));
 
        if(payload.mesh_event == NODE_JOINED) {
-               signal_node_start(node_status, 1, 2, node_ids);
+               signal_node_start(node_status, 1, 2, (char **)node_ids);
        }
 
        if(check_nodes_finished(node_status, 3)) {
@@ -165,4 +165,4 @@ int test_cases_submesh04(void) {
        total_tests += sizeof(blackbox_group0_tests) / sizeof(blackbox_group0_tests[0]);
 
        return cmocka_run_group_tests(blackbox_group0_tests, black_box_group0_setup, black_box_group0_teardown);
-}
\ No newline at end of file
+}
index 3656b2994b1a4e1ef6fadbffa053daf775bb85a7..77aa8b379ef4b1478fb4b7ba98f72d2908925847 100644 (file)
@@ -154,6 +154,7 @@ int main(int argc, char *argv[]) {
        meshlink_channel_t *channel = NULL;
        meshlink_node_t *core_node = NULL;
        meshlink_node_t **node_handles = NULL;
+       meshlink_submesh_t *submesh = NULL;
 
        fprintf(stderr, "\tMesh node 'app1node2' starting up........\n");
 
@@ -241,7 +242,7 @@ int main(int argc, char *argv[]) {
 
        meshlink_node_t *node = meshlink_get_self(mesh);
        assert(node);
-       meshlink_submesh_t *submesh = meshlink_get_node_submesh(mesh, node);
+       submesh = meshlink_get_node_submesh(mesh, node);
        assert(submesh);
 
        node_handles = meshlink_get_all_nodes_by_submesh(mesh, submesh, node_handles, &num_nodes);
@@ -257,6 +258,20 @@ int main(int argc, char *argv[]) {
                }
        }
 
+       submesh = meshlink_get_submesh(mesh, "app1");
+
+       if(submesh == NULL) {
+               fprintf(stderr, "\tapp1node2 Got invalid submesh handle\n");
+               send_event(ERR_NETWORK);
+       }
+
+       submesh = meshlink_get_submesh(mesh, "app2");
+
+       if(submesh != NULL) {
+               fprintf(stderr, "\tapp1node2 Submesh handle should be NULL\n");
+               send_event(ERR_NETWORK);
+       }
+
        send_event(MESH_EVENT_COMPLETED);
 
        // All test steps executed - wait for signals to stop/start or close the mesh
@@ -268,4 +283,4 @@ int main(int argc, char *argv[]) {
        meshlink_close(mesh);
 
        return EXIT_SUCCESS;
-}
\ No newline at end of file
+}
index b87a4848abe4da11830dcd9d60f8c222cfcd61f9..b480f6a036f66fc4e3657de87c73ca6b604b358b 100644 (file)
@@ -154,6 +154,7 @@ int main(int argc, char *argv[]) {
        meshlink_channel_t *channel = NULL;
        meshlink_node_t *core_node = NULL;
        meshlink_node_t **node_handles = NULL;
+       meshlink_submesh_t *submesh = NULL;
 
        fprintf(stderr, "\tMesh node 'app2node2' starting up........\n");
 
@@ -244,7 +245,7 @@ int main(int argc, char *argv[]) {
 
        meshlink_node_t *node = meshlink_get_self(mesh);
        assert(node);
-       meshlink_submesh_t *submesh = meshlink_get_node_submesh(mesh, node);
+       submesh = meshlink_get_node_submesh(mesh, node);
        assert(submesh);
 
        node_handles = meshlink_get_all_nodes_by_submesh(mesh, submesh, node_handles, &num_nodes);
@@ -260,6 +261,20 @@ int main(int argc, char *argv[]) {
                }
        }
 
+       submesh = meshlink_get_submesh(mesh, "app2");
+
+       if(submesh == NULL) {
+               fprintf(stderr, "\tapp2node2 Got invalid submesh handle\n");
+               send_event(ERR_NETWORK);
+       }
+
+       submesh = meshlink_get_submesh(mesh, "app1");
+
+       if(submesh != NULL) {
+               fprintf(stderr, "\tapp2node2 Submesh handle should be NULL\n");
+               send_event(ERR_NETWORK);
+       }
+
        send_event(MESH_EVENT_COMPLETED);
 
        // All test steps executed - wait for signals to stop/start or close the mesh
@@ -271,4 +286,4 @@ int main(int argc, char *argv[]) {
        meshlink_close(mesh);
 
        return EXIT_SUCCESS;
-}
\ No newline at end of file
+}