3535import com .google .gcloud .datastore .StructuredQuery .PropertyFilter ;
3636import com .google .gcloud .datastore .testing .LocalGcdHelper ;
3737import com .google .gcloud .spi .DatastoreRpc ;
38+ import com .google .gcloud .spi .DatastoreRpc .DatastoreRpcException ;
3839import com .google .gcloud .spi .DatastoreRpc .DatastoreRpcException .Reason ;
3940import com .google .gcloud .spi .DatastoreRpcFactory ;
4041
4950import org .junit .runners .JUnit4 ;
5051
5152import java .io .IOException ;
53+ import java .util .ArrayList ;
5254import java .util .Collections ;
55+ import java .util .HashSet ;
5356import java .util .Iterator ;
5457import java .util .List ;
58+ import java .util .Set ;
5559
5660@ RunWith (JUnit4 .class )
5761public class DatastoreTest {
@@ -520,7 +524,7 @@ public void testGet() {
520524 }
521525
522526 @ Test
523- public void testGetArray () {
527+ public void testGetArrayNoDeferredResults () {
524528 datastore .put (ENTITY3 );
525529 Iterator <Entity > result =
526530 datastore .fetch (KEY1 , Key .builder (KEY1 ).name ("bla" ).build (), KEY2 , KEY3 ).iterator ();
@@ -546,7 +550,85 @@ public void testGetArray() {
546550 // expected - no such property
547551 }
548552 assertFalse (result .hasNext ());
549- // TODO(ozarov): construct a test to verify more results
553+ }
554+
555+ public void testGetArrayDeferredResults () throws DatastoreRpcException {
556+ Set <Key > requestedKeys = new HashSet <>();
557+ requestedKeys .add (KEY1 );
558+ requestedKeys .add (KEY2 );
559+ requestedKeys .add (KEY3 );
560+ requestedKeys .add (KEY4 );
561+ requestedKeys .add (KEY5 );
562+ Iterator <Entity > iter = createDatastoreForDeferredLookup ().get (KEY1 , KEY2 , KEY3 , KEY4 , KEY5 );
563+ Set <Key > keysOfFoundEntities = new HashSet <>();
564+ while (iter .hasNext ()) {
565+ keysOfFoundEntities .add (iter .next ().key ());
566+ }
567+ assertEquals (requestedKeys , keysOfFoundEntities );
568+ }
569+
570+ public void testFetchArrayDeferredResults () throws DatastoreRpcException {
571+ List <Entity > foundEntities =
572+ createDatastoreForDeferredLookup ().fetch (KEY1 , KEY2 , KEY3 , KEY4 , KEY5 );
573+ assertEquals (foundEntities .get (0 ).key (), KEY1 );
574+ assertEquals (foundEntities .get (1 ).key (), KEY2 );
575+ assertEquals (foundEntities .get (2 ).key (), KEY3 );
576+ assertEquals (foundEntities .get (3 ).key (), KEY4 );
577+ assertEquals (foundEntities .get (4 ).key (), KEY5 );
578+ assertEquals (foundEntities .size (), 5 );
579+ }
580+
581+ private Datastore createDatastoreForDeferredLookup () throws DatastoreRpcException {
582+ List <DatastoreV1 .Key > keysPb = new ArrayList <>();
583+ keysPb .add (KEY1 .toPb ());
584+ keysPb .add (KEY2 .toPb ());
585+ keysPb .add (KEY3 .toPb ());
586+ keysPb .add (KEY4 .toPb ());
587+ keysPb .add (KEY5 .toPb ());
588+ List <DatastoreV1 .LookupRequest > lookupRequests = new ArrayList <>();
589+ lookupRequests .add (DatastoreV1 .LookupRequest .newBuilder ().addAllKey (keysPb ).build ());
590+ lookupRequests .add (
591+ DatastoreV1 .LookupRequest .newBuilder ()
592+ .addKey (keysPb .get (2 ))
593+ .addKey (keysPb .get (3 ))
594+ .addKey (keysPb .get (5 ))
595+ .build ());
596+ lookupRequests .add (DatastoreV1 .LookupRequest .newBuilder ().addKey (keysPb .get (5 )).build ());
597+ Entity entity4 = Entity .builder (KEY4 ).set ("value" , StringValue .of ("value" )).build ();
598+ Entity entity5 = Entity .builder (KEY5 ).set ("value" , "value" ).build ();
599+ List <DatastoreV1 .LookupResponse > lookupResponses = new ArrayList <>();
600+ lookupResponses .add (
601+ DatastoreV1 .LookupResponse .newBuilder ()
602+ .addFound (EntityResult .newBuilder ().setEntity (ENTITY1 .toPb ()))
603+ .addFound (EntityResult .newBuilder ().setEntity (entity4 .toPb ()))
604+ .addDeferred (keysPb .get (2 ))
605+ .addDeferred (keysPb .get (3 ))
606+ .addDeferred (keysPb .get (5 ))
607+ .build ());
608+ lookupResponses .add (
609+ DatastoreV1 .LookupResponse .newBuilder ()
610+ .addFound (EntityResult .newBuilder ().setEntity (ENTITY3 .toPb ()))
611+ .addFound (EntityResult .newBuilder ().setEntity (entity4 .toPb ()))
612+ .addDeferred (keysPb .get (5 ))
613+ .build ());
614+ lookupResponses .add (
615+ DatastoreV1 .LookupResponse .newBuilder ()
616+ .addFound (EntityResult .newBuilder ().setEntity (entity5 .toPb ()))
617+ .build ());
618+ DatastoreRpcFactory rpcFactoryMock = EasyMock .createStrictMock (DatastoreRpcFactory .class );
619+ DatastoreRpc rpcMock = EasyMock .createStrictMock (DatastoreRpc .class );
620+ EasyMock .expect (rpcFactoryMock .create (EasyMock .anyObject (DatastoreOptions .class )))
621+ .andReturn (rpcMock );
622+ for (int i = 0 ; i < lookupRequests .size (); i ++) {
623+ EasyMock .expect (rpcMock .lookup (lookupRequests .get (i ))).andReturn (lookupResponses .get (i ));
624+ }
625+ EasyMock .replay (rpcFactoryMock , rpcMock );
626+ DatastoreOptions options =
627+ this .options .toBuilder ()
628+ .retryParams (RetryParams .getDefaultInstance ())
629+ .serviceRpcFactory (rpcFactoryMock )
630+ .build ();
631+ return DatastoreFactory .instance ().get (options );
550632 }
551633
552634 @ Test
0 commit comments