Hi Dom,

We definitely should have updated our unit-testing documentation to include
more information for testing with queues.  I'll make sure this gets
addressed.  In the meantime, I believe this should do what you want:


QueueFactory.getDefaultQueue().add(TaskOptions.Builder.taskName("task29"));
    ApiProxyLocalImpl proxy = new ApiProxyLocalImpl(new File(".")){};
    LocalTaskQueue ltq = (LocalTaskQueue)
proxy.getService(LocalTaskQueue.PACKAGE);
    ltq.flushQueue(QueueFactory.getDefaultQueue().getQueueName());

QueueFactory.getDefaultQueue().add(TaskOptions.Builder.taskName("task29"));

You can use LocalTaskQueue.getQueueStateInfo() to inspect and assert on the
state of your queues:

    LocalTaskQueue ltq = (LocalTaskQueue)
proxy.getService(LocalTaskQueue.PACKAGE);
    for (QueueStateInfo qsi : ltq.getQueueStateInfo().values()) {
      for (QueueStateInfo.TaskStateInfo ti : qsi.getTaskInfo()) {
        System.out.println(ti.getTaskName());
      }
    }

Hope this helps,
Max

On Sat, Dec 5, 2009 at 9:12 PM, Dom Derrien <[email protected]>wrote:

> Max,
>
> I've an issue probably related to my tests that recreate an
> environement at each step (as unit tests usually does ;). The issue is
> related to the re-creation of a Queue with the same name (the default
> one).
>
> Here is the exception with part of the stack trace:
> com.google.appengine.api.labs.taskqueue.TaskAlreadyExistsException:
> Task name already exists :
>    at
> com.google.appengine.api.labs.taskqueue.QueueApiHelper.translateError
> (QueueApiHelper.java:76)
>    at
> com.google.appengine.api.labs.taskqueue.QueueApiHelper.makeSyncCall
> (QueueApiHelper.java:32)
>    at com.google.appengine.api.labs.taskqueue.QueueImpl.add
> (QueueImpl.java:235)
>    at com.google.appengine.api.labs.taskqueue.QueueImpl.add
> (QueueImpl.java:225)
>    at twetailer.task.LocationValidator.process(LocationValidator.java:
> 119)
>
> Here is the code with cause the error:
>    Queue queue = QueueFactory.getDefaultQueue();
>    queue.add(
>            url(ApplicationSettings.get().getServletApiPath() + "/
> maezel/processCommand").
>                param(Command.KEY, commandKey.toString()).
>                method(Method.GET)
>    );
>
> I can understand you want to avoid the duplication but this is a
> regression...
>
> Do you have a workaround for this issue too? Something to reset the
> factory...
>
> At the same time, can you tell me how, from the code of the test, if
> we can verify that tasks have been added to the queue as expected? For
> now, I've to rely on yet another mock class ;)
>
> Thanks,
> A+, Dom
> --
> Any way to
>
> On Dec 5, 11:05 pm, Dom Derrien <[email protected]> wrote:
> > Hi Max,
> >
> > To be able cover my code with unit tests, I created a mock class for
> > the App Engine environment (http://github.com/DomDerrien/two-tiers-
> > utils/blob/master/src/Java/com/google/apphosting/api/
> > MockAppEngineEnvironment.java). As reported in my recent blog post
> > (http://domderrien.blogspot.com/2009/11/unit-tests-mock-objects-and-
> > app-engine.html), it's inspired from your documentation and from a
> > post of App Engine fan.
> >
> > FYI, it seems to me that the official SDK still requires the
> > workaround. Thanks to your suggestion, the updated mock let the tests
> > passing as before ;)
> >
> >     private class MockApiProxyEnvironment implements
> > ApiProxy.Environment {
> >         // ...
> >         public Map<String, Object> getAttributes() {
> >             Map<String, Object> out = new HashMap<String, Object>();
> >
> >             // Only necessary for tasks that are added when there is
> > no "live" request
> >             // See:
> http://groups.google.com/group/google-appengine-java/msg/8f5872b05214...
> >             out.put("com.google.appengine.server_url_key", "http://
> > localhost:8080");
> >
> >             return out;
> >         }
> >     };
> >
> > A+, Dom
> > --
> > On Dec 3, 7:01 pm, "Max Ross (Google)" 
> > <[email protected]<maxr%[email protected]>
> >
> > wrote:
> >
> > > Vince,
> >
> > > We added a last minute fix for this in the SDK that just went out.
>  Could
> > > you please try your code with the official SDK download?
> >
> > > Thanks,
> > > Max
> >
> > > On Thu, Dec 3, 2009 at 12:15 PM, Max Ross (Google) <
> >
> > > [email protected] <maxr%[email protected]> <
> maxr%[email protected] <maxr%[email protected]>>> wrote:
> > > > Sure, sorry for the trouble, and thanks for trying out the
> prerelease!
> >
> > > > Max
> >
> > > > On Thu, Dec 3, 2009 at 12:12 PM, Vince Bonfanti <[email protected]
> >wrote:
> >
> > > >> That fixed it. Thanks.
> >
> > > >> Vince
> >
> > > >> On Thu, Dec 3, 2009 at 2:24 PM, Max Ross (Google) <
> > > >> [email protected] <maxr%[email protected]> <
> maxr%[email protected] <maxr%[email protected]>>> wrote:
> >
> > > >>> Vince,
> >
> > > >>> As a workaround, try setting the missing environment attribute
> explicitly
> > > >>> before you add the task to the queue:
> >
> > > >>>
> ApiProxy.getCurrentEnvironment().getAttributes().put("com.google.appengine.server_url_key",
> > > >>> "http://localhost:8080";);
> >
> > > >>> This should only be necessary for tasks that are added when there
> is no
> > > >>> "live" request and it should have no impact in prod.
> >
> > > >>> Sorry for the trouble,
> > > >>> Max
> >
> > > >>> On Thu, Dec 3, 2009 at 10:20 AM, Max Ross (Google) <
> > > >>> [email protected] <maxr%[email protected]> <
> maxr%[email protected] <maxr%[email protected]>>> wrote:
> >
> > > >>>> Hi Vince,
> >
> > > >>>> That sounds like a bug in our code that was a side effect of the
> > > >>>> automatic task execution that now happens in the dev environment.
>  Let me
> > > >>>> see if I can come up with a workaround for you.
> >
> > > >>>> Max
> >
> > > >>>> On Thu, Dec 3, 2009 at 10:06 AM, Vince Bonfanti <
> [email protected]>wrote:
> >
> > > >>>>> I just started testing with the 1.2.8 prerelease, and I'm getting
> the
> > > >>>>> following exception from Queue.add() in code that works in 1.2.6:
> >
> > > >>>>> java.lang.IllegalStateException: Current enviornment must have
> the
> > > >>>>> server url available via the com.google.appengine.server_url_key
> attribute.
> >
> > > >>>>> This only happens when Queue.add() is invoked from the servlet
> init()
> > > >>>>> method or from a static initializer; if Queue.add() is invoked
> from a
> > > >>>>> "regular" request thread, then it works properly.
> >
> > > >>>>> Vince
> >
> > > >>>>> On Tue, Nov 24, 2009 at 9:00 PM, Ikai L (Google) <
> [email protected]>wrote:
> >
> > > >>>>>> Hello App Engine Developers,
> >
> > > >>>>>> As part of our ongoing efforts to improve release quality and
> > > >>>>>> transparency, we will start prereleasing SDKs for early testing.
> We
> > > >>>>>> hope this gives developers a chance to participate in our
> release
> > > >>>>>> process by trying out new changes and sending feedback. As of
> this
> > > >>>>>> morning, the prerelease SDK for our next release, 1.2.8, is
> available
> > > >>>>>> in the familiar download location (note that the filename ends
> in
> > > >>>>>> 'prerelease.zip'):
> >
> > > >>>>>>http://code.google.com/p/googleappengine/downloads/list
> >
> > > >>>>>> If you're interested, please download and give it a try locally
> with
> > > >>>>>> your favorite App Engine code. Please note that, as a
> prerelease, this
> > > >>>>>> SDK is not yet supported and still subject to change. Thus,
> please
> > > >>>>>> don't take critical dependencies or make substantial changes to
> > > >>>>>> production apps based on this SDK.
> >
> > > >>>>>> Importantly, this prerelease is purely for the SDK and is
> intended for
> > > >>>>>> local testing and development in dev_appserver. The server-side
> of App
> > > >>>>>> Engine (our production environment) is not at 1.2.8, so
> deploying with
> > > >>>>>> this SDK is not yet supported. In the future, we might enable a
> > > >>>>>> complete SDK and server test environment for prereleases.
> >
> > > >>>>>> A few notes on 1.2.8 in particular - this release is primarily
> for
> > > >>>>>> servicing and updates in preparation for some exciting feature
> > > >>>>>> launches we have in the pipeline. The current release notes
> (still
> > > >>>>>> subject to change) are included below; these release notes do
> include
> > > >>>>>> changes which will only be available on the server side Admin
> Console
> > > >>>>>> (non-local) once 1.2.8 is formally released.
> >
> > > >>>>>> Please try 1.2.8 for local development and send us your
> feedback!
> >
> > > >>>>>> Thanks,
> >
> > > >>>>>> App Engine Team
> >
> > > >>>>>> Version 1.2.8
> > > >>>>>> =============
> > > >>>>>>  - Support for JAXB. JAXB is included in JDK 1.6 (and App
> Engine's
> > > >>>>>> production
> > > >>>>>>    servers). If you're using JDK 1.5 with your local
> dev_appserver,
> > > >>>>>> you will
> > > >>>>>>    need to include the JAXB libraries with your application to
> use
> > > >>>>>> it.
> > > >>>>>>
> http://code.google.com/p/googleappengine/issues/detail?id=1267
> > > >>>>>>  - Added Quota API (com.google.appengine.api.quota) to match
> Python
> > > >>>>>> API.
> > > >>>>>>  - Low-level Memcache API now supports grabTail() and
> batchIncrement
> > > >>>>>> ().
> > > >>>>>>  - HTTPResponse object now has getFinalUrl() method for 302
> > > >>>>>> redirects.
> > > >>>>>>
> http://code.google.com/p/googleappengine/issues/detail?id=1464
> > > >>>>>>  - Java Dev Appserver now automatically executes tasks.  If you
> > > >>>>>> prefer the old
> > > >>>>>>    behavior where tasks do not automatically execute you can use
> the
> > > >>>>>>      -Dtask_queue.disable_auto_task_execution flag when starting
> the
> > > >>>>>> server.
> > > >>>>>>  - Additional file extensions permitted when sending mail.
> > > >>>>>>
> http://code.google.com/p/googleappengine/issues/detail?id=494
> > > >>>>>>  - Fixed issue with Java mail handler not processing multipart
> > > >>>>>> messages
> > > >>>>>>    correctly.
> > > >>>>>>  - Fixed agent code included in appengine-local-runtime.jar
> results
> > > >>>>>> in
> > > >>>>>>    RuntimeException.
> > > >>>>>>
> http://code.google.com/p/googleappengine/issues/detail?id=2280
> > > >>>>>>  - Fixed issue with sort orders defined on properties that allow
> > > >>>>>> multiple
> > > >>>>>>    values.
> > > >>>>>>
> http://code.google.com/p/googleappengine/issues/detail?id=2349
> > > >>>>>>  - Fixed problem with dropped query strings after requiring
> log-in.
> > > >>>>>>
> http://code.google.com/p/googleappengine/issues/detail?id=2225
> > > >>>>>>  - Removed limitation preventing multiple parameters with the
> same
> > > >>>>>> name.
> > > >>>>>>
> http://code.google.com/p/googleappengine/issues/detail?id=2090
> > > >>>>>>  - Fixed issue with local datastore incorrectly sorting results
> of
> > > >>>>>> ancestor queries.
> > > >>>>>>
> http://code.google.com/p/googleappengine/issues/detail?id=2177
> > > >>>>>>  - New Index building status page in the Admin Console
> > > >>>>>>  - Task Queue now supports purging queues, and deleting tasks
> and
> > > >>>>>> queues via
> > > >>>>>>    the Admin Console.
> > > >>>>>>
> http://code.google.com/p/googleappengine/issues/detail?id=2159
> > > >>>>>>
> http://code.google.com/p/googleappengine/issues/detail?id=1740
> > > >>>>>>  - Over Quota HTTP status code changed from 403 to 503, other to
> 500.
> > > >>>>>>  - Task Queue now considers all HTTP 2xx status codes to
> represent
> > > >>>>>> success.
> >
> > > >>>>>> ORM Changes
> >
> > > >>>>>>  - Explicitly disallow multiple relationships of the same type
> >
> > > >>>>>>
> http://code.google.com/p/datanucleus-appengine/issues/detail?id=154
> > > >>>>>>  - Occasional ArrayOutOfBoundsIndexException
> >
> > > >>>>>>
> http://code.google.com/p/datanucleus-appengine/issues/detail?id=156
> > > >>>>>>  - Support inheritance
> >
> > > >>>>>>
> http://code.google.com/p/datanucleus-appengine/issues/detail?id=25
> > > >>>>>>  - Support != queries
> > > >>>>>>  - Support IN queries
> >
> > > >>>>>>
> http://code.google.com/p/datanucleus-appengine/issues/detail?id=39
> > > >>>>>>  - Inheritance is working for simple fields and embedded fields.
> > > >>>>>> Relationships
> > > >>>>>>    in base classes are completely untested and probably do not
> work.
> > > >>>>>>  - Cannot add child to existing one-to-many if parent has Long
> or
> > > >>>>>> unencoded String pk
> >
> > > >>>>>>
> http://code.google.com/p/datanucleus-appengine/issues/detail?id=28
> > > >>>>>>  - Can't query by embedded fields at depth > 1
> >
> > > >>>>>>
> http://code.google.com/p/datanucleus-appengine/issues/detail?id=120
> > > >>>>>>  - Positional parameters don't work (JPQL)
> >
> > > >>>>>>
> http://code.google.com/p/datanucleus-appengine/issues/detail?id=128
> > > >>>>>>  - Throw JDOCanRetryException when ConcurrentMod hit during txn
> > > >>>>>> commit
> >
> > > >>>>>>
> http://code.google.com/p/datanucleus-appengine/issues/detail?id=134
> > > >>>>>>  - Respect JDOQL/JPQL case sensitivity for keywords, in
> particular
> > > >>>>>> "count"
> >
> > > >>>>>>
> http://code.google.com/p/datanucleus-appengine/issues/detail?id=139
> > > >>>>>>  - Put all native datastore types in the default fetch group
> >
> > > >>>>>>
> http://code.google.com/p/datanucleus-appengine/issues/detail?id=143
> > > >>>>>>  - Empty Set gets loaded from datastore as null
> >
> > ...
> >
> > read more ยป
>
> --
>
> You received this message because you are subscribed to the Google Groups
> "Google App Engine for Java" group.
> To post to this group, send email to
> [email protected].
> To unsubscribe from this group, send email to
> [email protected]<google-appengine-java%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-appengine-java?hl=en.
>
>
>

--

You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.


Reply via email to