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 "×tamp=" + 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