Index: google_apis/gcm/engine/gcm_store_impl.cc |
diff --git a/google_apis/gcm/engine/gcm_store_impl.cc b/google_apis/gcm/engine/gcm_store_impl.cc |
index 14e382e61980af17971ce0dce32febb42148ccf5..cbdfa32834e5fa46dd5c46e1246a76b27135011b 100644 |
--- a/google_apis/gcm/engine/gcm_store_impl.cc |
+++ b/google_apis/gcm/engine/gcm_store_impl.cc |
@@ -170,6 +170,9 @@ class GCMStoreImpl::Backend |
const UpdateCallback& callback); |
void SetLastTokenFetchTime(const base::Time& time, |
const UpdateCallback& callback); |
+ void SetValue(const std::string& key, |
+ const std::string& value, |
+ const UpdateCallback& callback); |
private: |
friend class base::RefCountedThreadSafe<Backend>; |
@@ -647,6 +650,28 @@ void GCMStoreImpl::Backend::SetLastTokenFetchTime( |
foreground_task_runner_->PostTask(FROM_HERE, base::Bind(callback, s.ok())); |
} |
+void GCMStoreImpl::Backend::SetValue(const std::string& key, |
+ const std::string& value, |
+ const UpdateCallback& callback) { |
+ DVLOG(1) << "Injecting a value to GCM Store for testing. Key: " |
+ << key << ", Value: " << value; |
+ if (!db_.get()) { |
+ LOG(ERROR) << "GCMStore db doesn't exist."; |
+ foreground_task_runner_->PostTask(FROM_HERE, base::Bind(callback, false)); |
+ return; |
+ } |
+ |
+ leveldb::WriteOptions write_options; |
+ write_options.sync = true; |
+ |
+ const leveldb::Status s = |
+ db_->Put(write_options, MakeSlice(key), MakeSlice(value)); |
+ |
+ if (!s.ok()) |
+ LOG(ERROR) << "LevelDB had problems injecting a value: " << s.ToString(); |
+ foreground_task_runner_->PostTask(FROM_HERE, base::Bind(callback, s.ok())); |
+} |
+ |
bool GCMStoreImpl::Backend::LoadDeviceCredentials(uint64* android_id, |
uint64* security_token) { |
leveldb::ReadOptions read_options; |
@@ -773,8 +798,10 @@ bool GCMStoreImpl::Backend::LoadLastCheckinInfo( |
MakeSlice(kLastCheckinTimeKey), |
&result); |
int64 time_internal = 0LL; |
- if (s.ok() && !base::StringToInt64(result, &time_internal)) |
+ if (s.ok() && !base::StringToInt64(result, &time_internal)) { |
LOG(ERROR) << "Failed to restore last checkin time. Using default = 0."; |
+ time_internal = 0LL; |
+ } |
// In case we cannot read last checkin time, we default it to 0, as we don't |
// want that situation to cause the whole load to fail. |
@@ -852,8 +879,11 @@ bool GCMStoreImpl::Backend::LoadLastTokenFetchTime( |
leveldb::Status s = |
db_->Get(read_options, MakeSlice(kLastTokenFetchTimeKey), &result); |
int64 time_internal = 0LL; |
- if (s.ok() && !base::StringToInt64(result, &time_internal)) |
- LOG(ERROR) << "Failed to restore last checkin time. Using default = 0."; |
+ if (s.ok() && !base::StringToInt64(result, &time_internal)) { |
+ LOG(ERROR) << |
+ "Failed to restore last token fetching time. Using default = 0."; |
+ time_internal = 0LL; |
+ } |
// In case we cannot read last token fetching time, we default it to 0. |
*last_token_fetch_time = base::Time::FromInternalValue(time_internal); |
@@ -1090,6 +1120,18 @@ void GCMStoreImpl::SetLastTokenFetchTime(const base::Time& time, |
callback)); |
} |
+void GCMStoreImpl::SetValueForTesting(const std::string& key, |
+ const std::string& value, |
+ const UpdateCallback& callback) { |
+ blocking_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&GCMStoreImpl::Backend::SetValue, |
+ backend_, |
+ key, |
+ value, |
+ callback)); |
+} |
+ |
void GCMStoreImpl::LoadContinuation(const LoadCallback& callback, |
scoped_ptr<LoadResult> result) { |
if (!result->success) { |