diff -r 000000000000 -r 6474c204b198 memory/mozalloc/tests/TestVolatileBuffer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/memory/mozalloc/tests/TestVolatileBuffer.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,144 @@ +/* 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 "TestHarness.h" +#include "mozilla/VolatileBuffer.h" +#include "mozilla/NullPtr.h" +#include + +#if defined(ANDROID) +#include +#include +#include +#include +#include +#elif defined(XP_DARWIN) +#include +#endif + +using namespace mozilla; + +int main(int argc, char **argv) +{ + ScopedXPCOM xpcom("VolatileBufferTests"); + if (xpcom.failed()) { + return 1; + } + + RefPtr heapbuf = new VolatileBuffer(); + if (!heapbuf || !heapbuf->Init(512)) { + fail("Failed to initialize VolatileBuffer"); + return 1; + } + + { + VolatileBufferPtr ptr(heapbuf); + if (ptr.WasBufferPurged()) { + fail("Buffer was immediately purged after initialization"); + return 1; + } + + if (!ptr) { + fail("Didn't get a pointer"); + return 1; + } + } + + RefPtr buf = new VolatileBuffer(); + if (!buf || !buf->Init(16384)) { + fail("Failed to initialize VolatileBuffer"); + return 1; + } + + const char teststr[] = "foobar"; + + { + VolatileBufferPtr ptr(buf); + if (ptr.WasBufferPurged()) { + fail("Buffer should not be purged immediately after initialization"); + return 1; + } + + if (!ptr) { + fail("Didn't get a pointer"); + return 1; + } + + { + VolatileBufferPtr ptr2(buf); + if (ptr2.WasBufferPurged()) { + fail("Failed to Lock buffer again while currently locked"); + return 1; + } + + if (!ptr2) { + fail("Didn't get a pointer on the second lock"); + return 1; + } + + strcpy(ptr2, teststr); + } + } + + { + VolatileBufferPtr ptr(buf); + if (ptr.WasBufferPurged()) { + fail("Buffer was immediately purged after unlock"); + return 1; + } + + if (strcmp(ptr, teststr)) { + fail("Buffer failed to retain data after unlock"); + return 1; + } + } + + // Test purging if we know how to +#if defined(MOZ_WIDGET_GONK) + // This also works on Android, but we need root. + int fd = open("/" ASHMEM_NAME_DEF, O_RDWR); + if (fd < 0) { + fail("Failed to open ashmem device"); + return 1; + } + if (ioctl(fd, ASHMEM_PURGE_ALL_CACHES, NULL) < 0) { + fail("Failed to purge ashmem caches"); + return 1; + } +#elif defined(XP_DARWIN) + int state; + vm_purgable_control(mach_task_self(), (vm_address_t)NULL, + VM_PURGABLE_PURGE_ALL, &state); +#else + return 0; +#endif + + if (!buf->NonHeapSizeOfExcludingThis()) { + fail("Buffer should not be allocated on heap"); + return 1; + } + + { + VolatileBufferPtr ptr(buf); + if (!ptr.WasBufferPurged()) { + fail("Buffer should not be unpurged after forced purge"); + return 1; + } + + if (!strcmp(ptr, teststr)) { + fail("Purge did not actually purge data"); + return 1; + } + } + + { + VolatileBufferPtr ptr(buf); + if (ptr.WasBufferPurged()) { + fail("Buffer still purged after lock"); + return 1; + } + } + + return 0; +}