Merge "QueryIT: Add test for timestamp in query with output in text format"
diff --git a/gerrit-acceptance-tests/BUCK b/gerrit-acceptance-tests/BUCK
index 3f7e04f..d14bae2 100644
--- a/gerrit-acceptance-tests/BUCK
+++ b/gerrit-acceptance-tests/BUCK
@@ -33,6 +33,7 @@
     '//lib/guice:guice',
     '//lib/guice:guice-assistedinject',
     '//lib/guice:guice-servlet',
+    '//lib/joda:joda-time',
     '//lib/log:api',
     '//lib/jgit/org.eclipse.jgit:jgit',
     '//lib/mail:mail',
diff --git a/gerrit-acceptance-tests/BUILD b/gerrit-acceptance-tests/BUILD
index 71b1b45..66ce1b5 100644
--- a/gerrit-acceptance-tests/BUILD
+++ b/gerrit-acceptance-tests/BUILD
@@ -34,6 +34,7 @@
     '//lib/guice:guice',
     '//lib/guice:guice-assistedinject',
     '//lib/guice:guice-servlet',
+    '//lib/joda:joda-time',
     '//lib/log:api',
     '//lib/jgit/org.eclipse.jgit:jgit',
     '//lib/mina:sshd',
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/QueryIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/QueryIT.java
index 2865ff87..e80726a 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/QueryIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/QueryIT.java
@@ -17,7 +17,11 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assert_;
 import static com.google.gerrit.acceptance.GitUtil.initSsh;
+import static com.google.gerrit.server.query.change.OutputStreamQuery.TIMESTAMP_FORMAT;
+import static java.util.concurrent.TimeUnit.SECONDS;
 
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Splitter;
 import com.google.common.collect.Lists;
 import com.google.gerrit.acceptance.AbstractDaemonTest;
 import com.google.gerrit.acceptance.NoHttpd;
@@ -27,8 +31,13 @@
 import com.google.gerrit.extensions.api.changes.ReviewInput;
 import com.google.gerrit.extensions.client.Side;
 import com.google.gerrit.server.data.ChangeAttribute;
+import com.google.gerrit.testutil.TestTimeUtil;
 import com.google.gson.Gson;
 
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 import java.util.ArrayList;
@@ -40,6 +49,20 @@
 
   private static Gson gson = new Gson();
 
+  private String systemTimeZone;
+
+  @Before
+  public void setTimeForTesting() {
+    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+  }
+
+  @After
+  public void resetTime() {
+    TestTimeUtil.useSystemTime();
+    System.setProperty("user.timezone", systemTimeZone);
+  }
+
   @Test
   public void testBasicQueryJSON() throws Exception {
     String changeId1 = createChange().getChangeId();
@@ -323,6 +346,45 @@
     userSession.close();
   }
 
+  @Test
+  public void testTimestampInTextQuery() throws Exception {
+    DateTimeFormatter dtf = DateTimeFormat.forPattern(TIMESTAMP_FORMAT);
+    String createdOnKey = "createdOn:";
+    PushOneCommit.Result result = createChange();
+    String textResult = executeSuccessfulTextQuery(result.getChangeId());
+    assertThat(textResult).isNotNull();
+    assertThat(textResult).contains(createdOnKey);
+    String value = getValueFromText(textResult, createdOnKey);
+    assertThat(value).isNotNull();
+    assertThat(value).isEqualTo("2009-09-30 14:00:02 PDT");
+    long expectedCreatedOn = result.getChange().change().getCreatedOn().getTime();
+    assertThat(dtf.parseMillis(value)).isEqualTo(expectedCreatedOn);
+  }
+
+  private String getValueFromText(String text, String key) {
+    Splitter s = Splitter.on(CharMatcher.is('\n')).trimResults().omitEmptyStrings();
+    for (String line : s.splitToList(text)) {
+      if (line.startsWith(key)) {
+        return line.substring(key.length()).trim();
+      }
+    }
+    return null;
+  }
+
+  private String executeSuccessfulTextQuery(String params, SshSession session)
+      throws Exception {
+    String rawResponse =
+        session.exec("gerrit query --format=TEXT " + params);
+    assert_().withFailureMessage(session.getError())
+        .that(session.hasError()).isFalse();
+    return rawResponse;
+  }
+
+  private String executeSuccessfulTextQuery(String params)
+      throws Exception {
+    return executeSuccessfulTextQuery(params, adminSshSession);
+  }
+
   private List<ChangeAttribute> executeSuccessfulQuery(String params,
       SshSession session) throws Exception {
     String rawResponse =
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OutputStreamQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
index 5e08ee3..4586df7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
@@ -63,11 +63,13 @@
  * command.
  */
 public class OutputStreamQuery {
+  public static final String TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss zzz";
+
   private static final Logger log =
       LoggerFactory.getLogger(OutputStreamQuery.class);
 
   private static final DateTimeFormatter dtf =
-      DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss zzz");
+      DateTimeFormat.forPattern(TIMESTAMP_FORMAT);
 
   public enum OutputFormat {
     TEXT, JSON