TestBackgroundThreadPrincipal.cpp (3531B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 #include "gtest/gtest.h" 5 #include "mozilla/gtest/MozAssertions.h" 6 #include "mozilla/BasePrincipal.h" 7 #include "mozilla/ContentPrincipal.h" 8 #include "mozilla/NullPrincipal.h" 9 #include "mozilla/ipc/BackgroundUtils.h" 10 #include "mozilla/ipc/PBackgroundSharedTypes.h" 11 #include "nsIEventTarget.h" 12 #include "nsISerialEventTarget.h" 13 #include "nsIURIMutator.h" 14 #include "nsNetUtil.h" 15 #include "nsPrintfCString.h" 16 #include "nsThreadUtils.h" 17 18 namespace mozilla { 19 20 template <typename F> 21 void RunOnBackgroundThread(F&& aFunction) { 22 nsCOMPtr<nsISerialEventTarget> backgroundQueue; 23 ASSERT_NS_SUCCEEDED(NS_CreateBackgroundTaskQueue( 24 "RunOnBackgroundThread", getter_AddRefs(backgroundQueue))); 25 ASSERT_NS_SUCCEEDED(NS_DispatchAndSpinEventLoopUntilComplete( 26 "RunOnBackgroundThread"_ns, backgroundQueue, 27 NS_NewRunnableFunction("RunOnBackgroundThread", 28 std::forward<F>(aFunction)))); 29 } 30 31 TEST(BackgroundThreadPrincipal, CreateContent) 32 { 33 RunOnBackgroundThread([] { 34 nsCOMPtr<nsIURI> contentURI; 35 ASSERT_NS_SUCCEEDED(NS_NewURI(getter_AddRefs(contentURI), 36 "http://subdomain.example.com:8000"_ns)); 37 RefPtr<BasePrincipal> contentPrincipal = 38 BasePrincipal::CreateContentPrincipal(contentURI, OriginAttributes()); 39 EXPECT_TRUE(contentPrincipal->Is<ContentPrincipal>()); 40 41 nsCString origin; 42 ASSERT_NS_SUCCEEDED(contentPrincipal->GetOrigin(origin)); 43 EXPECT_EQ(origin, "http://subdomain.example.com:8000"_ns); 44 45 nsCString siteOrigin; 46 ASSERT_NS_SUCCEEDED(contentPrincipal->GetSiteOrigin(siteOrigin)); 47 EXPECT_EQ(siteOrigin, "http://example.com"_ns); 48 }); 49 } 50 51 TEST(BackgroundThreadPrincipal, CreateNull) 52 { 53 RunOnBackgroundThread([] { 54 nsCOMPtr<nsIURI> contentURI; 55 ASSERT_NS_SUCCEEDED(NS_NewURI(getter_AddRefs(contentURI), 56 "data:text/plain,hello world"_ns)); 57 RefPtr<BasePrincipal> principal = 58 BasePrincipal::CreateContentPrincipal(contentURI, OriginAttributes()); 59 EXPECT_TRUE(principal->Is<NullPrincipal>()); 60 61 nsCString origin; 62 ASSERT_NS_SUCCEEDED(principal->GetOrigin(origin)); 63 EXPECT_TRUE(StringBeginsWith(origin, "moz-nullprincipal:"_ns)); 64 }); 65 } 66 67 TEST(BackgroundThreadPrincipal, PrincipalInfoConversions) 68 { 69 RunOnBackgroundThread([] { 70 nsCOMPtr<nsIURI> contentURI; 71 ASSERT_NS_SUCCEEDED(NS_NewURI(getter_AddRefs(contentURI), 72 "http://subdomain.example.com:8000"_ns)); 73 RefPtr<BasePrincipal> contentPrincipal = 74 BasePrincipal::CreateContentPrincipal(contentURI, OriginAttributes()); 75 EXPECT_TRUE(contentPrincipal->Is<ContentPrincipal>()); 76 77 ipc::PrincipalInfo info; 78 ASSERT_NS_SUCCEEDED(ipc::PrincipalToPrincipalInfo(contentPrincipal, &info)); 79 80 EXPECT_TRUE(info.type() == ipc::PrincipalInfo::TContentPrincipalInfo); 81 EXPECT_EQ(info.get_ContentPrincipalInfo().spec(), 82 "http://subdomain.example.com:8000/"_ns); 83 EXPECT_EQ(info.get_ContentPrincipalInfo().baseDomain(), "example.com"_ns); 84 85 auto result = PrincipalInfoToPrincipal(info); 86 ASSERT_TRUE(result.isOk()); 87 nsCOMPtr<nsIPrincipal> deserialized = result.unwrap(); 88 EXPECT_TRUE(deserialized->GetIsContentPrincipal()); 89 90 EXPECT_TRUE(deserialized->Equals(contentPrincipal)); 91 }); 92 } 93 94 } // namespace mozilla