/* * Copyright 2012, Facebook, 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.facebook.LinkBench; import java.io.File; import java.util.Properties; import java.util.Random; import org.junit.Test; import com.facebook.LinkBench.RealDistribution.DistributionType; import com.facebook.LinkBench.distributions.AccessDistributions.AccessDistMode; import com.facebook.LinkBench.distributions.AccessDistributions.AccessDistribution; import com.facebook.LinkBench.distributions.AccessDistributions.BuiltinAccessDistribution; import com.facebook.LinkBench.distributions.AccessDistributions.ProbAccessDistribution; import com.facebook.LinkBench.distributions.UniformDistribution; import com.facebook.LinkBench.distributions.ZipfDistribution; import junit.framework.AssertionFailedError; import junit.framework.TestCase; public class TestAccessDistribution extends TestCase { @Test public void testMultiple() { testSanityBuiltinDist(AccessDistMode.MULTIPLE, 3); } @Test public void testPerfectPower() { testSanityBuiltinDist(AccessDistMode.PERFECT_POWER, 3); } @Test public void testPower() { testSanityBuiltinDist(AccessDistMode.POWER, 3); } @Test public void testReciprocal() { testSanityBuiltinDist(AccessDistMode.RECIPROCAL, 3); } @Test public void testRoundRobin() { testSanityBuiltinDist(AccessDistMode.ROUND_ROBIN, 0); } @Test public void testUniform() { UniformDistribution u = new UniformDistribution(); Properties props = new Properties(); int min = 100, max = 200; u.init(min, max, props, ""); ProbAccessDistribution unshuffled = new ProbAccessDistribution(u, null); testSanityAccessDist(unshuffled, min, max); ProbAccessDistribution shuffled = new ProbAccessDistribution(u, new InvertibleShuffler(13, 25, max - min)); testSanityAccessDist(shuffled, min, max); } @Test public void testZipf() { ZipfDistribution z = new ZipfDistribution(); Properties props = new Properties(); props.setProperty("shape", "0.5"); int min = 100, max = 200; z.init(min, max, props, ""); ProbAccessDistribution unshuffled = new ProbAccessDistribution(z, null); testSanityAccessDist(unshuffled, min, max); ProbAccessDistribution shuffled = new ProbAccessDistribution(z, new InvertibleShuffler(13, 25, max - min)); testSanityAccessDist(shuffled, min, max); } @Test public void testReal() { RealDistribution r = new RealDistribution(); Properties props = new Properties(); props.setProperty(Config.DISTRIBUTION_DATA_FILE, new File("config/Distribution.dat").getAbsolutePath()); int min = 100, max = 200; r.init(props, min, max, DistributionType.LINK_READS); ProbAccessDistribution unshuffled = new ProbAccessDistribution(r, null); testSanityAccessDist(unshuffled, min, max); ProbAccessDistribution shuffled = new ProbAccessDistribution(r, new InvertibleShuffler(13, 25, max - min)); testSanityAccessDist(shuffled, min, max); } public static void testSanityBuiltinDist(AccessDistMode mode, long config) { long minid = 123; long maxid = 12345; BuiltinAccessDistribution dist = new BuiltinAccessDistribution(mode, minid, maxid, config); testSanityAccessDist(dist, minid, maxid); } /** * Check that results are in range, etc. */ public static void testSanityAccessDist(AccessDistribution dist, long minid, long maxid) { long seed = System.currentTimeMillis(); System.err.println("Using seed " + seed); Random rng = new Random(seed); long id = 1; int trials = 10000; long start = System.currentTimeMillis(); for (int i = 0; i < trials; i++) { id = dist.nextID(rng, id); try { assertTrue(id >= minid); assertTrue(id < maxid); } catch (AssertionFailedError e) { System.err.println("Error: on trial " + i + " id returned: " + id + " not in range [" + minid + "," + maxid + ")"); throw e; } } long end = System.currentTimeMillis(); System.err.println("Took " + (end - start) + " ms for " + trials + " trials"); } }