michael@0: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- michael@0: * michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: michael@0: #include "nspr.h" michael@0: #include "nscore.h" michael@0: #include "nsError.h" michael@0: #include "nsIServiceManager.h" michael@0: #include "nsNetCID.h" michael@0: #include "nsICache.h" michael@0: #include "nsICacheService.h" michael@0: #include "nsICacheSession.h" michael@0: #include "nsICacheEntryDescriptor.h" michael@0: #include "nsICacheListener.h" michael@0: #include "nsIDNSService.h" michael@0: #include "nsXPCOM.h" michael@0: #include "nsISupportsPrimitives.h" michael@0: #include "nsSupportsPrimitives.h" michael@0: #include "nsIEventQueueService.h" michael@0: michael@0: michael@0: static NS_DEFINE_CID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID); michael@0: static NS_DEFINE_CID(kCacheServiceCID, NS_CACHESERVICE_CID); michael@0: michael@0: nsCOMPtr gEventQ; michael@0: nsCOMPtr gCacheService; michael@0: michael@0: class AsyncCacheRequest michael@0: { michael@0: public: michael@0: AsyncCacheRequest(const char * key); michael@0: ~AsyncCacheRequest(); michael@0: michael@0: const char * mKey; michael@0: }; michael@0: michael@0: michael@0: nsresult michael@0: MakeCacheSession(const char * clientID, nsICacheSession **session) michael@0: { michael@0: nsresult rv; michael@0: michael@0: if (!gCacheService) { michael@0: // nsCOMPtr cacheService = michael@0: // do_GetService(kCacheServiceCID, &rv); michael@0: gCacheService = do_GetService(kCacheServiceCID, &rv); michael@0: if (NS_FAILED(rv) || !gCacheService) { michael@0: printf("do_GetService(kCacheServiceCID) failed : %x\n", rv); michael@0: goto error_exit; michael@0: } michael@0: } michael@0: michael@0: rv = gCacheService->CreateSession(clientID, michael@0: nsICache::STORE_IN_MEMORY, michael@0: nsICache::NOT_STREAM_BASED, michael@0: session); michael@0: if (NS_FAILED(rv)) michael@0: printf("nsCacheService::CreateSession() failed : %x\n", rv); michael@0: michael@0: error_exit: michael@0: return rv; michael@0: } michael@0: michael@0: michael@0: void michael@0: TestMemoryObjectCache() michael@0: { michael@0: printf("\nTesting Memory Object Cache:\n"); michael@0: nsCOMPtr session; michael@0: nsresult rv = MakeCacheSession("testClientID", getter_AddRefs(session)); michael@0: if (NS_FAILED(rv)) return; michael@0: michael@0: nsCOMPtr descriptor; michael@0: michael@0: // Test ACCESS_READ for nonexistent entry michael@0: printf("\nTest ACCESS_READ:\n"); michael@0: rv = session->OpenCacheEntry(NS_LITERAL_CSTRING("nonexistent entry"), michael@0: nsICache::ACCESS_READ, michael@0: nsICache::BLOCKING, michael@0: getter_AddRefs(descriptor)); michael@0: if (rv != NS_ERROR_CACHE_KEY_NOT_FOUND) michael@0: printf("OpenCacheEntry(ACCESS_READ) returned: %x for nonexistent entry\n", rv); michael@0: michael@0: NS_NAMED_LITERAL_CSTRING(cacheKey, "http://www.mozilla.org/somekey"); michael@0: michael@0: // Test creating new entry michael@0: printf("\nTest ACCESS_READ_WRITE:\n"); michael@0: rv = session->OpenCacheEntry(cacheKey, michael@0: nsICache::ACCESS_READ_WRITE, michael@0: nsICache::BLOCKING, michael@0: getter_AddRefs(descriptor)); michael@0: if (NS_FAILED(rv)) { michael@0: printf("OpenCacheEntry(ACCESS_READ_WRITE) failed: %x\n", rv); michael@0: goto error_exit; michael@0: } michael@0: michael@0: nsCOMPtr foo = michael@0: do_CreateInstance(NS_SUPPORTS_CSTRING_CONTRACTID, &rv); michael@0: michael@0: foo->SetData(NS_LITERAL_CSTRING("hello world")); michael@0: michael@0: rv = descriptor->SetCacheElement(foo); michael@0: rv = descriptor->SetDataSize(11); michael@0: rv = descriptor->SetMetaDataElement("itemOne", "metaData works"); michael@0: descriptor = nullptr; michael@0: michael@0: // Test refetching entry michael@0: michael@0: rv = session->OpenCacheEntry(cacheKey, michael@0: nsICache::ACCESS_READ_WRITE, michael@0: nsICache::BLOCKING, michael@0: getter_AddRefs(descriptor)); michael@0: if (NS_FAILED(rv)) { michael@0: printf("OpenCacheEntry(ACCESS_READ_WRITE #2) failed: %x", rv); michael@0: goto error_exit; michael@0: } michael@0: michael@0: nsCOMPtr bar; michael@0: descriptor->GetCacheElement(getter_AddRefs(bar)); michael@0: if (foo.get() != bar.get()) { michael@0: printf("cache elements not the same\n"); michael@0: } else { michael@0: printf("data matches...\n"); michael@0: } michael@0: michael@0: char * metaData; michael@0: rv = descriptor->GetMetaDataElement("itemOne", &metaData); michael@0: if (NS_SUCCEEDED(rv)) printf("metaData = %s\n", metaData); michael@0: else printf("GetMetaDataElement failed : rv = %x\n", rv); michael@0: descriptor = nullptr; michael@0: michael@0: // Test ACCESS_WRITE entry michael@0: printf("\nTest ACCESS_WRITE:\n"); michael@0: rv = session->OpenCacheEntry(cacheKey, michael@0: nsICache::ACCESS_WRITE, michael@0: nsICache::BLOCKING, michael@0: getter_AddRefs(descriptor)); michael@0: if (NS_FAILED(rv)) { michael@0: printf("OpenCacheEntry(ACCESS_WRITE) failed: %x", rv); michael@0: goto error_exit; michael@0: } michael@0: rv = descriptor->GetCacheElement(getter_AddRefs(bar)); michael@0: if (bar) michael@0: printf("FAILED: we didn't get new entry.\n"); michael@0: if (NS_FAILED(rv)) michael@0: printf("GetCacheElement failed : %x\n", rv); michael@0: michael@0: rv = descriptor->GetMetaDataElement("itemOne", &metaData); michael@0: if (NS_SUCCEEDED(rv)) michael@0: if (metaData) printf("metaData = %s\n", metaData); michael@0: else printf("metaData = nullptr\n"); michael@0: else printf("GetMetaDataElement failed : rv = %x\n", rv); michael@0: michael@0: printf("\n"); michael@0: error_exit: michael@0: michael@0: return; michael@0: } michael@0: michael@0: michael@0: int michael@0: main(int argc, char* argv[]) michael@0: { michael@0: nsresult rv = NS_OK; michael@0: michael@0: // Start up XPCOM michael@0: rv = NS_InitXPCOM2(nullptr, nullptr, nullptr); michael@0: if (NS_FAILED(rv)) return rv; michael@0: michael@0: /** michael@0: * Create event queue for this thread michael@0: */ michael@0: nsCOMPtr eventQService = michael@0: do_GetService(kEventQueueServiceCID, &rv); michael@0: if (NS_FAILED(rv)) goto error_exit; michael@0: michael@0: eventQService->GetThreadEventQueue(NS_CURRENT_THREAD, getter_AddRefs(gEventQ)); michael@0: michael@0: /** michael@0: * Test Cache michael@0: */ michael@0: TestMemoryObjectCache(); michael@0: michael@0: michael@0: error_exit: michael@0: gEventQ = nullptr; michael@0: eventQService = nullptr; michael@0: michael@0: NS_ShutdownXPCOM(nullptr); michael@0: michael@0: printf("XPCOM shut down.\n\n"); michael@0: return rv; michael@0: } michael@0: michael@0: michael@0: