/** * Copyright 2014 Netflix, 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 rx; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import rx.Observable.OnSubscribe; import rx.Scheduler.Worker; import rx.functions.Action0; import rx.schedulers.Schedulers; /** * Utility for retrieving a mock eventstream for testing. */ public final class EventStream { private EventStream() { throw new IllegalStateException("No instances!"); } public static Observable<Event> getEventStream(final String type, final int numInstances) { return Observable.create(new OnSubscribe<Event>() { @Override public void call(final Subscriber<? super Event> subscriber) { Worker inner = Schedulers.newThread().createWorker(); subscriber.add(inner); // run on a background thread inside the OnSubscribeFunc so unsubscribe works inner.schedule(new Action0() { @Override public void call() { while (!(subscriber.isUnsubscribed() || Thread.currentThread().isInterrupted())) { subscriber.onNext(randomEvent(type, numInstances)); try { // slow it down somewhat Thread.sleep(50); } catch (InterruptedException e) { subscriber.onError(e); } } subscriber.onCompleted(); } }); } }); } public static Event randomEvent(String type, int numInstances) { Map<String, Object> values = new LinkedHashMap<String, Object>(); values.put("count200", randomIntFrom0to(4000)); values.put("count4xx", randomIntFrom0to(300)); values.put("count5xx", randomIntFrom0to(500)); return new Event(type, "instance_" + randomIntFrom0to(numInstances), values); } private static int randomIntFrom0to(int max) { // XORShift instead of Math.random http://javamex.com/tutorials/random_numbers/xorshift.shtml long x = System.nanoTime(); x ^= (x << 21); x ^= (x >>> 35); x ^= (x << 4); return Math.abs((int) x % max); } public static class Event { public final String type; public final String instanceId; public final Map<String, Object> values; /** * @param type * @param instanceId * @param values * This does NOT deep-copy, so do not mutate this Map after passing it in. */ public Event(String type, String instanceId, Map<String, Object> values) { this.type = type; this.instanceId = instanceId; this.values = Collections.unmodifiableMap(values); } } }