/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.classic.control; import java.util.Random; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.corpus.RandomUtil; public class ScenarioRandomUtil { private final static long SEED = 74130; private final static Random random = new Random(SEED); private final static int AVERAGE_ID_LEN = 32; private final static int AVERAGE_ID_DEV = 16; private final static int AVERAGE_CHILDREN_COUNT = 30; private final static int CHILDREN_COUNT_VAR = 10; public static boolean oneInFreq(int freq) { return (random.nextInt(freq) % freq) == 0; } public static Level randomLevel() { int rl = random.nextInt(6); switch (rl) { case 0: return null; case 1: return Level.TRACE; case 2: return Level.DEBUG; case 3: return Level.INFO; case 4: return Level.WARN; case 5: return Level.ERROR; default: throw new IllegalStateException( "rl should have been a value between 0 to 5, but it is " + rl); } } public static String randomLoggerName(int average, int stdDeviation) { int depth = RandomUtil.gaussianAsPositiveInt(random, average, stdDeviation); StringBuffer buf = new StringBuffer(); for (int i = 0; i < depth; i++) { if (i != 0) { buf.append('.'); } buf.append(randomId()); } return buf.toString(); } public static String randomId() { int len = RandomUtil.gaussianAsPositiveInt(random, AVERAGE_ID_LEN, AVERAGE_ID_DEV); StringBuffer buf = new StringBuffer(); for (int i = 0; i < len; i++) { int offset = random.nextInt(26); char c = (char) ('a' + offset); buf.append(c); } return buf.toString(); } /** * Returns 3 for root, 3 for children of root, 9 for offspring of generation 2 * and 3, and for generations 4 and later, return 0 with probability 0.5 and a * gaussian (average=AVERAGE_CHILDREN_COUNT) with probability 0.5. * * @param name * @return */ public static int randomChildrenCount(String name) { int dots = dotCount(name); if (dots <= 1) { return 3; } else if (dots == 2 || dots == 3) { return 9; } else { if (shouldHaveChildrenWithProbabilitz(0.5)) { return RandomUtil.gaussianAsPositiveInt(random, AVERAGE_CHILDREN_COUNT, CHILDREN_COUNT_VAR); } else { return 0; } } } /** * Returns true with probability p. * * @param p * @return */ static boolean shouldHaveChildrenWithProbabilitz(double p) { if (p < 0 || p > 1.0) { throw new IllegalArgumentException( "p must be a value between 0 and 1.0, it was " + p + " instead."); } double r = random.nextDouble(); if (r < p) { return true; } else { return false; } } static int dotCount(String s) { int count = 0; int len = s.length(); for (int i = 0; i < len; i++) { char c = s.charAt(i); if (c == '.') { count++; } } return count; } }