@Test public void update_scheduledOnShorterTime_ifLastUpdate_fartherInterval() { CloudSdkServiceUserSettings.getInstance().setLastAutomaticUpdateTimestamp(1); when(mockClock.millis()).thenReturn(ManagedCloudSdkUpdateService.SDK_UPDATE_INTERVAL_MS / 2); managedCloudSdkUpdateService.activate(); verify(managedCloudSdkUpdateService) .schedule( any(), eq((ManagedCloudSdkUpdateService.SDK_UPDATE_INTERVAL_MS / 2) + 1), eq(ManagedCloudSdkUpdateService.SDK_UPDATE_INTERVAL_MS)); }
/** * Calculates milliseconds delay before first update based on last update/install time. If * complete update interval or more elapsed, first update is scheduled immediately (returns 0). */ private long getDelayBeforeFirstUpdate() { Optional<Long> lastTimeOfUpdate = CloudSdkServiceUserSettings.getInstance().getLastAutomaticUpdateTimestamp(); long delayBeforeUpdateMillis = SDK_UPDATE_INTERVAL_MS; if (lastTimeOfUpdate.isPresent()) { delayBeforeUpdateMillis = Math.min( SDK_UPDATE_INTERVAL_MS, Math.max(0, SDK_UPDATE_INTERVAL_MS - (getClock().millis() - lastTimeOfUpdate.get()))); } return delayBeforeUpdateMillis; }
void activate() { if (!CloudSdkServiceUserSettings.getInstance().isAutomaticUpdateEnabled()) { return; } if (updateTimer == null) { updateTimer = new Timer(SDK_UPDATER_THREAD_NAME); } // cancel tasks from previous activation. if (sdkUpdateTask != null) { sdkUpdateTask.cancel(); } sdkUpdateTask = new TimerTask() { @Override public void run() { doUpdate(); } }; schedule(sdkUpdateTask, getDelayBeforeFirstUpdate(), SDK_UPDATE_INTERVAL_MS); }
@Override public void activate() { initManagedSdk(); if (isInstallSupported()) { ManagedCloudSdkUpdateService.getInstance().activate(); } }
@Before public void setUp() { // add timer thread to one not to be checked for 'leaks' ThreadTracker.longRunningThreadCreated( ApplicationManager.getApplication(), ManagedCloudSdkUpdateService.SDK_UPDATER_THREAD_NAME); when(mockPluginInfoService.shouldEnable(GctFeature.MANAGED_SDK_UPDATE)).thenReturn(true); when(mockSdkServiceManager.getCloudSdkService()).thenReturn(mockSdkService); ManagedCloudSdkServiceUiPresenter.setInstance(mockUiPresenter); doReturn(mockClock).when(managedCloudSdkUpdateService).getClock(); doReturn(mockUiTimer).when(managedCloudSdkUpdateService).createUiTimer(anyInt()); when(mockUiPresenter.notifyManagedSdkUpdate(any(), any())).thenReturn(mockNotification); // directly execute scheduled tasks. doAnswer( invocationOnMock -> { ((TimerTask) invocationOnMock.getArgument(0)).run(); return null; }) .when(managedCloudSdkUpdateService) .schedule(any(), anyLong(), anyLong()); // directly call task assigned to UI timer. doAnswer( invocationOnMock -> { ((ActionListener) invocationOnMock.getArgument(0)) .actionPerformed(mock(ActionEvent.class)); return null; }) .when(mockUiTimer) .addActionListener(any()); CloudSdkServiceUserSettings.reset(); }
@Test public void failed_update_writes_lastUpdateTime() throws Exception { makeMockSdkInstalled(MOCK_SDK_PATH); emulateMockSdkUpdateProcess(); SdkUpdater mockUpdater = mockManagedCloudSdk.newUpdater(); doThrow(new CommandExitException(-1, "")).when(mockUpdater).update(any(), any()); // supply custom clock to check update time has been properly set in settings. Clock mockClock = mock(Clock.class); when(mockUpdateService.getClock()).thenReturn(mockClock); long updateTime = 1000L; when(mockClock.millis()).thenReturn(updateTime); doCallRealMethod().when(mockUpdateService).notifySdkUpdateCompleted(); sdkService.update(); verify(mockUpdateService).notifySdkUpdateCompleted(); assertThat( CloudSdkServiceUserSettings.getInstance().getLastAutomaticUpdateTimestamp().isPresent()) .isTrue(); assertThat(CloudSdkServiceUserSettings.getInstance().getLastAutomaticUpdateTimestamp().get()) .isEqualTo(updateTime); }
@Test public void notification_shown_beforeUpdate() { when(mockSdkService.isUpToDate()).thenReturn(false); managedCloudSdkUpdateService.activate(); ApplicationManager.getApplication() .invokeAndWait(() -> verify(mockUiPresenter).notifyManagedSdkUpdate(any(), any())); }
ManagedCloudSdkUpdateService.getInstance().notifySdkUpdateCompleted();
javax.swing.Timer uiTimer = createUiTimer(UPDATE_NOTIFICATION_EXPIRATION_TIME_MS); ActionListener cancelListener = (e) -> uiTimer.stop(); ActionListener disableUpdateListener =
@Test public void update_notCalled_when_sdk_upToDate() { when(mockSdkService.isUpToDate()).thenReturn(true); managedCloudSdkUpdateService.activate(); // managed SDK is UI thread only, ApplicationManager.getApplication() .invokeAndWait(() -> verify(mockSdkService, never()).update()); }
public void apply() throws ConfigurationException { CloudSdkServiceUserSettings sdkServiceUserSettings = CloudSdkServiceUserSettings.getInstance(); if (customRadioButton.isSelected()) { String customSdkPathText = getCloudSdkDirectoryText(); if (CloudSdkValidator.getInstance() .validateCloudSdk(customSdkPathText) .contains(CloudSdkValidationResult.MALFORMED_PATH)) { throw new ConfigurationException( CloudSdkMessageBundle.message("appengine.cloudsdk.location.badchars.message")); } sdkServiceUserSettings.setCustomSdkPath(customSdkPathText); } CloudSdkServiceType previousSdkType = sdkServiceUserSettings.getUserSelectedSdkServiceType(); if (previousSdkType != selectedCloudSdkServiceType) { // notify SDK manager about changed selection ServiceManager.getService(CloudSdkServiceManager.class) .onNewCloudSdkServiceTypeSelected(selectedCloudSdkServiceType); } sdkServiceUserSettings.setUserSelectedSdkServiceType(selectedCloudSdkServiceType); boolean previousAutomaticUpdateEnabled = sdkServiceUserSettings.isAutomaticUpdateEnabled(); sdkServiceUserSettings.setEnableAutomaticUpdates(enableAutomaticUpdatesCheckbox.isSelected()); if (enableAutomaticUpdatesCheckbox.isSelected() && !previousAutomaticUpdateEnabled) { // activate updates again. ManagedCloudSdkUpdateService.getInstance().activate(); } // settings are applied and saved, clear modification status settingsModified = false; }
@Override public void onSuccess(ManagedSdkJobResult result) { logger.info( "Managed Google Cloud SDK successfully installed/updated at: " + getSdkHomePath()); updateStatus(SdkStatus.READY); if (result == ManagedSdkJobResult.PROCESSED) { ManagedCloudSdkUpdateService.getInstance().notifySdkUpdateCompleted(); String trackingEventAction; switch (jobType) { case UPDATE: trackingEventAction = GctTracking.MANAGED_SDK_SUCCESSFUL_UPDATE; break; default: trackingEventAction = GctTracking.MANAGED_SDK_SUCCESSFUL_INSTALL; break; } UsageTrackerService.getInstance().trackEvent(trackingEventAction).ping(); } ManagedCloudSdkServiceUiPresenter.getInstance().notifyManagedSdkJobSuccess(jobType, result); // no need to abstain from checking install status anymore after success. CloudSdkServiceUserSettings.getInstance().setUserCancelledInstallation(false); }
@Test public void update_scheduledNow_ifLastUpdate_elapsed() { CloudSdkServiceUserSettings.getInstance().setLastAutomaticUpdateTimestamp(1); when(mockClock.millis()).thenReturn(ManagedCloudSdkUpdateService.SDK_UPDATE_INTERVAL_MS + 2); managedCloudSdkUpdateService.activate(); verify(managedCloudSdkUpdateService) .schedule(any(), eq(0L), eq(ManagedCloudSdkUpdateService.SDK_UPDATE_INTERVAL_MS)); }
@Test public void update_called_when_sdk_notUpToDate() { when(mockSdkService.isUpToDate()).thenReturn(false); managedCloudSdkUpdateService.activate(); // managed SDK is UI thread only, ApplicationManager.getApplication().invokeAndWait(() -> verify(mockSdkService).update()); }
/** * Called when managed SDK update operation (update or install) completes, either with success or * failure. */ void notifySdkUpdateCompleted() { CloudSdkServiceUserSettings.getInstance().setLastAutomaticUpdateTimestamp(getClock().millis()); }
@Test public void notification_disableUpdates_updatesSettings() { when(mockSdkService.isUpToDate()).thenReturn(false); CloudSdkServiceUserSettings.getInstance().setEnableAutomaticUpdates(true); managedCloudSdkUpdateService.activate(); ApplicationManager.getApplication() .invokeAndWait( () -> { ArgumentCaptor<ActionListener> disableListener = ArgumentCaptor.forClass(ActionListener.class); verify(mockUiPresenter).notifyManagedSdkUpdate(any(), disableListener.capture()); disableListener.getValue().actionPerformed(mock(ActionEvent.class)); assertThat(CloudSdkServiceUserSettings.getInstance().isAutomaticUpdateEnabled()) .isFalse(); }); } }
@Test public void automaticUpdate_enabled_callsUpdater_activate() { ApplicationManager.getApplication() .invokeAndWait( () -> { // use non-spy panel as spy messes up with UI event thread field updates. CloudSdkPanel sdkPanel = new CloudSdkPanel(); CloudSdkServiceUserSettings.getInstance() .setUserSelectedSdkServiceType(CloudSdkServiceType.MANAGED_SDK); CloudSdkServiceUserSettings.getInstance().setEnableAutomaticUpdates(false); sdkPanel.reset(); sdkPanel.getEnableAutomaticUpdatesCheckbox().doClick(); try { sdkPanel.apply(); } catch (ConfigurationException e) { throw new AssertionError(e); } verify(managedCloudSdkUpdateService).activate(); }); }