Skip to content

Commit c9640d6

Browse files
committed
Add more tests, check key order boundary conditions
1 parent f1a25c7 commit c9640d6

File tree

2 files changed

+261
-7
lines changed
  • firebase-database/src

2 files changed

+261
-7
lines changed

firebase-database/src/androidTest/java/com/google/firebase/database/QueryTest.java

Lines changed: 260 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ public void setVariousLimitsEnsureDataIsCorrect()
552552
ValueExpectationHelper expectations = new ValueExpectationHelper();
553553
expectations.add(ref.limitToLast(1), new MapBuilder().put("c", 3L).build());
554554
expectations.add(ref.endAt(null).limitToLast(1), new MapBuilder().put("c", 3L).build());
555-
// expectations.add(ref.endBefore(null).limitToLast(1), null);
555+
expectations.add(ref.endBefore(null).limitToLast(1), null);
556556
expectations.add(ref.limitToLast(2), new MapBuilder().put("b", 2L).put("c", 3L).build());
557557
expectations.add(
558558
ref.limitToLast(3), new MapBuilder().put("a", 1L).put("b", 2L).put("c", 3L).build());
@@ -1422,7 +1422,6 @@ public void startAtEndAtWithPriorityWorks() throws DatabaseException, Interrupte
14221422
helper.waitForEvents();
14231423
}
14241424

1425-
// TODO(wyszynski): endBefore
14261425
@Test
14271426
public void startAfterEndAtWithPriorityWorks() throws DatabaseException, InterruptedException {
14281427
DatabaseReference ref = IntegrationTestHelpers.getRandomNode();
@@ -1471,8 +1470,8 @@ public void startAfterEndBeforeWithPriorityWorks()
14711470
ValueExpectationHelper helper = new ValueExpectationHelper();
14721471
helper.add(
14731472
ref.startAfter("w").endBefore("z"), new MapBuilder().put("c", 3L).put("b", 2L).build());
1474-
// helper.add(ref.startAfter("w").endBefore("w"), null);
1475-
// helper.add(ref.startAfter("a").endBefore("c"), null);
1473+
helper.add(ref.startAfter("w").endBefore("w"), null);
1474+
helper.add(ref.startAfter("a").endBefore("c"), null);
14761475
Semaphore semaphore = new Semaphore(0);
14771476
ref.setValue(
14781477
new MapBuilder()
@@ -1515,7 +1514,6 @@ public void startAtEndAtWithPriorityWorksWithServerData()
15151514
helper.waitForEvents();
15161515
}
15171516

1518-
// TODO(wyszynski): endBefore
15191517
@Test
15201518
public void startAfterEndAtWithPriorityWorksWithServerData()
15211519
throws DatabaseException, InterruptedException {
@@ -1537,6 +1535,48 @@ public void startAfterEndAtWithPriorityWorksWithServerData()
15371535
helper.waitForEvents();
15381536
}
15391537

1538+
@Test
1539+
public void startAtEndBeforeWithPriorityWorksWithServerData()
1540+
throws DatabaseException, InterruptedException {
1541+
DatabaseReference ref = IntegrationTestHelpers.getRandomNode();
1542+
1543+
ref.setValue(
1544+
new MapBuilder()
1545+
.put("a", new MapBuilder().put(".value", 1).put(".priority", "z").build())
1546+
.put("b", new MapBuilder().put(".value", 2).put(".priority", "y").build())
1547+
.put("c", new MapBuilder().put(".value", 3).put(".priority", "x").build())
1548+
.put("d", new MapBuilder().put(".value", 4).put(".priority", "w").build())
1549+
.build());
1550+
1551+
ValueExpectationHelper helper = new ValueExpectationHelper();
1552+
helper.add(ref.startAt("w").endBefore("y"), new MapBuilder().put("d", 4L).put("c", 3L).build());
1553+
helper.add(ref.startAt("w").endBefore("x"), new MapBuilder().put("d", 4L).build());
1554+
helper.add(ref.startAt("a").endBefore("c"), null);
1555+
1556+
helper.waitForEvents();
1557+
}
1558+
1559+
@Test
1560+
public void startAfterEndBeforeWithPriorityWorksWithServerData()
1561+
throws DatabaseException, InterruptedException {
1562+
DatabaseReference ref = IntegrationTestHelpers.getRandomNode();
1563+
1564+
ref.setValue(
1565+
new MapBuilder()
1566+
.put("a", new MapBuilder().put(".value", 1).put(".priority", "z").build())
1567+
.put("b", new MapBuilder().put(".value", 2).put(".priority", "y").build())
1568+
.put("c", new MapBuilder().put(".value", 3).put(".priority", "x").build())
1569+
.put("d", new MapBuilder().put(".value", 4).put(".priority", "w").build())
1570+
.build());
1571+
1572+
ValueExpectationHelper helper = new ValueExpectationHelper();
1573+
helper.add(ref.startAfter("w").endBefore("y"), new MapBuilder().put("c", 3L).build());
1574+
helper.add(ref.startAfter("w").endBefore("x"), null);
1575+
helper.add(ref.startAfter("a").endBefore("c"), null);
1576+
1577+
helper.waitForEvents();
1578+
}
1579+
15401580
@Test
15411581
public void startAtEndAtWithPriorityAndNameWorks()
15421582
throws DatabaseException, InterruptedException {
@@ -3481,7 +3521,6 @@ public void onCancelled(DatabaseError error) {}
34813521
assertEquals("a", removedSecond.get(0));
34823522
}
34833523

3484-
// TODO(wyszynski): endBefore
34853524
@Test
34863525
public void correctlyGetEventsForStartAfterEndAtQueriesWhenPriorityChanges()
34873526
throws DatabaseException, TestFailure, ExecutionException, TimeoutException,
@@ -3568,6 +3607,93 @@ public void onCancelled(DatabaseError error) {}
35683607
assertEquals("a", removedSecond.get(0));
35693608
}
35703609

