package org.eclipse.aether;

/*
 * 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.
 */

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Arrays;
import java.util.Collections;

import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.collection.CollectRequest;
import org.eclipse.aether.collection.CollectResult;
import org.eclipse.aether.collection.DependencyCollectionException;
import org.eclipse.aether.collection.UnsolvableVersionConflictException;
import org.eclipse.aether.graph.DefaultDependencyNode;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.graph.DependencyNode;
import org.eclipse.aether.metadata.DefaultMetadata;
import org.eclipse.aether.metadata.Metadata;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
import org.eclipse.aether.repository.Proxy;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.ArtifactDescriptorException;
import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
import org.eclipse.aether.resolution.ArtifactDescriptorResult;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.eclipse.aether.resolution.ArtifactResult;
import org.eclipse.aether.resolution.DependencyRequest;
import org.eclipse.aether.resolution.DependencyResolutionException;
import org.eclipse.aether.resolution.DependencyResult;
import org.eclipse.aether.resolution.VersionRangeRequest;
import org.eclipse.aether.resolution.VersionRangeResolutionException;
import org.eclipse.aether.resolution.VersionRangeResult;
import org.eclipse.aether.resolution.VersionRequest;
import org.eclipse.aether.resolution.VersionResolutionException;
import org.eclipse.aether.resolution.VersionResult;
import org.eclipse.aether.transfer.ArtifactNotFoundException;
import org.eclipse.aether.transfer.ArtifactTransferException;
import org.eclipse.aether.transfer.MetadataNotFoundException;
import org.eclipse.aether.transfer.MetadataTransferException;
import org.eclipse.aether.transfer.NoRepositoryConnectorException;
import org.eclipse.aether.transfer.NoRepositoryLayoutException;
import org.eclipse.aether.transfer.NoTransporterException;
import org.eclipse.aether.transfer.RepositoryOfflineException;
import org.junit.Test;

public class RepositoryExceptionTest
{

    private void assertSerializable( RepositoryException e )
    {
        try
        {
            ObjectOutputStream oos = new ObjectOutputStream( new ByteArrayOutputStream() );
            oos.writeObject( e );
            oos.close();
        }
        catch ( IOException ioe )
        {
            throw new IllegalStateException( ioe );
        }
    }

    private RequestTrace newTrace()
    {
        return new RequestTrace( "test" );
    }

    private Artifact newArtifact()
    {
        return new DefaultArtifact( "gid", "aid", "ext", "1" );
    }

    private Metadata newMetadata()
    {
        return new DefaultMetadata( "maven-metadata.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT );
    }

    private RemoteRepository newRepo()
    {
        Proxy proxy = new Proxy( Proxy.TYPE_HTTP, "localhost", 8080, null );
        return new RemoteRepository.Builder( "id", "test", "http://localhost" ).setProxy( proxy ).build();
    }

    @Test
    public void testArtifactDescriptorException_Serializable()
    {
        ArtifactDescriptorRequest request = new ArtifactDescriptorRequest();
        request.setArtifact( newArtifact() ).addRepository( newRepo() ).setTrace( newTrace() );
        ArtifactDescriptorResult result = new ArtifactDescriptorResult( request );
        assertSerializable( new ArtifactDescriptorException( result ) );
    }

    @Test
    public void testArtifactResolutionException_Serializable()
    {
        ArtifactRequest request = new ArtifactRequest();
        request.setArtifact( newArtifact() ).addRepository( newRepo() ).setTrace( newTrace() );
        ArtifactResult result = new ArtifactResult( request );
        assertSerializable( new ArtifactResolutionException( Arrays.asList( result ) ) );
    }

    @Test
    public void testArtifactTransferException_Serializable()
    {
        assertSerializable( new ArtifactTransferException( newArtifact(), newRepo(), "error" ) );
    }

    @Test
    public void testArtifactNotFoundException_Serializable()
    {
        assertSerializable( new ArtifactNotFoundException( newArtifact(), newRepo(), "error" ) );
    }

    @Test
    public void testDependencyCollectionException_Serializable()
    {
        CollectRequest request = new CollectRequest();
        request.addDependency( new Dependency( newArtifact(), "compile" ) );
        request.addRepository( newRepo() );
        request.setTrace( newTrace() );
        CollectResult result = new CollectResult( request );
        assertSerializable( new DependencyCollectionException( result ) );
    }

    @Test
    public void testDependencyResolutionException_Serializable()
    {
        CollectRequest request = new CollectRequest();
        request.addDependency( new Dependency( newArtifact(), "compile" ) );
        request.addRepository( newRepo() );
        request.setTrace( newTrace() );
        DependencyRequest req = new DependencyRequest();
        req.setTrace( newTrace() );
        req.setCollectRequest( request );
        DependencyResult result = new DependencyResult( req );
        assertSerializable( new DependencyResolutionException( result, null ) );
    }

    @Test
    public void testMetadataTransferException_Serializable()
    {
        assertSerializable( new MetadataTransferException( newMetadata(), newRepo(), "error" ) );
    }

    @Test
    public void testMetadataNotFoundException_Serializable()
    {
        assertSerializable( new MetadataNotFoundException( newMetadata(), newRepo(), "error" ) );
    }

    @Test
    public void testNoLocalRepositoryManagerException_Serializable()
    {
        assertSerializable( new NoLocalRepositoryManagerException( new LocalRepository( "/tmp" ) ) );
    }

    @Test
    public void testNoRepositoryConnectorException_Serializable()
    {
        assertSerializable( new NoRepositoryConnectorException( newRepo() ) );
    }

    @Test
    public void testNoRepositoryLayoutException_Serializable()
    {
        assertSerializable( new NoRepositoryLayoutException( newRepo() ) );
    }

    @Test
    public void testNoTransporterException_Serializable()
    {
        assertSerializable( new NoTransporterException( newRepo() ) );
    }

    @Test
    public void testRepositoryOfflineException_Serializable()
    {
        assertSerializable( new RepositoryOfflineException( newRepo() ) );
    }

    @Test
    public void testUnsolvableVersionConflictException_Serializable()
    {
        DependencyNode node = new DefaultDependencyNode( new Dependency( newArtifact(), "test" ) );
        assertSerializable( new UnsolvableVersionConflictException( Collections.singleton( Arrays.asList( node ) ) ) );
    }

    @Test
    public void testVersionResolutionException_Serializable()
    {
        VersionRequest request = new VersionRequest();
        request.setArtifact( newArtifact() ).addRepository( newRepo() ).setTrace( newTrace() );
        VersionResult result = new VersionResult( request );
        assertSerializable( new VersionResolutionException( result ) );
    }

    @Test
    public void testVersionRangeResolutionException_Serializable()
    {
        VersionRangeRequest request = new VersionRangeRequest();
        request.setArtifact( newArtifact() ).addRepository( newRepo() ).setTrace( newTrace() );
        VersionRangeResult result = new VersionRangeResult( request );
        assertSerializable( new VersionRangeResolutionException( result ) );
    }

}
