blob: 745cbfea7469294a45f4c1170a4ab7bc0c6f4490 [file] [log] [blame]
// Copyright 2016 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 "base/command_line.h"
#include "base/macros.h"
#include "base/memory/singleton.h"
#include "base/synchronization/waitable_event.h"
#include "base/threading/platform_thread.h"
#include "build/build_config.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/content_browser_test.h"
#include "content/public/test/content_browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "content/public/test/test_utils.h"
#include "content/shell/browser/shell.h"
#include "content/shell/browser/shell_javascript_dialog_manager.h"
#include "device/generic_sensor/platform_sensor.h"
#include "device/generic_sensor/platform_sensor_provider.h"
#include "device/generic_sensor/sensor_provider_impl.h"
namespace content {
namespace {
class FakeAmbientLightSensor : public device::PlatformSensor {
public:
FakeAmbientLightSensor(device::mojom::SensorType type,
mojo::ScopedSharedBufferMapping mapping,
device::PlatformSensorProvider* provider)
: PlatformSensor(type, std::move(mapping), provider) {}
device::mojom::ReportingMode GetReportingMode() override {
return device::mojom::ReportingMode::ON_CHANGE;
}
bool StartSensor(
const device::PlatformSensorConfiguration& configuration) override {
device::SensorReading reading;
reading.timestamp =
(base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
reading.values[0] = 50;
UpdateSensorReading(reading, true);
return true;
}
void StopSensor() override{};
protected:
~FakeAmbientLightSensor() override = default;
bool CheckSensorConfiguration(
const device::PlatformSensorConfiguration& configuration) override {
return true;
}
device::PlatformSensorConfiguration GetDefaultConfiguration() override {
device::PlatformSensorConfiguration default_configuration;
default_configuration.set_frequency(60);
return default_configuration;
}
};
class FakeSensorProvider : public device::PlatformSensorProvider {
public:
static FakeSensorProvider* GetInstance() {
return base::Singleton<FakeSensorProvider, base::LeakySingletonTraits<
FakeSensorProvider>>::get();
}
FakeSensorProvider() = default;
~FakeSensorProvider() override = default;
protected:
void CreateSensorInternal(device::mojom::SensorType type,
mojo::ScopedSharedBufferMapping mapping,
const CreateSensorCallback& callback) override {
// Create Sensors here.
switch (type) {
case device::mojom::SensorType::AMBIENT_LIGHT: {
scoped_refptr<device::PlatformSensor> sensor =
new FakeAmbientLightSensor(type, std::move(mapping), this);
callback.Run(std::move(sensor));
break;
}
default:
NOTIMPLEMENTED();
callback.Run(nullptr);
}
}
};
class GenericSensorBrowserTest : public ContentBrowserTest {
public:
GenericSensorBrowserTest()
: io_loop_finished_event_(
base::WaitableEvent::ResetPolicy::AUTOMATIC,
base::WaitableEvent::InitialState::NOT_SIGNALED) {
// TODO(darktears): remove when the GenericSensor feature goes stable.
base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
cmd_line->AppendSwitchASCII(switches::kEnableFeatures, "GenericSensor");
}
void SetUpOnMainThread() override {
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::Bind(&GenericSensorBrowserTest::SetUpOnIOThread,
base::Unretained(this)));
io_loop_finished_event_.Wait();
}
void SetUpOnIOThread() {
device::PlatformSensorProvider::SetProviderForTesting(
FakeSensorProvider::GetInstance());
io_loop_finished_event_.Signal();
}
void TearDown() override {
device::PlatformSensorProvider::SetProviderForTesting(nullptr);
}
public:
base::WaitableEvent io_loop_finished_event_;
};
IN_PROC_BROWSER_TEST_F(GenericSensorBrowserTest, AmbientLightSensorTest) {
// The test page will create an AmbientLightSensor object in Javascript,
// expects to get events with fake values then navigates to #pass.
GURL test_url =
GetTestUrl("generic_sensor", "ambient_light_sensor_test.html");
NavigateToURLBlockUntilNavigationsComplete(shell(), test_url, 2);
EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref());
}
} // namespace
} // namespace content