/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package gobblin.source.extractor.extract.google;
import static org.mockito.Mockito.*;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.lang.mutable.MutableInt;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.api.client.util.DateTime;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.Drive.Files;
import com.google.api.services.drive.Drive.Files.*;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.FileList;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.io.Closer;
import static gobblin.source.extractor.extract.google.GoogleDriveFileSystem.*;
import gobblin.configuration.State;
import gobblin.source.extractor.filebased.FileBasedHelperException;
@Test(groups = { "gobblin.source.extractor.google" })
public class GoogleDriveFsHelperTest {
private Drive client;
private Files files;
private void setUp() {
client = mock(Drive.class);
files = mock(Files.class);
when(client.files()).thenReturn(files);
}
public void closeTest() throws IOException, FileBasedHelperException {
State state = new State();
setUp();
GoogleDriveFsHelper fsHelper = new GoogleDriveFsHelper(state, client, Closer.create());
Get getResult = mock(Get.class);
InputStream is = mock(InputStream.class);
when(client.files()).thenReturn(files);
when(files.get(anyString())).thenReturn(getResult);
when(getResult.executeMediaAsInputStream()).thenReturn(is);
fsHelper.getFileStream("test");
fsHelper.close();
verify(is, times(1)).close();
}
public void deleteTest() throws IOException {
State state = new State();
setUp();
GoogleDriveFsHelper fsHelper = new GoogleDriveFsHelper(state, client, Closer.create());
Delete delete = mock(Delete.class);
String fileId = "test_file_id";
when(files.delete(fileId)).thenReturn(delete);
fsHelper.deleteFile(fileId);
verify(delete, times(1)).execute();
}
public void testPagination() throws IOException, FileBasedHelperException {
State state = new State();
state.appendToSetProp(GoogleDriveFileSystem.PAGE_SIZE, Integer.toString(1));
GoogleDriveFsHelper fsHelper = new GoogleDriveFsHelper(state, client, Closer.create());
List listRequest = mock(List.class);
when(files.list()).thenReturn(listRequest);
when(listRequest.setPageSize(anyInt())).thenReturn(listRequest);
when(listRequest.setFields(anyString())).thenReturn(listRequest);
when(listRequest.setQ(anyString())).thenReturn(listRequest);
when(listRequest.setPageToken(anyString())).thenReturn(listRequest);
int paginatedCalls = 5;
final MutableInt i = new MutableInt(paginatedCalls);
final File file = new File();
file.setId("testId");
file.setModifiedTime(new DateTime(System.currentTimeMillis()));
when(listRequest.execute()).thenAnswer(new Answer<FileList>() {
@Override
public FileList answer(InvocationOnMock invocation) throws Throwable {
FileList fileList = new FileList();
fileList.setFiles(ImmutableList.of(file));
if (i.intValue() > 0) {
fileList.setNextPageToken("token");
i.decrement();
}
return fileList;
}
});
fsHelper.ls("test");
int expectedCalls = 1 + paginatedCalls;
verify(listRequest, times(expectedCalls)).execute();
}
public void testList() throws IOException, FileBasedHelperException {
java.util.List<String> filesRoot = Lists.newArrayList("f0_1", "f0_2", "f0_3", "f0_4","f0_5");
java.util.List<String> filesL1 = Lists.newArrayList("f1_1", "f1_2", "f1_3", "f1_4");
java.util.List<String> filesL2 = Lists.newArrayList("f2_1", "f2_2");
String folderL1 = "folderL1";
String folderL2 = "folderL2";
String fileName = "test";
FileList rootFileList = createFileList(filesRoot, folderL1);
FileList FileListL1 = createFileList(filesL1, folderL2);
FileList FileListL2 = createFileList(filesL2, null);
State state = new State();
state.appendToSetProp(GoogleDriveFileSystem.PAGE_SIZE, Integer.toString(1));
GoogleDriveFsHelper fsHelper = new GoogleDriveFsHelper(state, client, Closer.create());
List listRequest = mock(List.class);
when(files.list()).thenReturn(listRequest);
when(listRequest.setFields(anyString())).thenReturn(listRequest);
when(listRequest.setPageSize(anyInt())).thenReturn(listRequest);
GoogleDriveFileSystem fs = new GoogleDriveFileSystem();
when(listRequest.execute()).thenReturn(rootFileList);
List ListL1Request = mock(List.class);
when(listRequest.setQ(fs.buildQuery(folderL1, null).get())).thenReturn(ListL1Request);
when(ListL1Request.execute()).thenReturn(FileListL1);
List ListL2Request = mock(List.class);
when(listRequest.setQ(fs.buildQuery(folderL2, null).get())).thenReturn(ListL2Request);
when(ListL2Request.execute()).thenReturn(FileListL2);
java.util.List<String> actual = fsHelper.ls(folderL2);
java.util.List<String> expected = Lists.newArrayList(filesL2);
Assert.assertTrue(actual.containsAll(expected) && expected.containsAll(actual));
actual = fsHelper.ls(folderL1);
expected.addAll(filesL1);
Assert.assertTrue(actual.containsAll(expected) && expected.containsAll(actual));
actual = fsHelper.ls(null);
expected.addAll(filesRoot);
Assert.assertTrue(actual.containsAll(expected) && expected.containsAll(actual));
}
private FileList createFileList(java.util.List<String> fileIds, String folderId) {
FileList fileList = new FileList();
java.util.List<File> list = Lists.newArrayList();
for (String fileId : fileIds) {
File f = new File();
f.setId(fileId);
f.setModifiedTime(new DateTime(System.currentTimeMillis()));
list.add(f);
}
if (folderId != null) {
File f = new File();
f.setMimeType(FOLDER_MIME_TYPE);
f.setId(folderId);
f.setModifiedTime(new DateTime(System.currentTimeMillis()));
list.add(f);
}
fileList.setFiles(list);
return fileList;
}
}