bool check_discovered_participants(DomainParticipant_var& dp, InstanceHandle_t& handle) { InstanceHandle_t my_handle = dp->get_instance_handle(); DDS::InstanceHandleSeq part_handles; DDS::ReturnCode_t stat = dp->get_discovered_participants(part_handles); while (stat == RETCODE_NO_DATA || part_handles.length() == 0) { ACE_OS::sleep(1); stat = dp->get_discovered_participants(part_handles); } if (stat == RETCODE_OK) { CORBA::ULong len = part_handles.length(); if (len != 1) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %P expected to discover") ACE_TEXT("one other participant handle but ") ACE_TEXT("found %d\n"), len), false); } else if (part_handles[0] == my_handle) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %P discovered own ") ACE_TEXT("participant handle\n")), false); } else { DDS::ParticipantBuiltinTopicData data; dp->get_discovered_participant_data(data, part_handles[0]); OpenDDS::DCPS::Discovery_rch disc = TheServiceParticipant->get_discovery(dp->get_domain_id()); OpenDDS::DCPS::DomainParticipantImpl* dp_impl = dynamic_cast<OpenDDS::DCPS::DomainParticipantImpl*>(dp.in()); OpenDDS::DCPS::RepoId repo_id = disc->bit_key_to_repo_id( dp_impl, OpenDDS::DCPS::BUILT_IN_PARTICIPANT_TOPIC, data.key); if (dp_impl->get_handle(repo_id) != part_handles[0]) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %P discovered participant ") ACE_TEXT("BIT key could not be converted ") ACE_TEXT("to repo id, then handle\n")), false); } handle = part_handles[0]; { OpenDDS::DCPS::GuidConverter converter1(dp_impl->get_id ()); OpenDDS::DCPS::GuidConverter converter2(repo_id); ACE_DEBUG ((LM_DEBUG, ACE_TEXT("%P ") ACE_TEXT("%C discovered %C\n"), std::string(converter1).c_str(), std::string(converter2).c_str())); } } } return (stat == RETCODE_OK); }
bool run_test(DomainParticipant_var& dp_sub, DomainParticipant_var& dp_pub) { OpenDDS::DCPS::RepoId sub_repo_id, pub_repo_id; { OpenDDS::DCPS::DomainParticipantImpl* dp_impl = dynamic_cast<OpenDDS::DCPS::DomainParticipantImpl*>(dp_sub.in()); sub_repo_id = dp_impl->get_id (); OpenDDS::DCPS::GuidConverter converter(sub_repo_id); ACE_DEBUG ((LM_DEBUG, ACE_TEXT("%P ") ACE_TEXT("Sub Domain Participant GUID=%C\n"), std::string(converter).c_str())); } { OpenDDS::DCPS::DomainParticipantImpl* dp_impl = dynamic_cast<OpenDDS::DCPS::DomainParticipantImpl*>(dp_pub.in()); pub_repo_id = dp_impl->get_id (); OpenDDS::DCPS::GuidConverter converter(pub_repo_id); ACE_DEBUG ((LM_DEBUG, ACE_TEXT("%P ") ACE_TEXT("Pub Domain Participant GUID=%C\n"), std::string(converter).c_str())); } // If we are running with an rtps_udp transport, it can't be shared between // participants. TransportConfig_rch cfg = TheTransportRegistry->get_config("dp1"); if (!cfg.is_nil()) { TheTransportRegistry->bind_config(cfg, dp_sub); } cfg = TheTransportRegistry->get_config("dp2"); if (!cfg.is_nil()) { TheTransportRegistry->bind_config(cfg, dp_pub); } Subscriber_var bit_sub = dp_sub->get_builtin_subscriber(); if (!read_participant_bit(bit_sub, dp_sub, pub_repo_id, TestConfig::PARTICIPANT_USER_DATA())) { return false; } // Each domain participant's handle to the other InstanceHandle_t dp_sub_ih, dp_pub_ih; InstanceHandle_t pub_ih, sub_ih, ig_ih; if (!(check_discovered_participants(dp_sub, dp_pub_ih) && check_discovered_participants(dp_pub, dp_sub_ih))) { return false; } DataWriter_var dw = create_data_writer(dp_pub); if (!dw) { ACE_DEBUG((LM_ERROR, "ERROR: %P could not create Data Writer (participant 2)\n")); return false; } if (!read_publication_bit(bit_sub, dp_sub, pub_repo_id, pub_ih, TestConfig::DATA_WRITER_USER_DATA(), TestConfig::TOPIC_DATA(), 1, 1)) { return false; } DataReader_var dr = create_data_reader(dp_sub); if (!dr) { ACE_DEBUG((LM_ERROR, "ERROR: %P could not create Data Reader (participant 1)\n")); return false; } if (!read_subscription_bit(dp_pub->get_builtin_subscriber(), dp_pub, sub_repo_id, sub_ih, TestConfig::DATA_READER_USER_DATA(), TestConfig::TOPIC_DATA())) { return false; } // Wait for the reader to associate with the writer. WriterSync::wait_match(dw); // Remove the writer and its topic, then re-create them. The writer's // participant should still have discovery info about the reader so that // the association between the new writer and old reader can be established. recreate_data_writer_and_topic(dw, dr); // Wait for the reader to associate with the writer. WriterSync::wait_match(dw); // The new writer is associated with the reader, but the reader may still // also be associated with the old writer. wait_match(dr, 1); // Get the new instance handle as pub_ih if (!read_publication_bit(bit_sub, dp_sub, pub_repo_id, pub_ih, TestConfig::DATA_WRITER_USER_DATA(), TestConfig::TOPIC_DATA(), 1, 2)) { return false; } TestMsgDataWriter_var tmdw = TestMsgDataWriter::_narrow(dw); const TestMsg msg = {42}; tmdw->write(msg, HANDLE_NIL); ReadCondition_var rc = dr->create_readcondition(ANY_SAMPLE_STATE, ANY_VIEW_STATE, ALIVE_INSTANCE_STATE); WaitSet_var waiter = new WaitSet; waiter->attach_condition(rc); ConditionSeq activeConditions; const Duration_t timeout = { 90, 0 }; ReturnCode_t result = waiter->wait(activeConditions, timeout); waiter->detach_condition(rc); if (result != RETCODE_OK) { ACE_DEBUG((LM_ERROR, "ERROR: %P TestMsg reader could not wait for condition: %d\n", result)); return false; } TestMsgDataReader_var tmdr = TestMsgDataReader::_narrow(dr); TestMsgSeq data; SampleInfoSeq infos; ReturnCode_t ret = tmdr->read_w_condition(data, infos, LENGTH_UNLIMITED, rc); if (ret != RETCODE_OK) { ACE_DEBUG((LM_ERROR, "ERROR: %P could not read TestMsg: %d\n", ret)); return false; } bool ok = false; for (CORBA::ULong i = 0; i < data.length(); ++i) { if (infos[i].valid_data) { ok = true; ACE_DEBUG((LM_DEBUG, "%P Read data sample: %d\n", data[i].value)); } } if (!ok) { ACE_DEBUG((LM_ERROR, "ERROR: %P no valid data from TestMsg data reader\n")); } // Change dp qos { DomainParticipantQos dp_qos; dp_pub->get_qos(dp_qos); set_qos(dp_qos.user_data.value, TestConfig::PARTICIPANT_USER_DATA2()); dp_pub->set_qos(dp_qos); } // Change dw qos { DataWriterQos dw_qos; dw->get_qos(dw_qos); set_qos(dw_qos.user_data.value, TestConfig::DATA_WRITER_USER_DATA2()); dw->set_qos(dw_qos); } // Change dr qos { DataReaderQos dr_qos; dr->get_qos(dr_qos); set_qos(dr_qos.user_data.value, TestConfig::DATA_READER_USER_DATA2()); dr->set_qos(dr_qos); } // Wait for propagation ACE_OS::sleep(3); if (!read_participant_bit(bit_sub, dp_sub, pub_repo_id, TestConfig::PARTICIPANT_USER_DATA2())) { return false; } if (!read_publication_bit(bit_sub, dp_sub, pub_repo_id, ig_ih, TestConfig::DATA_WRITER_USER_DATA2(), TestConfig::TOPIC_DATA(), 1, 1)) { return false; } if (!read_subscription_bit(dp_pub->get_builtin_subscriber(), dp_pub, sub_repo_id, ig_ih, TestConfig::DATA_READER_USER_DATA2(), TestConfig::TOPIC_DATA())) { return false; } // Set dw topic qos Topic_var topic = dw->get_topic(); TopicQos topic_qos; topic->get_qos(topic_qos); set_qos(topic_qos.topic_data.value, TestConfig::TOPIC_DATA2()); topic->set_qos(topic_qos); // Set dr topic qos TopicDescription_var topic_desc = dr->get_topicdescription(); topic = Topic::_narrow(topic_desc); topic->get_qos(topic_qos); set_qos(topic_qos.topic_data.value, TestConfig::TOPIC_DATA2()); topic->set_qos(topic_qos); // Wait for propagation ACE_OS::sleep(3); if (!read_publication_bit(bit_sub, dp_sub, pub_repo_id, ig_ih, TestConfig::DATA_WRITER_USER_DATA2(), TestConfig::TOPIC_DATA2(), 1, 1)) { return false; } if (!read_subscription_bit(dp_pub->get_builtin_subscriber(), dp_pub, sub_repo_id, ig_ih, TestConfig::DATA_READER_USER_DATA2(), TestConfig::TOPIC_DATA2())) { return false; } // Test ignore dp_sub->ignore_publication(pub_ih); if (!read_publication_bit(bit_sub, dp_sub, pub_repo_id, pub_ih, TestConfig::DATA_WRITER_USER_DATA2(), TestConfig::TOPIC_DATA2(), 0, 0)) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %P Could not ignore publication\n")), false); } dp_pub->ignore_subscription(sub_ih); if (!read_subscription_bit(dp_pub->get_builtin_subscriber(), dp_pub, sub_repo_id, sub_ih, TestConfig::DATA_READER_USER_DATA2(), TestConfig::TOPIC_DATA2(), true)) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %P Could not ignore subscription\n")), false); } dp_sub->ignore_participant(dp_pub_ih); InstanceHandleSeq handles; dp_sub->get_discovered_participants(handles); // Check that the handle is no longer in the sequence. for (CORBA::ULong i = 0; i < handles.length (); ++i) { if (handles[i] == dp_pub_ih) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %P Could not ignore participant\n")), false); } } return ok; }