TestMtpManager.java revision 52652ac7a5f479f7f5e24f78778203bd88c0c4f4
109109567e9816d20f51b5ce0175751116836635fDaichi Hirono/*
209109567e9816d20f51b5ce0175751116836635fDaichi Hirono * Copyright (C) 2015 The Android Open Source Project
309109567e9816d20f51b5ce0175751116836635fDaichi Hirono *
409109567e9816d20f51b5ce0175751116836635fDaichi Hirono * Licensed under the Apache License, Version 2.0 (the "License");
509109567e9816d20f51b5ce0175751116836635fDaichi Hirono * you may not use this file except in compliance with the License.
609109567e9816d20f51b5ce0175751116836635fDaichi Hirono * You may obtain a copy of the License at
709109567e9816d20f51b5ce0175751116836635fDaichi Hirono *
809109567e9816d20f51b5ce0175751116836635fDaichi Hirono *      http://www.apache.org/licenses/LICENSE-2.0
909109567e9816d20f51b5ce0175751116836635fDaichi Hirono *
1009109567e9816d20f51b5ce0175751116836635fDaichi Hirono * Unless required by applicable law or agreed to in writing, software
1109109567e9816d20f51b5ce0175751116836635fDaichi Hirono * distributed under the License is distributed on an "AS IS" BASIS,
1209109567e9816d20f51b5ce0175751116836635fDaichi Hirono * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1309109567e9816d20f51b5ce0175751116836635fDaichi Hirono * See the License for the specific language governing permissions and
1409109567e9816d20f51b5ce0175751116836635fDaichi Hirono * limitations under the License.
1509109567e9816d20f51b5ce0175751116836635fDaichi Hirono */
1609109567e9816d20f51b5ce0175751116836635fDaichi Hirono
1709109567e9816d20f51b5ce0175751116836635fDaichi Hironopackage com.android.mtp;
1809109567e9816d20f51b5ce0175751116836635fDaichi Hirono
1909109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport android.content.Context;
2052652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewskiimport android.os.ParcelFileDescriptor;
2109109567e9816d20f51b5ce0175751116836635fDaichi Hirono
2209109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport java.io.IOException;
23e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hironoimport java.util.Arrays;
2409109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport java.util.HashMap;
2509109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport java.util.HashSet;
2609109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport java.util.Map;
2709109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport java.util.Set;
2809109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport java.util.TreeSet;
2909109567e9816d20f51b5ce0175751116836635fDaichi Hirono
306ee4a1c1247e2a1d3032bcd432f843cbb7227dccDaichi Hironopublic class TestMtpManager extends MtpManager {
31e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono    private static String pack(int... args) {
32e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono        return Arrays.toString(args);
33e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono    }
34e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono
3509109567e9816d20f51b5ce0175751116836635fDaichi Hirono    private final Set<Integer> mValidDevices = new HashSet<Integer>();
3609109567e9816d20f51b5ce0175751116836635fDaichi Hirono    private final Set<Integer> mOpenedDevices = new TreeSet<Integer>();
3709109567e9816d20f51b5ce0175751116836635fDaichi Hirono    private final Map<Integer, MtpRoot[]> mRoots = new HashMap<Integer, MtpRoot[]>();
38e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono    private final Map<String, MtpDocument> mDocuments = new HashMap<String, MtpDocument>();
395fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono    private final Map<String, Integer> mParents = new HashMap<String, Integer>();
4052652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski    private final Map<String, byte[]> mImportFileBytes = new HashMap<String, byte[]>();
4109109567e9816d20f51b5ce0175751116836635fDaichi Hirono
426ee4a1c1247e2a1d3032bcd432f843cbb7227dccDaichi Hirono    TestMtpManager(Context context) {
4309109567e9816d20f51b5ce0175751116836635fDaichi Hirono        super(context);
4409109567e9816d20f51b5ce0175751116836635fDaichi Hirono    }
4509109567e9816d20f51b5ce0175751116836635fDaichi Hirono
4609109567e9816d20f51b5ce0175751116836635fDaichi Hirono    void addValidDevice(int deviceId) {
4709109567e9816d20f51b5ce0175751116836635fDaichi Hirono        mValidDevices.add(deviceId);
4809109567e9816d20f51b5ce0175751116836635fDaichi Hirono    }
4909109567e9816d20f51b5ce0175751116836635fDaichi Hirono
5009109567e9816d20f51b5ce0175751116836635fDaichi Hirono    void setRoots(int deviceId, MtpRoot[] roots) {
5109109567e9816d20f51b5ce0175751116836635fDaichi Hirono        mRoots.put(deviceId, roots);
5209109567e9816d20f51b5ce0175751116836635fDaichi Hirono    }
5309109567e9816d20f51b5ce0175751116836635fDaichi Hirono
54e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono    void setDocument(int deviceId, int objectHandle, MtpDocument document) {
55e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono        mDocuments.put(pack(deviceId, objectHandle), document);
56e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono    }
57e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono
5852652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski    void setImportFileBytes(int deviceId, int objectHandle, byte[] bytes) {
5952652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski        mImportFileBytes.put(pack(deviceId, objectHandle), bytes);
608ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono    }
618ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono
625fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono    void setParent(int deviceId, int objectHandle, int parentObjectHandle) {
635fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono        mParents.put(pack(deviceId, objectHandle), parentObjectHandle);
645fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono    }
655fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono
6609109567e9816d20f51b5ce0175751116836635fDaichi Hirono    @Override
6709109567e9816d20f51b5ce0175751116836635fDaichi Hirono    void openDevice(int deviceId) throws IOException {
6809109567e9816d20f51b5ce0175751116836635fDaichi Hirono        if (!mValidDevices.contains(deviceId) || mOpenedDevices.contains(deviceId)) {
6909109567e9816d20f51b5ce0175751116836635fDaichi Hirono            throw new IOException();
7009109567e9816d20f51b5ce0175751116836635fDaichi Hirono        }
7109109567e9816d20f51b5ce0175751116836635fDaichi Hirono        mOpenedDevices.add(deviceId);
7209109567e9816d20f51b5ce0175751116836635fDaichi Hirono    }
7309109567e9816d20f51b5ce0175751116836635fDaichi Hirono
7409109567e9816d20f51b5ce0175751116836635fDaichi Hirono    @Override
7509109567e9816d20f51b5ce0175751116836635fDaichi Hirono    void closeDevice(int deviceId) throws IOException {
7609109567e9816d20f51b5ce0175751116836635fDaichi Hirono        if (!mValidDevices.contains(deviceId) || !mOpenedDevices.contains(deviceId)) {
7709109567e9816d20f51b5ce0175751116836635fDaichi Hirono            throw new IOException();
7809109567e9816d20f51b5ce0175751116836635fDaichi Hirono        }
7909109567e9816d20f51b5ce0175751116836635fDaichi Hirono        mOpenedDevices.remove(deviceId);
8009109567e9816d20f51b5ce0175751116836635fDaichi Hirono    }
8109109567e9816d20f51b5ce0175751116836635fDaichi Hirono
8209109567e9816d20f51b5ce0175751116836635fDaichi Hirono    @Override
8309109567e9816d20f51b5ce0175751116836635fDaichi Hirono    MtpRoot[] getRoots(int deviceId) throws IOException {
8409109567e9816d20f51b5ce0175751116836635fDaichi Hirono        if (mRoots.containsKey(deviceId)) {
8509109567e9816d20f51b5ce0175751116836635fDaichi Hirono            return mRoots.get(deviceId);
8609109567e9816d20f51b5ce0175751116836635fDaichi Hirono        } else {
8709109567e9816d20f51b5ce0175751116836635fDaichi Hirono            throw new IOException("getRoots error");
8809109567e9816d20f51b5ce0175751116836635fDaichi Hirono        }
8909109567e9816d20f51b5ce0175751116836635fDaichi Hirono    }
9009109567e9816d20f51b5ce0175751116836635fDaichi Hirono
9109109567e9816d20f51b5ce0175751116836635fDaichi Hirono    @Override
92e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono    MtpDocument getDocument(int deviceId, int objectHandle) {
93e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono        return mDocuments.get(pack(deviceId, objectHandle));
94e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono    }
95e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono
96e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono    @Override
9752652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski    void importFile(int deviceId, int storageId, ParcelFileDescriptor target) throws IOException {
9852652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski        final String key = pack(deviceId, storageId);
9952652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski        if (mImportFileBytes.containsKey(key)) {
10052652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski            try (final ParcelFileDescriptor.AutoCloseOutputStream outputStream =
10152652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski                    new ParcelFileDescriptor.AutoCloseOutputStream(target)) {
10252652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski                outputStream.write(mImportFileBytes.get(key));
10352652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski            }
1048ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono        } else {
10552652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski            throw new IOException("importFile error: " + key);
1068ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono        }
1078ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono    }
1088ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono
1098ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono    @Override
1105fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono    void deleteDocument(int deviceId, int objectHandle) throws IOException {
1115fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono        final String key = pack(deviceId, objectHandle);
1125fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono        if (mDocuments.containsKey(key)) {
1135fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono            mDocuments.remove(key);
1145fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono        } else {
1155fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono            throw new IOException();
1165fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono        }
1175fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono    }
1185fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono
1195fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono    @Override
1205fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono    synchronized int getParent(int deviceId, int objectHandle) throws IOException {
1215fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono        final String key = pack(deviceId, objectHandle);
1225fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono        if (mParents.containsKey(key)) {
1235fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono            return mParents.get(key);
1245fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono        } else {
1255fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono            throw new IOException();
1265fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono        }
1275fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono    }
1285fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono
1295fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono    @Override
13009109567e9816d20f51b5ce0175751116836635fDaichi Hirono    int[] getOpenedDeviceIds() {
13109109567e9816d20f51b5ce0175751116836635fDaichi Hirono        int i = 0;
13209109567e9816d20f51b5ce0175751116836635fDaichi Hirono        final int[] result = new int[mOpenedDevices.size()];
13309109567e9816d20f51b5ce0175751116836635fDaichi Hirono        for (int deviceId : mOpenedDevices) {
13409109567e9816d20f51b5ce0175751116836635fDaichi Hirono            result[i++] = deviceId;
13509109567e9816d20f51b5ce0175751116836635fDaichi Hirono        }
13609109567e9816d20f51b5ce0175751116836635fDaichi Hirono        return result;
13709109567e9816d20f51b5ce0175751116836635fDaichi Hirono    }
13809109567e9816d20f51b5ce0175751116836635fDaichi Hirono}
139