/*
* Copyright 2015 ThoughtWorks, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.thoughtworks.go.server.service;
import com.thoughtworks.go.domain.GoVersion;
import com.thoughtworks.go.domain.VersionInfo;
import com.thoughtworks.go.server.cache.GoCache;
import com.thoughtworks.go.server.dao.VersionInfoDao;
import com.thoughtworks.go.util.SystemEnvironment;
import com.thoughtworks.go.util.SystemTimeClock;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import java.util.Date;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
public class ServerVersionInfoManagerTest {
VersionInfoDao versionInfoDao;
ServerVersionInfoBuilder builder;
ServerVersionInfoManager manager;
GoCache goCache;
SystemEnvironment systemEnvironment;
@Before
public void setUp() {
builder = mock(ServerVersionInfoBuilder.class);
versionInfoDao = mock(VersionInfoDao.class);
goCache = mock(GoCache.class);
systemEnvironment = mock(SystemEnvironment.class);
manager = new ServerVersionInfoManager(builder, versionInfoDao, new SystemTimeClock(), goCache, systemEnvironment);
stub(systemEnvironment.isProductionMode()).toReturn(true);
when(systemEnvironment.isGOUpdateCheckEnabled()).thenReturn(true);
}
@Test
public void shouldUseServerVersionInfoBuilderToGetServerVersionInfo(){
when(builder.getServerVersionInfo()).thenReturn(new VersionInfo());
manager.initialize();
verify(builder).getServerVersionInfo();
}
@Test
public void shouldAddNewVersionInfoToCacheIfLatestVersionIsGreaterThanInstalledVersion(){
GoVersion currentVersion = new GoVersion("1.2.3-1");
GoVersion latestVersion = new GoVersion("2.3.4-2");
VersionInfo versionInfo = new VersionInfo("go_server", currentVersion, latestVersion, null);
when(builder.getServerVersionInfo()).thenReturn(versionInfo);
manager.initialize();
verify(builder).getServerVersionInfo();
verify(goCache).put("GOUpdate", latestVersion.toString());
}
@Test
public void shouldNotUpdateCacheIfLatestVersionIsLesserThanInstalledVersion(){
GoVersion currentVersion = new GoVersion("4.7.3-1");
GoVersion latestVersion = new GoVersion("2.3.4-2");
VersionInfo versionInfo = new VersionInfo("go_server", currentVersion, latestVersion, null);
when(builder.getServerVersionInfo()).thenReturn(versionInfo);
manager.initialize();
verify(builder).getServerVersionInfo();
verify(goCache, never()).put(anyString(), anyString());
}
@Test
public void shouldNotUpdateCacheIfServerVersionInfoIsUnAvailable(){
when(builder.getServerVersionInfo()).thenReturn(null);
manager.initialize();
verify(builder).getServerVersionInfo();
verify(goCache, never()).put(anyString(), anyString());
}
@Test
public void shouldReturnVersionInfoIfServerLatestVersionNotUpdated(){
Date yesterday = new Date(System.currentTimeMillis() - 24*60*60*1000);
VersionInfo versionInfo = new VersionInfo("go_server", new GoVersion("1.2.3-1"), new GoVersion("2.3.4-2"), yesterday);
when(builder.getServerVersionInfo()).thenReturn(versionInfo);
manager.initialize();
VersionInfo goVersionInfo = manager.versionInfoForUpdate();
assertThat(goVersionInfo, is(versionInfo));
}
@Test
public void shouldNotReturnVersionInfoIfLatestVersionUpdatedToday(){
Date today = new Date();
VersionInfo versionInfo = new VersionInfo("go_server", new GoVersion("1.2.3-1"), new GoVersion("2.3.4-2"), today);
when(builder.getServerVersionInfo()).thenReturn(versionInfo);
manager.initialize();
VersionInfo serverVersionInfo = manager.versionInfoForUpdate();
assertNull(serverVersionInfo);
}
@Test
public void shouldNotReturnVersionInfoForDevelopementServer(){
when(builder.getServerVersionInfo()).thenReturn(null);
when(systemEnvironment.isProductionMode()).thenReturn(false);
manager.initialize();
assertNull(manager.versionInfoForUpdate());
}
@Test
public void shouldNotGetVersionInfoIfLatestVersionIsBeingUpdated(){
Date yesterday = new Date(System.currentTimeMillis() - 24*60*60*1000);
VersionInfo versionInfo = new VersionInfo("go_server", new GoVersion("1.2.3-1"), new GoVersion("2.3.4-2"), yesterday);
when(builder.getServerVersionInfo()).thenReturn(versionInfo);
manager.initialize();
VersionInfo serverVersionInfo1 = manager.versionInfoForUpdate();
VersionInfo serverVersionInfo2 = manager.versionInfoForUpdate();
assertNotNull(serverVersionInfo1);
assertNull(serverVersionInfo2);
}
@Test
public void shouldGetVersionInfoIflatestVersionIsBeingUpdatedForMoreThanHalfAnHour(){
SystemTimeClock systemTimeClock = mock(SystemTimeClock.class);
Date yesterday = new Date(System.currentTimeMillis() - 24*60*60*1000);
DateTime halfAnHourFromNow = new DateTime(System.currentTimeMillis() - 35 * 60 * 1000);
VersionInfo versionInfo = new VersionInfo("go_server", new GoVersion("1.2.3-1"), new GoVersion("2.3.4-2"), yesterday);
when(builder.getServerVersionInfo()).thenReturn(versionInfo);
when(systemTimeClock.currentDateTime()).thenReturn(halfAnHourFromNow);
manager = new ServerVersionInfoManager(builder, versionInfoDao, systemTimeClock, goCache, systemEnvironment);
manager.initialize();
VersionInfo serverVersionInfo1 = manager.versionInfoForUpdate();
VersionInfo serverVersionInfo2 = manager.versionInfoForUpdate();
assertNotNull(serverVersionInfo1);
assertNotNull(serverVersionInfo2);
}
@Test
public void shouldBeAbleToUpdateTheLatestGOVersion(){
SystemTimeClock systemTimeClock = mock(SystemTimeClock.class);
VersionInfo versionInfo = new VersionInfo("go_server", new GoVersion("1.2.3-1"), new GoVersion("2.3.4-1"), null);
Date now = new Date();
when(builder.getServerVersionInfo()).thenReturn(versionInfo);
when(systemTimeClock.currentTime()).thenReturn(now);
manager = new ServerVersionInfoManager(builder, versionInfoDao, systemTimeClock, goCache, systemEnvironment);
manager.initialize();
VersionInfo info = manager.updateLatestVersion("15.0.1-123");
assertThat(info.getLatestVersion().toString(), is("15.0.1-123"));
assertThat(info.getLatestVersionUpdatedAt(), is(now));
verify(versionInfoDao).saveOrUpdate(versionInfo);
}
@Test
public void shouldUpdateCacheWithNewVersionIfLatestVersionIsGreaterThanInstalledVersion(){
SystemTimeClock systemTimeClock = mock(SystemTimeClock.class);
VersionInfo versionInfo = new VersionInfo("go_server", new GoVersion("1.2.3-1"), new GoVersion("1.2.3-1"), null);
Date now = new Date();
when(builder.getServerVersionInfo()).thenReturn(versionInfo);
when(systemTimeClock.currentTime()).thenReturn(now);
manager = new ServerVersionInfoManager(builder, versionInfoDao, systemTimeClock, goCache, systemEnvironment);
manager.initialize();
manager.updateLatestVersion("15.0.1-123");
verify(goCache).put("GOUpdate", "15.0.1-123");
}
@Test
public void shouldGetGoUpdateFromCache(){
String newRelease = "15.0.1-123";
GoCache goCache = mock(GoCache.class);
when(goCache.get("GOUpdate")).thenReturn(newRelease);
manager = new ServerVersionInfoManager(builder, versionInfoDao, new SystemTimeClock(), goCache, null);
assertThat(manager.getGoUpdate(), is(newRelease));
}
@Test
public void shouldBeTrueIfVersionCheckEnabledOnProductionServer(){
SystemEnvironment systemEnvironment = mock(SystemEnvironment.class);
when(builder.getServerVersionInfo()).thenReturn(new VersionInfo());
when(systemEnvironment.isGOUpdateCheckEnabled()).thenReturn(true);
when(systemEnvironment.isProductionMode()).thenReturn(true);
manager = new ServerVersionInfoManager(builder, versionInfoDao, new SystemTimeClock(), goCache, systemEnvironment);
manager.initialize();
assertTrue(manager.isUpdateCheckEnabled());
}
@Test
public void updateCheckShouldBeDisabledForADevelopmentServer(){
SystemEnvironment systemEnvironment = mock(SystemEnvironment.class);
when(builder.getServerVersionInfo()).thenReturn(new VersionInfo());
when(systemEnvironment.isProductionMode()).thenReturn(false);
when(systemEnvironment.isGOUpdateCheckEnabled()).thenReturn(true);
manager = new ServerVersionInfoManager(builder, versionInfoDao, new SystemTimeClock(), goCache, systemEnvironment);
manager.initialize();
assertFalse(manager.isUpdateCheckEnabled());
}
@Test
public void shouldBeFalseIfVersionCheckIsDisabled(){
SystemEnvironment systemEnvironment = mock(SystemEnvironment.class);
when(builder.getServerVersionInfo()).thenReturn(new VersionInfo());
when(systemEnvironment.isProductionMode()).thenReturn(true);
when(systemEnvironment.isGOUpdateCheckEnabled()).thenReturn(false);
manager = new ServerVersionInfoManager(builder, versionInfoDao, new SystemTimeClock(), goCache, systemEnvironment);
manager.initialize();
assertFalse(manager.isUpdateCheckEnabled());
}
}