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.
4
5#include "content/child/npapi/plugin_lib.h"
6
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"
11
12namespace content {
13
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.
17class PluginLibTest : public PluginLib {
18 public:
19  PluginLibTest() : PluginLib(WebPluginInfo()) {}
20  using PluginLib::Unload;
21
22 protected:
23  virtual ~PluginLibTest() {}
24};
25
26TEST(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()));
30
31  // Try with a single plugin lib.
32  scoped_refptr<PluginLibTest> plugin_lib1(new PluginLibTest());
33  PluginLib::UnloadAllPlugins();
34
35  // Need to create it again, it should have been destroyed above.
36  ASSERT_EQ(static_cast<PluginLibTest*>(NULL),
37      PluginLibTest::CreatePluginLib(base::FilePath()));
38
39  // Try with two plugin libs.
40  plugin_lib1 = new PluginLibTest();
41  scoped_refptr<PluginLibTest> plugin_lib2(new PluginLibTest());
42  PluginLib::UnloadAllPlugins();
43
44  // Need to create it again, it should have been destroyed above.
45  ASSERT_EQ(static_cast<PluginLibTest*>(NULL),
46      PluginLibTest::CreatePluginLib(base::FilePath()));
47
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();
53
54  // Need to create it again, it should have been destroyed above.
55  ASSERT_EQ(static_cast<PluginLibTest*>(NULL),
56      PluginLibTest::CreatePluginLib(base::FilePath()));
57
58  // Now try to manually Unload the only one and then UnloadAll.
59  plugin_lib1 = new PluginLibTest();
60  plugin_lib1->Unload();
61  PluginLib::UnloadAllPlugins();
62}
63
64}  // namespace content
65