EnumEntityTest.java

/*
 * Copyright (c) 2021, 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.tests.e2e.entity;

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;

import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class EnumEntityTest extends JerseyTest {

    public enum SimpleEnum {
        VALUE1,
        VALUE2
    }

    public enum ValueEnum {
        VALUE100(100),
        VALUE200(200);

        private final int value;

        ValueEnum(int value) {
            this.value = value;
        }
    }

    @Path("/")
    public static class EnumResource {
        @POST
        @Path("/simple")
        public String postSimple(SimpleEnum simpleEnum) {
            return simpleEnum.name();
        }

        @POST
        @Path("/value")
        public String postValue(ValueEnum valueEnum) {
            return valueEnum.name();
        }

        @POST
        @Path("/echo")
        public String echo(String value) {
            return value;
        }

        @PUT
        @Path("/simple")
        public SimpleEnum putSimple(String simple) {
            return SimpleEnum.valueOf(simple);
        }

        @PUT
        @Path("value")
        public ValueEnum putValue(String value) {
            return ValueEnum.valueOf(value);
        }
    }

    @Override
    protected Application configure() {
        return new ResourceConfig(EnumResource.class);
    }

    // Server side tests

    @Test
    @Execution(ExecutionMode.CONCURRENT)
    public void testSimpleEnumServerReader() {
        for (SimpleEnum value : SimpleEnum.values()) {
            try (Response r = target("simple").request(MediaType.TEXT_PLAIN_TYPE)
                    .post(Entity.entity(value.name(), MediaType.TEXT_PLAIN_TYPE))) {
                Assertions.assertEquals(value.name(), r.readEntity(String.class));
            }
        }
    }

    @Test
    @Execution(ExecutionMode.CONCURRENT)
    public void testValueEnumServerReader() {
        for (ValueEnum value : ValueEnum.values()) {
            try (Response r = target("value").request(MediaType.TEXT_PLAIN_TYPE)
                    .post(Entity.entity(value.name(), MediaType.TEXT_PLAIN_TYPE))) {
                Assertions.assertEquals(value.name(), r.readEntity(String.class));
            }
        }
    }

    @Test
    @Execution(ExecutionMode.CONCURRENT)
    public void testSimpleEnumServerWriter() {
        for (SimpleEnum value : SimpleEnum.values()) {
            try (Response r = target("simple").request(MediaType.TEXT_PLAIN_TYPE)
                    .put(Entity.entity(value.name(), MediaType.TEXT_PLAIN_TYPE))) {
                Assertions.assertEquals(value.name(), r.readEntity(String.class));
            }
        }
    }

    @Test
    @Execution(ExecutionMode.CONCURRENT)
    public void testValueEnumServerWriter() {
        for (ValueEnum value : ValueEnum.values()) {
            try (Response r = target("value").request(MediaType.TEXT_PLAIN_TYPE)
                    .put(Entity.entity(value.name(), MediaType.TEXT_PLAIN_TYPE))) {
                Assertions.assertEquals(value.name(), r.readEntity(String.class));
            }
        }
    }

    // Client side tests

    @Test
    @Execution(ExecutionMode.CONCURRENT)
    public void testSimpleEnumClientReader() {
        for (SimpleEnum value : SimpleEnum.values()) {
            try (Response r = target("simple").request(MediaType.TEXT_PLAIN_TYPE)
                    .post(Entity.entity(value.name(), MediaType.TEXT_PLAIN_TYPE))) {
                Assertions.assertEquals(value, r.readEntity(SimpleEnum.class));
            }
        }
    }

    @Test
    @Execution(ExecutionMode.CONCURRENT)
    public void testValueEnumClientReader() {
        for (ValueEnum value : ValueEnum.values()) {
            try (Response r = target("value").request(MediaType.TEXT_PLAIN_TYPE)
                    .post(Entity.entity(value.name(), MediaType.TEXT_PLAIN_TYPE))) {
                Assertions.assertEquals(value, r.readEntity(ValueEnum.class));
            }
        }
    }

    @Test
    @Execution(ExecutionMode.CONCURRENT)
    public void testSimpleEnumClientWriter() {
        for (SimpleEnum value : SimpleEnum.values()) {
            try (Response r = target("echo").request(MediaType.TEXT_PLAIN_TYPE)
                    .post(Entity.entity(value, MediaType.TEXT_PLAIN_TYPE))) {
                Assertions.assertEquals(value.name(), r.readEntity(String.class));
            }
        }
    }

    @Test
    @Execution(ExecutionMode.CONCURRENT)
    public void testValueEnumClientWriter() {
        for (ValueEnum value : ValueEnum.values()) {
            try (Response r = target("echo").request(MediaType.TEXT_PLAIN_TYPE)
                    .post(Entity.entity(value, MediaType.TEXT_PLAIN_TYPE))) {
                Assertions.assertEquals(value.name(), r.readEntity(String.class));
            }
        }
    }

}