001package org.eclipse.aether.internal.impl; 002 003/* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022import static org.junit.Assert.*; 023 024import java.io.File; 025import java.io.IOException; 026import java.net.URI; 027import java.util.Arrays; 028import java.util.Collection; 029import java.util.List; 030import java.util.Set; 031 032import org.eclipse.aether.DefaultRepositorySystemSession; 033import org.eclipse.aether.internal.impl.DefaultMetadataResolver; 034import org.eclipse.aether.internal.test.util.TestFileUtils; 035import org.eclipse.aether.internal.test.util.TestLocalRepositoryManager; 036import org.eclipse.aether.internal.test.util.TestUtils; 037import org.eclipse.aether.metadata.DefaultMetadata; 038import org.eclipse.aether.metadata.Metadata; 039import org.eclipse.aether.repository.LocalMetadataRegistration; 040import org.eclipse.aether.repository.RemoteRepository; 041import org.eclipse.aether.resolution.MetadataRequest; 042import org.eclipse.aether.resolution.MetadataResult; 043import org.eclipse.aether.spi.connector.ArtifactDownload; 044import org.eclipse.aether.spi.connector.MetadataDownload; 045import org.eclipse.aether.transfer.MetadataNotFoundException; 046import org.junit.After; 047import org.junit.Before; 048import org.junit.Test; 049 050/** 051 */ 052public class DefaultMetadataResolverTest 053{ 054 055 private DefaultMetadataResolver resolver; 056 057 private StubRepositoryConnectorProvider connectorProvider; 058 059 private RemoteRepository repository; 060 061 private DefaultRepositorySystemSession session; 062 063 private Metadata metadata; 064 065 private RecordingRepositoryConnector connector; 066 067 private TestLocalRepositoryManager lrm; 068 069 @Before 070 public void setup() 071 throws Exception 072 { 073 session = TestUtils.newSession(); 074 lrm = (TestLocalRepositoryManager) session.getLocalRepositoryManager(); 075 connectorProvider = new StubRepositoryConnectorProvider(); 076 resolver = new DefaultMetadataResolver(); 077 resolver.setUpdateCheckManager( new StaticUpdateCheckManager( true ) ); 078 resolver.setRepositoryEventDispatcher( new StubRepositoryEventDispatcher() ); 079 resolver.setRepositoryConnectorProvider( connectorProvider ); 080 resolver.setRemoteRepositoryManager( new StubRemoteRepositoryManager() ); 081 resolver.setSyncContextFactory( new StubSyncContextFactory() ); 082 resolver.setOfflineController( new DefaultOfflineController() ); 083 repository = 084 new RemoteRepository.Builder( "test-DMRT", "default", 085 TestFileUtils.createTempDir().toURI().toURL().toString() ).build(); 086 metadata = new DefaultMetadata( "gid", "aid", "ver", "maven-metadata.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT ); 087 connector = new RecordingRepositoryConnector(); 088 connectorProvider.setConnector( connector ); 089 } 090 091 @After 092 public void teardown() 093 throws Exception 094 { 095 TestFileUtils.deleteFile( new File( new URI( repository.getUrl() ) ) ); 096 TestFileUtils.deleteFile( session.getLocalRepository().getBasedir() ); 097 } 098 099 @Test 100 public void testNoRepositoryFailing() 101 { 102 MetadataRequest request = new MetadataRequest( metadata, null, "" ); 103 List<MetadataResult> results = resolver.resolveMetadata( session, Arrays.asList( request ) ); 104 105 assertEquals( 1, results.size() ); 106 107 MetadataResult result = results.get( 0 ); 108 assertSame( request, result.getRequest() ); 109 assertNotNull( "" + ( result.getMetadata() != null ? result.getMetadata().getFile() : result.getMetadata() ), 110 result.getException() ); 111 assertEquals( MetadataNotFoundException.class, result.getException().getClass() ); 112 113 assertNull( result.getMetadata() ); 114 } 115 116 @Test 117 public void testResolve() 118 throws IOException 119 { 120 connector.setExpectGet( metadata ); 121 122 // prepare "download" 123 File file = 124 new File( session.getLocalRepository().getBasedir(), 125 session.getLocalRepositoryManager().getPathForRemoteMetadata( metadata, repository, "" ) ); 126 127 TestFileUtils.writeString( file, file.getAbsolutePath() ); 128 129 MetadataRequest request = new MetadataRequest( metadata, repository, "" ); 130 List<MetadataResult> results = resolver.resolveMetadata( session, Arrays.asList( request ) ); 131 132 assertEquals( 1, results.size() ); 133 134 MetadataResult result = results.get( 0 ); 135 assertSame( request, result.getRequest() ); 136 assertNull( result.getException() ); 137 assertNotNull( result.getMetadata() ); 138 assertNotNull( result.getMetadata().getFile() ); 139 140 assertEquals( file, result.getMetadata().getFile() ); 141 assertEquals( metadata, result.getMetadata().setFile( null ) ); 142 143 connector.assertSeenExpected(); 144 Set<Metadata> metadataRegistration = 145 ( (TestLocalRepositoryManager) session.getLocalRepositoryManager() ).getMetadataRegistration(); 146 assertTrue( metadataRegistration.contains( metadata ) ); 147 assertEquals( 1, metadataRegistration.size() ); 148 } 149 150 @Test 151 public void testRemoveMetadataIfMissing() 152 throws IOException 153 { 154 connector = new RecordingRepositoryConnector() 155 { 156 157 @Override 158 public void get( Collection<? extends ArtifactDownload> artifactDownloads, 159 Collection<? extends MetadataDownload> metadataDownloads ) 160 { 161 super.get( artifactDownloads, metadataDownloads ); 162 for ( MetadataDownload d : metadataDownloads ) 163 { 164 d.setException( new MetadataNotFoundException( metadata, repository ) ); 165 } 166 } 167 168 }; 169 connectorProvider.setConnector( connector ); 170 171 File file = 172 new File( session.getLocalRepository().getBasedir(), 173 session.getLocalRepositoryManager().getPathForRemoteMetadata( metadata, repository, "" ) ); 174 TestFileUtils.writeString( file, file.getAbsolutePath() ); 175 metadata.setFile( file ); 176 177 MetadataRequest request = new MetadataRequest( metadata, repository, "" ); 178 request.setDeleteLocalCopyIfMissing( true ); 179 180 List<MetadataResult> results = resolver.resolveMetadata( session, Arrays.asList( request ) ); 181 assertEquals( 1, results.size() ); 182 MetadataResult result = results.get( 0 ); 183 184 assertNotNull( result.getException() ); 185 assertFalse( file.exists() ); 186 } 187 188 @Test 189 public void testOfflineSessionResolveMetadataMissing() 190 { 191 session.setOffline( true ); 192 MetadataRequest request = new MetadataRequest( metadata, repository, "" ); 193 List<MetadataResult> results = resolver.resolveMetadata( session, Arrays.asList( request ) ); 194 195 assertEquals( 1, results.size() ); 196 197 MetadataResult result = results.get( 0 ); 198 assertSame( request, result.getRequest() ); 199 assertNotNull( result.getException() ); 200 assertNull( result.getMetadata() ); 201 202 connector.assertSeenExpected(); 203 } 204 205 @Test 206 public void testOfflineSessionResolveMetadata() 207 throws IOException 208 { 209 session.setOffline( true ); 210 211 String path = session.getLocalRepositoryManager().getPathForRemoteMetadata( metadata, repository, "" ); 212 File file = new File( session.getLocalRepository().getBasedir(), path ); 213 TestFileUtils.writeString( file, file.getAbsolutePath() ); 214 215 // set file to use in TestLRM find() 216 metadata = metadata.setFile( file ); 217 218 MetadataRequest request = new MetadataRequest( metadata, repository, "" ); 219 List<MetadataResult> results = resolver.resolveMetadata( session, Arrays.asList( request ) ); 220 221 assertEquals( 1, results.size() ); 222 MetadataResult result = results.get( 0 ); 223 assertSame( request, result.getRequest() ); 224 assertNull( String.valueOf( result.getException() ), result.getException() ); 225 assertNotNull( result.getMetadata() ); 226 assertNotNull( result.getMetadata().getFile() ); 227 228 assertEquals( file, result.getMetadata().getFile() ); 229 assertEquals( metadata.setFile( null ), result.getMetadata().setFile( null ) ); 230 231 connector.assertSeenExpected(); 232 } 233 234 @Test 235 public void testFavorLocal() 236 throws IOException 237 { 238 lrm.add( session, new LocalMetadataRegistration( metadata ) ); 239 String path = session.getLocalRepositoryManager().getPathForLocalMetadata( metadata ); 240 File file = new File( session.getLocalRepository().getBasedir(), path ); 241 TestFileUtils.writeString( file, file.getAbsolutePath() ); 242 243 MetadataRequest request = new MetadataRequest( metadata, repository, "" ); 244 request.setFavorLocalRepository( true ); 245 resolver.setUpdateCheckManager( new StaticUpdateCheckManager( true, true ) ); 246 247 List<MetadataResult> results = resolver.resolveMetadata( session, Arrays.asList( request ) ); 248 249 assertEquals( 1, results.size() ); 250 MetadataResult result = results.get( 0 ); 251 assertSame( request, result.getRequest() ); 252 assertNull( String.valueOf( result.getException() ), result.getException() ); 253 254 connector.assertSeenExpected(); 255 } 256}