private void setUpResourceService() { when(mockResourceService.supportedInteractionModels()).thenReturn(allInteractionModels); when(mockResourceService.get(any(IRI.class))).thenAnswer(inv -> completedFuture(mockResource)); when(mockResourceService.create(any(Metadata.class), any(Dataset.class))).thenReturn(completedFuture(null)); when(mockResourceService.replace(any(Metadata.class), any(Dataset.class))).thenReturn(completedFuture(null)); when(mockResourceService.delete(any(Metadata.class))).thenReturn(completedFuture(null)); when(mockResourceService.add(any(IRI.class), any(Dataset.class))).thenReturn(completedFuture(null)); when(mockResourceService.skolemize(any(Literal.class))).then(returnsFirstArg()); when(mockResourceService.skolemize(any(IRI.class))).then(returnsFirstArg()); when(mockResourceService.skolemize(any(BlankNode.class))).thenAnswer(inv -> rdf.createIRI(TRELLIS_BNODE_PREFIX + ((BlankNode) inv.getArgument(0)).uniqueReference())); when(mockResourceService.toInternal(any(RDFTerm.class), any())).thenCallRealMethod(); when(mockResourceService.toExternal(any(RDFTerm.class), any())).thenCallRealMethod(); when(mockResourceService.touch(any(IRI.class))).thenReturn(completedFuture(null)); }
@Test public void testDeleteACLAuditError() { when(mockResourceService.replace(any(Metadata.class), any(Dataset.class))).thenReturn(completedFuture(null)); when(mockResourceService.add(any(IRI.class), any(Dataset.class))).thenReturn(asyncException()); when(mockTrellisRequest.getExt()).thenReturn(ACL); final DeleteHandler handler = new DeleteHandler(mockTrellisRequest, mockBundler, baseUrl); assertThrows(CompletionException.class, () -> unwrapAsyncError(handler.deleteResource(handler.initialize(mockParent, mockResource))), "No exception thrown when an ACL audit stream couldn't be written!"); } }
private CompletionStage<Void> handleResourceDeletion(final TrellisDataset immutable) { // Collect the audit data getServices().getAuditService().deletion(getResource().getIdentifier(), getSession()).stream() .map(skolemizeQuads(getServices().getResourceService(), getBaseUrl())) .forEachOrdered(immutable::add); // delete the resource return allOf( getServices().getResourceService().delete(Metadata.builder(getResource()).build()).toCompletableFuture(), getServices().getResourceService().add(getResource().getIdentifier(), immutable.asDataset()).toCompletableFuture()); } }
protected CompletionStage<Void> handleResourceReplacement(final TrellisDataset mutable, final TrellisDataset immutable) { final Metadata.Builder metadata = metadataBuilder(getResource().getIdentifier(), getResource().getInteractionModel(), mutable); getResource().getContainer().ifPresent(metadata::container); getResource().getBinaryMetadata().ifPresent(metadata::binary); // update the resource return allOf( getServices().getResourceService().replace(metadata.build(), mutable.asDataset()).toCompletableFuture(), getServices().getResourceService().add(getResource().getIdentifier(), immutable.asDataset()).toCompletableFuture()); }
@Test public void testBadAudit() throws IOException { when(mockResource.getInteractionModel()).thenReturn(LDP.BasicContainer); when(mockTrellisRequest.getLink()).thenReturn(fromUri(LDP.BasicContainer.getIRIString()).rel("type").build()); when(mockTrellisRequest.getContentType()).thenReturn(TEXT_TURTLE); when(mockBundler.getAuditService()).thenReturn(new DefaultAuditService() {}); when(mockResourceService.add(any(IRI.class), any(Dataset.class))).thenReturn(asyncException()); final PostHandler handler = buildPostHandler("/simpleTriple.ttl", null, null); assertThrows(CompletionException.class, () -> unwrapAsyncError(handler.createResource(handler.initialize(mockParent, MISSING_RESOURCE))), "No exception when the backend audit service throws an error!"); }
@Test public void testBadAudit() { when(mockBundler.getAuditService()).thenReturn(new DefaultAuditService() {}); when(mockResource.getInteractionModel()).thenReturn(LDP.RDFSource); when(mockTrellisRequest.getLink()).thenReturn(fromUri(LDP.BasicContainer.getIRIString()).rel("type").build()); when(mockTrellisRequest.getContentType()).thenReturn(TEXT_TURTLE); when(mockResourceService.add(any(IRI.class), any(Dataset.class))).thenReturn(asyncException()); final PutHandler handler = buildPutHandler("/simpleTriple.ttl", null); assertThrows(CompletionException.class, () -> unwrapAsyncError(handler.setResource(handler.initialize(mockParent, mockResource))), "No exception when the audit backend completes exceptionally!"); }
when(mockResourceService.toInternal(any(RDFTerm.class), any())).thenCallRealMethod(); when(mockResourceService.toExternal(any(RDFTerm.class), any())).thenCallRealMethod(); when(mockResourceService.add(any(IRI.class), any(Dataset.class))).thenReturn(completedFuture(null)); when(mockResourceService.delete(any(Metadata.class))).thenReturn(completedFuture(null)); when(mockResourceService.replace(any(Metadata.class), any(Dataset.class))).thenReturn(completedFuture(null));
@Test public void testBadAudit() { when(mockResource.getInteractionModel()).thenReturn(LDP.BasicContainer); when(mockTrellisRequest.getLink()).thenReturn(fromUri(LDP.BasicContainer.getIRIString()).rel("type").build()); when(mockTrellisRequest.getContentType()).thenReturn(APPLICATION_SPARQL_UPDATE); when(mockBundler.getAuditService()).thenReturn(new DefaultAuditService() {}); // will never store audit when(mockResourceService.add(any(IRI.class), any(Dataset.class))).thenReturn(asyncException()); final PatchHandler handler = new PatchHandler(mockTrellisRequest, "", mockBundler, null, null); assertThrows(CompletionException.class, () -> unwrapAsyncError(handler.updateResource(handler.initialize(mockParent, mockResource))), "No exception thrown when there is an error in the audit backend!"); }
@Test public void testBadAudit() { when(mockResource.getInteractionModel()).thenReturn(LDP.BasicContainer); when(mockTrellisRequest.getLink()).thenReturn(fromUri(LDP.BasicContainer.getIRIString()).rel("type").build()); when(mockTrellisRequest.getContentType()).thenReturn(TEXT_TURTLE); // will never store audit when(mockResourceService.add(any(IRI.class), any(Dataset.class))).thenReturn(asyncException()); final AuditService badAuditService = new DefaultAuditService() {}; when(mockBundler.getAuditService()).thenReturn(badAuditService); final DeleteHandler handler = new DeleteHandler(mockTrellisRequest, mockBundler, null); assertThrows(CompletionException.class, () -> unwrapAsyncError(handler.deleteResource(handler.initialize(mockParent, mockResource))), "No exception thrown when the backend reports an exception!"); }
getServices().getResourceService().add(internalId, immutable.asDataset()).toCompletableFuture())) .thenCompose(future -> handleUpdateEvent(ldpType)) .thenApply(future -> decorateResponse(builder));
dataset1.add(Trellis.PreferAudit, audit1, PROV.atTime, rdf.createLiteral(now().toString(), XSD.dateTime)); assertDoesNotThrow(() -> getResourceService().add(identifier, dataset1).toCompletableFuture().join(), "Check the successful addition of audit quads"); dataset2.add(Trellis.PreferAudit, audit2, PROV.atTime, rdf.createLiteral(now().toString(), XSD.dateTime)); assertDoesNotThrow(() -> getResourceService().add(identifier, dataset2).toCompletableFuture().join(), "Check that audit triples are added successfully");
dataset1.add(Trellis.PreferAudit, audit1, PROV.atTime, rdf.createLiteral(now().toString(), XSD.dateTime)); assertDoesNotThrow(() -> getResourceService().add(identifier, dataset1).toCompletableFuture().join(), "Check the successful addition of audit quads"); dataset2.add(Trellis.PreferAudit, audit2, PROV.atTime, rdf.createLiteral(now().toString(), XSD.dateTime)); assertDoesNotThrow(() -> getResourceService().add(identifier, dataset2).toCompletableFuture().join(), "Check that audit triples are added successfully");
getServices().getResourceService().add(internalId, immutable.asDataset()).toCompletableFuture())) .thenCompose(future -> emitEvent(internalId, AS.Create, ldpType)) .thenApply(future -> {
@Test public void testAppendSemantics() { final Quad testFirstQuad = createQuad(testResourceId3, testResourceId2, testResourceId1, badId); final Quad testSecondQuad = createQuad(testResourceId3, testResourceId2, testResourceId1, badId); // store some data in mutable and immutable sides under the same resource ID final Resource testFirstResource = new TestResource(testResourceId3, testFirstQuad); assertNull(testable.add(testResourceId3, testFirstResource.dataset()).toCompletableFuture().join(), "Couldn't create an immutable resource!"); final Resource testSecondResource = new TestResource(testResourceId3, testSecondQuad); assertNull(testable.add(testResourceId3, testSecondResource.dataset()).toCompletableFuture().join(), "Couldn't add to an immutable resource!"); final Resource retrieved = testable.get(testResourceId3).toCompletableFuture().join(); assertEquals(testResourceId3, retrieved.getIdentifier(), "Resource was retrieved with wrong ID!"); final Dataset quads = retrieved.dataset(); assertTrue(quads.contains(testFirstQuad), "Resource was retrieved without its immutable data!"); assertTrue(quads.contains(testSecondQuad), "Resource was retrieved without its mutable data!"); quads.remove(testFirstQuad); quads.remove(testSecondQuad); assertEquals(0, quads.size(), "Resource was retrieved with too much data!"); }
@Test public void testMergingBehavior() { final Quad testMutableQuad = createQuad(testResourceId2, testResourceId2, testResourceId1, badId); final Quad testImmutableQuad = createQuad(testResourceId2, testResourceId2, testResourceId1, badId); // store some data in mutable and immutable sides under the same resource ID final Resource testMutableResource = new TestResource(testResourceId2, testMutableQuad); assertNull(testable.create(Metadata.builder(testMutableResource).build(), testMutableResource.dataset()) .toCompletableFuture().join(), "Couldn't create a resource!"); final Resource testImmutableResource = new TestResource(testResourceId2, testImmutableQuad); assertNull(testable.add(testResourceId2, testImmutableResource.dataset()).toCompletableFuture().join(), "Couldn't create an immutable resource!"); final Resource retrieved = testable.get(testResourceId2).toCompletableFuture().join(); assertEquals(testMutableResource.getIdentifier(), retrieved.getIdentifier(), "Resource was retrieved with wrong ID!"); final Dataset quads = retrieved.dataset(); assertTrue(quads.contains(testImmutableQuad), "Resource was retrieved without its immutable data!"); assertTrue(quads.contains(testMutableQuad), "Resource was retrieved without its mutable data!"); quads.remove(testImmutableQuad); quads.remove(testMutableQuad); assertEquals(0, quads.size(), "Resource was retrieved with too much data!"); }