summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/notifier
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/notifier')
-rw-r--r--chrome/browser/sync/notifier/chrome_invalidation_client.cc22
-rw-r--r--chrome/browser/sync/notifier/chrome_invalidation_client.h5
-rw-r--r--chrome/browser/sync/notifier/chrome_system_resources.cc2
-rw-r--r--chrome/browser/sync/notifier/registration_manager.cc66
-rw-r--r--chrome/browser/sync/notifier/registration_manager.h27
-rw-r--r--chrome/browser/sync/notifier/registration_manager_unittest.cc120
6 files changed, 61 insertions, 181 deletions
diff --git a/chrome/browser/sync/notifier/chrome_invalidation_client.cc b/chrome/browser/sync/notifier/chrome_invalidation_client.cc
index 606eb4f..563b132 100644
--- a/chrome/browser/sync/notifier/chrome_invalidation_client.cc
+++ b/chrome/browser/sync/notifier/chrome_invalidation_client.cc
@@ -128,6 +128,28 @@ void ChromeInvalidationClient::InvalidateAll(
RunAndDeleteClosure(callback);
}
+void ChromeInvalidationClient::RegistrationStateChanged(
+ const invalidation::ObjectId& object_id,
+ invalidation::RegistrationState new_state,
+ const invalidation::UnknownHint& unknown_hint) {
+ DCHECK(non_thread_safe_.CalledOnValidThread());
+ VLOG(1) << "RegistrationStateChanged to " << new_state;
+ if (new_state == invalidation::RegistrationState_UNKNOWN) {
+ VLOG(1) << "is_transient=" << unknown_hint.is_transient()
+ << ", message=" << unknown_hint.message();
+ }
+ // TODO(akalin): Figure out something else to do if the failure
+ // isn't transient. Even if it is transient, we may still want to
+ // add exponential back-off or limit the number of attempts.
+ syncable::ModelType model_type;
+ if (ObjectIdToRealModelType(object_id, &model_type) &&
+ (new_state != invalidation::RegistrationState_REGISTERED)) {
+ registration_manager_->MarkRegistrationLost(model_type);
+ } else {
+ LOG(WARNING) << "Could not get object id model type; ignoring";
+ }
+}
+
void ChromeInvalidationClient::AllRegistrationsLost(
invalidation::Closure* callback) {
DCHECK(non_thread_safe_.CalledOnValidThread());
diff --git a/chrome/browser/sync/notifier/chrome_invalidation_client.h b/chrome/browser/sync/notifier/chrome_invalidation_client.h
index 7cbc3f8..53e37f8 100644
--- a/chrome/browser/sync/notifier/chrome_invalidation_client.h
+++ b/chrome/browser/sync/notifier/chrome_invalidation_client.h
@@ -73,6 +73,11 @@ class ChromeInvalidationClient
virtual void InvalidateAll(invalidation::Closure* callback);
+ virtual void RegistrationStateChanged(
+ const invalidation::ObjectId& object_id,
+ invalidation::RegistrationState new_state,
+ const invalidation::UnknownHint& unknown_hint);
+
virtual void AllRegistrationsLost(invalidation::Closure* callback);
virtual void RegistrationLost(const invalidation::ObjectId& object_id,
diff --git a/chrome/browser/sync/notifier/chrome_system_resources.cc b/chrome/browser/sync/notifier/chrome_system_resources.cc
index d23f90b..2bc4897 100644
--- a/chrome/browser/sync/notifier/chrome_system_resources.cc
+++ b/chrome/browser/sync/notifier/chrome_system_resources.cc
@@ -93,7 +93,7 @@ void ChromeSystemResources::Log(
case WARNING_LEVEL:
log_severity = logging::LOG_WARNING;
break;
- case ERROR_LEVEL:
+ case SEVERE_LEVEL:
log_severity = logging::LOG_ERROR;
break;
}
diff --git a/chrome/browser/sync/notifier/registration_manager.cc b/chrome/browser/sync/notifier/registration_manager.cc
index 5b98902..c03c07c 100644
--- a/chrome/browser/sync/notifier/registration_manager.cc
+++ b/chrome/browser/sync/notifier/registration_manager.cc
@@ -8,7 +8,6 @@
#include "chrome/browser/sync/notifier/invalidation_util.h"
#include "chrome/browser/sync/syncable/model_type.h"
-#include "google/cacheinvalidation/invalidation-client.h"
namespace sync_notifier {
@@ -22,20 +21,21 @@ RegistrationManager::~RegistrationManager() {
DCHECK(non_thread_safe_.CalledOnValidThread());
}
-bool RegistrationManager::RegisterType(syncable::ModelType model_type) {
+void RegistrationManager::RegisterType(syncable::ModelType model_type) {
DCHECK(non_thread_safe_.CalledOnValidThread());
invalidation::ObjectId object_id;
if (!RealModelTypeToObjectId(model_type, &object_id)) {
- LOG(ERROR) << "Invalid model type: " << model_type;
- return false;
+ LOG(DFATAL) << "Invalid model type: " << model_type;
+ return;
}
RegistrationStatusMap::iterator it =
registration_status_.insert(
- std::make_pair(model_type, UNREGISTERED)).first;
- if (it->second == UNREGISTERED) {
+ std::make_pair(
+ model_type,
+ invalidation::RegistrationState_UNREGISTERED)).first;
+ if (it->second == invalidation::RegistrationState_UNREGISTERED) {
RegisterObject(object_id, it);
}
- return true;
}
bool RegistrationManager::IsRegistered(
@@ -46,7 +46,7 @@ bool RegistrationManager::IsRegistered(
if (it == registration_status_.end()) {
return false;
}
- return it->second == REGISTERED;
+ return it->second == invalidation::RegistrationState_REGISTERED;
}
void RegistrationManager::MarkRegistrationLost(
@@ -63,7 +63,7 @@ void RegistrationManager::MarkRegistrationLost(
LOG(ERROR) << "Unknown model type: " << model_type;
return;
}
- it->second = UNREGISTERED;
+ it->second = invalidation::RegistrationState_UNREGISTERED;
RegisterObject(object_id, it);
}
@@ -77,7 +77,7 @@ void RegistrationManager::MarkAllRegistrationsLost() {
LOG(DFATAL) << "Invalid model type: " << it->first;
continue;
}
- it->second = UNREGISTERED;
+ it->second = invalidation::RegistrationState_UNREGISTERED;
RegisterObject(object_id, it);
}
}
@@ -85,49 +85,9 @@ void RegistrationManager::MarkAllRegistrationsLost() {
void RegistrationManager::RegisterObject(
const invalidation::ObjectId& object_id,
RegistrationStatusMap::iterator it) {
- DCHECK_EQ(it->second, UNREGISTERED);
- invalidation_client_->Register(
- object_id,
- invalidation::NewPermanentCallback(
- this, &RegistrationManager::OnRegister));
- it->second = PENDING;
-}
-
-void RegistrationManager::OnRegister(
- const invalidation::RegistrationUpdateResult& result) {
- DCHECK(non_thread_safe_.CalledOnValidThread());
- LOG(INFO) << "OnRegister: " << RegistrationUpdateResultToString(result);
- if (result.operation().type() !=
- invalidation::RegistrationUpdate::REGISTER) {
- LOG(ERROR) << "Got non-register result";
- return;
- }
- syncable::ModelType model_type;
- if (!ObjectIdToRealModelType(result.operation().object_id(),
- &model_type)) {
- LOG(ERROR) << "Could not get model type";
- return;
- }
- RegistrationStatusMap::iterator it =
- registration_status_.find(model_type);
- if (it == registration_status_.end()) {
- LOG(ERROR) << "Unknown model type: " << model_type;
- return;
- }
- invalidation::Status::Code code = result.status().code();
- switch (code) {
- case invalidation::Status::SUCCESS:
- it->second = REGISTERED;
- break;
- case invalidation::Status::TRANSIENT_FAILURE:
- // TODO(akalin): Add retry logic. For now, just fall through.
- default:
- // Treat everything else as a permanent failure.
- if (VLOG_IS_ON(1)) {
- LOG(ERROR) << "Registration failed with code: " << code;
- }
- break;
- }
+ DCHECK_EQ(it->second, invalidation::RegistrationState_UNREGISTERED);
+ invalidation_client_->Register(object_id);
+ it->second = invalidation::RegistrationState_REGISTERED;
}
} // namespace sync_notifier
diff --git a/chrome/browser/sync/notifier/registration_manager.h b/chrome/browser/sync/notifier/registration_manager.h
index 06acc89..1b1a534 100644
--- a/chrome/browser/sync/notifier/registration_manager.h
+++ b/chrome/browser/sync/notifier/registration_manager.h
@@ -14,12 +14,7 @@
#include "base/basictypes.h"
#include "base/non_thread_safe.h"
#include "chrome/browser/sync/syncable/model_type.h"
-
-namespace invalidation {
-class InvalidationClient;
-class ObjectId;
-class RegistrationUpdateResult;
-} // namespace
+#include "google/cacheinvalidation/invalidation-client.h"
namespace sync_notifier {
@@ -31,13 +26,10 @@ class RegistrationManager {
~RegistrationManager();
- // If |model_type| is valid, starts the process to register it and
- // returns true. Otherwise, returns false.
- bool RegisterType(syncable::ModelType model_type);
+ // Registers the given |model_type|, which must be valid.
+ void RegisterType(syncable::ModelType model_type);
- // Returns true iff |model_type| has been successfully registered.
- // Note that IsRegistered(model_type) may not immediately (or ever)
- // return true after calling RegisterType(model_type).
+ // Returns true iff |model_type| is currently registered.
//
// Currently only used by unit tests.
bool IsRegistered(syncable::ModelType model_type) const;
@@ -52,16 +44,7 @@ class RegistrationManager {
void MarkAllRegistrationsLost();
private:
- enum RegistrationStatus {
- // Registration request has not yet been sent.
- UNREGISTERED,
- // Registration request has been sent; waiting on confirmation.
- PENDING,
- // Registration has been confirmed.
- REGISTERED,
- };
-
- typedef std::map<syncable::ModelType, RegistrationStatus>
+ typedef std::map<syncable::ModelType, invalidation::RegistrationState>
RegistrationStatusMap;
// Calls invalidation_client_->Register() on |object_id|. sets
diff --git a/chrome/browser/sync/notifier/registration_manager_unittest.cc b/chrome/browser/sync/notifier/registration_manager_unittest.cc
index de773f6..5307d46 100644
--- a/chrome/browser/sync/notifier/registration_manager_unittest.cc
+++ b/chrome/browser/sync/notifier/registration_manager_unittest.cc
@@ -21,38 +21,15 @@ namespace {
// Register().
class FakeInvalidationClient : public invalidation::InvalidationClient {
public:
- struct Args {
- Args() : callback(NULL) {}
-
- Args(const invalidation::ObjectId& oid,
- invalidation::RegistrationCallback* callback)
- : oid(oid), callback(callback) {}
-
- invalidation::ObjectId oid;
- invalidation::RegistrationCallback* callback;
- };
-
FakeInvalidationClient() {}
- virtual ~FakeInvalidationClient() {
- for (std::deque<Args>::iterator it = register_calls.begin();
- it != register_calls.end(); ++it) {
- delete it->callback;
- }
- }
-
- virtual void Register(const invalidation::ObjectId& oid,
- invalidation::RegistrationCallback* callback) {
- register_calls.push_back(Args(oid, callback));
- }
+ virtual ~FakeInvalidationClient() {}
- virtual void Unregister(const invalidation::ObjectId& oid,
- invalidation::RegistrationCallback* callback) {
- ADD_FAILURE();
- delete callback;
+ virtual void Register(const invalidation::ObjectId& oid) {
+ registered_oids.push_back(oid);
}
- virtual void PermanentShutdown() {
+ virtual void Unregister(const invalidation::ObjectId& oid) {
ADD_FAILURE();
}
@@ -61,7 +38,7 @@ class FakeInvalidationClient : public invalidation::InvalidationClient {
return NULL;
}
- std::deque<Args> register_calls;
+ std::deque<invalidation::ObjectId> registered_oids;
private:
DISALLOW_COPY_AND_ASSIGN(FakeInvalidationClient);
@@ -124,48 +101,18 @@ TEST_F(RegistrationManagerTest, RegisterType) {
}
ASSERT_EQ(kModelTypeCount,
- fake_invalidation_client_.register_calls.size());
+ fake_invalidation_client_.registered_oids.size());
- // Nothing should be registered yet.
+ // Everything should be registered.
for (size_t i = 0; i < kModelTypeCount; ++i) {
- EXPECT_FALSE(registration_manager_.IsRegistered(kModelTypes[i]));
+ EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[i]));
}
// Check object IDs.
for (size_t i = 0; i < kModelTypeCount; ++i) {
EXPECT_EQ(kModelTypes[i],
ObjectIdToModelType(
- fake_invalidation_client_.register_calls[i].oid));
- }
-
- // Prepare results.
- std::vector<invalidation::RegistrationUpdateResult> results(
- kModelTypeCount);
- for (size_t i = 0; i < kModelTypeCount; ++i) {
- results[i] = MakeRegistrationUpdateResult(kModelTypes[i]);
- }
-
- // Generate a variety of error conditions in all but the first
- // result.
- results[1].mutable_operation()->set_type(
- invalidation::RegistrationUpdate::UNREGISTER);
- results[2].mutable_operation()->mutable_object_id()->
- mutable_name()->set_string_value("garbage");
- results[3].mutable_status()->
- set_code(invalidation::Status::PERMANENT_FAILURE);
- *results[4].mutable_operation()->mutable_object_id() =
- ModelTypeToObjectId(syncable::TYPED_URLS);
-
-
- // Send the registration results back.
- for (size_t i = 0; i < kModelTypeCount; ++i) {
- fake_invalidation_client_.register_calls[i].callback->Run(results[i]);
- }
-
- // Only the first one should be registered.
- EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[0]));
- for (size_t i = 1; i < kModelTypeCount; ++i) {
- EXPECT_FALSE(registration_manager_.IsRegistered(kModelTypes[i]));
+ fake_invalidation_client_.registered_oids[i]));
}
}
@@ -185,13 +132,7 @@ TEST_F(RegistrationManagerTest, MarkRegistrationLost) {
}
ASSERT_EQ(kModelTypeCount,
- fake_invalidation_client_.register_calls.size());
-
- // Send the registration results back.
- for (size_t i = 0; i < kModelTypeCount; ++i) {
- fake_invalidation_client_.register_calls[i].callback->Run(
- MakeRegistrationUpdateResult(kModelTypes[i]));
- }
+ fake_invalidation_client_.registered_oids.size());
// All should be registered.
for (size_t i = 0; i < kModelTypeCount; ++i) {
@@ -204,22 +145,9 @@ TEST_F(RegistrationManagerTest, MarkRegistrationLost) {
}
ASSERT_EQ(2 * kModelTypeCount - 1,
- fake_invalidation_client_.register_calls.size());
-
- // Only the first one should be registered.
- EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[0]));
- for (size_t i = 1; i < kModelTypeCount; ++i) {
- EXPECT_FALSE(registration_manager_.IsRegistered(kModelTypes[i]));
- }
+ fake_invalidation_client_.registered_oids.size());
- // Send more registration results back.
- for (size_t i = 1; i < kModelTypeCount; ++i) {
- fake_invalidation_client_.register_calls[kModelTypeCount + i - 1].
- callback->Run(
- MakeRegistrationUpdateResult(kModelTypes[i]));
- }
-
- // All should be registered.
+ // All should still be registered.
for (size_t i = 0; i < kModelTypeCount; ++i) {
EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[i]));
}
@@ -241,13 +169,7 @@ TEST_F(RegistrationManagerTest, MarkAllRegistrationsLost) {
}
ASSERT_EQ(kModelTypeCount,
- fake_invalidation_client_.register_calls.size());
-
- // Send the registration results back.
- for (size_t i = 0; i < kModelTypeCount; ++i) {
- fake_invalidation_client_.register_calls[i].callback->Run(
- MakeRegistrationUpdateResult(kModelTypes[i]));
- }
+ fake_invalidation_client_.registered_oids.size());
// All should be registered.
for (size_t i = 0; i < kModelTypeCount; ++i) {
@@ -262,21 +184,9 @@ TEST_F(RegistrationManagerTest, MarkAllRegistrationsLost) {
registration_manager_.MarkAllRegistrationsLost();
ASSERT_EQ(3 * kModelTypeCount - 1,
- fake_invalidation_client_.register_calls.size());
-
- // None should be registered.
- for (size_t i = 0; i < kModelTypeCount; ++i) {
- EXPECT_FALSE(registration_manager_.IsRegistered(kModelTypes[i]));
- }
+ fake_invalidation_client_.registered_oids.size());
- // Send more registration results back.
- for (size_t i = 0; i < kModelTypeCount; ++i) {
- fake_invalidation_client_.register_calls[2 * kModelTypeCount + i - 1].
- callback->Run(
- MakeRegistrationUpdateResult(kModelTypes[i]));
- }
-
- // All should be registered.
+ // All should still be registered.
for (size_t i = 0; i < kModelTypeCount; ++i) {
EXPECT_TRUE(registration_manager_.IsRegistered(kModelTypes[i]));
}