TestPolicyContainer.cpp (4040B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "gtest/gtest.h" 8 #include "mozilla/NullPrincipal.h" 9 #include "mozilla/Preferences.h" 10 #include "mozilla/dom/IntegrityPolicy.h" 11 #include "mozilla/dom/PolicyContainer.h" 12 #include "mozilla/dom/nsCSPContext.h" 13 #include "nsCOMPtr.h" 14 #include "nsLiteralString.h" 15 #include "nsNetUtil.h" 16 #include "nsSerializationHelper.h" 17 18 using namespace mozilla; 19 using namespace mozilla::dom; 20 21 void AssertSerializationForHeadersForPolicyContainer( 22 const nsCString& aCSPHeader, const nsCString& aIntegrityPolicyHeader, 23 const nsCString& aSerializedString) { 24 // Test container serialization 25 RefPtr<PolicyContainer> container = new PolicyContainer(); 26 27 if (!aIntegrityPolicyHeader.IsVoid()) { 28 RefPtr<IntegrityPolicy> integrityPolicy; 29 nsresult rv = IntegrityPolicy::ParseHeaders( 30 aIntegrityPolicyHeader, ""_ns, getter_AddRefs(integrityPolicy)); 31 ASSERT_TRUE(NS_SUCCEEDED(rv)); 32 ASSERT_TRUE(integrityPolicy); 33 34 container->SetIntegrityPolicy(integrityPolicy); 35 } 36 37 if (!aCSPHeader.IsVoid()) { 38 RefPtr<nsCSPContext> csp = new nsCSPContext(); 39 40 nsCOMPtr<nsIPrincipal> principal = nsContentUtils::GetSystemPrincipal(); 41 nsCOMPtr<nsIURI> uri; 42 NS_NewURI(getter_AddRefs(uri), "http://example.com"_ns); 43 nsresult rv = csp->SetRequestContextWithPrincipal(principal, uri, ""_ns, 0); 44 ASSERT_TRUE(NS_SUCCEEDED(rv)); 45 46 rv = csp->AppendPolicy(NS_ConvertUTF8toUTF16(aCSPHeader), false, true); 47 ASSERT_TRUE(NS_SUCCEEDED(rv)); 48 49 container->SetCSP(csp); 50 } 51 52 nsCOMPtr<nsISerializable> serializable = 53 static_cast<nsISerializable*>(container.get()); 54 55 nsCString str; 56 nsresult rv = NS_SerializeToString(serializable, str); 57 ASSERT_TRUE(NS_SUCCEEDED(rv)); 58 59 ASSERT_STREQ(str.get(), aSerializedString.get()); 60 61 // Test container deserialization 62 nsCOMPtr<nsISupports> deserialized; 63 rv = NS_DeserializeObject(aSerializedString, getter_AddRefs(deserialized)); 64 ASSERT_TRUE(NS_SUCCEEDED(rv)); 65 ASSERT_TRUE(deserialized); 66 67 nsCOMPtr<nsIPolicyContainer> deserializedContainer = 68 do_QueryInterface(deserialized); 69 ASSERT_TRUE(deserializedContainer); 70 71 RefPtr<PolicyContainer> deserializedPolicyContainer = 72 PolicyContainer::Cast(deserializedContainer); 73 74 ASSERT_TRUE(PolicyContainer::Equals(container, deserializedPolicyContainer)); 75 } 76 77 TEST(PolicyContainer, Serialization) 78 { 79 // Test serialization with no headers 80 AssertSerializationForHeadersForPolicyContainer( 81 VoidCString(), VoidCString(), 82 "ydqGXsPXSqGicQ9XHwE8MAAAAAAAAAAAwAAAAAAAAEYAAAABAAA="_ns); 83 84 // Test serialization with empty headers 85 AssertSerializationForHeadersForPolicyContainer( 86 ""_ns, ""_ns, 87 "ydqGXsPXSqGicQ9XHwE8MAAAAAAAAAAAwAAAAAAAAEYAAAABAQnZ7Rrl1EAEv+Anzrkj2awdYyAIbJdIrqUcFuLaoPT2Ad6UctCANBHTk5kAEEug/UCSBzpUbXhPMJE6uHGBMgjGAAAAAv////8AAABQAQAAABNodHRwOi8vZXhhbXBsZS5jb20vAAAAAAAAAAQAAAAHAAAACwAAAAf/////AAAAB/////8AAAAHAAAACwAAABIAAAABAAAAEgAAAAEAAAASAAAAAQAAABMAAAAAAAAAAP////8AAAAA/////wAAAAD/////AAAAAP////8BAAAAAAAAAAAACHsiMyI6e319AAAAAAFIEv8yG/9CO5f8QKVpba0iSBL/Mhv/QjuX/EClaW2tIgAAAAEAAA=="_ns); 88 89 // Test serialization with all headers 90 AssertSerializationForHeadersForPolicyContainer( 91 "default-src 'self'"_ns, "blocked-destinations=(script)"_ns, 92 "ydqGXsPXSqGicQ9XHwE8MAAAAAAAAAAAwAAAAAAAAEYAAAABAQnZ7Rrl1EAEv+Anzrkj2awdYyAIbJdIrqUcFuLaoPT2Ad6UctCANBHTk5kAEEug/UCSBzpUbXhPMJE6uHGBMgjGAAAAAv////8AAABQAQAAABNodHRwOi8vZXhhbXBsZS5jb20vAAAAAAAAAAQAAAAHAAAACwAAAAf/////AAAAB/////8AAAAHAAAACwAAABIAAAABAAAAEgAAAAEAAAASAAAAAQAAABMAAAAAAAAAAP////8AAAAA/////wAAAAD/////AAAAAP////8BAAAAAAAAAAAACHsiMyI6e319AAAAAQAAABIAZABlAGYAYQB1AGwAdAAtAHMAcgBjACAAJwBzAGUAbABmACcAAQABSBL/Mhv/QjuX/EClaW2tIkgS/zIb/0I7l/xApWltrSIAAAABAQAAAAEAAAABAAAAAAA="_ns); 93 }