summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Android.UITests
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Android.UITests')
-rw-r--r--Xamarin.Forms.Android.UITests/BaseTestFixture.cs108
-rw-r--r--Xamarin.Forms.Android.UITests/Makefile15
-rw-r--r--Xamarin.Forms.Android.UITests/PlatformHelpers.cs132
-rw-r--r--Xamarin.Forms.Android.UITests/PlatformQueries.cs111
-rw-r--r--Xamarin.Forms.Android.UITests/Properties/AssemblyInfo.cs36
-rw-r--r--Xamarin.Forms.Android.UITests/Xamarin.Forms.Android.UITests.csproj85
-rw-r--r--Xamarin.Forms.Android.UITests/packages.config5
-rw-r--r--Xamarin.Forms.Android.UITests/testcloudupload.bat1
8 files changed, 493 insertions, 0 deletions
diff --git a/Xamarin.Forms.Android.UITests/BaseTestFixture.cs b/Xamarin.Forms.Android.UITests/BaseTestFixture.cs
new file mode 100644
index 00000000..6e38f356
--- /dev/null
+++ b/Xamarin.Forms.Android.UITests/BaseTestFixture.cs
@@ -0,0 +1,108 @@
+using System;
+using Xamarin.UITest;
+using Xamarin.UITest.Android;
+using Xamarin.UITest.Queries;
+using NUnit.Framework;
+using System.Threading;
+
+namespace Xamarin.Forms.UITests
+{
+ public class BaseTestFixture
+ {
+ string idiomEnvVar;
+ string IPEnvVar;
+
+ public AndroidApp App { get; private set; }
+ public Device Device { get; set; }
+
+ public BaseTestFixture ()
+ {
+ idiomEnvVar = Environment.GetEnvironmentVariable ("DEVICE_IDIOM");
+ IPEnvVar = Environment.GetEnvironmentVariable ("DEVICE_IP");
+
+ Console.WriteLine (string.Format ("****** Connecting to {0} with IP: {1} ********", idiomEnvVar, IPEnvVar));
+
+ Device = SetupDevice (idiomEnvVar, IPEnvVar);
+ }
+
+ [SetUp]
+ public void Setup ()
+ {
+
+ if (string.IsNullOrEmpty (idiomEnvVar) &&
+ string.IsNullOrEmpty (IPEnvVar)) {
+ // Use IDE Configuration
+ App = ConfigureApp
+ .Android
+ .Debug ()
+ .ApkFile ("../../../Xamarin.Forms.ControlGallery.Android/bin/Debug/AndroidControlGallery.AndroidControlGallery-Signed.apk")
+ .StartApp ();
+ } else {
+ // Use CI Configuration
+ App = ConfigureApp
+ .Android
+ .DeviceIp (Device.IP)
+ .ApkFile ("../../../Xamarin.Forms.ControlGallery.Android/bin/Debug/AndroidControlGallery.AndroidControlGallery-Signed.apk")
+ .StartApp ();
+ }
+
+ FixtureSetup ();
+ }
+
+ protected virtual void FixtureSetup ()
+ {
+ App.SetOrientationPortrait ();
+ App.Screenshot ("Begin test");
+ }
+
+ Device SetupDevice (string idiomEnvVar, string IPEnvVar)
+ {
+ Device device;
+
+ if (idiomEnvVar == "PHONE") {
+
+ // default phone
+ device = new Device (DeviceType.Phone, "10.0.1.161");
+
+ if (!string.IsNullOrEmpty (IPEnvVar))
+ device.IP = IPEnvVar;
+
+ } else if (idiomEnvVar == "TABLET") {
+
+ // default tablet
+ device = new Device (DeviceType.Tablet, "10.0.1.42");
+
+ if (!string.IsNullOrEmpty (IPEnvVar))
+ device.IP = IPEnvVar;
+
+ } else {
+
+ // default phone
+ device = new Device (DeviceType.Phone, "10.0.1.161");
+
+ }
+
+ return device;
+ }
+
+ }
+
+ public static class PlatformStrings
+ {
+ public static string Button = "Button";
+ public static string Cell = "xamarin.forms.platform.android.ViewCellRenderer_ViewCellContainer";
+ public static string HomePageTitle = "Android Controls";
+ public static string Label = "TextView";
+ public static string Entry = "EditText";
+ public static string Placeholder = "hint";
+ public static string Text = "text";
+ }
+
+ public static class PlatformValues
+ {
+ public static int BoxViewScreenNumber = 4;
+ public static int KeyboardDismissY = 500;
+ public static int OffsetForScrollView = -5;
+ }
+}
+
diff --git a/Xamarin.Forms.Android.UITests/Makefile b/Xamarin.Forms.Android.UITests/Makefile
new file mode 100644
index 00000000..87c3be60
--- /dev/null
+++ b/Xamarin.Forms.Android.UITests/Makefile
@@ -0,0 +1,15 @@
+console:
+ calabash-android console ../Xamarin.Forms.ControlGallery.Android/bin/Debug/AndroidControlGallery.AndroidControlGallery-Signed.apk
+
+testcloud:
+ mono xut-console.exe submit --assembly-dir ../Xamarin.Forms.Android.UITests/bin/debug ../Xamarin.Forms.ControlGallery.Android/bin/Release/AndroidControlGallery.AndroidControlGallery-Signed.apk 1a02b2e1ee5a2895e47da095cc895a49 7a47b813
+
+run-phone-android:
+ DEVICE_IDIOM=PHONE DEVICE_ID=9adaaf78 DEVICE_IP=192.168.1.144 mono ../packages/NUnit.Runners.2.6.3/tools/nunit-console-x86.exe -result=galaxy-results.xml bin/Debug/Xamarin.Forms.Android.UITests.dll
+
+run-parallel-android:
+ DEVICE_IDIOM=TABLET mono ../packages/NUnit.Runners.2.6.3/tools/nunit-console-x86.exe -result=nexus-results.xml bin/Debug/Xamarin.Forms.Android.UITests.dll --include "CITest" &
+ DEVICE_IDIOM=PHONE mono ../packages/NUnit.Runners.2.6.3/tools/nunit-console-x86.exe -result=galaxy-results.xml bin/Debug/Xamarin.Forms.Android.UITests.dll --include "CITest"
+
+clean:
+ rm -rf screenshot_* test_servers/ .irb-history nexus-results.xml galaxy-results.xml
diff --git a/Xamarin.Forms.Android.UITests/PlatformHelpers.cs b/Xamarin.Forms.Android.UITests/PlatformHelpers.cs
new file mode 100644
index 00000000..6021f2a2
--- /dev/null
+++ b/Xamarin.Forms.Android.UITests/PlatformHelpers.cs
@@ -0,0 +1,132 @@
+using System;
+using Xamarin.UITest;
+using Xamarin.UITest.Android;
+using Xamarin.UITest.Queries;
+using NUnit.Framework;
+using System.Threading;
+
+namespace Xamarin.Forms.UITests
+{
+
+ public static class PlatformHelpers
+ {
+
+ public static string GetTextForQuery (this IApp app, Func<AppQuery, AppQuery> query)
+ {
+ AppResult[] elements = app.Query (query);
+ if (elements.Length > 1) {
+ // Test cloud doesn't support Assert.Fail
+ Assert.False (true, "Query returned more than one result");
+ }
+ return elements [0].Text;
+ }
+
+ public static bool ScrollDownForElement (this IApp app, Func<AppQuery, AppQuery> query, int scrollNumberLimit)
+ {
+ // Check if element exists before scrolling
+ if (app.Query (query).Length > 0)
+ return true;
+
+ int scrollNumber = 0;
+ while (app.Query (query).Length == 0) {
+ app.ScrollDown ();
+ scrollNumber++;
+ if (scrollNumber > scrollNumberLimit)
+ return false;
+ }
+
+ return true;
+ }
+
+ public static bool ScrollUpForElement (this IApp app, Func<AppQuery, AppQuery> query, int scrollNumberLimit)
+ {
+ int scrollNumber = 0;
+ while (app.Query (query).Length == 0) {
+ app.ScrollUp ();
+ scrollNumber++;
+ if (scrollNumber > scrollNumberLimit)
+ return false;
+ }
+
+ return true;
+ }
+
+ public static bool DragFromToForElement (this AndroidApp app, int scrollNumberLimit, Func<AppQuery, AppQuery> query, float xStart, float yStart, float xEnd, float yEnd)
+ {
+ int numberOfScrolls = 0;
+ // Element exists
+ if (app.Query (query).Length > 0)
+ return true;
+
+ while (app.Query (query).Length == 0) {
+ DragFromTo (app, xStart, yStart, xEnd, yEnd);
+ if (numberOfScrolls > scrollNumberLimit) {
+ return false;
+ }
+ numberOfScrolls++;
+ }
+ // Element found
+ return true;
+ }
+
+ public static void SwipeBackNavigation (this AndroidApp app)
+ {
+ // Do nothing on Android
+ }
+
+ public static void DragFromTo (this AndroidApp app, float xStart, float yStart, float xEnd, float yEnd, Speed speed = Speed.Fast)
+ {
+ // No effect on Android
+ app.DragCoordinates (xStart, yStart, xEnd, yEnd);
+ }
+
+ public static void KeyboardIsPresent (this AndroidApp app)
+ {
+ // TODO : Add keyboard detection
+// Thread.Sleep (1000);
+//
+// AppRect screenSize = app.MainScreenBounds ();
+// AppRect contentBounds = app.Query (q => q.Raw ("*").Id ("content"))[0].Rect;
+//
+// bool keyboardIsShown = false;
+// if ((screenSize.Height - contentBounds.Height) > (screenSize.Height / 4)) {
+// // Determine if keyboard is showing by seeing if content size is shrunk by over 1/4 of screens size
+// keyboardIsShown = true;
+// }
+//
+// Assert.IsTrue (keyboardIsShown, "Keyboard should be shown");
+ Assert.Inconclusive ("Keyboard should be shown");
+ }
+
+ public static void KeyboardIsDismissed (this AndroidApp app)
+ {
+ // TODO : Add keyboard detection
+// AppRect screenSize = app.MainScreenBounds ();
+// AppRect contentBounds = app.Query (q => q.Raw ("*").Id ("content"))[0].Rect;
+//
+// bool keyboardIsShown = false;
+// if ((screenSize.Height - contentBounds.Height) > (screenSize.Height / 4)) {
+// // Determine if keyboard is showing by seeing if content size is shrunk by over 1/4 of screens size
+// keyboardIsShown = true;
+// }
+//
+// Assert.IsFalse (keyboardIsShown, "Keyboard should be dismissed");
+ Assert.Inconclusive ("Keyboard should be dismissed");
+ }
+
+ public static int IndexForElementWithText (this AndroidApp app, Func<AppQuery, AppQuery> query, string text)
+ {
+ var elements = app.Query (query);
+ int index = 0;
+ for (int i = 0; i < elements.Length; i++) {
+ string labelText = elements[i].Text;
+ if (labelText == (text)) {
+ index = i;
+ break;
+ }
+ index++;
+ }
+ return index == elements.Length ? -1 : index;
+ }
+ }
+}
diff --git a/Xamarin.Forms.Android.UITests/PlatformQueries.cs b/Xamarin.Forms.Android.UITests/PlatformQueries.cs
new file mode 100644
index 00000000..0b826949
--- /dev/null
+++ b/Xamarin.Forms.Android.UITests/PlatformQueries.cs
@@ -0,0 +1,111 @@
+using System;
+using Xamarin.UITest;
+using Xamarin.UITest.Android;
+using Xamarin.UITest.Queries;
+using NUnit.Framework;
+using System.Threading;
+
+namespace Xamarin.Forms.UITests
+{
+ public class iOSUiTestType
+ {
+ public iOSUiTestType ()
+ {
+
+ }
+ }
+
+ public static class PlatformQueries
+ {
+ public static Func<AppQuery, AppQuery> AbsoluteGalleryBackground = q => q.Raw ("xamarin.forms.platform.android.BoxRenderer parent xamarin.forms.platform.android.RendererFactory_DefaultRenderer index:0");
+ public static Func<AppQuery, AppQuery> ActivityIndicators = q => q.Raw ("ProgressBar");
+ public static Func<AppQuery, AppQuery> Back = q => q.Id ("up");
+ public static Func<AppQuery, AppQuery> BoxRendererQuery = q => q.Raw ("xamarin.forms.platform.android.BoxRenderer");
+ public static Func<AppQuery, AppQuery> Cells = q => q.Raw ("xamarin.forms.platform.android.ViewCellRenderer_ViewCellContainer");
+ public static Func<AppQuery, AppQuery> DismissPickerCustom = q => q.Marked ("OK");
+ public static Func<AppQuery, AppQuery> DismissPickerNormal = q => q.Marked ("Done");
+ public static Func<AppQuery, AppQuery> Entrys = q => q.Raw ("EntryEditText");
+ public static Func<AppQuery, AppQuery> EntryCells = q => q.Raw ("EntryCellEditText");
+ public static Func<AppQuery, AppQuery> Editors = q => q.Raw ("EditorEditText");
+ public static Func<AppQuery, AppQuery> Frames = q => q.Raw ("FrameRenderer");
+ public static Func<AppQuery, AppQuery> Images = q => q.Raw ("xamarin.forms.platform.android.ImageRenderer");
+ public static Func<AppQuery, AppQuery> ImageView = q => q.Raw("ImageView");
+ public static Func<AppQuery, AppQuery> LabelRenderers = q => q.Raw ("LabelRenderer");
+ public static Func<AppQuery, AppQuery> List = q => q.Raw ("ListView");
+ public static Func<AppQuery, AppQuery> Labels = q => q.Raw ("TextView");
+ public static Func<AppQuery, AppQuery> Map = q => q.Raw ("MapView");
+ public static Func<AppQuery, AppQuery> NumberPicker = q => q.Raw ("NumberPicker");
+ public static Func<AppQuery, AppQuery> ProgressBar = q => q.Raw ("ProgressBar");
+ public static Func<AppQuery, AppQuery> Tables = q => q.Raw ("ListView");
+ public static Func<AppQuery, AppQuery> SearchBars = q => q.Raw ("SearchView");
+ public static Func<AppQuery, AppQuery> Sliders = q => q.Raw ("SeekBar");
+ public static Func<AppQuery, AppQuery> SpanningThreeRows = q => q.Marked ("Spanning 3 rows");
+ public static Func<AppQuery, AppQuery> Steppers = q => q.Raw ("button marked:'+'");
+ public static Func<AppQuery, AppQuery> Switch = q => q.Raw("Switch");
+ public static Func<AppQuery, AppQuery> ThreeXThreeGridCell = q => q.Marked ("a block 3x3");
+
+ public static Func<AppQuery, AppQuery> EntryWithPlaceholder (string text) {
+ return q => q.Raw (string.Format ("EntryEditText hint:'{0}'", text));
+ }
+ public static Func<AppQuery, AppQuery> EntryCellWithPlaceholder (string text) {
+ return q => q.Raw (string.Format ("EntryCellEditText hint:'{0}'", text));
+ }
+
+ public static Func<AppQuery, AppQuery> EntryWithText (string text) {
+ return q => q.Raw (string.Format ("EntryEditText text:'{0}'", text));
+ }
+
+ public static Func<AppQuery, AppQuery> EntryCellWithText (string text) {
+ return q => q.Raw (string.Format ("EntryCellEditText text:'{0}'", text));
+ }
+
+ public static Func<AppQuery, AppQuery> EditorsWithText (string text) {
+ return q => q.Raw (string.Format ("EditorEditText text:'{0}'", text));
+ }
+
+ public static Func<AppQuery, AppQuery> EntryWithIndex (int index) {
+ return q => q.Raw (string.Format ("EntryEditText index:{0}", index));
+ }
+
+ public static Func<AppQuery, AppQuery> SearchBarWithIndex (int index) {
+ return q => q.Raw (string.Format ("SearchView index:{0}", index));
+ }
+
+ public static Func<AppQuery, AppQuery> LabelWithIndex (int index) {
+ return q => q.Raw (string.Format ("TextView index:{0}", index));
+ }
+
+ public static Func<AppQuery, AppQuery> LabelWithText (string text) {
+ return q => q.Raw (string.Format ("TextView text:'{0}'", text));
+ }
+
+ public static Func<AppQuery, AppQuery> LabelWithId (string id) {
+ return q => q.Raw (string.Format ("TextView id:'{0}'", id));
+ }
+
+ public static Func<AppQuery, AppQuery> PickerEntryWithIndex (int index) {
+ return q => q.Raw (string.Format ("EditText index:{0}", index));
+ }
+
+ public static Func<AppQuery, AppQuery> PickerEntryWithPlaceholder (string placeholder) {
+ return q => q.Raw (string.Format ("EditText hint:'{0}'", placeholder));
+ }
+
+ public static Func<AppQuery, AppQuery> PickerEntryWithText (string text) {
+ return q => q.Raw (string.Format ("EditText text:'{0}'", text));
+ }
+
+ public static Func<AppQuery, AppQuery> SwitchWithIndex (int index) {
+ return q => q.Raw (string.Format ("Switch index:{0}", index));
+ }
+
+ public static Func<AppQuery, AppQuery> StepperWithIndex (int index) {
+ return q => q.Raw (string.Format ("button marked:'+' index:{0}", index));
+ }
+
+ public static AppResult DetailPage (this AndroidApp app)
+ {
+ return app.Query (q => q.Raw ("*"))[0];
+ }
+ }
+}
diff --git a/Xamarin.Forms.Android.UITests/Properties/AssemblyInfo.cs b/Xamarin.Forms.Android.UITests/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..99b6aa63
--- /dev/null
+++ b/Xamarin.Forms.Android.UITests/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Xamarin.Forms.Android.UITest")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Xamarin.Forms.Android.UITest")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("fd80e73b-7225-40ce-b38d-350c5487a0df")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Xamarin.Forms.Android.UITests/Xamarin.Forms.Android.UITests.csproj b/Xamarin.Forms.Android.UITests/Xamarin.Forms.Android.UITests.csproj
new file mode 100644
index 00000000..5c1b991b
--- /dev/null
+++ b/Xamarin.Forms.Android.UITests/Xamarin.Forms.Android.UITests.csproj
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{D290FCBE-3196-452B-B84C-B62BF9B54F2A}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>Xamarin.Forms.Android.UITest</RootNamespace>
+ <AssemblyName>Xamarin.Forms.Android.UITests</AssemblyName>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
+ <RestorePackages>true</RestorePackages>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="nunit.framework">
+ <HintPath>..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Xml" />
+ <Reference Include="Xamarin.UITest">
+ <HintPath>..\packages\Xamarin.UITest.0.4.1\lib\Xamarin.UITest.dll</HintPath>
+ </Reference>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="BaseTestFixture.cs" />
+ <Compile Include="..\Xamarin.Forms.iOS.UITests\TestHelpers.cs">
+ <Link>TestHelpers.cs</Link>
+ </Compile>
+ <Compile Include="PlatformQueries.cs" />
+ <Compile Include="PlatformHelpers.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="packages.config" />
+ <Compile Include="..\Xamarin.Forms.iOS.UITests\Device.cs">
+ <Link>Device.cs</Link>
+ </Compile>
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
+ <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+ <PropertyGroup>
+ <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+ </PropertyGroup>
+ <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
+ </Target>
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+ <ItemGroup>
+ <ProjectReference Include="..\Xamarin.Forms.Core\Xamarin.Forms.Core.csproj">
+ <Project>{57b8b73d-c3b5-4c42-869e-7b2f17d354ac}</Project>
+ <Name>Xamarin.Forms.Core</Name>
+ </ProjectReference>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/Xamarin.Forms.Android.UITests/packages.config b/Xamarin.Forms.Android.UITests/packages.config
new file mode 100644
index 00000000..cd848561
--- /dev/null
+++ b/Xamarin.Forms.Android.UITests/packages.config
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+ <package id="NUnit" version="2.6.3" targetFramework="net45" />
+ <package id="Xamarin.UITest" version="0.4.1" targetFramework="net45" />
+</packages> \ No newline at end of file
diff --git a/Xamarin.Forms.Android.UITests/testcloudupload.bat b/Xamarin.Forms.Android.UITests/testcloudupload.bat
new file mode 100644
index 00000000..1afa4cff
--- /dev/null
+++ b/Xamarin.Forms.Android.UITests/testcloudupload.bat
@@ -0,0 +1 @@
+xut-console.exe submit --assembly-dir ..\Xamarin.Forms.Android.UITests\bin\debug ..\Xamarin.Forms.ControlGallery.Android\bin\Release\AndroidControlGallery.AndroidControlGallery-Signed.apk 1a02b2e1ee5a2895e47da095cc895a49 6bbba6ec