// Copyright 2020 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/strings/string_util.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" #include "base/thread_annotations.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test.h" #include "content/public/test/content_browser_test_utils.h" #include "content/public/test/url_loader_monitor.h" #include "content/shell/browser/shell.h" #include "services/network/public/cpp/features.h" #include "services/network/public/cpp/resource_request.h" #include "services/network/public/mojom/trust_tokens.mojom.h" #include "services/network/test/trust_token_test_util.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" // These integration tests cover the interaction between the Trust Token API's // Fetch and iframe surfaces and various configuration requiring Origin Trial // tokens to execute some or all of the Trust Tokens operations (issuance, // redemption, and signing). // // There are two configuration modes: // - "third-party origin trial": all Trust Tokens operations require an origin // trial token to execute and, if a token is missing, the Trust Tokens interface // disppears so that attempts to execute operations will silently no-op. This is // because the Trust Tokens interface manifests itself as an additional argument // in fetch's RequestInit dictionary, which does not throw errors when // unexpected arguments are provided. // - "standard origin trial": only Trust Tokens issuance requires an origin // trial token to execute and, if a token is missing, issuance will fail. // // As an example, consider // // fetch("https://chromium.org", { // privateToken: { // version: 1, // operation: 'token-request'}}) // // a representative fetch with an associated Trust Tokens issuance operation. // When Trust Tokens is completely disabled (e.g. "third-party origin trial" // mode with no token), the trustToken argument will be ignored. On the other // hand, when Trust Tokens is enabled but issuance is forbidden ("standard // origin trial" mode with no token), this will reject with an exception. namespace content { namespace { Combine; Values; ValuesIn; // Trust Tokens has three interfaces: fetch, XHR, and iframe. However, the XHR // and fetch interfaces use essentially identical code paths, so we exclude the // XHR interface in order to save some test duration. enum class Interface { … }; // Prints a string representation to use for generating test names. std::string ToString(Interface interface) { … } Op; enum class Outcome { … }; enum class TrialEnabled { … }; // Prints a string representation to use for generating test names. std::string ToString(TrialEnabled trial_enabled) { … } TrialType; // Prints a string representation to use for generating test names. std::string ToString(TrialType trial_type) { … } struct TestDescription { … }; class TrustTokenOriginTrialBrowsertest : public ContentBrowserTest, public ::testing::WithParamInterface< std::tuple<Interface, TestDescription>> { … }; const TestDescription kTestDescriptions[] = …; // Prints a string representation to use for generating test names. std::string ToString(Op op) { … } std::string TestParamToString( const ::testing::TestParamInfo<std::tuple<Interface, TestDescription>>& info) { … } } // namespace // Each parameter has to be a valid JSON encoding of a TrustToken JS object // *and* valid to directly substitute into JS: this is because the iframe API // requires a JSON encoding of the parameters object, while the Fetch and XHR // APIs require actual objects. INSTANTIATE_TEST_SUITE_P(…); // Test that a Trust Tokens request passes parameters to the network stack // only when permitted by the origin trials framework (either because // configuration specifies that no origin trial token is required, or because an // origin trial token is present in the executing context). IN_PROC_BROWSER_TEST_P(TrustTokenOriginTrialBrowsertest, ProvidesParamsOnlyWhenAllowed) { … } } // namespace content