1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/child/npapi/plugin_lib.h"
7 #include "base/strings/string_util.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "build/build_config.h"
10 #include "testing/gtest/include/gtest/gtest.h"
14 // Test the unloading of plugin libs. Bug http://crbug.com/46526 showed that
15 // if UnloadAllPlugins() simply iterates through the g_loaded_libs global
16 // variable, we can get a crash if no plugin libs were marked as always loaded.
17 class PluginLibTest
: public PluginLib
{
19 PluginLibTest() : PluginLib(WebPluginInfo()) {}
20 using PluginLib::Unload
;
23 ~PluginLibTest() override
{}
26 TEST(PluginLibLoading
, UnloadAllPlugins
) {
27 // For the creation of the g_loaded_libs global variable.
28 ASSERT_EQ(static_cast<PluginLibTest
*>(NULL
),
29 PluginLibTest::CreatePluginLib(base::FilePath()));
31 // Try with a single plugin lib.
32 scoped_refptr
<PluginLibTest
> plugin_lib1(new PluginLibTest());
33 PluginLib::UnloadAllPlugins();
35 // Need to create it again, it should have been destroyed above.
36 ASSERT_EQ(static_cast<PluginLibTest
*>(NULL
),
37 PluginLibTest::CreatePluginLib(base::FilePath()));
39 // Try with two plugin libs.
40 plugin_lib1
= new PluginLibTest();
41 scoped_refptr
<PluginLibTest
> plugin_lib2(new PluginLibTest());
42 PluginLib::UnloadAllPlugins();
44 // Need to create it again, it should have been destroyed above.
45 ASSERT_EQ(static_cast<PluginLibTest
*>(NULL
),
46 PluginLibTest::CreatePluginLib(base::FilePath()));
48 // Now try to manually Unload one and then UnloadAll.
49 plugin_lib1
= new PluginLibTest();
50 plugin_lib2
= new PluginLibTest();
51 plugin_lib1
->Unload();
52 PluginLib::UnloadAllPlugins();
54 // Need to create it again, it should have been destroyed above.
55 ASSERT_EQ(static_cast<PluginLibTest
*>(NULL
),
56 PluginLibTest::CreatePluginLib(base::FilePath()));
58 // Now try to manually Unload the only one and then UnloadAll.
59 plugin_lib1
= new PluginLibTest();
60 plugin_lib1
->Unload();
61 PluginLib::UnloadAllPlugins();
64 } // namespace content