gobblin.source.extractor.extract.google.GoogleDriveFsHelperTest.java Source code

Java tutorial

Introduction

Here is the source code for gobblin.source.extractor.extract.google.GoogleDriveFsHelperTest.java

Source

/*
 * 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;
    }
}