#include "chrome_frame/test/test_scrubber.h"
#include <windows.h>
#include "base/compiler_specific.h"
#include "base/file_path.h"
#include "base/file_util.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/process_util.h"
#include "base/string16.h"
#include "base/utf_string_conversions.h"
#include "base/win/registry.h"
#include "base/win/scoped_handle.h"
#include "chrome/common/chrome_constants.h"
#include "chrome_frame/test/chrome_frame_test_utils.h"
#include "content/public/common/content_switches.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chrome_frame_test {
namespace {
class TestScrubber {
public:
TestScrubber();
~TestScrubber();
void Initialize(testing::UnitTest* unit_test);
void set_data_directory_override(const base::StringPiece16& user_data_dir) {
user_data_dir.as_string().swap(data_directory_override_);
}
void CleanUpFromTestRun();
private:
class EventListener : public testing::EmptyTestEventListener {
public:
explicit EventListener(TestScrubber* scrubber) : scrubber_(scrubber) {
}
virtual void OnTestProgramStart(const testing::UnitTest&) OVERRIDE {
scrubber_->CleanUpFromTestRun();
}
virtual void OnTestEnd(const testing::TestInfo&) OVERRIDE {
scrubber_->CleanUpFromTestRun();
}
private:
TestScrubber* scrubber_;
DISALLOW_COPY_AND_ASSIGN(EventListener);
};
bool is_initialized() const { return !default_data_directory_.empty(); }
string16 default_data_directory_;
string16 data_directory_override_;
DISALLOW_COPY_AND_ASSIGN(TestScrubber);
};
TestScrubber::TestScrubber() {
}
TestScrubber::~TestScrubber() {
}
void TestScrubber::Initialize(testing::UnitTest* unit_test) {
DCHECK(!is_initialized());
default_data_directory_ = GetProfilePathForIE().value();
data_directory_override_.clear();
unit_test->listeners().Append(new EventListener(this));
}
void TestScrubber::CleanUpFromTestRun() {
base::KillProcesses(chrome_frame_test::kIEImageName, 0, NULL);
base::KillProcesses(chrome_frame_test::kIEBrokerImageName, 0, NULL);
base::KillProcesses(chrome_frame_test::kChromeLauncher, 0, NULL);
KillAllNamedProcessesWithArgument(
chrome::kBrowserProcessExecutableName,
ASCIIToWide(switches::kChromeFrame));
FilePath data_directory(data_directory_override_.empty() ?
default_data_directory_ :
data_directory_override_);
VLOG_IF(1, file_util::PathExists(data_directory))
<< __FUNCTION__ << " deleting user data directory "
<< data_directory.value();
bool deleted = file_util::Delete(data_directory, true);
LOG_IF(ERROR, !deleted)
<< "Failed to delete user data directory directory "
<< data_directory.value();
data_directory_override_.clear();
}
base::LazyInstance<TestScrubber> g_scrubber = LAZY_INSTANCE_INITIALIZER;
}
void InstallTestScrubber(testing::UnitTest* unit_test) {
DCHECK(unit_test);
DCHECK(!unit_test->current_test_case());
g_scrubber.Get().Initialize(unit_test);
}
void OverrideDataDirectoryForThisTest(
const base::StringPiece16& user_data_dir) {
DCHECK(testing::UnitTest::GetInstance()->current_test_info());
g_scrubber.Get().set_data_directory_override(user_data_dir);
}
}