@Test /** * PS: Test will fail if for some reason we cannot do 50 ops/sec against a hash map. So yeah, * pretty unlikely. */ public void testQuotaPctUsageCalculation() throws Exception { File tempDir = TestUtils.createTempDir(); FileBackedCachingStorageEngine quotaStore = new FileBackedCachingStorageEngine("quota-usage-test-store", tempDir.getAbsolutePath()); InMemoryStorageEngine<ByteArray, byte[], byte[]> inMemoryEngine = new InMemoryStorageEngine<ByteArray, byte[], byte[]>("inMemoryBackingStore"); QuotaLimitStats quotaStats = new QuotaLimitStats(null, 1000); StatTrackingStore statTrackingStore = new StatTrackingStore(inMemoryEngine, null); QuotaLimitingStore quotaLimitingStore = new QuotaLimitingStore( statTrackingStore, statTrackingStore.getStats(), quotaStats, quotaStore); int targetRate = 50; // provide a quota of 100 gets/sec quotaStore.put( new ByteArray( QuotaUtils.makeQuotaKey(statTrackingStore.getName(), QuotaType.GET_THROUGHPUT) .getBytes()), new Versioned<byte[]>("100.0".getBytes()), null); long testIntervalMs = 5000; long timeToSleepMs = 1000 / targetRate; long startMs = System.currentTimeMillis(); ByteArray key = new ByteArray("some key".getBytes()); while ((System.currentTimeMillis() - startMs) <= testIntervalMs) { quotaLimitingStore.get(key, null); Thread.sleep(timeToSleepMs); } assertEquals("No get operations should be throttled", 0, quotaStats.getRateLimitedGets()); assertEquals("Put usage should be 0", 0, quotaStats.getQuotaPctUsedPut()); assertEquals("delete usage should be 0", 0, quotaStats.getQuotaPctUsedDelete()); assertEquals("getall usage should be 0", 0, quotaStats.getQuotaPctUsedGetAll()); assertEquals( "Computed usage pct must be close to actual observed qps", statTrackingStore.getStats().getThroughput(Tracked.GET), quotaStats.getQuotaPctUsedGet(), 1.0); }