From dede03d303b3e5c518fa63cb557fe5c45520f56f Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Wed, 3 Oct 2012 17:09:59 -0700 Subject: [PATCH] Move TestBloomFilter out of XPCOM and into mfbt/tests, now that it exists. No bug, r=testingonlychange --HG-- extra : rebase_source : 85a2a56bcc02bf122ee7fd21d16dffd534d1c98d --- mfbt/BloomFilter.h | 1 + mfbt/tests/Makefile.in | 3 +- mfbt/tests/TestBloomFilter.cpp | 102 +++++++++++++++++++++++++++ xpcom/tests/Makefile.in | 1 - xpcom/tests/TestBloomFilter.cpp | 120 -------------------------------- 5 files changed, 105 insertions(+), 122 deletions(-) create mode 100644 mfbt/tests/TestBloomFilter.cpp delete mode 100644 xpcom/tests/TestBloomFilter.cpp diff --git a/mfbt/BloomFilter.h b/mfbt/BloomFilter.h index 9effa1756c0..8680ef29073 100644 --- a/mfbt/BloomFilter.h +++ b/mfbt/BloomFilter.h @@ -13,6 +13,7 @@ #ifndef mozilla_BloomFilter_h_ #define mozilla_BloomFilter_h_ +#include "mozilla/Assertions.h" #include "mozilla/Likely.h" #include "mozilla/StandardInteger.h" #include "mozilla/Util.h" diff --git a/mfbt/tests/Makefile.in b/mfbt/tests/Makefile.in index 542cffaf8cb..09a938c5f1f 100644 --- a/mfbt/tests/Makefile.in +++ b/mfbt/tests/Makefile.in @@ -12,9 +12,10 @@ include $(DEPTH)/config/autoconf.mk STL_FLAGS = CPP_UNIT_TESTS = \ + TestBloomFilter.cpp \ TestCheckedInt.cpp \ - TestTypeTraits.cpp \ TestSHA1.cpp \ + TestTypeTraits.cpp \ TestWeakPtr.cpp \ $(NULL) diff --git a/mfbt/tests/TestBloomFilter.cpp b/mfbt/tests/TestBloomFilter.cpp new file mode 100644 index 00000000000..7a8a0ec8ac9 --- /dev/null +++ b/mfbt/tests/TestBloomFilter.cpp @@ -0,0 +1,102 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/Assertions.h" +#include "mozilla/BloomFilter.h" + +#include +#include + +using mozilla::BloomFilter; + +class FilterChecker +{ + public: + FilterChecker(uint32_t hash) : mHash(hash) { } + + uint32_t hash() const { return mHash; } + + private: + uint32_t mHash; +}; + +int +main() +{ + BloomFilter<12, FilterChecker> *filter = new BloomFilter<12, FilterChecker>(); + MOZ_ASSERT(filter); + + FilterChecker one(1); + FilterChecker two(0x20000); + FilterChecker many(0x10000); + FilterChecker multiple(0x20001); + + filter->add(&one); + MOZ_ASSERT(filter->mightContain(&one), + "Filter should contain 'one'"); + + MOZ_ASSERT(!filter->mightContain(&multiple), + "Filter claims to contain 'multiple' when it should not"); + + MOZ_ASSERT(filter->mightContain(&many), + "Filter should contain 'many' (false positive)"); + + filter->add(&two); + MOZ_ASSERT(filter->mightContain(&multiple), + "Filter should contain 'multiple' (false positive)"); + + // Test basic removals + filter->remove(&two); + MOZ_ASSERT(!filter->mightContain(&multiple), + "Filter claims to contain 'multiple' when it should not after two " + "was removed"); + + // Test multiple addition/removal + const size_t FILTER_SIZE = 255; + for (size_t i = 0; i < FILTER_SIZE - 1; ++i) + filter->add(&two); + + MOZ_ASSERT(filter->mightContain(&multiple), + "Filter should contain 'multiple' after 'two' added lots of times " + "(false positive)"); + + for (size_t i = 0; i < FILTER_SIZE - 1; ++i) + filter->remove(&two); + + MOZ_ASSERT(!filter->mightContain(&multiple), + "Filter claims to contain 'multiple' when it should not after two " + "was removed lots of times"); + + // Test overflowing the filter buckets + for (size_t i = 0; i < FILTER_SIZE + 1; ++i) + filter->add(&two); + + MOZ_ASSERT(filter->mightContain(&multiple), + "Filter should contain 'multiple' after 'two' added lots more " + "times (false positive)"); + + for (size_t i = 0; i < FILTER_SIZE + 1; ++i) + filter->remove(&two); + + MOZ_ASSERT(filter->mightContain(&multiple), + "Filter claims to not contain 'multiple' even though we should " + "have run out of space in the buckets (false positive)"); + MOZ_ASSERT(filter->mightContain(&two), + "Filter claims to not contain 'two' even though we should have " + "run out of space in the buckets (false positive)"); + + filter->remove(&one); + + MOZ_ASSERT(!filter->mightContain(&one), + "Filter should not contain 'one', because we didn't overflow its " + "bucket"); + + filter->clear(); + + MOZ_ASSERT(!filter->mightContain(&multiple), + "clear() failed to work"); + + return 0; +} diff --git a/xpcom/tests/Makefile.in b/xpcom/tests/Makefile.in index a61549f9ae6..b1f8cdd04db 100644 --- a/xpcom/tests/Makefile.in +++ b/xpcom/tests/Makefile.in @@ -60,7 +60,6 @@ CPP_UNIT_TESTS = \ ShowSSEConfig.cpp \ TestAutoPtr.cpp \ TestAutoRef.cpp \ - TestBloomFilter.cpp \ TestCOMArray.cpp \ TestCOMPtr.cpp \ TestCOMPtrEq.cpp \ diff --git a/xpcom/tests/TestBloomFilter.cpp b/xpcom/tests/TestBloomFilter.cpp deleted file mode 100644 index 7028c0614ec..00000000000 --- a/xpcom/tests/TestBloomFilter.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "mozilla/BloomFilter.h" -#include "TestHarness.h" - -#include - -using namespace mozilla; - -class FilterChecker { -public: - FilterChecker(uint32_t hash) : - mHash(hash) - {} - - uint32_t hash() const { return mHash; } - -private: - uint32_t mHash; -}; - -int main() -{ - BloomFilter<12, FilterChecker> *filter = new BloomFilter<12, FilterChecker>(); - - FilterChecker one(1); - FilterChecker two(0x20000); - FilterChecker many(0x10000); - FilterChecker multiple(0x20001); - - filter->add(&one); - if (!filter->mightContain(&one)) { - fail("Filter should contain 'one'"); - return -1; - } - - if (filter->mightContain(&multiple)) { - fail("Filter claims to contain 'multiple' when it should not"); - return -1; - } - - if (!filter->mightContain(&many)) { - fail("Filter should contain 'many' (false positive)"); - return -1; - } - - filter->add(&two); - if (!filter->mightContain(&multiple)) { - fail("Filter should contain 'multiple' (false positive)"); - return -1; - } - - // Test basic removals - filter->remove(&two); - if (filter->mightContain(&multiple)) { - fail("Filter claims to contain 'multiple' when it should not after two was " - "removed"); - return -1; - } - - // Test multiple addition/removal - const unsigned FILTER_SIZE = 255; - for (unsigned i = 0; i < FILTER_SIZE - 1; ++i) { - filter->add(&two); - } - if (!filter->mightContain(&multiple)) { - fail("Filter should contain 'multiple' after 'two' added lots of times " - "(false positive)"); - return -1; - } - for (unsigned i = 0; i < FILTER_SIZE - 1; ++i) { - filter->remove(&two); - } - if (filter->mightContain(&multiple)) { - fail("Filter claims to contain 'multiple' when it should not after two was " - "removed lots of times"); - return -1; - } - - // Test overflowing the filter buckets - for (unsigned i = 0; i < FILTER_SIZE + 1; ++i) { - filter->add(&two); - } - if (!filter->mightContain(&multiple)) { - fail("Filter should contain 'multiple' after 'two' added lots more times " - "(false positive)"); - return -1; - } - for (unsigned i = 0; i < FILTER_SIZE + 1; ++i) { - filter->remove(&two); - } - if (!filter->mightContain(&multiple)) { - fail("Filter claims to not contain 'multiple' even though we should have " - "run out of space in the buckets (false positive)"); - return -1; - } - if (!filter->mightContain(&two)) { - fail("Filter claims to not contain 'two' even though we should have run " - "out of space in the buckets (false positive)"); - return -1; - } - - filter->remove(&one); - if (filter->mightContain(&one)) { - fail("Filter should not contain 'one', because we didn't overflow its " - "bucket"); - return -1; - } - - filter->clear(); - if (filter->mightContain(&multiple)) { - fail("clear() failed to work"); - return -1; - } - - return 0; -}