Package com.mongodb.util

Source Code of com.mongodb.util.TestCase$Result

// TestCase.java; copied directly from the Java driver

/**
*      Copyright (C) 2008 10gen Inc.
*
*   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 com.mongodb.util;

import com.mongodb.BasicDBObject;
import com.mongodb.CommandResult;
import com.mongodb.Mongo;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class TestCase extends MyAsserts {

    static class Test {
        Test(Object o, Method m) {
            _o = o;
            _m = m;
        }

        Result run() {
            try {
                _m.invoke(_o);
                return new Result(this);
            } catch (IllegalAccessException e) {
                return new Result(this, e);
            } catch (InvocationTargetException ite) {
                return new Result(this, ite.getTargetException());
            }
        }

        public String toString() {
            String foo = _o.getClass().getName() + "." + _m.getName();
            if (_name == null)
                return foo;
            return _name + "(" + foo + ")";
        }

        protected String _name = null;

        final Object _o;
        final Method _m;
    }

    static class Result {
        Result(Test t) {
            this(t, null);
        }

        Result(Test t, Throwable error) {
            _test = t;
            _error = error;
        }

        boolean ok() {
            return _error == null;
        }

        public String toString() {
            StringBuilder buf = new StringBuilder();
            buf.append(_test);
            Throwable error = _error;
            while (error != null) {
                buf.append("\n\t" + error + "\n");
                for (StackTraceElement ste : error.getStackTrace()) {
                    buf.append("\t\t" + ste + "\n");
                }
                error = error.getCause();
            }
            return buf.toString();
        }

        final Test _test;
        final Throwable _error;
    }

    /**
     * this is for normal class tests
     */

    public TestCase() {
        this(null);
    }

    public TestCase(String name) {
        for (Method m : getClass().getMethods()) {

            if (!m.getName().startsWith("test"))
                continue;

            if ((m.getModifiers() & Member.PUBLIC) > 0)
                continue;

            Test t = new Test(this, m);
            t._name = name;
            _tests.add(t);

        }
    }

    public TestCase(Object o, String m)
            throws NoSuchMethodException {
        this(o, o.getClass().getDeclaredMethod(m));
    }

    public TestCase(Object o, Method m) {
        _tests.add(new Test(o, m));
    }

    public void add(TestCase tc) {
        _tests.addAll(tc._tests);
    }

    public String cleanupDB = null;
    public Mongo cleanupMongo = null;

    @org.testng.annotations.AfterClass
    public void cleanup() {
        if (cleanupMongo != null) {
            if (cleanupDB != null) {
                cleanupMongo.dropDatabase(cleanupDB);
            }
            cleanupMongo.close();
        }
    }

    /**
     * @return true if everything succeeds
     */
    public boolean runConsole() {
        List<Result> errors = new ArrayList<Result>();
        List<Result> fails = new ArrayList<Result>();

        System.out.println("Num Tests : " + _tests.size());
        System.out.println("----");

        for (Test t : _tests) {
            Result r = t.run();
            if (r.ok()) {
                System.out.print(".");
                continue;
            }

            System.out.print("x");

            if (r._error instanceof MyAssert)
                fails.add(r);
            else
                errors.add(r);
        }
        cleanup();
        System.out.println("\n----");

        int pass = _tests.size() - (errors.size() + fails.size());

        System.out.println("Passes : " + pass + " / " + _tests.size());
        System.out.println("% Pass : "
                + (((double) pass * 100) / _tests.size()));
        if (pass == _tests.size()) {
            System.out.println("SUCCESS");
            return true;
        }

        System.err.println("Num Pass : "
                + (_tests.size() - (errors.size() + fails.size())));
        System.err.println("Num Erros : " + (errors.size()));
        System.err.println("Num Fails : " + (fails.size()));

        System.err.println("---------");
        System.err.println("ERRORS");
        for (Result r : errors)
            System.err.println(r);

        System.err.println("---------");
        System.err.println("FAILS");
        for (Result r : fails)
            System.err.println(r);

        return false;
    }

    public String toString() {
        return "TestCase numCase:" + _tests.size();
    }

    final List<Test> _tests = new ArrayList<Test>();

    protected static void run(String args[]) {
        Args a = new Args(args);

        boolean foundMe = false;
        String theClass = null;
        for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
            if (foundMe) {
                theClass = ste.getClassName();
                break;
            }

            if (ste.getClassName().equals("com.mongodb.util.TestCase") &&
                    ste.getMethodName().equals("run"))
                foundMe = true;
        }

        if (theClass == null)
            throw new RuntimeException("something is broken");

        try {
            TestCase tc = (TestCase) Class.forName(theClass).newInstance();

            if (a.getOption("m") != null)
                tc = new TestCase(tc, a.getOption("m"));

            tc.runConsole();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     *
     * @param version must be a major version, e.g. 1.8, 2,0, 2.2
     * @return true if server is at least specified version
     */
    protected boolean serverIsAtLeastVersion(double version) {
        String serverVersion = (String) cleanupMongo.getDB("admin")
                .command("serverStatus").get("version");
        return Double.parseDouble(serverVersion.substring(0, 3)) >= version;
    }

    /**
     *
     * @param mongo the connection
     * @return true if connected to a standalone server
     */
    protected boolean isStandalone(Mongo mongo) {
        return runReplicaSetStatusCommand(mongo) == null;
    }

    protected String getPrimaryAsString(Mongo mongo) {
        return getMemberNameByState(mongo, "primary");
    }

    protected String getASecondaryAsString(Mongo mongo) {
        return getMemberNameByState(mongo, "secondary");
    }

    @SuppressWarnings({ "unchecked" })
    protected String getMemberNameByState(Mongo mongo, String stateStrToMatch) {
        CommandResult replicaSetStatus = runReplicaSetStatusCommand(mongo);

        for (final BasicDBObject member : (List<BasicDBObject>) replicaSetStatus
                .get("members")) {
            String hostnameAndPort = member.getString("name");
            if (!hostnameAndPort.contains(":"))
                hostnameAndPort = hostnameAndPort + ":27017";

            final String stateStr = member.getString("stateStr");

            if (stateStr.equalsIgnoreCase(stateStrToMatch))
                return hostnameAndPort;
        }

        throw new IllegalStateException("No member found in state "
                + stateStrToMatch);
    }

    @SuppressWarnings("unchecked")
    protected int getReplicaSetSize(Mongo mongo) {
        int size = 0;

        CommandResult replicaSetStatus = runReplicaSetStatusCommand(mongo);

        for (final BasicDBObject member : (List<BasicDBObject>) replicaSetStatus
                .get("members")) {

            final String stateStr = member.getString("stateStr");

            if (stateStr.equals("PRIMARY") || stateStr.equals("SECONDARY"))
                size++;
        }

        return size;
    }

    protected CommandResult runReplicaSetStatusCommand(final Mongo pMongo) {
        // Check to see if this is a replica set... if not, get out of here.
        final CommandResult result = pMongo.getDB("admin").command(
                new BasicDBObject("replSetGetStatus", 1));

        final String errorMsg = result.getErrorMessage();

        if (errorMsg != null && errorMsg.indexOf("--replSet") != -1) {
            System.err
                    .println("---- SecondaryReadTest: This is not a replica set - not testing secondary reads");
            return null;
        }

        return result;
    }

    public static void main(String args[])
            throws Exception {

        String dir = "src/test";
        if (args != null && args.length > 0)
            dir = args[0];

        Process p = Runtime.getRuntime().exec("find " + dir);
        BufferedReader in = new BufferedReader(new InputStreamReader(
                p.getInputStream()));

        TestCase theTestCase = new TestCase();

        String line;
        while ((line = in.readLine()) != null) {

            if (!line.endsWith("Test.java")) {
                continue;
            }

            line = line.substring("src/test/".length());
            line = line.substring(0, line.length() - ".java".length());
            line = line.replaceAll("//+", "/");
            line = line.replace('/', '.');

            try {
                Class<?> c = Class.forName(line);
                Object thing = c.newInstance();
                if (!(thing instanceof TestCase))
                    continue;

                System.out.println(line);

                TestCase tc = (TestCase) thing;
                theTestCase._tests.addAll(tc._tests);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        theTestCase.runConsole();
    }
}
TOP

Related Classes of com.mongodb.util.TestCase$Result

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.