use of org.neo4j.logging.LogProvider in project neo4j by neo4j.
the class NetworkReceiverTest method testMessageReceivedOriginFix.
@Test
public void testMessageReceivedOriginFix() throws Exception {
LogProvider logProvider = mock(LogProvider.class);
when(logProvider.getLog(NetworkReceiver.class)).thenReturn(mock(Log.class));
NetworkReceiver networkReceiver = new NetworkReceiver(mock(NetworkReceiver.Monitor.class), mock(NetworkReceiver.Configuration.class), logProvider);
// This defines where message is coming from
final InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", PORT);
final Channel channel = mock(Channel.class);
when(channel.getLocalAddress()).thenReturn(inetSocketAddress);
when(channel.getRemoteAddress()).thenReturn(inetSocketAddress);
ChannelHandlerContext ctx = mock(ChannelHandlerContext.class);
when(ctx.getChannel()).thenReturn(channel);
final Message message = Message.to(new MessageType() {
@Override
public String name() {
return "test";
}
}, new URI("cluster://anywhere"));
MessageEvent messageEvent = mock(MessageEvent.class);
when(messageEvent.getRemoteAddress()).thenReturn(inetSocketAddress);
when(messageEvent.getMessage()).thenReturn(message);
when(messageEvent.getChannel()).thenReturn(channel);
// the original FROM header should be ignored
message.setHeader(Message.FROM, "cluster://someplace:1234");
networkReceiver.new MessageReceiver().messageReceived(ctx, messageEvent);
assertEquals("FROM header should have been changed to visible ip address: " + message.getHeader(Message.FROM), "cluster://127.0.0.1:1234", message.getHeader(Message.FROM));
}
use of org.neo4j.logging.LogProvider in project neo4j by neo4j.
the class NetworkSenderReceiverTest method senderThatStartsAfterReceiverShouldEventuallyConnectSuccessfully.
@Test
public void senderThatStartsAfterReceiverShouldEventuallyConnectSuccessfully() throws Throwable {
/*
* This test verifies that a closed channel from a sender to a receiver is removed from the connections
* mapping in the sender. It starts a sender, connects it to a receiver and sends a message.
*
* We should be testing this without resorting to using a NetworkReceiver. But, as prophets Mick Jagger and
* Keith Richards mention in their scriptures, you can't always get what you want. In this case,
* NetworkSender creates on its own the things required to communicate with the outside world, and this
* means it creates actual sockets. To interact with it then, we need to setup listeners for those sockets
* and respond properly. Hence, NetworkReceiver. Yes, this means that this test requires to open actual
* network sockets.
*
* Read on for further hacks in place.
*/
NetworkSender sender = null;
NetworkReceiver receiver = null;
try {
LogProvider logProviderMock = mock(LogProvider.class);
Log logMock = mock(Log.class);
when(logProviderMock.getLog(Matchers.<Class>any())).thenReturn(logMock);
final Semaphore sem = new Semaphore(0);
/*
* A semaphore AND a boolean? Weird, you may think, as the purpose is clearly to step through the
* connection setup/teardown process. So, let's discuss what happens here more clearly.
*
* The sender and receiver are started. Trapped by the semaphore release on listeningAt()
* The sender sends through the first message, it is received by the receiver. Trapped by the semaphore
* release on listeningAt() which is triggered on the first message receive on the receiver
* The receiver is stopped, trapped by the overridden stop() method of the logging service.
* The sender sends a message through, which will trigger the ChannelClosedException. This is where it
* gets tricky. See, normally, since we waited for the semaphore on NetworkReceiver.stop() and an
* happensBefore edge exists and all these good things, it should be certain that the Receiver is
* actually stopped and the message would fail to be sent. That would be too easy though. In reality,
* netty will not wait for all listening threads to stop before returning, so the receiver is not
* guaranteed to not be listening for incoming connections when stop() returns. This happens rarely,
* but the result is that the message "HelloWorld2" should fail with an exception (triggering the warn
* method on the logger) but it doesn't. So we can't block, but we must retry until we know the
* message failed to be sent and the exception happened, which is what this test is all about. We do
* that with a boolean that is tested upon continuously with sent messages until the error happens.
* Then we proceed with...
* The receiver is started. Trapped by the listeningAt() callback.
* The sender sends a message.
* The receiver receives it, trapped by the dummy processor added to the receiver.
*/
final AtomicBoolean senderChannelClosed = new AtomicBoolean(false);
doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
senderChannelClosed.set(true);
return null;
}
}).when(logMock).warn(anyString());
receiver = new NetworkReceiver(mock(NetworkReceiver.Monitor.class), new NetworkReceiver.Configuration() {
@Override
public HostnamePort clusterServer() {
return new HostnamePort("127.0.0.1:1235");
}
@Override
public int defaultPort() {
return 5001;
}
@Override
public String name() {
return null;
}
}, NullLogProvider.getInstance()) {
@Override
public void stop() throws Throwable {
super.stop();
sem.release();
}
};
sender = new NetworkSender(mock(NetworkSender.Monitor.class), new NetworkSender.Configuration() {
@Override
public int port() {
return 1235;
}
@Override
public int defaultPort() {
return 5001;
}
}, receiver, logProviderMock);
sender.init();
sender.start();
receiver.addNetworkChannelsListener(new NetworkReceiver.NetworkChannelsListener() {
@Override
public void listeningAt(URI me) {
sem.release();
}
@Override
public void channelOpened(URI to) {
}
@Override
public void channelClosed(URI to) {
}
});
final AtomicBoolean received = new AtomicBoolean(false);
receiver.addMessageProcessor(new MessageProcessor() {
@Override
public boolean process(Message<? extends MessageType> message) {
received.set(true);
sem.release();
return true;
}
});
receiver.init();
receiver.start();
// wait for start from listeningAt() in the NetworkChannelsListener
sem.acquire();
sender.process(Message.to(TestMessage.helloWorld, URI.create("cluster://127.0.0.1:1235"), "Hello World"));
// wait for process from the MessageProcessor
sem.acquire();
receiver.stop();
// wait for overridden stop method in receiver
sem.acquire();
/*
* This is the infernal loop of doom. We keep sending messages until one fails with a ClosedChannelException
* which we have no better way to grab other than through the logger.warn() call which will occur.
*
* This code will hang if the warn we rely on is removed or if the receiver never stops - in general, if
* the closed channel exception is not thrown. This is not an ideal failure mode but it's the best we can
* do, given that NetworkSender is provided with very few things from its environment.
*/
while (!senderChannelClosed.get()) {
sender.process(Message.to(TestMessage.helloWorld, URI.create("cluster://127.0.0.1:1235"), "Hello World2"));
/*
* This sleep is not necessary, it's just nice. If it's ommitted, everything will work, but we'll
* spam messages over the network as fast as possible. Even when the race between send and
* receiver.stop() does not occur, we will still send 3-4 messages through at full speed. If it
* does occur, then we are looking at hundreds. So we just back off a bit and let things work out.
*/
Thread.sleep(5);
}
receiver.start();
// wait for receiver.listeningAt()
sem.acquire();
received.set(false);
sender.process(Message.to(TestMessage.helloWorld, URI.create("cluster://127.0.0.1:1235"), "Hello World3"));
// wait for receiver.process();
sem.acquire();
assertTrue(received.get());
} finally {
if (sender != null) {
sender.stop();
sender.shutdown();
}
if (receiver != null) {
receiver.stop();
receiver.shutdown();
}
}
}
use of org.neo4j.logging.LogProvider in project neo4j by neo4j.
the class DefaultWinnerStrategyTest method shouldNotPickAWinnerIfAllVotesAreForIneligibleCandidates.
@Test
public void shouldNotPickAWinnerIfAllVotesAreForIneligibleCandidates() {
// given
InstanceId instanceOne = new InstanceId(1);
InstanceId instanceTwo = new InstanceId(2);
ClusterContext clusterContext = mock(ClusterContext.class);
final Log log = mock(Log.class);
LogProvider logProvider = new LogProvider() {
@Override
public Log getLog(Class loggingClass) {
return log;
}
@Override
public Log getLog(String name) {
return log;
}
};
when(clusterContext.getLog(DefaultWinnerStrategy.class)).thenReturn(logProvider.getLog(DefaultWinnerStrategy.class));
// when
Collection<Vote> votes = Arrays.asList(new Vote(instanceOne, new NotElectableElectionCredentials()), new Vote(instanceTwo, new NotElectableElectionCredentials()));
DefaultWinnerStrategy strategy = new DefaultWinnerStrategy(clusterContext);
org.neo4j.cluster.InstanceId winner = strategy.pickWinner(votes);
// then
assertNull(winner);
}
use of org.neo4j.logging.LogProvider in project neo4j by neo4j.
the class EnterpriseSecurityModule method setup.
@Override
public void setup(Dependencies dependencies) throws KernelException {
Config config = dependencies.config();
Procedures procedures = dependencies.procedures();
LogProvider logProvider = dependencies.logService().getUserLogProvider();
JobScheduler jobScheduler = dependencies.scheduler();
FileSystemAbstraction fileSystem = dependencies.fileSystem();
LifeSupport life = dependencies.lifeSupport();
SecurityLog securityLog = SecurityLog.create(config, dependencies.logService().getInternalLog(GraphDatabaseFacade.class), fileSystem, jobScheduler);
life.add(securityLog);
boolean allowTokenCreate = config.get(SecuritySettings.allow_publisher_create_token);
PredefinedRolesBuilder.setAllowPublisherTokenCreate(allowTokenCreate);
procedures.writerCreateToken(allowTokenCreate);
EnterpriseAuthAndUserManager authManager = newAuthManager(config, logProvider, securityLog, fileSystem, jobScheduler);
life.add(dependencies.dependencySatisfier().satisfyDependency(authManager));
// Register procedures
procedures.registerComponent(SecurityLog.class, (ctx) -> securityLog, false);
procedures.registerComponent(EnterpriseAuthManager.class, ctx -> authManager, false);
procedures.registerComponent(EnterpriseSecurityContext.class, ctx -> asEnterprise(ctx.get(SECURITY_CONTEXT)), true);
if (config.get(SecuritySettings.native_authentication_enabled) || config.get(SecuritySettings.native_authorization_enabled)) {
procedures.registerComponent(EnterpriseUserManager.class, ctx -> authManager.getUserManager(asEnterprise(ctx.get(SECURITY_CONTEXT))), true);
if (config.get(SecuritySettings.auth_providers).size() > 1) {
procedures.registerProcedure(UserManagementProcedures.class, true, Optional.of("%s only applies to native users."));
} else {
procedures.registerProcedure(UserManagementProcedures.class, true);
}
} else {
procedures.registerComponent(EnterpriseUserManager.class, ctx -> EnterpriseUserManager.NOOP, true);
}
procedures.registerProcedure(SecurityProcedures.class, true);
}
use of org.neo4j.logging.LogProvider in project neo4j by neo4j.
the class ServerBootstrapper method setupLogging.
private static LogProvider setupLogging(Config config) {
LogProvider userLogProvider = FormattedLogProvider.withoutRenderingContext().withDefaultLogLevel(config.get(GraphDatabaseSettings.store_internal_log_level)).toOutputStream(System.out);
JULBridge.resetJUL();
Logger.getLogger("").setLevel(Level.WARNING);
JULBridge.forwardTo(userLogProvider);
JettyLogBridge.setLogProvider(userLogProvider);
return userLogProvider;
}
Aggregations