/** * Runs this {@link Robot} by checking its queue for a new wavelet and then * processing this wavelet. In the end the {@link Robot} will check whether it * needs to requeue itself in the RobotGateway or that no further actions need * to be taken. */ @Override public void run() { try { LOG.fine(robotName + " called for processing"); WaveletAndDeltas wavelet = dequeueWavelet(); if (wavelet == null) { gateway.doneRunning(this); return; } process(wavelet); } catch (RuntimeException e) { LOG.severe("Unexpected error occurred when robot " + robotName + " was called", e); } // Requeue since we either had an exception or we processed a wavelet. gateway.doneRunning(this); gateway.ensureScheduled(this); }
@Override protected void setUp() { waveletProvider = mock(WaveletProvider.class); robotConnector = mock(RobotConnector.class); accountStore = mock(AccountStore.class); serializer = mock(RobotSerializer.class); converterManager = mock(EventDataConverterManager.class); executor = new DeferredExecutor(); conversationUtil = mock(ConversationUtil.class); notifyOpService = mock(NotifyOperationService.class); gateway = new RobotsGateway(waveletProvider, robotConnector, accountStore, serializer, converterManager, executor, conversationUtil, notifyOpService); }
/** * Gets or creates a {@link Robot} for the given name. * * @param robotName the name of the robot. * @param account the {@link RobotAccountData} belonging to the given * {@link RobotName}. */ private Robot getOrCreateRobot(RobotName robotName, RobotAccountData account) { Robot robot = allRobots.get(robotName); if (robot == null) { robot = createNewRobot(robotName, account); allRobots.put(robotName, robot); } return robot; }
public void testUpdateRobotAccount() throws Exception { Robot robot = mock(Robot.class); RobotAccountData account = mock(RobotAccountData.class); when(robot.getAccount()).thenReturn(account); // Return newAccount when updated RobotAccountData newAccount = mock(RobotAccountData.class); when(robotConnector.fetchCapabilities(eq(account), any(String.class))).thenReturn(newAccount); gateway.updateRobotAccount(robot); verify(accountStore).putAccount(newAccount); } }
/** * Updates a {@link Robot} with information about a waveletUpdate event. * * @param robot The robot to process the update for. * @param wavelet the wavelet on which the update is occuring. * @param deltas the deltas the have been applied to the given wavelet. */ private void updateRobot(Robot robot, ReadableWaveletData wavelet, DeltaSequence deltas) { try { robot.waveletUpdate(wavelet, deltas); ensureScheduled(robot); } catch (OperationException e) { LOG.warning("Unable to update robot(" + robot.getRobotName() + ")", e); } }
RobotAccountData robotAccount = account.asRobot(); if (robotAccount.isVerified()) { Robot robot = getOrCreateRobot(robotName, robotAccount); updateRobot(robot, wavelet, deltas);
public void testUpdateRobotAccount() throws Exception { Robot robot = mock(Robot.class); RobotAccountData account = mock(RobotAccountData.class); when(robot.getAccount()).thenReturn(account); // Return newAccount when updated RobotAccountData newAccount = mock(RobotAccountData.class); when(robotConnector.fetchCapabilities(eq(account), any(String.class))).thenReturn(newAccount); gateway.updateRobotAccount(robot); verify(accountStore).putAccount(newAccount); } }
public void testEnsureRunnableCallsRobot() throws Exception { Robot robot = mock(Robot.class); when(robot.getRobotName()).thenReturn(RobotName.fromAddress("robot@example.com")); gateway.ensureScheduled(robot); executor.runAllCommands(); verify(robot).run(); }
public void testRunNotRequeingIfNoWork() { robot.run(); verify(gateway).doneRunning(robot); verify(gateway, never()).ensureScheduled(robot); }
@SuppressWarnings("unchecked") @Override protected void setUp() throws Exception { gateway = mock(RobotsGateway.class); connector = mock(RobotConnector.class); converterManager = mock(EventDataConverterManager.class); waveletProvider = mock(WaveletProvider.class); eventGenerator = mock(EventGenerator.class); operationApplicator = mock(RobotOperationApplicator.class); robot = new Robot(ROBOT_NAME, ACCOUNT, gateway, connector, converterManager, waveletProvider, eventGenerator, operationApplicator); // Set the initialized account when updateRobotAccount is called. doAnswer(new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { robot.setAccount(INITIALIZED_ACCOUNT); return null; } }).when(gateway).updateRobotAccount(robot); // Generate no events on default EventMessageBundle emptyMessageBundle = new EventMessageBundle(ROBOT_NAME.toEmailAddress(), ""); when(eventGenerator.generateEvents( any(WaveletAndDeltas.class), anyMap(), any(EventDataConverter.class))).thenReturn( emptyMessageBundle); }
public void testEnsureRunnableCallsRobot() throws Exception { Robot robot = mock(Robot.class); when(robot.getRobotName()).thenReturn(RobotName.fromAddress("robot@example.com")); gateway.ensureScheduled(robot); executor.runAllCommands(); verify(robot).run(); }
@Override protected void setUp() { waveletProvider = mock(WaveletProvider.class); robotConnector = mock(RobotConnector.class); accountStore = mock(AccountStore.class); serializer = mock(RobotSerializer.class); converterManager = mock(EventDataConverterManager.class); executor = new DeferredExecutor(); conversationUtil = mock(ConversationUtil.class); notifyOpService = mock(NotifyOperationService.class); gateway = new RobotsGateway(waveletProvider, robotConnector, accountStore, serializer, converterManager, executor, conversationUtil, notifyOpService); }
public void testRunNotRequeingIfNoWork() { robot.run(); verify(gateway).doneRunning(robot); verify(gateway, never()).ensureScheduled(robot); }
@SuppressWarnings("unchecked") @Override protected void setUp() throws Exception { gateway = mock(RobotsGateway.class); connector = mock(RobotConnector.class); converterManager = mock(EventDataConverterManager.class); waveletProvider = mock(WaveletProvider.class); eventGenerator = mock(EventGenerator.class); operationApplicator = mock(RobotOperationApplicator.class); robot = new Robot(ROBOT_NAME, ACCOUNT, gateway, connector, converterManager, waveletProvider, eventGenerator, operationApplicator); // Set the initialized account when updateRobotAccount is called. doAnswer(new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { robot.setAccount(INITIALIZED_ACCOUNT); return null; } }).when(gateway).updateRobotAccount(robot); // Generate no events on default EventMessageBundle emptyMessageBundle = new EventMessageBundle(ROBOT_NAME.toEmailAddress(), ""); when(eventGenerator.generateEvents( any(WaveletAndDeltas.class), anyMap(), any(EventDataConverter.class))).thenReturn( emptyMessageBundle); }
public void testRunRequeuesRobotIfDoneWork() throws Exception { enqueueEmptyWavelet(); robot.run(); verify(gateway).doneRunning(robot); verify(gateway).ensureScheduled(robot); }
try { LOG.info(robotName + ": Initializing capabilities"); gateway.updateRobotAccount(this); } catch (CapabilityFetchException e) { ReadableWaveletData snapshot = wavelet.getSnapshotAfterDeltas();
public void testRunRequeuesRobotIfDoneWork() throws Exception { enqueueEmptyWavelet(); robot.run(); verify(gateway).doneRunning(robot); verify(gateway).ensureScheduled(robot); }