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);
            }
        }
示例#2
0
        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);
        }