QualityTest.java

/*
 * Copyright (c) 2015, 2022 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package org.glassfish.jersey.message.internal;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;

import java.text.ParseException;
import java.util.Collections;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Stream;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

/**
 * Quality unit tests.
 *
 * @author Marek Potociar
 */
public class QualityTest {

    private static final Locale ORIGINAL_LOCALE = Locale.getDefault();

    public static Stream<Arguments> data() {
        return Stream.of(Arguments.of(Locale.US), Arguments.of(Locale.GERMANY));
    }

    /**
     * Test enhancing HTT header parameter map with a quality parameter.
     */
    @ParameterizedTest
    @MethodSource("data")
    public void testEnhanceWithQualityParameter(Locale locale) {
        try {
            Locale.setDefault(locale);
            Map<String, String> result;

            result = Quality.enhanceWithQualityParameter(null, "q", 1000);
            assertThat(result, equalTo(null));

            result = Quality.enhanceWithQualityParameter(null, "q", 200);
            assertThat(result, equalTo(asMap("q=0.2")));

            result = Quality.enhanceWithQualityParameter(null, "q", 220);
            assertThat(result, equalTo(asMap("q=0.22")));

            result = Quality.enhanceWithQualityParameter(null, "q", 222);
            assertThat(result, equalTo(asMap("q=0.222")));

            Map<String, String> parameters;

            parameters = asMap("a=b");
            result = Quality.enhanceWithQualityParameter(parameters, "q", 1000);
            assertThat(result, equalTo(parameters));

            result = Quality.enhanceWithQualityParameter(parameters, "q", 200);
            assertThat(result, equalTo(asMap("a=b;q=0.2")));

            result = Quality.enhanceWithQualityParameter(parameters, "q", 220);
            assertThat(result, equalTo(asMap("a=b;q=0.22")));

            result = Quality.enhanceWithQualityParameter(parameters, "q", 222);
            assertThat(result, equalTo(asMap("a=b;q=0.222")));

            // test quality parameter override
            parameters = asMap("a=b;q=0.3");
            result = Quality.enhanceWithQualityParameter(parameters, "q", 1000);
            assertThat(result, equalTo(asMap("a=b;q=1.0")));

            result = Quality.enhanceWithQualityParameter(parameters, "q", 200);
            assertThat(result, equalTo(asMap("a=b;q=0.2")));

            result = Quality.enhanceWithQualityParameter(parameters, "q", 220);
            assertThat(result, equalTo(asMap("a=b;q=0.22")));

            result = Quality.enhanceWithQualityParameter(parameters, "q", 222);
            assertThat(result, equalTo(asMap("a=b;q=0.222")));
        } finally {
            Locale.setDefault(ORIGINAL_LOCALE);
        }
    }

    /**
     * Creates a map from HTTP header parameter strings.
     *
     * @param parameters HTTP header parameters string.
     * @return HTTP header parameters map.
     */
    public static Map<String, String> asMap(String parameters) {
        HttpHeaderReader reader = HttpHeaderReader.newInstance(";" + parameters);

        if (reader.hasNext()) {
            try {
                return HttpHeaderReader.readParameters(reader);
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
        }

        return Collections.emptyMap();
    }
}