Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5951)

Unified Diff: content/browser/geolocation/gps_location_provider_unittest_linux.cc

Issue 8463022: Make chrome communicate with gpsd through libgps/shared memory (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: addressing joth@ 's comments Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/geolocation/gps_location_provider_unittest_linux.cc
diff --git a/content/browser/geolocation/gps_location_provider_unittest_linux.cc b/content/browser/geolocation/gps_location_provider_unittest_linux.cc
index cdcf00994abd486ce0f2c8e3366d0645c9968cb9..fba137bc9d9eded05c8c49a1ade31214ca2f15ed 100644
--- a/content/browser/geolocation/gps_location_provider_unittest_linux.cc
+++ b/content/browser/geolocation/gps_location_provider_unittest_linux.cc
@@ -7,43 +7,47 @@
#include "content/browser/geolocation/libgps_wrapper_linux.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "base/bind.h"
+
using content::BrowserThread;
using content::BrowserThreadImpl;
-struct gps_data_t {
-};
-
namespace {
class MockLibGps : public LibGps {
public:
MockLibGps();
~MockLibGps();
- virtual bool StartStreaming() {
- ++start_streaming_calls_;
- return start_streaming_ret_;
- }
- virtual bool DataWaiting() {
- EXPECT_GT(start_streaming_calls_, 0);
- ++data_waiting_calls_;
- // Toggle the return value, so the poll loop will exit once per test step.
- return (data_waiting_calls_ & 1) != 0;
- }
virtual bool GetPositionIfFixed(Geoposition* position) {
CHECK(position);
- EXPECT_GT(start_streaming_calls_, 0);
- EXPECT_GT(data_waiting_calls_, 0);
++get_position_calls_;
*position = get_position_;
return get_position_ret_;
+ }
+ static int gps_open_stub(const char*, const char*, struct gps_data_t*) {
+ CHECK(g_instance_);
+ g_instance_->gps_open_calls_++;
+ return g_instance_->gps_open_ret_;
}
- int start_streaming_calls_;
- bool start_streaming_ret_;
- int data_waiting_calls_;
+
+ static int gps_close_stub(struct gps_data_t*) {
+ return 0;
+ }
+
+ static int gps_read_stub(struct gps_data_t*) {
+ CHECK(g_instance_);
+ g_instance_->gps_read_calls_++;
+ return g_instance_->gps_read_ret_;
+ }
+
int get_position_calls_;
- Geoposition get_position_;
bool get_position_ret_;
+ int gps_open_calls_;
+ int gps_open_ret_;
+ int gps_read_calls_;
+ int gps_read_ret_;
+ Geoposition get_position_;
static MockLibGps* g_instance_;
};
@@ -61,7 +65,7 @@ class GeolocationGpsProviderLinuxTests : public testing::Test {
~GeolocationGpsProviderLinuxTests();
static LibGps* NewMockLibGps() {
- return new MockLibGps;
+ return new MockLibGps();
}
static LibGps* NoLibGpsFactory() {
return NULL;
@@ -74,25 +78,6 @@ class GeolocationGpsProviderLinuxTests : public testing::Test {
scoped_ptr<GpsLocationProviderLinux> provider_;
};
-gps_data_t* gps_open_stub(const char*, const char*) {
- // Need to return a non-NULL value here to indicate success, however we don't
- // need (or want) a valid pointer as it should never be dereferenced.
- return static_cast<gps_data_t*>(NULL) + 1;
-}
-int gps_close_stub(gps_data_t*) {
- return 0;
-}
-int gps_poll_stub(gps_data_t*) {
- return 0;
-}
-// v2.90+
-int gps_stream_stub(gps_data_t*, unsigned int, void*) {
- return 0;
-}
-bool gps_waiting_stub(gps_data_t*) {
- return 0;
-}
-
void CheckValidPosition(const Geoposition& expected,
const Geoposition& actual) {
EXPECT_TRUE(actual.IsValidFix());
@@ -104,17 +89,13 @@ void CheckValidPosition(const Geoposition& expected,
MockLibGps* MockLibGps::g_instance_ = NULL;
MockLibGps::MockLibGps()
- : LibGps(new LibGpsLibraryWrapper(NULL,
- gps_open_stub,
- gps_close_stub,
- gps_poll_stub,
- gps_stream_stub,
- gps_waiting_stub)),
- start_streaming_calls_(0),
- start_streaming_ret_(true),
- data_waiting_calls_(0),
+ : LibGps(NULL, gps_open_stub, gps_close_stub, gps_read_stub),
get_position_calls_(0),
- get_position_ret_(true) {
+ get_position_ret_(true),
+ gps_open_calls_(0),
+ gps_open_ret_(0),
+ gps_read_calls_(0),
+ gps_read_ret_(0) {
get_position_.error_code = Geoposition::ERROR_CODE_POSITION_UNAVAILABLE;
EXPECT_FALSE(g_instance_);
g_instance_ = this;
@@ -147,14 +128,16 @@ TEST_F(GeolocationGpsProviderLinuxTests, NoLibGpsInstalled) {
EXPECT_EQ(Geoposition::ERROR_CODE_POSITION_UNAVAILABLE, position.error_code);
}
+#if defined(OS_CHROMEOS)
+
TEST_F(GeolocationGpsProviderLinuxTests, GetPosition) {
ASSERT_TRUE(provider_.get());
const bool ok = provider_->StartProvider(true);
EXPECT_TRUE(ok);
ASSERT_TRUE(MockLibGps::g_instance_);
- EXPECT_EQ(0, MockLibGps::g_instance_->start_streaming_calls_);
- EXPECT_EQ(0, MockLibGps::g_instance_->data_waiting_calls_);
EXPECT_EQ(0, MockLibGps::g_instance_->get_position_calls_);
+ EXPECT_EQ(0, MockLibGps::g_instance_->gps_open_calls_);
+ EXPECT_EQ(0, MockLibGps::g_instance_->gps_read_calls_);
Geoposition position;
provider_->GetPosition(&position);
EXPECT_TRUE(position.IsInitialized());
@@ -168,11 +151,10 @@ TEST_F(GeolocationGpsProviderLinuxTests, GetPosition) {
MockLibGps::g_instance_->get_position_.timestamp =
base::Time::FromDoubleT(200);
EXPECT_TRUE(MockLibGps::g_instance_->get_position_.IsValidFix());
-
MessageLoop::current()->Run();
- EXPECT_GT(MockLibGps::g_instance_->start_streaming_calls_, 0);
- EXPECT_GT(MockLibGps::g_instance_->data_waiting_calls_, 0);
EXPECT_EQ(1, MockLibGps::g_instance_->get_position_calls_);
+ EXPECT_EQ(1, MockLibGps::g_instance_->gps_open_calls_);
+ EXPECT_EQ(1, MockLibGps::g_instance_->gps_read_calls_);
provider_->GetPosition(&position);
CheckValidPosition(MockLibGps::g_instance_->get_position_, position);
@@ -181,12 +163,52 @@ TEST_F(GeolocationGpsProviderLinuxTests, GetPosition) {
MessageLoop::current()->Run();
provider_->GetPosition(&position);
EXPECT_EQ(2, MockLibGps::g_instance_->get_position_calls_);
+ EXPECT_EQ(1, MockLibGps::g_instance_->gps_open_calls_);
+ EXPECT_EQ(2, MockLibGps::g_instance_->gps_read_calls_);
CheckValidPosition(MockLibGps::g_instance_->get_position_, position);
}
-// TODO(joth): Add a test for LibGps::Start() returning false (i.e. gpsd not
-// running). Need to work around the 10s reconnect delay (either by injecting
-// a shorter retry interval, or adapt MessageLoop / Time::Now to be more test
-// friendly).
+class EnableGpsOpenTask : public Task {
+ public:
+ virtual void Run() {
+ CHECK(MockLibGps::g_instance_);
+ MockLibGps::g_instance_->gps_open_ret_ = 0;
+ }
+};
+
+TEST_F(GeolocationGpsProviderLinuxTests, LibGpsReconnect) {
+ // Setup gpsd reconnect interval to be 1000ms to speed up test.
+ provider_->SetGpsdReconnectIntervalMillis(1000);
+ provider_->SetPollPeriodMovingMillis(200);
+ const bool ok = provider_->StartProvider(true);
+ EXPECT_TRUE(ok);
+ ASSERT_TRUE(MockLibGps::g_instance_);
+ // Let gps_open() fails, and so will LibGps::Start().
+ // Reconnect will happen in 1000ms.
+ MockLibGps::g_instance_->gps_open_ret_ = 1;
+ Geoposition position;
+ MockLibGps::g_instance_->get_position_.error_code =
+ Geoposition::ERROR_CODE_NONE;
+ MockLibGps::g_instance_->get_position_.latitude = 4.5;
+ MockLibGps::g_instance_->get_position_.longitude = -34.1;
+ MockLibGps::g_instance_->get_position_.accuracy = 345;
+ MockLibGps::g_instance_->get_position_.timestamp =
+ base::Time::FromDoubleT(200);
+ EXPECT_TRUE(MockLibGps::g_instance_->get_position_.IsValidFix());
+ // This task makes gps_open() and LibGps::Start() to succeed after
+ // 1500ms.
+ MessageLoop::current()->PostDelayedTask(
+ FROM_HERE, new EnableGpsOpenTask(), 1500);
+ MessageLoop::current()->Run();
+ provider_->GetPosition(&position);
+ EXPECT_TRUE(position.IsInitialized());
+ EXPECT_TRUE(position.IsValidFix());
+ // 3 gps_open() calls are expected (2 failures and 1 success)
+ EXPECT_EQ(1, MockLibGps::g_instance_->get_position_calls_);
+ EXPECT_EQ(3, MockLibGps::g_instance_->gps_open_calls_);
+ EXPECT_EQ(1, MockLibGps::g_instance_->gps_read_calls_);
+}
+
+#endif // #if defined(OS_CHROMEOS)
} // namespace

Powered by Google App Engine
This is Rietveld 408576698