mirror of
				https://github.com/ARM-software/workload-automation.git
				synced 2025-11-04 09:02:12 +00:00 
			
		
		
		
	GooglePlayPhotos: Ported workload from WA
This commit is contained in:
		
							
								
								
									
										100
									
								
								wa/workloads/googlephotos/__init__.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										100
									
								
								wa/workloads/googlephotos/__init__.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,100 @@
 | 
			
		||||
#    Copyright 2014-2016 ARM Limited
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
 | 
			
		||||
from wa import ApkUiautoWorkload, Parameter
 | 
			
		||||
from wa.framework.exception import ValidationError
 | 
			
		||||
from wa.utils.types import list_of_strs
 | 
			
		||||
from wa.utils.misc import unique
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Googlephotos(ApkUiautoWorkload):
 | 
			
		||||
 | 
			
		||||
    name = 'googlephotos'
 | 
			
		||||
    package_names = ['com.google.android.apps.photos']
 | 
			
		||||
    description = '''
 | 
			
		||||
    A workload to perform standard productivity tasks with Google Photos. The workload carries out
 | 
			
		||||
    various tasks, such as browsing images, performing zooms, and post-processing the image.
 | 
			
		||||
 | 
			
		||||
    Test description:
 | 
			
		||||
 | 
			
		||||
    1. Four images are copied to the target
 | 
			
		||||
    2. The application is started in offline access mode
 | 
			
		||||
    3. Gestures are performed to pinch zoom in and out of the selected image
 | 
			
		||||
    4. The colour of a selected image is edited by selecting the colour menu, incrementing the
 | 
			
		||||
       colour, resetting the colour and decrementing the colour using the seek bar.
 | 
			
		||||
    5. A crop test is performed on a selected image.  UiAutomator does not allow the selection of
 | 
			
		||||
       the crop markers so the image is tilted positively, reset and then tilted negatively to get a
 | 
			
		||||
       similar cropping effect.
 | 
			
		||||
    6. A rotate test is performed on a selected image, rotating anticlockwise 90 degrees, 180
 | 
			
		||||
       degrees and 270 degrees.
 | 
			
		||||
 | 
			
		||||
    Known working APK version: 1.21.0.123444480
 | 
			
		||||
    '''
 | 
			
		||||
 | 
			
		||||
    default_test_images = [
 | 
			
		||||
        'uxperf_1200x1600.png', 'uxperf_1600x1200.jpg',
 | 
			
		||||
        'uxperf_2448x3264.png', 'uxperf_3264x2448.jpg',
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    parameters = [
 | 
			
		||||
        Parameter('test_images', kind=list_of_strs, default=default_test_images,
 | 
			
		||||
                  constraint=lambda x: len(unique(x)) == 4,
 | 
			
		||||
                  description='''
 | 
			
		||||
                  A list of four JPEG and/or PNG files to be pushed to the target.
 | 
			
		||||
                  Absolute file paths may be used but tilde expansion must be escaped.
 | 
			
		||||
                  '''),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    def __init__(self, target, **kwargs):
 | 
			
		||||
        super(Googlephotos, self).__init__(target, **kwargs)
 | 
			
		||||
        self.deployable_assets = self.test_images
 | 
			
		||||
 | 
			
		||||
    def init_resources(self, context):
 | 
			
		||||
        super(Googlephotos, self).init_resources(context)
 | 
			
		||||
        # Only accept certain image formats
 | 
			
		||||
        for image in self.test_images:
 | 
			
		||||
            if os.path.splitext(image.lower())[1] not in ['.jpg', '.jpeg', '.png']:
 | 
			
		||||
                raise ValidationError('{} must be a JPEG or PNG file'.format(image))
 | 
			
		||||
 | 
			
		||||
    def deploy_assets(self, context, directory=None):
 | 
			
		||||
        super(Googlephotos, self).deploy_assets(context)
 | 
			
		||||
        # Create a subfolder for each test_image named ``wa-[1-4]``
 | 
			
		||||
        # Move each image into its subfolder
 | 
			
		||||
        # This is to guarantee ordering and allows the workload to select a specific
 | 
			
		||||
        # image by subfolder, as filenames are not shown easily within the app
 | 
			
		||||
        d = self.target.working_directory
 | 
			
		||||
        e = self.target.external_storage
 | 
			
		||||
 | 
			
		||||
        file_list = []
 | 
			
		||||
 | 
			
		||||
        for i, f in enumerate(self.test_images):
 | 
			
		||||
            orig_file_path = self.target.path.join(d, f)
 | 
			
		||||
            new_dir = self.target.path.join(e, 'wa', 'wa-{}'.format(i+1))
 | 
			
		||||
            new_file_path = self.target.path.join(new_dir, f)
 | 
			
		||||
 | 
			
		||||
            self.target.execute('mkdir -p {}'.format(new_dir))
 | 
			
		||||
            self.target.execute('cp {} {}'.format(orig_file_path, new_file_path))
 | 
			
		||||
            self.target.execute('rm {}'.format(orig_file_path))
 | 
			
		||||
            file_list.append(new_file_path)
 | 
			
		||||
        self.deployed_assets = file_list
 | 
			
		||||
        # Force rescan
 | 
			
		||||
        self.target.refresh_files(self.deployed_assets)
 | 
			
		||||
 | 
			
		||||
    def remove_assets(self, context):
 | 
			
		||||
        for asset in self.deployed_assets:
 | 
			
		||||
            self.target.remove(os.path.dirname(asset))
 | 
			
		||||
        self.target.refresh_files(self.deployed_assets)
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								wa/workloads/googlephotos/com.arm.wa.uiauto.googlephotos.apk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								wa/workloads/googlephotos/com.arm.wa.uiauto.googlephotos.apk
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										41
									
								
								wa/workloads/googlephotos/uiauto/app/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								wa/workloads/googlephotos/uiauto/app/build.gradle
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
apply plugin: 'com.android.application'
 | 
			
		||||
 | 
			
		||||
def packageName = "com.arm.wa.uiauto.googlephotos"
 | 
			
		||||
 | 
			
		||||
android {
 | 
			
		||||
    compileSdkVersion 25
 | 
			
		||||
    buildToolsVersion "25.0.3"
 | 
			
		||||
    defaultConfig {
 | 
			
		||||
        applicationId "${packageName}"
 | 
			
		||||
        minSdkVersion 18
 | 
			
		||||
        targetSdkVersion 25
 | 
			
		||||
        versionCode 1
 | 
			
		||||
        versionName "1.0"
 | 
			
		||||
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
 | 
			
		||||
    }
 | 
			
		||||
    buildTypes {
 | 
			
		||||
        release {
 | 
			
		||||
            minifyEnabled false
 | 
			
		||||
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
 | 
			
		||||
        }
 | 
			
		||||
        applicationVariants.all { variant ->
 | 
			
		||||
            variant.outputs.each { output ->
 | 
			
		||||
                output.outputFile = file("$project.buildDir/apk/${packageName}.apk")
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
    compile fileTree(dir: 'libs', include: ['*.jar'])
 | 
			
		||||
    compile 'com.android.support.test:runner:0.5'
 | 
			
		||||
    compile 'com.android.support.test:rules:0.5'
 | 
			
		||||
    compile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
 | 
			
		||||
    compile(name: 'uiauto', ext:'aar')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
repositories {
 | 
			
		||||
    flatDir {
 | 
			
		||||
        dirs 'libs'
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,13 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    package="com.arm.wa.uiauto.googlephotos"
 | 
			
		||||
    android:versionCode="1"
 | 
			
		||||
    android:versionName="1.0">
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <instrumentation
 | 
			
		||||
        android:name="android.support.test.runner.AndroidJUnitRunner"
 | 
			
		||||
        android:targetPackage="${applicationId}"/>
 | 
			
		||||
 | 
			
		||||
</manifest>
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,432 @@
 | 
			
		||||
/*    Copyright 2014-2016 ARM Limited
 | 
			
		||||
 *
 | 
			
		||||
 * 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.arm.wa.uiauto.googlephotos;
 | 
			
		||||
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.graphics.Rect;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.support.test.runner.AndroidJUnit4;
 | 
			
		||||
import android.support.test.uiautomator.UiObject;
 | 
			
		||||
import android.support.test.uiautomator.UiObjectNotFoundException;
 | 
			
		||||
import android.support.test.uiautomator.UiSelector;
 | 
			
		||||
 | 
			
		||||
import com.arm.wa.uiauto.UxPerfUiAutomation.GestureTestParams;
 | 
			
		||||
import com.arm.wa.uiauto.UxPerfUiAutomation.GestureType;
 | 
			
		||||
import com.arm.wa.uiauto.BaseUiAutomation;
 | 
			
		||||
import com.arm.wa.uiauto.ActionLogger;
 | 
			
		||||
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
 | 
			
		||||
import java.util.Iterator;
 | 
			
		||||
import java.util.LinkedHashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Map.Entry;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
import static com.arm.wa.uiauto.BaseUiAutomation.FindByCriteria.BY_DESC;
 | 
			
		||||
import static com.arm.wa.uiauto.BaseUiAutomation.FindByCriteria.BY_ID;
 | 
			
		||||
import static com.arm.wa.uiauto.BaseUiAutomation.FindByCriteria.BY_TEXT;
 | 
			
		||||
 | 
			
		||||
@RunWith(AndroidJUnit4.class)
 | 
			
		||||
public class UiAutomation extends BaseUiAutomation {
 | 
			
		||||
 | 
			
		||||
    private long viewTimeout = TimeUnit.SECONDS.toMillis(10);
 | 
			
		||||
 | 
			
		||||
    protected Bundle parameters;
 | 
			
		||||
    protected String packageID;
 | 
			
		||||
 | 
			
		||||
    @Before
 | 
			
		||||
    public void initialize(){
 | 
			
		||||
        parameters = getParams();
 | 
			
		||||
        packageID = getPackageID(parameters);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void setup() throws Exception{
 | 
			
		||||
        sleep(5); // Pause while splash screen loads
 | 
			
		||||
        setScreenOrientation(ScreenOrientation.NATURAL);
 | 
			
		||||
 | 
			
		||||
        // Clear the initial run dialogues of the application launch.
 | 
			
		||||
        dismissWelcomeView();
 | 
			
		||||
        closePromotionPopUp();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void runWorkload() throws Exception {
 | 
			
		||||
        selectGalleryFolder("wa-1");
 | 
			
		||||
        selectFirstImage();
 | 
			
		||||
        gesturesTest();
 | 
			
		||||
        navigateUp();
 | 
			
		||||
 | 
			
		||||
        selectGalleryFolder("wa-2");
 | 
			
		||||
        selectFirstImage();
 | 
			
		||||
        editPhotoColorTest();
 | 
			
		||||
        closeAndReturn(true);
 | 
			
		||||
        navigateUp();
 | 
			
		||||
 | 
			
		||||
        selectGalleryFolder("wa-3");
 | 
			
		||||
        selectFirstImage();
 | 
			
		||||
        cropPhotoTest();
 | 
			
		||||
        closeAndReturn(true);
 | 
			
		||||
        navigateUp();
 | 
			
		||||
 | 
			
		||||
        selectGalleryFolder("wa-4");
 | 
			
		||||
        selectFirstImage();
 | 
			
		||||
        rotatePhotoTest();
 | 
			
		||||
        closeAndReturn(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void teardown() throws Exception {
 | 
			
		||||
        unsetScreenOrientation();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void dismissWelcomeView() throws Exception {
 | 
			
		||||
        // Click through the first two pages and make sure that we don't sign
 | 
			
		||||
        // in to our google account. This ensures the same set of photographs
 | 
			
		||||
        // are placed in the camera directory for each run.
 | 
			
		||||
        UiObject getStartedButton =
 | 
			
		||||
            mDevice.findObject(new UiSelector().textContains("Get started")
 | 
			
		||||
                                               .className("android.widget.Button"));
 | 
			
		||||
        if (getStartedButton.waitForExists(viewTimeout)) {
 | 
			
		||||
            getStartedButton.click();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // A network connection is not required for this workload. However,
 | 
			
		||||
        // when the Google Photos app is invoked from the multiapp workload a
 | 
			
		||||
        // connection is required for sharing content. Handle the different UI
 | 
			
		||||
        // pathways when dismissing welcome views here.
 | 
			
		||||
        UiObject doNotSignInButton =
 | 
			
		||||
            mDevice.findObject(new UiSelector().resourceId(packageID + "dont_sign_in_button"));
 | 
			
		||||
 | 
			
		||||
        UiObject accountName =
 | 
			
		||||
            mDevice.findObject(new UiSelector().resourceId(packageID + "name")
 | 
			
		||||
                                               .className("android.widget.TextView"));
 | 
			
		||||
        if (doNotSignInButton.exists()) {
 | 
			
		||||
            doNotSignInButton.click();
 | 
			
		||||
        }
 | 
			
		||||
        else if (accountName.exists()) {
 | 
			
		||||
            accountName.click();
 | 
			
		||||
            clickUiObject(BY_TEXT, "Use without an account", "android.widget.TextView", true);
 | 
			
		||||
        }
 | 
			
		||||
        //Some devices get popup asking for confirmation to not use backup.
 | 
			
		||||
        UiObject keepBackupOff =
 | 
			
		||||
        mDevice.findObject(new UiSelector().textContains("Keep Off")
 | 
			
		||||
                                           .className("android.widget.Button"));
 | 
			
		||||
        if (keepBackupOff.exists()){
 | 
			
		||||
            keepBackupOff.click();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        UiObject nextButton =
 | 
			
		||||
            mDevice.findObject(new UiSelector().resourceId(packageID + "next_button")
 | 
			
		||||
                                               .className("android.widget.ImageView"));
 | 
			
		||||
        if (nextButton.exists()) {
 | 
			
		||||
            nextButton.clickAndWaitForNewWindow();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void closePromotionPopUp() throws Exception {
 | 
			
		||||
        UiObject promoCloseButton =
 | 
			
		||||
            mDevice.findObject(new UiSelector().resourceId(packageID + "promo_close_button"));
 | 
			
		||||
        if (promoCloseButton.exists()) {
 | 
			
		||||
            promoCloseButton.click();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Helper to click on the first image
 | 
			
		||||
    public void selectFirstImage() throws Exception {
 | 
			
		||||
        UiObject photo =
 | 
			
		||||
            mDevice.findObject(new UiSelector().resourceId(packageID + "recycler_view")
 | 
			
		||||
                                               .childSelector(new UiSelector()
 | 
			
		||||
                                               .index(1)));
 | 
			
		||||
        if (photo.exists()) {
 | 
			
		||||
            photo.click();
 | 
			
		||||
        } else {
 | 
			
		||||
            // On some versions of the app a non-zero index is used for the
 | 
			
		||||
            // photographs position while on other versions a zero index is used.
 | 
			
		||||
            // Try both possiblities before throwing an exception.
 | 
			
		||||
            photo =
 | 
			
		||||
                mDevice.findObject(new UiSelector().resourceId(packageID + "recycler_view")
 | 
			
		||||
                                                   .childSelector(new UiSelector()
 | 
			
		||||
                                                   .index(0)));
 | 
			
		||||
            photo.click();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Helper that accepts, closes and navigates back to application home screen after an edit operation.
 | 
			
		||||
    // dontsave - True will discard the image. False will save the image
 | 
			
		||||
    public void closeAndReturn(final boolean dontsave) throws Exception {
 | 
			
		||||
        long timeout =  TimeUnit.SECONDS.toMillis(3);
 | 
			
		||||
 | 
			
		||||
        UiObject accept =
 | 
			
		||||
            mDevice.findObject(new UiSelector().description("Accept"));
 | 
			
		||||
        UiObject done =
 | 
			
		||||
            mDevice.findObject(new UiSelector().resourceId(packageID + "cpe_save_button")
 | 
			
		||||
                                               .textContains("Done"));
 | 
			
		||||
 | 
			
		||||
        // On some edit operations we can either confirm an edit with "Accept", "DONE" or neither.
 | 
			
		||||
        if (accept.waitForExists(timeout)) {
 | 
			
		||||
            accept.click();
 | 
			
		||||
        } else if (done.waitForExists(timeout)) {
 | 
			
		||||
            done.click();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (dontsave) {
 | 
			
		||||
            clickUiObject(BY_DESC, "Close editor", "android.widget.ImageView");
 | 
			
		||||
 | 
			
		||||
            UiObject discard = getUiObjectByText("DISCARD", "android.widget.Button");
 | 
			
		||||
            discard.waitForExists(viewTimeout);
 | 
			
		||||
            discard.click();
 | 
			
		||||
        } else {
 | 
			
		||||
            UiObject save = getUiObjectByText("SAVE", "android.widget.TextView");
 | 
			
		||||
            save.waitForExists(viewTimeout);
 | 
			
		||||
            save.click();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void navigateUp() throws Exception {
 | 
			
		||||
        // Navigate up to go to folder
 | 
			
		||||
        UiObject navigateUpButton =
 | 
			
		||||
            clickUiObject(BY_DESC, "Navigate Up", "android.widget.ImageButton", true);
 | 
			
		||||
        // Navigate up again to go to gallery - if it exists
 | 
			
		||||
        if (navigateUpButton.exists()) {
 | 
			
		||||
            navigateUpButton.clickAndWaitForNewWindow();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void gesturesTest() throws Exception {
 | 
			
		||||
        String testTag = "gesture";
 | 
			
		||||
 | 
			
		||||
        // Perform a range of swipe tests while browsing photo gallery
 | 
			
		||||
        LinkedHashMap<String, GestureTestParams> testParams = new LinkedHashMap<String, GestureTestParams>();
 | 
			
		||||
        testParams.put("pinch_out", new GestureTestParams(GestureType.PINCH, PinchType.OUT, 100, 50));
 | 
			
		||||
        testParams.put("pinch_in", new GestureTestParams(GestureType.PINCH, PinchType.IN, 100, 50));
 | 
			
		||||
 | 
			
		||||
        Iterator<Entry<String, GestureTestParams>> it = testParams.entrySet().iterator();
 | 
			
		||||
 | 
			
		||||
        while (it.hasNext()) {
 | 
			
		||||
            Map.Entry<String, GestureTestParams> pair = it.next();
 | 
			
		||||
            GestureType type = pair.getValue().gestureType;
 | 
			
		||||
            PinchType pinch = pair.getValue().pinchType;
 | 
			
		||||
            int steps = pair.getValue().steps;
 | 
			
		||||
            int percent = pair.getValue().percent;
 | 
			
		||||
 | 
			
		||||
            UiObject view =
 | 
			
		||||
                mDevice.findObject(new UiSelector().enabled(true));
 | 
			
		||||
            if (!view.waitForExists(viewTimeout)) {
 | 
			
		||||
                throw new UiObjectNotFoundException("Could not find \"photo view\".");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            String runName = String.format(testTag + "_" + pair.getKey());
 | 
			
		||||
            ActionLogger logger = new ActionLogger(runName, parameters);
 | 
			
		||||
            logger.start();
 | 
			
		||||
 | 
			
		||||
            switch (type) {
 | 
			
		||||
                case PINCH:
 | 
			
		||||
                    uiObjectVertPinch(view, pinch, steps, percent);
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            logger.stop();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public enum Position { LEFT, RIGHT, CENTRE };
 | 
			
		||||
 | 
			
		||||
    private class PositionPair {
 | 
			
		||||
        private Position start;
 | 
			
		||||
        private Position end;
 | 
			
		||||
 | 
			
		||||
        PositionPair(final Position start, final Position end) {
 | 
			
		||||
            this.start = start;
 | 
			
		||||
            this.end = end;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void editPhotoColorTest() throws Exception {
 | 
			
		||||
        long timeout =  TimeUnit.SECONDS.toMillis(3);
 | 
			
		||||
        // To improve travel accuracy perform the slide bar operation slowly
 | 
			
		||||
        final int steps = 100;
 | 
			
		||||
 | 
			
		||||
        String testTag = "edit";
 | 
			
		||||
 | 
			
		||||
        // Perform a range of swipe tests while browsing photo gallery
 | 
			
		||||
        LinkedHashMap<String, PositionPair> testParams = new LinkedHashMap<String, PositionPair>();
 | 
			
		||||
        testParams.put("color_increment", new PositionPair(Position.CENTRE, Position.RIGHT));
 | 
			
		||||
        testParams.put("color_reset", new PositionPair(Position.RIGHT, Position.CENTRE));
 | 
			
		||||
        testParams.put("color_decrement", new PositionPair(Position.CENTRE, Position.LEFT));
 | 
			
		||||
 | 
			
		||||
        Iterator<Entry<String, PositionPair>> it = testParams.entrySet().iterator();
 | 
			
		||||
 | 
			
		||||
        clickUiObject(BY_ID, packageID + "edit", "android.widget.ImageView");
 | 
			
		||||
 | 
			
		||||
        // Manage potential different spelling of UI element
 | 
			
		||||
        UiObject editCol =
 | 
			
		||||
            mDevice.findObject(new UiSelector().textMatches("Colou?r"));
 | 
			
		||||
        if (editCol.waitForExists(timeout)) {
 | 
			
		||||
            editCol.click();
 | 
			
		||||
        } else {
 | 
			
		||||
            UiObject adjustTool =
 | 
			
		||||
                mDevice.findObject(new UiSelector().resourceId(packageID + "cpe_adjustments_tool")
 | 
			
		||||
                                                   .className("android.widget.ImageView"));
 | 
			
		||||
            if (adjustTool.waitForExists(timeout)){
 | 
			
		||||
                adjustTool.click();
 | 
			
		||||
            } else {
 | 
			
		||||
                throw new UiObjectNotFoundException(String.format("Could not find Color/Colour adjustment"));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        UiObject seekBar =
 | 
			
		||||
            mDevice.findObject(new UiSelector().resourceId(packageID + "cpe_strength_seek_bar")
 | 
			
		||||
                                               .className("android.widget.SeekBar"));
 | 
			
		||||
        if (!(seekBar.exists())){
 | 
			
		||||
            seekBar =
 | 
			
		||||
            mDevice.findObject(new UiSelector().resourceIdMatches(".*/cpe_adjustments_section_slider")
 | 
			
		||||
                                               .className("android.widget.SeekBar").descriptionMatches("Colou?r"));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        while (it.hasNext()) {
 | 
			
		||||
            Map.Entry<String, PositionPair> pair = it.next();
 | 
			
		||||
            Position start = pair.getValue().start;
 | 
			
		||||
            Position end = pair.getValue().end;
 | 
			
		||||
 | 
			
		||||
            String runName = String.format(testTag + "_" + pair.getKey());
 | 
			
		||||
            ActionLogger logger = new ActionLogger(runName, parameters);
 | 
			
		||||
 | 
			
		||||
            logger.start();
 | 
			
		||||
            seekBarTest(seekBar, start, end, steps);
 | 
			
		||||
            logger.stop();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void cropPhotoTest() throws Exception {
 | 
			
		||||
        String testTag = "crop";
 | 
			
		||||
 | 
			
		||||
        // To improve travel accuracy perform the slide bar operation slowly
 | 
			
		||||
        final int steps = 100;
 | 
			
		||||
 | 
			
		||||
        // Perform a range of swipe tests while browsing photo gallery
 | 
			
		||||
        LinkedHashMap<String, Position> testParams = new LinkedHashMap<String, Position>();
 | 
			
		||||
        testParams.put("tilt_positive", Position.LEFT);
 | 
			
		||||
        testParams.put("tilt_reset", Position.RIGHT);
 | 
			
		||||
        testParams.put("tilt_negative", Position.RIGHT);
 | 
			
		||||
 | 
			
		||||
        Iterator<Entry<String, Position>> it = testParams.entrySet().iterator();
 | 
			
		||||
 | 
			
		||||
        clickUiObject(BY_ID, packageID + "edit", "android.widget.ImageView");
 | 
			
		||||
        clickUiObject(BY_ID, packageID + "cpe_crop_tool", "android.widget.ImageView");
 | 
			
		||||
 | 
			
		||||
        UiObject straightenSlider =
 | 
			
		||||
            getUiObjectByResourceId(packageID + "cpe_straighten_slider");
 | 
			
		||||
 | 
			
		||||
        while (it.hasNext()) {
 | 
			
		||||
            Map.Entry<String, Position> pair = it.next();
 | 
			
		||||
            Position pos = pair.getValue();
 | 
			
		||||
 | 
			
		||||
            String runName = String.format(testTag + "_" + pair.getKey());
 | 
			
		||||
            ActionLogger logger = new ActionLogger(runName, parameters);
 | 
			
		||||
 | 
			
		||||
            logger.start();
 | 
			
		||||
            slideBarTest(straightenSlider, pos, steps);
 | 
			
		||||
            logger.stop();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void rotatePhotoTest() throws Exception {
 | 
			
		||||
        String testTag = "rotate";
 | 
			
		||||
 | 
			
		||||
        String[] subTests = {"90", "180", "270"};
 | 
			
		||||
 | 
			
		||||
        clickUiObject(BY_ID, packageID + "edit", "android.widget.ImageView");
 | 
			
		||||
        clickUiObject(BY_ID, packageID + "cpe_crop_tool", "android.widget.ImageView");
 | 
			
		||||
 | 
			
		||||
        UiObject rotate =
 | 
			
		||||
            getUiObjectByResourceId(packageID + "cpe_rotate_90");
 | 
			
		||||
 | 
			
		||||
        for (String subTest : subTests) {
 | 
			
		||||
            String runName = String.format(testTag + "_" + subTest);
 | 
			
		||||
            ActionLogger logger = new ActionLogger(runName, parameters);
 | 
			
		||||
 | 
			
		||||
            logger.start();
 | 
			
		||||
            rotate.click();
 | 
			
		||||
            logger.stop();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Helper to slide the seekbar during photo edit.
 | 
			
		||||
    private void seekBarTest(final UiObject view, final Position start, final Position end, final int steps) throws Exception {
 | 
			
		||||
        final int SWIPE_MARGIN_LIMIT = 5;
 | 
			
		||||
        Rect rect = view.getVisibleBounds();
 | 
			
		||||
        int startX, endX;
 | 
			
		||||
 | 
			
		||||
        switch (start) {
 | 
			
		||||
            case CENTRE:
 | 
			
		||||
                startX = rect.centerX();
 | 
			
		||||
                break;
 | 
			
		||||
            case LEFT:
 | 
			
		||||
                startX = rect.left + SWIPE_MARGIN_LIMIT;
 | 
			
		||||
                break;
 | 
			
		||||
            case RIGHT:
 | 
			
		||||
                startX = rect.right - SWIPE_MARGIN_LIMIT;
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                startX = 0;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (end) {
 | 
			
		||||
            case CENTRE:
 | 
			
		||||
                endX = rect.centerX();
 | 
			
		||||
                break;
 | 
			
		||||
            case LEFT:
 | 
			
		||||
                endX = rect.left + SWIPE_MARGIN_LIMIT;
 | 
			
		||||
                break;
 | 
			
		||||
            case RIGHT:
 | 
			
		||||
                endX = rect.right - SWIPE_MARGIN_LIMIT;
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                endX = 0;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        mDevice.drag(startX, rect.centerY(), endX, rect.centerY(), steps);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Helper to slide the slidebar during photo edit.
 | 
			
		||||
    private void slideBarTest(final UiObject view, final Position pos, final int steps) throws Exception {
 | 
			
		||||
        final int SWIPE_MARGIN_LIMIT = 5;
 | 
			
		||||
        Rect rect = view.getBounds();
 | 
			
		||||
 | 
			
		||||
        switch (pos) {
 | 
			
		||||
            case LEFT:
 | 
			
		||||
                mDevice.drag(rect.left + SWIPE_MARGIN_LIMIT, rect.centerY(),
 | 
			
		||||
                             rect.left + (rect.width() / 4), rect.centerY(),
 | 
			
		||||
                             steps);
 | 
			
		||||
                break;
 | 
			
		||||
            case RIGHT:
 | 
			
		||||
                mDevice.drag(rect.right - SWIPE_MARGIN_LIMIT, rect.centerY(),
 | 
			
		||||
                             rect.right - (rect.width() / 4), rect.centerY(),
 | 
			
		||||
                             steps);
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								wa/workloads/googlephotos/uiauto/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								wa/workloads/googlephotos/uiauto/build.gradle
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
 | 
			
		||||
 | 
			
		||||
buildscript {
 | 
			
		||||
    repositories {
 | 
			
		||||
        jcenter()
 | 
			
		||||
    }
 | 
			
		||||
    dependencies {
 | 
			
		||||
        classpath 'com.android.tools.build:gradle:2.3.2'
 | 
			
		||||
 | 
			
		||||
        // NOTE: Do not place your application dependencies here; they belong
 | 
			
		||||
        // in the individual module build.gradle files
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
allprojects {
 | 
			
		||||
    repositories {
 | 
			
		||||
        jcenter()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
task clean(type: Delete) {
 | 
			
		||||
    delete rootProject.buildDir
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										40
									
								
								wa/workloads/googlephotos/uiauto/build.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										40
									
								
								wa/workloads/googlephotos/uiauto/build.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
# CD into build dir if possible - allows building from any directory
 | 
			
		||||
script_path='.'
 | 
			
		||||
if `readlink -f $0 &>/dev/null`; then
 | 
			
		||||
    script_path=`readlink -f $0 2>/dev/null`
 | 
			
		||||
fi
 | 
			
		||||
script_dir=`dirname $script_path`
 | 
			
		||||
cd $script_dir
 | 
			
		||||
 | 
			
		||||
# Ensure gradelw exists before starting
 | 
			
		||||
if [[ ! -f gradlew ]]; then
 | 
			
		||||
    echo 'gradlew file not found! Check that you are in the right directory.'
 | 
			
		||||
    exit 9
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Copy base class library from wa dist
 | 
			
		||||
libs_dir=app/libs
 | 
			
		||||
base_class=`python -c "import os, wa; print os.path.join(os.path.dirname(wa.__file__), 'framework', 'uiauto', 'uiauto.aar')"`
 | 
			
		||||
mkdir -p $libs_dir
 | 
			
		||||
cp $base_class $libs_dir
 | 
			
		||||
 | 
			
		||||
# Build and return appropriate exit code if failed
 | 
			
		||||
# gradle build
 | 
			
		||||
./gradlew clean :app:assembleDebug
 | 
			
		||||
exit_code=$?
 | 
			
		||||
if [[ $exit_code -ne 0 ]]; then
 | 
			
		||||
    echo "ERROR: 'gradle build' exited with code $exit_code"
 | 
			
		||||
    exit $exit_code
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# If successful move APK file to workload folder (overwrite previous)
 | 
			
		||||
package=com.arm.wa.uiauto.googlephotos
 | 
			
		||||
rm -f ../$package
 | 
			
		||||
if [[ -f app/build/apk/$package.apk ]]; then
 | 
			
		||||
    cp app/build/apk/$package.apk ../$package.apk
 | 
			
		||||
else
 | 
			
		||||
    echo 'ERROR: UiAutomator apk could not be found!'
 | 
			
		||||
    exit 9
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								wa/workloads/googlephotos/uiauto/gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								wa/workloads/googlephotos/uiauto/gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										6
									
								
								wa/workloads/googlephotos/uiauto/gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								wa/workloads/googlephotos/uiauto/gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
#Thu Jun 08 14:26:39 BST 2017
 | 
			
		||||
distributionBase=GRADLE_USER_HOME
 | 
			
		||||
distributionPath=wrapper/dists
 | 
			
		||||
zipStoreBase=GRADLE_USER_HOME
 | 
			
		||||
zipStorePath=wrapper/dists
 | 
			
		||||
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
 | 
			
		||||
							
								
								
									
										160
									
								
								wa/workloads/googlephotos/uiauto/gradlew
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										160
									
								
								wa/workloads/googlephotos/uiauto/gradlew
									
									
									
									
										vendored
									
									
										Executable file
									
								
							@@ -0,0 +1,160 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
##############################################################################
 | 
			
		||||
##
 | 
			
		||||
##  Gradle start up script for UN*X
 | 
			
		||||
##
 | 
			
		||||
##############################################################################
 | 
			
		||||
 | 
			
		||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 | 
			
		||||
DEFAULT_JVM_OPTS=""
 | 
			
		||||
 | 
			
		||||
APP_NAME="Gradle"
 | 
			
		||||
APP_BASE_NAME=`basename "$0"`
 | 
			
		||||
 | 
			
		||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
 | 
			
		||||
MAX_FD="maximum"
 | 
			
		||||
 | 
			
		||||
warn ( ) {
 | 
			
		||||
    echo "$*"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
die ( ) {
 | 
			
		||||
    echo
 | 
			
		||||
    echo "$*"
 | 
			
		||||
    echo
 | 
			
		||||
    exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# OS specific support (must be 'true' or 'false').
 | 
			
		||||
cygwin=false
 | 
			
		||||
msys=false
 | 
			
		||||
darwin=false
 | 
			
		||||
case "`uname`" in
 | 
			
		||||
  CYGWIN* )
 | 
			
		||||
    cygwin=true
 | 
			
		||||
    ;;
 | 
			
		||||
  Darwin* )
 | 
			
		||||
    darwin=true
 | 
			
		||||
    ;;
 | 
			
		||||
  MINGW* )
 | 
			
		||||
    msys=true
 | 
			
		||||
    ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
# Attempt to set APP_HOME
 | 
			
		||||
# Resolve links: $0 may be a link
 | 
			
		||||
PRG="$0"
 | 
			
		||||
# Need this for relative symlinks.
 | 
			
		||||
while [ -h "$PRG" ] ; do
 | 
			
		||||
    ls=`ls -ld "$PRG"`
 | 
			
		||||
    link=`expr "$ls" : '.*-> \(.*\)$'`
 | 
			
		||||
    if expr "$link" : '/.*' > /dev/null; then
 | 
			
		||||
        PRG="$link"
 | 
			
		||||
    else
 | 
			
		||||
        PRG=`dirname "$PRG"`"/$link"
 | 
			
		||||
    fi
 | 
			
		||||
done
 | 
			
		||||
SAVED="`pwd`"
 | 
			
		||||
cd "`dirname \"$PRG\"`/" >/dev/null
 | 
			
		||||
APP_HOME="`pwd -P`"
 | 
			
		||||
cd "$SAVED" >/dev/null
 | 
			
		||||
 | 
			
		||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
 | 
			
		||||
 | 
			
		||||
# Determine the Java command to use to start the JVM.
 | 
			
		||||
if [ -n "$JAVA_HOME" ] ; then
 | 
			
		||||
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
 | 
			
		||||
        # IBM's JDK on AIX uses strange locations for the executables
 | 
			
		||||
        JAVACMD="$JAVA_HOME/jre/sh/java"
 | 
			
		||||
    else
 | 
			
		||||
        JAVACMD="$JAVA_HOME/bin/java"
 | 
			
		||||
    fi
 | 
			
		||||
    if [ ! -x "$JAVACMD" ] ; then
 | 
			
		||||
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
 | 
			
		||||
 | 
			
		||||
Please set the JAVA_HOME variable in your environment to match the
 | 
			
		||||
location of your Java installation."
 | 
			
		||||
    fi
 | 
			
		||||
else
 | 
			
		||||
    JAVACMD="java"
 | 
			
		||||
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
 | 
			
		||||
 | 
			
		||||
Please set the JAVA_HOME variable in your environment to match the
 | 
			
		||||
location of your Java installation."
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Increase the maximum file descriptors if we can.
 | 
			
		||||
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
 | 
			
		||||
    MAX_FD_LIMIT=`ulimit -H -n`
 | 
			
		||||
    if [ $? -eq 0 ] ; then
 | 
			
		||||
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
 | 
			
		||||
            MAX_FD="$MAX_FD_LIMIT"
 | 
			
		||||
        fi
 | 
			
		||||
        ulimit -n $MAX_FD
 | 
			
		||||
        if [ $? -ne 0 ] ; then
 | 
			
		||||
            warn "Could not set maximum file descriptor limit: $MAX_FD"
 | 
			
		||||
        fi
 | 
			
		||||
    else
 | 
			
		||||
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
 | 
			
		||||
    fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# For Darwin, add options to specify how the application appears in the dock
 | 
			
		||||
if $darwin; then
 | 
			
		||||
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# For Cygwin, switch paths to Windows format before running java
 | 
			
		||||
if $cygwin ; then
 | 
			
		||||
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
 | 
			
		||||
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
 | 
			
		||||
    JAVACMD=`cygpath --unix "$JAVACMD"`
 | 
			
		||||
 | 
			
		||||
    # We build the pattern for arguments to be converted via cygpath
 | 
			
		||||
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
 | 
			
		||||
    SEP=""
 | 
			
		||||
    for dir in $ROOTDIRSRAW ; do
 | 
			
		||||
        ROOTDIRS="$ROOTDIRS$SEP$dir"
 | 
			
		||||
        SEP="|"
 | 
			
		||||
    done
 | 
			
		||||
    OURCYGPATTERN="(^($ROOTDIRS))"
 | 
			
		||||
    # Add a user-defined pattern to the cygpath arguments
 | 
			
		||||
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
 | 
			
		||||
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
 | 
			
		||||
    fi
 | 
			
		||||
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
 | 
			
		||||
    i=0
 | 
			
		||||
    for arg in "$@" ; do
 | 
			
		||||
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
 | 
			
		||||
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
 | 
			
		||||
 | 
			
		||||
        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
 | 
			
		||||
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
 | 
			
		||||
        else
 | 
			
		||||
            eval `echo args$i`="\"$arg\""
 | 
			
		||||
        fi
 | 
			
		||||
        i=$((i+1))
 | 
			
		||||
    done
 | 
			
		||||
    case $i in
 | 
			
		||||
        (0) set -- ;;
 | 
			
		||||
        (1) set -- "$args0" ;;
 | 
			
		||||
        (2) set -- "$args0" "$args1" ;;
 | 
			
		||||
        (3) set -- "$args0" "$args1" "$args2" ;;
 | 
			
		||||
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
 | 
			
		||||
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
 | 
			
		||||
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
 | 
			
		||||
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
 | 
			
		||||
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
 | 
			
		||||
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
 | 
			
		||||
    esac
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
 | 
			
		||||
function splitJvmOpts() {
 | 
			
		||||
    JVM_OPTS=("$@")
 | 
			
		||||
}
 | 
			
		||||
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
 | 
			
		||||
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
 | 
			
		||||
 | 
			
		||||
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
 | 
			
		||||
							
								
								
									
										90
									
								
								wa/workloads/googlephotos/uiauto/gradlew.bat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								wa/workloads/googlephotos/uiauto/gradlew.bat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,90 @@
 | 
			
		||||
@if "%DEBUG%" == "" @echo off
 | 
			
		||||
@rem ##########################################################################
 | 
			
		||||
@rem
 | 
			
		||||
@rem  Gradle startup script for Windows
 | 
			
		||||
@rem
 | 
			
		||||
@rem ##########################################################################
 | 
			
		||||
 | 
			
		||||
@rem Set local scope for the variables with windows NT shell
 | 
			
		||||
if "%OS%"=="Windows_NT" setlocal
 | 
			
		||||
 | 
			
		||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 | 
			
		||||
set DEFAULT_JVM_OPTS=
 | 
			
		||||
 | 
			
		||||
set DIRNAME=%~dp0
 | 
			
		||||
if "%DIRNAME%" == "" set DIRNAME=.
 | 
			
		||||
set APP_BASE_NAME=%~n0
 | 
			
		||||
set APP_HOME=%DIRNAME%
 | 
			
		||||
 | 
			
		||||
@rem Find java.exe
 | 
			
		||||
if defined JAVA_HOME goto findJavaFromJavaHome
 | 
			
		||||
 | 
			
		||||
set JAVA_EXE=java.exe
 | 
			
		||||
%JAVA_EXE% -version >NUL 2>&1
 | 
			
		||||
if "%ERRORLEVEL%" == "0" goto init
 | 
			
		||||
 | 
			
		||||
echo.
 | 
			
		||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
 | 
			
		||||
echo.
 | 
			
		||||
echo Please set the JAVA_HOME variable in your environment to match the
 | 
			
		||||
echo location of your Java installation.
 | 
			
		||||
 | 
			
		||||
goto fail
 | 
			
		||||
 | 
			
		||||
:findJavaFromJavaHome
 | 
			
		||||
set JAVA_HOME=%JAVA_HOME:"=%
 | 
			
		||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
 | 
			
		||||
 | 
			
		||||
if exist "%JAVA_EXE%" goto init
 | 
			
		||||
 | 
			
		||||
echo.
 | 
			
		||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
 | 
			
		||||
echo.
 | 
			
		||||
echo Please set the JAVA_HOME variable in your environment to match the
 | 
			
		||||
echo location of your Java installation.
 | 
			
		||||
 | 
			
		||||
goto fail
 | 
			
		||||
 | 
			
		||||
:init
 | 
			
		||||
@rem Get command-line arguments, handling Windowz variants
 | 
			
		||||
 | 
			
		||||
if not "%OS%" == "Windows_NT" goto win9xME_args
 | 
			
		||||
if "%@eval[2+2]" == "4" goto 4NT_args
 | 
			
		||||
 | 
			
		||||
:win9xME_args
 | 
			
		||||
@rem Slurp the command line arguments.
 | 
			
		||||
set CMD_LINE_ARGS=
 | 
			
		||||
set _SKIP=2
 | 
			
		||||
 | 
			
		||||
:win9xME_args_slurp
 | 
			
		||||
if "x%~1" == "x" goto execute
 | 
			
		||||
 | 
			
		||||
set CMD_LINE_ARGS=%*
 | 
			
		||||
goto execute
 | 
			
		||||
 | 
			
		||||
:4NT_args
 | 
			
		||||
@rem Get arguments from the 4NT Shell from JP Software
 | 
			
		||||
set CMD_LINE_ARGS=%$
 | 
			
		||||
 | 
			
		||||
:execute
 | 
			
		||||
@rem Setup the command line
 | 
			
		||||
 | 
			
		||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
 | 
			
		||||
 | 
			
		||||
@rem Execute Gradle
 | 
			
		||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
 | 
			
		||||
 | 
			
		||||
:end
 | 
			
		||||
@rem End local scope for the variables with windows NT shell
 | 
			
		||||
if "%ERRORLEVEL%"=="0" goto mainEnd
 | 
			
		||||
 | 
			
		||||
:fail
 | 
			
		||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
 | 
			
		||||
rem the _cmd.exe /c_ return code!
 | 
			
		||||
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
 | 
			
		||||
exit /b 1
 | 
			
		||||
 | 
			
		||||
:mainEnd
 | 
			
		||||
if "%OS%"=="Windows_NT" endlocal
 | 
			
		||||
 | 
			
		||||
:omega
 | 
			
		||||
							
								
								
									
										1
									
								
								wa/workloads/googlephotos/uiauto/settings.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								wa/workloads/googlephotos/uiauto/settings.gradle
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
include ':app'
 | 
			
		||||
		Reference in New Issue
	
	Block a user