blob: d0d15ad78d9a5a09aeb9f9c0dfaaf8900901d444 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2017 EclipseSource.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
******************************************************************************/
package org.eclipse.equinox.p2.tests.repository;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.equinox.internal.p2.repository.CacheManager;
import org.eclipse.equinox.internal.p2.repository.Transport;
import org.eclipse.equinox.p2.core.IAgentLocation;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.core.IProvisioningAgentProvider;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
public class CacheManagerTest {
private static final int ONE_HOUR = 3600000;
URI repositoryLocation;
private File contentXmlFile;
private CacheManager cacheManager;
private final String cachePrefix = "content"; //$NON-NLS-1$
@Before
public void setUp() throws Exception {
repositoryLocation = createRepistory();
BundleContext bundle = Platform.getBundle("org.eclipse.equinox.p2.repository").getBundleContext();
ServiceReference<IProvisioningAgentProvider> serviceReference = bundle.getServiceReference(IProvisioningAgentProvider.class);
IProvisioningAgentProvider agentServiceFactory = bundle.getService(serviceReference);
IProvisioningAgent agent = agentServiceFactory.createAgent(repositoryLocation);
Transport transport = agent.getService(Transport.class);
cacheManager = new CacheManager(new AgentLocationMock(), transport);
}
@After
public void tearDown() throws Exception {
Path repositoryLocationPath = new Path(repositoryLocation.getPath());
deleteFileOrDirectory(repositoryLocationPath.toFile());
}
@Test
public void testRepositoryDowngraded() throws ProvisionException, IOException {
File cache = cacheManager.createCache(repositoryLocation, cachePrefix, new NullProgressMonitor());
long lastModifiedInitial = cache.lastModified();
// Do downgrade
long lastModifiedContent = contentXmlFile.lastModified();
contentXmlFile.setLastModified(lastModifiedContent - ONE_HOUR);
File cache2 = cacheManager.createCache(repositoryLocation, cachePrefix, new NullProgressMonitor());
assertFalse("Cache haven't been updated after repository downgrade", //$NON-NLS-1$
lastModifiedInitial == cache2.lastModified());
}
@Test
public void testClientDifferentTimeZone() throws ProvisionException, IOException {
File cache = cacheManager.createCache(repositoryLocation, cachePrefix, new NullProgressMonitor());
long lastModifiedInitial = cache.lastModified();
// do update
contentXmlFile.setLastModified(contentXmlFile.lastModified() + ONE_HOUR / 2);
// update client time zone to +1
cache.setLastModified(lastModifiedInitial + 3600000);
File cache2 = cacheManager.createCache(repositoryLocation, cachePrefix, new NullProgressMonitor());
assertFalse("Cache haven't been updated after repository update", //$NON-NLS-1$
lastModifiedInitial + ONE_HOUR == cache2.lastModified());
}
@Test
public void testRepositoryUpdate() throws ProvisionException, IOException {
File cache = cacheManager.createCache(repositoryLocation, cachePrefix, new NullProgressMonitor());
long lastModifiedInitial = cache.lastModified();
// Do update
long lastModifiedContent = contentXmlFile.lastModified();
contentXmlFile.setLastModified(lastModifiedContent + ONE_HOUR);
File cache2 = cacheManager.createCache(repositoryLocation, cachePrefix, new NullProgressMonitor());
assertFalse("Cache haven't been updated after repository update", //$NON-NLS-1$
lastModifiedInitial == cache2.lastModified());
}
private URI createRepistory() throws IOException {
File repository = File.createTempFile("remoteFile", ""); //$NON-NLS-1$//$NON-NLS-2$
repository.deleteOnExit();
assertTrue(repository.delete());
assertTrue(repository.mkdirs());
IPath contentXmlPath = new Path(repository.getAbsolutePath()).append("content.xml"); //$NON-NLS-1$
assertTrue(contentXmlPath.toFile().createNewFile());
contentXmlFile = contentXmlPath.toFile();
return repository.toURI();
}
class AgentLocationMock implements IAgentLocation {
@Override
public URI getDataArea(final String namespace) {
return repositoryLocation;
}
@Override
public URI getRootLocation() {
// ignore
return null;
}
}
private void deleteFileOrDirectory(final File path) {
if (path.exists()) {
if (path.isDirectory()) {
handleDirectory(path);
} else {
assertTrue(path.delete());
}
}
}
private void handleDirectory(final File path) {
File[] files = path.listFiles();
for (File file : files) {
if (file.isDirectory()) {
deleteFileOrDirectory(file);
} else {
assertTrue(file.delete());
}
}
}
}