001/*
002 * acme4j - Java ACME client
003 *
004 * Copyright (C) 2015 Richard "Shred" Körber
005 *   http://acme4j.shredzone.org
006 *
007 * Licensed under the Apache License, Version 2.0 (the "License");
008 * you may not use this file except in compliance with the License.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
013 */
014package org.shredzone.acme4j.connector;
015
016import static org.assertj.core.api.Assertions.assertThat;
017import static org.mockito.Mockito.mock;
018
019import java.net.Authenticator;
020import java.net.URL;
021import java.net.http.HttpClient;
022import java.time.Duration;
023
024import org.junit.jupiter.api.Test;
025
026/**
027 * Unit tests for {@link HttpConnector}.
028 */
029public class HttpConnectorTest {
030
031    /**
032     * Test if a {@link java.net.http.HttpClient.Builder} can be created and has proper
033     * default values.
034     */
035    @Test
036    public void testClientBuilderDefaultValues() {
037        var settings = new NetworkSettings();
038
039        var connector = new HttpConnector(settings);
040        var client = connector.createClientBuilder().build();
041
042        assertThat(client.connectTimeout().orElseThrow()).isEqualTo(settings.getTimeout());
043        assertThat(client.followRedirects()).isEqualTo(HttpClient.Redirect.NORMAL);
044        assertThat(client.authenticator()).isEmpty();
045    }
046
047    /**
048     * Test if a {@link java.net.http.HttpClient.Builder} can be created and if it is
049     * preconfigured properly.
050     */
051    @Test
052    public void testClientBuilder() {
053        var timeout = Duration.ofSeconds(50);
054        var authenticator = mock(Authenticator.class);
055
056        var settings = new NetworkSettings();
057        settings.setTimeout(timeout);
058        settings.setAuthenticator(authenticator);
059
060        var connector = new HttpConnector(settings);
061        var client = connector.createClientBuilder().build();
062
063        assertThat(client.connectTimeout().orElseThrow()).isEqualTo(timeout);
064        assertThat(client.followRedirects()).isEqualTo(HttpClient.Redirect.NORMAL);
065        assertThat(client.authenticator().orElseThrow()).isSameAs(authenticator);
066    }
067
068    /**
069     * Test if a {@link java.net.http.HttpRequest.Builder} can be created and has proper
070     * default values.
071     */
072    @Test
073    public void testRequestBuilderDefaultValues() throws Exception {
074        var url = new URL("http://example.org:123/foo");
075        var settings = new NetworkSettings();
076
077        var connector = new HttpConnector(settings);
078        var request = connector.createRequestBuilder(url).build();
079
080        assertThat(request.uri().toString()).isEqualTo(url.toExternalForm());
081        assertThat(request.timeout().orElseThrow()).isEqualTo(settings.getTimeout());
082        assertThat(request.headers().firstValue("User-Agent").orElseThrow())
083                .isEqualTo(HttpConnector.defaultUserAgent());
084    }
085
086    /**
087     * Tests that the user agent is correct.
088     */
089    @Test
090    public void testUserAgent() {
091        var userAgent = HttpConnector.defaultUserAgent();
092        assertThat(userAgent).contains("acme4j/");
093        assertThat(userAgent).contains("Java/");
094    }
095
096}