示例#1
0
        //---------------------------------------------------------------------
        // Constructs AstoriaRequest and sets.
        //---------------------------------------------------------------------
        private BlobsRequest(Workspace w, SerializationFormatKind format, RequestVerb verb, string uri, HttpStatusCode expectedStatusCode) : base(w)
        {
            // Common settings for MLEs and MRs.
            base.IsBlobRequest = true;
            base.Verb = verb;
            base.ExpectedStatusCode = expectedStatusCode;

            // Construct request URI.
            if (uri.Contains("(*)"))
            {
                // Replace (*) with random key.
                string relativeURI = uri.Remove(0, w.ServiceUri.Length + 1);
                ResourceContainer container = w.ServiceContainer.ResourceContainers[relativeURI.Substring(0, relativeURI.IndexOf("(*)"))];
                KeyExpression key = null;
                try { key = w.GetRandomExistingKey(container, container.BaseType); } catch(Exception e) { AstoriaTestLog.Skip("Unable to get random key"); }
                base.Query = ContainmentUtil.BuildCanonicalQuery(key);
                base.URI += relativeURI.Substring(relativeURI.IndexOf("(*)") + 3);
            }
            else
            {
                // Deterministic URI.
                base.URI = uri;
            }

            LastURI = base.URI;
        }
示例#2
0
        public static AstoriaRequest BuildRandomRequest(Workspace workspace, RequestVerb verb, SerializationFormatKind format)
        {
            IEnumerable<ResourceContainer> safeContainers =
                workspace.ServiceContainer.ResourceContainers
                    .Where(c => IsSafeOperation(verb, c));

            if (verb != RequestVerb.Get)
                safeContainers = safeContainers.Where(c => c.ResourceTypes.Any(t => IsSafeOperation(verb, c, t)));

            fxList<ResourceContainer> containers = new fxList<ResourceContainer>(safeContainers);
            if (!containers.Any())
                return null;

            AstoriaRequest request = null;

            while (request == null && containers.Any())
            {
                ResourceContainer container = null;
                ResourceType type = null;
                KeyExpression key = null;

                while (container == null && containers.Any())
                {
                    container = containers.Choose();

                    if (verb == RequestVerb.Get)
                    {
                        key = workspace.GetRandomExistingKey(container);
                        if (key == null)
                        {
                            containers.Remove(container);
                            container = null;
                        }
                    }
                    else
                    {
                        fxList<ResourceType> types = new fxList<ResourceType>(container.ResourceTypes.Where(t => IsSafeOperation(verb, container, t)));

                        if (!types.Any())
                        {
                            containers.Remove(container);
                            container = null;
                        }

                        if (verb != RequestVerb.Delete)
                            type = types.Choose();
                        else
                        {
                            while (key == null && types.Any())
                            {
                                type = types.Choose();
                                key = workspace.GetRandomExistingKey(container, type);
                                if (key == null)
                                    types.Remove(type);
                            }

                            if (key == null)
                            {
                                containers.Remove(container);
                                container = null;
                            }
                        }
                    }
                }

                // if we ran out of containers before finding one that would work
                //
                if (container == null)
                    return null;

                // if the Build___ method returns null, we'll come back around with a different container/key
                //
                switch (verb)
                {
                    case RequestVerb.Get:
                        request = BuildGet(workspace, key, HttpStatusCode.OK, format);
                        break;

                    case RequestVerb.Post:
                        request = BuildInsert(workspace, container, type, HttpStatusCode.Created, format);
                        break;

                    case RequestVerb.Put:
                    case RequestVerb.Patch:
                        request = BuildUpdate(workspace, container, type, (verb == RequestVerb.Put), HttpStatusCode.NoContent, format);
                        break;

                    case RequestVerb.Delete:
                        request = BuildDelete(workspace, key, HttpStatusCode.NoContent, format);
                        break;

                    default:
                        throw new ArgumentException("Unsupported verb: " + verb.ToString());
                }
            }

            // might be null, but we did our best
            //
            return request;
        }
示例#3
0
 public static AstoriaRequest BuildUpdate(Workspace workspace, ResourceContainer container, ResourceType resourceType,
     bool replace, HttpStatusCode expectedStatusCode, SerializationFormatKind format, out KeyExpression modifiedKey)
 {
     modifiedKey = workspace.GetRandomExistingKey(container, resourceType);
     return BuildUpdate(workspace, modifiedKey, replace, expectedStatusCode, format);
 }