99#include "common.h"
1010#include "event_loop.h"
1111#include "io.h"
12+ #include "utstring.h"
1213
1314#include "plasma.h"
1415#include "plasma_client.h"
1718SUITE (plasma_manager_tests );
1819
1920const char * manager_addr = "127.0.0.1" ;
20- int manager_port = 12345 ;
21- const char * store_socket_name = "/tmp/store12345" ;
22- const char * manager_socket_name = "/tmp/manager12345" ;
2321object_id oid ;
2422
2523void wait_for_pollin (int fd ) {
@@ -30,6 +28,38 @@ void wait_for_pollin(int fd) {
3028 CHECK (retval > 0 );
3129}
3230
31+ UT_string * bind_ipc_sock_retry (int * fd ) {
32+ UT_string * socket_name = NULL ;
33+ for (int num_retries = 0 ; num_retries < 5 ; ++ num_retries ) {
34+ LOG_INFO ("trying to find plasma socket (attempt %d)" , num_retries );
35+ utstring_renew (socket_name );
36+ utstring_printf (socket_name , "/tmp/plasma_socket_%d" , rand ());
37+ * fd = bind_ipc_sock (utstring_body (socket_name ));
38+ if (* fd < 0 ) {
39+ /* Sleep for 100ms. */
40+ usleep (100000 );
41+ continue ;
42+ }
43+ break ;
44+ }
45+ return socket_name ;
46+ }
47+
48+ int bind_inet_sock_retry (int * fd ) {
49+ int port = -1 ;
50+ for (int num_retries = 0 ; num_retries < 5 ; ++ num_retries ) {
51+ port = 10000 + rand () % 40000 ;
52+ * fd = bind_inet_sock (port );
53+ if (* fd < 0 ) {
54+ /* Sleep for 100ms. */
55+ usleep (100000 );
56+ continue ;
57+ }
58+ break ;
59+ }
60+ return port ;
61+ }
62+
3363int test_done_handler (event_loop * loop , timer_id id , void * context ) {
3464 event_loop_stop (loop );
3565 return AE_NOMORE ;
@@ -54,20 +84,22 @@ typedef struct {
5484 client_connection * client_conn ;
5585} plasma_mock ;
5686
57- plasma_mock * init_plasma_mock (int port , plasma_mock * remote_mock ) {
87+ plasma_mock * init_plasma_mock (plasma_mock * remote_mock ) {
5888 plasma_mock * mock = malloc (sizeof (plasma_mock ));
5989 /* Start listening on all the ports and initiate the local plasma manager. */
60- mock -> port = port ;
61- mock -> manager_remote_fd = bind_inet_sock (port );
62- mock -> manager_local_fd = bind_ipc_sock (manager_socket_name );
63- mock -> local_store = bind_ipc_sock (store_socket_name );
64- mock -> state =
65- init_plasma_manager_state (store_socket_name , manager_addr , port , NULL , 0 );
90+ mock -> port = bind_inet_sock_retry (& mock -> manager_remote_fd );
91+ UT_string * store_socket_name = bind_ipc_sock_retry (& mock -> local_store );
92+ UT_string * manager_socket_name = bind_ipc_sock_retry (& mock -> manager_local_fd );
93+
94+ CHECK (mock -> manager_local_fd >= 0 && mock -> local_store >= 0 );
95+
96+ mock -> state = init_plasma_manager_state (utstring_body (store_socket_name ),
97+ manager_addr , mock -> port , NULL , 0 );
6698 mock -> loop = get_event_loop (mock -> state );
6799 /* Accept a connection from the local manager on the remote manager. */
68100 if (remote_mock != NULL ) {
69101 mock -> write_conn =
70- get_manager_connection (remote_mock -> state , manager_addr , port );
102+ get_manager_connection (remote_mock -> state , manager_addr , mock -> port );
71103 wait_for_pollin (mock -> manager_remote_fd );
72104 mock -> read_conn = new_client_connection (mock -> loop , mock -> manager_remote_fd ,
73105 mock -> state , 0 );
@@ -77,10 +109,13 @@ plasma_mock *init_plasma_mock(int port, plasma_mock *remote_mock) {
77109 }
78110 /* Connect a new client to the local plasma manager and mock a request to an
79111 * object. */
80- mock -> plasma_conn = plasma_connect (store_socket_name , manager_socket_name );
112+ mock -> plasma_conn = plasma_connect (utstring_body (store_socket_name ),
113+ utstring_body (manager_socket_name ));
81114 wait_for_pollin (mock -> manager_local_fd );
82115 mock -> client_conn =
83116 new_client_connection (mock -> loop , mock -> manager_local_fd , mock -> state , 0 );
117+ utstring_free (store_socket_name );
118+ utstring_free (manager_socket_name );
84119 return mock ;
85120}
86121
@@ -109,10 +144,13 @@ void destroy_plasma_mock(plasma_mock *mock) {
109144 * correct object ID.
110145 */
111146TEST request_transfer_test (void ) {
112- plasma_mock * local_mock = init_plasma_mock (manager_port , NULL );
113- plasma_mock * remote_mock = init_plasma_mock (12346 , local_mock );
147+ plasma_mock * local_mock = init_plasma_mock (NULL );
148+ plasma_mock * remote_mock = init_plasma_mock (local_mock );
114149 const char * * manager_vector = malloc (sizeof (char * ));
115- manager_vector [0 ] = "127.0.0.1:12346" ;
150+ UT_string * addr = NULL ;
151+ utstring_new (addr );
152+ utstring_printf (addr , "127.0.0.1:%d" , remote_mock -> port );
153+ manager_vector [0 ] = utstring_body (addr );
116154 request_transfer (oid , 1 , manager_vector , local_mock -> client_conn );
117155 event_loop_add_timer (local_mock -> loop , MANAGER_TIMEOUT , test_done_handler ,
118156 local_mock -> state );
@@ -126,6 +164,7 @@ TEST request_transfer_test(void) {
126164 ASSERT (req -> num_object_ids == 1 );
127165 ASSERT (memcmp (& oid , & req -> object_ids [0 ], sizeof (object_id )) == 0 );
128166 /* Clean up. */
167+ utstring_free (addr );
129168 free (req );
130169 destroy_plasma_mock (remote_mock );
131170 destroy_plasma_mock (local_mock );
@@ -145,12 +184,18 @@ TEST request_transfer_test(void) {
145184 * with the correct object ID.
146185 */
147186TEST request_transfer_retry_test (void ) {
148- plasma_mock * local_mock = init_plasma_mock (manager_port , NULL );
149- plasma_mock * remote_mock1 = init_plasma_mock (12346 , local_mock );
150- plasma_mock * remote_mock2 = init_plasma_mock (12347 , local_mock );
187+ plasma_mock * local_mock = init_plasma_mock (NULL );
188+ plasma_mock * remote_mock1 = init_plasma_mock (local_mock );
189+ plasma_mock * remote_mock2 = init_plasma_mock (local_mock );
151190 const char * * manager_vector = malloc (sizeof (char * ) * 2 );
152- manager_vector [0 ] = "127.0.0.1:12346" ;
153- manager_vector [1 ] = "127.0.0.1:12347" ;
191+ UT_string * addr0 = NULL ;
192+ utstring_new (addr0 );
193+ utstring_printf (addr0 , "127.0.0.1:%d" , remote_mock1 -> port );
194+ manager_vector [0 ] = utstring_body (addr0 );
195+ UT_string * addr1 = NULL ;
196+ utstring_new (addr1 );
197+ utstring_printf (addr1 , "127.0.0.1:%d" , remote_mock2 -> port );
198+ manager_vector [1 ] = utstring_body (addr1 );
154199 request_transfer (oid , 2 , manager_vector , local_mock -> client_conn );
155200 event_loop_add_timer (local_mock -> loop , MANAGER_TIMEOUT * 2 , test_done_handler ,
156201 local_mock -> state );
@@ -165,6 +210,8 @@ TEST request_transfer_retry_test(void) {
165210 ASSERT (req -> num_object_ids == 1 );
166211 ASSERT (memcmp (& oid , & req -> object_ids [0 ], sizeof (object_id )) == 0 );
167212 /* Clean up. */
213+ utstring_free (addr0 );
214+ utstring_free (addr1 );
168215 free (req );
169216 destroy_plasma_mock (remote_mock2 );
170217 destroy_plasma_mock (remote_mock1 );
@@ -184,10 +231,13 @@ TEST request_transfer_retry_test(void) {
184231 * wasn't fetched.
185232 */
186233TEST request_transfer_timeout_test (void ) {
187- plasma_mock * local_mock = init_plasma_mock (manager_port , NULL );
188- plasma_mock * remote_mock = init_plasma_mock (12346 , local_mock );
234+ plasma_mock * local_mock = init_plasma_mock (NULL );
235+ plasma_mock * remote_mock = init_plasma_mock (local_mock );
189236 const char * * manager_vector = malloc (sizeof (char * ));
190- manager_vector [0 ] = "127.0.0.1:12346" ;
237+ UT_string * addr = NULL ;
238+ utstring_new (addr );
239+ utstring_printf (addr , "127.0.0.1:%d" , remote_mock -> port );
240+ manager_vector [0 ] = utstring_body (addr );
191241 request_transfer (oid , 1 , manager_vector , local_mock -> client_conn );
192242 event_loop_add_timer (local_mock -> loop , MANAGER_TIMEOUT * (NUM_RETRIES + 2 ),
193243 test_done_handler , local_mock -> state );
@@ -201,6 +251,7 @@ TEST request_transfer_timeout_test(void) {
201251 ASSERT_EQ (memcmp (& oid , & reply .object_ids , sizeof (object_id )), 0 );
202252 ASSERT_EQ (reply .has_object , 0 );
203253 /* Clean up. */
254+ utstring_free (addr );
204255 destroy_plasma_mock (remote_mock );
205256 destroy_plasma_mock (local_mock );
206257 PASS ();
@@ -214,8 +265,8 @@ TEST request_transfer_timeout_test(void) {
214265 * - Expect to see the same data.
215266 */
216267TEST read_write_object_chunk_test (void ) {
217- plasma_mock * local_mock = init_plasma_mock (manager_port , NULL );
218- plasma_mock * remote_mock = init_plasma_mock (12346 , local_mock );
268+ plasma_mock * local_mock = init_plasma_mock (NULL );
269+ plasma_mock * remote_mock = init_plasma_mock (local_mock );
219270 /* Create a mock object buffer to transfer. */
220271 const char * data = "Hello world!" ;
221272 const int data_size = strlen (data ) + 1 ;
0 commit comments