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

Unified Diff: sync/internal_api/attachments/on_disk_attachment_store_unittest.cc

Issue 2130453004: [Sync] Move //sync to //components/sync. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 5 months 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: sync/internal_api/attachments/on_disk_attachment_store_unittest.cc
diff --git a/sync/internal_api/attachments/on_disk_attachment_store_unittest.cc b/sync/internal_api/attachments/on_disk_attachment_store_unittest.cc
deleted file mode 100644
index 67e27f2ee9ead83f170ec75f6949670716671105..0000000000000000000000000000000000000000
--- a/sync/internal_api/attachments/on_disk_attachment_store_unittest.cc
+++ /dev/null
@@ -1,524 +0,0 @@
-// Copyright 2014 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 "sync/internal_api/public/attachments/on_disk_attachment_store.h"
-
-#include <stdint.h>
-
-#include <string>
-#include <utility>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
-#include "sync/internal_api/attachments/attachment_store_test_template.h"
-#include "sync/internal_api/attachments/proto/attachment_store.pb.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/leveldatabase/src/include/leveldb/db.h"
-#include "third_party/leveldatabase/src/include/leveldb/options.h"
-#include "third_party/leveldatabase/src/include/leveldb/slice.h"
-#include "third_party/leveldatabase/src/include/leveldb/status.h"
-
-namespace syncer {
-
-namespace {
-
-void AttachmentStoreCreated(AttachmentStore::Result* result_dest,
- const AttachmentStore::Result& result) {
- *result_dest = result;
-}
-
-} // namespace
-
-// Instantiation of common attachment store tests.
-class OnDiskAttachmentStoreFactory {
- public:
- OnDiskAttachmentStoreFactory() {}
- ~OnDiskAttachmentStoreFactory() {}
-
- std::unique_ptr<AttachmentStore> CreateAttachmentStore() {
- EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
- std::unique_ptr<AttachmentStore> store;
- AttachmentStore::Result result = AttachmentStore::UNSPECIFIED_ERROR;
- store = AttachmentStore::CreateOnDiskStore(
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get(),
- base::Bind(&AttachmentStoreCreated, &result));
- base::RunLoop run_loop;
- run_loop.RunUntilIdle();
- EXPECT_EQ(AttachmentStore::SUCCESS, result);
- return store;
- }
-
- private:
- base::ScopedTempDir temp_dir_;
-};
-
-INSTANTIATE_TYPED_TEST_CASE_P(OnDisk,
- AttachmentStoreTest,
- OnDiskAttachmentStoreFactory);
-
-// Tests specific to OnDiskAttachmentStore.
-class OnDiskAttachmentStoreSpecificTest : public testing::Test {
- public:
- base::ScopedTempDir temp_dir_;
- base::FilePath db_path_;
- base::MessageLoop message_loop_;
- std::unique_ptr<AttachmentStore> store_;
-
- OnDiskAttachmentStoreSpecificTest() {}
-
- void SetUp() override {
- ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
- db_path_ = temp_dir_.path().Append(FILE_PATH_LITERAL("leveldb"));
- base::CreateDirectory(db_path_);
- }
-
- void CopyResult(AttachmentStore::Result* destination_result,
- const AttachmentStore::Result& source_result) {
- *destination_result = source_result;
- }
-
- void CopyResultAttachments(
- AttachmentStore::Result* destination_result,
- AttachmentIdList* destination_failed_attachment_ids,
- const AttachmentStore::Result& source_result,
- std::unique_ptr<AttachmentMap> source_attachments,
- std::unique_ptr<AttachmentIdList> source_failed_attachment_ids) {
- CopyResult(destination_result, source_result);
- *destination_failed_attachment_ids = *source_failed_attachment_ids;
- }
-
- void CopyResultMetadata(
- AttachmentStore::Result* destination_result,
- std::unique_ptr<AttachmentMetadataList>* destination_metadata,
- const AttachmentStore::Result& source_result,
- std::unique_ptr<AttachmentMetadataList> source_metadata) {
- CopyResult(destination_result, source_result);
- *destination_metadata = std::move(source_metadata);
- }
-
- std::unique_ptr<leveldb::DB> OpenLevelDB() {
- leveldb::DB* db;
- leveldb::Options options;
- options.create_if_missing = true;
- leveldb::Status s =
- leveldb::DB::Open(options, db_path_.AsUTF8Unsafe(), &db);
- EXPECT_TRUE(s.ok());
- return base::WrapUnique(db);
- }
-
- void UpdateRecord(const std::string& key, const std::string& content) {
- std::unique_ptr<leveldb::DB> db = OpenLevelDB();
- leveldb::Status s = db->Put(leveldb::WriteOptions(), key, content);
- EXPECT_TRUE(s.ok());
- }
-
- void UpdateStoreMetadataRecord(const std::string& content) {
- UpdateRecord("database-metadata", content);
- }
-
- void UpdateAttachmentMetadataRecord(const AttachmentId& attachment_id,
- const std::string& content) {
- std::string metadata_key =
- OnDiskAttachmentStore::MakeMetadataKeyFromAttachmentId(attachment_id);
- UpdateRecord(metadata_key, content);
- }
-
- std::string ReadStoreMetadataRecord() {
- std::unique_ptr<leveldb::DB> db = OpenLevelDB();
- std::string content;
- leveldb::Status s =
- db->Get(leveldb::ReadOptions(), "database-metadata", &content);
- EXPECT_TRUE(s.ok());
- return content;
- }
-
- void VerifyAttachmentRecordsPresent(const AttachmentId& attachment_id,
- bool expect_records_present) {
- std::unique_ptr<leveldb::DB> db = OpenLevelDB();
-
- std::string metadata_key =
- OnDiskAttachmentStore::MakeMetadataKeyFromAttachmentId(attachment_id);
- std::string data_key =
- OnDiskAttachmentStore::MakeDataKeyFromAttachmentId(attachment_id);
- std::string data;
- leveldb::Status s = db->Get(leveldb::ReadOptions(), data_key, &data);
- if (expect_records_present)
- EXPECT_TRUE(s.ok());
- else
- EXPECT_TRUE(s.IsNotFound());
- s = db->Get(leveldb::ReadOptions(), metadata_key, &data);
- if (expect_records_present)
- EXPECT_TRUE(s.ok());
- else
- EXPECT_TRUE(s.IsNotFound());
- }
-
- void RunLoop() {
- base::RunLoop run_loop;
- run_loop.RunUntilIdle();
- }
-};
-
-// Ensure that store can be closed and reopen while retaining stored
-// attachments.
-TEST_F(OnDiskAttachmentStoreSpecificTest, CloseAndReopen) {
- AttachmentStore::Result result;
-
- result = AttachmentStore::UNSPECIFIED_ERROR;
- store_ = AttachmentStore::CreateOnDiskStore(
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get(),
- base::Bind(&AttachmentStoreCreated, &result));
- RunLoop();
- EXPECT_EQ(AttachmentStore::SUCCESS, result);
-
- result = AttachmentStore::UNSPECIFIED_ERROR;
- std::string some_data = "data";
- Attachment attachment =
- Attachment::Create(base::RefCountedString::TakeString(&some_data));
- AttachmentList attachments;
- attachments.push_back(attachment);
- store_->Write(attachments,
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResult,
- base::Unretained(this),
- &result));
- RunLoop();
- EXPECT_EQ(AttachmentStore::SUCCESS, result);
-
- // Close and reopen attachment store.
- store_ = nullptr;
- result = AttachmentStore::UNSPECIFIED_ERROR;
- store_ = AttachmentStore::CreateOnDiskStore(
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get(),
- base::Bind(&AttachmentStoreCreated, &result));
- RunLoop();
- EXPECT_EQ(AttachmentStore::SUCCESS, result);
-
- result = AttachmentStore::UNSPECIFIED_ERROR;
- AttachmentIdList attachment_ids;
- attachment_ids.push_back(attachment.GetId());
- AttachmentIdList failed_attachment_ids;
- store_->Read(
- attachment_ids,
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResultAttachments,
- base::Unretained(this), &result, &failed_attachment_ids));
- RunLoop();
- EXPECT_EQ(AttachmentStore::SUCCESS, result);
- EXPECT_TRUE(failed_attachment_ids.empty());
-}
-
-// Ensure loading corrupt attachment store fails.
-TEST_F(OnDiskAttachmentStoreSpecificTest, FailToOpen) {
- // To simulate corrupt database write empty CURRENT file.
- std::string current_file_content = "";
- base::WriteFile(db_path_.Append(FILE_PATH_LITERAL("CURRENT")),
- current_file_content.c_str(), current_file_content.size());
-
- AttachmentStore::Result result = AttachmentStore::SUCCESS;
- store_ = AttachmentStore::CreateOnDiskStore(
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get(),
- base::Bind(&AttachmentStoreCreated, &result));
- RunLoop();
- EXPECT_EQ(AttachmentStore::UNSPECIFIED_ERROR, result);
-}
-
-// Ensure that attachment store works correctly when store metadata is missing,
-// corrupt or has unknown schema version.
-TEST_F(OnDiskAttachmentStoreSpecificTest, StoreMetadata) {
- // Create and close empty database.
- OpenLevelDB();
- // Open database with AttachmentStore.
- AttachmentStore::Result result = AttachmentStore::UNSPECIFIED_ERROR;
- store_ = AttachmentStore::CreateOnDiskStore(
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get(),
- base::Bind(&AttachmentStoreCreated, &result));
- RunLoop();
- EXPECT_EQ(AttachmentStore::SUCCESS, result);
- // Close AttachmentStore so that test can check content.
- store_ = nullptr;
- RunLoop();
-
- // AttachmentStore should create metadata record.
- std::string data = ReadStoreMetadataRecord();
- attachment_store_pb::StoreMetadata metadata;
- EXPECT_TRUE(metadata.ParseFromString(data));
- EXPECT_EQ(1, metadata.schema_version());
-
- // Set unknown future schema version.
- metadata.set_schema_version(2);
- data = metadata.SerializeAsString();
- UpdateStoreMetadataRecord(data);
-
- // AttachmentStore should fail to load.
- result = AttachmentStore::SUCCESS;
- store_ = AttachmentStore::CreateOnDiskStore(
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get(),
- base::Bind(&AttachmentStoreCreated, &result));
- RunLoop();
- EXPECT_EQ(AttachmentStore::UNSPECIFIED_ERROR, result);
-
- // Write garbage into metadata record.
- UpdateStoreMetadataRecord("abra.cadabra");
-
- // AttachmentStore should fail to load.
- result = AttachmentStore::SUCCESS;
- store_ = AttachmentStore::CreateOnDiskStore(
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get(),
- base::Bind(&AttachmentStoreCreated, &result));
- RunLoop();
- EXPECT_EQ(AttachmentStore::UNSPECIFIED_ERROR, result);
-}
-
-// Ensure that attachment store correctly maintains metadata records for
-// attachments.
-TEST_F(OnDiskAttachmentStoreSpecificTest, RecordMetadata) {
- // Create attachment store.
- AttachmentStore::Result create_result = AttachmentStore::UNSPECIFIED_ERROR;
- store_ = AttachmentStore::CreateOnDiskStore(
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get(),
- base::Bind(&AttachmentStoreCreated, &create_result));
-
- // Write two attachments.
- AttachmentStore::Result write_result = AttachmentStore::UNSPECIFIED_ERROR;
- std::string some_data;
- AttachmentList attachments;
- some_data = "data1";
- attachments.push_back(
- Attachment::Create(base::RefCountedString::TakeString(&some_data)));
- some_data = "data2";
- attachments.push_back(
- Attachment::Create(base::RefCountedString::TakeString(&some_data)));
- store_->Write(attachments,
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResult,
- base::Unretained(this), &write_result));
-
- // Delete one of written attachments.
- AttachmentStore::Result drop_result = AttachmentStore::UNSPECIFIED_ERROR;
- AttachmentIdList attachment_ids;
- attachment_ids.push_back(attachments[0].GetId());
- store_->Drop(attachment_ids,
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResult,
- base::Unretained(this), &drop_result));
- store_ = nullptr;
- RunLoop();
- EXPECT_EQ(AttachmentStore::SUCCESS, create_result);
- EXPECT_EQ(AttachmentStore::SUCCESS, write_result);
- EXPECT_EQ(AttachmentStore::SUCCESS, drop_result);
-
- // Verify that attachment store contains only records for second attachment.
- VerifyAttachmentRecordsPresent(attachments[0].GetId(), false);
- VerifyAttachmentRecordsPresent(attachments[1].GetId(), true);
-}
-
-// Ensure that attachment store fails to load attachment if the crc in the store
-// does not match the data.
-TEST_F(OnDiskAttachmentStoreSpecificTest, MismatchedCrcInStore) {
- // Create attachment store.
- AttachmentStore::Result create_result = AttachmentStore::UNSPECIFIED_ERROR;
- store_ = AttachmentStore::CreateOnDiskStore(
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get(),
- base::Bind(&AttachmentStoreCreated, &create_result));
-
- // Write attachment with incorrect crc32c.
- AttachmentStore::Result write_result = AttachmentStore::UNSPECIFIED_ERROR;
- const uint32_t intentionally_wrong_crc32c = 0;
-
- scoped_refptr<base::RefCountedString> some_data(new base::RefCountedString());
- some_data->data() = "data1";
- Attachment attachment = Attachment::CreateFromParts(
- AttachmentId::Create(some_data->size(), intentionally_wrong_crc32c),
- some_data);
- AttachmentList attachments;
- attachments.push_back(attachment);
- store_->Write(attachments,
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResult,
- base::Unretained(this), &write_result));
-
- // Read attachment.
- AttachmentStore::Result read_result = AttachmentStore::UNSPECIFIED_ERROR;
- AttachmentIdList attachment_ids;
- attachment_ids.push_back(attachment.GetId());
- AttachmentIdList failed_attachment_ids;
- store_->Read(
- attachment_ids,
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResultAttachments,
- base::Unretained(this), &read_result, &failed_attachment_ids));
- RunLoop();
- EXPECT_EQ(AttachmentStore::SUCCESS, create_result);
- EXPECT_EQ(AttachmentStore::SUCCESS, write_result);
- EXPECT_EQ(AttachmentStore::UNSPECIFIED_ERROR, read_result);
- EXPECT_THAT(failed_attachment_ids, testing::ElementsAre(attachment.GetId()));
-}
-
-// Ensure that attachment store fails to load attachment if the crc in the id
-// does not match the data.
-TEST_F(OnDiskAttachmentStoreSpecificTest, MismatchedCrcInId) {
- // Create attachment store.
- AttachmentStore::Result create_result = AttachmentStore::UNSPECIFIED_ERROR;
- store_ = AttachmentStore::CreateOnDiskStore(
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get(),
- base::Bind(&AttachmentStoreCreated, &create_result));
-
- AttachmentStore::Result write_result = AttachmentStore::UNSPECIFIED_ERROR;
- scoped_refptr<base::RefCountedString> some_data(new base::RefCountedString());
- some_data->data() = "data1";
- Attachment attachment = Attachment::Create(some_data);
- AttachmentList attachments;
- attachments.push_back(attachment);
- store_->Write(attachments,
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResult,
- base::Unretained(this), &write_result));
-
- // Read, but with the wrong crc32c in the id.
- AttachmentStore::Result read_result = AttachmentStore::SUCCESS;
-
- AttachmentId id_with_bad_crc32c =
- AttachmentId::Create(attachment.GetId().GetSize(), 12345);
- AttachmentIdList attachment_ids;
- attachment_ids.push_back(id_with_bad_crc32c);
- AttachmentIdList failed_attachment_ids;
- store_->Read(
- attachment_ids,
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResultAttachments,
- base::Unretained(this), &read_result, &failed_attachment_ids));
- RunLoop();
- EXPECT_EQ(AttachmentStore::SUCCESS, create_result);
- EXPECT_EQ(AttachmentStore::SUCCESS, write_result);
- EXPECT_EQ(AttachmentStore::UNSPECIFIED_ERROR, read_result);
- EXPECT_THAT(failed_attachment_ids, testing::ElementsAre(id_with_bad_crc32c));
-}
-
-// Ensure that after store initialization failure ReadWrite/Drop operations fail
-// with correct error.
-TEST_F(OnDiskAttachmentStoreSpecificTest, OpsAfterInitializationFailed) {
- // To simulate corrupt database write empty CURRENT file.
- std::string current_file_content = "";
- base::WriteFile(db_path_.Append(FILE_PATH_LITERAL("CURRENT")),
- current_file_content.c_str(), current_file_content.size());
-
- AttachmentStore::Result create_result = AttachmentStore::SUCCESS;
- store_ = AttachmentStore::CreateOnDiskStore(
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get(),
- base::Bind(&AttachmentStoreCreated, &create_result));
-
- // Reading from uninitialized store should result in
- // STORE_INITIALIZATION_FAILED.
- AttachmentStore::Result read_result = AttachmentStore::SUCCESS;
- AttachmentIdList attachment_ids;
- std::string some_data("data1");
- Attachment attachment =
- Attachment::Create(base::RefCountedString::TakeString(&some_data));
- attachment_ids.push_back(attachment.GetId());
- AttachmentIdList failed_attachment_ids;
- store_->Read(
- attachment_ids,
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResultAttachments,
- base::Unretained(this), &read_result, &failed_attachment_ids));
-
- // Dropping from uninitialized store should result in
- // STORE_INITIALIZATION_FAILED.
- AttachmentStore::Result drop_result = AttachmentStore::SUCCESS;
- store_->Drop(attachment_ids,
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResult,
- base::Unretained(this), &drop_result));
-
- // Writing to uninitialized store should result in
- // STORE_INITIALIZATION_FAILED.
- AttachmentStore::Result write_result = AttachmentStore::SUCCESS;
- AttachmentList attachments;
- attachments.push_back(attachment);
- store_->Write(attachments,
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResult,
- base::Unretained(this), &write_result));
-
- RunLoop();
- EXPECT_EQ(AttachmentStore::UNSPECIFIED_ERROR, create_result);
- EXPECT_EQ(AttachmentStore::STORE_INITIALIZATION_FAILED, read_result);
- EXPECT_THAT(failed_attachment_ids, testing::ElementsAre(attachment_ids[0]));
- EXPECT_EQ(AttachmentStore::STORE_INITIALIZATION_FAILED, drop_result);
- EXPECT_EQ(AttachmentStore::STORE_INITIALIZATION_FAILED, write_result);
-}
-
-// Ensure that attachment store handles the case of having an unexpected
-// record at the end without crashing.
-TEST_F(OnDiskAttachmentStoreSpecificTest, ReadMetadataWithUnexpectedRecord) {
- // Write a bogus entry at the end of the database.
- UpdateRecord("zzz", "foobar");
-
- // Create attachment store.
- AttachmentStore::Result create_result = AttachmentStore::UNSPECIFIED_ERROR;
- store_ = AttachmentStore::CreateOnDiskStore(
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get(),
- base::Bind(&AttachmentStoreCreated, &create_result));
-
- // Read all metadata. Should be getting no error and zero entries.
- AttachmentStore::Result metadata_result = AttachmentStore::UNSPECIFIED_ERROR;
- std::unique_ptr<AttachmentMetadataList> metadata_list;
- store_->ReadMetadata(
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResultMetadata,
- base::Unretained(this), &metadata_result, &metadata_list));
- RunLoop();
- EXPECT_EQ(AttachmentStore::SUCCESS, create_result);
- EXPECT_EQ(AttachmentStore::SUCCESS, metadata_result);
- EXPECT_EQ(0U, metadata_list->size());
- metadata_list.reset();
-
- // Write 3 attachments to the store
- AttachmentList attachments;
-
- for (int i = 0; i < 3; i++) {
- std::string some_data = "data";
- Attachment attachment =
- Attachment::Create(base::RefCountedString::TakeString(&some_data));
- attachments.push_back(attachment);
- }
- AttachmentStore::Result write_result = AttachmentStore::UNSPECIFIED_ERROR;
- store_->Write(attachments,
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResult,
- base::Unretained(this), &write_result));
-
- // Read all metadata back. We should be getting 3 entries.
- store_->ReadMetadata(
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResultMetadata,
- base::Unretained(this), &metadata_result, &metadata_list));
- RunLoop();
- EXPECT_EQ(AttachmentStore::SUCCESS, write_result);
- EXPECT_EQ(AttachmentStore::SUCCESS, metadata_result);
- EXPECT_EQ(3U, metadata_list->size());
- // Get Id of the attachment in the middle.
- AttachmentId id = (*metadata_list.get())[1].GetId();
- metadata_list.reset();
-
- // Close the store.
- store_ = nullptr;
- RunLoop();
-
- // Modify the middle attachment metadata entry so that it isn't valid anymore.
- UpdateAttachmentMetadataRecord(id, "foobar");
-
- // Reopen the store.
- create_result = AttachmentStore::UNSPECIFIED_ERROR;
- metadata_result = AttachmentStore::UNSPECIFIED_ERROR;
- store_ = AttachmentStore::CreateOnDiskStore(
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get(),
- base::Bind(&AttachmentStoreCreated, &create_result));
-
- // Read all metadata back. We should be getting a failure and
- // only 2 entries now.
- store_->ReadMetadata(
- base::Bind(&OnDiskAttachmentStoreSpecificTest::CopyResultMetadata,
- base::Unretained(this), &metadata_result, &metadata_list));
- RunLoop();
- EXPECT_EQ(AttachmentStore::SUCCESS, create_result);
- EXPECT_EQ(AttachmentStore::UNSPECIFIED_ERROR, metadata_result);
- EXPECT_EQ(2U, metadata_list->size());
-}
-
-} // namespace syncer
« no previous file with comments | « sync/internal_api/attachments/on_disk_attachment_store.cc ('k') | sync/internal_api/attachments/proto/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698