/* * Software Name : ATK * * Copyright (C) 2007 - 2012 France Télécom * * 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. * * ------------------------------------------------------------------ * File Name : PrepareApkForRobotiumTest.java * * Created : 05/06/2013 * Author(s) : D'ALMEIDA Joana */ package com.orange.atk.phone.android; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import org.apache.log4j.Logger; import com.android.ddmlib.IDevice; import com.android.ddmlib.InstallException; import com.orange.atk.phone.PhoneException; import com.orange.atk.platform.Platform; import com.orange.atk.sign.apk.SignAPK; public class PrepareApkForRobotiumTest { public static void prepareAPKForRobotiumGetViews(IDevice adevice ,String packName, String activityName, String packsourceDir, String TestAPK,int versionCode) throws PhoneException { Logger.getLogger(PrepareApkForRobotiumTest.class).debug("/****prepare APK For Robotium test ***/ "); String adbLocation = Platform.getInstance().getDefaultADBLocation(); String AndroidToolsDir = Platform.getInstance().getJATKPath() + Platform.FILE_SEPARATOR + "AndroidTools"; String buildTestApkFile = Platform.getInstance().getBuildApk(); String removeSignBat = Platform.getInstance().getRemoveSignature(); String TestDir = AndroidToolsDir + Platform.FILE_SEPARATOR + "UiautomatorViewerTask"; String testApkSrcDir = AndroidToolsDir + Platform.FILE_SEPARATOR + TestAPK.substring(0, TestAPK.indexOf(".apk")); String TempTestApkDir = TestDir + Platform.FILE_SEPARATOR + TestAPK.substring(0, TestAPK.indexOf(".apk")); String TempInitFile=TempTestApkDir+Platform.FILE_SEPARATOR+"bin" +Platform.FILE_SEPARATOR+"com"+Platform.FILE_SEPARATOR+ "orange"+Platform.FILE_SEPARATOR+"atk"+Platform.FILE_SEPARATOR +"soloTest"+Platform.FILE_SEPARATOR+ "init.prop"; boolean packageExistInCache=cacheForRobotiumTest(packName,versionCode); Runtime r =Runtime.getRuntime(); BufferedReader errorStream=null; BufferedReader inputStream=null; if(!(new File(TestDir).exists())){ (new File(TestDir)).mkdir(); } if(!(new File(TestDir+Platform.FILE_SEPARATOR+"TempAPK").exists())){ (new File(TestDir+Platform.FILE_SEPARATOR+"TempAPK")).mkdir(); } String [] pullapk = {adbLocation,"-s",adevice.getSerialNumber(), "pull" ,packsourceDir,TestDir}; if(!packageExistInCache) { try { Process processPullApK = r.exec(pullapk); inputStream = new BufferedReader(new InputStreamReader( processPullApK.getInputStream())); errorStream = new BufferedReader(new InputStreamReader( processPullApK.getErrorStream())); String line =""; while ((line =errorStream.readLine()) != null){ } errorStream.close(); while ((line =inputStream.readLine()) != null){ } inputStream.close(); } catch (IOException e) { Logger.getLogger(PrepareApkForRobotiumTest.class ).debug( "/****error : " + e.getMessage()); throw new PhoneException(e.getMessage()); } } removeDirectory( new File(TestDir+Platform.FILE_SEPARATOR+"TempAPK" +Platform.FILE_SEPARATOR+TestAPK)); removeDirectory(new File(TempTestApkDir)); try { copyFolder(new File(testApkSrcDir),new File(TempTestApkDir)); } catch (IOException e) { Logger.getLogger(PrepareApkForRobotiumTest.class ).debug("/****error : " + e.getMessage()); throw new PhoneException(e.getMessage()); } createInitFile(TempInitFile,activityName,packName); String buildApk[] = {buildTestApkFile, TempTestApkDir,packName}; try { Process p = r.exec(buildApk, null, new File(AndroidToolsDir)); inputStream = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = ""; while ((line = inputStream.readLine()) != null) { Logger.getLogger(PrepareApkForRobotiumTest.class).debug( "building test apk : " + line); } inputStream.close(); } catch (IOException e1) { Logger.getLogger(PrepareApkForRobotiumTest.class).debug( "/****error : " + e1.getMessage()); throw new PhoneException(e1.getMessage()); } SignAPK.signApk( TempTestApkDir+ Platform.FILE_SEPARATOR+"bin"+Platform.FILE_SEPARATOR+"AtkTestRobotium.apk", TempTestApkDir + Platform.FILE_SEPARATOR + "bin" + Platform.FILE_SEPARATOR + "NonAlignAtkTestRobotium.apk"); SignAPK.zipAlignApk( TempTestApkDir + Platform.FILE_SEPARATOR + "bin" + Platform.FILE_SEPARATOR + "NonAlignAtkTestRobotium.apk", TestDir + Platform.FILE_SEPARATOR + "TempAPK" + Platform.FILE_SEPARATOR + TestAPK); if(!packageExistInCache) { String appapk = packsourceDir.substring(packsourceDir.lastIndexOf("/") + 1); String removeSign[] = { removeSignBat, TestDir + Platform.FILE_SEPARATOR + appapk}; try { Process p = r.exec(removeSign, null, new File(TestDir)); inputStream = new BufferedReader(new InputStreamReader(p.getInputStream())); errorStream = new BufferedReader(new InputStreamReader(p.getErrorStream())); String line = ""; while ((line = inputStream.readLine()) != null) { Logger.getLogger(PrepareApkForRobotiumTest.class).debug( "remove signature from Apk : " + line); } inputStream.close(); } catch (IOException e1) { Logger.getLogger(PrepareApkForRobotiumTest.class).debug( "/****error : " + e1.getMessage()); throw new PhoneException(e1.getMessage()); } SignAPK.signApk( TestDir + Platform.FILE_SEPARATOR + appapk, TempTestApkDir + Platform.FILE_SEPARATOR + "bin" + Platform.FILE_SEPARATOR + "NonAlign"+appapk); SignAPK.zipAlignApk( TempTestApkDir + Platform.FILE_SEPARATOR + "bin" + Platform.FILE_SEPARATOR + "NonAlign"+appapk, TestDir + Platform.FILE_SEPARATOR + "TempAPK" + Platform.FILE_SEPARATOR + appapk); pushPackage(adevice,packName,TestDir+Platform.FILE_SEPARATOR+"TempAPK"+Platform.FILE_SEPARATOR+appapk) ; File cacheDir = new File(TestDir+Platform.FILE_SEPARATOR+"Cache"+Platform.FILE_SEPARATOR+packName+"_"+versionCode ); if(!cacheDir.exists()){ cacheDir.mkdir(); } File f1= new File(TestDir+Platform.FILE_SEPARATOR+"TempAPK"+Platform.FILE_SEPARATOR+appapk); File f2= new File(cacheDir+Platform.FILE_SEPARATOR+appapk); if(f1.renameTo(f2)) { try { PrintWriter pw = new PrintWriter(new FileWriter(TestDir + Platform.FILE_SEPARATOR + "Cache" + Platform.FILE_SEPARATOR + "cache.txt", true)); pw.println(packName + "_" + versionCode); pw.close(); } catch (IOException e) { Logger.getLogger(PrepareApkForRobotiumTest.class).debug( "/****error : " + e.getMessage()); throw new PhoneException(e.getMessage()); } } else { } removeDirectory( new File(TestDir+Platform.FILE_SEPARATOR+appapk)); removeDirectory( new File(TestDir+Platform.FILE_SEPARATOR+"TempAPK"+Platform.FILE_SEPARATOR+appapk)); }else { String apkPath= TestDir+Platform.FILE_SEPARATOR+"Cache"+Platform.FILE_SEPARATOR+ packName+"_"+versionCode; String appapk = packsourceDir.substring(packsourceDir.lastIndexOf("/")+1); pushPackage(adevice,packName,apkPath+Platform.FILE_SEPARATOR+appapk) ; } removeDirectory( new File(TempTestApkDir)); } protected static void removeDirectory(File dir) { if(dir.exists()){ if (dir.isDirectory()) { File[] files = dir.listFiles(); if (files != null && files.length > 0) { for (File aFile : files) { removeDirectory(aFile); } } dir.delete(); } else { dir.delete(); } } } protected static boolean createInitFile(String filename,String activityName, String packageName) throws PhoneException{ File initFile=new File(filename); initFile.delete(); if (!initFile.exists()) { try { initFile.createNewFile(); } catch (IOException e) { } } try { PrintWriter pw = new PrintWriter(new FileWriter(filename,true)); pw.println(activityName); pw.flush(); pw.println(packageName); pw.close(); } catch(IOException e){ Logger.getLogger(PrepareApkForRobotiumTest.class ).debug("/****error : " + e.getMessage()); throw new PhoneException(e.getMessage()); } return false; } protected static boolean cacheForRobotiumTest(String packgName, int versionCode) throws PhoneException{ String cachePath=Platform.getInstance().getJATKPath()+Platform.FILE_SEPARATOR+"AndroidTools"+Platform.FILE_SEPARATOR+"UiautomatorViewerTask"; File cacheDir = new File(cachePath+Platform.FILE_SEPARATOR+"Cache" ); if(!cacheDir.exists()) { cacheDir.mkdir(); } File cacheFile=new File(cachePath+Platform.FILE_SEPARATOR+"Cache"+Platform.FILE_SEPARATOR+"cache.txt"); if (!cacheFile.exists()) { try { cacheFile.createNewFile(); } catch (IOException e) { } } try { FileInputStream fstream = new FileInputStream(cacheFile); DataInputStream in = new DataInputStream(fstream); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String strLine; while ((strLine = br.readLine()) != null){ if(strLine.contains(packgName+"_"+versionCode)) { br.close(); return true; } } br.close(); }catch (FileNotFoundException e) { Logger.getLogger(PrepareApkForRobotiumTest.class ).debug("/****error : " + e.getMessage()); throw new PhoneException(e.getMessage()); } catch (IOException e){ Logger.getLogger(PrepareApkForRobotiumTest.class ).debug("/****error : " + e.getMessage()); throw new PhoneException(e.getMessage()); } return false; } public static void copyFolder(File src, File dest) throws IOException { if(src.isDirectory()){ if(!dest.exists()){ dest.mkdir(); } String files[] = src.list(); for (String file : files) { File srcFile = new File(src, file); File destFile = new File(dest, file); copyFolder(srcFile,destFile); } }else{ InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest); byte[] buffer = new byte[1024]; int length; while ((length = in.read(buffer)) > 0){ out.write(buffer, 0, length); } in.close(); out.close(); } } private static void pushPackage(IDevice adevice,String PackageName, String apkDir) throws PhoneException { Logger.getLogger(PrepareApkForRobotiumTest.class ).debug("reinstalling pack "+PackageName); try { String result=null; if(new File(apkDir).exists()) { result = adevice.uninstallPackage(PackageName); } else { throw new PhoneException("error while reinstalling apk under test"); } if(result!=null){ Logger.getLogger(PrepareApkForRobotiumTest.class ).debug("/****resul of uninstall : " + result); } result = adevice.installPackage(apkDir, true); if(result!=null){ Logger.getLogger(PrepareApkForRobotiumTest.class ).debug("/****resul of install : " + result); } }catch (InstallException e) { Logger.getLogger(PrepareApkForRobotiumTest.class ).debug("/****error : " + e.getMessage()); throw new PhoneException(e.getMessage()); } } }