Bug 449590 - DefaultRepositoryCache.put() with null data fails to update cache
Fixed DefaultRepositoryCache.put() to remove mapping if value is null Project: http://git-wip-us.apache.org/repos/asf/maven-resolver/repo Commit: http://git-wip-us.apache.org/repos/asf/maven-resolver/commit/7a07539f Tree: http://git-wip-us.apache.org/repos/asf/maven-resolver/tree/7a07539f Diff: http://git-wip-us.apache.org/repos/asf/maven-resolver/diff/7a07539f Branch: refs/heads/master Commit: 7a07539f08e121277a0c30d9323e16aa515699ca Parents: e6be118 Author: Benjamin Bentmann <bentm...@sonatype.com> Authored: Tue Nov 11 15:07:40 2014 +0100 Committer: Benjamin Bentmann <bentm...@sonatype.com> Committed: Tue Nov 11 15:07:40 2014 +0100 ---------------------------------------------------------------------- .../eclipse/aether/DefaultRepositoryCache.java | 6 +- .../aether/DefaultRepositoryCacheTest.java | 103 +++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/7a07539f/aether-api/src/main/java/org/eclipse/aether/DefaultRepositoryCache.java ---------------------------------------------------------------------- diff --git a/aether-api/src/main/java/org/eclipse/aether/DefaultRepositoryCache.java b/aether-api/src/main/java/org/eclipse/aether/DefaultRepositoryCache.java index 94664ea..12d2789 100644 --- a/aether-api/src/main/java/org/eclipse/aether/DefaultRepositoryCache.java +++ b/aether-api/src/main/java/org/eclipse/aether/DefaultRepositoryCache.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010, 2012 Sonatype, Inc. + * Copyright (c) 2010, 2014 Sonatype, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -34,6 +34,10 @@ public final class DefaultRepositoryCache { cache.put( key, data ); } + else + { + cache.remove( key ); + } } } http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/7a07539f/aether-api/src/test/java/org/eclipse/aether/DefaultRepositoryCacheTest.java ---------------------------------------------------------------------- diff --git a/aether-api/src/test/java/org/eclipse/aether/DefaultRepositoryCacheTest.java b/aether-api/src/test/java/org/eclipse/aether/DefaultRepositoryCacheTest.java new file mode 100644 index 0000000..59dbd76 --- /dev/null +++ b/aether-api/src/test/java/org/eclipse/aether/DefaultRepositoryCacheTest.java @@ -0,0 +1,103 @@ +/******************************************************************************* + * Copyright (c) 2014 Sonatype, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Sonatype, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.aether; + +import static org.junit.Assert.*; + +import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; + +import org.junit.Test; + +public class DefaultRepositoryCacheTest +{ + + private DefaultRepositoryCache cache = new DefaultRepositoryCache(); + + private RepositorySystemSession session = new DefaultRepositorySystemSession(); + + private Object get( Object key ) + { + return cache.get( session, key ); + } + + private void put( Object key, Object value ) + { + cache.put( session, key, value ); + } + + @Test( expected = RuntimeException.class ) + public void testGet_NullKey() + { + get( null ); + } + + @Test( expected = RuntimeException.class ) + public void testPut_NullKey() + { + put( null, "data" ); + } + + @Test + public void testGetPut() + { + Object key = "key"; + assertNull( get( key ) ); + put( key, "value" ); + assertEquals( "value", get( key ) ); + put( key, "changed" ); + assertEquals( "changed", get( key ) ); + put( key, null ); + assertNull( get( key ) ); + } + + @Test( timeout = 10000 ) + public void testConcurrency() + throws Exception + { + final AtomicReference<Throwable> error = new AtomicReference<Throwable>(); + Thread threads[] = new Thread[20]; + for ( int i = 0; i < threads.length; i++ ) + { + threads[i] = new Thread() + { + @Override + public void run() + { + for ( int i = 0; i < 100; i++ ) + { + String key = UUID.randomUUID().toString(); + try + { + put( key, Boolean.TRUE ); + assertEquals( Boolean.TRUE, get( key ) ); + } + catch ( Throwable t ) + { + error.compareAndSet( null, t ); + t.printStackTrace(); + } + } + } + }; + } + for ( Thread thread : threads ) + { + thread.start(); + } + for ( Thread thread : threads ) + { + thread.join(); + } + assertNull( String.valueOf( error.get() ), error.get() ); + } + +}