/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.ivy.core.cache;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor;
import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.core.settings.IvySettings;
import org.apache.ivy.plugins.parser.ParserSettings;
import junit.framework.Assert;
import junit.framework.TestCase;
public class ModuleDescriptorMemoryCacheTest extends TestCase {
ModuleDescriptorMemoryCache cache = new ModuleDescriptorMemoryCache(2);
ParserSettings ivySettings = new IvySettings();
IvySettings ivySettings2 = new IvySettings();
File url1 = new File("file://cached/file.txt");;
File url2 = new File("file://cached/file2.txt");;
File url3 = new File("file://cached/file3.txt");;
ModuleRevisionId mrid1 = ModuleRevisionId.newInstance("org", "name", "rev");
ModuleDescriptor md1 = DefaultModuleDescriptor.newDefaultInstance(mrid1);
ModuleRevisionId mrid2 = ModuleRevisionId.newInstance("org", "name", "rev2");
ModuleDescriptor md2 = DefaultModuleDescriptor.newDefaultInstance(mrid2);
ModuleRevisionId mrid3 = ModuleRevisionId.newInstance("org", "name", "rev3");
ModuleDescriptor md3 = DefaultModuleDescriptor.newDefaultInstance(mrid3);
public void testUseModuleDescriptorProviderWhenModuleNotCached() throws ParseException,
IOException {
ModuleDescriptorProviderMock providerMock = new ModuleDescriptorProviderMock(md1);
assertEquals(md1, cache.get(url1, ivySettings, false, providerMock));
providerMock.assertCalled();
}
public void testCacheResultOfModuleDescriptorProvider() throws ParseException, IOException {
ModuleDescriptorProviderMock providerMock = new ModuleDescriptorProviderMock(md1);
ModuleDescriptorProviderMock providerMock2 = null;
assertEquals(md1, cache.get(url1, ivySettings, false, providerMock));
assertEquals(md1, cache.get(url1, ivySettings, false, providerMock2));
}
public void testValidationClearInvalidatedCache() throws ParseException, IOException {
ModuleDescriptorProviderMock providerMock = new ModuleDescriptorProviderMock(md1);
ModuleDescriptorProviderMock providerMock2 = new ModuleDescriptorProviderMock(md1);
;
assertEquals(md1, cache.get(url1, ivySettings, false, providerMock));
assertEquals(md1, cache.get(url1, ivySettings, true, providerMock2));
providerMock2.assertCalled();
}
public void testValidationDontClearvalidatedCache() throws ParseException, IOException {
ModuleDescriptorProviderMock providerMock = new ModuleDescriptorProviderMock(md1);
ModuleDescriptorProviderMock providerMock2 = null;
assertEquals(md1, cache.get(url1, ivySettings, true, providerMock));
assertEquals(md1, cache.get(url1, ivySettings, false, providerMock2));
}
public void testSizeIsLimitied() throws ParseException, IOException {
ModuleDescriptorProviderMock providerMock = new ModuleDescriptorProviderMock(md1);
ModuleDescriptorProviderMock providerMock1b = new ModuleDescriptorProviderMock(md1);
ModuleDescriptorProviderMock providerMock2 = new ModuleDescriptorProviderMock(md2);
ModuleDescriptorProviderMock providerMock3 = new ModuleDescriptorProviderMock(md3);
cache.get(url1, ivySettings, false, providerMock);
cache.get(url2, ivySettings, false, providerMock2);
cache.get(url3, ivySettings, false, providerMock3);// adding 1
cache.get(url1, ivySettings, false, providerMock1b);// and one has been removed
providerMock1b.assertCalled();
}
public void testLastRecentlyUsedIsFlushedWhenSizeExceed() throws ParseException, IOException {
ModuleDescriptorProviderMock providerMock = new ModuleDescriptorProviderMock(md1);
ModuleDescriptorProviderMock providerMock2 = new ModuleDescriptorProviderMock(md2);
ModuleDescriptorProviderMock providerMock2b = new ModuleDescriptorProviderMock(md1);
ModuleDescriptorProviderMock providerMock3 = new ModuleDescriptorProviderMock(md3);
cache.get(url1, ivySettings, false, providerMock);
cache.get(url2, ivySettings, false, providerMock2);
cache.get(url1, ivySettings, false, null);
cache.get(url3, ivySettings, false, providerMock3);
cache.get(url1, ivySettings, false, null);// and one has been removed
cache.get(url2, ivySettings, false, providerMock2b);
providerMock2b.assertCalled();
}
public void testVariableChangeInvalidateEntry() throws ParseException, IOException {
ModuleDescriptorProviderMock providerMock = new ModuleDescriptorProviderMock(md1);
ModuleDescriptorProviderMock providerMock2 = new ModuleDescriptorProviderMock(md1);
assertEquals(md1, cache.get(url1, ivySettings2, false, providerMock));
ivySettings2.getVariables().setVariable("val", "changedVal", true);
assertEquals(md1, cache.get(url1, ivySettings2, false, providerMock2));
providerMock2.assertCalled();
}
public void testGetStaleDontReadFromCache() throws ParseException, IOException {
ModuleDescriptorProviderMock providerMock = new ModuleDescriptorProviderMock(md1);
ModuleDescriptorProviderMock providerMock2 = new ModuleDescriptorProviderMock(md2);
assertEquals(md1, cache.get(url1, ivySettings, false, providerMock));
assertEquals(md2, cache.getStale(url1, ivySettings, false, providerMock2));
providerMock2.assertCalled();
}
public void testGetStaleStoreResultInCache() throws ParseException, IOException {
ModuleDescriptorProviderMock providerMock = new ModuleDescriptorProviderMock(md1);
ModuleDescriptorProviderMock providerMock2 = null;
assertEquals(md1, cache.getStale(url1, ivySettings, false, providerMock));
assertEquals(md1, cache.get(url1, ivySettings, false, providerMock2));
}
public void testASizeOf0MeansNoCache() throws ParseException, IOException {
cache = new ModuleDescriptorMemoryCache(0);
ModuleDescriptorProviderMock providerMock = new ModuleDescriptorProviderMock(md1);
ModuleDescriptorProviderMock providerMock2 = new ModuleDescriptorProviderMock(md1);
assertEquals(md1, cache.get(url1, ivySettings, false, providerMock));
assertEquals(md1, cache.get(url1, ivySettings, false, providerMock2));
providerMock2.assertCalled();
}
private static class ModuleDescriptorProviderMock implements ModuleDescriptorProvider {
private boolean called = false;
private final ModuleDescriptor result;
public ModuleDescriptorProviderMock(ModuleDescriptor result) {
this.result = result;
}
public ModuleDescriptor provideModule(ParserSettings ivySettings, File descriptorFile,
boolean validate) {
if (ivySettings != null) {
ivySettings.substitute("${val}");
}
called = true;
return result;
}
public void assertCalled() {
Assert.assertTrue(called);
}
}
}