Beispiel #1
0
        public void FindPtzPositionsSearchWithMaxMatchesTest()
        {
            string      searchToken = string.Empty;
            SearchState state       = SearchState.Completed;

            RunTest(
                () =>
            {
                string keepAlive = string.Format("PT{0}S", _searchKeepAlive);

                RecordingInformation recording = FindRecordingForTest();

                SearchRange range = DefineSearchRange(recording);

                System.DateTime start = range.Start;
                System.DateTime end   = range.End;

                List <FindPTZPositionResult> results;

                PTZPositionFilter filter   = new PTZPositionFilter();
                filter.MinPosition         = new PTZVector();
                filter.MinPosition.PanTilt = new Vector2D()
                {
                    x = -1, y = -1
                };
                filter.MaxPosition         = new PTZVector();
                filter.MaxPosition.PanTilt = new Vector2D()
                {
                    x = 1, y = 1
                };

                SearchScope scope        = new SearchScope();
                scope.IncludedRecordings = new string[] { recording.RecordingToken };
                searchToken = FindPTZPosition(start, end, scope, filter, 1, keepAlive);
                results     = GetAllPtzSearchResults(searchToken, filter, null, null, "PT5S", out state);

                Assert(results != null && results.Count > 0, "No PTZ positions found",
                       "Check that PTZ positions list is not empty");

                Assert(results.Count == 1, string.Format("{0} PTZ positions found", results.Count),
                       "Check that maxMatches parameter is not exceeded");
            },
                () =>
            {
                if (state != SearchState.Completed)
                {
                    ReleaseSearch(searchToken, _searchTimeout);
                }
            });
        }
Beispiel #2
0
        FindPTZPositionResponse FindPTZPosition(System.DateTime startPoint,
                                                System.DateTime?endPoint,
                                                SearchScope scope,
                                                PTZPositionFilter searchFilter,
                                                int?maxMatches,
                                                string keepAliveTime)
        {
            FindPTZPositionResponse response = null;

            Proxies.Onvif.SearchPortClient client = SearchClient;
            RunStep(() => { response = client.FindPTZPosition(startPoint, endPoint, scope, searchFilter, maxMatches, keepAliveTime); },
                    "Send FindPTZPosition request");
            DoRequestDelay();
            return(response);
        }
Beispiel #3
0
        protected List <FindPTZPositionResult> GetAllPtzSearchResults(string searchToken,
                                                                      PTZPositionFilter filter,
                                                                      int?minResults,
                                                                      int?maxResults,
                                                                      string waitTime,
                                                                      out SearchState state)
        {
            List <FindPTZPositionResult> ptsPositionsList = new List <FindPTZPositionResult>();

            FindPTZPositionResultList response = null;

            DateTime started      = DateTime.Now;
            DateTime dueTo        = started.AddSeconds(_searchTimeout);
            bool     completed    = true;
            DateTime lastResponse = DateTime.Now;

            LogTestEvent(string.Format("All results should be received by {0}{1}", dueTo.StdTimeToString(), Environment.NewLine));

            do
            {
                response     = GetPTZPositionSearchResults(searchToken, minResults, maxResults, waitTime, "Get PTZ Search results");
                lastResponse = DateTime.Now;

                // no request delay here!
                if (response.Result != null)
                {
                    ptsPositionsList.AddRange(response.Result);
                }
                if (lastResponse > dueTo)
                {
                    completed = false;
                    break;
                }
            } while (response.SearchState != SearchState.Completed);

            ValidatePTZPositionSearchResults(filter, ptsPositionsList);

            state = response.SearchState;

            Assert(completed,
                   string.Format("Completed state has not been achieved (last response received at {0}, State: {1})", lastResponse.StdTimeToString(), response.SearchState),
                   "Check that search has been completed in due time");

            return(ptsPositionsList);
        }
