org.apache.giraph.block_app.test_setup.TestGraphUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.giraph.block_app.test_setup.TestGraphUtils.java

Source

/*
 * 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.
 */
package org.apache.giraph.block_app.test_setup;

import org.apache.giraph.block_app.framework.BlockUtils;
import org.apache.giraph.conf.BulkConfigurator;
import org.apache.giraph.block_app.framework.api.local.LocalBlockRunner;
import org.apache.giraph.conf.BooleanConfOption;
import org.apache.giraph.conf.GiraphConfiguration;
import org.apache.giraph.function.Supplier;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;

/**
 * Utility functions for running TestGraph unit tests.
 */
public class TestGraphUtils {
    /** modify locally for running full Digraph tests from IDE */
    public static final BooleanConfOption USE_FULL_GIRAPH_ENV_IN_TESTS = new BooleanConfOption(
            "giraph.blocks.test_setup.use_full_giraph_env_in_tests", false,
            "Whether to use full giraph environemnt for tests, " + "or only local implementation");

    // if you want to check stability of the test and make sure it passes always
    // test it with larger number, like ~10.
    private static int TEST_REPEAT_TIMES = 1;

    private TestGraphUtils() {
    }

    /**
     * Creates configuration using configurator, initializes the graph using
     * graphInitializer, and checks it via graphChecker.
     *
     * Supports using TEST_REPEAT_TIMES for running the same test multiple times.
     */
    public static <I extends WritableComparable, V extends Writable, E extends Writable> void runTest(
            final TestGraphModifier<? super I, ? super V, ? super E> graphInitializer,
            final TestGraphChecker<? super I, ? super V, ? super E> graphChecker,
            final BulkConfigurator configurator) throws Exception {
        repeat(repeatTimes(), new OneTest() {
            @Override
            public void test() throws Exception {
                GiraphConfiguration conf = new GiraphConfiguration();
                configurator.configure(conf);
                BlockUtils.initAndCheckConfig(conf);
                runTest(graphInitializer, graphChecker, conf);
            }
        });
    }

    /**
     * Uses provided configuration, initializes the graph using
     * graphInitializer, and checks it via graphChecker.
     */
    public static <I extends WritableComparable, E extends Writable, V extends Writable> void runTest(
            TestGraphModifier<? super I, ? super V, ? super E> graphInitializer,
            TestGraphChecker<? super I, ? super V, ? super E> graphChecker, GiraphConfiguration conf)
            throws Exception {
        NumericTestGraph<I, V, E> graph = new NumericTestGraph<>(conf);
        graphInitializer.modifyGraph((NumericTestGraph) graph);
        runTest(graph, graphChecker);
    }

    /**
     * Base of runTest. Takes a created graph, a graph-checker and conf and runs
     * the test.
     */
    public static <I extends WritableComparable, E extends Writable, V extends Writable> void runTest(
            NumericTestGraph<I, V, E> graph, TestGraphChecker<? super I, ? super V, ? super E> graphChecker)
            throws Exception {
        graph = new NumericTestGraph<I, V, E>(
                LocalBlockRunner.runApp(graph.getTestGraph(), useFullDigraphTests(graph.getConf())));
        if (graphChecker != null) {
            graphChecker.checkOutput((NumericTestGraph) graph);
        }
    }

    /**
     * Chain execution of multiple TestGraphModifier into one.
     */
    @SafeVarargs
    public static <I extends WritableComparable, V extends Writable, E extends Writable> TestGraphModifier<I, V, E> chainModifiers(
            final TestGraphModifier<I, V, E>... graphModifiers) {
        return new TestGraphModifier<I, V, E>() {
            @Override
            public void modifyGraph(NumericTestGraph<I, V, E> graph) {
                for (TestGraphModifier<I, V, E> graphModifier : graphModifiers) {
                    graphModifier.modifyGraph(graph);
                }
            }
        };
    }

    /**
     * Chain execution of multiple BulkConfigurators into one.
     *
     * Order might matter, if they are setting the same fields.
     * (later one will override what previous one already set).
     */
    public static BulkConfigurator chainConfigurators(final BulkConfigurator... configurators) {
        return new BulkConfigurator() {
            @Override
            public void configure(GiraphConfiguration conf) {
                for (BulkConfigurator configurator : configurators) {
                    configurator.configure(conf);
                }
            }
        };
    }

    public static Supplier<DoubleWritable> doubleSupplier(final double value) {
        return new Supplier<DoubleWritable>() {
            @Override
            public DoubleWritable get() {
                return new DoubleWritable(value);
            }
        };
    }

    public static Supplier<NullWritable> nullSupplier() {
        return new Supplier<NullWritable>() {
            @Override
            public NullWritable get() {
                return NullWritable.get();
            }
        };
    }

    /** Interface for running a single test that can throw an exception */
    interface OneTest {
        void test() throws Exception;
    }

    private static void repeat(int times, OneTest test) throws Exception {
        if (times == 1) {
            test.test();
        } else {
            int failures = 0;
            StringBuilder failureMsgs = new StringBuilder();
            AssertionError firstError = null;
            for (int i = 0; i < times; i++) {
                try {
                    test.test();
                } catch (AssertionError error) {
                    failures++;
                    failureMsgs.append("\n").append(error.getMessage());
                    if (firstError == null) {
                        firstError = error;
                    }
                }
            }

            if (failures > 0) {
                throw new AssertionError(
                        "Failed " + failures + " times out of " + times + " runs, messages: " + failureMsgs,
                        firstError);
            }
        }
    }

    private static boolean useFullDigraphTests(GiraphConfiguration conf) {
        return USE_FULL_GIRAPH_ENV_IN_TESTS.get(conf)
                || System.getProperty("test_setup.UseFullGiraphEnvInTests") != null;
    }

    private static int repeatTimes() {
        String value = System.getProperty("test_setup.TestRepeatTimes");
        return value != null ? Integer.parseInt(value) : TEST_REPEAT_TIMES;
    }

    public static void setTestRepeatTimes(int testRepeatTimes) {
        TestGraphUtils.TEST_REPEAT_TIMES = testRepeatTimes;
    }
}