133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang/*
233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Copyright (C) 2011, The Android Open Source Project
333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang *
433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Licensed under the Apache License, Version 2.0 (the "License");
533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * you may not use this file except in compliance with the License.
633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * You may obtain a copy of the License at
733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang *
833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang *      http://www.apache.org/licenses/LICENSE-2.0
933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang *
1033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Unless required by applicable law or agreed to in writing, software
1133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * distributed under the License is distributed on an "AS IS" BASIS,
1233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * See the License for the specific language governing permissions and
1433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * limitations under the License.
1533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang */
1633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
1733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangpackage com.android.bandwidthtest.util;
1833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
1933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.util.Log;
2033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
21e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuangimport com.android.internal.http.multipart.FilePart;
22e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuangimport com.android.internal.http.multipart.MultipartEntity;
23e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuangimport com.android.internal.http.multipart.Part;
24e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuangimport com.android.internal.http.multipart.StringPart;
25e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang
26e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuangimport org.apache.http.HttpResponse;
27e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuangimport org.apache.http.client.HttpClient;
28e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuangimport org.apache.http.client.methods.HttpPost;
29e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuangimport org.apache.http.impl.client.DefaultHttpClient;
3033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport org.apache.http.util.ByteArrayBuffer;
3133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
3233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport java.io.BufferedInputStream;
3333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport java.io.BufferedReader;
3433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport java.io.DataInputStream;
3533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport java.io.File;
3633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport java.io.FileInputStream;
3733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport java.io.FileOutputStream;
3833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport java.io.IOException;
3933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport java.io.InputStream;
4033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport java.io.InputStreamReader;
4133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport java.net.URL;
4233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport java.net.URLConnection;
4333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
4433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangpublic class BandwidthTestUtil {
4533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    private static final String LOG_TAG = "BandwidthTestUtil";
4633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    /**
4733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * Parses the first line in a file if exists.
4833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     *
4933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @param file {@link File} the input
5033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @return the integer value of the first line of the file.
5133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     */
5233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    public static int parseIntValueFromFile(File file) {
5333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        int value = 0;
5433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        if (file.exists()) {
5533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            try {
5633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                FileInputStream fstream = new FileInputStream(file);
5733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                DataInputStream in = new DataInputStream(fstream);
5833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                BufferedReader br = new BufferedReader(new InputStreamReader(in));
5933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                String strLine = br.readLine();
6033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                if (strLine != null) {
6133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                    value = Integer.parseInt(strLine);
6233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                }
6333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                // Close the input stream
6433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                in.close();
6533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            } catch (Exception e) {
6633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                System.err.println("Error: " + e.getMessage());
6733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            }
6833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        }
6933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        return value;
7033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    }
7133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
7233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    /**
7333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * Creates the Download string for the test server.
7433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     *
7533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @param server url of the test server
7633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @param size in bytes of the file to download
7733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @param deviceId the device id that is downloading
7833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @param timestamp
7933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @return download url
8033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     */
8133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    public static String buildDownloadUrl(String server, int size, String deviceId,
8233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            String timestamp) {
8333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        String downloadUrl = server + "/download?size=" + size + "&device_id=" + deviceId +
8433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                "&timestamp=" + timestamp;
8533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        return downloadUrl;
8633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    }
8733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
8833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    /**
8933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * Download a given file from a target url to a given destination file.
9033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @param targetUrl the url to download
9133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     * @param file the {@link File} location where to save to
92e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang     * @return true if it succeeded
9333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang     */
9433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    public static boolean DownloadFromUrl(String targetUrl, File file) {
9533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        try {
9633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            URL url = new URL(targetUrl);
9733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            Log.d(LOG_TAG, "Download begining");
9833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            Log.d(LOG_TAG, "Download url:" + url);
9933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            Log.d(LOG_TAG, "Downloaded file name:" + file.getAbsolutePath());
10033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            URLConnection ucon = url.openConnection();
10133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            InputStream is = ucon.getInputStream();
10233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            BufferedInputStream bis = new BufferedInputStream(is);
10333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            ByteArrayBuffer baf = new ByteArrayBuffer(50);
10433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            int current = 0;
10533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            while ((current = bis.read()) != -1) {
10633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang                baf.append((byte) current);
10733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            }
10833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            FileOutputStream fos = new FileOutputStream(file);
10933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            fos.write(baf.toByteArray());
11033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            fos.close();
11133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        } catch (IOException e) {
11233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            Log.d(LOG_TAG, "Failed to download file with error: " + e);
11333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang            return false;
11433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        }
11533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang        return true;
11633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang    }
11733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang
118e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang    /**
119e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang     * Post a given file for a given device and timestamp to the server.
1205c488ef99726f3e09167f06fa466cf7836f87e18Tsu Chiang Chuang     * @param server {@link String} url of test server
121e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang     * @param deviceId {@link String} device id that is uploading
122e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang     * @param timestamp {@link String} timestamp
123e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang     * @param file {@link File} to upload
124e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang     * @return true if it succeeded
125e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang     */
1265c488ef99726f3e09167f06fa466cf7836f87e18Tsu Chiang Chuang    public static boolean postFileToServer(String server, String deviceId, String timestamp,
127e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang            File file) {
128e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang        try {
1295c488ef99726f3e09167f06fa466cf7836f87e18Tsu Chiang Chuang            Log.d(LOG_TAG, "Uploading begining");
130e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang            HttpClient httpClient = new DefaultHttpClient();
1315c488ef99726f3e09167f06fa466cf7836f87e18Tsu Chiang Chuang            String uri = server;
1325c488ef99726f3e09167f06fa466cf7836f87e18Tsu Chiang Chuang            if (!uri.endsWith("/")) {
1335c488ef99726f3e09167f06fa466cf7836f87e18Tsu Chiang Chuang                uri += "/";
1345c488ef99726f3e09167f06fa466cf7836f87e18Tsu Chiang Chuang            }
1355c488ef99726f3e09167f06fa466cf7836f87e18Tsu Chiang Chuang            uri += "upload";
1365c488ef99726f3e09167f06fa466cf7836f87e18Tsu Chiang Chuang            Log.d(LOG_TAG, "Upload url:" + uri);
1375c488ef99726f3e09167f06fa466cf7836f87e18Tsu Chiang Chuang            HttpPost postRequest = new HttpPost(uri);
138e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang            Part[] parts = {
139e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang                    new StringPart("device_id", deviceId),
140e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang                    new StringPart("timestamp", timestamp),
141e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang                    new FilePart("file", file)
142e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang            };
143e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang            MultipartEntity reqEntity = new MultipartEntity(parts, postRequest.getParams());
144e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang            postRequest.setEntity(reqEntity);
145e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang            HttpResponse res = httpClient.execute(postRequest);
146e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang            res.getEntity().getContent().close();
147e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang        } catch (IOException e) {
148e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang            Log.e(LOG_TAG, "Could not upload file with error: " + e);
149e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang            return false;
150e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang        }
151e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang        return true;
152e888685bf6f443b7d69601796a7896240a7fc4eeTsu Chiang Chuang    }
15333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang}
154