1+ import static com .authzed .api .v1 .CheckDebugTrace .Permissionship .PERMISSIONSHIP_HAS_PERMISSION ;
12import static org .junit .Assert .assertEquals ;
23import static org .junit .Assert .assertNotNull ;
34import static org .junit .Assert .assertTrue ;
67import java .util .Iterator ;
78import java .util .Random ;
89import java .util .Set ;
10+ import java .util .concurrent .CountDownLatch ;
911
12+ import com .authzed .api .v1 .*;
1013import com .authzed .grpcutil .BearerToken ;
1114
15+ import io .grpc .stub .StreamObserver ;
1216import org .junit .Test ;
1317
1418import io .grpc .ManagedChannel ;
1519import io .grpc .ManagedChannelBuilder ;
16- import com .authzed .api .v1 .PermissionsServiceGrpc ;
17- import com .authzed .api .v1 .SchemaServiceGrpc ;
18- import com .authzed .api .v1 .Core .ObjectReference ;
19- import com .authzed .api .v1 .Core .Relationship ;
20- import com .authzed .api .v1 .Core .RelationshipUpdate ;
21- import com .authzed .api .v1 .Core .SubjectReference ;
22- import com .authzed .api .v1 .Core .ZedToken ;
23- import com .authzed .api .v1 .PermissionService ;
24- import com .authzed .api .v1 .PermissionService .CheckPermissionRequest ;
25- import com .authzed .api .v1 .PermissionService .CheckPermissionResponse ;
26- import com .authzed .api .v1 .PermissionService .CheckPermissionResponse .Permissionship ;
27- import com .authzed .api .v1 .SchemaServiceOuterClass .ReadSchemaRequest ;
28- import com .authzed .api .v1 .SchemaServiceOuterClass .ReadSchemaResponse ;
29- import com .authzed .api .v1 .SchemaServiceOuterClass .WriteSchemaRequest ;
30- import com .authzed .api .v1 .PermissionService .Consistency ;
31- import com .authzed .api .v1 .PermissionService .WriteRelationshipsRequest ;
32- import com .authzed .api .v1 .PermissionService .WriteRelationshipsResponse ;
3320
3421public class V1ClientTest {
3522 private static final String target = "localhost:50051" ;
@@ -60,6 +47,9 @@ public void testSchemaService() {
6047 ReadSchemaResponse readResponse = schemaService .readSchema (readRequest );
6148 assertTrue (readResponse .getSchemaText ().indexOf ("test/article" ) > 0 );
6249 }
50+
51+ // For an example with flow control, see
52+ // https://github.com/grpc/grpc-java/blob/9071c1ad7c842f4e73b6ae95b71f11c517b177a4/examples/src/main/java/io/grpc/examples/manualflowcontrol/ManualFlowControlClient.java
6353 @ Test
6454 public void testCheckPermission () {
6555 // Initialize services
@@ -103,7 +93,7 @@ public void testCheckPermission() {
10393 .build ();
10494
10595 CheckPermissionResponse checkResponse = permissionsService .checkPermission (checkRequest );
106- assertEquals (Permissionship .PERMISSIONSHIP_HAS_PERMISSION , checkResponse .getPermissionship ());
96+ assertEquals (CheckPermissionResponse . Permissionship .PERMISSIONSHIP_HAS_PERMISSION , checkResponse .getPermissionship ());
10797 }
10898
10999 @ Test
@@ -127,7 +117,7 @@ public void testLookupResources() {
127117 ZedToken zedToken = ZedToken .newBuilder ()
128118 .setToken (tokenVal )
129119 .build ();
130- PermissionService . LookupResourcesRequest lookupResourcesRequest = PermissionService . LookupResourcesRequest .newBuilder ()
120+ LookupResourcesRequest lookupResourcesRequest = LookupResourcesRequest .newBuilder ()
131121 .setConsistency (
132122 Consistency .newBuilder ()
133123 .setAtLeastAsFresh (zedToken )
@@ -144,7 +134,7 @@ public void testLookupResources() {
144134 .setPermission ("can_comment" )
145135 .build ();
146136
147- Iterator <PermissionService . LookupResourcesResponse > resp = permissionsService .lookupResources (lookupResourcesRequest );
137+ Iterator <LookupResourcesResponse > resp = permissionsService .lookupResources (lookupResourcesRequest );
148138 Set <String > resources = new HashSet <>();
149139 resp .forEachRemaining (lookupResourcesResponse -> {
150140 resources .add (lookupResourcesResponse .getResourceObjectId ());
@@ -186,6 +176,87 @@ private static String writeRelationship(PermissionsServiceGrpc.PermissionsServic
186176 return relResponse .getWrittenAt ().getToken ();
187177 }
188178
179+
180+ class BulkImportObserver implements StreamObserver <BulkImportRelationshipsResponse > {
181+ final CountDownLatch done = new CountDownLatch (1 );
182+ private long loaded ;
183+
184+ @ Override
185+ public void onNext (BulkImportRelationshipsResponse resp ) {
186+ loaded += resp .getNumLoaded ();
187+ }
188+
189+ @ Override
190+ public void onError (Throwable throwable ) {
191+ // TODO need to capture error so that blocking callsite is able to access it
192+ System .out .println ("onError" );
193+ done .countDown ();
194+ }
195+
196+ @ Override
197+ public void onCompleted () {
198+ System .out .println ("onCompleted" );
199+ done .countDown ();
200+ }
201+
202+ public void await () throws InterruptedException {
203+ done .await ();
204+ }
205+
206+ public long loaded () {
207+ return loaded ;
208+ }
209+ };
210+
211+ @ Test
212+ public void testBulkImport () {
213+
214+ ManagedChannel channel = ManagedChannelBuilder .forTarget (target ).usePlaintext ().build ();
215+ String token = generateToken ();
216+ ExperimentalServiceGrpc .ExperimentalServiceStub experimentalService = ExperimentalServiceGrpc .
217+ newStub (channel )
218+ .withCallCredentials (new BearerToken (token ));
219+
220+ BulkImportObserver responseObserver = new BulkImportObserver ();
221+ writeTestSchema (token , channel );
222+ io .grpc .stub .StreamObserver <com .authzed .api .v1 .BulkImportRelationshipsRequest >
223+ observer = experimentalService .bulkImportRelationships (responseObserver );
224+
225+ for (int i = 0 ; i < 10 ; i ++) {
226+ BulkImportRelationshipsRequest req = BulkImportRelationshipsRequest .newBuilder ()
227+ .addRelationships (relationship ("test/article" , "java_test_" + i , "author" , "test/user" , "george" )).build ();
228+ observer .onNext (req );
229+ }
230+ observer .onCompleted ();
231+
232+ try {
233+ responseObserver .await ();
234+ } catch (InterruptedException e ) {
235+ throw new RuntimeException (e );
236+ }
237+
238+ assertEquals (10 , responseObserver .loaded ());
239+ }
240+
241+ private static Relationship relationship (String resourceType , String resourceID , String relation , String subjectType , String subjectID ) {
242+ return Relationship .newBuilder ()
243+ .setResource (
244+ ObjectReference .newBuilder ()
245+ .setObjectType (resourceType )
246+ .setObjectId (resourceID )
247+ .build ())
248+ .setRelation (relation )
249+ .setSubject (
250+ SubjectReference .newBuilder ()
251+ .setObject (
252+ ObjectReference .newBuilder ()
253+ .setObjectType (subjectType )
254+ .setObjectId (subjectID )
255+ .build ())
256+ .build ())
257+ .build ();
258+ }
259+
189260 private static SchemaServiceGrpc .SchemaServiceBlockingStub writeTestSchema (String token , ManagedChannel channel ) {
190261 SchemaServiceGrpc .SchemaServiceBlockingStub schemaService = SchemaServiceGrpc .newBlockingStub (channel )
191262 .withCallCredentials (new BearerToken (token ));
0 commit comments