summaryrefslogtreecommitdiffstats
path: root/chrome/browser/greasemonkey_master_unittest.cc
blob: 17924b5849f89630406e1fb79ffbcfa105017889 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// Copyright (c) 2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/greasemonkey_master.h"

#include <fstream>

#include "base/file_path.h"
#include "base/file_util.h"
#include "base/message_loop.h"
#include "base/path_service.h"
#include "base/string_util.h"
#include "chrome/common/notification_service.h"
#include "testing/gtest/include/gtest/gtest.h"

// Test bringing up a master on a specific directory, putting a script in there, etc.

class GreasemonkeyMasterTest : public testing::Test,
                               public NotificationObserver {
 public:
  GreasemonkeyMasterTest() : shared_memory_(NULL) {}

  virtual void SetUp() {
    // Name a subdirectory of the temp directory.
    std::wstring path_str;
    ASSERT_TRUE(PathService::Get(base::DIR_TEMP, &path_str));
    script_dir_ = FilePath(path_str).Append(
        FILE_PATH_LITERAL("GreasemonkeyTest"));

    // Create a fresh, empty copy of this directory.
    file_util::Delete(script_dir_.value(), true);
    file_util::CreateDirectory(script_dir_.value());

    // Register for all user script notifications.
    NotificationService::current()->AddObserver(this,
        NOTIFY_NEW_USER_SCRIPTS,
        NotificationService::AllSources());
  }

  virtual void TearDown() {
    NotificationService::current()->RemoveObserver(this,
        NOTIFY_NEW_USER_SCRIPTS,
        NotificationService::AllSources());

    // Clean up test directory.
    ASSERT_TRUE(file_util::Delete(script_dir_.value(), true));
    ASSERT_FALSE(file_util::PathExists(script_dir_.value()));
  }

  virtual void Observe(NotificationType type,
                       const NotificationSource& source,
                       const NotificationDetails& details) {
    DCHECK(type == NOTIFY_NEW_USER_SCRIPTS);

    shared_memory_ = Details<base::SharedMemory>(details).ptr();
    if (MessageLoop::current() == &message_loop_)
      MessageLoop::current()->Quit();
  }

  // MessageLoop used in tests.
  MessageLoop message_loop_;

  // Directory containing user scripts.
  FilePath script_dir_;

  // Updated to the script shared memory when we get notified.
  base::SharedMemory* shared_memory_;
};

// Test that we *don't* get spurious notifications.
TEST_F(GreasemonkeyMasterTest, NoScripts) {
  // Set shared_memory_ to something non-NULL, so we can check it became NULL.
  shared_memory_ = reinterpret_cast<base::SharedMemory*>(1);

  scoped_refptr<GreasemonkeyMaster> master(
      new GreasemonkeyMaster(MessageLoop::current(), script_dir_));
  message_loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask);
  message_loop_.Run();

  // There were no scripts in the script dir, so we shouldn't have gotten
  // a notification.
  ASSERT_EQ(NULL, shared_memory_);
}

// Test that we get notified about new scripts after they're added.
TEST_F(GreasemonkeyMasterTest, NewScripts) {
  scoped_refptr<GreasemonkeyMaster> master(
      new GreasemonkeyMaster(MessageLoop::current(), script_dir_));

  FilePath path = script_dir_.Append(FILE_PATH_LITERAL("script.user.js"));

  std::ofstream file;
  file.open(WideToUTF8(path.value()).c_str());
  file << "some content";
  file.close();

  message_loop_.Run();

  ASSERT_TRUE(shared_memory_ != NULL);
}

// Test that we get notified about scripts if they're already in the test dir.
TEST_F(GreasemonkeyMasterTest, ExistingScripts) {
  FilePath path = script_dir_.Append(FILE_PATH_LITERAL("script.user.js"));
  std::ofstream file;
  file.open(WideToUTF8(path.value()).c_str());
  file << "some content";
  file.close();

  scoped_refptr<GreasemonkeyMaster> master(
      new GreasemonkeyMaster(MessageLoop::current(), script_dir_));

  message_loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask);
  message_loop_.Run();

  ASSERT_TRUE(shared_memory_ != NULL);
}