Beispiel #4
0
        protected void ValidatePTZPositionSearchResults(PTZPositionFilter filter, IEnumerable <FindPTZPositionResult> results)
        {
            Func <FindPTZPositionResult, bool> outOfRequestedRangePredicate =
                (e) =>
            {
                if (null == e.Position || null == e.Position.PanTilt)
                {
                    return(false);
                }

                return(filter.MinPosition.PanTilt.x > e.Position.PanTilt.x || e.Position.PanTilt.x > filter.MaxPosition.PanTilt.x ||
                       filter.MinPosition.PanTilt.y > e.Position.PanTilt.y || e.Position.PanTilt.y > filter.MaxPosition.PanTilt.y);
            };

            if (null != results && results.Any(outOfRequestedRangePredicate))
            {
                LogStepEvent("WARNING: The GetPTZPositionSearchResultsResponse contains responses with Position.PanTilt out of requested range");
                LogStepEvent("");
            }
        }
Beispiel #5
0
        protected string FindPTZPosition(DateTime start, DateTime?end, SearchScope scope, PTZPositionFilter filter, int?maxMathes, string keepAliveTime, string stepName)
        {
            string token = string.Empty;

            RunStep(() => { token = Client.FindPTZPosition(start, end, scope, filter, maxMathes, keepAliveTime).SearchToken; }, stepName);
            DoRequestDelay();
            return(token);
        }
Beispiel #6
0
 protected string FindPTZPosition(DateTime start, DateTime?end, SearchScope scope,
                                  PTZPositionFilter filter, int?maxMatxhes, string keepAliveTime)
 {
     return(FindPTZPosition(start, end, scope, filter, maxMatxhes, keepAliveTime, "Find PTZPostion"));
 }
        public override string FindPTZPosition(System.DateTime StartPoint, System.DateTime EndPoint, bool EndPointSpecified, SearchScope Scope, PTZPositionFilter SearchFilter, int MaxMatches, bool MaxMatchesSpecified, string KeepAliveTime)
        {
            string token = SearchSessionManager.Instance.GetNextToken();

            int    keepAliveTime = 0;
            string strKeepAlive  = KeepAliveTime.Substring(2, KeepAliveTime.Length - 3);

            keepAliveTime = int.Parse(strKeepAlive);
            if (KeepAliveTime.EndsWith("M"))
            {
                keepAliveTime = keepAliveTime * 60;
            }

            SearchSession session = new SearchSession()
            {
                KeepAlive   = keepAliveTime,
                Token       = token,
                Started     = System.DateTime.Now,
                LastRequest = System.DateTime.Now
            };

            bool ascending = true;

            if (EndPointSpecified)
            {
                if (EndPoint < StartPoint)
                {
                    ascending = false;
                }
            }

            List <FindPTZPositionResult> filtered = SearchStorage.Instance.PtzPositions;

            if (ascending)
            {
                filtered =
                    filtered.Where(E => (E.Time >= StartPoint &&
                                         (E.Time <= EndPoint || !EndPointSpecified))).OrderBy(E => E.Time).ToList();
            }
            else
            {
                filtered =
                    filtered.Where(E => (E.Time <= StartPoint &&
                                         (E.Time >= EndPoint || !EndPointSpecified))).OrderByDescending(E => E.Time).ToList();
            }

            List <FindPTZPositionResult> list;

            if (MaxMatchesSpecified)
            {
                list = new List <FindPTZPositionResult>();
                for (int i = 0; i < Math.Min(MaxMatches, filtered.Count); i++)
                {
                    list.Add(filtered[i]);
                }
            }
            else
            {
                list = new List <FindPTZPositionResult>(filtered);
            }


            session.Data = list;

            SearchSessionManager.Instance.Sessions.Add(session);
            return(token);
        }
