1
0
mirror of https://github.com/google/nomulus synced 2026-01-09 07:33:42 +00:00

Upgrade dependencies (#2468)

This commit is contained in:
Lai Jiang
2024-06-05 11:50:42 -04:00
committed by GitHub
parent 61eee45ad0
commit 49cb1875d1
23 changed files with 326 additions and 300 deletions

View File

@@ -401,7 +401,7 @@ public class CloudDnsWriter extends BaseDnsWriter {
if (err == null || err.getErrors().size() > 1) {
throw e;
}
String errorReason = err.getErrors().get(0).getReason();
String errorReason = err.getErrors().getFirst().getReason();
if (RETRYABLE_EXCEPTION_REASONS.contains(errorReason)) {
throw new ZoneStateException(errorReason);

View File

@@ -16,11 +16,9 @@ package google.registry.storage.drive;
import com.google.api.client.http.ByteArrayContent;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.Drive.Children;
import com.google.api.services.drive.model.ChildList;
import com.google.api.services.drive.model.ChildReference;
import com.google.api.services.drive.Drive.Files;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.ParentReference;
import com.google.api.services.drive.model.FileList;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.net.MediaType;
@@ -37,16 +35,19 @@ public class DriveConnection {
/** Drive client instance wrapped by this class. */
@Inject Drive drive;
@Inject public DriveConnection() {}
@Inject
public DriveConnection() {}
/**
* Creates a folder with the given parent.
*
* @return the folder id.
*/
public String createFolder(String title, String parentFolderId) throws IOException {
return drive.files()
.insert(createFileReference(title, GOOGLE_FOLDER, parentFolderId))
public String createFolder(String name, @Nullable String parentFolderId) throws IOException {
return drive
.files()
.create(createFileReference(name, GOOGLE_FOLDER, parentFolderId))
.execute()
.getId();
}
@@ -60,11 +61,12 @@ public class DriveConnection {
*
* @return the file id.
*/
public String createFile(String title, MediaType mimeType, String parentFolderId, byte[] bytes)
public String createFile(String name, MediaType mimeType, String parentFolderId, byte[] bytes)
throws IOException {
return drive.files()
.insert(
createFileReference(title, mimeType, parentFolderId),
return drive
.files()
.create(
createFileReference(name, mimeType, parentFolderId),
new ByteArrayContent(mimeType.toString(), bytes))
.execute()
.getId();
@@ -72,79 +74,79 @@ public class DriveConnection {
/**
* Creates a file with the given parent or updates the existing one if a file already exists with
* that same title and parent.
* that same name and parent.
*
* @throws IllegalStateException if multiple files with that name exist in the given folder.
* @throws IOException if communication with Google Drive fails for any reason.
* @return the file id.
*/
public String createOrUpdateFile(
String title, MediaType mimeType, String parentFolderId, byte[] bytes) throws IOException {
List<String> existingFiles = listFiles(parentFolderId, String.format("title = '%s'", title));
String name, MediaType mimeType, String parentFolderId, byte[] bytes) throws IOException {
List<String> existingFiles = listFiles(parentFolderId, String.format("name = '%s'", name));
if (existingFiles.size() > 1) {
throw new IllegalStateException(String.format(
"Could not update file '%s' in Drive folder id '%s' because multiple files with that "
+ "name already exist.",
title,
parentFolderId));
throw new IllegalStateException(
String.format(
"Could not update file '%s' in Drive folder id '%s' because multiple files with that "
+ "name already exist.",
name, parentFolderId));
}
return existingFiles.isEmpty()
? createFile(title, mimeType, parentFolderId, bytes)
: updateFile(existingFiles.get(0), title, mimeType, bytes);
? createFile(name, mimeType, parentFolderId, bytes)
: updateFile(existingFiles.getFirst(), name, mimeType, bytes);
}
/**
* Updates the file with the given id in place, setting the title, content, and mime type to the
* Updates the file with the given id in place, setting the name, content, and mime type to the
* newly specified values.
*
* @return the file id.
*/
public String updateFile(String fileId, String title, MediaType mimeType, byte[] bytes)
public String updateFile(String fileId, String name, MediaType mimeType, byte[] bytes)
throws IOException {
File file = new File().setTitle(title);
return drive.files()
File file = new File().setName(name);
return drive
.files()
.update(fileId, file, new ByteArrayContent(mimeType.toString(), bytes))
.execute()
.getId();
}
/**
* Returns a list of Drive file ids for all files in Google Drive in the folder with the
* specified id.
* Returns a list of Drive file ids for all files in Google Drive in the folder with the specified
* id.
*/
public List<String> listFiles(String parentFolderId) throws IOException {
return listFiles(parentFolderId, null);
}
/**
* Returns a list of Drive file ids for all files in Google Drive in the folder with the
* specified id and matching the given Drive query.
* Returns a list of Drive file ids for all files in Google Drive in the folder with the specified
* id and matching the given Drive query.
*
* @see <a href="https://developers.google.com/drive/web/search-parameters">The query format</a>
*/
public List<String> listFiles(String parentFolderId, String query) throws IOException {
ImmutableList.Builder<String> result = new ImmutableList.Builder<>();
Children.List req = drive.children().list(parentFolderId);
Files.List req = drive.files().list();
StringBuilder q = new StringBuilder(String.format("'%s' in parents", parentFolderId));
if (!Strings.isNullOrEmpty(query)) {
req.setQ(query);
q.append(String.format(" and %s", query));
}
req.setQ(q.toString());
do {
ChildList files = req.execute();
for (ChildReference child : files.getItems()) {
result.add(child.getId());
}
FileList files = req.execute();
files.getFiles().forEach(file -> result.add(file.getId()));
req.setPageToken(files.getNextPageToken());
} while (!Strings.isNullOrEmpty(req.getPageToken()));
return result.build();
}
/** Constructs an object representing a file (or folder) with a given title and parent. */
/** Constructs an object representing a file (or folder) with a given name and parent. */
private File createFileReference(
String title, MediaType mimeType, @Nullable String parentFolderId) {
String name, MediaType mimeType, @Nullable String parentFolderId) {
return new File()
.setTitle(title)
.setName(name)
.setMimeType(mimeType.toString())
.setParents(parentFolderId == null
? null
: ImmutableList.of(new ParentReference().setId(parentFolderId)));
.setParents(parentFolderId == null ? null : ImmutableList.of(parentFolderId));
}
}

View File

@@ -18,7 +18,6 @@ import static com.google.common.io.ByteStreams.toByteArray;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
@@ -28,12 +27,9 @@ import static org.mockito.Mockito.when;
import com.google.api.client.http.ByteArrayContent;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.Drive.Children;
import com.google.api.services.drive.Drive.Files;
import com.google.api.services.drive.model.ChildList;
import com.google.api.services.drive.model.ChildReference;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.ParentReference;
import com.google.api.services.drive.model.FileList;
import com.google.common.collect.ImmutableList;
import com.google.common.net.MediaType;
import java.util.Arrays;
@@ -47,15 +43,13 @@ class DriveConnectionTest {
private final Drive drive = mock(Drive.class);
private final Files files = mock(Files.class);
private final Children children = mock(Children.class);
private final Files.Insert insert = mock(Files.Insert.class);
private final Files.Create create = mock(Files.Create.class);
private final Files.Update update = mock(Files.Update.class);
private final Children.List childrenList = mock(Children.List.class);
private final Files.List filesList = mock(Files.List.class);
private static final byte[] DATA = {1, 2, 3};
ChildList childList;
private DriveConnection driveConnection;
private List<String> allChildren;
private List<String> allFiles;
private ArgumentMatcher<ByteArrayContent> hasByteArrayContent(final byte[] data) {
return arg -> {
@@ -72,154 +66,143 @@ class DriveConnectionTest {
driveConnection = new DriveConnection();
driveConnection.drive = drive;
when(drive.files()).thenReturn(files);
when(drive.children()).thenReturn(children);
when(insert.execute()).thenReturn(new File().setId("id"));
when(create.execute()).thenReturn(new File().setId("id"));
when(update.execute()).thenReturn(new File().setId("id"));
// Mocking required for listFiles.
ChildReference child1 = new ChildReference().setId("child1");
ChildReference child2 = new ChildReference().setId("child2");
ChildReference child3 = new ChildReference().setId("child3");
ChildReference child4 = new ChildReference().setId("child4");
List<ChildReference> children1 = ImmutableList.of(child1, child2);
List<ChildReference> children2 = ImmutableList.of(child3, child4);
allChildren = ImmutableList.of(child1.getId(), child2.getId(), child3.getId(), child4.getId());
ChildList childList1 = new ChildList();
childList1.setItems(children1);
childList1.setNextPageToken("page2");
ChildList childList2 = new ChildList();
childList2.setItems(children2);
childList2.setNextPageToken(null);
when(childrenList.execute()).thenReturn(childList1, childList2);
when(childrenList.setQ(anyString())).thenReturn(childrenList);
when(childrenList.getPageToken()).thenCallRealMethod();
when(childrenList.setPageToken(any())).thenCallRealMethod();
when(children.list("driveFolderId")).thenReturn(childrenList);
File file1 = new File().setId("file1");
File file2 = new File().setId("file2");
File file3 = new File().setId("file2");
File file4 = new File().setId("file4");
List<File> files1 = ImmutableList.of(file1, file2);
List<File> files2 = ImmutableList.of(file3, file4);
allFiles = ImmutableList.of(file1.getId(), file2.getId(), file3.getId(), file4.getId());
FileList fileList1 = new FileList();
fileList1.setFiles(files1);
fileList1.setNextPageToken("page2");
FileList fileList2 = new FileList();
fileList2.setFiles(files2);
fileList2.setNextPageToken(null);
when(filesList.execute()).thenReturn(fileList1, fileList2);
when(filesList.getPageToken()).thenCallRealMethod();
when(filesList.setPageToken(any())).thenCallRealMethod();
when(files.list()).thenReturn(filesList);
}
@Test
void testCreateFileAtRoot() throws Exception {
when(files.insert(
eq(new File().setTitle("title").setMimeType("image/gif")),
when(files.create(
eq(new File().setName("name").setMimeType("image/gif")),
argThat(hasByteArrayContent(DATA))))
.thenReturn(insert);
assertThat(driveConnection.createFile("title", MediaType.GIF, null, DATA)).isEqualTo("id");
.thenReturn(create);
assertThat(driveConnection.createFile("name", MediaType.GIF, null, DATA)).isEqualTo("id");
}
@Test
void testCreateFileInFolder() throws Exception {
when(files.insert(
when(files.create(
eq(
new File()
.setTitle("title")
.setName("name")
.setMimeType("image/gif")
.setParents(ImmutableList.of(new ParentReference().setId("parent")))),
.setParents(ImmutableList.of("parent"))),
argThat(hasByteArrayContent(DATA))))
.thenReturn(insert);
assertThat(driveConnection.createFile("title", MediaType.GIF, "parent", DATA)).isEqualTo("id");
.thenReturn(create);
assertThat(driveConnection.createFile("name", MediaType.GIF, "parent", DATA)).isEqualTo("id");
}
@Test
void testCreateFolderAtRoot() throws Exception {
when(files.insert(
new File().setTitle("title").setMimeType("application/vnd.google-apps.folder")))
.thenReturn(insert);
assertThat(driveConnection.createFolder("title", null)).isEqualTo("id");
when(files.create(new File().setName("name").setMimeType("application/vnd.google-apps.folder")))
.thenReturn(create);
assertThat(driveConnection.createFolder("name", null)).isEqualTo("id");
}
@Test
void testCreateFolderInFolder() throws Exception {
when(files.insert(
when(files.create(
new File()
.setTitle("title")
.setName("name")
.setMimeType("application/vnd.google-apps.folder")
.setParents(ImmutableList.of(new ParentReference().setId("parent")))))
.thenReturn(insert);
assertThat(driveConnection.createFolder("title", "parent")).isEqualTo("id");
.setParents(ImmutableList.of("parent"))))
.thenReturn(create);
assertThat(driveConnection.createFolder("name", "parent")).isEqualTo("id");
}
@Test
void testListFiles_noQueryWithPagination() throws Exception {
assertThat(driveConnection.listFiles("driveFolderId")).containsExactlyElementsIn(allChildren);
verify(childrenList).setPageToken("page2");
verify(childrenList).setPageToken(null);
verify(childrenList, times(0)).setQ(anyString());
verify(childrenList, times(2)).getPageToken();
assertThat(driveConnection.listFiles("driveFolderId")).containsExactlyElementsIn(allFiles);
verify(filesList).setPageToken("page2");
verify(filesList).setPageToken(null);
verify(filesList, times(1)).setQ("'driveFolderId' in parents");
verify(filesList, times(2)).getPageToken();
}
@Test
void testListFiles_withQueryAndPagination() throws Exception {
assertThat(driveConnection.listFiles("driveFolderId", "sampleQuery"))
.containsExactlyElementsIn(allChildren);
verify(childrenList).setPageToken("page2");
verify(childrenList).setPageToken(null);
verify(childrenList, times(1)).setQ("sampleQuery");
verify(childrenList, times(2)).getPageToken();
.containsExactlyElementsIn(allFiles);
verify(filesList).setPageToken("page2");
verify(filesList).setPageToken(null);
verify(filesList, times(1)).setQ("'driveFolderId' in parents and sampleQuery");
verify(filesList, times(2)).getPageToken();
}
@Test
void testCreateOrUpdateFile_succeedsForNewFile() throws Exception {
when(files.insert(
when(files.create(
eq(
new File()
.setTitle("title")
.setName("name")
.setMimeType("video/webm")
.setParents(ImmutableList.of(new ParentReference().setId("driveFolderId")))),
.setParents(ImmutableList.of("driveFolderId"))),
argThat(hasByteArrayContent(DATA))))
.thenReturn(insert);
ChildList emptyChildList = new ChildList().setItems(ImmutableList.of()).setNextPageToken(null);
when(childrenList.execute()).thenReturn(emptyChildList);
.thenReturn(create);
FileList emptyFileList = new FileList().setFiles(ImmutableList.of()).setNextPageToken(null);
when(filesList.execute()).thenReturn(emptyFileList);
assertThat(
driveConnection.createOrUpdateFile(
"title", MediaType.WEBM_VIDEO, "driveFolderId", DATA))
driveConnection.createOrUpdateFile("name", MediaType.WEBM_VIDEO, "driveFolderId", DATA))
.isEqualTo("id");
}
@Test
void testCreateOrUpdateFile_succeedsForUpdatingFile() throws Exception {
when(files.update(
eq("id"), eq(new File().setTitle("title")), argThat(hasByteArrayContent(DATA))))
when(files.update(eq("id"), eq(new File().setName("name")), argThat(hasByteArrayContent(DATA))))
.thenReturn(update);
ChildList childList =
new ChildList()
.setItems(ImmutableList.of(new ChildReference().setId("id")))
.setNextPageToken(null);
when(childrenList.execute()).thenReturn(childList);
FileList fileList =
new FileList().setFiles(ImmutableList.of(new File().setId("id"))).setNextPageToken(null);
when(filesList.execute()).thenReturn(fileList);
assertThat(
driveConnection.createOrUpdateFile(
"title", MediaType.WEBM_VIDEO, "driveFolderId", DATA))
driveConnection.createOrUpdateFile("name", MediaType.WEBM_VIDEO, "driveFolderId", DATA))
.isEqualTo("id");
}
@Test
void testCreateOrUpdateFile_throwsExceptionWhenMultipleFilesWithNameAlreadyExist()
throws Exception {
ChildList childList =
new ChildList()
.setItems(
ImmutableList.of(
new ChildReference().setId("id1"), new ChildReference().setId("id2")))
FileList fileList =
new FileList()
.setFiles(ImmutableList.of(new File().setId("id1"), new File().setId("id2")))
.setNextPageToken(null);
when(childrenList.execute()).thenReturn(childList);
when(filesList.execute()).thenReturn(fileList);
IllegalStateException thrown =
assertThrows(
IllegalStateException.class,
() ->
driveConnection.createOrUpdateFile(
"title", MediaType.WEBM_VIDEO, "driveFolderId", DATA));
"name", MediaType.WEBM_VIDEO, "driveFolderId", DATA));
assertThat(thrown)
.hasMessageThat()
.contains(
"Could not update file 'title' in Drive folder id 'driveFolderId' "
"Could not update file 'name' in Drive folder id 'driveFolderId' "
+ "because multiple files with that name already exist.");
}
@Test
void testUpdateFile_succeeds() throws Exception {
when(files.update(
eq("id"), eq(new File().setTitle("title")), argThat(hasByteArrayContent(DATA))))
when(files.update(eq("id"), eq(new File().setName("name")), argThat(hasByteArrayContent(DATA))))
.thenReturn(update);
assertThat(driveConnection.updateFile("id", "title", MediaType.WEBM_VIDEO, DATA))
assertThat(driveConnection.updateFile("id", "name", MediaType.WEBM_VIDEO, DATA))
.isEqualTo("id");
}
}

View File

@@ -99,7 +99,7 @@ class ConsoleUpdateRegistrarActionTest {
new JpaTestExtensions.Builder().buildIntegrationTestExtension();
@Test
void testSuccess__updatesRegistrar() throws IOException {
void testSuccess_updatesRegistrar() throws IOException {
var action = createAction(String.format(registrarPostData, "TheRegistrar", "app, dev", false));
action.run();
Registrar newRegistrar = Registrar.loadByRegistrarId("TheRegistrar").get();
@@ -109,7 +109,7 @@ class ConsoleUpdateRegistrarActionTest {
}
@Test
void testFails__missingWhoisContact() throws IOException {
void testFails_missingWhoisContact() throws IOException {
RegistryEnvironment.PRODUCTION.setup(systemPropertyExtension);
var action = createAction(String.format(registrarPostData, "TheRegistrar", "app, dev", false));
action.run();
@@ -119,7 +119,7 @@ class ConsoleUpdateRegistrarActionTest {
}
@Test
void testSuccess__presentWhoisContact() throws IOException {
void testSuccess_presentWhoisContact() throws IOException {
RegistryEnvironment.PRODUCTION.setup(systemPropertyExtension);
RegistrarPoc contact =
new RegistrarPoc.Builder()
@@ -143,7 +143,7 @@ class ConsoleUpdateRegistrarActionTest {
}
@Test
void testSuccess__sendsEmail() throws AddressException, IOException {
void testSuccess_sendsEmail() throws AddressException, IOException {
var action = createAction(String.format(registrarPostData, "TheRegistrar", "app, dev", false));
action.run();
verify(consoleApiParams.sendEmailUtils().gmailClient, times(1))