UtilityClassCheckerTest.java 4.99 KB
/*
 * Copyright 2014-present Open Networking Laboratory
 *
 * Licensed 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.
 */
package org.onlab.junit;

import org.junit.Test;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.onlab.junit.UtilityClassChecker.assertThatClassIsUtility;

/**
 * Set of unit tests to check the implementation of the utility class
 * checker.
 */
public class UtilityClassCheckerTest {

    // CHECKSTYLE:OFF test data intentionally not final
    /**
     * Test class for non final class check.
     */
    static class NonFinal {
        private NonFinal() { }
    }
    // CHECKSTYLE:ON

    /**
     * Check that a non final class correctly produces an error.
     * @throws Exception if any of the reflection lookups fail.
     */
    @Test
    public void testNonFinalClass() throws Exception {
        boolean gotException = false;
        try {
            assertThatClassIsUtility(NonFinal.class);
        } catch (AssertionError assertion) {
            assertThat(assertion.getMessage(),
                       containsString("is not final"));
            gotException = true;
        }
        assertThat(gotException, is(true));
    }

    /**
     * Test class for final no constructor class check.
     */
    static final class FinalNoConstructor {
    }

    /**
     * Check that a final class with no declared constructor correctly produces
     * an error.  In this case, the compiler generates a default constructor
     * for you, but the constructor is 'protected' and will fail the check.
     *
     * @throws Exception if any of the reflection lookups fail.
     */
    @Test
    public void testFinalNoConstructorClass() throws Exception {
        boolean gotException = false;
        try {
            assertThatClassIsUtility(FinalNoConstructor.class);
        } catch (AssertionError assertion) {
            assertThat(assertion.getMessage(),
                    containsString("class with a default constructor that " +
                                   "is not private"));
            gotException = true;
        }
        assertThat(gotException, is(true));
    }

    /**
     * Test class for class with more than one constructor check.
     */
    static final class TwoConstructors {
        private TwoConstructors() { }
        private TwoConstructors(int x) { }
    }

    /**
     * Check that a non static class correctly produces an error.
     * @throws Exception if any of the reflection lookups fail.
     */
    @Test
    public void testOnlyOneConstructor() throws Exception {
        boolean gotException = false;
        try {
            assertThatClassIsUtility(TwoConstructors.class);
        } catch (AssertionError assertion) {
            assertThat(assertion.getMessage(),
                       containsString("more than one constructor"));
            gotException = true;
        }
        assertThat(gotException, is(true));
    }

    /**
     * Test class with a non private constructor.
     */
    static final class NonPrivateConstructor {
        protected NonPrivateConstructor() { }
    }

    /**
     * Check that a class with a non private constructor correctly
     * produces an error.
     * @throws Exception if any of the reflection lookups fail.
     */
    @Test
    public void testNonPrivateConstructor() throws Exception {

        boolean gotException = false;
        try {
            assertThatClassIsUtility(NonPrivateConstructor.class);
        } catch (AssertionError assertion) {
            assertThat(assertion.getMessage(),
                       containsString("constructor that is not private"));
            gotException = true;
        }
        assertThat(gotException, is(true));
    }

    /**
     * Test class with a non static method.
     */
    static final class NonStaticMethod {
        private NonStaticMethod() { }
        public void aPublicMethod() { }
    }

    /**
     * Check that a class with a non static method correctly produces an error.
     * @throws Exception if any of the reflection lookups fail.
     */
    @Test
    public void testNonStaticMethod() throws Exception {

        boolean gotException = false;
        try {
            assertThatClassIsUtility(NonStaticMethod.class);
        } catch (AssertionError assertion) {
            assertThat(assertion.getMessage(),
                       containsString("one or more non-static methods"));
            gotException = true;
        }
        assertThat(gotException, is(true));
    }
}