@Override public void accept( Procedures procs ) throws ProcedureException { procs.register( new ListComponentsProcedure( procedureName( "dbms", "components" ), neo4jVersion, neo4jEdition ) ); procs.register( new JmxQueryProcedure( procedureName( "dbms", "queryJmx" ), ManagementFactory.getPlatformMBeanServer() ) ); } }
@Test public void shouldConvertAllStandardBeansWithoutError() throws Throwable { // given MBeanServer jmxServer = ManagementFactory.getPlatformMBeanServer(); JmxQueryProcedure procedure = new JmxQueryProcedure( ProcedureSignature.procedureName( "bob" ), jmxServer ); // when RawIterator<Object[],ProcedureException> result = procedure.apply( null, new Object[]{"*:*"}, resourceTracker ); // then we verify that we respond with the expected number of beans without error // .. we don't assert more than this, this is more of a smoke test to ensure // that independent of platform, we never throw exceptions even when converting every // single MBean into Neo4j types, and we always get the correct number of MBeans out. assertThat( asList( result ).size(), equalTo( jmxServer.getMBeanCount() )); }
@Test public void testEmptyGraph() throws Throwable { // Given the database is empty // When Procedures procs = procs(); RawIterator<Object[],ProcedureException> stream = procs.procedureCallRead( procs.procedureGet( procedureName( "db", "schema" ) ).id(), new Object[0] ); // Then assertThat( asList( stream ), contains( equalTo( new Object[]{new ArrayList<>(), new ArrayList<>()} ) ) ); commit(); }
@Test public void shouldGetBuiltInProcedureByName() throws Throwable { // When ProcedureSignature found = procs() .procedureGet( procedureName( "db", "labels" ) ).signature(); // Then assertThat( found, equalTo( procedureSignature( procedureName( "db", "labels" ) ) .out( "label", NTString ).build() ) ); commit(); }
@Test public void testWeirdLabelName() throws Throwable { // Given // Node1: (:`This:is_a:label` {color: "red"}) createNode( Arrays.asList( "`This:is_a:label`" ), Arrays.asList( "color" ), Arrays.asList( Values.stringValue( "red" ) ) ); // When RawIterator<Object[],ProcedureException> stream = procs().procedureCallRead( procs().procedureGet( procedureName( nodesProcedureName ) ).id(), new Object[0] ); // Then assertThat( asList( stream ), containsInAnyOrder( equalTo( nodeEntry(":``This:is_a:label``", Arrays.asList( "`This:is_a:label`" ), "color", Arrays.asList( "String" ), true) ) ) ); // printStream( stream ); }
@Test public void testNodePropertiesRegardlessOfCreationOrder2() throws Throwable { // Given // Node1: (:B {origin: "Kenya"}) // Node2 (:B {color: "red", size: "M"}) createNode( Arrays.asList( "B" ), Arrays.asList( "origin" ), Arrays.asList( Values.stringValue( "Kenya" ) ) ); createNode( Arrays.asList( "B" ), Arrays.asList( "color", "size" ), Arrays.asList( Values.stringValue( "red" ), Values.stringValue( "M" ) ) ); // When RawIterator<Object[],ProcedureException> stream = procs().procedureCallRead( procs().procedureGet( procedureName( nodesProcedureName ) ).id(), new Object[0] ); // Then assertThat( asList( stream ), containsInAnyOrder( equalTo( nodeEntry(":`B`", Arrays.asList( "B" ), "color", Arrays.asList( "String" ), false) ), equalTo( nodeEntry(":`B`", Arrays.asList( "B" ), "size", Arrays.asList( "String" ), false) ), equalTo( nodeEntry(":`B`", Arrays.asList( "B" ), "origin", Arrays.asList( "String" ), false) ) ) ); // printStream( stream ); }
@Test public void testNodesShouldNotDependOnOrderOfCreationWithOverlap() throws Throwable { // Given // Node1: (:B {type:'B1}) // Node2: (:B {type:'B2', size: 5}) createNode( Arrays.asList( "B" ), Arrays.asList( "type" ), Arrays.asList( Values.stringValue( "B1" ) ) ); createNode( Arrays.asList( "B" ), Arrays.asList( "type", "size" ), Arrays.asList( Values.stringValue( "B2" ), Values.intValue( 5 ) ) ); // When RawIterator<Object[],ProcedureException> stream = procs().procedureCallRead( procs().procedureGet( procedureName( nodesProcedureName ) ).id(), new Object[0] ); // Then assertThat( asList( stream ), containsInAnyOrder( equalTo( nodeEntry(":`B`", Arrays.asList( "B" ), "type", Arrays.asList( "String" ), true) ), equalTo( nodeEntry(":`B`", Arrays.asList( "B" ), "size", Arrays.asList( "Integer" ), false) ) ) ); // printStream( stream ); }
@Test public void testWithSimilarNodes() throws Throwable { // Given // Node1: (:A {prop1:"Test"}) // Node2: (:A {prop1:"Test2"}) createNode( Arrays.asList( "A" ), Arrays.asList( "prop1" ), Arrays.asList( Values.stringValue( "Test" ) ) ); createNode( Arrays.asList( "A" ), Arrays.asList( "prop1" ), Arrays.asList( Values.stringValue( "Test2" ) ) ); // When RawIterator<Object[],ProcedureException> stream = procs().procedureCallRead( procs().procedureGet( procedureName( nodesProcedureName ) ).id(), new Object[0] ); // Then assertThat( asList( stream ), contains( equalTo( nodeEntry(":`A`", Arrays.asList("A"), "prop1", Arrays.asList( "String" ), true) ) ) ); // printStream( stream ); }
@Test public void testNodesShouldNotDependOnOrderOfCreationWithOverlap2() throws Throwable { // Given // Node1: (:B {type:'B2', size: 5}) // Node2: (:B {type:'B1}) createNode( Arrays.asList( "B" ), Arrays.asList( "type", "size" ), Arrays.asList( Values.stringValue( "B2" ), Values.intValue( 5 ) ) ); createNode( Arrays.asList( "B" ), Arrays.asList( "type" ), Arrays.asList( Values.stringValue( "B1" ) ) ); // When RawIterator<Object[],ProcedureException> stream = procs().procedureCallRead( procs().procedureGet( procedureName( nodesProcedureName ) ).id(), new Object[0] ); // Then assertThat( asList( stream ), containsInAnyOrder( equalTo( nodeEntry(":`B`", Arrays.asList( "B" ), "type", Arrays.asList( "String" ), true) ), equalTo( nodeEntry(":`B`", Arrays.asList( "B" ), "size", Arrays.asList( "Integer" ), false) ) ) ); // printStream( stream ); }
@Test public void failWhenCallingNonExistingProcedures() { try { dbmsOperations().procedureCallDbms( procedureName( "dbms", "iDoNotExist" ), new Object[0], dependencyResolver, AnonymousContext.none().authorize( s -> -1, GraphDatabaseSettings.DEFAULT_DATABASE_NAME ), resourceTracker ); fail( "This should never get here" ); } catch ( Exception e ) { // Then assertThat( e.getClass(), equalTo( ProcedureException.class ) ); } }
private List<Object[]> call( String name, Object... args ) throws ProcedureException, IndexNotFoundKernelException { BasicContext ctx = new BasicContext(); ctx.put( KERNEL_TRANSACTION, tx ); ctx.put( DEPENDENCY_RESOLVER, resolver ); ctx.put( GRAPHDATABASEAPI, graphDatabaseAPI ); ctx.put( SECURITY_CONTEXT, SecurityContext.AUTH_DISABLED ); ctx.put( LOG, log ); when( graphDatabaseAPI.getDependencyResolver() ).thenReturn( resolver ); when( resolver.resolveDependency( Procedures.class ) ).thenReturn( procs ); when( resolver.resolveDependency( IndexingService.class ) ).thenReturn( indexingService ); when( schemaRead.indexGetPopulationProgress( any( IndexReference.class) ) ).thenReturn( PopulationProgress.DONE ); return Iterators.asList( procs.callProcedure( ctx, ProcedureSignature.procedureName( name.split( "\\." ) ), args, resourceTracker ) ); } }
@Test public void listAllComponents() throws Throwable { // Given a running database // When RawIterator<Object[],ProcedureException> stream = procs().procedureCallRead( procs().procedureGet( procedureName( "dbms", "components" ) ).id(), new Object[0] ); // Then assertThat( asList( stream ), contains( equalTo( new Object[]{"Neo4j Kernel", singletonList( Version.getNeo4jVersion() ), "community"} ) ) ); commit(); }
private List<Object[]> callListConfig( String seatchString ) throws ProcedureException { QualifiedName procedureName = procedureName( "dbms", "listConfig" ); RawIterator<Object[],ProcedureException> callResult = dbmsOperations().procedureCallDbms( procedureName, toArray( seatchString ), dependencyResolver, AUTH_DISABLED, resourceTracker ); return asList( callResult ); } }
@Test public void testRelsPropertiesRegardlessOfCreationOrder2() throws Throwable { // Given // Node1: (A) // Rel1: (A)-[:R {origin: "Kenya"}]->(A) // Rel2: (A)-[:R {color: "red", size: "M"}]->(A) long emptyNode = createEmptyNode(); createRelationship( emptyNode, "R", emptyNode, Arrays.asList( "origin" ), Arrays.asList( Values.stringValue( "Kenya" ) ) ); createRelationship( emptyNode, "R", emptyNode, Arrays.asList( "color", "size" ), Arrays.asList( Values.stringValue( "red" ), Values.stringValue( "M" ) ) ); // When RawIterator<Object[],ProcedureException> stream = procs().procedureCallRead( procs().procedureGet( procedureName( relsProcedureName ) ).id(), new Object[0] ); // Then assertThat( asList( stream ), containsInAnyOrder( equalTo( relEntry(":`R`", "color", Arrays.asList( "String" ), false) ), equalTo( relEntry(":`R`", "size", Arrays.asList( "String" ), false) ), equalTo( relEntry(":`R`", "origin", Arrays.asList( "String" ), false) ) ) ); // printStream( stream ); }
@Test public void testSchemaWithRelationshipWithoutProperties() throws Throwable { // Given // Node1: () // Rel1: (node1)-[:R{prop1:"Test", prop2: 12, prop3: true}]->(node1) // Rel2: (node1)-[:R]->(node1) long nodeId1 = createEmptyNode(); createRelationship( nodeId1, "R", nodeId1, Arrays.asList( "prop1", "prop2", "prop3" ), Arrays.asList( Values.stringValue( "Test" ), Values.intValue( 12 ), Values.booleanValue( true ) ) ); createRelationship( nodeId1, "R", nodeId1, Arrays.asList(), Arrays.asList() ); // When RawIterator<Object[],ProcedureException> stream = procs().procedureCallRead( procs().procedureGet( procedureName( relsProcedureName ) ).id(), new Object[0] ); // Then assertThat( asList( stream ), containsInAnyOrder( equalTo( relEntry(":`R`", "prop1", Arrays.asList( "String" ), false) ), equalTo( relEntry(":`R`", "prop2", Arrays.asList( "Integer" ), false) ), equalTo( relEntry(":`R`", "prop3", Arrays.asList( "Boolean" ), false) ) ) ); //printStream( stream ); }
@Test public void listPropertyKeys() throws Throwable { // Given TokenWrite ops = tokenWriteInNewTransaction(); ops.propertyKeyGetOrCreateForName( "MyProp" ); commit(); // When RawIterator<Object[],ProcedureException> stream = procs().procedureCallRead( procs().procedureGet( procedureName( "db", "propertyKeys" ) ).id(), new Object[0] ); // Then assertThat( asList( stream ), contains( equalTo( new Object[]{"MyProp"} ) ) ); }
@Test public void shouldFailWhenChangePasswordWithStaticAccessModeInDbmsMode() throws Throwable { // Given Object[] inputArray = new Object[1]; inputArray[0] = "newPassword"; // Then exception.expect( ProcedureException.class ); exception.expectMessage( "Anonymous cannot change password" ); // When dbmsOperations().procedureCallDbms( procedureName( "dbms", "security", "changePassword" ), inputArray, dependencyResolver, AnonymousContext.none().authorize( s -> -1, GraphDatabaseSettings.DEFAULT_DATABASE_NAME ), resourceTracker ); }
@Test public void listAllLabels() throws Throwable { // Given Transaction transaction = newTransaction( AnonymousContext.writeToken() ); long nodeId = transaction.dataWrite().nodeCreate(); int labelId = transaction.tokenWrite().labelGetOrCreateForName( "MyLabel" ); transaction.dataWrite().nodeAddLabel( nodeId, labelId ); commit(); // When RawIterator<Object[],ProcedureException> stream = procs().procedureCallRead( procs().procedureGet( procedureName( "db", "labels" ) ).id(), new Object[0] ); // Then assertThat( asList( stream ), contains( equalTo( new Object[]{"MyLabel"} ) ) ); }
@Test public void shouldFailWhenDeprecatedChangePasswordWithStaticAccessModeInDbmsMode() throws Throwable { // Given Object[] inputArray = new Object[1]; inputArray[0] = "newPassword"; // Then exception.expect( ProcedureException.class ); exception.expectMessage( "Anonymous cannot change password" ); // When dbmsOperations() .procedureCallDbms( procedureName( "dbms", "changePassword" ), inputArray, dependencyResolver, AnonymousContext.none().authorize( s -> -1, GraphDatabaseSettings.DEFAULT_DATABASE_NAME ), resourceTracker ); }
@Test public void listRelationshipTypes() throws Throwable { // Given Transaction transaction = newTransaction( AnonymousContext.writeToken() ); int relType = transaction.tokenWrite().relationshipTypeGetOrCreateForName( "MyRelType" ); long startNodeId = transaction.dataWrite().nodeCreate(); long endNodeId = transaction.dataWrite().nodeCreate(); transaction.dataWrite().relationshipCreate( startNodeId, relType, endNodeId ); commit(); // When RawIterator<Object[],ProcedureException> stream = procs().procedureCallRead( procs().procedureGet( procedureName( "db", "relationshipTypes" ) ).id(), new Object[0] ); // Then assertThat( asList( stream ), contains( equalTo( new Object[]{"MyRelType"} ) ) ); }