public TETypeLookupStructureDataProvider(IMetamodel metamodel, IQueryableFactoryProvider queryableFactoryProvider, FieldsByBindingsFactory fieldsByBindingsFactory, JsStructureFactory jsStructureFactory, IEntityBindingsProvider entityBindingsProvider, JsStructureEnricher jsStructureEnricher, IEntitiesLoader entitiesLoader, IUiInfoProvider uiInfoProvider, INamingConventionProvider namingConventionProvider, IDataTableByBindingsFactory dataTableByBindingsFactory, IBindingDataTableFiller bindingDataTableFiller, BindingsCreator bindingsCreator) : base(metamodel, fieldsByBindingsFactory, jsStructureFactory) { Contract.Requires(queryableFactoryProvider != null); Contract.Requires(entityBindingsProvider != null); Contract.Requires(jsStructureEnricher != null); Contract.Requires(entitiesLoader != null); Contract.Requires(dataTableByBindingsFactory != null); Contract.Requires(bindingDataTableFiller != null); Contract.Requires(bindingsCreator != null); _queryableFactoryProvider = queryableFactoryProvider; _entityBindingsProvider = entityBindingsProvider; _jsStructureEnricher = jsStructureEnricher; _entitiesLoader = entitiesLoader; _dataTableByBindingsFactory = dataTableByBindingsFactory; _bindingDataTableFiller = bindingDataTableFiller; _bindingsCreator = bindingsCreator; _linqQueryBuilder = new LinqQueryBuilder(metamodel, uiInfoProvider, namingConventionProvider); SetEntityType(typeof(WmsTEType)); }
private static void VerifyLinksPayload(Workspace w, CommonPayload payload, LinqQueryBuilder linqBuilder) { ArrayList expectedEntities = CommonPayload.CreateList(linqBuilder.QueryResult); if (payload == null) { AstoriaTestLog.AreEqual(expectedEntities.Count, 0, "Unexpected null $ref payload"); } else { KeyExpressions expectedKeys = new KeyExpressions(); foreach (object o in expectedEntities) { KeyExpression keyExp = w.CreateKeyExpressionFromProviderObject(o); expectedKeys.Add(keyExp); } List <string> linksFound = new List <string>(); if (payload.Resources == null) { linksFound.Add(payload.Value); } else { foreach (PayloadObject o in (payload.Resources as List <PayloadObject>)) { if (o.PayloadProperties.Any(p => p.Name == "uri")) { linksFound.Add((o["uri"] as PayloadSimpleProperty).Value); } } } AstoriaTestLog.AreEqual(expectedKeys.Count, linksFound.Count, "Number of expected entities does not match number of links found"); foreach (string link in linksFound) { KeyExpression match = null; foreach (KeyExpression expectedKey in expectedKeys) { if (compareKeyURI(link, expectedKey)) { match = expectedKey; break; } } if (match != null) { expectedKeys.Remove(match); } else { AstoriaTestLog.WriteLineIgnore("Unexpected URI: '" + link + "'"); AstoriaTestLog.FailAndThrow("Unexpected URI found in $ref payload"); } } } }
public override object GetClientLinqQuery(DataServiceContext context, QueryNode queryNode) { MethodInfo createQueryMI = typeof(DataServiceContext).GetMethod("CreateQuery", new Type[] { typeof(string) }); createQueryMI = createQueryMI.MakeGenericMethod(this.ResourceContainer.BaseType.ClientClrType); // ctx.CreateQuery<T>("entitySetName") IQueryable resourceContainerQuery = (IQueryable)createQueryMI.Invoke(context, new object[] { this.ResourceContainer.Name }); LinqQueryBuilder linqQueryBuilder = new LinqQueryBuilder(dummyWorkspace, resourceContainerQuery); linqQueryBuilder.Build(queryNode); return(linqQueryBuilder.QueryResultSingle ?? linqQueryBuilder.QueryResult); }
public override object Execute(Expression expression) { Logger.Log($"Executing expression '{expression}'. Strict: {strict}"); var parameterBuilder = new ParameterBuilder <TObject>(queryHelper, strict); //Validate that every tree node is supported var supportedTree = SupportedExpressionValidator.Validate(expression); //Replace variable and method references with their calculated values var evaluatedTree = PartialEvaluate(supportedTree); //Replace all expressions that correspond to LINQ methods with LinqExpression objects var linqTree = LinqQueryBuilder <TObject> .Parse(evaluatedTree, strict); //Merge sequential method calls together into a single statement (e.g. Where(A).Where(B) => Where(A && B)) var mergedTree = LinqQueryMerger.Parse(linqTree, strict); //Extract the Parameter details from each LinqExpression, replacing processed expressions with their TSource var legalTree = parameterBuilder.Build(mergedTree); //Construct the parameter objects required to execute all of the required requests var parameterSets = GetParameters(parameterBuilder); //Filter out server side only expressions so we don't execute them twice (such as Skip) var clientTree = ClientTreeBuilder.Parse(linqTree); //Convert the query to LINQ to Objects var enumerableTree = RewriteEnumerable(clientTree, parameterSets); var getResults = Expression.Lambda(enumerableTree).Compile(); if (getResults.Method.ReturnType.IsValueType) { try { return(getResults.DynamicInvoke()); } catch (TargetInvocationException ex) { throw ex.InnerException; } } return(((Func <object>)getResults)()); }
public static void ExecuteLinq(Workspace workspace, ExpNode q, ResourceContainer container, bool bSingle, ExpNode altq) { System.Uri uri = new Uri(workspace.ServiceUri); WebDataCtxWrapper ctx = new WebDataCtxWrapper(uri); ctx.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; ctx.MergeOption = MergeOption.NoTracking; Type resType = container.BaseType.ClientClrType; ResolveClientType(workspace, ctx, resType); Type cType = typeof(WebDataCtxWrapper); MethodInfo mi = cType.GetMethod("CreateQuery", new Type[] { typeof(string) }); Type pType = container.BaseType.ClientClrType; MethodInfo miConstructed = mi.MakeGenericMethod(pType); string uri2 = container.Name; AstoriaTestLog.WriteLineIgnore(workspace.ServiceUri + "/" + uri2); object[] args = { uri2 }; object query = miConstructed.Invoke(ctx, args); LinqQueryBuilder lb = new LinqQueryBuilder(workspace, (IQueryable)query); string uri3 = lb.Build(q); AstoriaTestLog.WriteLineIgnore("Linq expression: " + lb.QueryExpression); //if (bSingle) //{ // var single = lb.QueryResultSingle; // VerifyLinqSingle(workspace, altq, single, container); //} //else //{ var queryable = lb.QueryResult; VerifyLinq(workspace, q, (IQueryable)queryable); //} }
public CstReqCustomsReportStructureDataProvider(IMetamodel metamodel, FieldsByBindingsFactory fieldsByBindingsFactory, JsStructureFactory jsStructureFactory, IEntitiesLoader entitiesLoader, JsStructureEnricher jsStructureEnricher, EntityBindingsProvider entityBindingsProvider, IDataTableByBindingsFactory dataTableByBindingsFactory, IBindingDataTableFiller bindingDataTableFiller, LinqQueryBuilder linqQueryBuilder, ISessionFactory sessionFactory) : base( metamodel, fieldsByBindingsFactory, jsStructureFactory, entityBindingsProvider, jsStructureEnricher, entitiesLoader) { _dataTableByBindingsFactory = dataTableByBindingsFactory; _bindingDataTableFiller = bindingDataTableFiller; _linqQueryBuilder = linqQueryBuilder; _sessionFactory = sessionFactory; SetEntityType(typeof(WmsReport)); }
public OwbGridStructureDataProvider(IMetamodel metamodel, FieldsByBindingsFactory fieldsByBindingsFactory, JsStructureFactory jsStructureFactory, IDataTableByBindingsFactory dataTableByBindingsFactory, IBindingDataTableFiller bindingDataTableFiller, JsStructureEnricher jsStructureEnricher, BindingsCreator bindingsCreator, LinqQueryBuilder linqQueryBuilder, ISessionFactory sessionFactory) : base(metamodel) { _fieldsByBindingsFactory = fieldsByBindingsFactory; _jsStructureFactory = jsStructureFactory; _dataTableByBindingsFactory = dataTableByBindingsFactory; _bindingDataTableFiller = bindingDataTableFiller; _jsStructureEnricher = jsStructureEnricher; _bindingsCreator = bindingsCreator; _linqQueryBuilder = linqQueryBuilder; _sessionFactory = sessionFactory; SetEntityType(typeof(WmsOWB)); }
public static void Verify(Workspace w, ExpNode q, IEnumerable results, ResourceType resType, ComplexType cType, bool bCount) { long count = 0; if (bCount) { object[] args = new object[] { results }; Type qorType = typeof(QueryOperationResponseWrapper <>).MakeGenericType(resType.ClientClrType); object qor = Activator.CreateInstance(qorType, args); PropertyInfo pi = qor.GetType().GetProperty("GetTotalCount"); object i = pi.GetValue(qor, new object[] { }); count = (long)i; LinqQueryBuilder lb = new LinqQueryBuilder(w); lb.CountingMode = true; lb.Build(q); object baselineElementsCount = CommonPayload.CreateList(lb.QueryResult).Count; AstoriaTestLog.IsTrue(count == Convert.ToInt64(baselineElementsCount), "Count is different.Count is " + count.ToString() + ". Baseline count is " + baselineElementsCount.ToString()); } LinqQueryBuilder linqBuilder = new LinqQueryBuilder(w); linqBuilder.Build(q); IQueryable baselines = linqBuilder.QueryResult; IEnumerator b = null; IEnumerator r = null; try { b = TrustedMethods.IQueryableGetEnumerator(baselines); r = results.GetEnumerator(); } catch (InvalidOperationException invalidOperation) { if (!AstoriaTestProperties.IsRemoteClient) { throw invalidOperation; } } PropertyInfo propertyInfo = null; Object expectedResult1 = null; Object expectedResult2 = null; try { while (b.MoveNext() && r.MoveNext()) { if (b.Current == null) { return; } if (r.Current == null) { throw new TestFailedException("Less results than expected"); } //skip verification for Binary data type for Linq to Sql if (AstoriaTestProperties.DataLayerProviderKinds[0] == DataLayerProviderKind.LinqToSql && b.Current is System.Byte[]) { return; } if (b.Current is System.Byte[]) { byte[] newBase = (byte[])b.Current; byte[] newAct = (byte[])r.Current; if (newBase.Length != newAct.Length) { throw new TestFailedException("Failed to compare the results!"); } } #if !ClientSKUFramework else if (b.Current is System.Data.Linq.Binary) { System.Data.Linq.Binary newBase = (System.Data.Linq.Binary)b.Current; System.Data.Linq.Binary newAct = new System.Data.Linq.Binary((byte[])r.Current); if (newBase.Length != newAct.Length) { throw new TestFailedException("Failed to compare the results!"); } } #endif else if (b.Current is System.Xml.Linq.XElement) { if (b.Current.ToString() != r.Current.ToString()) { throw new TestFailedException("Failed to compare the results!"); } } else { if (!b.Current.Equals(r.Current)) { if (cType != null) { foreach (ResourceProperty property in cType.Properties) { if (!property.IsNavigation && !property.IsComplexType && !(property.Type is CollectionType)) { propertyInfo = b.Current.GetType().GetProperty(property.Name); expectedResult1 = propertyInfo.GetValue(b.Current, null); PropertyInfo propertyInfo2 = r.Current.GetType().GetProperty(property.Name); expectedResult2 = propertyInfo2.GetValue(r.Current, null); if (expectedResult1 != expectedResult2) { if (expectedResult1 is System.Xml.Linq.XElement) { expectedResult1 = ((System.Xml.Linq.XElement)expectedResult1).ToString(System.Xml.Linq.SaveOptions.None); } if (expectedResult2 is System.Xml.Linq.XElement) { expectedResult2 = ((System.Xml.Linq.XElement)expectedResult2).ToString(System.Xml.Linq.SaveOptions.None); } #if !ClientSKUFramework if (expectedResult1 is byte[]) { expectedResult1 = new System.Data.Linq.Binary((byte[])expectedResult1); } if (expectedResult2 is byte[]) { expectedResult2 = new System.Data.Linq.Binary((byte[])expectedResult2); } #endif AstoriaTestLog.AreEqual(expectedResult1, expectedResult2, String.Format("Resource value for {0} does not match", property.Name), false); } } } } else { foreach (ResourceProperty property in resType.Properties) { if (!property.IsNavigation && !property.IsComplexType && !(property.Type is CollectionType)) { //skip verification for Binary data type for Linq to Sql if (AstoriaTestProperties.DataLayerProviderKinds[0] == DataLayerProviderKind.LinqToSql && property.Type.Name == "LinqToSqlBinary") { return; } propertyInfo = b.Current.GetType().GetProperty(property.Name); expectedResult1 = propertyInfo.GetValue(b.Current, null); PropertyInfo propertyinfo2 = r.Current.GetType().GetProperty(property.Name); expectedResult2 = propertyinfo2.GetValue(r.Current, null); if (expectedResult1 != expectedResult2) { if (expectedResult1 is System.Xml.Linq.XElement) { expectedResult1 = ((System.Xml.Linq.XElement)expectedResult1).ToString(System.Xml.Linq.SaveOptions.None); } if (expectedResult2 is System.Xml.Linq.XElement) { expectedResult2 = ((System.Xml.Linq.XElement)expectedResult2).ToString(System.Xml.Linq.SaveOptions.None); } #if !ClientSKUFramework if (expectedResult1 is byte[]) { expectedResult1 = new System.Data.Linq.Binary((byte[])expectedResult1); } if (expectedResult2 is byte[]) { expectedResult2 = new System.Data.Linq.Binary((byte[])expectedResult2); } #endif AstoriaTestLog.AreEqual(expectedResult1, expectedResult2, String.Format("Resource value for {0} does not match", property.Name), false); } } } } } } } } catch (Exception e) { AstoriaTestLog.WriteLine(e.ToString()); throw; } }
public static void Verify(Workspace w, ExpNode q, IEnumerable results, ResourceType resType, ComplexType cType, bool bCount) { long count = 0; if (bCount) { object[] args = new object[] { results }; Type qorType = typeof(QueryOperationResponseWrapper<>).MakeGenericType(resType.ClientClrType); object qor = Activator.CreateInstance(qorType, args); PropertyInfo pi = qor.GetType().GetProperty("GetTotalCount"); object i = pi.GetValue(qor, new object[] { }); count = (long)i; LinqQueryBuilder lb = new LinqQueryBuilder(w); lb.CountingMode = true; lb.Build(q); object baselineElementsCount = CommonPayload.CreateList(lb.QueryResult).Count; AstoriaTestLog.IsTrue(count == Convert.ToInt64(baselineElementsCount), "Count is different.Count is " + count.ToString() + ". Baseline count is " + baselineElementsCount.ToString()); } LinqQueryBuilder linqBuilder = new LinqQueryBuilder(w); linqBuilder.Build(q); IQueryable baselines = linqBuilder.QueryResult; IEnumerator b = null; IEnumerator r = null; try { b = TrustedMethods.IQueryableGetEnumerator(baselines); r = results.GetEnumerator(); } catch (InvalidOperationException invalidOperation) { if (!AstoriaTestProperties.IsRemoteClient) throw invalidOperation; } PropertyInfo propertyInfo = null; Object expectedResult1 = null; Object expectedResult2 = null; try { while (b.MoveNext() && r.MoveNext()) { if (b.Current == null) { return; } if (r.Current == null) { throw new TestFailedException("Less results than expected"); } //skip verification for Binary data type for Linq to Sql if (AstoriaTestProperties.DataLayerProviderKinds[0] == DataLayerProviderKind.LinqToSql && b.Current is System.Byte[]) return; if (b.Current is System.Byte[]) { byte[] newBase = (byte[])b.Current; byte[] newAct = (byte[])r.Current; if (newBase.Length != newAct.Length) throw new TestFailedException("Failed to compare the results!"); } #if !ClientSKUFramework else if (b.Current is System.Data.Linq.Binary) { System.Data.Linq.Binary newBase = (System.Data.Linq.Binary)b.Current; System.Data.Linq.Binary newAct = new System.Data.Linq.Binary((byte[])r.Current); if (newBase.Length != newAct.Length) throw new TestFailedException("Failed to compare the results!"); } #endif else if (b.Current is System.Xml.Linq.XElement) { if (b.Current.ToString() != r.Current.ToString()) throw new TestFailedException("Failed to compare the results!"); } else { if (!b.Current.Equals(r.Current)) { if (cType != null) { foreach (ResourceProperty property in cType.Properties) { if (!property.IsNavigation && !property.IsComplexType && !(property.Type is CollectionType)) { propertyInfo = b.Current.GetType().GetProperty(property.Name); expectedResult1 = propertyInfo.GetValue(b.Current, null); PropertyInfo propertyInfo2 = r.Current.GetType().GetProperty(property.Name); expectedResult2 = propertyInfo2.GetValue(r.Current, null); if (expectedResult1 != expectedResult2) { if (expectedResult1 is System.Xml.Linq.XElement) { expectedResult1 = ((System.Xml.Linq.XElement)expectedResult1).ToString(System.Xml.Linq.SaveOptions.None); } if (expectedResult2 is System.Xml.Linq.XElement) { expectedResult2 = ((System.Xml.Linq.XElement)expectedResult2).ToString(System.Xml.Linq.SaveOptions.None); } #if !ClientSKUFramework if (expectedResult1 is byte[]) { expectedResult1 = new System.Data.Linq.Binary((byte[])expectedResult1); } if (expectedResult2 is byte[]) { expectedResult2 = new System.Data.Linq.Binary((byte[])expectedResult2); } #endif AstoriaTestLog.AreEqual(expectedResult1, expectedResult2, String.Format("Resource value for {0} does not match", property.Name), false); } } } } else { foreach (ResourceProperty property in resType.Properties) { if (!property.IsNavigation && !property.IsComplexType && !(property.Type is CollectionType)) { //skip verification for Binary data type for Linq to Sql if (AstoriaTestProperties.DataLayerProviderKinds[0] == DataLayerProviderKind.LinqToSql && property.Type.Name == "LinqToSqlBinary") return; propertyInfo = b.Current.GetType().GetProperty(property.Name); expectedResult1 = propertyInfo.GetValue(b.Current, null); PropertyInfo propertyinfo2 = r.Current.GetType().GetProperty(property.Name); expectedResult2 = propertyinfo2.GetValue(r.Current, null); if (expectedResult1 != expectedResult2) { if (expectedResult1 is System.Xml.Linq.XElement) { expectedResult1 = ((System.Xml.Linq.XElement)expectedResult1).ToString(System.Xml.Linq.SaveOptions.None); } if (expectedResult2 is System.Xml.Linq.XElement) { expectedResult2 = ((System.Xml.Linq.XElement)expectedResult2).ToString(System.Xml.Linq.SaveOptions.None); } #if !ClientSKUFramework if (expectedResult1 is byte[]) { expectedResult1 = new System.Data.Linq.Binary((byte[])expectedResult1); } if (expectedResult2 is byte[]) { expectedResult2 = new System.Data.Linq.Binary((byte[])expectedResult2); } #endif AstoriaTestLog.AreEqual(expectedResult1, expectedResult2, String.Format("Resource value for {0} does not match", property.Name), false); } } } } } } } } catch (Exception e) { AstoriaTestLog.WriteLine(e.ToString()); throw; } }
public virtual IQueryable GetUnderlyingProviderQueryResults(ExpNode q) { LinqQueryBuilder linqQueryBuilder = new LinqQueryBuilder(this); linqQueryBuilder.Build(q); return linqQueryBuilder.QueryResult; }
public virtual KeyExpressions GetExistingAssociatedKeys(ResourceContainer resourceContainer, ResourceProperty property, KeyExpression keyExpression) { LinqQueryBuilder linqBuilder = new LinqQueryBuilder(this); ExpNode query = Query.From( Exp.Variable(resourceContainer)) .Where(keyExpression) .OfType(property.ResourceType) .Nav(new PropertyExpression(property)) .Select(); linqBuilder.Build(query); ResourceType associatedType = property.Type as ResourceType; if (property.Type is ResourceCollection) { associatedType = (property.Type as ResourceCollection).SubType as ResourceType; } IQueryable queryable = linqBuilder.QueryResult; KeyExpressions keys = new KeyExpressions(); IEnumerator enumerator = queryable.GetEnumerator(); while (enumerator.MoveNext()) { if (enumerator.Current != null) { Type t = enumerator.Current.GetType(); if (AstoriaTestProperties.EdmObjectLayer == ServiceEdmObjectLayer.PocoWithProxy) t = t.BaseType; IEnumerable<ResourceType> typesWithName = resourceContainer.Workspace.ServiceContainer.ResourceTypes.Where(rt => (t.Name.Equals(rt.Name))); IEnumerable<ResourceType> typesWithNamespace = typesWithName.Where(rt2 => rt2.Namespace == t.Namespace).ToList(); ResourceType instanceType = typesWithNamespace.First(); ResourceContainer relatedContainer = resourceContainer.FindDefaultRelatedContainer(property); keys.Add(GetKeyExpression(relatedContainer, instanceType, enumerator.Current)); } } return keys; }
public virtual KeyedResourceInstance GetSingleResourceByKey(KeyExpression keyExpression) { LinqQueryBuilder linqBuilder = new LinqQueryBuilder(this); ExpNode query = null; if (this.Settings.HasContainment) query = ContainmentUtil.BuildCanonicalQuery(keyExpression).Select(); else { query = Query.From( Exp.Variable(keyExpression.ResourceContainer)) .Where(keyExpression) .Select(); } IQueryable queryable = this.GetUnderlyingProviderQueryResults(query); IEnumerator enumerator = queryable.GetEnumerator(); enumerator.MoveNext(); object dataObject = enumerator.Current; if (dataObject == null) return null; return ResourceInstanceUtil.CreateKeyedResourceInstanceByExactClone(keyExpression.ResourceContainer, keyExpression.ResourceType, dataObject); }
protected virtual KeyExpression GetRandomExistingKey(ResourceContainer resourceContainer, ResourceType resourceType, KeyExpression partialKey) { LinqQueryBuilder linqBuilder = new LinqQueryBuilder(this); QueryNode query = Query.From(Exp.Variable(resourceContainer)); //TODO: Figure out how to make OfType work with astoria dataquerycontext if (resourceType != null && resourceContainer.Workspace.DataLayerProviderKind != DataLayerProviderKind.InMemoryLinq && resourceType.BaseType != null) { query = query.OfType(resourceType); } else if (partialKey != null) { query = query.Where(partialKey); } query = query.Select().Top(50); linqBuilder.Build(query); int count = 0; KeyExpressions keys = new KeyExpressions(); IQueryable objects = linqBuilder.QueryResult; IEnumerator enumerator = null; try { enumerator = objects.GetEnumerator(); while (enumerator.MoveNext() && count < 50) { if (enumerator.Current != null) { Type t = enumerator.Current.GetType(); if (AstoriaTestProperties.EdmObjectLayer == ServiceEdmObjectLayer.PocoWithProxy) t = t.BaseType; List<ResourceType> types = resourceContainer.ResourceTypes.Where(rt => rt.Name.Equals(t.Name) && rt.Namespace.Equals(t.Namespace)).ToList(); if (types.Count > 0) { ResourceType actualResourceType = types.Single(); if (resourceType != null && resourceType != actualResourceType) continue; KeyExpression keyExp = GetKeyExpression(resourceContainer, actualResourceType, enumerator.Current); //If key is something that has approx value //Then its really a nonfunctional key, excluding it as //we only want valid keys here if (!keyExp.IsApproxKeyValue()) { keys.Add(keyExp); count++; } } } } } finally { IDisposable disposable = (enumerator as IDisposable); if (null != disposable) { disposable.Dispose(); } } return keys.Choose(); }
public static void ValidateCountException(AstoriaResponse response, AstoriaRequest request, TestFailedException tfe) { // Errors are expected for older versions. if (!Versioning.Server.SupportsV2Features) { if (request.URI.Contains("$inlinecount=allpages")) { // Query parameter not recognized. if (response.ActualStatusCode == System.Net.HttpStatusCode.BadRequest) { return; } } //anything other than http 404 or 400 is an invalid status code for a count query else if ( response.ActualStatusCode != System.Net.HttpStatusCode.BadRequest || response.ActualStatusCode != System.Net.HttpStatusCode.NotFound) { throw tfe; } else { // Resource segment $count not found. if (response.ActualStatusCode == System.Net.HttpStatusCode.NotFound || response.ActualStatusCode == System.Net.HttpStatusCode.BadRequest) { return; } } } LinqQueryBuilder linqBuilder = new LinqQueryBuilder(request.Workspace); linqBuilder.CountingMode = request.URI.Contains("$inlinecount=allpages"); try { linqBuilder.Build(request.Query); } catch (KeyNotFoundException kfe) { if (!AstoriaTestProperties.DataLayerProviderKinds.Contains(DataLayerProviderKind.NonClr)) { throw kfe; } } bool isInvalidError = true; if (response.ActualStatusCode == System.Net.HttpStatusCode.NotFound) { if (request.Query.Input is CountExpression) { ExpNode internalQuery = ((CountExpression)request.Query.Input).ScanNode; if (internalQuery is KeyExpression || internalQuery is PredicateExpression) { isInvalidError = false; } } if (isInvalidError) { if (CommonPayload.CreateList(linqBuilder.QueryResult).Count == 0) { isInvalidError = false; } } } if (response.ActualStatusCode == System.Net.HttpStatusCode.BadRequest) { if (request.Query.Input is CountExpression) { ExpNode internalQuery = ((CountExpression)request.Query.Input).ScanNode; if (internalQuery is KeyExpression || internalQuery is PredicateExpression) { isInvalidError = false; } } else if (request.Query.Input is KeyExpression) { isInvalidError = false; } } if (isInvalidError) { throw tfe; } }
public static void VerifyGet(AstoriaResponse response) { AstoriaRequest request = response.Request; if (request.Query != null) { LinqQueryBuilder linqBuilder = new LinqQueryBuilder(request.Workspace); linqBuilder.Build(request.Query); if (request.URI.Contains("$value")) { CommonPayload payload; // $value queries will sometimes return unexpected 404s due to null values // if we get a 404 unexpectedly, the underlying result must be null if (response.ActualStatusCode == System.Net.HttpStatusCode.NotFound) { payload = request.CommonPayload; } IEnumerable enumerable = linqBuilder.QueryResult; object expectedResult = CommonPayload.GetSingleValueFromIQueryable(linqBuilder.QueryResult, false); ResourceProperty rp = request.GetPropertyFromQuery(); CommonPayload.ComparePrimitiveValuesObjectAndString(expectedResult, rp.Type.ClrType, response.Payload, true, request.Format, false); } else if (request.URI.Contains("$count") || request.URI.Contains("$inlinecount")) { if (request.URI.Contains("$count")) { // Versioning: make sure the server always returns 2.0. VerifySpecificResponseVersion(response, 2, 0); // PlainText payload. try { VerifyStatusCode(response); if (response.Request.ExpectedStatusCode == System.Net.HttpStatusCode.OK) { int countPayload = Int32.Parse(response.Payload); int countBaseline = CommonPayload.CreateList(linqBuilder.QueryResult).Count; AstoriaTestLog.AreEqual(countPayload, countBaseline, "Counts in payload (" + countPayload + ") and baseline (" + countBaseline + ") differ."); } } catch (TestFailedException tfe) { //When the underlying resource has zero elements, the server now throws a 404 error , causing false negatives ValidateCountException(response, request, tfe); } } else { VerifySpecificResponseVersion(response, 2, 0); try { // JSON, Atom or PlainXml ($ref) payload. VerifyStatusCode(response); if (response.Request.ExpectedStatusCode == System.Net.HttpStatusCode.OK) { CommonPayload payload = response.CommonPayload; LinqQueryBuilder baselineLinqBuilder = new LinqQueryBuilder(request.Workspace); baselineLinqBuilder.CountingMode = true; baselineLinqBuilder.Build(request.Query); object baselineElementsCount = CommonPayload.CreateList(baselineLinqBuilder.QueryResult).Count; payload.CompareCountInline(linqBuilder.QueryResult, baselineElementsCount); AstoriaTestLog.WriteLine(linqBuilder.QueryExpression); if (request.URI.Contains("$ref")) { VerifyLinksPayload(request.Workspace, payload, linqBuilder); } } } catch (TestFailedException tfe) { //When the underlying resource has zero elements, the server now throws a 404 error , causing false negatives ValidateCountException(response, request, tfe); } } } else { if (response.ActualStatusCode == System.Net.HttpStatusCode.NoContent && response.Payload == "") { response.Payload = null; // allow result from Linq query and payload to be compared (NoContent is a get to a null Nav prop) } if (response.ActualStatusCode == System.Net.HttpStatusCode.NotFound) { return; } CommonPayload payload = response.CommonPayload; if (request.URI.Contains("$ref")) { VerifyLinksPayload(request.Workspace, payload, linqBuilder); } else if (payload.Resources == null) { if (request.Format == SerializationFormatKind.JSON) { payload.CompareValue(linqBuilder.QueryResult, true, false); } else { payload.CompareValue(linqBuilder.QueryResult, false, false); } } else { payload.Compare(linqBuilder.QueryResult); } } } }
private static void VerifyLinksPayload(Workspace w, CommonPayload payload, LinqQueryBuilder linqBuilder) { ArrayList expectedEntities = CommonPayload.CreateList(linqBuilder.QueryResult); if (payload == null) AstoriaTestLog.AreEqual(expectedEntities.Count, 0, "Unexpected null $ref payload"); else { KeyExpressions expectedKeys = new KeyExpressions(); foreach (object o in expectedEntities) { KeyExpression keyExp = w.CreateKeyExpressionFromProviderObject(o); expectedKeys.Add(keyExp); } List<string> linksFound = new List<string>(); if (payload.Resources == null) { linksFound.Add(payload.Value); } else { foreach (PayloadObject o in (payload.Resources as List<PayloadObject>)) { if(o.PayloadProperties.Any(p => p.Name == "uri")) linksFound.Add((o["uri"] as PayloadSimpleProperty).Value); } } AstoriaTestLog.AreEqual(expectedKeys.Count, linksFound.Count, "Number of expected entities does not match number of links found"); foreach (string link in linksFound) { KeyExpression match = null; foreach (KeyExpression expectedKey in expectedKeys) { if (compareKeyURI(link, expectedKey)) { match = expectedKey; break; } } if (match != null) { expectedKeys.Remove(match); } else { AstoriaTestLog.WriteLineIgnore("Unexpected URI: '" + link + "'"); AstoriaTestLog.FailAndThrow("Unexpected URI found in $ref payload"); } } } }
public static void ValidateCountException(AstoriaResponse response, AstoriaRequest request, TestFailedException tfe) { // Errors are expected for older versions. if (!Versioning.Server.SupportsV2Features) { if (request.URI.Contains("$inlinecount=allpages")) { // Query parameter not recognized. if (response.ActualStatusCode == System.Net.HttpStatusCode.BadRequest) return; } //anything other than http 404 or 400 is an invalid status code for a count query else if ( response.ActualStatusCode != System.Net.HttpStatusCode.BadRequest || response.ActualStatusCode != System.Net.HttpStatusCode.NotFound) { throw tfe; } else { // Resource segment $count not found. if (response.ActualStatusCode == System.Net.HttpStatusCode.NotFound || response.ActualStatusCode == System.Net.HttpStatusCode.BadRequest) return; } } LinqQueryBuilder linqBuilder = new LinqQueryBuilder(request.Workspace); linqBuilder.CountingMode = request.URI.Contains("$inlinecount=allpages"); try { linqBuilder.Build(request.Query); } catch (KeyNotFoundException kfe) { if (!AstoriaTestProperties.DataLayerProviderKinds.Contains(DataLayerProviderKind.NonClr)) { throw kfe; } } bool isInvalidError = true; if (response.ActualStatusCode == System.Net.HttpStatusCode.NotFound) { if (request.Query.Input is CountExpression) { ExpNode internalQuery = ((CountExpression)request.Query.Input).ScanNode; if (internalQuery is KeyExpression || internalQuery is PredicateExpression) { isInvalidError = false; } } if (isInvalidError) { if (CommonPayload.CreateList(linqBuilder.QueryResult).Count == 0) { isInvalidError = false; } } } if (response.ActualStatusCode == System.Net.HttpStatusCode.BadRequest) { if (request.Query.Input is CountExpression) { ExpNode internalQuery = ((CountExpression)request.Query.Input).ScanNode; if (internalQuery is KeyExpression || internalQuery is PredicateExpression) { isInvalidError = false; } } else if (request.Query.Input is KeyExpression) { isInvalidError = false; } } if (isInvalidError) { throw tfe; } }
public static void VerifyGet(AstoriaResponse response) { AstoriaRequest request = response.Request; if (request.Query != null) { LinqQueryBuilder linqBuilder = new LinqQueryBuilder(request.Workspace); linqBuilder.Build(request.Query); if (request.URI.Contains("$value")) { CommonPayload payload; // $value queries will sometimes return unexpected 404s due to null values // if we get a 404 unexpectedly, the underlying result must be null if (response.ActualStatusCode == System.Net.HttpStatusCode.NotFound) payload = request.CommonPayload; IEnumerable enumerable = linqBuilder.QueryResult; object expectedResult = CommonPayload.GetSingleValueFromIQueryable(linqBuilder.QueryResult, false); ResourceProperty rp = request.GetPropertyFromQuery(); CommonPayload.ComparePrimitiveValuesObjectAndString(expectedResult, rp.Type.ClrType, response.Payload, true, request.Format, false); } else if (request.URI.Contains("$count") || request.URI.Contains("$inlinecount")) { if (request.URI.Contains("$count")) { // Versioning: make sure the server always returns 2.0. VerifySpecificResponseVersion(response, 2, 0); // PlainText payload. try { VerifyStatusCode(response); if (response.Request.ExpectedStatusCode == System.Net.HttpStatusCode.OK) { int countPayload = Int32.Parse(response.Payload); int countBaseline = CommonPayload.CreateList(linqBuilder.QueryResult).Count; AstoriaTestLog.AreEqual(countPayload, countBaseline, "Counts in payload (" + countPayload + ") and baseline (" + countBaseline + ") differ."); } } catch (TestFailedException tfe) { //When the underlying resource has zero elements, the server now throws a 404 error , causing false negatives ValidateCountException(response, request, tfe); } } else { VerifySpecificResponseVersion(response, 2, 0); try { // JSON, Atom or PlainXml ($ref) payload. VerifyStatusCode(response); if (response.Request.ExpectedStatusCode == System.Net.HttpStatusCode.OK) { CommonPayload payload = response.CommonPayload; LinqQueryBuilder baselineLinqBuilder = new LinqQueryBuilder(request.Workspace); baselineLinqBuilder.CountingMode = true; baselineLinqBuilder.Build(request.Query); object baselineElementsCount = CommonPayload.CreateList(baselineLinqBuilder.QueryResult).Count; payload.CompareCountInline(linqBuilder.QueryResult, baselineElementsCount); AstoriaTestLog.WriteLine(linqBuilder.QueryExpression); if (request.URI.Contains("$ref")) VerifyLinksPayload(request.Workspace, payload, linqBuilder); } } catch (TestFailedException tfe) { //When the underlying resource has zero elements, the server now throws a 404 error , causing false negatives ValidateCountException(response, request, tfe); } } } else { if (response.ActualStatusCode == System.Net.HttpStatusCode.NoContent && response.Payload == "") response.Payload = null; // allow result from Linq query and payload to be compared (NoContent is a get to a null Nav prop) if (response.ActualStatusCode == System.Net.HttpStatusCode.NotFound) return; CommonPayload payload = response.CommonPayload; if (request.URI.Contains("$ref")) { VerifyLinksPayload(request.Workspace, payload, linqBuilder); } else if (payload.Resources == null) { if (request.Format == SerializationFormatKind.JSON) payload.CompareValue(linqBuilder.QueryResult, true, false); else payload.CompareValue(linqBuilder.QueryResult, false, false); } else payload.Compare(linqBuilder.QueryResult); } } }