@Test(timeout = 2000)
 public void testDelete1() {
   ClientMessage cm1 =
       new ClientMessage()
           .setType(ClientMessage.Type.CREATE)
           .setAuthor("AdnanAziz")
           .setSubject("First")
           .setTime(100);
   ClientMessage cm2 =
       new ClientMessage()
           .setType(ClientMessage.Type.CREATE)
           .setAuthor("AdnanAziz")
           .setSubject("First")
           .setTime(200);
   ClientMessage cm3 =
       new ClientMessage()
           .setType(ClientMessage.Type.CREATE)
           .setAuthor("AdnanAziz")
           .setSubject("First")
           .setTime(300);
   ClientMessage cm4 = new ClientMessage().setType(ClientMessage.Type.DELETE).setId(1);
   ClientMessage cmQuery = new ClientMessage().setType(ClientMessage.Type.QUERY);
   ServerMessage result = doTxRx(cm1, cm2, cm4, cmQuery);
   assertEquals("LisaHua", result.getPostings().get(0).getAuthor());
   assertEquals("AdnanAziz", result.getPostings().get(1).getAuthor());
 }
 @Test(timeout = 2000)
 public void testAdd2() {
   ClientMessage cm =
       new ClientMessage()
           .setType(ClientMessage.Type.CREATE)
           .setAuthor("AdnanAziz1968")
           .setSubject("Hello World")
           .setBody("My first posting!");
   ServerMessage result = doTxRx(cm, cm, cm);
   assertEquals(result.getId(), 2);
   score += 5;
 }
  @Test(timeout = 5000)
  public void testStress1() {
    List<ClientMessage> cmArray = new ArrayList<ClientMessage>();
    int N = 1000;
    for (int i = 0; i < N; i++) {
      cmArray.add(
          new ClientMessage()
              .setType(ClientMessage.Type.CREATE)
              .setAuthor("AdnanAziz1968")
              .setSubject("Stressing...")
              .setBody("Hello World for the " + i + "-th time"));
    }
    ServerMessage result = doTxRx(cmArray);

    assertEquals(result.getId(), N - 1);
    score += 5;
  }
  @Test(timeout = 2000)
  public void testPagination1() {
    ClientMessage cm1 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("AdnanAziz")
            .setSubject("First")
            .setTime(100);
    ClientMessage cm2 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("AdnanAziz")
            .setSubject("Second")
            .setSubject("Random body")
            .setTime(200);
    ClientMessage cm3 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("AdnanAziz")
            .setSubject("Third")
            .setTime(300);
    ClientMessage cmQuery = new ClientMessage().setType(ClientMessage.Type.QUERY).setPageSize(2);
    ServerMessage result = doTxRx(cm1, cm2, cm2, cmQuery);

    assertEquals(2, result.getPostings().size());
    assertEquals("Third", result.getPostings().get(0).getSubject());
    assertEquals("Second", result.getPostings().get(1).getSubject());
    score += 5;

    cmQuery = new ClientMessage().setType(ClientMessage.Type.QUERY).setPageSize(2).setPageOffset(1);

    result = doTxRx(cm1, cm2, cm3, cmQuery);
    assertEquals(2, result.getPostings().size());
    assertEquals("Second", result.getPostings().get(0).getSubject());
    assertEquals("First", result.getPostings().get(1).getSubject());
    score += 5;

    cmQuery =
        new ClientMessage()
            .setType(ClientMessage.Type.QUERY)
            .setPageSize(2)
            .setSubject("Second")
            .setPageOffset(1);

    result = doTxRx(cm1, cm2, cm3, cmQuery);
    assertEquals(1, result.getPostings().size());
    assertEquals("Second", result.getPostings().get(0).getSubject());
    score += 5;
  }
  @Test(timeout = 1000)
  public void testTimeRangeQuery1() {
    ClientMessage cm1 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setDate(1L)
            .setAuthor("AdnanAziz1968")
            .setSubject("Hello World")
            .setBody("My first posting!");
    ClientMessage cm2 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setDate(100L)
            .setAuthor("AdnanAziz1968")
            .setSubject("Hello Cruel World")
            .setBody("My second posting!");
    ClientMessage cm3 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setDate(250L)
            .setAuthor("AdnanAziz1968")
            .setSubject("Goodbye Wonderful World")
            .setBody("My third posting!");
    ClientMessage cm4 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setDate(200L)
            .setAuthor("AdnanAziz1968")
            .setSubject("Goodbye Cruel World")
            .setBody("My fourth posting!");
    ClientMessage cm5 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setDate(1000L)
            .setAuthor("AdnanAziz1968")
            .setSubject("Hello World")
            .setBody("My fifth posting!");
    ClientMessage cmTimeQuery =
        new ClientMessage().setType(ClientMessage.Type.QUERY).setDateStart(100L).setDateEnd(200L);
    ServerMessage result = doTxRx(cm1, cm2, cm3, cm4, cm5, cmTimeQuery);
    assertEquals(3, result.getPostings().size());
    assertEquals("My third posting", result.getPostings().get(0));
    assertEquals("My middle posting", result.getPostings().get(1));
    assertEquals("My second posting", result.getPostings().get(2));

    ClientMessage cmTimeAndSubjectQuery =
        new ClientMessage()
            .setType(ClientMessage.Type.QUERY)
            .setDateStart(100L)
            .setDateEnd(200L)
            .setSubject("Cruel");

    result = doTxRx(cm1, cm2, cm3, cm4, cm5, cmTimeAndSubjectQuery);
    assertEquals(2, result.getPostings().size());
    assertEquals("My third posting", result.getPostings().get(0));
    assertEquals("My second posting", result.getPostings().get(1));
  }
  @Test(timeout = 5000)
  public void testQuery1() {
    ClientMessage cmAdd1 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("AdnanAziz1968")
            .setSubject("Hello World")
            .setBody("My first posting!");

    ClientMessage cmAdd2 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("Don Bradman")
            .setSubject("29")
            .setBody("Still the greatest!");

    ClientMessage cmAdd3 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("AdnanAziz1968")
            .setSubject("Random musings")
            .setBody("My second posting!");

    ClientMessage cmQuery =
        new ClientMessage().setType(ClientMessage.Type.QUERY).setAuthor("AdnanAziz1968");

    ServerMessage result = doTxRx(cmAdd1, cmAdd2, cmAdd3, cmQuery);

    assertEquals(result.getPostings().size(), 2);
    for (Posting p : result.getPostings()) {
      assert (p.getAuthor().equals(cmQuery.getAuthor()));
    }

    ClientMessage cmBodyQuery =
        new ClientMessage().setType(ClientMessage.Type.QUERY).setBody("posting My");
    assertEquals(2, result.getPostings().size());
    for (Posting p : result.getPostings()) {
      assertTrue(p.getBody().contains("My"));
      assertTrue(p.getBody().contains("posting"));
    }
    score += 15;
  }
  @Test(timeout = 2000)
  public void testUpdate1() {

    ClientMessage cm1 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("AdnanAziz1968")
            .setSubject("First");
    ClientMessage cm2 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("AdnanAziz1968")
            .setSubject("Second");
    ClientMessage cm3 =
        new ClientMessage().setType(ClientMessage.Type.UPDATE).setId(0).setSubject("New First");
    ClientMessage cm4 = new ClientMessage().setType(ClientMessage.Type.QUERYBYID).setId(0);
    ServerMessage result = doTxRx(cm1, cm2, cm3, cm4);
    assertEquals("New First", result.getPostings().get(0).getSubject());
    score += 10;
  }
  @Test(timeout = 2000)
  public void testLikes1() {

    ClientMessage cm1 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("AdnanAziz")
            .setSubject("First");
    ClientMessage cm2 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("AngLi")
            .setSubject("Second");
    ClientMessage cm3 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("LisaHua")
            .setSubject("Third");
    ClientMessage cm4 = new ClientMessage().setType(ClientMessage.Type.LIKE).setId(0);
    ServerMessage result = doTxRx(cm1, cm2, cm3, cm4);
    assertEquals(1, result.getPostings().get(0).getAuthorLikes());
    score += 10;
  }
  @Test(timeout = 2000)
  public void testUpvotesAndTrending1() {
    ClientMessage cm1 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("AdnanAziz")
            .setSubject("First")
            .setTime(100);
    ClientMessage cm2 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("AngLi")
            .setSubject("Second")
            .setTime(200 + 3600 * 1000);
    ClientMessage cm3 =
        new ClientMessage()
            .setType(ClientMessage.Type.CREATE)
            .setAuthor("LisaHua")
            .setSubject("Third")
            .setTime(300 + 3600 * 1000);
    ClientMessage cm4 = new ClientMessage().setType(ClientMessage.Type.UPVOTE).setId(2);
    ClientMessage cm5 = new ClientMessage().setType(ClientMessage.Type.UPVOTE).setId(1);
    ClientMessage cm6 = new ClientMessage().setType(ClientMessage.Type.UPVOTE).setId(2);
    ServerMessage result = doTxRx(cm1, cm2, cm3, cm4, cm5, cm6);
    // postings are ordered by decreasing posting time
    assertEquals(2, result.getPostings().get(0).getAuthorLikes());
    assertEquals(1, result.getPostings().get(1).getAuthorLikes());
    assertEquals(0, result.getPostings().get(2).getAuthorLikes());
    ClientMessage cm7 = new ClientMessage().setType(ClientMessage.Type.TRENDING);
    score += 10;

    result = doTxRx(cm1, cm2, cm3, cm4, cm5, cm6, cm7);
    assertEquals("LisaHua", result.getPostings().get(0).getAuthor());
    assertEquals("AngLi", result.getPostings().get(1).getAuthor());

    score += 10;
  }
 @Test(timeout = 2000)
 public void testDistanceQuery1() {
   List<ClientMessage> cmArray = new ArrayList<ClientMessage>();
   int N = 100;
   for (int i = 0; i < N; i++) {
     cmArray.add(
         new ClientMessage()
             .setType(ClientMessage.Type.CREATE)
             .setAuthor("AdnanAziz1968")
             .setSubject("Distancing...")
             .setBody("Coordinates of " + i + "," + i + "-th time")
             .setLatitude((double) i)
             .setLongitude((double) i));
   }
   cmArray.add(
       new ClientMessage()
           .setType(ClientMessage.Type.QUERY)
           .setLatitude(50.0d)
           .setLongitude(50.0d)
           .setDistance(2.0d));
   ServerMessage result = doTxRx(cmArray);
   assertEquals(2, result.getPostings());
   score += 10;
 }