| /* |
| * Copyright (C) 2013 The Android Open Source Project |
| * |
| * Licensed 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 com.android.documentsui; |
| |
| import static com.android.documentsui.RootsCache.getMatchingRoots; |
| import static com.google.common.collect.Lists.newArrayList; |
| |
| import android.test.AndroidTestCase; |
| import android.test.suitebuilder.annotation.SmallTest; |
| |
| import com.android.documentsui.model.RootInfo; |
| |
| import com.google.common.collect.Lists; |
| |
| import java.util.List; |
| |
| @SmallTest |
| public class RootsCacheTest extends AndroidTestCase { |
| |
| private static RootInfo mNull = new RootInfo(); |
| private static RootInfo mEmpty = buildForMimeTypes(); |
| private static RootInfo mWild = buildForMimeTypes("*/*"); |
| private static RootInfo mImages = buildForMimeTypes("image/*"); |
| private static RootInfo mAudio = buildForMimeTypes( |
| "audio/*", "application/ogg", "application/x-flac"); |
| private static RootInfo mDocs = buildForMimeTypes( |
| "application/msword", "application/vnd.ms-excel"); |
| private static RootInfo mMalformed1 = buildForMimeTypes("meow"); |
| private static RootInfo mMalformed2 = buildForMimeTypes("*/meow"); |
| |
| private List<RootInfo> mRoots; |
| |
| private State mState; |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| |
| mRoots = Lists.newArrayList( |
| mNull, mWild, mEmpty, mImages, mAudio, mDocs, mMalformed1, mMalformed2); |
| |
| mState = new State(); |
| mState.action = State.ACTION_OPEN; |
| mState.showAdvanced = true; |
| mState.localOnly = false; |
| } |
| |
| public void testMatchingRoots_Everything() throws Exception { |
| mState.acceptMimes = new String[] { "*/*" }; |
| assertContainsExactly( |
| newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), |
| getMatchingRoots(mRoots, mState)); |
| } |
| |
| public void testMatchingRoots_DirectoryCopy() throws Exception { |
| RootInfo downloads = buildForMimeTypes("*/*"); |
| downloads.authority = "com.android.providers.downloads.documents"; |
| mRoots.add(downloads); |
| |
| mState.acceptMimes = new String[] { "*/*" }; |
| mState.directoryCopy = true; |
| |
| // basically we're asserting that the results don't contain downloads |
| assertContainsExactly( |
| newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), |
| getMatchingRoots(mRoots, mState)); |
| } |
| |
| public void testMatchingRoots_PngOrWild() throws Exception { |
| mState.acceptMimes = new String[] { "image/png", "*/*" }; |
| assertContainsExactly( |
| newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), |
| getMatchingRoots(mRoots, mState)); |
| } |
| |
| public void testMatchingRoots_AudioWild() throws Exception { |
| mState.acceptMimes = new String[] { "audio/*" }; |
| assertContainsExactly( |
| newArrayList(mNull, mWild, mAudio), |
| getMatchingRoots(mRoots, mState)); |
| } |
| |
| public void testMatchingRoots_AudioWildOrImageWild() throws Exception { |
| mState.acceptMimes = new String[] { "audio/*", "image/*" }; |
| assertContainsExactly( |
| newArrayList(mNull, mWild, mAudio, mImages), |
| getMatchingRoots(mRoots, mState)); |
| } |
| |
| public void testMatchingRoots_AudioSpecific() throws Exception { |
| mState.acceptMimes = new String[] { "audio/mpeg" }; |
| assertContainsExactly( |
| newArrayList(mNull, mWild, mAudio), |
| getMatchingRoots(mRoots, mState)); |
| } |
| |
| public void testMatchingRoots_Document() throws Exception { |
| mState.acceptMimes = new String[] { "application/msword" }; |
| assertContainsExactly( |
| newArrayList(mNull, mWild, mDocs), |
| getMatchingRoots(mRoots, mState)); |
| } |
| |
| public void testMatchingRoots_Application() throws Exception { |
| mState.acceptMimes = new String[] { "application/*" }; |
| assertContainsExactly( |
| newArrayList(mNull, mWild, mAudio, mDocs), |
| getMatchingRoots(mRoots, mState)); |
| } |
| |
| public void testMatchingRoots_FlacOrPng() throws Exception { |
| mState.acceptMimes = new String[] { "application/x-flac", "image/png" }; |
| assertContainsExactly( |
| newArrayList(mNull, mWild, mAudio, mImages), |
| getMatchingRoots(mRoots, mState)); |
| } |
| |
| public void testExcludedAuthorities() throws Exception { |
| final List<RootInfo> roots = newArrayList(); |
| |
| // Set up some roots |
| for (int i = 0; i < 5; ++i) { |
| RootInfo root = new RootInfo(); |
| root.authority = "authority" + i; |
| roots.add(root); |
| } |
| // Make some allowed authorities |
| List<RootInfo> allowedRoots = newArrayList( |
| roots.get(0), roots.get(2), roots.get(4)); |
| // Set up the excluded authority list |
| for (RootInfo root: roots) { |
| if (!allowedRoots.contains(root)) { |
| mState.excludedAuthorities.add(root.authority); |
| } |
| } |
| mState.acceptMimes = new String[] { "*/*" }; |
| |
| assertContainsExactly( |
| allowedRoots, |
| getMatchingRoots(roots, mState)); |
| } |
| |
| private static void assertContainsExactly(List<?> expected, List<?> actual) { |
| assertEquals(expected.size(), actual.size()); |
| for (Object o : expected) { |
| assertTrue(actual.contains(o)); |
| } |
| } |
| |
| private static RootInfo buildForMimeTypes(String... mimeTypes) { |
| final RootInfo root = new RootInfo(); |
| root.derivedMimeTypes = mimeTypes; |
| return root; |
| } |
| } |