Beispiel #8
0
        public override string FindPTZPosition(DateTime StartPoint, DateTime EndPoint, [System.Xml.Serialization.XmlIgnoreAttribute()] bool EndPointSpecified, SearchScope Scope, PTZPositionFilter SearchFilter, int MaxMatches, [System.Xml.Serialization.XmlIgnoreAttribute()] bool MaxMatchesSpecified, string KeepAliveTime)
        {
            ParametersValidation validation = new ParametersValidation();

            validation.Add(ParameterType.String, "StartPoint", XmlConvert.ToString(StartPoint, XmlDateTimeSerializationMode.Utc));
            string endPoint = null;

            if (EndPointSpecified)
            {
                endPoint = XmlConvert.ToString(EndPoint, XmlDateTimeSerializationMode.Utc);
            }
            validation.Add(ParameterType.OptionalString, "EndPoint", endPoint);
            if (Scope.IncludedRecordings != null)
            {
                if (Scope.IncludedRecordings.Length > 0)
                {
                    validation.Add(ParameterType.String, "IncludedRecordings", "IncludedRecordings", Scope.IncludedRecordings[0]);
                }
            }
            validation.Add(ParameterType.String, "KeepAliveTime", KeepAliveTime);
            int?maxMatches = null;

            if (MaxMatchesSpecified)
            {
                maxMatches = MaxMatches;
            }
            validation.Add(ParameterType.OptionalInt, "MaxMatches", maxMatches);

            string result = (string)ExecuteGetCommand(validation, SearchServiceTest.FindPtzPositionsTest);

            return(result);
        }
        void CommonForwardBackwardPtzPositionSearchTest(Func <RecordingInformation, SearchRange> defineRange)
        {
            string      searchToken   = string.Empty;
            SearchState state         = SearchState.Completed;
            int         testKeepAlive = _searchKeepAlive;

            RunTest(
                () =>
            {
                string keepAlive = string.Format("PT{0}S", testKeepAlive);

                RecordingInformation recording = FindRecordingForTest();

                SearchRange range = defineRange(recording);

                System.DateTime start = range.Start;
                System.DateTime end   = range.End;

                PTZPositionFilter filter   = new PTZPositionFilter();
                filter.MinPosition         = new PTZVector();
                filter.MinPosition.PanTilt = new Vector2D()
                {
                    x = -1, y = -1
                };
                filter.MaxPosition         = new PTZVector();
                filter.MaxPosition.PanTilt = new Vector2D()
                {
                    x = 1, y = 1
                };

                SearchScope scope        = new SearchScope();
                scope.IncludedRecordings = new string[] { recording.RecordingToken };

                List <FindPTZPositionResult> results = new List <FindPTZPositionResult>();

                Action <System.DateTime, System.DateTime> validateAction =
                    new Action <System.DateTime, System.DateTime>(
                        (startTime, endTime) =>
                {
                    state       = SearchState.Completed;
                    searchToken = FindPTZPosition(startTime, endTime, scope, filter, null, keepAlive);

                    state   = SearchState.Queued;
                    results = GetAllPtzSearchResults(searchToken, filter, null, null, "PT5S", out state);

                    Assert(results != null && results.Count > 0, "No PTZ positions found",
                           "Check that PTZ positions list is not empty");

                    /// check that results belong to specified recording?
                    ValidatePTZPositionResults(results, recording, range.Earliest, range.Latest);

                    ValidateOrder(results, startTime, endTime);
                });

                validateAction(start, end);
                List <FindPTZPositionResult> results1 = new List <FindPTZPositionResult>();
                results1.AddRange(results);

                validateAction(end, start);
                List <FindPTZPositionResult> results2 = new List <FindPTZPositionResult>();
                results2.AddRange(results);

                // compare lists

                CompareLists(results1, results2, "list received for StartPoint < EndPoint", "list received for StartPoint > EndPoint");
            },
                () =>
            {
                if (state != SearchState.Completed)
                {
                    ReleaseSearch(searchToken, testKeepAlive * 1000);
                }
            });
        }
