/*
 * Copyright 2015 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.appengine.samples;

// [START DeferredTaskTest]

import static org.junit.Assert.assertTrue;

import com.google.appengine.api.taskqueue.DeferredTask;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
import com.google.appengine.tools.development.testing.LocalTaskQueueTestConfig;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class DeferredTaskTest extends BaseTestConfiguration {

  // Unlike CountDownLatch, TaskCountDownlatch lets us reset.
  private static final LocalTaskQueueTestConfig.TaskCountDownLatch latch =
      new LocalTaskQueueTestConfig.TaskCountDownLatch(1);

  private final LocalServiceTestHelper helper =
      new LocalServiceTestHelper(new LocalTaskQueueTestConfig()
          .setDisableAutoTaskExecution(false) // Enable auto task execution
          .setCallbackClass(LocalTaskQueueTestConfig.DeferredTaskCallback.class)
          .setTaskExecutionLatch(latch));

  private static synchronized boolean requestAwait() throws InterruptedException {
    return latch.await(5, TimeUnit.SECONDS);
  }

  private static synchronized void requestReset() {
    latch.reset();
  }

  private static class MyTask implements DeferredTask {
    private static volatile boolean taskRan = false;

    @Override
    public void run() {
      taskRan = true;
    }
  }

  @Before
  public void setUp() {
    helper.setUp();
  }

  @After
  public void tearDown() {
    MyTask.taskRan = false;
    requestReset();
    helper.tearDown();
  }

  @Test
  public void testTaskGetsRun() throws InterruptedException {
    QueueFactory.getDefaultQueue().add(
        TaskOptions.Builder.withPayload(new MyTask()));
    assertTrue(requestAwait());
    assertTrue(MyTask.taskRan);
  }
}
// [END DeferredTaskTest]

@@ -1402,16 +1402,23 @@
 private 
+static 
 final Lo
@@ -1480,16 +1480,27 @@
 tHelper(
+%0A          
 new Loca
@@ -1522,16 +1522,20 @@
 onfig()%0A
+    
         
@@ -1608,24 +1608,28 @@
 n%0A          
+ 
+   
 .setCallback
@@ -1687,16 +1687,20 @@
 .class)%0A
+    
         
@@ -1935,32 +1935,190 @@
 h.reset();%0A  %7D%0A%0A
+  private static synchronized void helperSetUp() %7B%0A    helper.setUp();%0A  %7D%0A%0A  private static synchronized void helperTearDown() %7B%0A    helper.tearDown();%0A  %7D%0A%0A
   private static
@@ -2318,34 +2318,33 @@
 p() %7B%0A    helper
-.s
+S
 etUp();%0A  %7D%0A%0A  @
@@ -2426,34 +2426,33 @@
 et();%0A    helper
-.t
+T
 earDown();%0A  %7D%0A%0A
@@ -2517,24 +2517,24 @@
 Exception %7B%0A
+
     QueueFac
@@ -2560,25 +2560,16 @@
 e().add(
-%0A        
 TaskOpti

extend timeout (#5697)