3610+
@Test
3611+
public void correctlyGetEventsForStartAtEndBeforeQueriesWhenPriorityChanges()
3612+
throws DatabaseException, TestFailure, ExecutionException, TimeoutException,
3613+
InterruptedException {
3614+
DatabaseReference ref = IntegrationTestHelpers.getRandomNode();
3615+
3616+
final List<String> addedFirst = new ArrayList<String>();
3617+
final List<String> removedFirst = new ArrayList<String>();
3618+
final List<String> addedSecond = new ArrayList<String>();
3619+
final List<String> removedSecond = new ArrayList<String>();
3620+
3621+
ref.startAt(0)
3622+
.endBefore(10)
3623+
.addChildEventListener(
3624+
new ChildEventListener() {
3625+
@Override
3626+
public void onChildAdded(DataSnapshot snapshot, String previousChildName) {
3627+
addedFirst.add(snapshot.getKey());
3628+
}
3629+
3630+
@Override
3631+
public void onChildChanged(DataSnapshot snapshot, String previousChildName) {
3632+
// No-op
3633+
}
3634+
3635+
@Override
3636+
public void onChildRemoved(DataSnapshot snapshot) {
3637+
removedFirst.add(snapshot.getKey());
3638+
}
3639+
3640+
@Override
3641+
public void onChildMoved(DataSnapshot snapshot, String previousChildName) {
3642+
// No-op
3643+
}
3644+
3645+
@Override
3646+
public void onCancelled(DatabaseError error) {}
3647+
});
3648+
3649+
ref.startAt(10)
3650+
.endBefore(20)
3651+
.addChildEventListener(
3652+
new ChildEventListener() {
3653+
@Override
3654+
public void onChildAdded(DataSnapshot snapshot, String previousChildName) {
3655+
addedSecond.add(snapshot.getKey());
3656+
}
3657+
3658+
@Override
3659+
public void onChildChanged(DataSnapshot snapshot, String previousChildName) {
3660+
// No-op
3661+
}
3662+
3663+
@Override
3664+
public void onChildRemoved(DataSnapshot snapshot) {
3665+
removedSecond.add(snapshot.getKey());
3666+
}
3667+
3668+
@Override
3669+
public void onChildMoved(DataSnapshot snapshot, String previousChildName) {
3670+
// No-op
3671+
}
3672+
3673+
@Override
3674+
public void onCancelled(DatabaseError error) {}
3675+
});
3676+
3677+
ref.child("a").setValue("a", 5);
3678+
ref.child("a").setValue("a", 15);
3679+
ref.child("a").setValue("a", 10);
3680+
ref.child("a").setValue("a", 20);
3681+
new WriteFuture(ref.child("a"), "a", 5).timedGet();
3682+
3683+
assertEquals(2, addedFirst.size());
3684+
assertEquals("a", addedFirst.get(0));
3685+
assertEquals("a", addedFirst.get(1));
3686+
3687+
assertEquals(1, removedFirst.size());
3688+
assertEquals("a", removedFirst.get(0));
3689+
3690+
assertEquals(1, addedSecond.size());
3691+
assertEquals("a", addedSecond.get(0));
3692+
3693+
assertEquals(1, removedSecond.size());
3694+
assertEquals("a", removedSecond.get(0));
3695+
}
3696+
35713697
@Test
35723698
public void behavesWithDivergingQueries()
35733699
throws DatabaseException, TestFailure, ExecutionException, TimeoutException,
@@ -3741,6 +3867,45 @@ public void onCancelled(DatabaseError error) {}
37413867
IntegrationTestHelpers.waitFor(done);
37423868
}
37433869

