| // Copyright 2023 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "base/command_line.h" | 
 | #include "base/files/file_path.h" | 
 | #include "base/files/file_util.h" | 
 | #include "chrome/common/chrome_result_codes.h" | 
 | #include "chrome/common/chrome_switches.h" | 
 | #include "chrome/test/base/in_process_browser_test.h" | 
 | #include "content/public/test/browser_test.h" | 
 | #include "extensions/test/test_extension_dir.h" | 
 |  | 
 | namespace extensions { | 
 |  | 
 | class PackExtensionOnStartupBrowserTest : public InProcessBrowserTest { | 
 |  public: | 
 |   PackExtensionOnStartupBrowserTest() = default; | 
 |   ~PackExtensionOnStartupBrowserTest() override = default; | 
 |  | 
 |   void SetUpCommandLine(base::CommandLine* command_line) override { | 
 |     InProcessBrowserTest::SetUpCommandLine(command_line); | 
 |  | 
 |     test_extension_dir_ = std::make_unique<TestExtensionDir>(); | 
 |     // Create an extension with some permissions that are guarded by | 
 |     // base::Features. | 
 |     // Note: Unfortunately, this is bound to become out-of-date. Some | 
 |     // of these features are currently restricted by base::Features, but we'll | 
 |     // eventually remove those restrictions. There's no good workaround for this | 
 |     // that *also* allows us to do the early initialization required in this | 
 |     // test. | 
 |     static constexpr char kManifest[] = | 
 |         R"({ | 
 |              "name": "Test extension", | 
 |              "version": "0.1", | 
 |              "manifest_version": 3, | 
 |              "host_permissions": ["*://example.com/*"], | 
 |              "permissions": ["storage", "tabs", "userScripts", "debugger"], | 
 |              "background": {"service_worker": "background.js"} | 
 |            })"; | 
 |     test_extension_dir_->WriteManifest(kManifest); | 
 |     test_extension_dir_->WriteFile(FILE_PATH_LITERAL("background.js"), | 
 |                                    "// blank"); | 
 |  | 
 |     // Append the switch to pack the extension. | 
 |     command_line->AppendSwitchASCII( | 
 |         ::switches::kPackExtension, | 
 |         test_extension_dir_->UnpackedPath().AsUTF8Unsafe()); | 
 |  | 
 |     // Packing extensions has a different exit code. | 
 |     set_expected_exit_code( | 
 |         CHROME_RESULT_CODE_NORMAL_EXIT_PACK_EXTENSION_SUCCESS); | 
 |   } | 
 |  | 
 |  protected: | 
 |   std::unique_ptr<TestExtensionDir> test_extension_dir_; | 
 | }; | 
 |  | 
 | // Tests that appending the --pack-extension switch on startup succeeds with | 
 | // a "real" browser (i.e., outside of unit tests). | 
 | // Regression test for https://crbug.com/1498558. | 
 | IN_PROC_BROWSER_TEST_F(PackExtensionOnStartupBrowserTest, | 
 |                        PackExtensionOnStartup) { | 
 |   // Interesting case: because the --pack-extension switch results in Chrome | 
 |   // immediately exiting, this test is effectively entirely tested between the | 
 |   // SetUpCommandLine() method and when Chrome starts. This test body is never | 
 |   // reached. That's okay -- the test still serves its purpose and *does* | 
 |   // properly exercise this scenario, including checking the exit code from the | 
 |   // browser -- but it means we can't put any logic here. | 
 | } | 
 |  | 
 | }  // namespace extensions |