Beispiel #10
0
        public void GetMediaAttributesPTZMediaAttributesTest()
        {
            RunTest(() =>
            {
                var recordingInformation = FindRecordingForTest();
                var recordingToken       = recordingInformation.RecordingToken;

                var T1 = recordingInformation.EarliestRecordingSpecified ? recordingInformation.EarliestRecording : recordingInformation.Track.Select(e => e.DataFrom).Min();
                var T2 = recordingInformation.LatestRecordingSpecified ? recordingInformation.LatestRecording : recordingInformation.Track.Select(e => e.DataTo).Max();

                var filter = new PTZPositionFilter()
                {
                    MinPosition = new PTZVector()
                    {
                        PanTilt = new Vector2D()
                        {
                            x = -1, y = -1
                        }
                    },
                    MaxPosition = new PTZVector()
                    {
                        PanTilt = new Vector2D()
                        {
                            x = 1, y = 1
                        }
                    },
                    EnterOrExit = false
                };
                var searchScope = new SearchScope()
                {
                    IncludedRecordings = new [] { recordingToken }
                };

                var searchToken = FindPTZPosition(T1, T2, searchScope, filter, null, "PT10S");


                FindPTZPositionResultList latestResponse;
                do
                {
                    latestResponse = GetPTZPositionSearchResults(searchToken, null, null, "PT5S");
                } while (!(SearchState.Completed == latestResponse.SearchState || (null != latestResponse.Result && latestResponse.Result.Any())));

                var results = latestResponse.Result;

                ValidatePTZPositionSearchResults(filter, results);

                if (SearchState.Completed == latestResponse.SearchState)
                {
                    Assert(null != results && results.Any(), "The search state 'Completed' has been reached but no result is recieved", "Checking recieved result");
                }
                else
                {
                    EndSearch(searchToken);
                }

                var selected = results.First();

                var mediaAttributes = GetMediaAttributes(recordingToken, selected.Time);

                Assert(mediaAttributes.All(e => e.RecordingToken == recordingToken),
                       string.Format("There is an Media Attribute with 'RecordingToken' other than {0}", recordingToken),
                       "Checking field 'RecordingToken' of recieved Media Attributes");

                Assert(mediaAttributes.All(e => null == e.TrackAttributes || e.TrackAttributes.All(et => null == et.MetadataAttributes || et.MetadataAttributes.CanContainPTZ)),
                       "There is an Media Attribute with 'TrackAttributes.MetadataAttributes.CanContainPTZ' is equal to false",
                       "Checking field 'TrackAttributes.MetadataAttributes.CanContainPTZ' of recieved Media Attributes");

                if (DeclaredScopes.Contains(typeof(StorageProfile).GetProfileScope()))
                {
                    if (null != selected.Position.PanTilt)
                    {
                        const string panTiltPositionGenericNamespace = "http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace";
                        var flag = mediaAttributes.All(e => null == e.TrackAttributes ||
                                                       e.TrackAttributes.Where(a => null != a.TrackInformation && selected.TrackToken == a.TrackInformation.TrackToken)
                                                       .All(a => null != a.MetadataAttributes && null != a.MetadataAttributes.PtzSpaces &&
                                                            a.MetadataAttributes.PtzSpaces.Contains(panTiltPositionGenericNamespace)));

                        Assert(flag,
                               "There is a TrackAttribute for selected TrackToken without specified PanTilt Position Generic namespace while in selected Search Result the field 'Position.PanTilt' is present",
                               "Checking PanTilt Position Generic namespace presence");
                    }

                    if (null != selected.Position.Zoom)
                    {
                        const string zoomPositionGenericNamespace = "http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace";
                        var flag = mediaAttributes.All(e => null == e.TrackAttributes ||
                                                       e.TrackAttributes.Where(a => null != a.TrackInformation && selected.TrackToken == a.TrackInformation.TrackToken)
                                                       .All(a => null != a.MetadataAttributes && null != a.MetadataAttributes.PtzSpaces &&
                                                            a.MetadataAttributes.PtzSpaces.Contains(zoomPositionGenericNamespace)));

                        Assert(flag,
                               "There is a TrackAttribute for selected TrackToken without specified Zoom Position Generic namespace while in selected Search Result the field 'Position.Zoom' is present",
                               "Checking Zoom Position Generic namespace presence");
                    }
                }
                else
                {
                    LogStepEvent("WARNING: Profile G is not declared as supported. Checking of MediaAttributes.TrackAttributes.MetadataAttributes.PtzSpaces won't be performed.");
                    LogStepEvent("");
                }
            });
        }