3870+
@Test
3871+
public void integerKeysBehaveNumericallyEndBefore()
3872+
throws InterruptedException, TestFailure, TimeoutException {
3873+
final DatabaseReference ref = IntegrationTestHelpers.getRandomNode();
3874+
final Semaphore done = new Semaphore(0);
3875+
ref.setValue(
3876+
new MapBuilder()
3877+
.put("1", true)
3878+
.put("50", true)
3879+
.put("550", true)
3880+
.put("6", true)
3881+
.put("600", true)
3882+
.put("70", true)
3883+
.put("8", true)
3884+
.put("80", true)
3885+
.build(),
3886+
new DatabaseReference.CompletionListener() {
3887+
@Override
3888+
public void onComplete(DatabaseError error, DatabaseReference ref) {
3889+
ref.endBefore(null, "10")
3890+
.addListenerForSingleValueEvent(
3891+
new ValueEventListener() {
3892+
@Override
3893+
public void onDataChange(DataSnapshot snapshot) {
3894+
Map<String, Object> expected =
3895+
new MapBuilder().put("1", true).put("6", true).put("8", true).build();
3896+
DeepEquals.assertEquals(expected, snapshot.getValue());
3897+
done.release();
3898+
}
3899+
3900+
@Override
3901+
public void onCancelled(DatabaseError error) {}
3902+
});
3903+
}
3904+
});
3905+
3906+
IntegrationTestHelpers.waitFor(done);
3907+
}
3908+
37443909
@Test
37453910
public void integerKeysBehaveNumericallyWithStartAfterOverflow()
37463911
throws InterruptedException, TestFailure, TimeoutException {
@@ -3779,6 +3944,95 @@ public void onCancelled(DatabaseError error) {}
37793944
IntegrationTestHelpers.waitFor(done);
37803945
}
37813946

3947+
@Test
3948+
public void integerKeysBehaveNumericallyWithEndBeforeUnderflow()
3949+
throws InterruptedException, TestFailure, TimeoutException {
3950+
final DatabaseReference ref = IntegrationTestHelpers.getRandomNode();
3951+
final Semaphore done = new Semaphore(0);
3952+
ref.setValue(
3953+
new MapBuilder()
3954+
.put(String.valueOf(Integer.MIN_VALUE), true)
3955+
.put("80", true)
3956+
.put("1", true)
3957+
.put("50", true)
3958+
.put("550", true)
3959+
.put("6", true)
3960+
.put("600", true)
3961+
.put("70", true)
3962+
.put("8", true)
3963+
.build(),
3964+
new DatabaseReference.CompletionListener() {
3965+
@Override
3966+
public void onComplete(DatabaseError error, DatabaseReference ref) {
3967+
ref.endBefore(null, String.valueOf(Integer.MIN_VALUE))
3968+
.addListenerForSingleValueEvent(
3969+
new ValueEventListener() {
3970+
@Override
3971+
public void onDataChange(DataSnapshot snapshot) {
3972+
DeepEquals.assertEquals(null, snapshot.getValue());
3973+
done.release();
3974+
}
3975+
3976+
@Override
3977+
public void onCancelled(DatabaseError error) {}
3978+
});
3979+
}
3980+
});
3981+
3982+
IntegrationTestHelpers.waitFor(done);
3983+
}
3984+
3985+
@Test
3986+
public void integerKeysBehaveNumericallyWithEndBeforeMinLex()
3987+
throws InterruptedException, TestFailure, TimeoutException {
3988+
final DatabaseReference ref = IntegrationTestHelpers.getRandomNode();
3989+
final Semaphore done = new Semaphore(0);
3990+
ref.setValue(
3991+
new MapBuilder()
3992+
.put(String.valueOf(Integer.MAX_VALUE), true)
3993+
.put("80", true)
3994+
.put("1", true)
3995+
.put("50", true)
3996+
.put("550", true)
3997+
.put("6", true)
3998+
.put("600", true)
3999+
.put("70", true)
4000+
.put("8", true)
4001+
.put("a", true)
4002+
.build(),
4003+
new DatabaseReference.CompletionListener() {
4004+
@Override
4005+
public void onComplete(DatabaseError error, DatabaseReference ref) {
4006+
ref.endBefore(null, String.valueOf(/* MIN_PUSH_CHAR = */ '-'))
4007+
.addListenerForSingleValueEvent(
4008+
new ValueEventListener() {
4009+
@Override
4010+
public void onDataChange(DataSnapshot snapshot) {
4011+
DeepEquals.assertEquals(
4012+
snapshot.getValue(),
4013+
new MapBuilder()
4014+
.put(String.valueOf(Integer.MAX_VALUE), true)
4015+
.put("80", true)
4016+
.put("1", true)
4017+
.put("50", true)
4018+
.put("550", true)
4019+
.put("6", true)
4020+
.put("600", true)
4021+
.put("70", true)
4022+
.put("8", true)
4023+
.build());
4024+
done.release();
4025+
}
4026+
4027+
@Override
4028+
public void onCancelled(DatabaseError error) {}
4029+
});
4030+
}
4031+
});
4032+
4033+
IntegrationTestHelpers.waitFor(done);
4034+
}
4035+
37824036
@Test
37834037
public void integerKeysBehaveNumerically2()
37844038
throws InterruptedException, TestFailure, TimeoutException {

firebase-database/src/main/java/com/google/firebase/database/Query.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ public Query endBefore(boolean value) {
531531
public Query endBefore(@Nullable String value, @Nullable String key) {
532532
Node node =
533533
value != null ? new StringNode(value, PriorityUtilities.NullPriority()) : EmptyNode.Empty();
534-
return endAt(node, key);
534+
return endBefore(node, key);
535535
}
536536

537537
/**

0 commit comments

Comments
 (0)