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

Side by Side Diff: chrome/browser/drive/fake_drive_service_unittest.cc

Issue 23591067: Add last_modified to CopyResource and MoveResource. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 2 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/drive/fake_drive_service.cc ('k') | chrome/browser/drive/gdata_wapi_service.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/drive/fake_drive_service.h" 5 #include "chrome/browser/drive/fake_drive_service.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 941 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 "file:2_file_resource_id", 952 "file:2_file_resource_id",
953 test_util::CreateCopyResultCallback(&error, &output_file_path), 953 test_util::CreateCopyResultCallback(&error, &output_file_path),
954 GetContentCallback(), 954 GetContentCallback(),
955 ProgressCallback()); 955 ProgressCallback());
956 base::RunLoop().RunUntilIdle(); 956 base::RunLoop().RunUntilIdle();
957 957
958 EXPECT_EQ(GDATA_NO_CONNECTION, error); 958 EXPECT_EQ(GDATA_NO_CONNECTION, error);
959 } 959 }
960 960
961 TEST_F(FakeDriveServiceTest, CopyResource) { 961 TEST_F(FakeDriveServiceTest, CopyResource) {
962 const base::Time::Exploded kModifiedDate = {2012, 7, 0, 19, 15, 59, 13, 123};
963
962 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 964 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
963 "gdata/root_feed.json")); 965 "gdata/root_feed.json"));
964 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 966 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi(
965 "gdata/account_metadata.json")); 967 "gdata/account_metadata.json"));
966 968
967 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 969 int64 old_largest_change_id = GetLargestChangeByAboutResource();
968 970
969 const std::string kResourceId = "file:2_file_resource_id"; 971 const std::string kResourceId = "file:2_file_resource_id";
970 const std::string kParentResourceId = "folder:2_folder_resource_id"; 972 const std::string kParentResourceId = "folder:2_folder_resource_id";
971 GDataErrorCode error = GDATA_OTHER_ERROR; 973 GDataErrorCode error = GDATA_OTHER_ERROR;
972 scoped_ptr<ResourceEntry> resource_entry; 974 scoped_ptr<ResourceEntry> resource_entry;
973 fake_service_.CopyResource( 975 fake_service_.CopyResource(
974 kResourceId, 976 kResourceId,
975 kParentResourceId, 977 kParentResourceId,
976 "new title", 978 "new title",
979 base::Time::FromUTCExploded(kModifiedDate),
977 test_util::CreateCopyResultCallback(&error, &resource_entry)); 980 test_util::CreateCopyResultCallback(&error, &resource_entry));
978 base::RunLoop().RunUntilIdle(); 981 base::RunLoop().RunUntilIdle();
979 982
980 EXPECT_EQ(HTTP_SUCCESS, error); 983 EXPECT_EQ(HTTP_SUCCESS, error);
981 ASSERT_TRUE(resource_entry); 984 ASSERT_TRUE(resource_entry);
982 // The copied entry should have the new resource ID and the title. 985 // The copied entry should have the new resource ID and the title.
983 EXPECT_EQ(kResourceId + "_copied", resource_entry->resource_id()); 986 EXPECT_EQ(kResourceId + "_copied", resource_entry->resource_id());
984 EXPECT_EQ("new title", resource_entry->title()); 987 EXPECT_EQ("new title", resource_entry->title());
988 EXPECT_EQ(base::Time::FromUTCExploded(kModifiedDate),
989 resource_entry->updated_time());
985 EXPECT_TRUE(HasParent(resource_entry->resource_id(), kParentResourceId)); 990 EXPECT_TRUE(HasParent(resource_entry->resource_id(), kParentResourceId));
986 // Should be incremented as a new hosted document was created. 991 // Should be incremented as a new hosted document was created.
987 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 992 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp());
988 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 993 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource());
989 } 994 }
990 995
991 TEST_F(FakeDriveServiceTest, CopyResource_NonExisting) { 996 TEST_F(FakeDriveServiceTest, CopyResource_NonExisting) {
992 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 997 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
993 "gdata/root_feed.json")); 998 "gdata/root_feed.json"));
994 999
995 const std::string kResourceId = "document:nonexisting_resource_id"; 1000 const std::string kResourceId = "document:nonexisting_resource_id";
996 GDataErrorCode error = GDATA_OTHER_ERROR; 1001 GDataErrorCode error = GDATA_OTHER_ERROR;
997 scoped_ptr<ResourceEntry> resource_entry; 1002 scoped_ptr<ResourceEntry> resource_entry;
998 fake_service_.CopyResource( 1003 fake_service_.CopyResource(
999 kResourceId, 1004 kResourceId,
1000 "folder:1_folder_resource_id", 1005 "folder:1_folder_resource_id",
1001 "new title", 1006 "new title",
1007 base::Time(),
1002 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1008 test_util::CreateCopyResultCallback(&error, &resource_entry));
1003 base::RunLoop().RunUntilIdle(); 1009 base::RunLoop().RunUntilIdle();
1004 1010
1005 EXPECT_EQ(HTTP_NOT_FOUND, error); 1011 EXPECT_EQ(HTTP_NOT_FOUND, error);
1006 } 1012 }
1007 1013
1008 TEST_F(FakeDriveServiceTest, CopyResource_EmptyParentResourceId) { 1014 TEST_F(FakeDriveServiceTest, CopyResource_EmptyParentResourceId) {
1009 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1015 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
1010 "gdata/root_feed.json")); 1016 "gdata/root_feed.json"));
1011 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1017 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi(
1012 "gdata/account_metadata.json")); 1018 "gdata/account_metadata.json"));
1013 1019
1014 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1020 int64 old_largest_change_id = GetLargestChangeByAboutResource();
1015 1021
1016 const std::string kResourceId = "file:2_file_resource_id"; 1022 const std::string kResourceId = "file:2_file_resource_id";
1017 GDataErrorCode error = GDATA_OTHER_ERROR; 1023 GDataErrorCode error = GDATA_OTHER_ERROR;
1018 scoped_ptr<ResourceEntry> resource_entry; 1024 scoped_ptr<ResourceEntry> resource_entry;
1019 fake_service_.CopyResource( 1025 fake_service_.CopyResource(
1020 kResourceId, 1026 kResourceId,
1021 std::string(), 1027 std::string(),
1022 "new title", 1028 "new title",
1029 base::Time(),
1023 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1030 test_util::CreateCopyResultCallback(&error, &resource_entry));
1024 base::RunLoop().RunUntilIdle(); 1031 base::RunLoop().RunUntilIdle();
1025 1032
1026 EXPECT_EQ(HTTP_SUCCESS, error); 1033 EXPECT_EQ(HTTP_SUCCESS, error);
1027 ASSERT_TRUE(resource_entry); 1034 ASSERT_TRUE(resource_entry);
1028 // The copied entry should have the new resource ID and the title. 1035 // The copied entry should have the new resource ID and the title.
1029 EXPECT_EQ(kResourceId + "_copied", resource_entry->resource_id()); 1036 EXPECT_EQ(kResourceId + "_copied", resource_entry->resource_id());
1030 EXPECT_EQ("new title", resource_entry->title()); 1037 EXPECT_EQ("new title", resource_entry->title());
1031 EXPECT_TRUE(HasParent(kResourceId, fake_service_.GetRootResourceId())); 1038 EXPECT_TRUE(HasParent(kResourceId, fake_service_.GetRootResourceId()));
1032 // Should be incremented as a new hosted document was created. 1039 // Should be incremented as a new hosted document was created.
1033 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1040 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp());
1034 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1041 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource());
1035 } 1042 }
1036 1043
1037 TEST_F(FakeDriveServiceTest, CopyResource_Offline) { 1044 TEST_F(FakeDriveServiceTest, CopyResource_Offline) {
1038 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1045 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
1039 "gdata/root_feed.json")); 1046 "gdata/root_feed.json"));
1040 fake_service_.set_offline(true); 1047 fake_service_.set_offline(true);
1041 1048
1042 const std::string kResourceId = "file:2_file_resource_id"; 1049 const std::string kResourceId = "file:2_file_resource_id";
1043 GDataErrorCode error = GDATA_OTHER_ERROR; 1050 GDataErrorCode error = GDATA_OTHER_ERROR;
1044 scoped_ptr<ResourceEntry> resource_entry; 1051 scoped_ptr<ResourceEntry> resource_entry;
1045 fake_service_.CopyResource( 1052 fake_service_.CopyResource(
1046 kResourceId, 1053 kResourceId,
1047 "folder:1_folder_resource_id", 1054 "folder:1_folder_resource_id",
1048 "new title", 1055 "new title",
1056 base::Time(),
1049 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1057 test_util::CreateCopyResultCallback(&error, &resource_entry));
1050 base::RunLoop().RunUntilIdle(); 1058 base::RunLoop().RunUntilIdle();
1051 1059
1052 EXPECT_EQ(GDATA_NO_CONNECTION, error); 1060 EXPECT_EQ(GDATA_NO_CONNECTION, error);
1053 EXPECT_FALSE(resource_entry); 1061 EXPECT_FALSE(resource_entry);
1054 } 1062 }
1055 1063
1056 TEST_F(FakeDriveServiceTest, CopyHostedDocument_Existing) { 1064 TEST_F(FakeDriveServiceTest, CopyHostedDocument_Existing) {
1057 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1065 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
1058 "gdata/root_feed.json")); 1066 "gdata/root_feed.json"));
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1108 kResourceId, 1116 kResourceId,
1109 "new title", 1117 "new title",
1110 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1118 test_util::CreateCopyResultCallback(&error, &resource_entry));
1111 base::RunLoop().RunUntilIdle(); 1119 base::RunLoop().RunUntilIdle();
1112 1120
1113 EXPECT_EQ(GDATA_NO_CONNECTION, error); 1121 EXPECT_EQ(GDATA_NO_CONNECTION, error);
1114 EXPECT_FALSE(resource_entry); 1122 EXPECT_FALSE(resource_entry);
1115 } 1123 }
1116 1124
1117 TEST_F(FakeDriveServiceTest, MoveResource) { 1125 TEST_F(FakeDriveServiceTest, MoveResource) {
1126 const base::Time::Exploded kModifiedDate = {2012, 7, 0, 19, 15, 59, 13, 123};
1127
1118 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1128 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
1119 "gdata/root_feed.json")); 1129 "gdata/root_feed.json"));
1120 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1130 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi(
1121 "gdata/account_metadata.json")); 1131 "gdata/account_metadata.json"));
1122 1132
1123 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1133 int64 old_largest_change_id = GetLargestChangeByAboutResource();
1124 1134
1125 const std::string kResourceId = "file:2_file_resource_id"; 1135 const std::string kResourceId = "file:2_file_resource_id";
1126 const std::string kParentResourceId = "folder:2_folder_resource_id"; 1136 const std::string kParentResourceId = "folder:2_folder_resource_id";
1127 GDataErrorCode error = GDATA_OTHER_ERROR; 1137 GDataErrorCode error = GDATA_OTHER_ERROR;
1128 scoped_ptr<ResourceEntry> resource_entry; 1138 scoped_ptr<ResourceEntry> resource_entry;
1129 fake_service_.MoveResource( 1139 fake_service_.MoveResource(
1130 kResourceId, 1140 kResourceId,
1131 kParentResourceId, 1141 kParentResourceId,
1132 "new title", 1142 "new title",
1143 base::Time::FromUTCExploded(kModifiedDate),
1133 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1144 test_util::CreateCopyResultCallback(&error, &resource_entry));
1134 base::RunLoop().RunUntilIdle(); 1145 base::RunLoop().RunUntilIdle();
1135 1146
1136 EXPECT_EQ(HTTP_SUCCESS, error); 1147 EXPECT_EQ(HTTP_SUCCESS, error);
1137 ASSERT_TRUE(resource_entry); 1148 ASSERT_TRUE(resource_entry);
1138 // The copied entry should have the new resource ID and the title. 1149 // The copied entry should have the new resource ID and the title.
1139 EXPECT_EQ(kResourceId, resource_entry->resource_id()); 1150 EXPECT_EQ(kResourceId, resource_entry->resource_id());
1140 EXPECT_EQ("new title", resource_entry->title()); 1151 EXPECT_EQ("new title", resource_entry->title());
1152 EXPECT_EQ(base::Time::FromUTCExploded(kModifiedDate),
1153 resource_entry->updated_time());
1141 EXPECT_TRUE(HasParent(kResourceId, kParentResourceId)); 1154 EXPECT_TRUE(HasParent(kResourceId, kParentResourceId));
1142 // Should be incremented as a new hosted document was created. 1155 // Should be incremented as a new hosted document was created.
1143 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1156 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp());
1144 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1157 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource());
1145 } 1158 }
1146 1159
1147 TEST_F(FakeDriveServiceTest, MoveResource_NonExisting) { 1160 TEST_F(FakeDriveServiceTest, MoveResource_NonExisting) {
1148 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1161 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
1149 "gdata/root_feed.json")); 1162 "gdata/root_feed.json"));
1150 1163
1151 const std::string kResourceId = "document:nonexisting_resource_id"; 1164 const std::string kResourceId = "document:nonexisting_resource_id";
1152 GDataErrorCode error = GDATA_OTHER_ERROR; 1165 GDataErrorCode error = GDATA_OTHER_ERROR;
1153 scoped_ptr<ResourceEntry> resource_entry; 1166 scoped_ptr<ResourceEntry> resource_entry;
1154 fake_service_.MoveResource( 1167 fake_service_.MoveResource(
1155 kResourceId, 1168 kResourceId,
1156 "folder:1_folder_resource_id", 1169 "folder:1_folder_resource_id",
1157 "new title", 1170 "new title",
1171 base::Time(),
1158 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1172 test_util::CreateCopyResultCallback(&error, &resource_entry));
1159 base::RunLoop().RunUntilIdle(); 1173 base::RunLoop().RunUntilIdle();
1160 1174
1161 EXPECT_EQ(HTTP_NOT_FOUND, error); 1175 EXPECT_EQ(HTTP_NOT_FOUND, error);
1162 } 1176 }
1163 1177
1164 TEST_F(FakeDriveServiceTest, MoveResource_EmptyParentResourceId) { 1178 TEST_F(FakeDriveServiceTest, MoveResource_EmptyParentResourceId) {
1165 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1179 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
1166 "gdata/root_feed.json")); 1180 "gdata/root_feed.json"));
1167 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1181 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi(
1168 "gdata/account_metadata.json")); 1182 "gdata/account_metadata.json"));
1169 1183
1170 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1184 int64 old_largest_change_id = GetLargestChangeByAboutResource();
1171 1185
1172 const std::string kResourceId = "file:2_file_resource_id"; 1186 const std::string kResourceId = "file:2_file_resource_id";
1173 1187
1174 // Just make sure that the resource is under root. 1188 // Just make sure that the resource is under root.
1175 ASSERT_TRUE(HasParent(kResourceId, "fake_root")); 1189 ASSERT_TRUE(HasParent(kResourceId, "fake_root"));
1176 1190
1177 GDataErrorCode error = GDATA_OTHER_ERROR; 1191 GDataErrorCode error = GDATA_OTHER_ERROR;
1178 scoped_ptr<ResourceEntry> resource_entry; 1192 scoped_ptr<ResourceEntry> resource_entry;
1179 fake_service_.MoveResource( 1193 fake_service_.MoveResource(
1180 kResourceId, 1194 kResourceId,
1181 std::string(), 1195 std::string(),
1182 "new title", 1196 "new title",
1197 base::Time(),
1183 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1198 test_util::CreateCopyResultCallback(&error, &resource_entry));
1184 base::RunLoop().RunUntilIdle(); 1199 base::RunLoop().RunUntilIdle();
1185 1200
1186 EXPECT_EQ(HTTP_SUCCESS, error); 1201 EXPECT_EQ(HTTP_SUCCESS, error);
1187 ASSERT_TRUE(resource_entry); 1202 ASSERT_TRUE(resource_entry);
1188 // The copied entry should have the new resource ID and the title. 1203 // The copied entry should have the new resource ID and the title.
1189 EXPECT_EQ(kResourceId, resource_entry->resource_id()); 1204 EXPECT_EQ(kResourceId, resource_entry->resource_id());
1190 EXPECT_EQ("new title", resource_entry->title()); 1205 EXPECT_EQ("new title", resource_entry->title());
1191 EXPECT_TRUE(HasParent(kResourceId, "fake_root")); 1206 EXPECT_TRUE(HasParent(kResourceId, "fake_root"));
1192 // Should be incremented as a new hosted document was created. 1207 // Should be incremented as a new hosted document was created.
1193 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1208 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp());
1194 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1209 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource());
1195 } 1210 }
1196 1211
1197 TEST_F(FakeDriveServiceTest, MoveResource_Offline) { 1212 TEST_F(FakeDriveServiceTest, MoveResource_Offline) {
1198 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1213 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
1199 "gdata/root_feed.json")); 1214 "gdata/root_feed.json"));
1200 fake_service_.set_offline(true); 1215 fake_service_.set_offline(true);
1201 1216
1202 const std::string kResourceId = "file:2_file_resource_id"; 1217 const std::string kResourceId = "file:2_file_resource_id";
1203 GDataErrorCode error = GDATA_OTHER_ERROR; 1218 GDataErrorCode error = GDATA_OTHER_ERROR;
1204 scoped_ptr<ResourceEntry> resource_entry; 1219 scoped_ptr<ResourceEntry> resource_entry;
1205 fake_service_.CopyResource( 1220 fake_service_.CopyResource(
1206 kResourceId, 1221 kResourceId,
1207 "folder:1_folder_resource_id", 1222 "folder:1_folder_resource_id",
1208 "new title", 1223 "new title",
1224 base::Time(),
1209 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1225 test_util::CreateCopyResultCallback(&error, &resource_entry));
1210 base::RunLoop().RunUntilIdle(); 1226 base::RunLoop().RunUntilIdle();
1211 1227
1212 EXPECT_EQ(GDATA_NO_CONNECTION, error); 1228 EXPECT_EQ(GDATA_NO_CONNECTION, error);
1213 EXPECT_FALSE(resource_entry); 1229 EXPECT_FALSE(resource_entry);
1214 } 1230 }
1215 1231
1216 TEST_F(FakeDriveServiceTest, RenameResource_ExistingFile) { 1232 TEST_F(FakeDriveServiceTest, RenameResource_ExistingFile) {
1217 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1233 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
1218 "gdata/root_feed.json")); 1234 "gdata/root_feed.json"));
(...skipping 1092 matching lines...) Expand 10 before | Expand all | Expand 10 after
2311 test_util::CreateCopyResultCallback(&error, &resource_entry)); 2327 test_util::CreateCopyResultCallback(&error, &resource_entry));
2312 base::RunLoop().RunUntilIdle(); 2328 base::RunLoop().RunUntilIdle();
2313 2329
2314 EXPECT_EQ(GDATA_NO_CONNECTION, error); 2330 EXPECT_EQ(GDATA_NO_CONNECTION, error);
2315 EXPECT_FALSE(resource_entry); 2331 EXPECT_FALSE(resource_entry);
2316 } 2332 }
2317 2333
2318 } // namespace 2334 } // namespace
2319 2335
2320 } // namespace drive 2336 } // namespace drive
OLDNEW
« no previous file with comments | « chrome/browser/drive/fake_drive_service.cc ('k') | chrome/browser/drive/gdata_wapi_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698