Add domain creation torture test.
Signed-off-by: Martin Bremmer <martin.bremmer@adlinktech.com> Disabled domain_torture_imlicit test. Signed-off-by: Martin Bremmer <martin.bremmer@adlinktech.com>
This commit is contained in:
		
							parent
							
								
									fc8b8fef3a
								
							
						
					
					
						commit
						b6b0c25355
					
				
					 5 changed files with 122 additions and 10 deletions
				
			
		| 
						 | 
					@ -252,7 +252,7 @@ dds_entity_t dds_create_domain (const dds_domainid_t domain, const char *config)
 | 
				
			||||||
  dds_domain *dom;
 | 
					  dds_domain *dom;
 | 
				
			||||||
  dds_entity_t ret;
 | 
					  dds_entity_t ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (domain > 230)
 | 
					  if (domain == DDS_DOMAIN_DEFAULT)
 | 
				
			||||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
					    return DDS_RETCODE_BAD_PARAMETER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (config == NULL)
 | 
					  if (config == NULL)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -126,9 +126,9 @@ dds_entity_t dds_create_participant (const dds_domainid_t domain, const dds_qos_
 | 
				
			||||||
  pp->m_builtin_subscriber = 0;
 | 
					  pp->m_builtin_subscriber = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Add participant to extent */
 | 
					  /* Add participant to extent */
 | 
				
			||||||
  ddsrt_mutex_lock (&dds_global.m_entity.m_mutex);
 | 
					  ddsrt_mutex_lock (&dom->m_entity.m_mutex);
 | 
				
			||||||
  dds_entity_register_child (&dom->m_entity, &pp->m_entity);
 | 
					  dds_entity_register_child (&dom->m_entity, &pp->m_entity);
 | 
				
			||||||
  ddsrt_mutex_unlock (&dds_global.m_entity.m_mutex);
 | 
					  ddsrt_mutex_unlock (&dom->m_entity.m_mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  dds_entity_init_complete (&pp->m_entity);
 | 
					  dds_entity_init_complete (&pp->m_entity);
 | 
				
			||||||
  /* drop temporary extra ref to domain, dds_init */
 | 
					  /* drop temporary extra ref to domain, dds_init */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,6 +21,7 @@ set(ddsc_test_sources
 | 
				
			||||||
    "config.c"
 | 
					    "config.c"
 | 
				
			||||||
    "dispose.c"
 | 
					    "dispose.c"
 | 
				
			||||||
    "domain.c"
 | 
					    "domain.c"
 | 
				
			||||||
 | 
					    "domain_torture.c"
 | 
				
			||||||
    "entity_api.c"
 | 
					    "entity_api.c"
 | 
				
			||||||
    "entity_hierarchy.c"
 | 
					    "entity_hierarchy.c"
 | 
				
			||||||
    "entity_status.c"
 | 
					    "entity_status.c"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -287,10 +287,3 @@ CU_Test(ddsc_domain_create, invalid_xml)
 | 
				
			||||||
  domain = dds_create_domain(1, "<CycloneDDS incorrect XML");
 | 
					  domain = dds_create_domain(1, "<CycloneDDS incorrect XML");
 | 
				
			||||||
  CU_ASSERT_FATAL(domain == DDS_RETCODE_ERROR);
 | 
					  CU_ASSERT_FATAL(domain == DDS_RETCODE_ERROR);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
CU_Test(ddsc_domain_create, invalid_id)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  dds_entity_t domain;
 | 
					 | 
				
			||||||
  domain = dds_create_domain(321, "<"DDS_PROJECT_NAME"><Domain><Id>any</Id></Domain></"DDS_PROJECT_NAME">");
 | 
					 | 
				
			||||||
  CU_ASSERT_FATAL(domain == DDS_RETCODE_BAD_PARAMETER);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										118
									
								
								src/core/ddsc/tests/domain_torture.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								src/core/ddsc/tests/domain_torture.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,118 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright(c) 2019 ADLINK Technology Limited and others
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program and the accompanying materials are made available under the
 | 
				
			||||||
 | 
					 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
				
			||||||
 | 
					 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
				
			||||||
 | 
					 * v. 1.0 which is available at
 | 
				
			||||||
 | 
					 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#include <assert.h>
 | 
				
			||||||
 | 
					#include <limits.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "dds/dds.h"
 | 
				
			||||||
 | 
					#include "CUnit/Theory.h"
 | 
				
			||||||
 | 
					#include "RoundTrip.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "dds/ddsrt/threads.h"
 | 
				
			||||||
 | 
					#include "dds/ddsrt/atomics.h"
 | 
				
			||||||
 | 
					#include "dds/ddsrt/time.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define N_THREADS (10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const dds_duration_t TEST_DURATION = DDS_SECS(3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static ddsrt_atomic_uint32_t terminate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32_t create_participants_thread (void *varg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  (void) varg;
 | 
				
			||||||
 | 
					  while (!ddsrt_atomic_ld32 (&terminate))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    dds_entity_t par = dds_create_participant (DDS_DOMAIN_DEFAULT, NULL, NULL);
 | 
				
			||||||
 | 
					    if (par < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      fprintf (stderr, "dds_create_participant failed: %s\n", dds_strretcode (par));
 | 
				
			||||||
 | 
					      ddsrt_atomic_st32 (&terminate, 1);
 | 
				
			||||||
 | 
					      return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dds_return_t ret = dds_delete(par);
 | 
				
			||||||
 | 
					    if (ret != DDS_RETCODE_OK)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      fprintf (stderr, "dds_delete failed: %s\n", dds_strretcode (ret));
 | 
				
			||||||
 | 
					      ddsrt_atomic_st32 (&terminate, 1);
 | 
				
			||||||
 | 
					      return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void participant_creation_torture()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  dds_return_t rc;
 | 
				
			||||||
 | 
					  ddsrt_thread_t tids[N_THREADS];
 | 
				
			||||||
 | 
					  ddsrt_threadattr_t tattr;
 | 
				
			||||||
 | 
					  ddsrt_threadattr_init (&tattr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Start threads. */
 | 
				
			||||||
 | 
					  for (size_t i = 0; i < sizeof(tids) / sizeof(*tids); i++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    rc = ddsrt_thread_create (&tids[i], "domain_torture_explicit", &tattr, create_participants_thread, 0);
 | 
				
			||||||
 | 
					    CU_ASSERT_FATAL (rc == DDS_RETCODE_OK);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Let the threads do the torturing for a while. */
 | 
				
			||||||
 | 
					  dds_sleepfor(TEST_DURATION);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Stop and check threads results. */
 | 
				
			||||||
 | 
					  ddsrt_atomic_st32 (&terminate, 1);
 | 
				
			||||||
 | 
					  for (size_t i = 0; i < sizeof (tids) / sizeof (tids[0]); i++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    uint32_t retval;
 | 
				
			||||||
 | 
					    rc = ddsrt_thread_join (tids[i], &retval);
 | 
				
			||||||
 | 
					    CU_ASSERT_FATAL (rc == DDS_RETCODE_OK);
 | 
				
			||||||
 | 
					    CU_ASSERT (retval == 0);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * There are some issues when completely init/deinit the
 | 
				
			||||||
 | 
					 * library in a torturing way. We really just want to
 | 
				
			||||||
 | 
					 * check the domain creation/deletion. So, disable this
 | 
				
			||||||
 | 
					 * test for now.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					CU_Test (ddsc_domain, torture_implicit, .disabled=true)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  /* No explicit domain creation, just start creating and
 | 
				
			||||||
 | 
					   * deleting participants (that'll create and delete the
 | 
				
			||||||
 | 
					   * domain implicitly) in a torturing manner. */
 | 
				
			||||||
 | 
					  participant_creation_torture();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CU_Test (ddsc_domain, torture_explicit)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  dds_return_t rc;
 | 
				
			||||||
 | 
					  dds_entity_t domain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Create domain explicitly. */
 | 
				
			||||||
 | 
					  domain = dds_create_domain(1, "");
 | 
				
			||||||
 | 
					  CU_ASSERT_FATAL (domain > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Start creating and deleting participants on the
 | 
				
			||||||
 | 
					   * explicit domain in a torturing manner. */
 | 
				
			||||||
 | 
					  participant_creation_torture();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Delete domain. */
 | 
				
			||||||
 | 
					  rc = dds_delete(domain);
 | 
				
			||||||
 | 
					  CU_ASSERT_FATAL (rc == DDS_RETCODE_OK);
 | 
				
			||||||
 | 
					  rc = dds_delete(domain);
 | 
				
			||||||
 | 
					  CU_ASSERT_FATAL (rc != DDS_RETCODE_OK);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue