public override void on_data_on_readers( DDS.Subscriber subscriber) { //static int count = 0; Console.WriteLine("SubscriberListener: on_data_on_readers()"); // notify_datareaders() only calls on_data_available for // DataReaders with unread samples try { subscriber.notify_datareaders(); if (++count > 3) { DDS.StatusMask newmask = DDS.StatusMask.STATUS_MASK_ALL; // 'Unmask' DATA_ON_READERS status for listener int tempMask = (int)newmask; DDS.StatusKind tempStatusKind = DDS.StatusKind.DATA_ON_READERS_STATUS;; int dataOnReaders_mask = (int)tempStatusKind; tempMask = ~(dataOnReaders_mask & tempMask); newmask = (DDS.StatusMask)tempMask; subscriber.set_listener(this, newmask); Console.WriteLine("Unregistering SubscriberListener::on_data_on_readers()"); } } catch (DDS.Exception e) { Console.WriteLine("notify_datareaders() error: {0}", e); } }
public override Test.Framework.TestResult Run() { mod.tstDataWriter writer; mod.tstDataReader reader; DDS.IStatusCondition condition; DDS.IPublisher publisher; DDS.WaitSet waitset; mod.tst[] tstHolder; DDS.ICondition[] conditionHolder; DDS.SampleInfo[] sampleInfoHolder; Test.Framework.TestResult result; DDS.ReturnCode rc; string expResult = "StatusCondition test succeeded."; result = new Test.Framework.TestResult(expResult, string.Empty, Test.Framework.TestVerdict .Pass, Test.Framework.TestVerdict.Fail); writer = (mod.tstDataWriter) this.ResolveObject("datawriter"); reader = (mod.tstDataReader) this.ResolveObject("datareader"); publisher = (DDS.IPublisher) this.ResolveObject("publisher"); condition = reader.StatusCondition; if (condition == null) { result.Result = "Could not resolve reader condition."; return(result); } waitset = new DDS.WaitSet(); rc = waitset.AttachCondition(condition); if (rc != DDS.ReturnCode.Ok) { result.Result = "Could not attach condition."; return(result); } conditionHolder = new DDS.ICondition[0]; /* The LivelinessChanged and SubscriptionMatched are not necessarily synced. * So, it can happen that one triggers the waitset while the other hasn't been * updated yet. */ DDS.StatusKind statuses = 0; do { bool livelinessChanged = false; bool subscriptionMatched = false; rc = waitset.Wait(ref conditionHolder, new DDS.Duration(10, 0)); if (rc != DDS.ReturnCode.Ok) { result.Result = "WaitSet.Wait failed. (1): " + rc; return(result); } if (conditionHolder.Length != 1) { result.Result = "WaitSet.Wait returned no or multiple conditions where it should return one."; return(result); } if (conditionHolder[0] != condition) { result.Result = "WaitSet.Wait returned wrong condition."; return(result); } livelinessChanged = ((reader.StatusChanges & DDS.StatusKind.LivelinessChanged) == DDS.StatusKind.LivelinessChanged); subscriptionMatched = ((reader.StatusChanges & DDS.StatusKind.SubscriptionMatched) == DDS.StatusKind.SubscriptionMatched); statuses |= reader.StatusChanges; if (livelinessChanged) { if (!test.sacs.StatusValidator.LivelinessChangedValid(reader, 1, 1, 0, 0)) { result.Result = "liveliness_changed not valid."; return(result); } if (!test.sacs.StatusValidator.LivelinessChangedValid(reader, 1, 0, 0, 0)) { result.Result = "liveliness_changed not valid (2)."; return(result); } } /* This is only a useful test when both events were triggered at the same time, * because then getting liveliness status might have reset the subscription matched. */ if ((livelinessChanged && subscriptionMatched) && (reader.StatusChanges != DDS.StatusKind.SubscriptionMatched)) { result.Result = "Expected status change (SubscriptionMatched) should not have de-activated yet."; return(result); } if (subscriptionMatched) { if (!test.sacs.StatusValidator.SubscriptionMatchValid(reader, 1, 1, 1, 1)) { result.Result = "subscription_matched not valid."; return(result); } if (!test.sacs.StatusValidator.SubscriptionMatchValid(reader, 1, 0, 1, 0)) { result.Result = "subscription_matched not valid (2)."; return(result); } } } while (statuses != (DDS.StatusKind.LivelinessChanged | DDS.StatusKind.SubscriptionMatched)); if (reader.StatusChanges != 0) { result.Result = "Expected all statuses are reset: this does not seem to be the case."; return(result); } rc = waitset.Wait(ref conditionHolder, new DDS.Duration(3, 0)); if (rc != DDS.ReturnCode.Timeout) { result.Result = "WaitSet.Wait failed. (2)"; return(result); } if (conditionHolder.Length != 0) { result.Result = "WaitSet.Wait returned conditions where it shouldn't."; return(result); } mod.tst data = new mod.tst(); data.long_1 = 1; data.long_2 = 2; data.long_3 = 3; rc = writer.Write(data, 0); if (rc != DDS.ReturnCode.Ok) { result.Result = "tstDataWriter.write failed."; return(result); } rc = waitset.Wait(ref conditionHolder, new DDS.Duration(3, 0)); if (rc != DDS.ReturnCode.Ok) { result.Result = "WaitSet.Wait failed. (3)"; return(result); } if (conditionHolder.Length != 1) { result.Result = "WaitSet.Wait returned no or multiple conditions where it should return one (2)."; return(result); } if (conditionHolder[0] != condition) { result.Result = "WaitSet.Wait returned wrong condition (2)."; return(result); } if (reader.StatusChanges != DDS.StatusKind.DataAvailable) { result.Result = "Expected status change DataAvailable, which is not currently set."; return(result); } tstHolder = new mod.tst[0]; sampleInfoHolder = new DDS.SampleInfo[0]; rc = reader.Take(ref tstHolder, ref sampleInfoHolder, 1, DDS.SampleStateKind.Any, DDS.ViewStateKind.Any, DDS.InstanceStateKind.Any); reader.ReturnLoan(ref tstHolder, ref sampleInfoHolder); if (rc != DDS.ReturnCode.Ok) { result.Result = "tstDataReader.take failed."; return(result); } if (reader.StatusChanges != 0) { result.Result = "Expected all statuses are reset: this does not seem to be the case (2)."; return(result); } rc = waitset.Wait(ref conditionHolder, new DDS.Duration(3, 0)); if (rc != DDS.ReturnCode.Timeout) { result.Result = "WaitSet.Wait failed(4)."; return(result); } if (conditionHolder.Length > 0) { result.Result = "WaitSet.Wait returned conditions where it shouldn't.(2)"; return(result); } rc = publisher.DeleteDataWriter(writer); if (rc != DDS.ReturnCode.Ok) { result.Result = "delete_datawriter failed."; return(result); } try { System.Threading.Thread.Sleep(2000); } catch (System.Exception) { System.Console.Error.WriteLine("Sleep failed..."); } rc = waitset.Wait(ref conditionHolder, new DDS.Duration(3, 0)); if (rc != DDS.ReturnCode.Ok) { result.Result = "WaitSet.Wait failed. (5)"; return(result); } if (conditionHolder.Length != 1) { result.Result = "WaitSet.Wait returned no or multiple conditions where it should return one (3)."; return(result); } if (conditionHolder[0] != condition) { result.Result = "WaitSet.Wait returned wrong condition (3)."; return(result); } if (reader.StatusChanges != (DDS.StatusKind.LivelinessChanged | DDS.StatusKind.SubscriptionMatched | DDS.StatusKind.DataAvailable)) { result.Result = "Expected status changes (LivelinessChanged AND SubscriptionMatched AND DataAvailable) did not occur."; return(result); } if (!test.sacs.StatusValidator.LivelinessChangedValid(reader, 0, 1, 0, 0)) { result.Result = "liveliness_changed not valid (3)."; return(result); } if (!test.sacs.StatusValidator.LivelinessChangedValid(reader, 0, 0, 0, 0)) { result.Result = "liveliness_changed not valid (4)."; return(result); } if (reader.StatusChanges != (DDS.StatusKind.SubscriptionMatched | DDS.StatusKind.DataAvailable)) { result.Result = "Expected status changes (SubscriptionMatched | DataAvailable) should not have de-activated yet."; return(result); } if (!test.sacs.StatusValidator.SubscriptionMatchValid(reader, 1, 0, 0, 1)) { result.Result = "subscription_matched not valid (3)."; return(result); } if (!test.sacs.StatusValidator.SubscriptionMatchValid(reader, 1, 0, 0, 0)) { result.Result = "subscription_matched not valid (4)."; return(result); } if (reader.StatusChanges != DDS.StatusKind.DataAvailable) { result.Result = "Expected status change (DataAvailable) should not have de-activated yet."; return(result); } rc = reader.Take(ref tstHolder, ref sampleInfoHolder, 1, DDS.SampleStateKind.Any, DDS.ViewStateKind.Any, DDS.InstanceStateKind.Any); reader.ReturnLoan(ref tstHolder, ref sampleInfoHolder); if (rc != DDS.ReturnCode.Ok) { result.Result = "tstDataReader.take failed."; return(result); } if (reader.StatusChanges != 0) { result.Result = "Expected all statuses are reset: this does not seem to be the case (3)."; return(result); } rc = waitset.Wait(ref conditionHolder, new DDS.Duration(3, 0)); if (rc != DDS.ReturnCode.Timeout) { result.Result = "WaitSet.Wait failed(6)."; return(result); } if (conditionHolder.Length > 0) { result.Result = "WaitSet.Wait returned conditions where it shouldn't.(3)"; return(result); } result.Result = expResult; result.Verdict = Test.Framework.TestVerdict.Pass; return(result); }