Beispiel #11
0
        public void PTZSearchForCertainPositionTest()
        {
            string      searchToken   = string.Empty;
            SearchState state         = SearchState.Completed;
            int         testKeepAlive = _searchKeepAlive;

            RunTest(
                () =>
            {
                string keepAlive = string.Format("PT{0}S", testKeepAlive);

                RecordingInformation recording = FindRecordingForTest();

                SearchRange range = DefineSearchRange(recording);

                System.DateTime start = range.Start;
                System.DateTime end   = range.End;

                PTZPositionFilter filter   = new PTZPositionFilter();
                filter.MinPosition         = new PTZVector();
                filter.MinPosition.PanTilt = new Vector2D()
                {
                    x = -1, y = -1
                };
                filter.MaxPosition         = new PTZVector();
                filter.MaxPosition.PanTilt = new Vector2D()
                {
                    x = 1, y = 1
                };

                SearchScope scope        = new SearchScope();
                scope.IncludedRecordings = new string[] { recording.RecordingToken };

                List <FindPTZPositionResult> results = new List <FindPTZPositionResult>();

                state       = SearchState.Completed;
                searchToken = FindPTZPosition(end, start, scope, filter, null, keepAlive);

                results = GetAllPtzSearchResults(searchToken, filter, 1, null, "PT5S", out state);

                Assert(results != null && results.Count > 0, "No PTZ positions found",
                       "Check that PTZ positions list is not empty");

                /// check that results belong to specified recording?
                ValidatePTZPositionResults(results, recording, start, end);

                FindPTZPositionResult result = results.FirstOrDefault(R => R.Position != null);

                Assert(result != null, "No search results with PTZ position returned", "Select PTZ position for test");

                filter.MinPosition = result.Position;
                filter.MaxPosition = result.Position;
                filter.EnterOrExit = false;

                state       = SearchState.Completed;
                searchToken = FindPTZPosition(end, start, scope, filter, null, keepAlive, "Find specified PTZ position");

                results = GetAllPtzSearchResults(searchToken, filter, 1, null, "PT5S", out state);

                Assert(results != null && results.Count > 0, "No PTZ positions found",
                       "Check that PTZ positions list is not empty");

                /// check that results belong to specified recording?
                ValidatePTZPositionResults(results, recording, start, end);

                bool ok          = true;
                StringBuilder sb = new StringBuilder();
                foreach (FindPTZPositionResult r in results)
                {
                    // compare positions - ?
                    if (r.Position == null)
                    {
                        ok = false;
                        sb.AppendLine(
                            string.Format("Result for {0} contains no PTZ position",
                                          r.Time.StdDateTimeToString()));
                    }
                    else
                    {
                        if (r.Position.PanTilt == null)
                        {
                            ok = false;
                            sb.AppendLine(
                                string.Format("Result for {0} contains no PanTilt in PTZ position",
                                              r.Time.StdDateTimeToString()));
                        }
                        else
                        {
                            ok = (r.Position.PanTilt.x == result.Position.PanTilt.x &&
                                  r.Position.PanTilt.y == result.Position.PanTilt.y &&
                                  r.Position.PanTilt.space == result.Position.PanTilt.space);
                            if (!ok)
                            {
                                sb.AppendLine(
                                    string.Format("Position in result for {0} is not as expected: PanTilt.x={1}, PanTilt.y={2}, PanTilt.space='{3}'",
                                                  r.Time.StdDateTimeToString(), r.Position.PanTilt.x, r.Position.PanTilt.y, r.Position.PanTilt.space));
                            }
                        }
                    }
                }

                Assert(ok, sb.ToStringTrimNewLine(), "Check PTZ Positions returned");
            },
                () =>
            {
                if (state != SearchState.Completed)
                {
                    ReleaseSearch(searchToken, testKeepAlive * 1000);
                }
            });
        }
Beispiel #12
0
        public void PTZSearchWithRecordingFilterTest()
        {
            string      searchToken   = string.Empty;
            SearchState state         = SearchState.Completed;
            int         testKeepAlive = _searchKeepAlive;

            RunTest(
                () =>
            {
                string keepAlive = string.Format("PT{0}S", testKeepAlive);

                System.DateTime start = System.DateTime.MinValue;

                PTZPositionFilter filter   = new PTZPositionFilter();
                filter.MinPosition         = new PTZVector();
                filter.MinPosition.PanTilt = new Vector2D()
                {
                    x = -1, y = -1
                };
                filter.MaxPosition         = new PTZVector();
                filter.MaxPosition.PanTilt = new Vector2D()
                {
                    x = 1, y = 1
                };

                SearchScope scope = new SearchScope();
                scope.RecordingInformationFilter = "boolean(//Track[TrackType = \"Audio\"])";

                List <FindPTZPositionResult> results = new List <FindPTZPositionResult>();

                state       = SearchState.Completed;
                searchToken = FindPTZPosition(start, null, scope, filter, 20, keepAlive);

                results = GetAllPtzSearchResults(searchToken, filter, 1, null, "PT5S", out state);

                if (results != null)
                {
                    List <string> recordingTokens = new List <string>();

                    foreach (FindPTZPositionResult result in results)
                    {
                        string recordingToken = result.RecordingToken;
                        if (!recordingTokens.Contains(recordingToken))
                        {
                            recordingTokens.Add(recordingToken);
                        }
                    }

                    List <string> correctRecordings = new List <string>();
                    Dictionary <string, RecordingInformation> recordingInfos = new Dictionary <string, RecordingInformation>();

                    foreach (string token in recordingTokens)
                    {
                        RecordingInformation info = GetRecordingInformation(token);
                        recordingInfos.Add(token, info);
                        bool hasAudio = false;
                        if (info.Track != null)
                        {
                            hasAudio = info.Track.Where(T => T.TrackType == TrackType.Audio).FirstOrDefault() != null;
                        }

                        if (hasAudio)
                        {
                            correctRecordings.Add(token);
                        }
                    }

                    {
                        StringBuilder sb = new StringBuilder();
                        bool ok          = true;
                        foreach (FindPTZPositionResult result in results)
                        {
                            string recordingToken = result.RecordingToken;

                            if (!correctRecordings.Contains(recordingToken))
                            {
                                ok = false;
                                sb.AppendLine(
                                    string.Format("Result for time='{0}' belongs to recording '{1}' which does not have tracks of type Audio",
                                                  result.Time.StdDateTimeToString(), recordingToken));
                            }
                            else
                            {
                                RecordingInformation recording = recordingInfos[recordingToken];

                                if (!string.IsNullOrEmpty(result.TrackToken) && recording.Track != null)
                                {
                                    if (recording.Track.Where(T => T.TrackToken == result.TrackToken).FirstOrDefault() == null)
                                    {
                                        ok = false;
                                        sb.AppendFormat("Track with token '{0}', specified in result for time {1} does not belong to recording {2}{3}",
                                                        result.TrackToken, result.Time.StdDateTimeToString(), recordingToken, Environment.NewLine);
                                    }
                                }

                                SearchRange range = DefineSearchRange(recording);
                                if (result.Time < range.Start || result.Time > range.End)
                                {
                                    ok = false;
                                    sb.AppendFormat("Result with time {0} is out of corresponding recording interval ({1}; {2}){3}",
                                                    result.Time.StdDateTimeToString(),
                                                    range.Start.StdDateTimeToString(),
                                                    range.End.StdDateTimeToString(), Environment.NewLine);
                                }

                                if (result.Position != null)
                                {
                                    bool positionOk = true;
                                    if (result.Position.PanTilt != null)
                                    {
                                        positionOk = result.Position.PanTilt.x >= filter.MinPosition.PanTilt.x &&
                                                     result.Position.PanTilt.x <= filter.MaxPosition.PanTilt.x &&
                                                     result.Position.PanTilt.y >= filter.MinPosition.PanTilt.y &&
                                                     result.Position.PanTilt.y <= filter.MaxPosition.PanTilt.y;
                                    }
                                    else
                                    {
                                        positionOk = false;
                                    }
                                    if (!positionOk)
                                    {
                                        ok = false;

                                        sb.AppendFormat("PTZ Pozition specified in result for time {0} is out of search interval{1}",
                                                        result.Time.StdDateTimeToString(), Environment.NewLine);
                                    }
                                }
                                else
                                {
                                    ok = false;
                                    string.Format("Result for time='{0}' does not contain PTZ position", result.Time.StdDateTimeToString());
                                }
                            }
                        }
                        Assert(ok, sb.ToStringTrimNewLine(), "Validate search results");
                    }
                }
            },
                () =>
            {
                if (state != SearchState.Completed)
                {
                    ReleaseSearch(searchToken, testKeepAlive * 1000);
                }
            });
        }