diff --git a/Assets/Engine/Shaders/DistanceClouds.ext b/Assets/Engine/Shaders/DistanceClouds.ext
deleted file mode 100644
index 322acef5f3..0000000000
--- a/Assets/Engine/Shaders/DistanceClouds.ext
+++ /dev/null
@@ -1,51 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Particles shader extension used by the editor
-// for automatic shader generation (based on "Particles" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %DIFFUSE
- Mask = 0x1
- Hidden
-}
-
-Property
-{
- Name = %SIMPLE
- Mask = 0x2
- Property (Simple distance clouds)
- Description (Use distance clouds with no volumetric shading computations)
-}
-
-Property
-{
- Name = %ADVANCED
- Mask = 0x4
- Property (Advanced distance clouds)
- Description (Use distance clouds with more accurate shading computations)
-}
-
-Property
-{
- Name = %DEPTH_FADE
- Mask = 0x8
- Property (Depth Fade)
- Description (Fades the output based on closeness of objects behind it)
-}
diff --git a/Assets/Engine/Shaders/Eye.ext b/Assets/Engine/Shaders/Eye.ext
deleted file mode 100644
index 28df961f79..0000000000
--- a/Assets/Engine/Shaders/Eye.ext
+++ /dev/null
@@ -1,74 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Eye shader extension used by the editor
-// for automatic shader generation (based on "Eye" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %ENVIRONMENT_MAP
- Mask = 0x2
- Property (Environment map)
- Description (Use environment map as separate texture)
- DependencyReset = $TEX_EnvCM
-}
-
-Property
-{
- Name = %EYE_AO_OVERLAY
- Mask = 0x4
- Property (Ambient occlusion overlay)
- Description (Use for ambient occlusion overlay rendering)
-}
-
-Property
-{
- Name = %EYE_SPECULAR_OVERLAY
- Mask = 0x8
- Property (Specular overlay)
- Description (Use for specular overlay rendering)
-}
-
-Property
-{
- Name = %VERTCOLORS
- Mask = 0x400000
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %TEMP_EYES
- Mask = 0x80000000
- DependencySet = $UserEnabled
- Hidden
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/Fur.ext b/Assets/Engine/Shaders/Fur.ext
deleted file mode 100644
index 067c85d274..0000000000
--- a/Assets/Engine/Shaders/Fur.ext
+++ /dev/null
@@ -1,126 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-
-// Description: Fur shader extension used by the editor
-// for automatic shader generation (based on "Fur" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x2
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %CUSTOM_MODIFICATOR
- Mask = 0x4
- Property (Call CustomModificator function in vertex shader)
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %FUR_VERT_COLORS
- Mask = 0x8
- Property (Fur Color Data)
- Description (Vertex color channel contains fur combing and scaling info)
-}
-
-Property
-{
- Name = %FUR_WIND_BENDING
- Mask = 0x10
- Property (Wind bending)
- Description (Enable wind bending for fur)
-}
-
-Property
-{
- Name = %FUR_BLENDLAYER
- Mask = 0x20
- Property (Fur Blendlayer)
- Description (Diffuse layer blended into fur as it grows from base to tip)
-}
-
-Property
-{
- Name = %FUR_BLENDCOLOR
- Mask = 0x40
- Property (Fur Blend color)
- Description (Specified color blended into fur diffuse as it grows from base to tip)
-}
-
-Property
-{
- Name = %FUR_LENGTH_SCALED
- Mask = 0x80
- Property (Scale fur length)
- Description (Fur length scales with object scale)
-}
-
-Property
-{
- Name = %MODEL_SPACE_Z_UP
- Mask = 0x100
- Property (Model Space Z Up)
- Description (Check if model was generated with Z up, if unchecked, assumes Y up)
-}
-
-Property
-{
- Name = %DEPTH_FIXUP
- Mask = 0x200
- Property (Depth Fixup)
- Description (Write depth for depth of field and postprocessing)
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %ZPASS_CUSTOM_DIFFUSE
- Mask = 0x400
- Property (Calls GetZPassDiffuse function in z pass pixel shader for custom diffuse handling)
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %FUR_MULTI_LAYER_ALPHA_BLEND
- Mask = 0x800
- Property(Enable OIT)
- Description(Use OIT for accurate alpha blending - performance penalty expected)
-}
diff --git a/Assets/Engine/Shaders/GeometryBeam.ext b/Assets/Engine/Shaders/GeometryBeam.ext
deleted file mode 100644
index 25e395f42d..0000000000
--- a/Assets/Engine/Shaders/GeometryBeam.ext
+++ /dev/null
@@ -1,43 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-Property
-{
- Name = %NOISE
- Mask = 0x1
- Property (Dust & Turbulence)
- Description (Add a dust overlay [spec map for dust, bump map for turbulence] )
-}
-
-
-Property
-{
- Name = %RECEIVE_SHADOWS
- Mask = 0x2
- Property (Receive Shadows)
- Description (Enable shadow receiving)
-}
-
-
-Property
-{
- Name = %UV_VIGNETTING
- Mask = 0x4
- Property (UV Vignetting)
- Description (Enabling this will cause contents to fade out at UV boundaries)
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/Glass.ext b/Assets/Engine/Shaders/Glass.ext
deleted file mode 100644
index 1070d4e5c9..0000000000
--- a/Assets/Engine/Shaders/Glass.ext
+++ /dev/null
@@ -1,111 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Glass shader extension used by the editor
-// for automatic shader generation (based on "Glass" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-Version (2.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %DIRT_MAP
- Mask = 0x100000
- Property (Use Diffuse map)
- Description (Use Diffuse map for dirt, etc. Requires Alpha channel)
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x200000
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %ENVIRONMENT_MAP
- Mask = 0x10
- Property (Environment map)
- Description (Use environment map as separate texture)
- DependencyReset = $TEX_EnvCM
-}
-
-
-Property
-{
- Name = %TINT_MAP
- Mask = 0x200
- Property (Tint map - Tint/Gloss/Spec)
- Description (Use RGB Spec Map to control Tinting in Red channel / Cloudiness in Green channel / Specular in Blue channel)
-
-}
-
-Property
-{
- Name = %TINT_COLOR_MAP
- Mask = 0x400
- Property (Use Tint Color Map)
- Description (Use Tint Color Map for multi-colored glass, goes in the custom Tint Color Map slot)
- DependencyReset = $TEX_Custom
- DependencySet = $TEX_Custom
-}
-
-Property
-{
- Name = %BLUR_REFRACTION
- Mask = 0x2000
- Property (Blur refraction - PC Only)
- Description (Blur objects seen through the glass)
-}
-
-Property
-{
- Name = %DEPTH_FOG
- Mask = 0x4000
- Property (Depth Fog)
- Description (Enables depth fog behind glass surface)
-}
-
-Property
-{
- Name = %UNLIT
- Mask = 0x8000
- Property (Disable Lights)
- Description (Disables the reflection of lights)
-}
-
-Property
-{
- Name = %DEPTH_FIXUP
- Mask = 0x4000000
- Property (Depth Fixup)
- Description (Write depth for depth of field and postprocessing)
-}
-
-Property
-{
- Name = %SAA_FILTERING
- Mask = 0x80000000
- Property (Specular Antialiasing)
- Description (Perform specular Antialiasing)
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/AuxGeom.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/AuxGeom.cfx
deleted file mode 100644
index ac64ed293a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/AuxGeom.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d924c59739f63724999b1bf6cd326d10024b031bdfbf02fe8e09cb0b783dfe67
-size 2891
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Clouds.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Clouds.cfx
deleted file mode 100644
index cf8ee86492..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Clouds.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:045f6506425364221f9dbf0b359e38877f276300770ef7a5ab694f1055eb0d02
-size 1569
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Common.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/Common.cfi
deleted file mode 100644
index 644826685e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Common.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f25999b453c3e91c8237d28ccc1ef3baefaa2a7ec8f9aad65adb95042e25e435
-size 56582
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Common.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Common.cfx
deleted file mode 100644
index d347b5c967..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Common.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:396a70d86a4678b16fa110b3eceacbd5b515aa85090d16bdb6a8562d7c94e4a8
-size 17205
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonDebugPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonDebugPass.cfi
deleted file mode 100644
index 95abf99bbf..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonDebugPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b05841cd01ec853455ad792e80302cf5ffbbd104c5ecf46699f5ecd4b0624c09
-size 983
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonMotionBlurPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonMotionBlurPass.cfi
deleted file mode 100644
index 54f160e01b..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonMotionBlurPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:725006c2f2844e49b691506cbc3d015466cdfbad19209a63964acc264b78c782
-size 4096
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonMotionBlurPassTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonMotionBlurPassTess.cfi
deleted file mode 100644
index 4d74269d97..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonMotionBlurPassTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5886e0be4d4047a9b41431c141738cb0a13a3b3a4033cc262f173b5e9e195707
-size 4734
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonSVO.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonSVO.cfi
deleted file mode 100644
index 023437ec3c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonSVO.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:57682432ba4de87ddc5ba542b6630ad512f75dbaca2a0c1402fb2a59ed35804c
-size 111615
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonShadowGenPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonShadowGenPass.cfi
deleted file mode 100644
index 7907e3913d..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonShadowGenPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:01bbe928766a8c75bc3d990747f91e5becfbed6a59d58b71d2a2922f6d14bc1f
-size 6970
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonShadowGenPassTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonShadowGenPassTess.cfi
deleted file mode 100644
index ccb63377d1..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonShadowGenPassTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8c4c004afe3782ae58fa4ac90dd7f16e026d0c38e4bf66ed475beaa1ce3fcf98
-size 3363
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonTessellation.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonTessellation.cfi
deleted file mode 100644
index 33aa6974cf..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonTessellation.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:86f594a6f8fb6e1328b95e6b03a04109ea3e9e8b8642d30c674281ea916dbf41
-size 19522
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonViewsPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonViewsPass.cfi
deleted file mode 100644
index 71876eddd2..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonViewsPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:04850ac23185147fd8e97303efad70cbb876c6589c71cb413b0429d267705cd3
-size 8020
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonViewsPassTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonViewsPassTess.cfi
deleted file mode 100644
index 96cbad4a40..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonViewsPassTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6c660b79e7532b5a9513341d3f37215a742d3ee99532ba0003e2c13381d55bc6
-size 4238
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPass.cfi
deleted file mode 100644
index 8a9f7ef4f1..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8fe036b79e16737499920500c87997567d8ee32534748df4ea617c4118237cb5
-size 32052
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPassTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPassTess.cfi
deleted file mode 100644
index adc03e7945..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPassTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a30f1c7b94eb1bcb0261e518062da6eb69987698d65e6dd786bfe29be32d749e
-size 4995
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPrePass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPrePass.cfi
deleted file mode 100644
index 43481f75fe..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPrePass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3c4ac5b9fa8a288f8fdfc4110599b25742b19ddd3a251d638e5e1da9284310d6
-size 2814
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DXTCompress.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DXTCompress.cfx
deleted file mode 100644
index 26545c6531..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DXTCompress.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a2b214f2873a3a99bcaccc120d6a397c708a4b3309c9b953860f8f9cf93461c8
-size 8591
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Debug.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Debug.cfx
deleted file mode 100644
index 71ab497cc5..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Debug.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f26436234a598c2aa906653e711eb0e8ae14f99b65fc25eea0d238d9f56d914a
-size 4345
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DebugLight.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DebugLight.cfx
deleted file mode 100644
index cc9a79a324..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DebugLight.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bb0a8212530051bd6e4ac5646f6ab2f0a59f43a349ce8e03e544f6cf6d87ba4b
-size 1929
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredCaustics.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DeferredCaustics.cfx
deleted file mode 100644
index f477baa00c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredCaustics.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:24e1f7c4242c708a638a1069908f258fa26aa77152330a2c8da72260dd192209
-size 14703
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredRain.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DeferredRain.cfx
deleted file mode 100644
index 2e771c73bf..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredRain.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:77910f05ea15757e24201187a68a9a0db924f7951dadd4b7c7330f0845bd5944
-size 14043
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredShading.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DeferredShading.cfx
deleted file mode 100644
index 9252e1b06e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredShading.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4ab94af4462722c1a111f4199714fabd0addf095aba82840f92e6ef8b056d78c
-size 94446
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredShadows.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/DeferredShadows.cfi
deleted file mode 100644
index 63c8b33c21..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredShadows.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0641726ad6140704434896912f0e57e29e6f5e28ac2653bc97bbe7e2d444fbc2
-size 2828
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredSnow.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DeferredSnow.cfx
deleted file mode 100644
index 0789202955..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredSnow.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6ea4c40161f4f628fbf9cd1a3b7df445615dfa8ca15761a4fec15d0c2276b369
-size 22312
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DepthOfField.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DepthOfField.cfx
deleted file mode 100644
index 9a431fb20a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DepthOfField.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b67ece889d68d8ed6f891ca5cfb1f951a777616ea928b0e6f91bd541b35c62ff
-size 13136
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DistanceClouds.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DistanceClouds.cfx
deleted file mode 100644
index 7448f0304a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DistanceClouds.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a06a4a972542f51bea726578b26ef0fc711c4b6f4a77a31a383690717c5ccba2
-size 10622
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Eye.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Eye.cfx
deleted file mode 100644
index a3cb1227ea..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Eye.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fed5c2b72b2b4769954f2fad9573c6e35581c556e3a96685d449eea5576cf433
-size 19244
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FXConstantDefs.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/FXConstantDefs.cfi
deleted file mode 100644
index 7b0d7202e7..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FXConstantDefs.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1b6aa7281d2174f24b510a7ac820b4ab308a215d6b3eae4a039bc01e34b131ec
-size 9922
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FXSamplerDefs.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/FXSamplerDefs.cfi
deleted file mode 100644
index 7f5b097148..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FXSamplerDefs.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:750ac5a4ef25f1379121c7346dad0230d389c7c889ffdccbe6281a511b021cea
-size 4044
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FXStreamDefs.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/FXStreamDefs.cfi
deleted file mode 100644
index 4d05f905c1..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FXStreamDefs.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:073303aa45adc5ca237f33f29fb4de52f8b3c935912298cdec611128c510399c
-size 9279
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FallBack.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/FallBack.cfx
deleted file mode 100644
index 321440401b..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FallBack.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:052a458b7bdef6d7e1fa1a26d4cb66f6e24f91b9e42451a8e48045d3779aef1c
-size 2383
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FixedPipelineEmu.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/FixedPipelineEmu.cfx
deleted file mode 100644
index 8b92aa7399..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FixedPipelineEmu.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ab757a0df8246a0e9d20839a89219a6c616d6df054d72b21b79e459b8503ade8
-size 10188
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FogVolume.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/FogVolume.cfx
deleted file mode 100644
index 929d89ab5b..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FogVolume.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a37c2ab18b0ad1da90005c0ff9fea89d7c78ade9fd51b28b665cf42b814ecd8d
-size 23690
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Fur.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Fur.cfx
deleted file mode 100644
index 7d7405cc5e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Fur.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2f429a8537df95455e32da7fd480e79ef46751d6bc880c34b746c21515aa012a
-size 31609
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FurFinPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/FurFinPass.cfi
deleted file mode 100644
index 84149cb0f6..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FurFinPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e3f25ea475310f699442a160ffcc9f58c40e54b6570210dafbe41746a010b821
-size 15002
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FurObliteratePass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/FurObliteratePass.cfi
deleted file mode 100644
index 3ffe779a54..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FurObliteratePass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f6246f93aa73fdab460c1c82a33f2588a0ae83a162acdcdb12cec86ddac332b6
-size 5142
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FurZPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/FurZPass.cfi
deleted file mode 100644
index 5735035e49..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FurZPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fb0d83cc48ebee33b3d3db2b1a5c27636d35dfb7ce720e5391a28ff70ca0d729
-size 9023
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticle.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticle.cfi
deleted file mode 100644
index 6cd187c993..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticle.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b690c770f90e33dc78604b5beca3453aba4fbb4db8014b730680c33b5cef5120
-size 2299
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBegin.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBegin.cfx
deleted file mode 100644
index 3bc0dd3e01..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBegin.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:64c184691014423f2f6c518d34ff9657acc1dc8867e0e43d20b5526491d35d5b
-size 462
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSort.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSort.cfx
deleted file mode 100644
index 14c0b06c58..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSort.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a71929dda4a7b4516754286da5494546a0ea2075b9fde5cefef68f0a99d37381
-size 1520
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSortGlobal2048.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSortGlobal2048.cfx
deleted file mode 100644
index b8ff2e6afc..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSortGlobal2048.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a50144544a4c292d172d4bb9586a6016de4cc5b0a39958abfb00bc720e8c23e9
-size 1989
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSortLocal.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSortLocal.cfx
deleted file mode 100644
index 6ee0b7b645..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSortLocal.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:25d51818120964a1576f35727c0f13bc10a01727ab793f5fdf79cb9c1f7bf563
-size 2055
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleCurves.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleCurves.cfi
deleted file mode 100644
index a565d62cc4..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleCurves.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4308e81d4ee4c65480a1cf110f3f602d347f2899b4cf299f334c2659904329dd
-size 553
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleEmit.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleEmit.cfx
deleted file mode 100644
index 8d417c29ac..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleEmit.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bfe3a765c1057d5dfae514ba17d0ce99d6598693035df2037314da5f38e4c305
-size 19142
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleGatherSortDistance.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleGatherSortDistance.cfx
deleted file mode 100644
index 0a223398ff..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleGatherSortDistance.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f94a71dd8cbe95080f2de1bfa8cbd9443bea18106cc7bcae2c5c7225d113f2b4
-size 644
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleHelpers.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleHelpers.cfi
deleted file mode 100644
index a3b10d582b..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleHelpers.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cf39d59eefe2c6641437e9d535528edb29e1e0dad6d1b84b20662c7075928fe8
-size 6969
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleOddEvenSort.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleOddEvenSort.cfx
deleted file mode 100644
index be1e36e5db..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleOddEvenSort.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5cbcdd1c83247233dce9fb5c32e9d4530b23b825b284591a921a0b7e81d230ea
-size 1817
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleRenderNoGS.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleRenderNoGS.cfx
deleted file mode 100644
index 2d8fc2a1d0..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleRenderNoGS.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cae99346703f5ebc9bb59edb61c17b86184ae7659af78395ec4cba11cb6da471
-size 37741
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleUpdate.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleUpdate.cfx
deleted file mode 100644
index 7524f13c6f..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleUpdate.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8a3a7bb8ad18d99c7490d15ce24b3c4867d9668b1539014a31b3ba5e80ebb00e
-size 25753
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GeometryBeam.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GeometryBeam.cfx
deleted file mode 100644
index 364f613063..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GeometryBeam.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:45e7f387bb7cc9d7a489916b27ea6bff816510664099008ebbeaa0d10a26faa7
-size 12612
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Glass.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Glass.cfx
deleted file mode 100644
index 38226fedec..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Glass.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:49aa341aa2563ced85aa4f62f74865c558238c91ba9d8d62ad21392088755820
-size 26913
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HDRDolbyMetadataPass0.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/HDRDolbyMetadataPass0.cfx
deleted file mode 100644
index b2df095b8a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HDRDolbyMetadataPass0.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c7f9297a483fd7d7b91a3f06f1a3eb83e77192b967691f4e2119d41b7a7afdd2
-size 2707
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HDRDolbyMetadataPass1.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/HDRDolbyMetadataPass1.cfx
deleted file mode 100644
index 25c959c8f6..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HDRDolbyMetadataPass1.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:52d68438b25fbd2d88a7247295a021680a9b95a6f3ed07c3ae066cb3d44b25ed
-size 2530
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HDRPostProcess.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/HDRPostProcess.cfx
deleted file mode 100644
index 76e692fa63..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HDRPostProcess.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5cf8d27075f4aa76e5814d1c4a9718d7106df50229f33e1d8d7d7a4532d1e5f3
-size 40838
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HDRPostProcessDolby.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/HDRPostProcessDolby.cfi
deleted file mode 100644
index b8c0c3043c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HDRPostProcessDolby.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2e62a2aa829af58b2ba19a9920bd87d64a27854d24de5a51842740c7ec1e9ae8
-size 33567
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Hair.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Hair.cfx
deleted file mode 100644
index 4788d26a0e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Hair.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:eb56b0070f3811f1b8780e70d4b9410a08f3aac9f8fa3e947194a4d902c9d8ef
-size 33265
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Helper.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Helper.cfx
deleted file mode 100644
index 5c19cc54e0..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Helper.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9764bb3ab6d2895a355466f3c53f735c3500006420bac211bc9a0b7c29a605c6
-size 2168
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Hud3D.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Hud3D.cfx
deleted file mode 100644
index c460d0468c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Hud3D.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c63de566d2a5a69781a4c1e16958d64d187e057f3447afb4ec9aa47455ef7a5c
-size 9617
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkin.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkin.cfx
deleted file mode 100644
index ff2a2b894a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkin.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b81300b59d42b38b7669016cc8920db9adbf07b612f12d520d9480a6de59aa73
-size 18648
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkinTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkinTess.cfi
deleted file mode 100644
index 8f7ce5f8c9..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkinTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a79996ad61013920dcccd254f23e05fb4089879d477d8f3ce00ff98ee04d6ec1
-size 7783
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkinValidations.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkinValidations.cfi
deleted file mode 100644
index 9743568b4d..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkinValidations.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:548f2cc401046358ef4f4edeb37532f06437b99b2fe5bff70100e66a6ecb281a
-size 986
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Illum.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Illum.cfx
deleted file mode 100644
index 6de2f49547..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Illum.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3c110e0891fbe46a10f2fbcf4ffb8f82c0711ffaa943fac5ca92c96f7e63d051
-size 28796
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/IllumTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/IllumTess.cfi
deleted file mode 100644
index ef66d513a9..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/IllumTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9a52e2256a43707dfab74c680e96249d27e7eb38a2984c9d4dcff83ffe7dd15b
-size 5194
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/IllumValidations.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/IllumValidations.cfi
deleted file mode 100644
index 7af7a4748c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/IllumValidations.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4155e44e6687796095b5e2401c93a09e527c61a48830e8a35d4ab16d849d8159
-size 2031
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/LensOptics.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/LensOptics.cfx
deleted file mode 100644
index ab20cc3bc7..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/LensOptics.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7acdc1aaa28aea83d9af53547f65c5686b2fc43be988068d8f4f88c87c4359a7
-size 16847
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Light.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Light.cfx
deleted file mode 100644
index ebbe8183bf..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Light.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4436686d0f3e735973df2dd56523269683c66b3ae01da67fa7f41e5f9e1b1234
-size 12760
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/LightBeam.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/LightBeam.cfx
deleted file mode 100644
index e19414deef..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/LightBeam.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:13c69186729534dcd2676d1740a530fb5d5a3307d7b713f5c08704220186ba6d
-size 14169
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/LightVolumes.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/LightVolumes.cfi
deleted file mode 100644
index 4ab290bb32..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/LightVolumes.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f79e6c1e182e86afd295758f0afefc901407e69eb3f93422d8a3089451e49c7d
-size 5526
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/MeshBaker.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/MeshBaker.cfi
deleted file mode 100644
index 5f019eca9a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/MeshBaker.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0ca1d710fd2b0937a04ded739ab4dc35ff48e3ff0c07d6a5d4df95f32a1947a4
-size 5032
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/MeshBakerDilate.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/MeshBakerDilate.cfx
deleted file mode 100644
index 59ff9363a5..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/MeshBakerDilate.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7a7db4ca9b7d87e4c3410df26f3045a18fb96a2535b88ab8afe00dcf1d621943
-size 4173
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ModificatorTC.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/ModificatorTC.cfi
deleted file mode 100644
index 6d0fd6bb42..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ModificatorTC.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0eb9c63a60a3d2afb78d6e4077ac81322dbd1a0537f5551c638d57c353381e15
-size 5256
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ModificatorVT.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/ModificatorVT.cfi
deleted file mode 100644
index fff9af0b52..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ModificatorVT.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:dd0aecf5b1620c49a9b08c35865ea8de5487098f1eed8374fa4fc85e4a87e886
-size 52858
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Monitor.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Monitor.cfx
deleted file mode 100644
index 840da6f035..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Monitor.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:758aa594628cd94f10d379f08a9a0a63478cc69eb9a093404d57c46e6830150a
-size 19450
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/MotionBlur.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/MotionBlur.cfx
deleted file mode 100644
index b6ba57f9f3..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/MotionBlur.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8b4f6c44e52297c1dfe02040a7e63739aeed73f2c2c4930053f5a83c3c73f816
-size 8716
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/MultiLayerAlphaBlend.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/MultiLayerAlphaBlend.cfi
deleted file mode 100644
index 751d38bde8..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/MultiLayerAlphaBlend.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:01f08e32bfb1f8690759da687114e66bf6652b6d17b208ed1b316315f0a66a1b
-size 6435
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/NoDraw.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/NoDraw.cfx
deleted file mode 100644
index a4a038ac28..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/NoDraw.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1d183abe91463d2ab90f56c055a44aa8c3cad1d731f51c9f56bd6f9df3d7eba1
-size 180
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/OcclusionTest.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/OcclusionTest.cfx
deleted file mode 100644
index 7f1b7bf522..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/OcclusionTest.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1ceef3fd50e977ba168e2f80803bc0a09542aa3c55721e0e6e27bbab45454607
-size 1545
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ParticleImposter.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ParticleImposter.cfx
deleted file mode 100644
index 0506b14d5e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ParticleImposter.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b67b9997024270cfdede2d057220078029db61ab5dff6d522a39c99d08420245
-size 8657
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ParticleVT.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/ParticleVT.cfi
deleted file mode 100644
index bbe4d0c261..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ParticleVT.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:670e9dd98f131fa0375ddcc4df8fe850eeabb43f9771d302b5c8e2fd7022d78d
-size 8534
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Particles.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/Particles.cfi
deleted file mode 100644
index 6f38a8eae7..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Particles.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:98f62a7869360e63083eea9a784652ad0fca13a9cd741930940be75c10ca83e7
-size 40918
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Particles.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Particles.cfx
deleted file mode 100644
index 728135d83c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Particles.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:55bcc8a634262b6001193fabf318cdf2960904dd47e915fa17de3a60c620639d
-size 4613
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesCustomPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesCustomPass.cfi
deleted file mode 100644
index 7f90f9f1a5..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesCustomPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:af77abd5a2d462e4b533e6e5b489bc8e39909527c64a9cd599bbf5312b3aa17a
-size 6052
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesNoMat.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesNoMat.cfx
deleted file mode 100644
index 3728b1f379..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesNoMat.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:db6f21607b4ce4e0d0a48ffa0a7db81f29ac0546c76846dd39f1fc584f7d23e5
-size 1517
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesNoMatMirror.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesNoMatMirror.cfx
deleted file mode 100644
index 955c99c3e9..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesNoMatMirror.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4f8178b44fc27aacde3600b86bc06038aefbac6ca4fbf4fbe29f32ca6e8e0584
-size 1603
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesShadowPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesShadowPass.cfi
deleted file mode 100644
index 461f4d40ac..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesShadowPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0c7c5e176c6f0a5f689bc433dd23d5bb998f8f10d4185c30cb9788022ebb38a0
-size 6464
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/PostAA.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/PostAA.cfx
deleted file mode 100644
index d8ae4939e4..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/PostAA.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7a10320d3b31738cc0154de2c973fcaf912885209a7e729e3f6bd372f7633354
-size 67647
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/PostEffects.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/PostEffects.cfx
deleted file mode 100644
index 95269fe06c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/PostEffects.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ec164683d3fe45a512c0e9a2314c5b450602ee8c8a8281d99d43c1d76a761df3
-size 60596
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/PostEffectsGame.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/PostEffectsGame.cfx
deleted file mode 100644
index efaa765189..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/PostEffectsGame.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a6d66a0aed7f39e3848ee4763c408c390ec7021205cf2f0f07459b99d84f1d27
-size 80783
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/PostEffectsLib.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/PostEffectsLib.cfi
deleted file mode 100644
index 90ce479d4a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/PostEffectsLib.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b73c3ae905c1833cade569500b647dc504e83b34f15a4584f72a372d254d884f
-size 8502
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ReferenceImage.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ReferenceImage.cfx
deleted file mode 100644
index 08b3c94d06..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ReferenceImage.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:12d61af66003a6ab90e24574925fd94bc03622386da142fcaa655df21b0fd5bd
-size 2033
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ReferenceImageHDR.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ReferenceImageHDR.cfx
deleted file mode 100644
index aaa0a26a21..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ReferenceImageHDR.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1c4913b73fec9ebdcd5b8e7c86d495b7dc9a135e7f8a77ee90b9e62a78d3cc47
-size 1819
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Scopes.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Scopes.cfx
deleted file mode 100644
index 7be1e74629..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Scopes.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4565c5415b0a68ced049335d803fcfdbf899db4ea914b8fbc5ba34620e4c4045
-size 10709
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ShadowBlur.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ShadowBlur.cfx
deleted file mode 100644
index ad707f2932..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ShadowBlur.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3a6eafe0f42be55811eda4ac6b164bd01e22b6cc2b77723a8693549b26939871
-size 10768
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ShadowCommon.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/ShadowCommon.cfi
deleted file mode 100644
index fbaa4d7f65..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ShadowCommon.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ddac405a61300a0857cba4ea7dabcb6d5aef5253ada53d09ec4ab591ed3cfbce
-size 25680
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ShadowMaskGen.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ShadowMaskGen.cfx
deleted file mode 100644
index 36b7604c43..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ShadowMaskGen.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2aec8020aa2454b8a0cd406198bd2c067f878cb697dad2e2059e88c7cb2e5e87
-size 32118
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Sketch.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Sketch.cfx
deleted file mode 100644
index 60d4aa0f4a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Sketch.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1ba3cc8b5127ccb8a446e0ac85daf0b13c700092bcdcbdd92d5fbf45dfd430dc
-size 11176
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/SketchTerrain.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/SketchTerrain.cfx
deleted file mode 100644
index f8ff66d760..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/SketchTerrain.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b247b792e8e26abb50c2c01e9bc6c341216f6a84fc3fac67088294cf868428ab
-size 2992
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Sky.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Sky.cfx
deleted file mode 100644
index 06ec9fc6f1..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Sky.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7fec7735636fa7a4c2387e216918ec92414bc29ec6ecbd89605677214f829403
-size 4830
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/SkyHDR.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/SkyHDR.cfx
deleted file mode 100644
index 48b47a9ae1..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/SkyHDR.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3195bdf90fa2a0b1539f0cac7471dc31ec7aa783d138f9c0455a32354ead3874
-size 8548
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/SoftOcclusionQuery.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/SoftOcclusionQuery.cfx
deleted file mode 100644
index 425102e21d..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/SoftOcclusionQuery.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c82e35c6af179bb2405bbfe1d452ae2a8c5479934c0c9d8e8119d04db35d8cf5
-size 3546
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Stars.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Stars.cfx
deleted file mode 100644
index 4fdbddb2c6..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Stars.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c5f191743c706e8531bada03abab8700c01cc9afbff0c9ea22c41d509b11ee76
-size 4075
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/StarterGame_GeometryBeamScaling.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/StarterGame_GeometryBeamScaling.cfx
deleted file mode 100644
index a5a51340fc..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/StarterGame_GeometryBeamScaling.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:888486a516d3052e6b8b01cc0d36f01a68985ed482db683a25527c220290cc6c
-size 13217
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Stereo.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Stereo.cfx
deleted file mode 100644
index 8ef249a60f..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Stereo.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:761402eba9c7256a79fe78869b0287b95a8be8f810b48e41222049425b2eb535
-size 5422
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Sunshafts.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Sunshafts.cfx
deleted file mode 100644
index 2274352ec3..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Sunshafts.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9a162b22e9ee5dc42559c8bcd4a6160c8b227bfeb6a5b367b62b8256109b99b5
-size 8884
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/TemplBeamProc.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/TemplBeamProc.cfx
deleted file mode 100644
index 1a2de2a0dd..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/TemplBeamProc.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:aed5eeb5e7467884319e268f985134f0d50482408cdbda6359873d211387737c
-size 7182
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Terrain.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Terrain.cfx
deleted file mode 100644
index 22abec6b24..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Terrain.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e4d2246d81afaad43e267addffdc01ce201dc4032bf5e05131cfb9f56ebc5ed0
-size 19043
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/TerrainValidations.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/TerrainValidations.cfi
deleted file mode 100644
index 1c8349f673..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/TerrainValidations.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3956d70a7eff854ab02d44f6c712cdb694045e87e9a0201ad8427436c693897a
-size 707
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/TiledShading.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/TiledShading.cfi
deleted file mode 100644
index ebc1521531..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/TiledShading.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:72448b07701ad745e35d98de2229f0675cbb74bd6d40095ec4625929da906c5f
-size 50201
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Total_Illumination.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Total_Illumination.cfx
deleted file mode 100644
index 9b2c8e38dc..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Total_Illumination.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c73e03d1e09efd2e8cdb9292debb5260a0690772c81a9dbb085502f822b7f91b
-size 38227
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/UI.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/UI.cfx
deleted file mode 100644
index e98a5a2fae..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/UI.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c2b7a3ff846dde2ba481e46180e67e81528fa2a984ba6bb1a5c83304c301551d
-size 7717
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Vegetation.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Vegetation.cfx
deleted file mode 100644
index 0bca5a3e53..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Vegetation.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6c330b2ecb3d850e5eeb3673500cdebb95bee46b92eb93c3274291dbf96b2c98
-size 25807
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/VegetationTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/VegetationTess.cfi
deleted file mode 100644
index 5abc5af104..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/VegetationTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:28aadc74c027782d5971e8145d3286f733fcbb571872447f638397df4f957765
-size 5746
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/VegetationValidations.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/VegetationValidations.cfi
deleted file mode 100644
index 00d2e11b8f..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/VegetationValidations.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c05fb764a9fbc9cf7ea7b225680880c32847f4d355cab27f958564d5adcfc21b
-size 1167
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Video.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Video.cfx
deleted file mode 100644
index 966c5d92f6..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Video.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8c1c4e2eed305e2319127d12349754819350301b42d33cb109def7237c3591f1
-size 2123
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/VolumeLighting.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/VolumeLighting.cfi
deleted file mode 100644
index 77cb40a98f..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/VolumeLighting.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:515e3218c9b23e8ff4d67a200ca11b3c833ad3999500f7f8be4ecdc5c01d5565
-size 82057
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/VolumeObject.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/VolumeObject.cfx
deleted file mode 100644
index 2ca573741e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/VolumeObject.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a1fa34bd8cd7d8df9089739c7adf62b95c64f3d0993dcb2ee3892e05e118e83c
-size 6700
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/VolumetricFog.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/VolumetricFog.cfi
deleted file mode 100644
index 2556067f04..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/VolumetricFog.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3dd1721686abf6fe824df07a5e8ee1505b0fbcbaec6dc1a8ded98274d6ea4058
-size 25814
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Water.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Water.cfx
deleted file mode 100644
index 175960ffc2..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Water.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d3ebab64f075124eb4cf426fee1c9ac446225ed647db3f10a28a28b1efaa5e63
-size 41727
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/WaterCausticsPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/WaterCausticsPass.cfi
deleted file mode 100644
index 5aa4d40dff..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/WaterCausticsPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9f73053b56ef452bf8ae72a4cc6fed59876562d9f4541172265ce6c8d5740711
-size 3340
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/WaterFogVolume.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/WaterFogVolume.cfx
deleted file mode 100644
index eda54be33e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/WaterFogVolume.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9f9d26a36eb0fa05b58991aaaa6a073621309aa8a4a06a5bb4a6048b507a3fe1
-size 18306
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/WaterOceanBottom.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/WaterOceanBottom.cfx
deleted file mode 100644
index 90cf67ba52..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/WaterOceanBottom.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5266c69503cb72e831e5c488332237fbfd343f96708ea3c75037780bd62fed60
-size 5280
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/WaterReflectionsPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/WaterReflectionsPass.cfi
deleted file mode 100644
index a2ffd3d2a8..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/WaterReflectionsPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bb1ba5273a487655f813688f0a8500c662348639414ac53a0b0ee3d911010eab
-size 10008
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/WaterVolume.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/WaterVolume.cfx
deleted file mode 100644
index 7985e3dab0..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/WaterVolume.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:41c19dceb8daa6e9a9102b83c78208d6f0681066f5d6c2cf2e657a82e1ce695c
-size 39737
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Waterfall.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Waterfall.cfx
deleted file mode 100644
index d09922f322..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Waterfall.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ebece6e3b0115174da434ed1b166b7209c012a6013e219e2421ffee5ebd6dda1
-size 11237
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/fragLib.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/fragLib.cfi
deleted file mode 100644
index ffba873be1..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/fragLib.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3a340c8cbb76900b02bc171e680cfdc628900a5c38ecd3ce6a7b9eecbafa72ef
-size 23148
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/shadeLib.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/shadeLib.cfi
deleted file mode 100644
index b2633fd0da..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/shadeLib.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b33f5a65661f977c15047dea6b01809a1ebab5dbd6c7299a0e2888c2de8a911b
-size 59794
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/vertexLib.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/vertexLib.cfi
deleted file mode 100644
index 66def251da..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/vertexLib.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8b577a8c20b7cc94e1c97909487b3a0986b47882502e120fc518880883e04435
-size 15666
diff --git a/Assets/Engine/Shaders/Hair.ext b/Assets/Engine/Shaders/Hair.ext
deleted file mode 100644
index 975e29323e..0000000000
--- a/Assets/Engine/Shaders/Hair.ext
+++ /dev/null
@@ -1,111 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Hair shader extension used by the editor
-// for automatic shader generation (based on "Hair" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %VERTCOLORS
- Mask = 0x10
- Property (Vertex Colors)
- Description (Use vertex colors)
-}
-
-Property
-{
- Name = %HAIR_PASS
- Mask = 0x20
- Property (Hair Pass)
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %ANISO_SPECULAR
- Mask = 0x40
- Property (Anisotropic specular)
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %DIRECTION_MAP
- Mask = 0x200
- Property (Direction map)
- Description (Use direction map as separate texture)
- DependencySet = $TEX_Detail
- DependencyReset = $TEX_Detail
- Hidden
-}
-
-Property
-{
- Name = %VIEW_ALIGNED_STRANDS
- Mask = 0x800
- Property (View aligned strands)
- Description (View aligned cards that get extruded from thin quads with texture u-coords 0 and 1)
-}
-
-Property
-{
- Name = %THIN_HAIR
- Mask = 0x1000
- Property (Thin hair)
- Description (Thin alpha-blended hair)
-}
-
-Property
-{
- Name = %HAIR_AMBIENT
- Mask = 0x2000
- Property (Ambient cubemap)
- Description (Use (nearest) cubemap specified in environment map slot for ambient lighting)
- DependencyReset = $TEX_EnvCM
-}
-
-Property
-{
- Name = %ENFORCE_TILED_SHADING
- Mask = 0x4000
- Property (Enforce tiled shading)
- Description (Force hair to be fully affected by tiled shading. This can be expensive for dense hair meshes.)
-}
-
-Property
-{
- Name = %WIND_BENDING
- Mask = 0x40000000
- Property (Wind bending)
- Description (Gets affected by wind entities. Use extra shader parameters to tweak look.)
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/HumanSkin.ext b/Assets/Engine/Shaders/HumanSkin.ext
deleted file mode 100644
index 92429316ea..0000000000
--- a/Assets/Engine/Shaders/HumanSkin.ext
+++ /dev/null
@@ -1,116 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Skin shader extension used by the editor
-// for automatic shader generation (based on "Skin" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x2
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %WRINKLE_BLENDING
- Mask = 0x200
- Property (Wrinkle blending)
- Description (Use subsurface map alpha for wrinkle blending)
- DependencyReset = $TEX_Custom
- DependencyReset = $TEX_CustomSecondary
-}
-
-Property
-{
- Name = %TEMP_SKIN
- Mask = 0x1000
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %DECAL_MAP
- Mask = 0x2000
- Property (Decal map)
- Description (Use a decal map which is blended on top of the diffuse map)
-}
-
-Property
-{
- Name = %DETAIL_MAPPING
- Mask = 0x20000
- Property (Detail normal-map)
- Description (Tiled detail normal-map for pores and tiny details (_ddn))
-}
-
-Property
-{
- Name = %SUBSURFACE_SCATTERING_MASK
- Mask = 0x40000
- Property (Subsurface Scattering Mask)
- Description (Use diffuse map alpha as subsurface scattering amount multiplier)
-}
-
-#ifdef FEATURE_MESH_TESSELLATION
-Property
-{
- Name = %DISPLACEMENT_MAPPING
- Mask = 0x10000000
- Property (Displacement mapping)
- Description (Use displacement mapping (requires height map (_displ)))
- //DependencySet = $TEX_Height
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %PHONG_TESSELLATION
- Mask = 0x20000000
- Property (Phong tessellation)
- Description (Use rough approximation of smooth surface subdivision)
-}
-
-Property
-{
- Name = %PN_TESSELLATION
- Mask = 0x40000000
- Property (PN triangles tessellation)
- Description (Use rough approximation of smooth surface subdivision)
-}
-#endif
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/Illum.ext b/Assets/Engine/Shaders/Illum.ext
deleted file mode 100644
index edce2900d2..0000000000
--- a/Assets/Engine/Shaders/Illum.ext
+++ /dev/null
@@ -1,243 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Illumination shader extension used by the editor
-// for automatic shader generation (based on "Illumination" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x10
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %DETAIL_MAPPING
- Mask = 0x4000
- Property (Detail mapping)
- Description (Enables Detail Map texture to increase surface detail. Requires Detail map before enabling.)
- DependencyReset = $TEX_Detail
-}
-
-Property
-{
- Name = %DETAIL_MAPPING_UV_SET_2
- Mask = 0x8000
- Property (Use uv set 2 for detail map)
- Description (Detail map will be applied to second UV set on mesh)
-}
-
-Property
-{
- Name = %OFFSET_BUMP_MAPPING
- Mask = 0x20000
- Property (Offset bump mapping)
- Description (Simulates surface bump detail. Used in place of POM for lower spec configs. Requires height and normal maps before enabling.)
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %FX_DISSOLVE
- Mask = 0x20
- Property (Dissolve FX)
- Description (Enables the use of an animated dissolve effect on the material)
-}
-
-Property
-{
- Name = %VERTCOLORS
- Mask = 0x400000
- Property (Vertex Colors)
- Description (Enables the use of vertex colors added to the mesh in the DCC tool)
-}
-
-Property
-{
- Name = %DECAL
- Mask = 0x2000000
- Property (Decal)
- Description (Enables the decal opacity map and used to prevent flickering and z-fighting)
-}
-
-Property
-{
- Name = %PARALLAX_OCCLUSION_MAPPING
- Mask = 0x8000000
- Property (Parallax occlusion mapping)
- Description (Simulates surface depth by parallaxing bump detail from camera view. Requires height and normal maps before enabling.)
- DependencyReset = $TEX_Normals
-}
-
-#ifdef FEATURE_MESH_TESSELLATION
-Property
-{
- Name = %DISPLACEMENT_MAPPING
- Mask = 0x10000000
- Property (Displacement mapping)
- Description (Displaces the vertices on the mesh to add depth. Requires height and normal maps before enabling.)
- //DependencySet = $TEX_Height
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %PHONG_TESSELLATION
- Mask = 0x20000000
- Property (Phong tessellation)
- Description (Tesselates geometry for smoother faces and displacement. Can suffer from inflation.)
-}
-
-Property
-{
- Name = %PN_TESSELLATION
- Mask = 0x40000000
- Property (PN triangles tessellation)
- Description (Best geometry tesselation for smoother faces and displacement at the cost of perfornmance)
-}
-#endif
-
-Property
-{
- Name = %BLENDLAYER
- Mask = 0x100
- Property (Blendlayer)
- Description (Enables a second set of texture inputs and mask to be used for a layered material)
-}
-
-Property
-{
- Name = %BLENDLAYER_UV_SET_2
- Mask = 0x200
- Property (Use uv set 2 for blendlayer maps)
- Description (Second blend layer maps will be applied to second UV set on mesh)
-}
-
-Property
-{
- Name = %EMITTANCE_MAP
- Mask = 0x400
- Property (Emittance Map)
- Description (Use emittance map texture)
- DependencySet = $TEX_Emittance
- DependencyReset = $TEX_Emittance
- Hidden
-}
-
-Property
-{
- Name = %EMITTANCE_MAP_UV_SET_2
- Mask = 0x800
- Property (Use uv set 2 for emittance map)
- Description (Emittance map will be applied to second UV set on mesh)
-}
-
-Property
-{
- Name = %ALPHAMASK_DETAILMAP
- Mask = 0x800000
- Property (DetailMap mask in Diffuse alpha)
- Description (Enables the diffuse map alpha to mask the detail map)
-}
-
-Property
-{
- Name = %SILHOUETTE_PARALLAX_OCCLUSION_MAPPING
- Mask = 0x10000
- Property (Silhouette POM)
- Description (Simulates surface depth by parallaxing bump detail and adds silhouette displacement to the mesh edge. Requires height and normal maps before enabling.)
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %ALLOW_SILHOUETTE_POM
- Mask = 0x40000
- DependencySet = $HW_SilhouettePom
- DependencyReset = $HW_SilhouettePom
- Hidden
-}
-
-Property
-{
- Name = %SUBSURFACE_SCATTERING
- Mask = 0x80000
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %DEPTH_FIXUP
- Mask = 0x4000000
- Property (Depth Fixup)
- Description (Enables to write and control depth for post-processing like depth of field)
-}
-
-Property
-{
- Name = %SAA_FILTERING
- Mask = 0x80000000
- Property (Specular Antialiasing)
- Description (Reduces antialiasing on bright specular meshes)
-}
-
-Property
-{
- Name = %ALLOW_SPECULAR_ANTIALIASING
- Mask = 0x200000000
- DependencySet = $HW_SpecularAntialiasing
- DependencyReset = $HW_SpecularAntialiasing
- Hidden
-}
-
-Property
-{
- Name = %OCCLUSION_MAP
- Mask = 0x40
- Property (Occlusion Map)
- Description (Adds an additional texture slot for ambient occlusion)
-}
-
-Property
-{
- Name = %APPLY_FORWARD_DYNAMIC_LIGHTING
- Mask = 0x400000000
- Property(Dynamic Lighting for Transparency)
- Description(Adds a full forward lighting pass for transparent objects - less performant)
-}
diff --git a/Assets/Engine/Shaders/LensOptics.ext b/Assets/Engine/Shaders/LensOptics.ext
deleted file mode 100644
index 5bd18e3895..0000000000
--- a/Assets/Engine/Shaders/LensOptics.ext
+++ /dev/null
@@ -1,16 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
diff --git a/Assets/Engine/Shaders/LightBeam.ext b/Assets/Engine/Shaders/LightBeam.ext
deleted file mode 100644
index 835a0dbc99..0000000000
--- a/Assets/Engine/Shaders/LightBeam.ext
+++ /dev/null
@@ -1,44 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: LightBeam shader extension used by the editor
-// for automatic shader generation (based on "LightBeam" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %NOISE
- Mask = 0x1
- Property (Noise map)
- Description (Use 3D noise)
-}
-
-Property
-{
- Name = %FALLOFF
- Mask = 0x2
- Property (Use Falloff)
- Description (Use Falloff)
-}
-
-Property
-{
- Name = %DOUBLE_SAMPLING
- Mask = 0x4
- Property (Extra Sampling)
- Description (Add expense to reduce aliasing)
-}
diff --git a/Assets/Engine/Shaders/Monitor.ext b/Assets/Engine/Shaders/Monitor.ext
deleted file mode 100644
index 2a20138c1f..0000000000
--- a/Assets/Engine/Shaders/Monitor.ext
+++ /dev/null
@@ -1,53 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Monitor shader extension used by the editor
-// for automatic shader generation
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-
-Version (1.00)
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x2
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %PIXELIZE
- Mask = 0x4
- Property (Pixelized)
- Description (Pixelize the diffuse texture.)
-}
-
diff --git a/Assets/Engine/Shaders/ParticleImposter.ext b/Assets/Engine/Shaders/ParticleImposter.ext
deleted file mode 100644
index 650541cfa3..0000000000
--- a/Assets/Engine/Shaders/ParticleImposter.ext
+++ /dev/null
@@ -1,37 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SOFT_PARTICLE
- Mask = 0x2
- Property (Soft Particle)
- Description (Soften particle intersections with world)
-}
diff --git a/Assets/Engine/Shaders/Particles.ext b/Assets/Engine/Shaders/Particles.ext
deleted file mode 100644
index 3f24ea84b7..0000000000
--- a/Assets/Engine/Shaders/Particles.ext
+++ /dev/null
@@ -1,102 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Particles shader extension used by the editor
-// for automatic shader generation (based on "Particles" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %REFRACTION
- Mask = 0x4
- Property (Refraction)
- Description (Use normal-map texture as displacement for refraction)
-}
-
-Property
-{
- Name = %REFRACTION_TINTING
- Mask = 0x800
- Property (Refraction Tinting)
- Description (Use color texture to tint refraction)
-}
-
-Property
-{
- Name = %SCREEN_SPACE_DEFORMATION
- Mask = 0x10
- Property (Screen space deformation)
- Description (Use custom slot map for screen space particles deformation)
- DependencyReset = $TEX_Custom
-}
-
-Property
-{
- Name = %DEFORMATION
- Mask = 0x20
- Property (Deformation)
- Description (Use custom slot map for per-particle deformation)
- DependencyReset = $TEX_Custom
-}
-
-Property
-{
- Name = %COLOR_LOOKUP
- Mask = 0x40
- Property (Color lookup)
- Description (Use custom slot [1] map for applying color lookup)
- DependencyReset = $TEX_CustomSecondary
-}
-
-Property
-{
- Name = %SPECULAR_LIGHTING
- Mask = 0x100
- Property (Specular Lighting)
- Description (Calculate specular lighting in addition to diffuse lighting)
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %DEPTH_FIXUP
- Mask = 0x200
- Property (Depth Fixup)
- Description (Write depth for depth of field and postprocessing)
-}
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x400
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %GLOW_MAP
- Mask = 0x1000
- Property (Emissive map)
- Description (Use this map to mask the particle emissive intensity)
- DependencySet = $TEX_Detail
- DependencyReset = $TEX_Detail
- Hidden
-}
diff --git a/Assets/Engine/Shaders/RunTime.ext b/Assets/Engine/Shaders/RunTime.ext
deleted file mode 100644
index 9cc96769d5..0000000000
--- a/Assets/Engine/Shaders/RunTime.ext
+++ /dev/null
@@ -1,1259 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description:
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %_RT_FOG
- Mask = 0x1 // 1 << 0
- Precache = GeneralPS
- Precache = GeneralVS
- Precache = GeneralGS
- Precache = GeneralDS
- Precache = GeneralHS
- Precache = TerrainPS
- Precache = TerrainVS
- Precache = VegetationVS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationPS
- Precache = SkinPS
- Precache = SkinVS
- Precache = HairPS
- Precache = HairVS
- Precache = EyePS
- Precache = EyeVS
- Precache = GlassPS
- Precache = GlassVS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = CustomRenderHS
- Precache = CustomRenderDS
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
- Precache = WaterFogVolume_VS
- Precache = WaterFogVolume_PS
- Precache = MeshBakerPS
- Precache = ParticleImposterVS
- Precache = ParticleImposterPS
-}
-
-Property
-{
- Name = %_RT_AMBIENT
- Mask = 0x2 // 1 << 1
- Precache = GeneralPS
- Precache = SkinPS
- Precache = HairPS
- Precache = EyePS
- Precache = GlassPS
- Precache = TerrainPS
- Precache = VegetationPS
- Precache = ParticlePS
- Precache = MeshBakerPS
-}
-
-Property
-{
- Name = %_RT_OCEAN_PARTICLE
- Mask = 0x4 // 1 << 2
- Precache = PostProcessGamePS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
-
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
- Precache = WaterFogVolume_PS
-}
-
-Property
-{
- //Using the same mask as _RT_OCEAN_PARTICLE as we have run out of them.
- //It should be safe to do this as this flag is not used in water rendering
- Name = %_RT_DEPTHFIXUP
- Mask = 0x4 // 1 << 2
- Precache = FurShellPS
- Precache = GlassPS
- Precache = IlluminationPS
- Precache = GeneralPS
-}
-
-Property
-{
- Name = %_RT_DECAL_TEXGEN_2D
- Mask = 0x8 // 1 << 3
- Precache = GeneralVS
- Precache = GeneralDS
- Precache = GeneralHS
- Precache = ShadowGenVS
- Precache = CausticsVS
- Precache = GeneralPS
- Precache = CustomRenderHS
- Precache = CustomRenderDS
- Precache = ZVS
- Precache = ZPS
- Precache = MeshBakerPS
- Precache = TiledShadingCS
-}
-
-Property
-{
- Name = %_RT_DISSOLVE
- Mask = 0x10 // 1 << 4
- Precache = ZPS
- Precache = ZVS
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = GeneralPS
- Precache = GeneralVS
-}
-
-Property
-{
- Name = %_RT_VOLUMETRIC_FOG
- Mask = 0x20 // 1 << 5
- Precache = GeneralPS
- Precache = GeneralVS
- Precache = GeneralGS
- Precache = GeneralDS
- Precache = GeneralHS
- Precache = TerrainPS
- Precache = TerrainVS
- Precache = VegetationVS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationPS
- Precache = SkinPS
- Precache = SkinVS
- Precache = HairPS
- Precache = HairVS
- Precache = EyePS
- Precache = EyeVS
- Precache = GlassPS
- Precache = GlassVS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = WaterSurfacePS
- Precache = WaterFogVolume_VS
- Precache = WaterFogVolume_PS
- Precache = MeshBakerPS
- Precache = CloudVS
- Precache = CloudPS
- Precache = FogPostProcessPS
- Precache = ParticleImposterVS
- Precache = ParticleImposterPS
-}
-
-Property
-{
- Name = %_RT_NEAREST
- Mask = 0x40 // 1 << 6
- Precache = ShadowGenVS
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
- Precache = ZVS
- Precache = MotionBlurVS
- Precache = SkinVS
- Precache = GeneralVS
- Precache = VegetationVS
- Precache = CausticsVS
- Precache = CustomRenderVS
- Precache = DebugPassVS
-}
-
-Property
-{
- Name = %_RT_GLOBAL_ILLUMINATION
- Mask = 0x80 // 1 << 7
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_ALPHATEST
- Mask = 0x100 // 1 << 8
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = ZPS
- Precache = ZVS
- Precache = MotionBlurPS
- Precache = CustomRenderPS
- Precache = VegetationVS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationPS
- Precache = GeneralPS
- Precache = GlassPS
- Precache = GlassVS
- Precache = MotionBlurVS
- Precache = MeshBakerPS
-}
-
-Property
-{
- Name = %_RT_SOFT_PARTICLE
- Mask = 0x200 // 1 << 9
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_HDR_MODE
- Mask = 0x400 // 1 << 10
- Precache = GeneralPS
- Precache = TerrainPS
- Precache = VegetationPS
- Precache = SkinPS
- Precache = HairPS
- Precache = EyePS
- Precache = GlassPS
- Precache = ParticlePS
- Precache = WaterSurfacePS
- Precache = ParticleImposterPS
-}
-
-Property
-{
- Name = %_RT_PARTICLE_SHADOW
- Mask = 0x800 // 1 << 11
- Precache = ParticlePS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
-}
-
-Property
-{
- Name = %_RT_SAMPLE1
- Mask = 0x1000 // 1 << 12
- Precache = CustomRenderHS
- Precache = CustomRenderDS
- Precache = CustomRenderVS
- Precache = CustomRenderPS
- Precache = SkinPS
- Precache = HDRPostProcessPS
- Precache = PostMotionBlurVS
- Precache = PostMotionBlurPS
- Precache = PostSunShaftsPS
- Precache = PostProcessGamePS
- Precache = PostDofPS
- Precache = PostEffectsVS
- Precache = PostEffectsPS
- Precache = PostAA_PS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = PostHUD3D_VS
- Precache = PostHUD3D_PS
- Precache = ParticlePS
- Precache = ParticleVS
- Precache = DeferredRainPS
- Precache = ShadowMaskGenPS
-
- Precache = WaterFogVolume_VS
- Precache = WaterFogVolume_PS
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
-
- Precache = BeamPS
- Precache = ParticleHS
- Precache = ParticleDS
-
- Precache = TiledShadingCS
- Precache = VolumeLightInjectionCS
- Precache = ResolvePS
- Precache = VideoPS
-}
-
-Property
-{
- Name = %_RT_SAMPLE2
- Mask = 0x2000 // 1 << 13
-
- Precache = HDRPostProcessPS
- Precache = PostMotionBlurVS
- Precache = PostMotionBlurPS
- Precache = PostAA_PS
- Precache = PostSunShaftsPS
- Precache = PostProcessGamePS
- Precache = DeferredDecalPassPS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = CustomRenderPS
- Precache = DeferredRainPS
-
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
- Precache = ParticlePS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
-
- Precache = BeamPS
- Precache = LensOpticsPS
- Precache = WaterFogVolume_PS
- Precache = TiledShadingCS
- Precache = FogPostProcessPS
- Precache = VideoPS
-}
-
-Property
-{
- Name = %_RT_SAMPLE3
- Mask = 0x4000 // 1 << 14
- Precache = ParticlePS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = PostAA_PS
- Precache = HDRPostProcessPS
- Precache = BeamPS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = DeferredRainPS
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
- Precache = ResolvePS
-
- Precache = LensOpticsPS
- Precache = WaterFogVolume_PS
- Precache = TiledShadingCS
- Precache = VideoPS
-}
-
-Property
-{
- Name = %_RT_POINT_LIGHT
- Mask = 0x8000 // 1 << 15
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = WaterFogVolume_PS
- Precache = ConeTraceDiffusePS
-}
-
-Property
-{
- Name = %_RT_ALPHABLEND
- Mask = 0x10000 // 1 << 16
- Precache = GeneralHS
- Precache = GeneralDS
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = ParticlePS
- Precache = ParticleVS
- Precache = HairVS
- Precache = EyeVS
- Precache = VegetationVS
- Precache = GeneralVS
- Precache = GlassVS
- Precache = CustomRenderHS
- Precache = CustomRenderDS
- Precache = ZVS
- Precache = ZPS
- Precache = MotionBlurPS
-}
-
-Property
-{
- Name = %_RT_ANIM_BLEND
- Mask = 0x20000 // 1 << 17
- Precache = ParticlePS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticleGS
-}
-
-Property
-{
- Name = %_RT_QUALITY
- Mask = 0x40000 // 1 << 18
- AutoPrecache
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = ZVS
- Precache = ZPS
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = GeneralPS
- Precache = GeneralVS
- Precache = SkinPS
- Precache = SkinVS
- Precache = HairPS
- Precache = HairVS
- Precache = EyePS
- Precache = EyeVS
- Precache = GlassPS
- Precache = GlassVS
- Precache = TerrainPS
- Precache = TerrainVS
- Precache = VegetationPS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationVS
- Precache = MotionBlurVS
- Precache = MotionBlurPS
- Precache = CausticsVS
- Precache = ParticlePS
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
-
- Precache = PostMotionBlurVS
- Precache = PostMotionBlurPS
- Precache = PostSunShaftsPS
- Precache = SpriteDilatePS
- Precache = ShadowMaskGenPS
-
- Precache = HDRPostProcessVS
- Precache = HDRPostProcessPS
- Precache = FogPostProcessPS
- Precache = PostProcessGameVS
- Precache = PostProcessGamePS
-
- Precache = DistanceCloudsPS
- Precache = DeferredLightPassPS
- Precache = VolumeLightInjectionCS
-}
-
-Property
-{
- Name = %_RT_QUALITY1
- Mask = 0x80000 // 1 << 19
- AutoPrecache
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = ZVS
- Precache = ZPS
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = GeneralPS
- Precache = GeneralVS
- Precache = SkinPS
- Precache = SkinVS
- Precache = HairPS
- Precache = HairVS
- Precache = EyePS
- Precache = EyeVS
- Precache = GlassPS
- Precache = GlassVS
- Precache = TerrainPS
- Precache = TerrainVS
- Precache = VegetationPS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationVS
- Precache = MotionBlurVS
- Precache = MotionBlurPS
- Precache = CausticsVS
- Precache = ParticlePS
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
-
- Precache = PostMotionBlurVS
- Precache = PostMotionBlurPS
- Precache = PostSunShaftsPS
- Precache = SpriteDilatePS
- Precache = ShadowMaskGenPS
-
- Precache = HDRPostProcessVS
- Precache = HDRPostProcessPS
- Precache = FogPostProcessPS
- Precache = PostProcessGameVS
- Precache = PostProcessGamePS
-
- Precache = DistanceCloudsPS
- Precache = DeferredLightPassPS
- Precache = VolumeLightInjectionCS
-}
-
-Property
-{
- Name = %_RT_INSTANCING_ATTR
- Mask = 0x100000 // 1 << 20
- Precache = GeneralVS
- Precache = SkinVS
- Precache = HairVS
- Precache = EyeVS
- Precache = GlassVS
- Precache = VegetationVS
- Precache = ShadowGenVS
- Precache = ZVS
- Precache = MotionBlurVS
- Precache = CausticsVS
- Precache = CustomRenderVS
- Precache = DebugPassVS
-}
-
-Property
-{
- Name = %_RT_ENVIRONMENT_CUBEMAP
- Mask = 0x200000 // 1 << 21
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_TILED_SHADING
- Mask = 0x400000 // 1 << 22
- Precache = EyePS
- Precache = HairPS
- Precache = GlassPS
- Precache = IlluminationPS
-}
-
-Property
-{
- Name = %_RT_NO_TESSELLATION
- Mask = 0x800000 // 1 << 23
- Precache = GeneralVS
- Precache = GeneralPS
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = ZVS
- Precache = ZPS
- Precache = MotionBlurVS
- Precache = MotionBlurPS
- Precache = CustomRenderVS
- Precache = SkinVS
- Precache = SkinPS
- Precache = VegetationVS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationPS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = DebugPassVS
-}
-
-Property
-{
- Name = %_RT_APPLY_TOON_SHADING
- Mask = 0x1000000 // 1 << 24
- Precache = DeferredLightPassPS
- Precache = TiledShadingCS
-}
-
-
-Property
-{
- Name = %_RT_LIGHT_TEX_PROJ
- Mask = 0x2000000 // 1 << 25
- Precache = DeferredLightPassPS
- Precache = ParticleVS
- Precache = ParticleDS
- Precache = ConeTraceDiffusePS
-}
-
-Property
-{
- Name = %_RT_VERTEX_VELOCITY
- Mask = 0x4000000 // 1 << 26
- Precache = ZVS
- Precache = MotionBlurVS
-}
-
-Property
-{
- Name = %_RT_SKINNING_DUAL_QUAT
- Mask = 0x8000000 // 1 << 27
- Precache = GeneralVS
- Precache = SkinVS
- Precache = HairVS
- Precache = EyeVS
- Precache = GlassVS
- Precache = VegetationVS
- Precache = ShadowGenVS
- Precache = ZVS
- Precache = MotionBlurVS
- Precache = CausticsVS
- Precache = CustomRenderVS
- Precache = DebugPassVS
-}
-
-Property
-{
- Name = %_RT_SKINNING_DQ_LINEAR
- Mask = 0x10000000 // 1 << 28
- Precache = GeneralVS
- Precache = SkinVS
- Precache = HairVS
- Precache = EyeVS
- Precache = GlassVS
- Precache = VegetationVS
- Precache = ShadowGenVS
- Precache = ZVS
- Precache = MotionBlurVS
- Precache = CausticsVS
- Precache = CustomRenderVS
- Precache = DebugPassVS
-}
-
-Property
-{
- Name = %_RT_BLEND_WITH_TERRAIN_COLOR
- Mask = 0x20000000 // 1 << 29
- Precache = ZVS
- Precache = ZPS
- Precache = GeneralHS
- Precache = GeneralDS
- Precache = VegetationVS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationPS
- Precache = ConeTraceDiffusePS
-}
-
-Property
-{
- Name = %_RT_MOTION_BLUR
- Mask = 0x40000000 // 1 << 30
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = GPUParticleCS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = ZVS
- Precache = ZGS
- Precache = ZPS
- Precache = GeneralHS
- Precache = GeneralDS
-}
-
-Property
-{
- Name = %_RT_LIGHTVOLUME0
- Mask = 0x80000000 // 1 << 31
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = VolumeLightInjectionCS
- Precache = RenderDownscaledShadowMapPS
-}
-
-Property
-{
- //Using the same mask as _RT_LIGHTVOLUME0 as we have run out of them.
- //It should be safe to do this as this flag is not used in the deferred lighting pass or particles.
-
- Name = %_RT_SRGB0
- Mask = 0x80000000 // 1 << 31
- Precache = PostAA_PS
- Precache = ResolvePS
- Precache = HDRPostProcessPS
-}
-
-Property
-{
- Name = %_RT_LIGHTVOLUME1
- Mask = 0x100000000 // 1 << 32
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = VolumeLightInjectionCS
- Precache = RenderDownscaledShadowMapPS
-}
-
-Property
-{
- //Using the same mask as _RT_LIGHTVOLUME1 as we have run out of them.
- //It should be safe to do this as this flag is not used in the deferred lighting pass or particles.
-
- Name = %_RT_SRGB1
- Mask = 0x100000000 // 1 << 32
- Precache = PostAA_PS
- Precache = ResolvePS
- Precache = HDRPostProcessPS
-}
-
-Property
-{
- Name = %_RT_NOZPASS
- Mask = 0x200000000 // 1 << 33
- Precache = VegetationVS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationPS
-}
-
-Property
-{
- //Using the same mask as _RT_NOZPASS as we have run out of them.
- //It should be safe to do this as this flag is not used in vegetation pass.
-
- Name = %_RT_SRGB2
- Mask = 0x200000000 // 1 << 33
- Precache = PostAA_PS
- Precache = ResolvePS
- Precache = HDRPostProcessPS
-}
-
-Property
-{
- Name = %_RT_SHADOW_MIXED_MAP_G16R16
- Mask = 0x400000000 // 1 << 34
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = WaterFogVolume_PS
-
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
-}
-
-Property
-{
- Name = %_RT_SHADOW_JITTERING
- Mask = 0x800000000 // 1 << 35
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = TerrainPS
- Precache = WaterFogVolume_PS
-
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
-
- Precache = HairPS
- Precache = EyePS
-}
-
-Property
-{
- Name = %_RT_ADDITIVE_BLENDING
- Mask = 0x1000000000 // 1 << 36
- Precache = GlassPS
- Precache = GeneralPS
- Precache = HairPS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_SAMPLE0
- Mask = 0x2000000000 // 1 << 37
- Precache = CustomRenderVS
- Precache = CustomRenderPS
- Precache = SkinPS
- Precache = GlassPS
-
- Precache = FogPostProcessPS
- Precache = HDRPostProcessPS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = PostHUD3D_VS
- Precache = PostHUD3D_PS
- Precache = PostMotionBlurVS
- Precache = PostMotionBlurPS
- Precache = PostAA_PS
- Precache = PostSunShaftsPS
- Precache = PostProcessGameVS
- Precache = PostProcessGamePS
- Precache = PostDofPS
- Precache = PostEffectsVS
- Precache = PostEffectsPS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = SceneRainVS
- Precache = SceneRainPS
- Precache = DeferredRainPS
- Precache = ResolveVS
- Precache = ResolvePS
-
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
- Precache = WaterFogVolume_PS
-
- Precache = BeamPS
- Precache = LensOpticsVS
- Precache = TiledShadingCS
- Precache = VolumeLightInjectionCS
- Precache = VideoPS
-}
-
-// Reserved for post processes/deferred - do not use for light/common shaders
-Property
-{
- Name = %_RT_SAMPLE5
- Mask = 0x4000000000 // 1 << 38
-
- Precache = ZVS
- Precache = GeneralVS
- Precache = GeneralHS
- Precache = GeneralDS
-
- Precache = HDRPostProcessPS
- Precache = PostSunShaftsPS
- Precache = PostProcessGamePS
- Precache = DeferredPassPS
- Precache = DeferredPassVS
- Precache = DeferredLightPassPS
- Precache = PostMotionBlurPS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
- Precache = ResolvePS
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = CustomRenderHS
- Precache = CustomRenderDS
- Precache = CustomRenderPS
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
- Precache = WaterFogVolume_PS
- Precache = PostAA_PS
-
- Precache = BeamPS
- Precache = LensOpticsVS
- Precache = TiledShadingCS
- Precache = VolumeLightInjectionCS
- Precache = ReprojectVolumetricFogCS
-}
-
-Property
-{
- Name = %_RT_HW_PCF_COMPARE
- Mask = 0x8000000000 // 1 << 39
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = ShadowGenVS
- Precache = ShadowGenPS
-
- Precache = DeferredLightPassPS
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
-
- Precache = WaterFogVolume_PS
- Precache = ConeTraceDiffusePS
-}
-
-Property
-{
- Name = %_RT_REVERSE_DEPTH
- Mask = 0x10000000000 // 1 << 40
- Precache = DistanceCloudsVS
- Precache = PostProcessGamePS
- Precache = TerrainVS
- Precache = ZVS
- Precache = ZPS
- Precache = UnderwaterGodRays
- Precache = WaterSurfaceVS
- Precache = WaterFogVolume_VS
- Precache = GeneralVS
- Precache = LensOpticsVS
-}
-
-Property
-{
- Name = %_RT_DEBUG0
- Mask = 0x20000000000 // 1 << 41
-
- Runtime
-}
-
-Property
-{
- Name = %_RT_DEBUG1
- Mask = 0x40000000000 // 1 << 42
- Runtime
-}
-
-Property
-{
- Name = %_RT_DEBUG2
- Mask = 0x80000000000 // 1 << 43
- Runtime
-}
-
-Property
-{
- Name = %_RT_DEBUG3
- Mask = 0x100000000000 // 1 << 44
- Runtime
-}
-
-Property
-{
- Name = %_RT_CUBEMAP0
- Mask = 0x200000000000 // 1 << 45
- Precache = ShadowGenPS
- Precache = ShadowGenVS
-
- Precache = PostSunShaftsPS
- Precache = PostProcessGamePS
-
- Precache = DeferredDecalPassVS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
- Precache = DeferredLightPassVS
- Precache = DeferredLightPassPS
- Precache = DeferredPassVS
- Precache = DeferredPassPS
-
- Precache = WaterFogVolume_PS
- Precache = TiledShadingCS
-}
-
-Property
-{
- Name = %_RT_SAMPLE4
- Mask = 0x400000000000 // 1 << 46
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = PostAA_PS
-
- Precache = HDRPostProcessPS
- Precache = PostProcessGamePS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = PostSunShaftsPS
- Precache = PostMotionBlurPS
-
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
- Precache = WaterFogVolume_PS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
-
- Precache = BeamPS
- Precache = LensOpticsPS
-
- Precache = TiledShadingCS
-
- Precache = ConeTraceDiffusePS
- Precache = VolumeLightInjectionCS
-}
-
-Property
-{
- Name = %_RT_SPRITE
- Mask = 0x800000000000 // 1 << 47
- Precache = VegetationVS
- Precache = VegetationPS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_SHADOW_PASS
- Mask = 0x1000000000000 // 1 << 48
- Precache = ParticleVS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_DEPTH_COLLISION
- Mask = 0x2000000000000 // 1 << 49
- Precache = GPUParticleCS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_TURBULENCE
- Mask = 0x4000000000000 // 1 << 50
- Precache = GPUParticleCS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_UV_ANIMATION
- Mask = 0x8000000000000 // 1 << 51
- Precache = ParticleVS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_NORMAL_MAP
- Mask = 0x10000000000000 // 1 << 52
- Precache = ParticleVS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_GLOW_MAP
- Mask = 0x20000000000000 // 1 << 53
- Precache = ParticleVS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_CUBEMAP_DEPTH_COLLISION
- Mask = 0x40000000000000 // 1 << 54
- Precache = GPUParticleCS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_WRITEBACK_DEATH_LOCATIONS
- Mask = 0x80000000000000 // 1 << 55
- Precache = GPUParticleCS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_TARGET_ATTRACTION
- Mask = 0x100000000000000 // 1<< 56
- Precache = GPUParticleCS
-}
-
-Property
-{
- // Using the same mask as _RT_GPU_PARTICLE_TARGET_ATTRACTION as we have run out of them.
- //It should be safe to do this as this flag is not used in the deferred lighting pass.
-
- Name = %_RT_DEFERRED_RENDER_TARGET_OPTIMIZATION
- Mask = 0x100000000000000 // 1<< 56
-
- Precache = DeferredPassPS
- Precache = DeferredPassVS
- Precache = DeferredLightPassPS
- Precache = TiledShadingCS
- Precache = LightPassPS
- Precache = LightPassGmemPS
- Precache = ConeTraceDiffusePS
- Precache = VolumeLightInjectionCS
- Precache = CubemapPassPS
- Precache = CubemapPassGmemPS
- Precache = DeferredShadowGmemPS
- Precache = DeferredShadingPassPS
- Precache = DeferredShadingPassGmemPS
- Precache = AmbientPS
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_SHAPE_ANGLE
- Mask = 0x200000000000000 // 1 << 57
- Precache = GPUParticleCS
-}
-
-Property
-{
-
- // Using the same mask as _RT_GPU_PARTICLE_SHAPE_ANGLE as we have run out of them.
- //It should be safe to do this as this flag is not used in the deferred lighting pass.
-
- Name = %_RT_SLIM_GBUFFER
- Mask = 0x200000000000000 // 1 << 57
- AutoPrecache
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = ZVS
- Precache = ZPS
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = GeneralPS
- Precache = GeneralVS
- Precache = SkinPS
- Precache = SkinVS
- Precache = HairPS
- Precache = HairVS
- Precache = EyePS
- Precache = EyeVS
- Precache = GlassPS
- Precache = GlassVS
- Precache = TerrainPS
- Precache = TerrainVS
- Precache = VegetationPS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationVS
- Precache = MotionBlurVS
- Precache = MotionBlurPS
- Precache = CausticsVS
- Precache = ParticlePS
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
-
- Precache = PostMotionBlurVS
- Precache = PostMotionBlurPS
- Precache = PostSunShaftsPS
- Precache = SpriteDilatePS
- Precache = ShadowMaskGenPS
-
- Precache = HDRPostProcessVS
- Precache = HDRPostProcessPS
- Precache = FogPostProcessPS
- Precache = PostProcessGameVS
- Precache = PostProcessGamePS
-
- Precache = DistanceCloudsPS
- Precache = DeferredLightPassPS
- Precache = VolumeLightInjectionCS
- Precache = HDRPostProcessPS
- Precache = PostProcessGamePS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = PostSunShaftsPS
- Precache = PostMotionBlurPS
-
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
- Precache = WaterFogVolume_PS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
-
- Precache = BeamPS
- Precache = LensOpticsPS
-
- Precache = DeferredShadingPassPS
- Precache = DeferredPassVS
- Precache = DeferredLightPassPS
- Precache = TiledShadingCS
- Precache = LightPassPS
- Precache = ConeTraceDiffusePS
- Precache = VolumeLightInjectionCS
- Precache = CubemapPassPS
- Precache = CubemapPassGmemPS
-
- Precache = DeferredSnowPS
- Precache = DeferredRainPS
- Precache = SSRCompositionPS
- Precache = SSRRaytracePS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_SHAPE_BOX
- Mask = 0x400000000000000 // 1 << 58
- Precache = GPUParticleCS
- Precache = ParticleVS
-}
-
-Property
-{
- // Using the same mask as _RT_GPU_PARTICLE_SHAPE_BOX as we have run out of them.
- // It should be safe to do this as this (GPU Particles shouldn't have skinning)
-
- Name = %_RT_SKINNING_MATRIX
- Mask = 0x400000000000000 // 1 << 58
- Precache = GeneralVS
- Precache = SkinVS
- Precache = HairVS
- Precache = EyeVS
- Precache = GlassVS
- Precache = VegetationVS
- Precache = ShadowGenVS
- Precache = ZVS
- Precache = MotionBlurVS
- Precache = CausticsVS
- Precache = CustomRenderVS
- Precache = DebugPassVS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_SHAPE_POINT
- Mask = 0x800000000000000 // 1 << 59
- Precache = GPUParticleCS
-}
-
-Property
-{
- //Using the same mask as _RT_GPU_PARTICLE_SHAPE_POINT as we have run out of them.
- //It should be safe to do this as this flag is not used in the deferred lighting pass.
- Name = %_RT_APPLY_SSDO
- Mask = 0x800000000000000 // 1 << 59.
- Precache = DeferredPassPS
- Precache = DeferredPassVS
- Precache = DeferredLightPassPS
- Precache = TiledShadingCS
-}
-
-//Using the same mask as _RT_APPLY_SSDO as we have run out of them.
-//It should be safe to do this as this flag is not used in particle shaders.
-Property
-{
- Name = %_RT_FOG_VOLUME_HIGH_QUALITY_SHADER
- Mask = 0x800000000000000 // 1 << 59
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_SHAPE_CIRCLE
- Mask = 0x1000000000000000 // 1 << 60
- Precache = GPUParticleCS
- Precache = ParticleVS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_SHAPE_SPHERE
- Mask = 0x2000000000000000 // 1 << 61
- Precache = GPUParticleCS
- Precache = ParticleVS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_WIND
- Mask = 0x4000000000000000 // 1 << 62
- Precache = GPUParticleCS
-
-}
-Property
-{
- Name = %_RT_MULTI_LAYER_ALPHA_BLEND
- Mask = 0x8000000000000000 // 1 << 63
- Precache = FurShellPS
- Precache = FurFinsPS
- Precache = GlassPS
- Precache = GeneralPS
- Precache = HairPS
- Precache = ParticlePS
- Precache = MultiLayerAlphaBlendResolvePS
-}
-
-
diff --git a/Assets/Engine/Shaders/Scopes.ext b/Assets/Engine/Shaders/Scopes.ext
deleted file mode 100644
index ae84db49ca..0000000000
--- a/Assets/Engine/Shaders/Scopes.ext
+++ /dev/null
@@ -1,42 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %REFLEX_SIGHT
- Mask = 0x2
- Property (Reflex sight)
- Description (New reflex sight version)
-}
-
-Property
-{
- Name = %SCOPE_ZOOMED_REFRACTION
- Mask = 0x4
- Property (Scope zoomed refraction)
- Description (Scope zoomed in refraction)
-}
-
-Property
-{
- Name = %HOLO_SIGHT
- Mask = 0x8
- Property (Use holo sight depth)
- Description (Holographic sight with depth modifier)
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/ShaderProfiles.txt b/Assets/Engine/Shaders/ShaderProfiles.txt
deleted file mode 100644
index ae5178118e..0000000000
--- a/Assets/Engine/Shaders/ShaderProfiles.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-
-Version (1.00)
-
-Profile 'Low'
-{
-}
-
-Profile 'High'
-{
- UseNormalAlpha
-}
diff --git a/Assets/Engine/Shaders/ShadowMaskGen.ext b/Assets/Engine/Shaders/ShadowMaskGen.ext
deleted file mode 100644
index 6c65742d63..0000000000
--- a/Assets/Engine/Shaders/ShadowMaskGen.ext
+++ /dev/null
@@ -1,21 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description:
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-
-Version (1.00)
diff --git a/Assets/Engine/Shaders/SketchTerrain.ext b/Assets/Engine/Shaders/SketchTerrain.ext
deleted file mode 100644
index 3dfad9d1cf..0000000000
--- a/Assets/Engine/Shaders/SketchTerrain.ext
+++ /dev/null
@@ -1,27 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %TEMP_TERRAIN
- Mask = 0x40000000
- DependencySet = $UserEnabled
- Hidden
-}
diff --git a/Assets/Engine/Shaders/SkyHDR.ext b/Assets/Engine/Shaders/SkyHDR.ext
deleted file mode 100644
index 87d1a00ca5..0000000000
--- a/Assets/Engine/Shaders/SkyHDR.ext
+++ /dev/null
@@ -1,39 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-Version (1.00)
-
-Property
-{
- Name = %NO_MOON
- Mask = 0x02
- Property (No moon)
- Description (Sky dome doesn't render moon)
-}
-Property
-{
- Name = %NO_NIGHT_SKY_GRADIENT
- Mask = 0x04
- Property (No night sky gradient)
- Description (Sky dome doesn't render night sky gradient)
-}
-Property
-{
- Name = %NO_DAY_SKY_GRADIENT
- Mask = 0x08
- Property (No day sky gradient)
- Description (Sky dome doesn't render day sky gradient)
-}
diff --git a/Assets/Engine/Shaders/StarterGame_GeometryBeamScaling.ext b/Assets/Engine/Shaders/StarterGame_GeometryBeamScaling.ext
deleted file mode 100644
index 25e395f42d..0000000000
--- a/Assets/Engine/Shaders/StarterGame_GeometryBeamScaling.ext
+++ /dev/null
@@ -1,43 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-Property
-{
- Name = %NOISE
- Mask = 0x1
- Property (Dust & Turbulence)
- Description (Add a dust overlay [spec map for dust, bump map for turbulence] )
-}
-
-
-Property
-{
- Name = %RECEIVE_SHADOWS
- Mask = 0x2
- Property (Receive Shadows)
- Description (Enable shadow receiving)
-}
-
-
-Property
-{
- Name = %UV_VIGNETTING
- Mask = 0x4
- Property (UV Vignetting)
- Description (Enabling this will cause contents to fade out at UV boundaries)
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/Statics.ext b/Assets/Engine/Shaders/Statics.ext
deleted file mode 100644
index e7d93fbeaf..0000000000
--- a/Assets/Engine/Shaders/Statics.ext
+++ /dev/null
@@ -1,74 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %ST_GMEM_128BPP
- Mask = 0x1 // 1 << 0
-}
-
-Property
-{
- Name = %ST_GMEM_256BPP
- Mask = 0x2 // 1 << 1
-}
-
-Property
-{
- Name = %ST_GMEM_PLS
- Mask = 0x4 // 1 << 2
-}
-
-Property
-{
- Name = %ST_LLVM_DIRECTX_SHADER_COMPILER
- Mask = 0x8 // 1 << 3
-}
-
-Property
-{
- Name = %ST_FIXED_POINT
- Mask = 0x10 // 1 << 4
-}
-
-Property
-{
- Name = %ST_GMEM_RT_GREATER_FOUR
- Mask = 0x20 // 1 << 5
-}
-
-Property
-{
- Name = %ST_NO_DEPTH_CLIPPING
- Mask = 0x40 // 1 << 6
-}
-
-Property
-{
- Name = %ST_FEATURE_FETCH_DEPTHSTENCIL
- Mask = 0x80 // 1 << 7
-}
-
-property
-{
- Name = %ST_GMEM_VELOCITY_BUFFER
- Mask = 0x100 // 1 << 8
-}
-
-property
-{
- Name = %ST_GLES3_0
- Mask = 0x200 // 1 << 9
-}
diff --git a/Assets/Engine/Shaders/TemplBeamProc.ext b/Assets/Engine/Shaders/TemplBeamProc.ext
deleted file mode 100644
index 485702ace7..0000000000
--- a/Assets/Engine/Shaders/TemplBeamProc.ext
+++ /dev/null
@@ -1,34 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %NOISE
- Mask = 0x1
- Property (Noise map)
- Description (Use animated 3D noise)
-}
-
-Property
-{
- Name = %MUZZLEFLASH
- Mask = 0x2
- Property (Muzzleflash)
- Description (Use as muzzle flash)
-}
diff --git a/Assets/Engine/Shaders/Terrain.ext b/Assets/Engine/Shaders/Terrain.ext
deleted file mode 100644
index 6e8b5dc6f3..0000000000
--- a/Assets/Engine/Shaders/Terrain.ext
+++ /dev/null
@@ -1,79 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: TerrainLayer shader extension used by the editor
-// for automatic shader generation (based on "TerrainLayer" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x200
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %OFFSET_BUMP_MAPPING
- Mask = 0x1000
- Property (Offset bump mapping)
- Description (Use offset bump mapping (requires height map (_displ)))
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %DETAIL_MAPPING
- Mask = 0x8000
- Property (Detail mapping)
- Description (Use detail mapping)
- DependencyReset = $TEX_Detail
-}
-
-Property
-{
- Name = %PARALLAX_OCCLUSION_MAPPING
- Mask = 0x8000000
- Property (Parallax occlusion mapping)
- Description (Use parallax occlusion mapping (requires height map (_displ)))
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %TEMP_TERRAIN
- Mask = 0x40000000
- DependencySet = $UserEnabled
- Hidden
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/Vegetation.ext b/Assets/Engine/Shaders/Vegetation.ext
deleted file mode 100644
index 5f98ec49e6..0000000000
--- a/Assets/Engine/Shaders/Vegetation.ext
+++ /dev/null
@@ -1,137 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Vegetation extension used by the editor
-// for automatic shader generation (based on "Vegetation" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x10
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %LEAVES
- Mask = 0x100
- Property (Leaves)
- Description (Activate for leaves only ! Use leaf shading and leaves animation)
-}
-
-Property
-{
- Name = %GRASS
- Mask = 0x2000
- Property (Grass)
- Description (Activate for grass only ! Use simple grass rendering)
-}
-
-Property
-{
- Name = %SPEEDTREE_BILLBOARD
- Mask = 0x40000
- Property (SpeedTree billboard)
- Description (Activate for SpeedTree billboards only! Enables removal of non-camera-facing geometry from the billboard mesh)
-}
-
-Property
-{
- Name = %DETAIL_BENDING
- Mask = 0x10000
- Property (Detail bending)
- Description (Activate for leaves and grass only. Make sure to paint required vertex colors also)
-}
-
-Property
-{
- Name = %DETAIL_MAPPING
- Mask = 0x20000
- Property (Detail mapping)
- Description (Use detail mapping)
- DependencyReset = $TEX_Detail
-}
-
-Property
-{
- Name = %BLENDLAYER
- Mask = 0x80000
- Property (Blendlayer)
- Description (Normal-mapped diffuse layer blended on top of base material)
-}
-
-Property
-{
- Name = %VERTCOLORS
- Mask = 0x100000
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %TEMP_VEGETATION
- Mask = 0x8000000
- DependencySet = $UserEnabled
- Hidden
-}
-
-#ifdef FEATURE_MESH_TESSELLATION
-Property
-{
- Name = %DISPLACEMENT_MAPPING
- Mask = 0x10000000
- Property (Displacement mapping)
- Description (Use displacement mapping (requires height map (_displ)))
- //DependencySet = $TEX_Height
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %PHONG_TESSELLATION
- Mask = 0x20000000
- Property (Phong tessellation)
- Description (Use rough approximation of smooth surface subdivision)
-}
-
-Property
-{
- Name = %PN_TESSELLATION
- Mask = 0x40000000
- Property (PN triangles tessellation)
- Description (Use rough approximation of smooth surface subdivision)
-}
-#endif
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/VolumeObject.ext b/Assets/Engine/Shaders/VolumeObject.ext
deleted file mode 100644
index 8cab9b4270..0000000000
--- a/Assets/Engine/Shaders/VolumeObject.ext
+++ /dev/null
@@ -1,57 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description:
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-
-Version (1.00)
-
-Property
-{
- Name = %SOFT_OBJECT_INTERSECTION
- Mask = 0x1
- Property (Soft Intersections)
- Description (Enables soft intersections with opaque scene geometry)
-}
-Property
-{
- Name = %BACK_LIGHTING
- Mask = 0x2
- Property (Back Lighting)
- Description (Adds back lighting to volume silhouette when viewing against sun)
-}
-Property
-{
- Name = %JITTERING
- Mask = 0x4
- Property (Jittering)
- Description (Enables jittering on cloud steps)
-}
-Property
-{
- Name = %SOFT_JITTERING
- Mask = 0x8
- Property (Soft Jittering)
- Description (Softens the effect of jittering on volume objects)
-}
-Property
-{
- Name = %CUSTOM_SETTINGS
- Mask = 0x10
- Property (Use TOD Settings)
- Description (Use the custom cloud settings from the TOD for lighting)
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/Water.ext b/Assets/Engine/Shaders/Water.ext
deleted file mode 100644
index d44e3598e5..0000000000
--- a/Assets/Engine/Shaders/Water.ext
+++ /dev/null
@@ -1,62 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Water extension used by the editor
-// for automatic shader generation (based on "Water" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %ENVIRONMENT_MAP
- Mask = 0x4
- Property (Environment map)
- Description (Use environment map instead of reflection)
- DependencyReset = $TEX_EnvCM
-}
-
-Property
-{
- Name = %SUN_SHINE
- Mask = 0x20
- Property (Sunshine)
- Description (Activate for water sunshine)
-}
-
-Property
-{
- Name = %NO_REFRACTION_BUMP
- Mask = 0x200
- Property (No refraction bump)
- Description (Disables refraction bump)
-}
-
-Property
-{
- Name = %FOAM
- Mask = 0x400
- Property (Foam)
- Description (Enables foam)
-}
-
-Property
-{
- Name = %WATER_TESSELLATION_DX11
- Mask = 0x800
- DependencySet = $HW_WaterTessellation
- DependencyReset = $HW_WaterTessellation
- Hidden
-}
diff --git a/Assets/Engine/Shaders/WaterVolume.ext b/Assets/Engine/Shaders/WaterVolume.ext
deleted file mode 100644
index dec9d1a531..0000000000
--- a/Assets/Engine/Shaders/WaterVolume.ext
+++ /dev/null
@@ -1,107 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Water extension used by the editor
-// for automatic shader generation (based on "Water" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %SSREFL
- Mask = 0x1
- Property (Realtime Reflection)
- Description (Approximate realtime reflections)
-}
-
-Property
-{
- Name = %FLOW
- Mask = 0x2
- Property (Water flow)
- Description (Enable water to flow along geometry uvs)
-}
-
-Property
-{
- Name = %FLOW_MAP
- Mask = 0x4
- Property (Water flow map)
- Description (Enable water flow along a flow map)
-}
-
-Property
-{
- Name = %FLOW_MAP_STRENGTH
- Mask = 0x100
- Property (Water flow map strength)
- Description (Enable additional water flow strength controls - requires blue channel for strength)
-}
-
-Property
-{
- Name = %SUN_SPECULAR
- Mask = 0x8
- Property (Sun specular)
- Description (Activate for water sunshine)
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x10
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %DEBUG_FLOW_MAP
- Mask = 0x20
- Property (Debug flow map)
- Description (Enable visualizing flow map)
-}
-
-Property
-{
- Name = %FOAM
- Mask = 0x40
- Property (Foam)
- Description (Enables foam)
-}
-
-Property
-{
- Name = %DECAL_MAP
- Mask = 0x80
- Property (Decal map)
- Description (Use tiling decal map as separate texture)
- DependencySet = $TEX_Custom
- DependencyReset = $TEX_Custom
- Hidden
-}
-
-Property
-{
- Name = %WATER_TESSELLATION_DX11
- Mask = 0x80000000
- DependencySet = $HW_WaterTessellation
- DependencyReset = $HW_WaterTessellation
- Hidden
-}
diff --git a/Assets/Engine/Shaders/Waterfall.ext b/Assets/Engine/Shaders/Waterfall.ext
deleted file mode 100644
index 8d0ff2cc73..0000000000
--- a/Assets/Engine/Shaders/Waterfall.ext
+++ /dev/null
@@ -1,45 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Water extension used by the editor
-// for automatic shader generation (based on "Water" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %ENVIRONMENT_MAP
- Mask = 0x1
- Property (Environment map)
- Description (Use environment map as separate texture)
- DependencyReset = $TEX_EnvCM
-}
-
-Property
-{
- Name = %SUN_SHADING
- Mask = 0x2
- Property (Sun shading)
- Description (Activate for water sunshading - for outdoors)
-}
-
-Property
-{
- Name = %FOAM
- Mask = 0x4
- Property (Foam)
- Description (Enables foam rendering)
-}
diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_1000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_1000.dds
deleted file mode 100644
index 872d7b71d4..0000000000
--- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_1000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f454e6505870d9159eaac1eb0c53751e45e803cf50bf94e5c5f51ba2232cebba
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_2000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_2000.dds
deleted file mode 100644
index 97ed5efe4d..0000000000
--- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_2000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c1047fad9be53568fc471bdb5633445a030efaed6bf9b5e9d47abb09efb4d01e
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_3000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_3000.dds
deleted file mode 100644
index 337e63a40c..0000000000
--- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_3000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:11b5326877643b06a5687cf1470e388752296df64ce3abb69aa06f1933e0f3b8
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_4000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_4000.dds
deleted file mode 100644
index 2e6b3a3eda..0000000000
--- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_4000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:de54072f3eca1a1de6250b1585335a1aa6fa9e07e4e7ad00cd37ea5f809a303c
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_5000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_5000.dds
deleted file mode 100644
index 4a80ce04e1..0000000000
--- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_5000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ac0f98198af41590052eff6550d34f05d0e3ca374bc59e7ece314be2380c210f
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_6000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_6000.dds
deleted file mode 100644
index d7e0e74fca..0000000000
--- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_6000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:be47d7c0a2a64b17925e51b65abba72dd22735ef7f3913e9aa389f8c31124ede
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_7000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_7000.dds
deleted file mode 100644
index 391bd3ec9f..0000000000
--- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_7000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:372359625eec486abbbe7f9ab438b51627939bfbd39002d136b6d6b9c61bbe1b
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_8000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_8000.dds
deleted file mode 100644
index 418a7ee3ed..0000000000
--- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_8000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:91ba2bd2504a10a199964b35014df14a4405cf8fd47955a6c4ef9ca4f300637d
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_9000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_9000.dds
deleted file mode 100644
index 9c11c2fa43..0000000000
--- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_9000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7d8442967964bab77d02a572e6e7f8fcd158e62308b7e6340d4d56be13f7f455
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_1000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_1000.dds
deleted file mode 100644
index f9a46c53c8..0000000000
--- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_1000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5bf373730d725a14b6833b7862c6268a93d8f9d847032a60cdc99ce14fea9dfe
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_2000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_2000.dds
deleted file mode 100644
index 25cce25c63..0000000000
--- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_2000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:181c31eb7fa068027d3e42c415006fd70d1fbeb0bfe373b3290aea6e3002d762
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_3000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_3000.dds
deleted file mode 100644
index a1c5d4e1b8..0000000000
--- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_3000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:efc4fbc90bfd01a1ba09ebd925b8379e67263b7156f37473dd13a91f346ed1c4
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_4000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_4000.dds
deleted file mode 100644
index 4cafe4e613..0000000000
--- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_4000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b48137886ef2a38312eedbddb111367b3f3924ab5425b49f81a92ae7d4ea898e
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_5000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_5000.dds
deleted file mode 100644
index bb74f06212..0000000000
--- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_5000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ea47fd8d68dab6ba54e45bfc50d84d380ec2f5b7e6915713dc9e9aa41423d4ea
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_6000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_6000.dds
deleted file mode 100644
index 8bc6e3de17..0000000000
--- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_6000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9bd3fe0208cbee26cfcf00cba0a127c5938061b8bea2143d05e28fbc7f55d9ca
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_7000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_7000.dds
deleted file mode 100644
index 4c286062d0..0000000000
--- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_7000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:30f6aac28e74da435ad6c018b6a7e9b7cee1ad74ec5452778e56036a7d438ec9
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_8000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_8000.dds
deleted file mode 100644
index 31023d437e..0000000000
--- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_8000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2628992a8c8774ff5e77152999009ba3cbb3b68ee79d53669dd16aebe978da27
-size 5946320
diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_9000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_9000.dds
deleted file mode 100644
index a5f85d6b22..0000000000
--- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_9000.dds
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:42faae0235f0c74bc0201dd8fc805a9c01f086b093026b654e207f83ea0f3f90
-size 5946320
diff --git a/Tests/Atom/__init__.py b/Tests/Atom/__init__.py
deleted file mode 100755
index 36d43bea05..0000000000
--- a/Tests/Atom/__init__.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# """
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the "License"). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
diff --git a/Tests/Atom/image_comparison_utils.py b/Tests/Atom/image_comparison_utils.py
deleted file mode 100755
index 698901710a..0000000000
--- a/Tests/Atom/image_comparison_utils.py
+++ /dev/null
@@ -1,105 +0,0 @@
-# """
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the "License"). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-# Utility functions for image comparison tests.
-# """
-# import test_tools.shared.images.qssim as qssim
-# import PythonMagick
-# import logging
-# import os
-# import shared.s3_utils
-# import platform
-
-
-####################################
-# Commented out due to need to shift to new LyTestTools, Python3 and new screenshot workflow
-# Don't merge to Mainline
-####################################
-
-
-# def create_image_path(screenshot, path, extension, golden):
- # """
- # Create image path from name, path and extension
- # From a specified path, create the path for the diff image
- # :param screenshot: path to the screenshot which needs to be saved
- # :param path: path to where screenshot should be saved
- # :param extension: extension of the diff image (.dds, .jpg)
- # :param golden: True or False whether screenshot is golden image or not
- # :return diff_full_path: path of the iamge to be saved
- # """
- # screenshot_name = os.path.basename(screenshot)
- # if golden:
- # diff_name = "{}_golden{}".format(screenshot_name.split('.')[:-1][0], extension)
- # else:
- # diff_name = "{}{}".format(screenshot_name.split('.')[:-1][0], extension)
- # diff_full_path = os.path.join(path, diff_name)
- # return diff_full_path
-
-
-# def convert_dds_to_jpg(image, path, golden):
- # """
- # Convert DDS to JPEG
- # :param image: DDS image to convert
- # :param path: path to where iamge will be saved
- # :return screenshotJPG_path: path to the newly JPEG-converted DDS image
- # """
- # # Convert image as JPEG for quick review
- # screenshotJPG_path = create_image_path(image, path, '.jpg', golden)
- # screenshot = PythonMagick.Image(image)
- # screenshot.quality(100)
- # screenshot.magick('JPEG')
- # screenshot.write(screenshotJPG_path)
- # return screenshotJPG_path
-
-
-# def compare_screenshot_to_golden_image(screenshot, golden_image, path, threshold=0.985):
- # """
- # Compare Screenshots to Golden Images
- # Function to compare a newly taken screenshot with the golden image
- # :param screenshot: path of the screenshot
- # :param golden_image: path of the golden image (in Perforce)
- # :param path: path to where the screenshot diff image will be saved
- # :param threshold: threshold for the image comparison test to fail/pass (optional)
- # :return failure_not_found: True or False whether screenshots are similar (due to threshold) or not
- # """
- # failure_not_found = True
- # logging.info("Comparing screenshot {}".format(screenshot))
- # # Calculating screenshots similarity
- # quaternion_similarity = qssim.qssim(screenshot, golden_image, diff_path = path)
- # # Converting original screenshots to jpg
- # convert_dds_to_jpg(screenshot, path, False)
- # convert_dds_to_jpg(golden_image, path, True)
- # # Checking if similarity index is bypassing the threshold
- # if (quaternion_similarity < threshold):
- # failure_not_found = False
- # logging.error("%s failed the image comparison with %s", screenshot, golden_image)
- # else:
- # logging.info("Comparison successful, screenshots are similar.")
- # return failure_not_found
-
-
-# def upload_screenshots_to_s3(folder_path, folder_name):
- # """
- # Uploading screenshots to certain s3 bucket
- # Will require certain credentials (from the IAM that has access to l-qa@amazon acc) on the machine to work
- # :param folder_path: full path to folder that needs to be uploaded to s3
- # :param folder_name: name of the folder to be uploaded to s3
- # :return: None
- # """
- # host_name = platform.uname()[1]
- # s3_folder_name = '_'.join([folder_name, host_name])
-
- # logging.info("Trying to create a folder on S3; bucket: ly.screenshot.automation.artifacts, folder: {}".format(s3_folder_name))
- # shared.s3_utils.create_folder_in_bucket('ly.screenshot.automation.artifacts', s3_folder_name)
-
- # for file in os.listdir(folder_path):
- # key = '{}/{}'.format(s3_folder_name, file)
- # shared.s3_utils.upload_to_bucket('ly.screenshot.automation.artifacts', '{}/{}'.format(folder_path, file), key)
-
diff --git a/Tests/Atom/windows/__init__.py b/Tests/Atom/windows/__init__.py
deleted file mode 100755
index 36d43bea05..0000000000
--- a/Tests/Atom/windows/__init__.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# """
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the "License"). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
diff --git a/Tests/Atom/windows/atomsampleviewer_tests_stability.py b/Tests/Atom/windows/atomsampleviewer_tests_stability.py
deleted file mode 100755
index b480a7bc1a..0000000000
--- a/Tests/Atom/windows/atomsampleviewer_tests_stability.py
+++ /dev/null
@@ -1,91 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-This is a file to test basic functionality of the Base Viewer executable
-"""
-
-import os
-import pytest
-import subprocess
-import time
-import re
-from ly_test_tools.environment.process_utils import kill_processes_named as kill_processes_named
-
-dev_dir = os.path.abspath(os.path.join(os.path.abspath(__file__), '..', '..', '..', '..'))
-bin_dir = 'Bin64vc141'
-
-
-def gather_sample_names():
- """
- Gathers the currently eligible samples from the output of a single run of baseviewer.exe (with no sample argument).
- For use in the fixture parameters.
- """
- viewer_dir = os.path.join(dev_dir, bin_dir)
- os.chdir(viewer_dir)
- process = subprocess.Popen(['BaseViewer.exe', '-timeout', '5'], stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- out = process.communicate()[0]
- log = out.splitlines()
- samples = []
- for line in log:
- line = str(line)
- if "SampleComponentManager" in line and '-' not in line and 'Not Supported' not in line:
- line_regexp = re.search('\[.*\]', line)
- line = line_regexp.group(0)
- sample = line.replace('[', '').replace(']', '')
- samples.append(sample)
- kill_processes_named('AssetProcessor', ignore_extensions=True)
- if samples is not None:
- return samples
-
-
-@pytest.fixture
-def kill_AP(request):
- def teardown():
- kill_processes_named('AssetProcessor', ignore_extensions=True)
- request.addfinalizer(teardown)
-
-
-@pytest.mark.parametrize("samples", gather_sample_names())
-class TestBaseViewerExe(object):
-
- def test_OpenSampleLevel_CorrectFormat_ShouldPass(self, samples, kill_AP):
- """
- Opens the specific BaseViewer samples individually and verifies they're stable for a few seconds and then exit
- cleanly
- """
- viewer_dir = os.path.join(dev_dir, bin_dir)
- os.chdir(viewer_dir)
- return_code = subprocess.check_call(['BaseViewer.exe', '-sample', samples, '-timeout', '20'], timeout=30)
- assert return_code == 0, "Sample '{}' did not exit properly with code '{}'".format(samples, str(returncode))
-
- def test_OpenSampleLevel_NoErrors_ShouldPass(self, samples, kill_AP):
- """
- Opens the specific BaseViewer samples individually and verifies there are no errors in the output while running
- """
- viewer_dir = os.path.join(dev_dir, bin_dir)
- os.chdir(viewer_dir)
- output = subprocess.check_output(['BaseViewer.exe', '-sample', samples, '-timeout', '20'], timeout=30)
- log = output.splitlines()
- errors = []
- assertions = []
- for i in range(len(log)):
- line = str(log[i])
- surrounding_lines = str(log[i:i+3])
- if "Trace::Error" in line:
- errors.append(surrounding_lines)
- if "Trace::Assert" in line:
- assertions.append(surrounding_lines)
-
- assert len(errors) == 0, "Sample '{}' had the following errors when run: {}".format(samples, "\n".join(errors))
- assert len(assertions) == 0, "Sample '{}' had the following assertions when run: {}".format(samples, "\n".join(assertions))
-
diff --git a/Tests/Atom/windows/conftest.py b/Tests/Atom/windows/conftest.py
deleted file mode 100755
index e0766a4015..0000000000
--- a/Tests/Atom/windows/conftest.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# """
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the "License"). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-# Conftest file for providing additional configuration for Screenshot Comparison tests
-# """
-
-
-
-####################################
-# Commented out due to need to shift to new LyTestTools, Python3 and new screenshot workflow
-# Don't merge to Mainline
-####################################
-
-
-# import pytest
-
-# def pytest_addoption(parser):
- # parser.addoption(
- # '--graphics_vendor', action='store', help='graphics vendor name: nvidia or amd', required=True
- # )
- # parser.addoption(
- # '--upload_results_to_s3', action='store_true', default=False, help='Specify if you need to upload screenshot artifacts to s3'
- # )
-
-# @pytest.fixture
-# def graphics_vendor(request):
- # return request.config.getoption('--graphics_vendor')
-
-# @pytest.fixture
-# def upload_results_to_s3(request):
- # return request.config.getoption('--upload_results_to_s3')
-
diff --git a/Tests/Atom/windows/screenshot_comparison_atomsampleviewer_windows.py b/Tests/Atom/windows/screenshot_comparison_atomsampleviewer_windows.py
deleted file mode 100755
index fca50c9901..0000000000
--- a/Tests/Atom/windows/screenshot_comparison_atomsampleviewer_windows.py
+++ /dev/null
@@ -1,143 +0,0 @@
-# """
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the "License"). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-# BaseViewer image comparison tests on windows
-# """
-
-# import Atom.image_comparison_utils as image_comparison_utils
-# import test_tools.builtin.fixtures as fixtures
-# import subprocess
-# import pytest
-# import os
-# import logging
-# import time
-# import datetime
-# from test_tools import WINDOWS
-# from test_tools.shared.process_utils import kill_processes_named
-# from test_tools.shared.waiter import wait_for
-
-
-
-
-####################################
-# Commented out due to need to shift to new LyTestTools, Python3 and new screenshot workflow
-# Don't merge to Mainline
-####################################
-
-
-
-
-# workspace = fixtures.use_fixture(fixtures.builtin_workspace_fixture, scope='function')
-# logger = logging.getLogger(__name__)
-
-# @pytest.fixture(scope='session', autouse=True)
-# def closing_ap(request):
- # """
- # Fixture to call once per all tests to teardown AP at the end
- # :param request: pytest request
- # """
- # def teardown():
- # kill_processes_named('AssetProcessor_tmp', ignore_extensions=True)
- # kill_processes_named('AssetProcessor', ignore_extensions=True)
- # kill_processes_named('AssetProcessorBatch', ignore_extensions=True)
- # kill_processes_named('AssetBuilder', ignore_extensions=True)
- # kill_processes_named('rc', ignore_extensions=True)
- # request.addfinalizer(teardown)
-
-# @pytest.fixture()
-# def screenshots_setup(request, workspace, sample, graphics_vendor, upload_results_to_s3):
- # """
- # Fixture for setting up workspace needed for screenshot comparison test
- # :param request: pytest request
- # :param workspace: pythontesttools workspace object
- # :param sample: name of BaseViwer sample
- # :return final_path: path to folder where output screenshots will be stored
- # """
- # # Creating output folder
- # tests_path = os.path.dirname(os.path.realpath(__file__))
- # dir_name = "{}_screenshot_tests_{}_{}_{}_{}".format(datetime.datetime.now().strftime("%Y-%m-%d_%H_%M_%S_%f"), sample.replace('/', ""), workspace.release.platform, workspace.release.configuration,
- # graphics_vendor)
- # dir_name = dir_name.replace(":", '_')
- # final_path = os.path.join(tests_path, dir_name)
- # os.mkdir(final_path)
-
- # # Teardown to clean up Cache from .dds screenshots that are produced by BaseViewer.exe
- # def teardown():
- # cache = os.path.join(workspace.release.paths.dev(), "Cache", "BaseViewer", "pc", "baseviewer")
- # files = os.listdir(cache)
- # for file in files:
- # name, file_extension = os.path.splitext(file)
- # if 'screenshot' in name and file_extension == '.dds':
- # screen_to_remove = os.path.join(cache, file)
- # logger.info('Deleting temp screenshot file {}.'.format(screen_to_remove))
- # os.remove(screen_to_remove)
- # kill_processes_named('BaseViewer', ignore_extensions=True)
- # # uploading screenshots to s3
- # if upload_results_to_s3:
- # image_comparison_utils.upload_screenshots_to_s3(final_path, dir_name)
- # request.addfinalizer(teardown)
- # return final_path
-
-
-# # Commenting out debug due to ATOM-1677
-# @pytest.mark.parametrize("platform,configuration,project,spec,sample", [
- # pytest.param("win_x64_vs2017", "profile", "BaseViewer", "all", "RPI/BistroBenchmark",
- # marks=pytest.mark.skipif(not WINDOWS, reason="Only supported on Windows hosts")),
- # #pytest.param("win_x64_vs2017", "debug", "BaseViewer", "all", "RPI/BistroBenchmark",
- # # marks=pytest.mark.skipif(not WINDOWS, reason="Only supported on Windows hosts")),
- # ])
-# class TestBaseViewerScreenshots(object):
- # def test_BistroBenchmarkSample_CompareScreenshots(self, request, workspace, sample, screenshots_setup, graphics_vendor):
- # """
- # Launches BaseViewer.exe RPI/BistoBenchmark, taking screenshot and comparing on certain frames.
- # """
- # base_path = workspace.release.paths.dev()
- # # Generating frames list parameter
- # frames_list = range(1000,10000,1000)
- # frames_param = ""
- # screenshot_names = []
- # for parameter in frames_list:
- # frames_param += '{},'.format(parameter)
- # screenshot_names.append('screenshot_bistro_{}.dds'.format(parameter))
- # frames_param = frames_param[:-1]
- # # Loading BaseViewer
- # self.load_baseviewer_directly(workspace, sample, frames_param, timeout=100)
-
- # logger.info('Comparing screenshots to golden images')
- # taken_screens_path = os.path.join(base_path, "Cache", "BaseViewer", "pc", "baseviewer")
- # golden_screens_path = os.path.join(base_path, "Tests", "Atom", "GoldenImages", "Windows", graphics_vendor, "Baseviewer", "BistroBenchmark")
- # failed_screenshots = []
- # for screen in screenshot_names:
- # taken_image = os.path.join(taken_screens_path, screen)
- # golden_image = os.path.join(golden_screens_path, screen)
- # if not image_comparison_utils.compare_screenshot_to_golden_image(taken_image, golden_image, screenshots_setup):
- # failed_screenshots.append(screen)
- # if len(failed_screenshots) > 0:
- # assert False, "A failure has been found during image comparison for the following images: {}".format(failed_screenshots)
-
-
- # def load_baseviewer_directly(self, workspace, sample, frames, timeout):
- # """
- # Launch directly Baseviewer without using the launcher (since Atom is not yet integrated in Lumberyard)
- # :param workspace: pythontesttools workspace object
- # :param sample: name of the sample from BaseViewer
- # :param frames: list of frames to take screenshots at
- # :param timeout: time in seconds to wait BaseViewer to take screenshots
- # """
- # base_path = workspace.release.paths.dev()
- # bin_dir = workspace.release.paths.bin_dir()
- # cmd_path = os.path.join(base_path, bin_dir)
- # os.chdir(cmd_path)
- # p = subprocess.Popen(['BaseViewer.exe', '-sample', sample, '-screenshot', frames])
- # # Wait for BaseViewer to run and take screenshot
- # last_screenshot = frames.split(',')[-1]
- # screenshot_file = os.path.join(base_path, "Cache", "BaseViewer", "pc", "baseviewer", "screenshot_bistro_{}.dds".format(last_screenshot))
- # wait_for(lambda: os.path.exists(screenshot_file), timeout)
-
diff --git a/Tests/BuildSystems/__init__.py b/Tests/BuildSystems/__init__.py
deleted file mode 100755
index 6ed3dc4bda..0000000000
--- a/Tests/BuildSystems/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
\ No newline at end of file
diff --git a/Tests/BuildSystems/test_BuildBAT.py b/Tests/BuildSystems/test_BuildBAT.py
deleted file mode 100755
index 1521508550..0000000000
--- a/Tests/BuildSystems/test_BuildBAT.py
+++ /dev/null
@@ -1,212 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-BuildSystems BAT to automate building on packages for Windows
-"""
-import logging
-import pytest
-import os
-
-pytest.importorskip('ly_test_tools')
-
-import ly_test_tools.builtin.helpers as helpers
-from .test_lib import build_helper
-
-logger = logging.getLogger(__name__)
-
-
-@pytest.mark.BAT
-@pytest.mark.parametrize('spec', ['all'])
-@pytest.mark.parametrize('project', ['AutomatedTesting'])
-
-class TestWindowsBuildConfig(object):
- """
- Automated tests for all the build configurations for Windows.
- Test cases live in Repository/Build System/Lumberyard Builds/Configurations
- """
- @pytest.mark.test_case_id('C15723869')
- @pytest.mark.parametrize('platform', ['win_x64_vs2017'])
- @pytest.mark.parametrize('configuration', ['profile'])
- @pytest.mark.build
- def test_build_win_x64_vs2017_profile(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15723870')
- @pytest.mark.parametrize('platform', ['win_x64_vs2017'])
- @pytest.mark.parametrize('configuration', ['profile_dedicated'])
- @pytest.mark.build
- def test_build_win_x64_vs2017_profile_dedicated(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15723871')
- @pytest.mark.parametrize('platform', ['win_x64_vs2017'])
- @pytest.mark.parametrize('configuration', ['profile_test'])
- @pytest.mark.build
- def test_build_win_x64_vs2017_profile_test(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15723872')
- @pytest.mark.parametrize('platform', ['win_x64_vs2017'])
- @pytest.mark.parametrize('configuration', ['profile_test_dedicated'])
- @pytest.mark.build
- def test_build_win_x64_vs2017_profile_test_dedicated(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15716369')
- @pytest.mark.parametrize('platform', ['win_x64_vs2017'])
- @pytest.mark.parametrize('configuration', ['debug'])
- @pytest.mark.build
- def test_build_win_x64_vs2017_debug(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15716370')
- @pytest.mark.parametrize('platform', ['win_x64_vs2017'])
- @pytest.mark.parametrize('configuration', ['debug_dedicated'])
- @pytest.mark.build
- def test_build_win_x64_vs2017_debug_dedicated(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15716371')
- @pytest.mark.parametrize('platform', ['win_x64_vs2019'])
- @pytest.mark.parametrize('configuration', ['debug_test'])
- @pytest.mark.build
- def test_build_win_x64_vs2019_debug_test(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15716372')
- @pytest.mark.parametrize('platform', ['win_x64_vs2017'])
- @pytest.mark.parametrize('configuration', ['debug_test_dedicated'])
- @pytest.mark.build
- def test_build_win_x64_vs2017_debug_test_dedicated(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15723889')
- @pytest.mark.parametrize('platform', ['win_x64_vs2017'])
- @pytest.mark.parametrize('configuration', ['release'])
- @pytest.mark.build
- def test_build_win_x64_vs2017_release(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15723890')
- @pytest.mark.parametrize('platform', ['win_x64_vs2017'])
- @pytest.mark.parametrize('configuration', ['release_dedicated'])
- @pytest.mark.build
- def test_build_win_x64_vs2017_release_dedicated(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15815180')
- @pytest.mark.parametrize('platform', ['win_x64_vs2019'])
- @pytest.mark.parametrize('configuration', ['profile'])
- @pytest.mark.build
- def test_build_win_x64_vs2019_profile(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15815181')
- @pytest.mark.parametrize('platform', ['win_x64_vs2019'])
- @pytest.mark.parametrize('configuration', ['profile_dedicated'])
- @pytest.mark.build
- def test_build_win_x64_vs2019_profile_dedicated(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15815182')
- @pytest.mark.parametrize('platform', ['win_x64_vs2019'])
- @pytest.mark.parametrize('configuration', ['profile_test'])
- @pytest.mark.build
- def test_build_win_x64_vs2019_profile_test(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15815183')
- @pytest.mark.parametrize('platform', ['win_x64_vs2019'])
- @pytest.mark.parametrize('configuration', ['profile_test_dedicated'])
- @pytest.mark.build
- def test_build_win_x64_vs2019_profile_test_dedicated(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15815174')
- @pytest.mark.parametrize('platform', ['win_x64_vs2019'])
- @pytest.mark.parametrize('configuration', ['debug'])
- @pytest.mark.build
- def test_build_win_x64_vs2019_debug(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15815175')
- @pytest.mark.parametrize('platform', ['win_x64_vs2019'])
- @pytest.mark.parametrize('configuration', ['debug_dedicated'])
- @pytest.mark.build
- def test_build_win_x64_vs2019_debug_dedicated(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15815176')
- @pytest.mark.parametrize('platform', ['win_x64_vs2019'])
- @pytest.mark.parametrize('configuration', ['debug_test'])
- @pytest.mark.build
- def test_build_win_x64_vs2019_debug_test(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15815177')
- @pytest.mark.parametrize('platform', ['win_x64_vs2019'])
- @pytest.mark.parametrize('configuration', ['debug_test_dedicated'])
- @pytest.mark.build
- def test_build_win_x64_vs2019_debug_test_dedicated(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15815190')
- @pytest.mark.parametrize('platform', ['win_x64_vs2019'])
- @pytest.mark.parametrize('configuration', ['release'])
- @pytest.mark.build
- def test_build_win_x64_vs2019_release(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
-
- @pytest.mark.test_case_id('C15815191')
- @pytest.mark.parametrize('platform', ['win_x64_vs2019'])
- @pytest.mark.parametrize('configuration', ['release_dedicated'])
- @pytest.mark.build
- def test_build_win_x64_vs2019_release_dedicated(self, workspace, platform, configuration, project, spec):
- workspace.build()
- build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log')
- assert build_helper.verify_build_log(build_log, platform, configuration)
\ No newline at end of file
diff --git a/Tests/BuildSystems/test_lib/__init__.py b/Tests/BuildSystems/test_lib/__init__.py
deleted file mode 100755
index 6ed3dc4bda..0000000000
--- a/Tests/BuildSystems/test_lib/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
\ No newline at end of file
diff --git a/Tests/BuildSystems/test_lib/build_helper.py b/Tests/BuildSystems/test_lib/build_helper.py
deleted file mode 100755
index c2213d139b..0000000000
--- a/Tests/BuildSystems/test_lib/build_helper.py
+++ /dev/null
@@ -1,38 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Helper functions for build systems
-"""
-import os
-import logging
-
-logger = logging.getLogger(__name__)
-
-
-def verify_build_log(build_log_path, platform, configuration):
- """
- This will search the log file for an expected success message for a specific platform configuration.
- :param build_log_path: the full path to the log file. e.g. \\dev\TestResults\timestamp_folder\pytest_results\...
- :param platform: the compiler to use, e.g. "win_x64_vs2017"
- :param configuration: the flavor of the build, e.g. "profile"
- :return: True, if success message is found within the build log. False, if success message is not found and raise an assertion error if the build log cannot be found.
- """
- success_message = "[WAF] 'build_{0}_{1}' finished successfully".format(platform, configuration)
- if os.path.exists(build_log_path):
- with open(build_log_path) as build_file:
- for line in build_file:
- if success_message in line:
- logger.info('Success message was found for {0}_{1}'.format(platform, configuration))
- return True
- logger.info('Success message not found for {0}_{1}'.format(platform, configuration))
- return False
- else:
- logger.info('We cannot find the build log and this is the path we are looking for {0}'.format(build_log_path))
- raise AssertionError
diff --git a/Tests/README.txt b/Tests/README.txt
deleted file mode 100644
index 71598c7890..0000000000
--- a/Tests/README.txt
+++ /dev/null
@@ -1 +0,0 @@
-This folder contains integration tests which do not ship with Lumberyard. Tests that ship with the product can be found in folders adjacent to the code that they test.
\ No newline at end of file
diff --git a/Tests/__init__.py b/Tests/__init__.py
deleted file mode 100755
index 6ed3dc4bda..0000000000
--- a/Tests/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
\ No newline at end of file
diff --git a/Tests/ai/EditorScripts/LY_114727_NavigationComponent_MovementMethods.py b/Tests/ai/EditorScripts/LY_114727_NavigationComponent_MovementMethods.py
deleted file mode 100755
index 75a13b8e17..0000000000
--- a/Tests/ai/EditorScripts/LY_114727_NavigationComponent_MovementMethods.py
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-#
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the "License"). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#
-'''
-This script tests movement methods Transform, Physics and Custom
-'''
-import sys, os
-import time
-import azlmbr.legacy.general as general
-
-from tests_common import TestHelper
-
-class TestMovementMethods(TestHelper):
- def __init__(self):
- TestHelper.__init__(self, log_prefix = 'LY-114727', args=['level'])
-
- def run_test(self):
- # Start by assuming we'll crash and fail
- self.test_success = False
- # Open the level non-interactively
- level_opened = self.open_level(self.get_arg('level'))
- if not level_opened:
- return
-
- # Enter game mode, so that physics in the test level starts running.
- general.enter_game_mode()
- # Wait for game mode to start. (Not sure if this is necessary, just being extra-cautious)
- while (general.is_in_game_mode() != True):
- general.idle_wait(1.0)
- # Wait for game mode to finish. Entities should be navigating
- while (general.is_in_game_mode() == True):
- general.idle_wait(2.0)
-
- # We finished and haven't crashed, so assume success and exit the Editor.
- self.test_success = True
-
-test = TestMovementMethods()
-test.run()
-
diff --git a/Tests/ai/EditorScripts/tests_common.py b/Tests/ai/EditorScripts/tests_common.py
deleted file mode 100755
index 76ad183c60..0000000000
--- a/Tests/ai/EditorScripts/tests_common.py
+++ /dev/null
@@ -1,163 +0,0 @@
-#
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-#
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the "License"). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#
-
-import sys, os
-import azlmbr.legacy.general as general
-import azlmbr.legacy.settings as settings
-
-class TestHelper:
- def __init__(self, log_prefix, args = None):
- self.log_prefix = log_prefix + ': '
- self.test_success = True
- self.args = {}
- if args:
- # Get the level name and heightmap name from command-line args
- if (len(sys.argv) == (len(args) + 1)):
- for arg_index in range(len(args)):
- self.args[args[arg_index]] = sys.argv[arg_index + 1]
- else:
- test_success = False
- self.log('Expected command-line args: {}'.format(args))
-
-
- # Test Setup
- # Set helpers
- # Set viewport size
- # Turn off display mode, antialiasing
- # set log prefix, log test started
- # TODO: Turn off user dialogs like Amazon login, surveys, etc...
- def setup(self):
- self.log('test started')
-
- def after_level_load(self):
- # Enable the Editor to start running its idle loop.
- # This is needed for Python scripts passed into the Editor startup. Since they're executed
- # during the startup flow, they run before idle processing starts. Without this, the engine loop
- # won't run during idle_wait, which will prevent our test level from working.
- general.idle_enable(True)
-
- # Give everything a second to initialize
- general.idle_wait(1.0)
-
- self.original_settings = settings.get_misc_editor_settings()
- self.helpers_visible = general.is_helpers_shown()
- self.viewport_size = general.get_viewport_size()
- # Turn off the helper gizmos if visible
- if (self.helpers_visible):
- general.toggle_helpers()
- general.idle_wait(1.0)
-
- # Set Editor viewport to a well-defined size
- general.set_viewport_size(1280, 720)
- general.idle_wait(1.0)
-
- # Turn off any display info like FPS, as that will mess up our image comparisons
- # Turn off antialiasing as well
- general.run_console("r_displayInfo=0")
- general.run_console("r_antialiasingmode=0")
- general.idle_wait(1.0)
-
-
-
- # Test Teardown
- # Restore everything from above
- # log test results, exit editor
- def teardown(self):
- # Restore the original Editor settings
- settings.set_misc_editor_settings(self.original_settings)
- # If the helper gizmos were on at the start, restore them
- if (self.helpers_visible):
- general.toggle_helpers()
- # Set the viewport back to whatever size it was at the start
- general.set_viewport_size(self.viewport_size.x, self.viewport_size.y)
- general.idle_wait(1.0)
-
- self.log('test finished')
-
- if self.test_success == True:
- self.log('result=SUCCESS')
- general.set_result_to_success()
- else:
- self.log('result=FAILURE')
- general.set_result_to_failure()
-
- general.exit_no_prompt()
-
- def run_test(self):
- self.log('run')
-
- def run(self):
- self.setup()
-
- # Only run the actual test if we didn't have setup issues
- if self.test_success:
- self.run_test()
-
- self.teardown()
-
- def get_arg(self, arg_name):
- if arg_name in self.args:
- return self.args[arg_name]
- return ''
-
-
- # general logger that adds prefix?
- def log(self, log_line):
- general.log(self.log_prefix + log_line)
-
- # isclose: Compares two floating-point values for "nearly-equal"
- # From https://www.python.org/dev/peps/pep-0485/#proposed-implementation :
- def isclose(self, a, b, rel_tol=1e-9, abs_tol=0.0):
- return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
-
-
- # Create a new empty level
- def create_level(self, level_name, heightmap_resolution, heightmap_meters_per_pixel, terrain_texture_resolution, use_terrain):
- self.log('Creating level {}'.format(level_name))
- result = general.create_level_no_prompt(level_name, heightmap_resolution, heightmap_meters_per_pixel, terrain_texture_resolution, use_terrain)
-
- # Result codes are ECreateLevelResult defined in CryEdit.h
- if (result == 1):
- self.log('Temp level already exists')
- elif (result == 2):
- self.log('Failed to create directory')
- elif (result == 3):
- self.log('Directory length is too long')
- elif (result != 0):
- self.log('Unknown error, failed to create level')
- else:
- self.log('Level created successfully')
- self.after_level_load()
-
- return (result == 0)
-
- def open_level(self, level_name):
- # Open the level non-interactively
- self.log('Opening level {}'.format(level_name))
- result = general.open_level_no_prompt(level_name)
- self.after_level_load()
- if result:
- self.log('Level opened successfully')
- else:
- self.log('Unknown error, level failed to open')
-
- return result
-
- # Take Screenshot
- def take_screenshot(self, posX, posY, posZ, rotX, rotY, rotZ):
- # Set our camera position / rotation and wait for the Editor to acknowledge it
- general.set_current_view_position(posX, posY, posZ)
- general.set_current_view_rotation(rotX, rotY, rotZ)
- general.idle_wait(1.0)
- # Request a screenshot and wait for the Editor to process it
- general.run_console("r_GetScreenShot=2")
- general.idle_wait(1.0)
-
diff --git a/Tests/ai/LY_114727_NavigationComponent_test.py b/Tests/ai/LY_114727_NavigationComponent_test.py
deleted file mode 100755
index 3eff39c787..0000000000
--- a/Tests/ai/LY_114727_NavigationComponent_test.py
+++ /dev/null
@@ -1,70 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-
-"""
-ly102242: Runs the ly-102242 level in the Editor which reproduces the appropriate steps for
-bug ly-102242 to crash when spawning an invalid touchbending asset. The touchbending asset
-can be made invalid by including multiple meshes - one with skinning data and one without.
-NOTE: In the bugfixed case, a crash will not occur, but touchbending will not occur and errors
-will be printed to the console every time a new asset gets "touched" (spawned in the physics system).
-"""
-import pytest
-pytest.importorskip('ly_test_tools')
-import logging
-import os
-
-from ..ly_shared import hydra_lytt_test_utils as hydra_utils
-
-logger = logging.getLogger(__name__)
-test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts')
-editor_timeout = 30
-
-@pytest.mark.parametrize('platform', ['win_x64_vs2017'])
-@pytest.mark.parametrize('configuration', ['profile'])
-@pytest.mark.parametrize('project', ['AutomatedTesting'])
-@pytest.mark.parametrize('spec', ['all'])
-@pytest.mark.parametrize('level', ['AI/NavigationComponentTest'])
-class TestNavigationComponent(object):
- @pytest.fixture(autouse=True)
- def setup_teardown(self, request):
- def teardown():
- if hasattr(self, 'cfg_file_name'):
- hydra_utils.cleanup_cfg_file(self.cfg_file_name)
-
- # Setup - add the teardown finalizer
- request.addfinalizer(teardown)
-
- # entities with Transform, Physics and Custom movement methods navigate to the goal
- def test_NavigationComponent(self, request, legacy_editor, level):
-
- cfg_args = [level]
-
- expected_lines = [
- "OnActivate NavigationAgentCustom",
- "OnActivate NavigationAgentPhysics",
- "OnActivate NavigationAgentTransform",
-
- "OnTraversalComplete NavigationAgentCustom",
- "OnTraversalComplete NavigationAgentPhysics",
- "OnTraversalComplete NavigationAgentTransform",
- ]
-
- unexpected_lines = [
- "OnTraversalCanceled NavigationAgentCustom",
- "OnTraversalCanceled NavigationAgentPhysics",
- "OnTraversalCanceled NavigationAgentTransform",
- ]
-
- hydra_utils.launch_and_validate_results(request, test_directory, legacy_editor,
- 'LY_114727_NavigationComponent_MovementMethods.py',
- expected_lines, unexpected_lines, timeout=editor_timeout, cfg_args=cfg_args)
-
diff --git a/Tests/ai/__init__.py b/Tests/ai/__init__.py
deleted file mode 100755
index e912252f4e..0000000000
--- a/Tests/ai/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
diff --git a/Tests/demos/__init__.py b/Tests/demos/__init__.py
deleted file mode 100755
index e912252f4e..0000000000
--- a/Tests/demos/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
diff --git a/Tests/demos/launcher_loading_tests.py b/Tests/demos/launcher_loading_tests.py
deleted file mode 100755
index 6d23f56f1b..0000000000
--- a/Tests/demos/launcher_loading_tests.py
+++ /dev/null
@@ -1,183 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-"""
-import pytest
-import ly_test_tools
-
-import os
-import shutil
-import subprocess
-from ly_test_tools.builtin.helpers import *
-import tempfile
-import time
-# The following imports are used to detect capabilities in the current system
-
-from ly_test_tools.environment.process_utils import *
-import Tests.shared.asset_processor_utils as aputil
-
-# Built-in fixture: provides a ready to use workspace.
-from Tests.shared import substring
-from ly_test_tools.environment.waiter import wait_for
-
-LAUNCHER_TIMEOUT = 120
-
-
-@pytest.mark.system
-class TestProjectLauncher:
- @pytest.fixture(autouse=True)
- def setup_teardown(self, request, workspace, launcher):
- path_to_cache = workspace.paths.asset_cache()
- # Remove previous artifacts from cache
- if os.path.isdir(os.path.join(path_to_cache, "user")):
- shutil.rmtree(os.path.join(path_to_cache, "user"))
-
- user_cfg_path = os.path.join(workspace.paths.dev(), "user.cfg")
- cfg_staging_path = None
-
- # Backup user.cfg if one exists
- if os.path.exists(user_cfg_path):
- cfg_staging_path = os.path.join(tempfile.gettempdir(), "user.cfg")
- shutil.move(user_cfg_path, cfg_staging_path)
-
- # Configure the headless client
- with open(user_cfg_path, "w") as user_cfg:
- user_cfg.write("r_driver=NULL\n")
- user_cfg.write("sys_audio_disable=1\n")
- user_cfg.write("sys_skip_input=1\n")
-
- def teardown():
- launcher.kill()
-
- aputil.kill_asset_processor()
-
- # Restore previous user.cfg if one existed and unconfigure the headless client
- if cfg_staging_path:
- shutil.move(os.path.join(tempfile.gettempdir(), "user.cfg"), user_cfg_path)
- elif os.path.exists(user_cfg_path):
- os.remove(user_cfg_path)
-
- # save logs,screenshots
- if os.path.exists(workspace.paths.project_log()):
- workspace.artifact_manager.save_artifact(workspace.paths.project_log())
- if os.path.isdir(workspace.paths.project_screenshots()):
- workspace.artifact_manager.save_artifact(workspace.paths.project_screenshots())
-
- request.addfinalizer(teardown)
-
- @pytest.mark.parametrize('level', ['Samples/Fur_Technical_Sample', 'Samples/Advanced_RinLocomotion', 'UI/UiFeatures','Samples/Simple_JackLocomotion',
- 'Samples/ScriptedEntityTweenerSample/SampleFullscreenAnimation', 'UI/UiMainMenuLuaSample', 'Samples/Metastream_Sample',
- 'Samples/ScriptCanvas_Sample/ScriptCanvas_Basic_Sample', 'UI/UiIn3DWorld', 'Samples/Audio_Sample'])
- @pytest.mark.test_case_id('C1698289,C1698287,C1698294,C1698280,C1698295,C1698293,C1698289,C1698290,C1698292,C1698288')
- @pytest.mark.parametrize('platform', ['win_x64_vs2017', 'win_x64_vs2019'])
- @pytest.mark.parametrize('configuration', ['profile'])
- @pytest.mark.parametrize('project', ['SamplesProject'])
- @pytest.mark.parametrize('spec', ['all'])
- def test_LaunchAndWait_LoadsLevelAndQuit_NoCrash(self, workspace, level, launcher):
- """
- Launch the Project Launcher and sets the specified level.
- Performs the console steps by passing in args.
- Loads the specified level and quit's the launcher.
- """
- # Fast fail if the level doesn't exist
- assert os.path.exists(os.path.join(workspace.paths.project(), "Levels", level)) and os.path.isdir(
- os.path.join(workspace.paths.project(), "Levels", level)), "Level Doesn't Exist"
-
- launcher.args = ["+map", level]
- launcher.launch()
-
- pattern_string = "Loading level " + level
- test = os.path.join(workspace.paths.project_log(), "Game.log")
- wait_for(lambda: os.path.exists(os.path.join(workspace.paths.project_log(), "Game.log")))
- wait_for(lambda: substring.in_file(
- os.path.join(workspace.paths.project_log(), "Game.log"), pattern_string), LAUNCHER_TIMEOUT)
- assert not os.path.exists(
- os.path.join(workspace.paths.project_log(), "error.log")), "Launcher Crashed Unexpectedly"
-
- # This is a convenient place to also verify LY-90255 for free here
- # (as well as any other text that must appear in the log).
- # writing a separate test to launch the launcher and examine the log would just waste time as the
- # above test already launches the launcher, and waits for it to finish anyway.
-
- assert substring.in_file(os.path.join(workspace.paths.project_log(), "Game.log"), "Initializing CryFont done, MemUsage")
-
-
-
- @pytest.mark.parametrize('level',['UI/UiFeatures','Samples/Metastream_Sample'])
- @pytest.mark.parametrize('platform', ['win_x64_vs2017', 'win_x64_vs2019'])
- @pytest.mark.parametrize('configuration', ['profile'])
- @pytest.mark.parametrize('project', ['SamplesProject'])
- @pytest.mark.parametrize('spec', ['all'])
- def test_LaunchAndWait_LoadsLevelFromPakAndQuit_NoCrash(self, workspace, level, launcher):
- """
- This test ensure that the Launcher can load levels from inside paks
- """
-
- if workspace.platform == 'win_x64_vs2017':
- binDirPath = os.path.join(workspace.paths._dev_path, 'Bin64vc141')
- if workspace.platform == 'win_x64_vs2019':
- binDirPath = os.path.join(workspace.paths._dev_path, 'Bin64vc142')
-
- # Launch APBatch so that it can process all assets and quit
- subprocess.check_call(
- [os.path.join(binDirPath, 'AssetProcessorBatch'), "/gamefolder=SamplesProject"])
-
- lowercaseProjectName = workspace.project.lower()
- cacheLevelDir = os.path.join(workspace.paths.platform_cache(), lowercaseProjectName, "levels")
- cacheTempLevelDir = os.path.join(workspace.paths.platform_cache(), lowercaseProjectName, "templevels")
-
- # Rename levels dir so that runtime cannot load levels from it
- os.rename(cacheLevelDir, cacheTempLevelDir)
- # Make an empty levels folder
- os.mkdir(cacheLevelDir)
-
- # make an archive of all the levels
- outputLevelsArchive = os.path.join(cacheLevelDir, "templevels")
- shutil.make_archive(outputLevelsArchive, 'zip', cacheTempLevelDir)
- # make archive will make a zip file
- outputLevelsArchive = outputLevelsArchive + ".zip"
-
- # change extension from zip to pak
- baseFileName = os.path.splitext(outputLevelsArchive)[0]
- os.rename(outputLevelsArchive, baseFileName + ".pak")
-
- # Launching AP again for SamplesProject gameproject
- subprocess.Popen([os.path.join(binDirPath, 'AssetProcessor'), "/gamefolder=SamplesProject", "--zeroAnalysisMode"])
-
- # Waiting to give AP time some time to start the listening thread otherwise the launcher will try to launch another instance of AP
- time.sleep(1)
-
- # ensure that in the cache level does not exist on disk
- assert not os.path.exists(os.path.join(cacheLevelDir, level))
-
- # load the levels
- launcher.args = ["+map", level]
- launcher.launch()
-
- pattern_string = "Loading level " + level
- wait_for(lambda: os.path.exists(os.path.join(workspace.paths.project_log(), "Game.log")))
- wait_for(lambda: substring.in_file(
- os.path.join(workspace.paths.project_log(), "Game.log"), pattern_string), LAUNCHER_TIMEOUT)
- assert not os.path.exists(
- os.path.join(workspace.paths.project_log(), "error.log")), "Launcher Crashed Unexpectedly"
-
- loaded_level_pattern = "Level " + level + " loaded"
- wait_for(lambda: substring.in_file(
- os.path.join(workspace.paths.project_log(), "Game.log"), loaded_level_pattern), LAUNCHER_TIMEOUT)
-
- launcher.stop()
-
- aputil.kill_asset_processor()
-
- shutil.rmtree(cacheLevelDir)
- os.rename(cacheTempLevelDir, cacheLevelDir)
-
-
-
diff --git a/Tests/demos/mac/__init__.py b/Tests/demos/mac/__init__.py
deleted file mode 100755
index e912252f4e..0000000000
--- a/Tests/demos/mac/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
diff --git a/Tests/demos/mac/demos_mac.py b/Tests/demos/mac/demos_mac.py
deleted file mode 100755
index a2a44eab20..0000000000
--- a/Tests/demos/mac/demos_mac.py
+++ /dev/null
@@ -1,142 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-These tests will validate that StarterGame and SamplesProject can be setup and built, have no failing assets processed,
-and will then have a screen shot taken to verify that it renders normally. All the logs and screenshots will be
-transferred to the test results to be zipped up and added to the Flume result. These projects will be run in profile
-and debug.
-"""
-import logging
-import os
-import pytest
-
-from demos.test_lib.demos_testlib import load_level, remote_console_take_screenshot, start_launcher, start_remote_console
-import shared.shader_compile_server_utils as compile_server
-import test_tools.shared.file_utils as file_utils
-from test_tools.shared.launcher_testlib import configure_setup, assert_build_success, assert_process_assets
-
-import test_tools.builtin.fixtures as fixtures
-from test_tools import MAC_LAUNCHER
-import test_tools.launchers.phase
-from test_tools.shared.remote_console_commands import RemoteConsole
-
-logger = logging.getLogger(__name__)
-
-workspace = fixtures.use_fixture(fixtures.builtin_workspace_fixture, scope='function')
-
-
-@pytest.fixture
-def launcher_instance(request, workspace, level):
- """
- Creates a launcher fixture instance with an extra teardown for error log grabbing.
- """
- def teardown():
- """
- Tries to grab any error logs before moving on to the next test.
- """
- compile_server.stop_shader_compile_server()
-
- if os.path.exists(launcher.workspace.release.paths.project_log()):
- for file_name in os.listdir(launcher.workspace.release.paths.project_log()):
- file_utils.move_file(launcher.workspace.release.paths.project_log(),
- launcher.workspace.artifact_manager.get_save_artifact_path(),
- file_name)
-
- logs_exist = lambda: file_utils.gather_error_logs(
- launcher.workspace.release.paths.dev(),
- launcher.workspace.artifact_manager.get_save_artifact_path())
- try:
- test_tools.shared.waiter.wait_for(logs_exist)
- except AssertionError:
- print("No error logs found. Completing test...")
-
- request.addfinalizer(teardown)
-
- launcher = fixtures.launcher(request, workspace, level)
- return launcher
-
-
-@pytest.fixture
-def remote_console_instance(request):
- """
- Creates a remote console instance to send console commands.
- """
- console = RemoteConsole()
-
- def teardown():
- try:
- console.stop()
- except:
- pass
-
- request.addfinalizer(teardown)
-
- return console
-
-
-@pytest.mark.parametrize("platform,configuration,project,spec,level", [
- pytest.param("darwin_x64", "profile", "StarterGame", "all", "StarterGame",
- marks=pytest.mark.skipif(not MAC_LAUNCHER, reason="Only supported on Mac hosts")),
- pytest.param("darwin_x64", "debug", "StarterGame", "all", "StarterGame",
- marks=pytest.mark.skipif(not MAC_LAUNCHER, reason="Only supported on Mac hosts")),
- ])
-class TestSingleLevel(object):
- def test_single_level(self, launcher_instance, configuration, level, remote_console_instance):
- """
- Verifies projects with a given demo-level can compile and successfully launch.
- """
- configure_setup(launcher_instance)
-
- assert_build_success(launcher_instance)
- assert_process_assets(launcher_instance)
-
- compile_server.start_mac_shader_compile_server(os.path.join(launcher_instance.workspace.release.paths.dev(),
- "Tools"), configuration)
- start_launcher(launcher_instance)
- start_remote_console(launcher_instance, remote_console_instance)
-
- load_level(launcher_instance, remote_console_instance, level)
- remote_console_take_screenshot(launcher_instance, remote_console_instance, level)
-
-
-@pytest.mark.parametrize("platform,configuration,project,spec,level,levels", [
- pytest.param("darwin_x64", "profile", "SamplesProject", "all", "Advanced_RinLocomotion",
- ["Advanced_RinLocomotion", "Audio_Sample", "Fur_Technical_Sample",
- "Gems_InAppPurchases_Sample", "Metastream_Sample", "ScriptCanvas_Basic_Sample",
- "Simple_JackLocomotion", "SampleFullscreenAnimation", "UiFeatures", "UiIn3DWorld",
- "UiMainMenuLuaSample", "UiMainMenuScriptCanvasSample"],
- marks=pytest.mark.skipif(not MAC_LAUNCHER, reason="Only supported on Mac hosts")),
- pytest.param("darwin_x64", "debug", "SamplesProject", "all", "Advanced_RinLocomotion",
- ["Advanced_RinLocomotion", "Audio_Sample", "Fur_Technical_Sample",
- "Gems_InAppPurchases_Sample", "Metastream_Sample", "ScriptCanvas_Basic_Sample",
- "Simple_JackLocomotion", "SampleFullscreenAnimation", "UiFeatures", "UiIn3DWorld",
- "UiMainMenuLuaSample", "UiMainMenuScriptCanvasSample"],
- marks=pytest.mark.skipif(not MAC_LAUNCHER, reason="Only supported on Mac hosts")),
- ])
-# Testing for projects with multiple demo levels
-class TestMultipleLevels(object):
- """
- Verifies projects with multiple demo-levels can compile and successfully launch.
- """
- def test_multiple_levels(self, launcher_instance, configuration, levels, remote_console_instance):
- configure_setup(launcher_instance)
-
- assert_build_success(launcher_instance)
- assert_process_assets(launcher_instance)
-
- compile_server.start_mac_shader_compile_server(os.path.join(launcher_instance.workspace.release.paths.dev(),
- "Tools"), configuration)
- start_launcher(launcher_instance)
- start_remote_console(launcher_instance, remote_console_instance)
-
- # Switch to each level, check if it loads and takes a screen shot, then move to test folder for Flume
- for level in levels:
- load_level(launcher_instance, remote_console_instance, level)
- remote_console_take_screenshot(launcher_instance, remote_console_instance, level)
diff --git a/Tests/demos/test_lib/__init__.py b/Tests/demos/test_lib/__init__.py
deleted file mode 100755
index e912252f4e..0000000000
--- a/Tests/demos/test_lib/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
diff --git a/Tests/demos/test_lib/demos_testlib.py b/Tests/demos/test_lib/demos_testlib.py
deleted file mode 100755
index 46ed627cab..0000000000
--- a/Tests/demos/test_lib/demos_testlib.py
+++ /dev/null
@@ -1,70 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-This demos_testlib file is used for a collection of reusable functionality that QA will use in their scripts specific
-to the setup of demo level tests.
-"""
-import sys
-
-import shared.network_utils as network_utils
-from shared.screenshot_utils import move_screenshots, take_screenshot_with_retries
-
-from test_tools.shared.launcher_testlib import *
-
-import test_tools.shared.waiter
-
-
-def start_launcher(launcher):
- """
- For PC: Used to start launcher and give time to load.
- """
- launcher.launch()
- launcher.run(test_tools.launchers.phase.TimePhase(120, 120))
-
-
-def load_level(launcher, remote_console, level):
- """
- Uses the remote console to use the map command to load a level and checks the console output for a successful load.
- """
- command = 'map {}'.format(level)
- load = remote_console.expect_log_line('LEVEL_LOAD_COMPLETE', 300)
- retry_console_command(remote_console, command, "Executing console command '{}'".format(command))
- assert load(), "{} level failed to load.".format(level)
-
- # Allow one minute to let level fully render and to test for stability
- launcher.run(test_tools.launchers.phase.TimePhase(60, 60))
-
-
-def start_remote_console(launcher, remote_console, on_devkit=False):
- """
- Starts the remote console. Used in QA scripts that require the use of remote console.
- """
- if on_devkit:
- test_tools.shared.waiter.wait_for(lambda: network_utils.check_for_remote_listening_port(4600, launcher.ip),
- timeout=600, exc=AssertionError('Port 4600 not listening.'))
- else:
- test_tools.shared.waiter.wait_for(lambda: network_utils.check_for_listening_port(4600), timeout=300,
- exc=AssertionError('Port 4600 not listening.'))
-
- remote_console.start()
-
- # Allows remote console time to connect to launcher.
- launcher.run(test_tools.launchers.phase.TimePhase(60, 60))
-
-
-def remote_console_take_screenshot(launcher, remote_console, level):
- """
- Uses the remote console to run the r_GetScreenshot command to take a screenshot of the current launcher and move
- the screenshot to the test results location.
- """
- screenshot_path = os.path.join(launcher.workspace.release.paths.platform_cache(), "user", "screenshots")
- take_screenshot_with_retries(remote_console, launcher, level)
- if os.path.exists(screenshot_path):
- move_screenshots(screenshot_path, '.jpg', launcher.workspace.artifact_manager.get_save_artifact_path())
diff --git a/Tests/demos/win/__init__.py b/Tests/demos/win/__init__.py
deleted file mode 100755
index 4d5680a30d..0000000000
--- a/Tests/demos/win/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-#
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the "License"). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#
diff --git a/Tests/demos/win/demos_pc.py b/Tests/demos/win/demos_pc.py
deleted file mode 100755
index cb8b9a0e4b..0000000000
--- a/Tests/demos/win/demos_pc.py
+++ /dev/null
@@ -1,151 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-These tests will validate that each project can be setup and built, have no failing assets processed, and will then
-have a screenshot taken to verify that it renders normally. All the logs and screenshots will be transferred to the
-test results to be zipped up and added to the Flume result. These projects will be run in profile and debug.
-Currently SearchForEden and Bistro are failing and are temporarily commented out of these tests.
-"""
-import logging
-import os
-import pytest
-
-from demos.test_lib.demos_testlib import load_level, remote_console_take_screenshot, start_launcher, start_remote_console
-from test_tools.shared.file_utils import gather_error_logs, move_file
-from test_tools.shared.launcher_testlib import configure_setup, assert_build_success, assert_process_assets
-
-from test_tools import WINDOWS_LAUNCHER
-import test_tools.builtin.fixtures as fixtures
-import test_tools.launchers.phase
-from test_tools.shared.remote_console_commands import RemoteConsole
-
-logger = logging.getLogger(__name__)
-
-# use_fixture registers the imported fixture in pytest at the specified scope. The test should provide all the
-# parameters in the fixture's signature
-workspace = fixtures.use_fixture(fixtures.builtin_workspace_fixture, scope='function')
-
-
-@pytest.fixture
-def launcher_instance(request, workspace, level):
- """
- Creates a launcher fixture instance with an extra teardown for error log grabbing.
- """
- def teardown():
- """
- Tries to grab any error logs before moving on to the next test.
- """
- if os.path.exists(launcher.workspace.release.paths.project_log()):
- for file_name in os.listdir(launcher.workspace.release.paths.project_log()):
- move_file(launcher.workspace.release.paths.project_log(),
- launcher.workspace.artifact_manager.get_save_artifact_path(),
- file_name)
-
- logs_exist = lambda: gather_error_logs(
- launcher.workspace.release.paths.dev(),
- launcher.workspace.artifact_manager.get_save_artifact_path())
- try:
- test_tools.shared.waiter.wait_for(logs_exist)
- except AssertionError:
- print("No error logs found. Completing test...")
-
- request.addfinalizer(teardown)
-
- launcher = fixtures.launcher(request, workspace, level)
- return launcher
-
-
-@pytest.fixture
-def remote_console_instance(request):
- """
- Creates a remote console instance to send console commands.
- """
- console = RemoteConsole()
-
- def teardown():
- try:
- console.stop()
- except:
- pass
-
- request.addfinalizer(teardown)
-
- return console
-
-
-@pytest.mark.parametrize("platform,configuration,project,spec,level", [
- pytest.param("win_x64_vs2017", "profile", "StarterGame", "all", "StarterGame",
- marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")),
- pytest.param("win_x64_vs2019", "profile", "StarterGame", "all", "StarterGame",
- marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")),
- pytest.param("win_x64_vs2017", "debug", "StarterGame", "all", "StarterGame",
- marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")),
- pytest.param("win_x64_vs2019", "debug", "StarterGame", "all", "StarterGame",
- marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")),
- ])
-class TestSingleLevel(object):
- def test_single_level(self, launcher_instance, level, remote_console_instance):
- """
- Verifies projects with a given demo-level can compile and successfully launch.
- """
- configure_setup(launcher_instance)
-
- assert_build_success(launcher_instance)
- assert_process_assets(launcher_instance)
-
- start_launcher(launcher_instance)
- start_remote_console(launcher_instance, remote_console_instance)
-
- load_level(launcher_instance, remote_console_instance, level)
- remote_console_take_screenshot(launcher_instance, remote_console_instance, level)
-
-
-@pytest.mark.parametrize("platform,configuration,project,spec,level,levels", [
- pytest.param("win_x64_vs2017", "profile", "SamplesProject", "all", "Advanced_RinLocomotion",
- ["Advanced_RinLocomotion", "Audio_Sample", "Fur_Technical_Sample", "Gems_InAppPurchases_Sample",
- "Metastream_Sample", "ScriptCanvas_Basic_Sample", "Simple_JackLocomotion",
- "SampleFullscreenAnimation", "UiDrawCallsSample", "UiFeatures", "UiIn3DWorld", "UiMainMenuLuaSample",
- "UiMainMenuScriptCanvasSample", "UiTextureAtlasSample"],
- marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")),
- pytest.param("win_x64_vs2019", "profile", "SamplesProject", "all", "Advanced_RinLocomotion",
- ["Advanced_RinLocomotion", "Audio_Sample", "Fur_Technical_Sample", "Gems_InAppPurchases_Sample",
- "Metastream_Sample", "ScriptCanvas_Basic_Sample", "Simple_JackLocomotion",
- "SampleFullscreenAnimation", "UiDrawCallsSample", "UiFeatures", "UiIn3DWorld", "UiMainMenuLuaSample",
- "UiMainMenuScriptCanvasSample", "UiTextureAtlasSample"],
- marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")),
- pytest.param("win_x64_vs2017", "debug", "SamplesProject", "all", "Advanced_RinLocomotion",
- ["Advanced_RinLocomotion", "Audio_Sample", "Fur_Technical_Sample", "Gems_InAppPurchases_Sample",
- "Metastream_Sample", "ScriptCanvas_Basic_Sample", "Simple_JackLocomotion",
- "SampleFullscreenAnimation", "UiDrawCallsSample", "UiFeatures", "UiIn3DWorld", "UiMainMenuLuaSample",
- "UiMainMenuScriptCanvasSample", "UiTextureAtlasSample"],
- marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")),
- pytest.param("win_x64_vs2019", "debug", "SamplesProject", "all", "Advanced_RinLocomotion",
- ["Advanced_RinLocomotion", "Audio_Sample", "Fur_Technical_Sample", "Gems_InAppPurchases_Sample",
- "Metastream_Sample", "ScriptCanvas_Basic_Sample", "Simple_JackLocomotion",
- "SampleFullscreenAnimation", "UiDrawCallsSample", "UiFeatures", "UiIn3DWorld", "UiMainMenuLuaSample",
- "UiMainMenuScriptCanvasSample", "UiTextureAtlasSample"],
- marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts"))
- ])
-class TestMultipleLevels(object):
- def test_multiple_levels(self, launcher_instance, levels, remote_console_instance):
- """
- Verifies projects with multiple demo-levels can compile and successfully launch.
- """
- configure_setup(launcher_instance)
-
- assert_build_success(launcher_instance)
- assert_process_assets(launcher_instance)
-
- start_launcher(launcher_instance)
- start_remote_console(launcher_instance, remote_console_instance)
-
- for level in levels:
- load_level(launcher_instance, remote_console_instance, level)
- remote_console_take_screenshot(launcher_instance, remote_console_instance, level)
diff --git a/Tests/graphics/__init__.py b/Tests/graphics/__init__.py
deleted file mode 100755
index 6ed3dc4bda..0000000000
--- a/Tests/graphics/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
\ No newline at end of file
diff --git a/Tests/graphics/ly107748_LightningArcProperties.cfg b/Tests/graphics/ly107748_LightningArcProperties.cfg
deleted file mode 100644
index fe05f5f782..0000000000
--- a/Tests/graphics/ly107748_LightningArcProperties.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-# this file is copied to $/dev/editor_autoexec.cfg so the the Editor automation runs for this Hydra test
-pyRunFile @devroot@/Tests/graphics/ly107748_LightningArcProperties_test_case.py
\ No newline at end of file
diff --git a/Tests/graphics/ly107748_LightningArcProperties_test.py b/Tests/graphics/ly107748_LightningArcProperties_test.py
deleted file mode 100755
index 59cc3d8d1b..0000000000
--- a/Tests/graphics/ly107748_LightningArcProperties_test.py
+++ /dev/null
@@ -1,83 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-#
-# This is a pytest module to test the in-Editor Python API from PythonEditorFuncs
-#
-import pytest
-pytest.importorskip('test_tools')
-import time
-import logging
-import os
-import shutil
-
-from test_tools import WINDOWS_LAUNCHER
-import test_tools.shared.log_monitor
-import test_tools.launchers.phase
-import test_tools.builtin.fixtures as fixtures
-
-# Use the built-in workspace and editor fixtures.
-# These will configure the requested project and run the editor.
-workspace = fixtures.use_fixture(fixtures.builtin_workspace_fixture, scope='function')
-editor = fixtures.use_fixture(fixtures.editor, scope='function')
-
-logger = logging.getLogger(__name__)
-
-
-@pytest.mark.parametrize("platform,configuration,project,spec", [
- pytest.param("win_x64_vs2017", "profile", "AutomatedTesting", "all", marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")),
-])
-class TestLightningArcPropertyRanges(object):
-
- @pytest.fixture(autouse=True)
- def setup_teardown(self, request, workspace, editor):
- def teardown():
- editor.ensure_stopped()
-
- file_utils.delete_level(editor, "LightningArcTestLevel")
-
- request.addfinalizer(teardown)
-
- def test_change_properties(self, request, editor, project):
- logger.debug("Running automated test")
-
- request.addfinalizer(editor.ensure_stopped)
-
- editor.deploy()
- editor.launch(["--exec", "@engroot@/Tests/graphics/ly107748_LightningArcProperties.cfg"])
-
- editorlog_file = os.path.join(editor.workspace.release.paths.project_log(), 'Editor.log')
-
- # LY-107861 LY-108088
- # expected failure cases are commented out pending implementation of property validation by hydra
- expected_lines = [
- "Created new entity.",
- "Lightning Arc component added to entity.",
- #"ChangeProperty m_config|Arc Parameters|Segment Count to 0 failed.",
- "ChangeProperty m_config|Arc Parameters|Segment Count to 1 succeeded.",
- "ChangeProperty m_config|Arc Parameters|Segment Count to 25 succeeded.",
- "ChangeProperty m_config|Arc Parameters|Segment Count to 50 succeeded.",
- "ChangeProperty m_config|Arc Parameters|Segment Count to 70 succeeded.",
- #"ChangeProperty m_config|Arc Parameters|Segment Count to 75 failed.",
- #"ChangeProperty m_config|Arc Parameters|Segment Count to 100 failed.",
- #"ChangeProperty m_config|Arc Parameters|Point Count to 0 failed.",
- "ChangeProperty m_config|Arc Parameters|Point Count to 1 succeeded.",
- "ChangeProperty m_config|Arc Parameters|Point Count to 25 succeeded.",
- "ChangeProperty m_config|Arc Parameters|Point Count to 50 succeeded.",
- "ChangeProperty m_config|Arc Parameters|Point Count to 70 succeeded.",
- #"ChangeProperty m_config|Arc Parameters|Point Count to 75 failed.",
- #"ChangeProperty m_config|Arc Parameters|Point Count to 100 failed.",
- ]
-
- test_tools.shared.log_monitor.monitor_for_expected_lines(editor, editorlog_file, expected_lines)
-
- # Rely on the test script to quit after running
- editor.run(test_tools.launchers.phase.WaitForLauncherToQuit(editor, 10))
diff --git a/Tests/graphics/ly107748_LightningArcProperties_test_case.py b/Tests/graphics/ly107748_LightningArcProperties_test_case.py
deleted file mode 100755
index dd0c72e893..0000000000
--- a/Tests/graphics/ly107748_LightningArcProperties_test_case.py
+++ /dev/null
@@ -1,80 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-# Tests a portion of the Component Property Get/Set Python API while the Editor is running
-
-import azlmbr.legacy.general as general
-import azlmbr.bus as bus
-import azlmbr.entity as entity
-import azlmbr.editor as editor
-import azlmbr.math as math
-
-
-# Create a test level
-general.create_level_no_prompt("LightningArcTestLevel", 1024, 1, 1024, True)
-
-def ChangeProperty(component, path, value):
- getPropertyOutcome = editor.EditorComponentAPIBus(bus.Broadcast, 'GetComponentProperty', component, path)
- if not(getPropertyOutcome.IsSuccess()):
- print("GetComponentProperty " + path + " failed.")
- else:
- oldValue = getPropertyOutcome.GetValue()
-
- setPropertyOutcome = editor.EditorComponentAPIBus(bus.Broadcast, 'SetComponentProperty', component, path, value)
- if not(setPropertyOutcome.IsSuccess()):
- print("SetComponentProperty " + path + " to " + str(value) + " failed.")
-
- getPropertyOutcome = editor.EditorComponentAPIBus(bus.Broadcast, 'GetComponentProperty', component, path)
- if not(getPropertyOutcome.IsSuccess()):
- print("GetComponentProperty " + path + " failed.")
- else:
- newValue = getPropertyOutcome.GetValue()
-
- if not(newValue == oldValue):
- print("ChangeProperty " + path + " to " + str(value) + " succeeded.")
- else:
- print("ChangeProperty " + path + " to " + str(value) + " failed.")
-
-# Create new Entity
-entityId = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', entity.EntityId())
-
-if (entityId.IsValid()):
- print("Created new entity.")
-
-# Get Component Type for Lightning Arc
-typeIdsList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', ["Lightning Arc"], entity.EntityType().Game)
-
-componentOutcome = editor.EditorComponentAPIBus(bus.Broadcast, 'AddComponentsOfType', entityId, typeIdsList)
-
-if (componentOutcome.IsSuccess()):
- print("Lightning Arc component added to entity.")
-
-components = componentOutcome.GetValue()
-component = components[0]
-
-# Tests for GetComponentProperty/SetComponentProperty
-ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 0)
-ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 1)
-ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 25)
-ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 50)
-ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 70)
-ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 75)
-ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 100)
-
-ChangeProperty(component, "m_config|Arc Parameters|Point Count", 0)
-ChangeProperty(component, "m_config|Arc Parameters|Point Count", 1)
-ChangeProperty(component, "m_config|Arc Parameters|Point Count", 25)
-ChangeProperty(component, "m_config|Arc Parameters|Point Count", 50)
-ChangeProperty(component, "m_config|Arc Parameters|Point Count", 70)
-ChangeProperty(component, "m_config|Arc Parameters|Point Count", 75)
-ChangeProperty(component, "m_config|Arc Parameters|Point Count", 100)
-
-general.exit_no_prompt()
diff --git a/Tests/hydra/ctests/open_level_tweak_and_exit.py b/Tests/hydra/ctests/open_level_tweak_and_exit.py
deleted file mode 100755
index de81327852..0000000000
--- a/Tests/hydra/ctests/open_level_tweak_and_exit.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-# --runpythontest @devroot@\tests\hydra\ctests\open_level_tweak_and_exit.py
-# An example of how a create a level, make an entity, and terminate successfully
-
-import time
-import azlmbr.editor
-import azlmbr.entity
-import azlmbr.framework
-import azlmbr.legacy.general as general
-from azlmbr.bus import Broadcast
-
-handler = None
-
-def open_level(level):
- print('opening level {}'.format(level))
- azlmbr.editor.EditorToolsApplicationRequestBus(Broadcast, 'OpenLevelNoPrompt', level)
- general.idle_wait(1.0)
-
-def on_entity_registered(args):
- print('on_entity_registered')
- azlmbr.framework.Terminate(0)
-
-def main():
- print ('open_level_tweak_and_exit - starting')
- open_level('auto_test')
-
- azlmbr.editor.ToolsApplicationRequestBus(Broadcast, 'CreateNewEntity', azlmbr.entity.EntityId())
- general.idle_wait(1.0)
-
- handler = azlmbr.editor.ToolsApplicationNotificationBusHandler()
- handler.connect()
- handler.add_callback('EntityRegistered', on_entity_registered)
- azlmbr.editor.ToolsApplicationRequestBus(Broadcast, 'CreateNewEntity', azlmbr.entity.EntityId())
-
-if __name__ == "__main__":
- main()
diff --git a/Tests/hydra/ctests/start_stop.py b/Tests/hydra/ctests/start_stop.py
deleted file mode 100755
index c8fd670a97..0000000000
--- a/Tests/hydra/ctests/start_stop.py
+++ /dev/null
@@ -1,34 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-# --runpythontest @devroot@\tests\hydra\ctests\start_stop.py
-# an example of a test script that loads a level, listens for the first entity, and terminates the Editor with a 0
-
-import azlmbr.framework
-import azlmbr.editor
-import azlmbr.bus
-
-handler = None
-
-def on_entity_registered(args):
- print('on_entity_registered')
- azlmbr.framework.Terminate(0)
-
-def main():
- print ('hello, start_stop')
- handler = azlmbr.editor.ToolsApplicationNotificationBusHandler()
- handler.connect()
- handler.add_callback('EntityRegistered', on_entity_registered)
- azlmbr.editor.EditorToolsApplicationRequestBus(azlmbr.bus.Broadcast, 'OpenLevelNoPrompt', 'auto_test')
- print ('start_stop started')
-
-if __name__ == "__main__":
- main()
diff --git a/Tests/hydra/ctests/start_with_args.py b/Tests/hydra/ctests/start_with_args.py
deleted file mode 100755
index e8b99b54ac..0000000000
--- a/Tests/hydra/ctests/start_with_args.py
+++ /dev/null
@@ -1,28 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-# --runpythontest @devroot@\tests\hydra\ctests\start_with_args.py --runpythonargs foo bar baz
-# An example of how to use runpythontest with a main() + args
-
-import azlmbr.framework
-
-def main():
- print("hello, start_with_args")
-
- # print command line arguments
- for arg in sys.argv:
- print (arg)
-
- azlmbr.framework.Terminate(0)
-
-if __name__ == "__main__":
- main()
-
diff --git a/Tests/hydra/ctests/stop_with_error_one.py b/Tests/hydra/ctests/stop_with_error_one.py
deleted file mode 100755
index b17b5247aa..0000000000
--- a/Tests/hydra/ctests/stop_with_error_one.py
+++ /dev/null
@@ -1,17 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-# --runpythontest @devroot@\tests\hydra\ctests\stop_with_error_one.py
-# an example terminating with a non-zero return code from Editor.exe
-
-import azlmbr.framework
-print ('hello, stop_with_error_one')
-azlmbr.framework.Terminate(1)
diff --git a/Tests/hydra/ctests/stop_with_zero.py b/Tests/hydra/ctests/stop_with_zero.py
deleted file mode 100755
index d1d3f4f58d..0000000000
--- a/Tests/hydra/ctests/stop_with_zero.py
+++ /dev/null
@@ -1,17 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-# --runpythontest @devroot@\tests\hydra\ctests\stop_with_zero.py
-# An example of how a test script stops the Editor.exe with a succuessful zero return code
-
-import azlmbr.framework
-print ('hello, stop_with_zero')
-azlmbr.framework.Terminate(0)
diff --git a/Tests/hydra/ctests/throws_exception.py b/Tests/hydra/ctests/throws_exception.py
deleted file mode 100755
index e8b4507fb1..0000000000
--- a/Tests/hydra/ctests/throws_exception.py
+++ /dev/null
@@ -1,19 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-# --runpythontest @devroot@\tests\hydra\ctests\throws_exception.py
-# An example of how a test script to fatal from Editor.exe when a Python exception happens
-
-print ('hello, throws_exception')
-foo = 1.0
-bar = 0.0
-baz = foo / bar
-
diff --git a/Tests/ly_shared/PlatformSetting.py b/Tests/ly_shared/PlatformSetting.py
deleted file mode 100755
index b215275c16..0000000000
--- a/Tests/ly_shared/PlatformSetting.py
+++ /dev/null
@@ -1,69 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Class for querying and setting a system setting/preference.
-
-"""
-
-import pytest
-import logging
-from typing import Optional, Any
-
-import ly_test_tools.o3de.pipeline_utils as utils
-
-logger = logging.getLogger(__name__)
-
-
-class PlatformSetting:
- """
- Interface for managing different platforms' system variables.
- """
-
- class DATA_TYPE:
- """Platform-agnostic data type enums"""
-
- INT = 1
- STR = 2
- STR_LIST = 3
-
- def __init__(self, workspace: pytest.fixture, subkey: str, key: str) -> None:
- self._workspace = workspace
- self._key = key
- self._subkey = subkey
-
- def get_value(self, get_type: bool = False) -> object:
- """Gets the current setting's value (and optionally type as tuple) from the system. Returns None if entry DNE"""
- raise NotImplementedError("Virtual PlatformSetting not implemented. Instantiate a specific platform")
-
- def set_value(self, value: any) -> bool:
- """Sets the current setting's value. Creates the entry if it DNE. Returns True for success."""
- raise NotImplementedError("Virtual PlatformSetting not implemented. Instantiate a specific platform")
-
- def delete_entry(self) -> bool:
- """Deletes the settings entry. Returns boolean for success."""
- raise NotImplementedError("Virtual PlatformSetting not implemented. Instantiate a specific platform")
-
- def entry_exists(self) -> bool:
- """Checks if the settings entry exists."""
- raise NotImplementedError("Virtual PlatformSetting not implemented. Instantiate a specific platform")
-
- @staticmethod
- def get_system_setting(workspace: pytest.fixture, subkey: str, key: str, hive: Optional[str] = None) -> Any:
- """Factory method creates a platform-specific system setting accessor"""
- if workspace.asset_processor_platform is 'windows':
- # import WindowsSetting and return an instance
- from Tests.ly_shared.WindowsRegistrySetting import WindowsRegistrySetting
-
- return WindowsRegistrySetting(workspace, subkey, key, hive)
- # ########################################################
- # Insert Mac (and Linux?) Setting implementations
- # ########################################################
- else:
- raise NotImplementedError(f"Platform: {workspace.platform} not supported yet")
diff --git a/Tests/ly_shared/PlatformSettingTest.py b/Tests/ly_shared/PlatformSettingTest.py
deleted file mode 100755
index f0ef8b6d1a..0000000000
--- a/Tests/ly_shared/PlatformSettingTest.py
+++ /dev/null
@@ -1,92 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Tests the functionality of the PlatformSetting class
-"""
-
-import pytest
-
-import ly_test_tools.builtin.helpers as helpers
-from Tests.ly_shared.PlatformSetting import PlatformSetting
-
-all_platforms = helpers.all_host_platforms_params()
-automatic_platform_skipping = helpers.automatic_platform_skipping
-targetProjects = ["Helios"]
-
-
-@pytest.mark.usefixtures("automatic_platform_skipping")
-@pytest.mark.parametrize("platform", all_platforms)
-@pytest.mark.parametrize("configuration", ["profile"])
-@pytest.mark.parametrize("spec", ["all"])
-@pytest.mark.parametrize("project", targetProjects)
-class TestsPlatformSetting(object):
- """
- Tests for the PlatformSetting class
- """
-
- def test_PlatformSetting(self, workspace):
-
- key = "Software"
- subkey = "TemporarySystemSetting"
-
- # Create setting reference
- setting = PlatformSetting.get_system_setting(workspace, subkey, key)
-
- # Test storing integer
- value = 74
- setting.set_value(value)
-
- # Test creation of subkey
- assert setting.entry_exists(), f"Failed creating key:subkey, {key}:{subkey}"
-
- # Test data retrieval (without type)
- retrieved = setting.get_value()
- # fmt:off
- assert retrieved == value, \
- f"Unexpected value retrieved from system settings. Expected: {value}, Actual: {retrieved}"
- # fmt:on
-
- # Test data retrieval (with type)
- retrieved = setting.get_value(get_type=True)
- assert type(retrieved) == tuple, "Getting value with type DID NOT return a tuple"
- assert len(retrieved) == 2, f"Getting value with type returned a tuple of size {len(retrieved)}: expected 2"
- assert retrieved[1] == PlatformSetting.DATA_TYPE.INT, "Value stored was int, but type retrieved was NOT int"
- assert type(retrieved[0]) == int, "Value stored was int, but value retrieved was NOT int"
-
- # fmt:off
- assert retrieved[0] == value, \
- f"Unexpected value retrieved from system settings. Expected: {value}, Actual: {retrieved[0]}"
- # fmt:on
-
- # Test storing string
- value = "Some Text"
- setting.set_value(value)
- retrieved = setting.get_value(get_type=True)
- assert (
- retrieved[1] == PlatformSetting.DATA_TYPE.STR
- ), "Value stored was string, but type retrieved was NOT string"
- assert type(retrieved[0]) == str, "Value stored was string, but value retrieved was NOT string"
- assert value == retrieved[0], f"Value retrieved not expected. Expected: {value}, Actual: {retrieved[0]}"
-
- # Test storing list of strings
- value = ["Some", "List", "Of", "Text"]
- setting.set_value(value)
- retrieved = setting.get_value(get_type=True)
- assert (
- retrieved[1] == PlatformSetting.DATA_TYPE.STR_LIST
- ), "Value stored was string list, but type retrieved was NOT string list"
- assert type(retrieved[0]) == list, "Value stored was string, but value retrieved was NOT string"
- # fmt:off
- assert sorted(value) == sorted(retrieved[0]), f"Value retrieved not expected. " \
- f"Expected: {value}, Actual: {retrieved[0]}"
- # fmt:on
-
- setting.delete_entry()
- assert not setting.entry_exists(), f"Failed to delete key:subkey, {key}:{subkey}"
diff --git a/Tests/ly_shared/WindowsRegistrySetting.py b/Tests/ly_shared/WindowsRegistrySetting.py
deleted file mode 100755
index c1aa4e4a98..0000000000
--- a/Tests/ly_shared/WindowsRegistrySetting.py
+++ /dev/null
@@ -1,165 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Class for querying and setting a windows registry setting.
-
-"""
-import pytest
-import logging
-from typing import List, Optional, Tuple, Any
-
-from winreg import (
- CreateKey,
- OpenKey,
- QueryValueEx,
- DeleteValue,
- SetValueEx,
- KEY_ALL_ACCESS,
- KEY_WRITE,
- REG_SZ,
- REG_MULTI_SZ,
- REG_DWORD,
- HKEY_CURRENT_USER,
-)
-
-
-from Tests.ly_shared.PlatformSetting import PlatformSetting
-
-logger = logging.getLogger(__name__)
-
-
-class WindowsRegistrySetting(PlatformSetting):
- def __init__(self, workspace: pytest.fixture, subkey: str, key: str, hive: Optional[str] = None) -> None:
- super().__init__(workspace, subkey, key)
- self._hive = None
- try:
- if hive is not None:
- self._hive = self._str_to_hive(hive)
- except ValueError:
- logger.warning(f"Windows Registry Hive {hive} not recognized, using default: HKEY_CURRENT_USER")
- finally:
- if self._hive is None:
- self._hive = HKEY_CURRENT_USER
-
- def get_value(self, get_type: Optional[bool] = False) -> Any:
- """Retrieves the fast scan value in Windows registry (and optionally the type). If entry DNE, returns None."""
- if self.entry_exists():
- registryKey = OpenKey(self._hive, self._key)
- value = QueryValueEx(registryKey, self._subkey)
- registryKey.Close()
- # Convert windows data type to universal data type flag: PlatformSettings.DATA_TYPE
- # And handles unicode conversion for strings
- value = self._convert_value(value)
- return value if get_type else value[0]
-
- else:
- logger.warning(f"Could not retrieve Registry entry; key: {self._key}, subkey: {self._subkey}.")
- return None
-
- def set_value(self, value: Any) -> bool:
- """Sets the Windows registry value."""
- value, win_type = self._format_data(value)
- registryKey = None
- result = False
- try:
- CreateKey(self._hive, self._subkey)
- registryKey = OpenKey(self._hive, self._key, 0, KEY_WRITE)
- SetValueEx(registryKey, self._subkey, 0, win_type, value)
- result = True
- except WindowsError as e:
- logger.warning(f"Windows error caught while setting fast scan registry: {e}")
- finally:
- if registryKey is not None:
- # Close key if it's been opened successfully
- registryKey.Close()
- return result
-
- def delete_entry(self) -> bool:
- """Deletes the Windows registry entry for fast scan enabled"""
- try:
- if self.entry_exists():
- registryKey = OpenKey(self._hive, self._key, 0, KEY_ALL_ACCESS)
- DeleteValue(registryKey, self._subkey)
- registryKey.Close()
- return True
- except WindowsError:
- logger.error(f"Could not delete registry entry; key: {self._key}, subkey: {self._subkey}")
- finally:
- return False
-
- def entry_exists(self) -> bool:
- """Checks for existence of the setting in Windows registry."""
- try:
- # Attempt to open and query key. If fails then the entry DNE
- registryKey = OpenKey(self._hive, self._key)
- QueryValueEx(registryKey, self._subkey)
- registryKey.Close()
- return True
-
- except WindowsError:
- return False
-
- @staticmethod
- def _format_data(value: bool or int or str or List[str]) -> Tuple[int or str or List[str], int]:
- """Formats the type of the value provided. Returns the formatted value and the windows registry type (int)."""
- if type(value) == str:
- return value, REG_SZ
- elif type(value) == bool:
- value = "true" if value else "false"
- return value, REG_SZ
- elif type(value) == int or type(value) == float:
- if type(value) == float:
- logger.warning(f"Windows registry does not support floats. Truncating {value} to integer")
- value = int(value)
- return value, REG_DWORD
- elif type(value) == list:
- for single_value in value:
- if type(single_value) != str:
- # fmt:off
- raise ValueError(
- f"Windows Registry lists only support strings, got a {type(single_value)} in the list")
- # fmt:on
- return value, REG_MULTI_SZ
- else:
- raise ValueError(f"Windows registry expected types: int, str and [str], found {type(value)}")
-
- @staticmethod
- def _convert_value(value_tuple: Tuple[Any, int]) -> Tuple[Any, PlatformSetting.DATA_TYPE]:
- """Converts the Windows registry data and type (tuple) to a (standardized) data and PlatformSetting.DATA_TYPE"""
- value, windows_type = value_tuple
- if windows_type == REG_SZ:
- # Convert from unicode to string
- return value, PlatformSetting.DATA_TYPE.STR
- elif windows_type == REG_MULTI_SZ:
- # Convert from unicode to string
- return [string for string in value], PlatformSetting.DATA_TYPE.STR_LIST
- elif windows_type == REG_DWORD:
- return value, PlatformSetting.DATA_TYPE.INT
- else:
- raise ValueError(f"Type flag not recognized: {windows_type}")
-
- @staticmethod
- def _str_to_hive(hive_str: str) -> int:
- """Converts a string to a Windows Registry Hive enum (int)"""
- from winreg import HKEY_CLASSES_ROOT, HKEY_CURRENT_CONFIG, HKEY_LOCAL_MACHINE, HKEY_USERS
-
- lower = hive_str.lower()
- if lower == "hkey_current_user" or lower == "current_user":
- return HKEY_CURRENT_USER
- elif lower == "hkey_classes_root" or lower == "classes_root":
- return HKEY_CLASSES_ROOT
- elif lower == "hkey_current_config" or lower == "current_config":
- return HKEY_CURRENT_CONFIG
- elif lower == "hkey_local_machine" or lower == "local_machine":
- return HKEY_LOCAL_MACHINE
- elif lower == "hkey_users" or lower == "users":
- return HKEY_USERS
- else:
- raise ValueError(f"Hive: {hive_str} not recognized")
diff --git a/Tests/ly_shared/__init__.py b/Tests/ly_shared/__init__.py
deleted file mode 100755
index 6ed3dc4bda..0000000000
--- a/Tests/ly_shared/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
\ No newline at end of file
diff --git a/Tests/ly_shared/asset_database_utils.py b/Tests/ly_shared/asset_database_utils.py
deleted file mode 100755
index da8ad3651e..0000000000
--- a/Tests/ly_shared/asset_database_utils.py
+++ /dev/null
@@ -1,83 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import sqlite3
-import os
-from typing import List
-
-# Index for ProductID in Products table in DB
-PRODUCT_ID_INDEX = 0
-
-
-def do_select(asset_db_path, cmd):
- try:
- connection = sqlite3.connect(asset_db_path)
- # Get ProductID from database
- db_rows = connection.execute(cmd)
- return_result = db_rows.fetchall()
- connection.close()
- return return_result
- except sqlite3.Error as sqlite_error:
- print(f'select on db {asset_db_path} failed with exception {sqlite_error}')
- return []
-
-
-def get_active_platforms_from_db(asset_db_path) -> List[str]:
- """Returns a list of platforms that are active in the database, based on what jobs were run"""
- platform_rows = do_select(asset_db_path, f"select distinct Platform from Jobs")
- # Condense this into a single list of platforms.
- platforms = [platform[0] for platform in platform_rows]
- return platforms
-
-
-# Convert a source product path into a db product path
-# cache_platform/projectname/product_path
-def get_db_product_path(workspace, source_path, cache_platform):
- product_path = os.path.join(cache_platform, workspace.project, source_path)
- product_path = product_path.replace('\\', '/')
- return product_path
-
-
-def get_product_id(asset_db_path, product_name) -> str:
- # Get ProductID from database
- product_id = list(do_select(asset_db_path, f"SELECT ProductID FROM Products where ProductName='{product_name}'"))
- if len(product_id) == 0:
- return product_id # return empty list
- return product_id[0][PRODUCT_ID_INDEX] # Get product id from 'first' row
-
-
-# Retrieve a product_id given a source_path assuming the source is copied into the cache with the same
-# name or a product name without cache_platform or projectname prepended
-def get_product_id_from_relative(workspace, source_path, asset_platform):
- return get_product_id(workspace.paths.asset_db(), get_db_product_path(workspace, source_path, asset_platform))
-
-
-def get_missing_dependencies(asset_db_path, product_id) -> List[str]:
- return list(do_select(asset_db_path, f"SELECT * FROM MissingProductDependencies where ProductPK={product_id}"))
-
-
-def do_single_transaction(asset_db_path, cmd):
- try:
- connection = sqlite3.connect(asset_db_path)
- cursor = connection.cursor() # SQL cursor used for issuing commands
- cursor.execute(cmd)
- connection.commit() # Save changes
- connection.close()
- except sqlite3.Error as sqlite_error:
- print(f'transaction on db {asset_db_path} cmd {cmd} failed with exception {sqlite_error}')
-
-
-def clear_missing_dependencies(asset_db_path, product_id) -> None:
- do_single_transaction(asset_db_path, f"DELETE FROM MissingProductDependencies where ProductPK={product_id}")
-
-
-def clear_all_missing_dependencies(asset_db_path) -> None:
- do_single_transaction(asset_db_path, "DELETE FROM MissingProductDependencies;")
diff --git a/Tests/ly_shared/asset_processor_utils.py b/Tests/ly_shared/asset_processor_utils.py
deleted file mode 100755
index 13dc50ea83..0000000000
--- a/Tests/ly_shared/asset_processor_utils.py
+++ /dev/null
@@ -1,51 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-
-import logging
-import os
-import subprocess
-
-from ly_test_tools.environment.process_utils import kill_processes_named as kill_processes_named
-logger = logging.getLogger(__name__)
-
-
-def start_asset_processor(bin_dir):
- """
- Starts the AssetProcessor from the given bin directory. Raises a RuntimeError if the process fails.
- :param bin_dir: The bin directory from which to launch the AssetProcessor executable.
- :return: A subprocess.Popen object for the AssetProcessor process.
- """
- os.chdir(bin_dir)
- asset_processor = subprocess.Popen(['AssetProcessor.exe'])
- return_code = asset_processor.poll()
-
- if return_code is not None and return_code != 0:
- logger.error("Failed to start AssetProcessor")
- raise RuntimeError("AssetProcessor exited with code {}".format(return_code))
- else:
- logger.info("AssetProcessor is running")
- return asset_processor
-
-
-def kill_asset_processor():
- """
- Kill the AssetProcessor and all its related processes .
- """
-
- kill_processes_named('AssetProcessor_tmp', ignore_extensions=True)
- kill_processes_named('AssetProcessor', ignore_extensions=True)
- kill_processes_named('AssetProcessorBatch', ignore_extensions=True)
- kill_processes_named('AssetBuilder', ignore_extensions=True)
- kill_processes_named('rc', ignore_extensions=True)
-
-
-
diff --git a/Tests/ly_shared/file_utils.py b/Tests/ly_shared/file_utils.py
deleted file mode 100755
index 2fc93d7538..0000000000
--- a/Tests/ly_shared/file_utils.py
+++ /dev/null
@@ -1,169 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import os
-import shutil
-import logging
-import stat
-
-import ly_test_tools.environment.file_system as file_system
-import ly_test_tools.environment.waiter as waiter
-
-logger = logging.getLogger(__name__)
-
-
-def clear_out_file(file_path):
- """
- Clears out the specified config file to be empty.
- :param file_path: The full path to the file.
- """
- if os.path.exists(file_path):
- file_system.unlock_file(file_path)
- with open(file_path, 'w') as file_to_write:
- file_to_write.write('')
- else:
- logger.debug(f'{file_path} not found while attempting to clear out file.')
-
-
-def add_commands_to_config_file(config_file_dir, config_file_name, command_list):
- """
- From the command list, appends each command to the specified config file.
- :param config_file_dir: The directory the config file is contained in.
- :param config_file_name: The config file name.
- :param command_list: The commands to add to the file.
- :return:
- """
- config_file_path = os.path.join(config_file_dir, config_file_name)
- os.chmod(config_file_path, stat.S_IWRITE | stat.S_IREAD | stat.S_IEXEC)
- with open(config_file_path, 'w') as launch_config_file:
- for command in command_list:
- launch_config_file.write("{}\n".format(command))
-
-
-def gather_error_logs(workspace):
- """
- Grabs all error logs (if there are any) and puts them into the specified logs path.
- :param workspace: The AbstractWorkspaceManager object that contains all of the paths
- """
- error_log_path = os.path.join(workspace.paths.project_log(), 'error.log')
- error_dump_path = os.path.join(workspace.paths.project_log(), 'error.dmp')
- if os.path.exists(error_dump_path):
- workspace.artifact_manager.save_artifact(error_dump_path)
- if os.path.exists(error_log_path):
- workspace.artifact_manager.save_artifact(error_log_path)
-
-
-def delete_screenshot_folder(workspace):
- """
- Deletes screenshot folder from platform path
- :param workspace: The AbstractWorkspaceManager object that contains all of the paths
- """
- shutil.rmtree(workspace.paths.project_screenshots(), ignore_errors=True)
-
-
-def move_file(src_dir, dest_dir, file_name, timeout=120):
- """
- Attempts to move a file from the source directory to the destination directory. Raises an IOError if
- the file is in use.
- :param src_dir: Directory of the file to be moved.
- :param dest_dir: Directory where the file will be moved to.
- :param file_name: Name of the file to be moved.
- :param timeout: Number of seconds to wait for the file to be released.
- """
- file_path = os.path.join(src_dir, file_name)
- if os.path.exists(file_path):
- waiter.wait_for(lambda: move_file_check(src_dir, dest_dir, file_name), timeout=timeout,
- exc=IOError('Cannot move file {} while in use'.format(file_path)))
-
-
-def move_file_check(src_dir, dest_dir, file_name):
- """
- Moves file and checks if the file has been moved from the source to the destination directory.
- :param src_dir: Source directory of the file to be moved
- :param dest_dir: Destination directory where the file should move to
- :param file_name: The name of the file to be moved
- :return:
- """
- try:
- shutil.move(os.path.join(src_dir, file_name), os.path.join(dest_dir, file_name))
- except OSError as e:
- logger.info(e)
- return False
-
- return True
-
-
-def rename_file(file_path, dest_path, timeout=10):
- # type: (str, str, int) -> None
- """
- Renames a file by moving it. Waits for file to become available and raises and exception if timeout occurs.
- :param file_path: absolute path to the source file
- :param dest_path: absolute path to the new file
- :param timeout: timeout to wait for function to complete
- :return: None
- """
- def _rename_file_check():
- try:
- shutil.move(file_path, dest_path)
- except OSError as e:
- logger.debug(f'Attempted to rename file: {file_path} but an error occurred, retrying.'
- f'\nError: {e}',
- stackinfo=True)
- return False
- return True
-
- if os.path.exists(file_path):
- waiter.wait_for(lambda: _rename_file_check(), timeout=timeout,
- exc=OSError('Cannot rename file {} while in use'.format(file_path)))
-
-
-def delete_level(workspace, level_dir, timeout=120):
- """
- Attempts to delete an entire level folder from the project.
- :param workspace: The workspace instance to delete the level from.
- :param level_dir: The level folder to delete
- """
-
- if not level_dir:
- logger.warning("level_dir is empty, nothing to delete.")
- return
-
- full_level_dir = os.path.join(workspace.paths.project(), 'Levels', level_dir)
- if not os.path.isdir(full_level_dir):
- if os.path.exists(full_level_dir):
- logger.error("level '{}' isn't a directory, it won't be deleted.".format(full_level_dir))
- else:
- logger.info("level '{}' doesn't exist, nothing to delete.".format(full_level_dir))
- return
-
- waiter.wait_for(lambda: delete_check(full_level_dir),
- timeout=timeout,
- exc=IOError('Cannot delete directory {} while in use'.format(full_level_dir)))
-
-def delete_check(src_dir):
- """
- Deletes directory and verifies that it's been deleted.
- :param src_dir: The directory to delete
- """
- try:
- def handle_delete_error(action, path, exception_info):
- logger.info("Error deleting '{}' ({}), changing permissions to writeable.".format(path, exception_info))
- os.chmod(path, stat.S_IWRITE)
- # Try the passed-in action (delete) again
- action(path)
-
- shutil.rmtree(src_dir, onerror=handle_delete_error)
- except OSError as e:
- logger.debug("Delete for '{}' failed: {}".format(src_dir, e))
- return False
-
- return not os.path.exists(src_dir)
-
diff --git a/Tests/ly_shared/hydra_editor_utils.py b/Tests/ly_shared/hydra_editor_utils.py
deleted file mode 100755
index b75e680cf8..0000000000
--- a/Tests/ly_shared/hydra_editor_utils.py
+++ /dev/null
@@ -1,340 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import azlmbr.bus as bus
-import azlmbr.editor as editor
-import azlmbr.entity as entity
-import azlmbr.object
-
-from typing import List
-from math import isclose
-import collections.abc
-
-
-def find_entity_by_name(entity_name):
- """
- Gets an entity ID from the entity with the given entity_name
- :param entity_name: String of entity name to search for
- :return entity ID
- """
- search_filter = entity.SearchFilter()
- search_filter.names = [entity_name]
- matching_entity_list = entity.SearchBus(bus.Broadcast, 'SearchEntities', search_filter)
- if matching_entity_list:
- matching_entity = matching_entity_list[0]
- if matching_entity.IsValid():
- print(f'{entity_name} entity found with ID {matching_entity.ToString()}')
- return matching_entity
- else:
- return matching_entity_list
-
-
-def get_component_type_id(component_name):
- """
- Gets the component_type_id from a given component name
- :param component_name: String of component name to search for
- :return component type ID
- """
- type_ids_list = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', [component_name], entity.EntityType().Game)
- component_type_id = type_ids_list[0]
- return component_type_id
-
-
-def add_component(componentName, entityId):
- """
- Given a component name, finds component TypeId, adds to given entity, and verifies successful add/active state.
- :param componentName: String of component name to add.
- :param entityId: Entity to add component to.
- :return: Component object.
- """
- typeIdsList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', [componentName], entity.EntityType().Game)
- typeNamesList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeNames', typeIdsList)
- componentOutcome = editor.EditorComponentAPIBus(bus.Broadcast, 'AddComponentsOfType', entityId, typeIdsList)
- isActive = editor.EditorComponentAPIBus(bus.Broadcast, 'IsComponentEnabled', componentOutcome.GetValue()[0])
- hasComponent = editor.EditorComponentAPIBus(bus.Broadcast, 'HasComponentOfType', entityId, typeIdsList[0])
- if componentOutcome.IsSuccess() and isActive:
- print('{} component was added to entity'.format(typeNamesList[0]))
- elif componentOutcome.IsSuccess() and not isActive:
- print('{} component was added to entity, but the component is disabled'.format(typeNamesList[0]))
- elif not componentOutcome.IsSuccess():
- print('Failed to add {} component to entity'.format(typeNamesList[0]))
- if hasComponent:
- print('Entity has a {} component'.format(typeNamesList[0]))
- return componentOutcome.GetValue()[0]
-
-
-def get_component_property_value(component, component_propertyPath):
- """
- Given a component name and component property path, outputs the property's value.
- :param component: Component object to act on.
- :param componentPropertyPath: String of component property. (e.g. 'Settings|Visible')
- :return: Value set in given componentPropertyPath
- """
- componentPropertyObj = editor.EditorComponentAPIBus(bus.Broadcast, 'GetComponentProperty', component,
- component_propertyPath)
- if componentPropertyObj.IsSuccess():
- componentProperty = componentPropertyObj.GetValue()
- print(f'{component_propertyPath} set to {componentProperty}')
- return componentProperty
- else:
- print(f'FAILURE: Could not get value from {component_propertyPath}')
- return None
-
-
-def get_property_tree(component):
- """
- Given a configured component object, prints the property tree info from that component
- :param component: Component object to act on.
- """
- pteObj = editor.EditorComponentAPIBus(bus.Broadcast, 'BuildComponentPropertyTreeEditor', component)
- pte = pteObj.GetValue()
- print(pte.build_paths_list())
- return pte
-
-
-def compare_values(first_object: object, second_object: object, name: str) -> bool:
- # Quick case - can we just directly compare the two objects successfully?
- if (first_object == second_object):
- result = True
- # No, so get a lot more specific
- elif isinstance(first_object, collections.abc.Container):
- # If they aren't both containers, they're different
- if not isinstance(second_object, collections.abc.Container):
- result = False
- # If they have different lengths, they're different
- elif len(first_object) != len (second_object):
- result = False
- # If they're different strings, they're containers but they failed the == check so
- # we know they're different
- elif isinstance(first_object, str):
- result = False
- else:
- # It's a collection of values, so iterate through them all...
- collection_idx = 0
- result = True
- for val1, val2 in zip(first_object, second_object):
- result = result and compare_values(val1, val2, f"{name} (index [{collection_idx}])")
- collection_idx = collection_idx + 1
-
- else:
- # Do approximate comparisons for floats
- if isinstance(first_object, float) and isclose(first_object, second_object, rel_tol=0.001):
- result = True
- # We currently don't have a generic way to compare PythonProxyObject contents, so return a
- # false positive result for now.
- elif isinstance(first_object, azlmbr.object.PythonProxyObject):
- print(f"{name}: validation inconclusive, the two objects cannot be directly compared.")
- result = True
- else:
- result = False
-
- if not result:
- print(f"compare_values failed: {first_object} ({type(first_object)}) vs {second_object} ({type(second_object)})")
-
- print(f"{name}: {'SUCCESS' if result else 'FAILURE'}")
- return result
-
-
-class Entity:
- """
- Entity class used to create entity objects
- :param name: String for the name of the Entity
- :param id: The ID of the entity
- """
-
- def __init__(self, name: str, id: object = entity.EntityId()):
- self.name: str = name
- self.id: object = id
- self.components: List[object] = None
- self.parent_id = None
- self.parent_name = None
-
- def create_entity(self, entity_position, components, parent_id=entity.EntityId()):
- self.id = editor.ToolsApplicationRequestBus(
- bus.Broadcast, "CreateNewEntityAtPosition", entity_position, entity.EntityId()
- )
- if self.id.IsValid():
- print(f"{self.name} Entity successfully created")
- editor.EditorEntityAPIBus(bus.Event, 'SetName', self.id, self.name)
- self.components = []
- for component in components:
- new_component = add_component(component, self.id)
- self.components.append(new_component)
-
- def get_parent_info(self):
- """
- Sets the value for parent_id and parent_name on the entity (self)
- Prints the string for papertrail
- :return: None
- """
- self.parent_id = editor.EditorEntityInfoRequestBus(bus.Event, "GetParent", self.id)
- self.parent_name = editor.EditorEntityInfoRequestBus(bus.Event, "GetName", self.parent_id)
- print(f"The parent entity of {self.name} is {self.parent_name}")
-
- def set_test_parent_entity(self, parent_entity_obj):
- editor.EditorEntityAPIBus(bus.Event, "SetParent", self.id, parent_entity_obj.id)
- self.get_parent_info()
-
- def get_set_test(self, component_index: int, path: str, value: object, expected_result: object = None) -> bool:
- """
- Used to set and validate changes in component values
- :param component_index: Index location in the self.components list
- :param path: asset path in the component
- :param value: new value for the variable being changed in the component
- :param expected_result: (optional) check the result against a specific expected value
- """
-
- if expected_result is None:
- expected_result = value
-
- # Test Get/Set (get old value, set new value, check that new value was set correctly)
- print(f"Entity {self.name} Path {path} Component Index {component_index} ")
-
- component = self.components[component_index]
- old_value = get_component_property_value(component, path)
-
- if old_value is not None:
- print(f"SUCCESS: Retrieved property Value for {self.name}")
- else:
- print(f"FAILURE: Failed to find value in {self.name} {path}")
- return False
-
- if old_value == expected_result:
- print((f"WARNING: get_set_test on {self.name} is setting the same value that already exists ({old_value})."
- "The set results will be inconclusive."))
-
- editor.EditorComponentAPIBus(bus.Broadcast, "SetComponentProperty", component, path, value)
-
- new_value = get_component_property_value(self.components[component_index], path)
-
- if new_value is not None:
- print(f"SUCCESS: Retrieved new property Value for {self.name}")
- else:
- print(f"FAILURE: Failed to find new value in {self.name}")
- return False
-
- return compare_values(new_value, expected_result, f"{self.name} {path}")
-
-
-def get_set_test(entity: object, component_index: int, path: str, value: object) -> bool:
- """
- Used to set and validate changes in component values
- :param component_index: Index location in the entity.components list
- :param path: asset path in the component
- :param value: new value for the variable being changed in the component
- """
- return entity.get_set_test(component_index, path, value)
-
-
-def get_set_property_test(ly_object: object, attribute_name: str, value: object, expected_result: object = None) -> bool:
- """
- Used to set and validate BehaviorContext property changes in Lumberyard objects
- :param ly_object: The lumberyard object to test
- :param attribute_name: property (attribute) name in the BehaviorContext
- :param value: new value for the variable being changed in the component
- :param expected_result: (optional) check the result against a specific expected value other than the one set
- """
-
- if expected_result is None:
- expected_result = value
-
- # Test Get/Set (get old value, set new value, check that new value was set correctly)
- print(f"Attempting to set {ly_object.typename}.{attribute_name} = {value} (expected result is {expected_result})")
-
- if hasattr(ly_object, attribute_name):
- print(f"SUCCESS: Located attribute {attribute_name} for {ly_object.typename}")
- else:
- print(f"FAILURE: Failed to find attribute {attribute_name} in {ly_object.typename}")
- return False
-
- old_value = getattr(ly_object, attribute_name)
-
- if old_value is not None:
- print(f"SUCCESS: Retrieved existing value {old_value} for {attribute_name} in {ly_object.typename}")
- else:
- print(f"FAILURE: Failed to retrieve value for {attribute_name} in {ly_object.typename}")
- return False
-
- if old_value == expected_result:
- print((f"WARNING: get_set_test on {attribute_name} is setting the same value that already exists ({old_value})."
- "The 'set' result for the test will be inconclusive."))
-
- setattr(ly_object, attribute_name, expected_result)
-
- new_value = getattr(ly_object, attribute_name)
-
- if new_value is not None:
- print(f"SUCCESS: Retrieved new value {new_value} for {attribute_name} in {ly_object.typename}")
- else:
- print(f"FAILURE: Failed to retrieve value for {attribute_name} in {ly_object.typename}")
- return False
-
- return compare_values(new_value, expected_result, f"{ly_object.typename}.{attribute_name}")
-def has_components(entity_id: object, component_list: list) -> bool:
- """
- Used to verify if a given entity has all the components of components_list. Returns True if all the
- components are present, else False
- :param entity_id: entity id of the entity
- :param component_list: list of component names to be verified
- """
- typeIdsList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', component_list , entity.EntityType().Game)
- for type_id in typeIdsList:
- if not editor.EditorComponentAPIBus(bus.Broadcast, 'HasComponentOfType', entity_id, type_id):
- return False
- return True
-
-class PathNotFoundError(Exception):
- def __init__(self, path):
- self.path = path
-
- def __str__(self):
- return f"Path \"{self.path}\" not found in Editor Settings"
-
-def get_editor_settings_path_list():
- """
- Get the list of Editor Settings paths
- """
- paths = editor.EditorSettingsAPIBus(bus.Broadcast, 'BuildSettingsList')
- return paths
-
-def get_editor_settings_by_path(path):
- """
- Get the value of Editor Settings based on the path.
- :param path: path to the Editor Settings to get the value
- """
- if path not in get_editor_settings_path_list():
- raise PathNotFoundError(path)
- outcome = editor.EditorSettingsAPIBus(bus.Broadcast, 'GetValue', path)
- if outcome.isSuccess():
- return outcome.GetValue()
- raise RuntimeError(f"GetValue for path '{path}' failed")
-
-def set_editor_settings_by_path(path, value, is_bool = False):
- """
- Set the value of Editor Settings based on the path.
- # NOTE: Some Editor Settings may need an Editor restart to apply.
- # Ex: Enabling or disabling New Viewport Interaction Model
- :param path: path to the Editor Settings to get the value
- :param value: value to be set
- :param is_bool: True for Boolean settings (enable/disable), False for other settings
- """
- if path not in get_editor_settings_path_list():
- raise PathNotFoundError(path)
- if is_bool and not isinstance(value, bool):
- def ParseBoolValue(value):
- if(value == "0"):
- return False
- return True
- value = ParseBoolValue(value)
- outcome = editor.EditorSettingsAPIBus(bus.Broadcast, 'SetValue', path, value)
- if not outcome.isSuccess():
- raise RuntimeError(f"SetValue for path '{path}' failed")
- print(f"Value for path '{path}' is set to {value}")
diff --git a/Tests/ly_shared/hydra_lytt_test_utils.py b/Tests/ly_shared/hydra_lytt_test_utils.py
deleted file mode 100755
index bbdcbc6cb6..0000000000
--- a/Tests/ly_shared/hydra_lytt_test_utils.py
+++ /dev/null
@@ -1,77 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import logging
-import os
-import tempfile
-import ly_test_tools.log.log_monitor
-import ly_test_tools.environment.process_utils as process_utils
-import ly_test_tools.environment.waiter as waiter
-
-logger = logging.getLogger(__name__)
-
-
-def teardown_editor(editor):
- """
- :param editor: Configured editor object
- :return:
- """
- process_utils.kill_processes_named('AssetProcessor.exe')
- logger.debug('Ensuring Editor is stopped')
- editor.ensure_stopped()
-
-
-def launch_and_validate_results(request, test_directory, editor, editor_script, expected_lines, unexpected_lines=[],
- halt_on_unexpected=False, auto_test_mode=True, run_python="--runpythontest", cfg_args=[], timeout=60, log_creation_max_wait=60):
- """
- Creates a temporary config file for Hydra execution, runs the Editor with the specified script, and monitors for
- expected log lines.
- :param request: Special fixture providing information of the requesting test function.
- :param test_directory: Path to test directory that editor_script lives in.
- :param editor: Configured editor object to run test against.
- :param editor_script: Name of script that will execute in the Editor.
- :param expected_lines: Expected lines to search log for.
- :param unexpected_lines: Unexpected lines to search log for. Defaults to none.
- :param halt_on_unexpected: Halts test if unexpected lines are found. Defaults to False.
- :param auto_test_mode: Defaults to True. Runs the test in auto_test_mode.
- :param run_python: Defaults to "--runpythontest", other option is "--runpython".
- :param cfg_args: Additional arguments for CFG, such as LevelName.
- :param timeout: Length of time for test to run. Default is 60.
- :param log_creation_max_wait: Length of time for waiting to find the log file. Default is 60.
- """
- test_case = os.path.join(test_directory, editor_script)
- request.addfinalizer(lambda: teardown_editor(editor))
- logger.debug("Running automated test: {}".format(editor_script))
-
- editor.args.extend(["--skipWelcomeScreenDialog"])
- if auto_test_mode: editor.args.extend(["--autotest_mode"])
- editor.args.extend([run_python, test_case, "--runpythonargs", cfg_args])
-
- with editor.start():
-
- editorlog_file = os.path.join(editor.workspace.paths.project_log(), 'Editor.log')
- log_monitor = ly_test_tools.log.log_monitor.LogMonitor(launcher=editor, log_file_path=editorlog_file, log_creation_max_wait_time=log_creation_max_wait)
- log_monitor.monitor_log_for_lines(expected_lines=expected_lines, unexpected_lines=unexpected_lines,
- halt_on_unexpected=halt_on_unexpected, timeout=timeout)
-
-
-def remove_files(artifact_path, suffix):
- """
- Removes files with the specified suffix from the specified path
- :param artifact_path: Path to search for files
- :param suffix: File extension to remove
- """
- if not os.path.isdir(artifact_path):
- return
-
- for file_name in os.listdir(artifact_path):
- if file_name.endswith(suffix):
- os.remove(os.path.join(artifact_path, file_name))
diff --git a/Tests/ly_shared/network_utils.py b/Tests/ly_shared/network_utils.py
deleted file mode 100755
index 8b772303f1..0000000000
--- a/Tests/ly_shared/network_utils.py
+++ /dev/null
@@ -1,66 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import logging
-import psutil
-import socket
-
-
-logger = logging.getLogger(__name__)
-
-
-def check_for_listening_port(port):
- """
- Checks to see if the connection to the designated port was established.
- :param port: Port to listen to.
- :return: True if port is listening.
- """
- port_listening = False
- for conn in psutil.net_connections():
- if 'port={}'.format(port) in str(conn):
- port_listening = True
- return port_listening
-
-
-def check_for_remote_listening_port(port, ip_addr='127.0.0.1'):
- """
- Tries to connect to a port to see if port is listening.
- :param port: Port being tested.
- :param ip_addr: IP address of the host being connected to.
- :return: True if connection to the port is established.
- """
- port_listening = True
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- try:
- sock.connect((ip_addr, port))
- except socket.error as err:
- # Socket error: Connection refused, error code 10061
- if err.errno == 10061:
- port_listening = False
- finally:
- sock.close()
- return port_listening
-
-
-def get_local_ip_address():
- """
- Finds the IP address for the primary ethernet adapter by opening a connection and grabbing its IP address.
- :return: The IP address for the adapter used to make the connection.
- """
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- try:
- # Connecting to Google's public DNS so there is an open connection
- # and then getting the address used for that connection
- sock.connect(('8.8.8.8', 80))
- host_ip = sock.getsockname()[0]
- finally:
- sock.close()
- return host_ip
diff --git a/Tests/ly_shared/phase.py b/Tests/ly_shared/phase.py
deleted file mode 100755
index 4bb827b3ad..0000000000
--- a/Tests/ly_shared/phase.py
+++ /dev/null
@@ -1,198 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-This represents one "phase" of a test. The test runner communicates with the launcher by running phases and waiting
-for results, however they appear.
-"""
-
-import logging
-import os
-import time
-import xml.etree.ElementTree
-
-import ly_test_tools.launchers.exceptions as exceptions
-from ly_test_tools.launchers.platforms.base import Launcher
-
-_POLL_INTERVAL_SEC = 1
-_CRASH_TIMEOUT = 5
-
-logger = logging.getLogger(__name__)
-
-
-class Phase(object):
- """
- A generic test phase for running the launcher. With the launcher running elsewhere (at a minimum in a different
- process, possibly on a different device altogether) the following kind of phases might occur:
-
- - Wait for a specific file to show up / complete processing.
- - Send commands to the launcher over the network and wait for response.
- - Wait for multiple launchers to coordinate networking testing.
- - Wait for a specific amount of time.
-
- Each phase can then compile the artifacts for the next phase.
- """
- def __init__(self, timeout):
- """
- :param timeout: Maximum time allocated for phase.
- """
- self.timeout = timeout
-
- def _start(self, previous_phase=None):
- """
- Start the phase.
-
- :return: None
- """
- logger.debug("start: {}".format(self.__class__.__name__))
-
- def _is_complete(self):
- """
- Check if the phase is complete. This is the only required function.
-
- :return: None
- """
- raise NotImplementedError
-
- def _compile_artifacts(self):
- """
- Compile artifacts after a completed phase.
- """
- logger.debug("compile_artifacts: {}".format(self.__class__.__name__))
-
- def _update(self, elapsed_time):
- """
- Update the test phase if necessary.
-
- :param elapsed_time: Time since the last update.
- :return: None
- """
- logger.debug("update: {}".format(self.__class__.__name__))
-
- def _wait(self, launcher):
- """
- Wait for the phase to complete.
-
- :return: None.
- :raises: TimeoutError, CrashError
- """
- dead_time = -1
- logger.debug("wait begin: {}".format(self.__class__.__name__))
- start = time.time()
-
- while not self._is_complete():
-
- if time.time() - start > self.timeout:
- message = "Timeout exceeded {}s in {}".format(self.timeout, self.__class__.__name__)
- logger.error(message)
- raise exceptions.TimeoutError(message)
- elif not launcher.is_alive():
- # The final result may arrive after the app closes.
- if dead_time == -1:
- dead_time = time.time()
- if time.time() - dead_time > _CRASH_TIMEOUT:
- message = "Unexpected termination in {} after {:0.2f}s".format(
- self.__class__.__name__, time.time() - start)
- logger.error(message)
- raise exceptions.CrashError(message)
-
- sleep_start = time.time()
- time.sleep(_POLL_INTERVAL_SEC)
-
- self._update(time.time() - sleep_start)
-
- logger.debug("wait end: {}, duration: {:.2f}".format(self.__class__.__name__, time.time() - start))
-
-
-class FileExistsPhase(Phase):
- """
- Test phase that completes when a specific file is created.
- """
- def __init__(self, path, timeout=60, non_empty=False):
- super(FileExistsPhase, self).__init__(timeout)
- self.path = path
- self.non_empty = non_empty
-
- def _is_complete(self):
- if self.path is not None and os.path.exists(self.path):
- if self.non_empty:
- return os.path.getsize(self.path) > 0
- else:
- return True
-
- return False
-
-
-class XMLValidPhase(FileExistsPhase):
- """
- Test phase that completes when a valid XML file is found.
- """
- def __init__(self, path, timeout=60):
- super(XMLValidPhase, self).__init__(path, timeout, non_empty=True)
- self.path = path
- self.xml = None
-
- def _is_complete(self):
- if not super(XMLValidPhase, self)._is_complete():
- return False
-
- try:
- self.xml = xml.etree.ElementTree.parse(self.path)
- except xml.etree.ElementTree.ParseError:
- return False
-
- return True
-
-
-class TimePhase(Phase):
- """
- Simple class to complete in a specified time. Can be used to test timeout.
- """
- def __init__(self, timeout, complete_time):
- super(TimePhase, self).__init__(timeout)
- self.complete_time = complete_time
-
- def _start(self, previous_phase=None):
- super(TimePhase, self)._start(previous_phase)
- self.start_time = time.time()
-
- def _is_complete(self):
- return time.time() - self.start_time > self.complete_time
-
-
-class ElapsedTimePhase(Phase):
- """
- Simple class to complete in a specified time using elapsed time. Can be used to test timeout and elapsed time.
- """
- def __init__(self, timeout, complete_time):
- super(ElapsedTimePhase, self).__init__(timeout)
- self.complete_time = complete_time
- self.total_time = None
-
- def _start(self, previous_phase=None):
- super(ElapsedTimePhase, self)._start(previous_phase)
- self.total_time = 0
-
- def _update(self, elapsed_time):
- super(ElapsedTimePhase, self)._update(elapsed_time)
- self.total_time += elapsed_time
-
- def _is_complete(self):
- return self.total_time > self.complete_time
-
-
-class WaitForLauncherToQuit(Phase):
- def __init__(self, launcher, timeout=60):
- # type: (Launcher, int) -> None
- super(WaitForLauncherToQuit, self).__init__(timeout)
- self.launcher = launcher
-
- def _is_complete(self):
- # type: () -> bool
- return not self.launcher.is_alive()
diff --git a/Tests/ly_shared/pyside_utils.py b/Tests/ly_shared/pyside_utils.py
deleted file mode 100755
index 1dfdcdb5c0..0000000000
--- a/Tests/ly_shared/pyside_utils.py
+++ /dev/null
@@ -1,939 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import azlmbr.qt
-import azlmbr.qt_helpers
-import asyncio
-import re
-from shiboken2 import wrapInstance, getCppPointer
-from PySide2 import QtCore, QtWidgets, QtGui, QtTest
-from PySide2.QtWidgets import QAction, QWidget
-from PySide2.QtCore import Qt
-from PySide2.QtTest import QTest
-import azlmbr.legacy.general as general
-import traceback
-import threading
-import types
-
-
-qApp = QtWidgets.QApplication.instance()
-# Monkey patch static method calls
-QtWidgets.QApplication.activeModalWidget = qApp.activeModalWidget
-
-
-class LmbrQtEventLoop(asyncio.AbstractEventLoop):
- def __init__(self):
- self.running = False
- self.shutdown = threading.Event()
- self.blocked_events = set()
- self.finished_events = set()
- self.queue = []
- self._wait_future = None
- self._event_loop_nesting = 0
-
- def get_debug(self):
- return False
-
- def time(self):
- return azlmbr.qt_helpers.time()
-
- def wait_for_condition(self, condition, action, on_timeout=None, timeout=1.0):
- timeout = self.time() + timeout if timeout is not None else None
- def callback(time):
- # Run our action and remove us from the queue if our condition is satisfied
- if condition():
- action()
- return True
- # Give up if timeout has elapsed
- if time > timeout:
- if on_timeout is not None:
- on_timeout()
- return True
- return False
- self.queue.append((callback))
-
- def event_loop(self):
- time = self.time()
- def run_event(event):
- if event in self.blocked_events or event in self.finished_events:
- return False
- self.blocked_events.add(event)
- try:
- if event(time):
- self.finished_events.add(event)
- except Exception:
- traceback.print_exc()
- self.finished_events.add(event)
- finally:
- self.blocked_events.remove(event)
-
- self._event_loop_nesting += 1
- try:
- for event in self.queue:
- run_event(event)
- finally:
- self._event_loop_nesting -= 1
-
- # Clear out any finished events if the queue is safe to mutate
- if self._event_loop_nesting == 0:
- self.queue = [event for event in self.queue if event not in self.finished_events]
- self.finished_events = set()
-
- if not self.running or self._wait_future is not None and self._wait_future.done():
- self.close()
-
- def run_until_shutdown(self):
- # Run our event loop callback (via azlmbr.qt_helpers) by pumping the Qt event loop
- # azlmbr.qt_helpers will attempt to ensure our event loop is always run, even when a
- # new event loop is started and run from the main event loop
- self.running = True
- self.shutdown.clear()
- azlmbr.qt_helpers.set_loop_callback(self.event_loop)
- while not self.shutdown.is_set():
- qApp.processEvents(QtCore.QEventLoop.AllEvents, 0)
-
- def run_forever(self):
- self._wait_future = None
- self.run_until_shutdown()
-
- def run_until_complete(self, future):
- # Wrap coroutines into Tasks (future-like analogs)
- if isinstance(future, types.CoroutineType):
- future = self.create_task(future)
- self._wait_future = future
- self.run_until_shutdown()
-
- def _timer_handle_cancelled(self, handle):
- pass
-
- def is_running(self):
- return self.running
-
- def is_closed(self):
- return not azlmbr.qt_helpers.loop_is_running()
-
- def stop(self):
- self.running = False
-
- def close(self):
- self.running = False
- self.shutdown.set()
- azlmbr.qt_helpers.clear_loop_callback()
-
- def shutdown_asyncgens(self):
- pass
-
- def call_exception_handler(self, context):
- try:
- raise context.get('exception', None)
- except:
- traceback.print_exc()
-
- def call_soon(self, callback, *args, **kw):
- h = asyncio.Handle(callback, args, self)
- def callback_wrapper(time):
- if not h.cancelled():
- h._run()
- return True
- self.queue.append(callback_wrapper)
- return h
-
- def call_later(self, delay, callback, *args, **kw):
- if delay < 0:
- raise Exception("Can't schedule in the past")
- return self.call_at(self.time() + delay, callback, *args)
-
- def call_at(self, when, callback, *args, **kw):
- h = asyncio.TimerHandle(when, callback, args, self)
- h._scheduled = True
- def callback_wrapper(time):
- if time > when:
- if not h.cancelled():
- h._run()
- return True
- return False
- self.queue.append(callback_wrapper)
- return h
-
- def create_task(self, coro):
- return asyncio.Task(coro, loop=self)
-
- def create_future(self):
- return asyncio.Future(loop=self)
-
-
-class EventLoopTimeoutException(Exception):
- pass
-
-
-event_loop = LmbrQtEventLoop()
-def wait_for_condition(condition, timeout=1.0):
- """
- Asynchronously waits for `condition` to evaluate to True.
- condition: A function with the signature def condition() -> bool
- This condition will be evaluated until it evaluates to True or the timeout elapses
- timeout: The time in seconds to wait - if 0, this will wait forever
- Throws pyside_utils.EventLoopTimeoutException on timeout.
- """
- future = event_loop.create_future()
- def on_complete():
- future.set_result(True)
- def on_timeout():
- future.set_exception(EventLoopTimeoutException())
- event_loop.wait_for_condition(condition, on_complete, on_timeout=on_timeout, timeout=timeout)
- return future
-
-
-async def wait_for(expression, timeout=1.0):
- """
- Asynchronously waits for "expression" to evaluate to a non-None value,
- then returns that value.
-
- expression: A function with the signature def expression() -> Generic[Any,None]
- The result of expression will be returned as soon as it returns a non-None value.
- timeout: The time in seconds to wait - if 0, this will wait forever
- Throws pyside_utils.EventLoopTimeoutException on timeout.
- """
- result = None
- def condition():
- nonlocal result
- result = expression()
- return result is not None
- await wait_for_condition(condition, timeout)
- return result
-
-
-def run_soon(fn):
- """
- Runs a function on the event loop to enable asynchronous execution.
-
- fn: The function to run, should be a function that takes no arguments
- Returns a future that will be popualted with the result of fn or the exception it threw.
- """
- future = event_loop.create_future()
- def coroutine():
- try:
- fn()
- future.set_result(True)
- except Exception as e:
- future.set_exception(e)
- event_loop.call_soon(coroutine)
- return future
-
-
-def run_async(awaitable):
- """
- Synchronously runs a coroutine or a future on the event loop.
- This can be used in lieu of "await" in non-async functions.
-
- awaitable: The coroutine or future to await.
- Returns the result of operation specified.
- """
- if isinstance(awaitable, types.CoroutineType):
- awaitable = event_loop.create_task(awaitable)
- event_loop.run_until_complete(awaitable)
- return awaitable.result()
-
-
-def wrap_async(fn):
- """
- This decorator enables an async function's execution from a synchronous one.
-
- For example:
- @pyside_utils.wrap_async
- async def foo():
- result = await long_operation()
- return result
-
- def non_async_fn():
- x = foo() # this will return the correct result by executing the event loop
-
- fn: The function to wrap
- Returns the decorated function.
- """
- def wrapper(*args, **kw):
- result = fn(*args, **kw)
- return run_async(result)
- return wrapper
-
-
-def get_editor_main_window():
- """
- Fetches the main Editor instance of QMainWindow for use with PySide tests
- :return Instance of QMainWindow for the Editor
- """
- params = azlmbr.qt.QtForPythonRequestBus(azlmbr.bus.Broadcast, "GetQtBootstrapParameters")
- editor_id = QtWidgets.QWidget.find(params.mainWindowId)
- main_window = wrapInstance(int(getCppPointer(editor_id)[0]), QtWidgets.QMainWindow)
- return main_window
-
-
-def get_action_for_menu_path(editor_window: QtWidgets.QMainWindow, main_menu_item: str, *menu_item_path: str):
- """
- main_menu_item: Main menu item among the MenuBar actions. Ex: "File"
- menu_item_path: Path to any nested menu item. Ex: "Viewport", "Goto Coordinates"
- returns: QAction object for the corresponding path.
- """
- # Check if path is valid
- menu_bar = editor_window.menuBar()
- menu_bar_actions = [index.iconText() for index in menu_bar.actions()]
-
- # Verify if the given Menu exists in the Menubar
- if main_menu_item not in menu_bar_actions:
- print(f"QAction not found for main menu item '{main_menu_item}'")
- return None
- curr_action = menu_bar.actions()[menu_bar_actions.index(main_menu_item)]
- curr_menu = curr_action.menu()
- for index, element in enumerate(menu_item_path):
- curr_menu_actions = [index.iconText() for index in curr_menu.actions()]
- if element not in curr_menu_actions:
- print(f"QAction not found for menu item '{element}'")
- return None
- if index == len(menu_item_path) - 1:
- return curr_menu.actions()[curr_menu_actions.index(element)]
- curr_action = curr_menu.actions()[curr_menu_actions.index(element)]
- curr_menu = curr_action.menu()
- return None
-
-
-def _pattern_to_dict(pattern, **kw):
- """
- Helper function, turns a pattern match parameter into a normalized dictionary
- """
-
- def is_string_or_regex(x):
- return isinstance(x, str) or isinstance(x, re.Pattern)
-
- # If it's None, just make an empty dict
- if pattern is None:
- pattern = {}
- # If our pattern is a string or regex, turn it into a text match
- elif is_string_or_regex(pattern):
- pattern = dict(text=pattern)
- # If our pattern is an (int, int) tuple, turn it into a row/column match
- elif isinstance(pattern, tuple) and isinstance(pattern[0], int) and isinstance(pattern[1], int):
- pattern = dict(row=pattern[0], column=pattern[1])
- # If our pattern is a QObject type, turn it into a type match
- elif isinstance(pattern, type(QtCore.QObject)):
- pattern = dict(type=pattern)
- # Otherwise assume it's a dict and make a copy
- else:
- pattern = dict(pattern)
-
- # Merge with any kw arguments
- for key, value in kw.items():
- pattern[key] = value
- return pattern
-
-
-def _match_pattern(obj, pattern):
- """
- Helper function, determines whether obj matches the pattern specified by pattern.
-
- It is required that pattern is normalized into a dict before calling this.
- """
-
- def compare(value1, value2):
- # Do a regex search if it's a regex, otherwise do a normal compare
- if isinstance(value2, re.Pattern):
- return re.search(value2, value1)
- return value1 == value2
-
- item_roles = Qt.ItemDataRole.values.values()
- for key, value in pattern.items():
- if key == "type": # Class type
- if not isinstance(obj, value):
- return False
- elif key == "text": # Default 'text' path, depends on type
- text_values = []
-
- def get_from_attrs(*args):
- for attr in args:
- try:
- text_values.append(getattr(obj, attr)())
- except Exception:
- pass
-
- # Use any of the following fields for default matching, if they're defined
- get_from_attrs("text", "objectName", "windowTitle")
- # Additionally, use the DisplayRole for QModelIndexes
- if isinstance(obj, QtCore.QModelIndex):
- text_values.append(obj.data(Qt.DisplayRole))
-
- if not any(compare(text, value) for text in text_values):
- return False
- elif key in item_roles: # QAbstractItemModel display role
- if not isinstance(obj, QtCore.QModelIndex):
- raise RuntimeError(f"Attempted to match data role on unsupported object {obj}")
- if not compare(obj.data(key), value):
- return False
- elif hasattr(obj, key):
- # Look up our key on the object itself
- objectValue = getattr(obj, key)
- # Invoke it if it's a getter
- if callable(objectValue):
- objectValue = objectValue()
- if not compare(objectValue, value):
- return False
- else:
- return False
-
- return True
-
-
-def get_child_indexes(model, parent_index=QtCore.QModelIndex()):
- indexes = [parent_index]
- while len(indexes) > 0:
- parent_index = indexes.pop(0)
- for row in range(model.rowCount(parent_index)):
- # FIXME
- # PySide appears to have a bug where-in it thinks columnCount is private
- # Bail gracefully for now, we can add a C++ wrapper to work around if needed
- try:
- column_count = model.columnCount(parent_index)
- except Exception:
- column_count = 1
- for col in range(column_count):
- cur_index = model.index(row, col, parent_index)
- yield cur_index
-
-
-def _get_children(obj):
- """
- Helper function. Get the direct descendants from a given PySide object.
- This includes all: QObject children, QActions owned by the object, and QModelIndexes if applicable
- """
- if isinstance(obj, QtCore.QObject):
- yield from obj.children()
- if isinstance(obj, QtWidgets.QWidget):
- yield from obj.actions()
- if isinstance(obj, (QtWidgets.QAbstractItemView, QtCore.QModelIndex)):
- model = obj.model()
- if model is None:
- return
-
- # For a QAbstractItemView (e.g. QTreeView, QListView), the parent index
- # will be an invalid QModelIndex(), which will use find all indexes on the root.
- # For a QModelIndex, we use the actual QModelIndex as the parent_index so that
- # it will find any child indexes under it
- parent_index = QtCore.QModelIndex()
- if isinstance(obj, QtCore.QModelIndex):
- parent_index = obj
-
- yield from get_child_indexes(model, parent_index)
-
-
-def _get_parents_to_search(obj_entry_or_list):
- """
- Helper function, turns obj_entry_or_list into a list of parents to search
-
- If obj_entry_or_list is None, returns all visible top level widgets
- If obj_entry_or_list is iterable, return it as a list
- Otherwise, return a list containing obj_entry_or_list
- """
- if obj_entry_or_list is None:
- return [widget for widget in QtWidgets.QApplication.topLevelWidgets() if widget.isVisible()]
- try:
- return list(obj_entry_or_list)
- except TypeError:
- return [obj_entry_or_list]
-
-
-def find_children_by_pattern(obj=None, pattern=None, recursive=True, **kw):
- """
- Finds the children of an object that match a given pattern.
- See find_child_by_pattern for more information on usage.
- """
- pattern = _pattern_to_dict(pattern, **kw)
- parents_to_search = _get_parents_to_search(obj)
-
- while len(parents_to_search) > 0:
- parent = parents_to_search.pop(0)
- for child in _get_children(parent):
- if _match_pattern(child, pattern):
- yield child
- if recursive:
- parents_to_search.append(child)
-
-
-def find_child_by_pattern(obj=None, pattern=None, recursive=True, **kw):
- """
- Finds the child of an object that matches a given pattern.
- A "child" in this context is not necessarily a QObject child.
- QActions are also considered children, as are the QModelIndex children of QAbstractItemViews.
- obj: The object to search - should be either a QObject or a QModelIndex, or a list of them
- If None this will search all top level windows.
- pattern: The pattern to match, the first child that matches all of the criteria specified will
- be returned. This is a dictionary with any combination of the following:
-
- - "text": generic text to match, will search object names for QObjects, display role text
- for QModelIndexes, or action text() for QActions
- - "type": a class type, e.g. QtWidgets.QMenu, a child will only match if it's of this type
- - "row" / "column": integer row and column indices of a QModelIndex
- - "type": type class (e.g. PySide.QtWidgets.QComboBox) that the object must inherit from
- - A Qt.ItemDataRole: matches for QModelIndexes with data of a given value
- - Any other fields will fall back on being looked up on the object itself by name, e.g.
- {"windowTitle": "Foo"} would match a windowTitle named "Foo"
-
- Any instances where a field is specified as text can also be specified as a regular expression:
- find_child_by_pattern(obj, {text: re.compile("Foo_.*")}) would find a child with text starting
- with "Foo_"
-
- For convenience, these parameter types may also be specified as keyword arguments:
- find_child_by_pattern(obj, text="foo", type=QtWidgets.QAction)
- is equivalent to
- find_child_by_pattern(obj, {"text": "foo", "type": QtWidgets.QAction})
-
- If pattern is specified as a string, it will turn into a pattern matching "text":
- find_child_by_pattern(obj, "foo")
- is equivalent to
- find_child_by_pattern(obj, {"text": "foo"})
-
- If a pattern is specified as an (int, int) tuple, it will turn into a row/column match:
- find_child_by_pattern(obj, (0, 2))
- is equivalent to
- find_child_by_pattern(obj, {"row": 0, "column": 2})
-
- If a pattern is specified as a type, like PySide.QtWidgets.QLabel, it will turn into a type match:
- find_child_by_pattern(obj, PySide.QtWidgets.QLabel)
- is equivalent to
- find_child_by_pattern(obj, {"type": PySide.QtWidgets.QLabel})
- """
- # Return the first match result, if found
- for match in find_children_by_pattern(obj, pattern=pattern, recursive=recursive, **kw):
- return match
- return None
-
-
-def find_child_by_hierarchy(parent, *patterns):
- """
- Searches for a hierarchy of children descending from parent.
- parent: The Qt object (or list of Qt obejcts) to search within
- If none, this will search all top level windows.
- patterns: A list of patterns to match to find a hierarchy of descendants.
- These patterns will be tested in order.
-
- For example, to look for the QComboBox in a hierarchy like the following:
- QWidget (window)
- -QTabWidget
- -QWidget named "m_exampleTab"
- -QComboBox
- One might invoke:
- find_child_by_hierarchy(window, QtWidgets.QTabWidget, "m_exampleTab", QtWidgets.QComboBox)
-
- Alternatively, "..." may be specified in place of a parent, where the hierarchy will match any
- ancestors along the path, so the above might be shortened to:
- find_child_by_hierarchy(window, ..., "m_exampleTab", QtWidgets.QComboBox)
- """
- search_recursively = False
- current_objects = _get_parents_to_search(parent)
- for pattern in patterns:
- # If it's an ellipsis, do the next search recursively as we're looking for any number of intermediate ancestors
- if pattern is ...:
- search_recursively = True
- continue
-
- candidates = []
- for parent_candidate in current_objects:
- candidates += find_children_by_pattern(parent_candidate, pattern=pattern, recursive=search_recursively)
- if len(candidates) == 0:
- return None
- current_objects = candidates
-
- search_recursively = False
- return current_objects[0]
-
-async def wait_for_child_by_hierarchy(parent, *patterns, timeout=1.0):
- """
- Searches for a hierarchy of children descending from parent until timeout occurs.
- Returns a future that will result in either the found child or an EventLoopTimeoutException.
-
- See find_child_by_hierarchy for usage information.
- """
- match = None
- def condition():
- nonlocal match
- match = find_child_by_hierarchy(parent, *patterns)
- return match is not None
- await wait_for_condition(condition, timeout)
- return match
-
-
-async def wait_for_child_by_pattern(obj=None, pattern=None, recursive=True, timeout=1.0, **kw):
- """
- Finds the child of an object that matches a given pattern.
- Returns a future that will result in either the found child or an EventLoopTimeoutException.
-
- See find_child_by_hierarchy for usage information.
- """
- match = None
- def condition():
- nonlocal match
- match = find_child_by_pattern(obj, pattern, recursive, **kw)
- return match is not None
- await wait_for_condition(condition, timeout)
- return match
-
-
-def find_child_by_property(obj, obj_type, property_name, property_value, reg_exp_search=False):
- """
- Finds the child of an object which has the property name matching the property value
- of type obj_type
- obj: The property value is searched through obj children
- obj_type: Type of object to be matched
- property_name: Property of the child which should be verified for the required value.
- property_value: Property value that needs to be matched
- reg_exp_search: If True searches for the property_value based on re search. Defaults to False.
- """
- for child in obj.children():
- if reg_exp_search and re.search(property_value, getattr(child, property_name)()):
- return child
- if not reg_exp_search and isinstance(child, obj_type) and getattr(child, property_name)() == property_value:
- return child
- return None
-
-def get_item_view_index(item_view, row, column=0, parent=QtCore.QModelIndex()):
- """
- Retrieve the index for a specified row/column, with optional parent
- This is necessary when needing to reference into nested hierarchies in a QTreeView
- item_view: The QAbstractItemView instance
- row: The requested row index
- column: The requested column index (defaults to 0 in case of single column)
- parent: Parent index (defaults to invalid)
- """
- item_model = item_view.model()
- model_index = item_model.index(row, column, parent)
- return model_index
-
-
-def get_item_view_index_rect(item_view, index):
- """
- Gets the QRect for a given index in a QAbstractItemView (e.g. QTreeView, QTableView, QListView).
- This is helpful because for sending mouse events to a QAbstractItemView, you have to send them to
- the viewport() widget of the QAbstractItemView.
- item_view: The QAbstractItemView instance
- index: A QModelIndex for the item index
- """
- return item_view.visualRect(index)
-
-
-def item_view_index_mouse_click(item_view, index, button=QtCore.Qt.LeftButton, modifier=QtCore.Qt.NoModifier):
- """
- Helper method version of QTest.mouseClick for injecting mouse clicks on a QAbstractItemView
- item_view: The QAbstractItemView instance
- index: A QModelIndex for the item index to be clicked
- """
- item_index_rect = get_item_view_index_rect(item_view, index)
- item_index_center = item_index_rect.center()
-
- # For QAbstractItemView widgets, the events need to be forwarded to the actual viewport() widget
- QTest.mouseClick(item_view.viewport(), button, modifier, item_index_center)
-
-
-def item_view_mouse_click(item_view, row, column=0, button=QtCore.Qt.LeftButton, modifier=QtCore.Qt.NoModifier):
- """
- Helper method version of 'item_view_index_mouse_click' using a row, column instead of a QModelIndex
- item_view: The QAbstractItemView instance
- row: The requested row index
- column: The requested column index (defaults to 0 in case of single column)
- """
- index = get_item_view_index(item_view, row, column)
- item_view_index_mouse_click(item_view, index, button, modifier)
-
-
-async def wait_for_action_in_menu(menu, pattern, timeout=1.0):
- """
- Finds a QAction inside a menu, based on the specified pattern.
-
- menu: The QMenu to search
- pattern: The action text or pattern to match (see find_child_by_pattern)
- If pattern specifies a QWidget, this will search for the associated QWidgetAction
- """
- action = await wait_for_child_by_pattern(menu, pattern, timeout=timeout)
- if action is None:
- raise TimeoutError(f"Failed to find context menu action for {pattern}")
-
- # If we've found a valid QAction, we're good to go
- if hasattr(action, 'trigger'):
- return action
-
- # If pattern matches a widget and not a QAction, look for an associated QWidgetAction
- widget_actions = find_children_by_pattern(menu, type=QtWidgets.QWidgetAction)
- underlying_widget_action = None
- for widget_action in widget_actions:
- widgets_to_check = [widget_action.defaultWidget()] + widget_action.createdWidgets()
- for check_widget in widgets_to_check:
- if action in _get_children(check_widget):
- underlying_widget_action = widget_action
- break
- if underlying_widget_action is not None:
- action = underlying_widget_action
- break
-
- if not hasattr(action, 'trigger'):
- raise RuntimeError(f"Failed to find action associated with widget {action}")
- return action
-
-
-def queue_hide_event(widget):
- """
- Explicitly post a hide event for the next frame, this can be used to ensure modal dialogs exit correctly.
-
- widget: The widget to hide
- """
- qApp.postEvent(widget, QtGui.QHideEvent())
-
-
-async def wait_for_destroyed(obj, timeout=1.0):
- """
- Waits for a QObject (including a widget) to be fully destroyed
-
- This can be used to wait for a modal dialog to shut down properly
-
- obj: The object to wait on destruction
- timeout: The time, in seconds to wait. 0 for an indefinite wait.
- """
- was_destroyed = False
- def on_destroyed():
- nonlocal was_destroyed
- was_destroyed = True
- obj.destroyed.connect(on_destroyed)
- return await wait_for_condition(lambda: was_destroyed, timeout=timeout)
-
-
-async def close_modal(modal_widget, timeout=1.0):
- """
- Closes a modal dialog and waits for it to be cleaned up.
-
- This attempts to ensure the modal event loop gets properly exited.
-
- modal_widget: The widget to close
- timeout: The time, in seconds, to wait. 0 for an indefinite wait.
- """
- queue_hide_event(modal_widget)
- return await wait_for_destroyed(modal_widget, timeout=timeout)
-
-
-def trigger_context_menu_entry(widget, pattern, pos=None, index=None):
- """
- Trigger a context menu event on a widget and activate an entry
- widget: The widget to trigger the event on
- pattern: The action text or pattern to match (see find_child_by_pattern)
- pos: Optional, the QPoint to set as the event origin
- index: Optional, the QModelIndex to click in widget
- widget must be a QAbstractItemView
- """
- async def async_wrapper():
- menu = await open_context_menu(widget, pos=pos, index=index)
- action = await wait_for_action_in_menu(menu, pattern)
- action.trigger()
- queue_hide_event(menu)
-
- result = async_wrapper()
- # If we have an event loop, go ahead and just return the coroutine
- # Otherwise, do a synchronous wait
- if event_loop.is_running():
- return result
- else:
- return run_async(result)
-
-
-async def open_context_menu(widget, pos=None, index=None, timeout=1.0):
- """
- Trigger a context menu event on a widget
- widget: The widget to trigger the event on
- pos: Optional, the QPoint to set as the event origin
- index: Optional, the QModelIndex to click in widget
- widget must be a QAbstractItemView
-
- Returns the menu that was created.
- """
- if index is not None:
- if pos is not None:
- raise RuntimeError("Error: 'index' and 'pos' are mutually exclusive")
- pos = widget.visualRect(index).center()
- parent = widget
- widget = widget.viewport()
- pos = widget.mapFrom(parent, pos)
- if pos is None:
- pos = widget.rect().center()
-
- # Post both a mouse event and a context menu to let the widget handle whichever is appropriate
- qApp.postEvent(widget, QtGui.QContextMenuEvent(QtGui.QContextMenuEvent.Mouse, pos))
- QtTest.QTest.mouseClick(widget, Qt.RightButton, Qt.NoModifier, pos)
-
- menu = None
- # Wait for a menu popup
- def menu_has_focus():
- nonlocal menu
- for fw in [qApp.activePopupWidget(), qApp.activeModalWidget(), qApp.focusWidget(), qApp.activeWindow()]:
- if fw and isinstance(fw, QtWidgets.QMenu) and fw.isVisible():
- menu = fw
- return True
- return False
- await wait_for_condition(menu_has_focus, timeout)
- return menu
-
-
-def move_mouse(widget, position):
- """
- Helper method to move the mouse to a specified position on a widget
- widget: The widget to trigger the event on
- position: The QPoint (local to widget) to move the mouse to
- """
- # For some reason, Qt wouldn't register the mouse movement correctly unless both of these ways are invoked.
- # The QTest.mouseMove seems to update the global cursor position, but doesn't always result in the MouseMove event being
- # triggered, which prevents drag/drop being able to be simulated.
- # Similarly, if only the MouseMove event is sent by itself to the core application, the global cursor position wasn't
- # updated properly, so drag/drop logic that depends on grabbing the globalPos didn't work.
- QtTest.QTest.mouseMove(widget, position)
- event = QtGui.QMouseEvent(QtCore.QEvent.MouseMove, position, widget.mapToGlobal(position), QtCore.Qt.LeftButton, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier)
- QtCore.QCoreApplication.sendEvent(widget, event)
-
-
-def drag_and_drop(source, target, source_point = QtCore.QPoint(), target_point = QtCore.QPoint()):
- """
- Simulate a drag/drop event from a source object to a specified target
- This has special case handling if the source is a QDockWidget (for docking) vs normal drag/drop
- source: The source object to initiate the drag from
- This is either a QWidget, or a tuple of (QAbstractItemView, QModelIndex) for dragging an item view item
- target: The target object to drop on after dragging
- This is either a QWidget, or a tuple of (QAbstractItemView, QModelIndex) for dropping on an item view item
- source_point: Optional, The QPoint to initiate the drag from. If none is specified, the center of the source will be used.
- target_point: Optional, The QPoint to drop on. If none is specified, the center of the target will be used.
- """
- # Flag if this drag/drop is for docking, which has some special cases
- docking = False
-
- # If the source is a tuple of (QAbstractItemView, QModelIndex), we need to use the
- # viewport() as the source, and find the location of the index
- if isinstance(source, tuple) and len(source) == 2:
- source_item_view = source[0]
- source_widget = source_item_view.viewport()
- source_model_index = source[1]
- source_rect = source_item_view.visualRect(source_model_index)
- else:
- # There are some special case actions if we are doing this drag for docking,
- # so figure this out by checking if the source is a QDockWidget
- if isinstance(source, QtWidgets.QDockWidget):
- docking = True
-
- source_widget = source
- source_rect = source.rect()
-
- # If the target is a tuple of (QAbstractItemView, QModelIndex), we need to use the
- # viewport() as the target, and find the location of the index
- if isinstance(target, tuple) and len(target) == 2:
- target_item_view = target[0]
- target_widget = target_item_view.viewport()
- target_model_index = target[1]
- target_rect = target_item_view.visualRect(target_model_index)
- else:
- # If we are doing a drag for docking, we actually want all the mouse events
- # to still be directed through the source widget
- if docking:
- target_widget = source_widget
- else:
- target_widget = target
- target_rect = target.rect()
-
- # If no source_point is specified, we need to find the center point of
- # the source widget
- if source_point.isNull():
- # If we are dragging for docking, initiate the drag from the center of the
- # dock widget title bar
- if docking:
- title_bar_widget = source.titleBarWidget()
- if title_bar_widget:
- source_point = title_bar_widget.geometry().center()
- else:
- raise RuntimeError("No titleBarWidget found for QDockWidget")
- # Otherwise, can just find the center of the rect
- else:
- source_point = source_rect.center()
-
- # If no target_point was specified, we need to find the center point of the target widget
- if target_point.isNull():
- target_point = target_rect.center()
-
- # If we are dragging for docking and we aren't dragging within the same source/target,
- # the mouse movements need to be directed to the source_widget, so we need to use the
- # difference in global positions of our source and target widgets to adjust the target_point
- # to be relative to the source
- if docking and source != target:
- source_top_left = source.mapToGlobal(QtCore.QPoint(0, 0))
- target_top_left = target.mapToGlobal(QtCore.QPoint(0, 0))
- offset = target_top_left - source_top_left
- target_point += offset
-
- # Move the mouse to the source spot where we will start the drag
- move_mouse(source_widget, source_point)
-
- # Press the left-mouse button to begin the drag
- QtTest.QTest.mousePress(source_widget, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, source_point)
-
- # If we are dragging for docking, we first need to drag the mouse past the minimum distance to
- # trigger the docking system properly
- if docking:
- drag_distance = QtWidgets.QApplication.startDragDistance() + 1
- docking_trigger_point = source_point + QtCore.QPoint(drag_distance, drag_distance)
- move_mouse(source_widget, docking_trigger_point)
-
- # Drag the mouse to the target widget over the desired point
- move_mouse(target_widget, target_point)
-
- # Release the left-mouse button to complete the drop.
- # If we are docking, we need to delay the actual mouse button release because the docking system has
- # a delay before the drop zone becomes active after it has been hovered, which can be found here:
- # FancyDockingDropZoneConstants::dockingTargetDelayMS = 110 ms
- # So we need to delay greater than dockingTargetDelayMS after the final mouse move
- # over the intended target.
- delay = -1
- if docking:
- delay = 200
- QtTest.QTest.mouseRelease(target_widget, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, target_point, delay)
-
- # Some drag/drop events have extra processing on the following event tick, so let those processEvents
- # first before we complete the drag/drop operation
- QtWidgets.QApplication.processEvents()
-
-
-def trigger_action_async(action):
- """
- Convenience function. Triggers an action asynchronously.
- This can be used if calling action.trigger might block (e.g. if it opens a modal dialog)
-
- action: The action to trigger
- """
- return run_soon(lambda: action.trigger())
-
-
-def click_button_async(button):
- """
- Convenience function. Clicks a button asynchronously.
- This can be used if calling button.click might block (e.g. if it opens a modal dialog)
-
- button: The button to click
- """
- return run_soon(lambda: button.click())
-
-
-async def wait_for_modal_widget(timeout=1.0):
- """
- Waits for an active modal widget and returns it.
- """
- return await wait_for(lambda: qApp.activeModalWidget(), timeout=timeout)
-
-async def wait_for_popup_widget(timeout=1.0):
- """
- Waits for an active popup widget and returns it.
- """
- return await wait_for(lambda: qApp.activePopupWidget(), timeout=timeout)
\ No newline at end of file
diff --git a/Tests/ly_shared/s3_utils.py b/Tests/ly_shared/s3_utils.py
deleted file mode 100755
index 5c516094f3..0000000000
--- a/Tests/ly_shared/s3_utils.py
+++ /dev/null
@@ -1,131 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-import pytest
-pytest.importorskip("boto3")
-import boto3
-import botocore.exceptions
-import logging
-import os
-
-import ly_test_tools.environment.file_system as file_system
-
-logger = logging.getLogger(__name__)
-
-
-class KeyExistsError(Exception):
- pass
-
-
-class KeyDoesNotExistError(Exception):
- pass
-
-
-class S3Utils(object):
- """
- Stores a boto3 S3 client to use for AWS S3 functionalities.
- """
- DEFAULT_REGION = 'us-west-2'
-
- def __init__(self, boto3_session=None):
- # type: (boto3.Session) -> None
- """
- The boto3 session can be set during init, or a default one will be created.
- :param boto3_session: A boto3 session
- """
- if boto3_session:
- self._session = boto3_session
- else:
- logger.info("No session provided, using default profile for s3 resource")
- self._session = boto3.session.Session()
- self._s3_resource = self._session.resource('s3')
-
- def upload_to_bucket(self, bucket_name, file_path, overwrite=False):
- """
- Uploads a given file to the given S3 bucket.
- :param bucket_name: Name of the S3 bucket where the file should be uploaded.
- :param file_path: Path to the target file.
- :param overwrite: Overwrite the key if it exists.
- """
- if not self.bucket_exists_in_s3(bucket_name):
- self._s3_resource.create_bucket(Bucket=bucket_name)
-
- s3_bucket = self._s3_resource.Bucket(bucket_name)
-
- file_key = os.path.basename(file_path)
- if not overwrite and self.key_exists_in_bucket(bucket_name, file_key):
- raise KeyExistsError("Key '{}' already exists in S3 bucket {}".format(file_key, bucket_name))
-
- s3_bucket.upload_file(file_path, file_key)
- logger.info("Uploading {} to S3 bucket {}".format(file_key, bucket_name))
-
- def download_from_bucket(self, bucket_name, file_key, destination_dir, file_name=None):
- """
- Download the given key from the given S3 bucket to the given destination. Logs an error if there is not enough \
- space available for the download.
- :param bucket_name: Name of the S3 bucket containing the desired file.
- :param file_key: Name of the file stored in S3.
- :param destination_dir: Directory where the file should be downloaded to.
- :param file_name: The name of the file you want to save it as. Defaults to the file_key.
- """
- self.bucket_exists_in_s3(bucket_name)
-
- if not self.key_exists_in_bucket(bucket_name, file_key):
- raise KeyDoesNotExistError("Key '{}' does not exist in S3 bucket {}".format(file_key, bucket_name))
-
- obj_summary = self._s3_resource.ObjectSummary(bucket_name, file_key)
- required_space = obj_summary.size
-
- file_system.check_free_space(destination_dir, required_space, "Insufficient space available for download:")
-
- if not os.path.exists(destination_dir):
- os.makedirs(destination_dir)
-
- if file_name is None:
- file_name = file_key
- destination_path = os.path.join(destination_dir, file_name)
- self._s3_resource.Object(bucket_name, file_key).download_file(destination_path)
- logger.info("Downloading {} to {}".format(file_key, destination_path))
-
- def bucket_exists_in_s3(self, bucket_name):
- """
- Verifies that the S3 bucket exists.
- :param bucket_name: Name of the S3 bucket that may or may not exist.
- :return: True if the bucket exists. False otherwise.
- """
- bucket_exists = True
-
- try:
- self._s3_resource.meta.client.head_bucket(Bucket=bucket_name)
- except botocore.exceptions.ClientError as err:
- if err.response['Error']['Code'] == '404':
- bucket_exists = False
-
- return bucket_exists
-
- def key_exists_in_bucket(self, bucket_name, file_key):
- """
- Verifies that the given key does not already exist in the given S3 bucket.
- :param bucket_name: Name of the S3 bucket that may or may not contain the file key.
- :param file_key: Name of the file key in question.
- :return: True if the key exists. False otherwise.
- """
- key_exists = True
- obj_summary = self._s3_resource.ObjectSummary(bucket_name, file_key)
-
- # Attempting to access any member of ObjectSummary for a nonexistent key will throw an exception
- # There is no built-in way to check key existence otherwise
- try:
- obj_summary.size
- except botocore.exceptions.ClientError as err:
- if err.response['Error']['Code'] == '404':
- key_exists = False
-
- return key_exists
diff --git a/Tests/ly_shared/screenshot_utils.py b/Tests/ly_shared/screenshot_utils.py
deleted file mode 100755
index c000cd8258..0000000000
--- a/Tests/ly_shared/screenshot_utils.py
+++ /dev/null
@@ -1,195 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import os
-import string
-
-from .file_utils import move_file
-from . import phase as phase
-from ly_test_tools.environment.waiter import wait_for
-from ly_test_tools.image.screenshot_compare_qssim import qssim as compare_screenshots
-
-from ly_remote_console.remote_console_commands import capture_screenshot_command as capture_screenshot_command
-from ly_remote_console.remote_console_commands import send_command_and_expect_response as send_command_and_expect_response
-
-
-def get_next_screenshot_at_path(screenshot_path, prefix='screenshot', num_digits=4):
- """
- :param screenshot_path: Root folder where the screenshots are being generated by the Launcher pr Editor.
- :param prefix: Generated screenshot files are named sequentially using the prefix.
- e.g: screenshot0000.jpg, screenshot0001.jpg and so on.
- :param num_digits: How many digits are used for file name formation.
- :return: A string with the file name (relative to screenshot_path).
- """
- max_counter = 10**num_digits
- counter = 0
- while counter < max_counter:
- numberstr = "{}".format(counter)
- formattednumber = numberstr.zfill(num_digits)
- filename = "{}{}.jpg".format(prefix, formattednumber)
- filepath = os.path.join(screenshot_path, filename)
- if not os.path.exists(filepath):
- #This filename is available.
- return filename
- raise AssertionError("All possible screenshot names at directory {} are taken".format(screenshot_path))
-
-
-def take_screenshot(remote_console_instance, workspace, screenshot_name):
- """
- Takes an in game screenshot using the remote console instance passed in, validates that the screenshot exists
- and then renames that screenshot to something defined by the user of this function.
- :param remote_console_instance: Remote console instance that is attached to a specific launcher instance
- :param workspace: workspace instance so we can get the platform cache folder.
- :param screenshot_name: Name of the screenshot
- :return: None
- """
- screenshot_path = os.path.join(workspace.paths.platform_cache(), 'user', 'screenshots')
- expected_screenshot_name = get_next_screenshot_at_path(screenshot_path)
- capture_screenshot_command(remote_console_instance)
- wait_for(lambda: os.path.exists(os.path.join(screenshot_path, expected_screenshot_name)),
- timeout=10,
- exc=AssertionError('Screenshot at path:{} and with name:{} not found.'.format(screenshot_path, expected_screenshot_name)) )
- wait_for(lambda: rename_screenshot(screenshot_path, screenshot_name),
- timeout=10,
- exc=AssertionError('Screenshot at path:{} and with name:{} is still in use.'.format(screenshot_path, screenshot_name)))
-
-
-def rename_screenshot(screenshot_path, screenshot_name):
- """
- Tries to rename the screenshot when the file is done being written to
- :param screenshot_path: Path to the Screenshot folder
- :param screenshot_name: Name we wish to change the screenshot to
- :return: True when operation is completed, False if the file is still in use
- """
- try:
- src_img = os.path.join(screenshot_path, 'screenshot0000.jpg')
- dst_img = os.path.join(screenshot_path, '{}.jpg'.format(screenshot_name))
- print('Trying to rename {} to {}'.format(src_img, dst_img))
- os.rename(src_img, dst_img)
- return True
- except Exception as e:
- print('Found error {0} when trying to rename screenshot.'.format(str(e)))
- return False
-
-
-def move_screenshots(screenshot_path, file_type, logs_path):
- """
- Moves screenshots of a specific file type to the flume location so we can gather all of the screenshots we took.
- :param screenshot_path: Path to the screenshot folder
- :param file_type: Types of Files to look for. IE .jpg, .tif, etc
- :param logs_path: Path where flume gathers logs to be upload
- """
- for file_name in os.listdir(screenshot_path):
- if file_name.endswith(file_type):
- move_file(screenshot_path, logs_path, file_name)
-
-def move_screenshots_to_artifacts(screenshot_path, file_type, artifact_manager):
- """
- Saves screenshots of a specific file type to the artifact manager then removes the original files
- :param screenshot_path: Path to the screenshot folder
- :param file_type: Types of Files to look for. IE .jpg, .tif, etc
- :param artifact_manager: The artifact manager to save the artifacts to
- """
- for file_name in os.listdir(screenshot_path):
- if file_name.endswith(file_type):
- full_path_name = os.path.join(screenshot_path, file_name)
- artifact_manager.save_artifact(full_path_name)
- os.remove(full_path_name)
-
-
-
-def compare_golden_image(similarity_threshold, screenshot, screenshot_path, golden_image_name,
- golden_image_path=None):
- """
- This function assumes that your golden image filename contains the same base screenshot name and the word "golden"
- ex. pc_gamelobby_golden
-
- :param similarity_threshold: A float from 0.0 - 1.0 that determines how similar images must be or an asserts
- :param screenshot: A string that is the full name of the screenshot (ex. 'gamelobby_host.jpg')
- :param screenshot_path: A string that contains the path to the screenshots
- :param golden_image_path: A string that contains the path to the golden images, defaults to the screenshot_path
- :return:
- """
- if golden_image_path is None:
- golden_image_path = screenshot_path
-
- mean_similarity = compare_screenshots((os.path.join(screenshot_path, screenshot)),
- (os.path.join(golden_image_path, golden_image_name)))
- assert mean_similarity > similarity_threshold, \
- '{} screenshot comparison failed! Mean similarity value is: {}'\
- .format(screenshot, mean_similarity)
-
-def download_qa_golden_images(project_name, destination_dir, platform):
- """
- Downloads the golden images for a specified project from s3. The project_name, platform, and filetype are used to
- filter which images will be downloaded as the golden images.
-
- https://s3.console.aws.amazon.com/s3/buckets/ly-qae-jenkins-configs/golden-images/?region=us-west-1&tab=overview
-
- :param project_name: a string of the project name of the folder in s3. ex: 'MultiplayerSample'
- :param destination_dir: a string of where the images will be downloaded to
- :param platform: a string for the platform type ('pc', 'android', 'ios', 'darwin')
- :param filetype: a string for the file type. ex: '.jpg', '.png'
- :return:
- """
-
- # Currently we import s3_utils here instead of at the top because this is the only method that needs it,
- # and s3_utils has an unmet dependency on boto3 that hasn't been resolved. Once s3_utils is functional again,
- # this can move back to the top of the file.
- try:
- from . import s3_utils as s3_utils
- except ImportError:
- raise Exception("Failed to import s3_utils")
- # end s3_utils import
-
- bucket_name = 'ly-qae-jenkins-configs'
- path = 'golden-images/{}/{}/'.format(project_name, platform)
-
- if not s3_utils.key_exists_in_bucket(bucket_name, path):
- raise s3_utils.KeyDoesNotExistError("Key '{}' does not exist in S3 bucket {}".format(path, bucket_name))
- for image in s3_utils.s3.Bucket(bucket_name).objects.filter(Prefix=path):
- file_name = string.replace(image.key, path, '')
- if file_name != '':
- s3_utils.download_from_bucket(bucket_name, image.key, destination_dir, file_name)
-
-
-def _retry_command(remote_console_instance, command, output, tries=10, timeout=10):
- """
- Retries specified console command multiple times and asserts if it still can not send.
- :param remote_console: the remote console connected to the launcher.
- :param command: the command to send to the console.
- :param output: The expected output to check if the command was sent successfully.
- :param tries: The amount of times to try before asserting.
- :param timeout: The amount of time in seconds to wait for each retry send.
- :return: True if succeeded, will assert otherwise.
- """
- while tries > 0:
- tries -= 1
- try:
- send_command_and_expect_response(remote_console_instance, command, output)
- return True
- except:
- pass #Do nothing. Let the number of tries get to 0 if necessary.
- assert False, "Command \"{}\" failed to run in remote console.".format(command)
-
-
-def prepare_for_screenshot_compare(remote_console_instance):
- """
- Prepares launcher for screenshot comparison. Removes any debug text and antialiasing that may result in interference
- with the comparison.
-
- :param remote_console_instance: Remote console instance that is attached to a specific launcher instance
- :return:
- """
- wait_for(lambda: _retry_command(remote_console_instance, 'r_displayinfo 0',
- '$3r_DisplayInfo = $60 $5[DUMPTODISK, RESTRICTEDMODE]$4'))
- wait_for(lambda: _retry_command(remote_console_instance, 'r_antialiasingmode 0',
- '$3r_AntialiasingMode = $60 $5[]$4'))
diff --git a/Tests/performance/Scripts/apbatch_perf_summary.py b/Tests/performance/Scripts/apbatch_perf_summary.py
deleted file mode 100755
index ed34cbf490..0000000000
--- a/Tests/performance/Scripts/apbatch_perf_summary.py
+++ /dev/null
@@ -1,211 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-"""
-Script is designed to help with asset processor performance testing.
-
-This script is capable of running AssetProcessorBatch.exe and
-calculating how much time did it take to execute it. Also it is
-processing ap batch output and grabbing actual asset processing time.
-
-Apart from that script is capable of logging folder size
-(files, folders, actual size in bytes).
-
-Usage:
-python apbatch_perf_summary.py [-h] {folder_size,run_apbatch}
-
-python apbatch_perf_summary.py folder_size path project -cache
-
-Will show folder size: files, folders and actual size in bytes.
-
-build_path: Full path to the build dev directory, e.g. F:\builds\lumberyard-0.0-639162-pc-1985\dev
-project: Full project name (e.g. StarterGame or SamplesProject).
--cache: specify if you need to check cache folder instead of source assets.
-
-python apbatch_perf_summary.py run_apbatch build_path platform num_launches -delete_cache
-
-Will launch AssetProcessorBatch.exe num_launches times. Will return average
-running time and average asset processing time.
-
-build_path: Full path to the build dev directory, e.g. F:\builds\lumberyard-0.0-639162-pc-1985\dev
-platform: Which platform to launch - one of following: vc141, vc142, mac
-num_launches: How many times do you want to launch ap batch.
--delete_cache: specify if you want to delete Cache before each run
-"""
-
-
-import subprocess
-import time
-import os
-import argparse
-import test_tools.shared.file_system as fs
-import errno
-
-
-def run_ap_batch(build_path, platform):
- """
- Given a path to build will run ap batch and return total running and processing times.
- :param build_path: Full path to build dev, e.g. F:\builds\lumberyard-0.0-639162-pc-1985\dev
- :param platform: Specify platform where to run apbatch: vc141, vc142 or mac.
- :return: (processing_time, total_running_time) tuple.
- """
- assert os.path.exists(build_path)
-
- now = time.time()
- process = subprocess.Popen(['AssetProcessorBatch'], cwd=os.path.join(build_path, platform),
- shell=True, stdout=subprocess.PIPE)
- for line in iter(process.stdout.readline, ''):
- if 'Total Assets Processing Time' in line:
- processing_time = line.split(':')[2]
- process.wait()
- end = time.time()
-
- print 'Processing time: {}'.format(processing_time.strip())
- print 'Total time: {}s'.format(end - now)
-
- return float(processing_time.split('s')[0]), float(end - now)
-
-
-def run_several_times(build_path, platform, num_launches, erase_cache):
- """
- Given path to build, project name and boolean parameter (whether there is need to delete a cache)
- will run AssetProcessorBatch.exe num_launches and will return average running and processing times.
- :param build_path: Full path to build dev, e.g. F:\builds\lumberyard-0.0-639162-pc-1985\dev
- :param platform: Specify platform where to run apbatch: vc141, vc142 or mac.
- :param num_launches: How many times user needs to launch ap batch.
- :param erase_cache: yes/no or True/False in case user needs Cache folder to be deleted prior to apbatch launch.
- :return: (avg_processing_time, avg_running_time) tuple.
- """
- if not os.path.exists(build_path):
- raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), build_path)
-
- average_processing_time = 0
- average_total_time = 0
-
- # running apbatch num_launches times and getting times
- for i in range(num_launches):
- if erase_cache and os.path.exists(os.path.join(build_path, 'Cache')):
- fs.delete([os.path.join(build_path, 'Cache')], False, True)
- print 'Iteration # {}'.format(i)
- processing_time, total_time = run_ap_batch(build_path, platform)
- average_processing_time += processing_time
- average_total_time += total_time
-
- # calculating average times
- average_processing_time /= num_launches
- average_total_time /= num_launches
-
- return average_processing_time, average_total_time
-
-
-def folder_size(path):
- """
- Given path to a build will calculate folder size.
- :param path: Full path to the folder for which you need folder size info.
- :return: (total_files_count, total_folders_count, total_size_in_bytes).
- """
- total_size = 0
- total_files_count = 0
- total_folder_count = 0
-
- if not os.path.exists(path):
- raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), path)
-
- # walking over the folder and calculating files, folder; total files size
- for dirpath, dirnames, filenames in os.walk(path):
- total_folder_count += len(dirnames)
- total_files_count += len(filenames)
- for f in filenames:
- fp = os.path.join(dirpath, f)
- total_size += os.path.getsize(fp)
-
- return total_files_count, total_folder_count, total_size
-
-
-def run_apbatch(args):
- """
- Function for argparse command run_apbatch:
- running run_several_times function and printing its results.
- :param args: args.build_path: see run_several_times build_path.
- args.num_launches: see run_several_times num_launches.
- args.platform: see run_several_times platform.
- args.delete: see run_several_times erase_cache.
- :return: None
- """
- platform_bin = {
- 'vc141': 'Bin64vc141',
- 'vc142': 'Bin64vc142',
- 'mac': 'BinMac64'
- }
- running_times = run_several_times(args.build_path, platform_bin[args.platform], args.num_launches, args.delete_cache)
- print '\nAssets processing time: {}s'.format(running_times[0])
- print 'Total running time: {}s'.format(running_times[1])
-
-
-def print_folder_size(args):
- """
- Function for argparse command folder_size:
- running folder_size function and printing its results.
- :param args: args.build_path: see folder_size path.
- args.project: specified project which folder will be analyzed.
- args.cache: yes/no or True/False - whether user need to check Cache folder or not.
- :return: None
- """
- print '{} (cache: {}) folder size:'.format(args.project, args.cache)
- if args.cache:
- path = os.path.join(args.build_path, 'Cache', args.project)
- else:
- path = os.path.join(args.build_path, args.project)
- folder_size_data = folder_size(path)
- print 'Files: {}'.format(folder_size_data[0])
- print 'Folders: {}'.format(folder_size_data[1])
- print 'Size: {}'.format(folder_size_data[2])
-
-
-def main():
- """Main function with set-up and commands execution"""
- # creating command line arguments parser
- parser = argparse.ArgumentParser(prog = 'apbatch_perf_summary')
- subparsers = parser.add_subparsers(help = 'sub-command help', dest='command')
-
- parser_folder_size = subparsers.add_parser('folder_size',
- help='Will show folder size: files, folders and actual size in bytes. ')
- parser_run_apbatch = subparsers.add_parser('run_apbatch', help='run_apbatch help')
-
- parser_run_apbatch.add_argument('build_path',
- help='Full path to the build dev directory, e.g. '
- 'F:\\builds\\lumberyard-0.0-639162-pc-1985\\dev')
- parser_run_apbatch.add_argument('platform', choices=['vc141', 'vc142', 'mac'], help='vc141, vc142 or mac')
- parser_run_apbatch.add_argument('num_launches', type=int, help='How many times do you want to launch ap batch.')
- parser_run_apbatch.add_argument('-delete_cache', default=False, action='store_true',
- help='Specify if you want to delete Cache before and between runs')
-
- parser_run_apbatch.set_defaults(func=run_apbatch)
-
- parser_folder_size.add_argument('build_path',
- help='Full path to the build dev directory, e.g. '
- 'F:\\builds\\lumberyard-0.0-639162-pc-1985\dev')
- parser_folder_size.add_argument('project', help='Full project name (e.g. StarterGame or SamplesProject).')
- parser_folder_size.add_argument('-cache', default=False, action='store_true',
- help='Specify if you want to check cache folder', required=False)
- parser_folder_size.set_defaults(func=print_folder_size)
-
- args = parser.parse_args()
-
- # executing passed commands
- args.func(args)
-
-
-# calling main function if script is launched as standalone module
-if __name__ == '__main__':
- main()
-
diff --git a/Tests/pipeline/__init__.py b/Tests/pipeline/__init__.py
deleted file mode 100755
index e912252f4e..0000000000
--- a/Tests/pipeline/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
diff --git a/Tests/pipeline/product_dependency_tests/AssetDependencyTests.py b/Tests/pipeline/product_dependency_tests/AssetDependencyTests.py
deleted file mode 100755
index 25e94b150c..0000000000
--- a/Tests/pipeline/product_dependency_tests/AssetDependencyTests.py
+++ /dev/null
@@ -1,88 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Automated scripts for tests calling AssetProcessorBatch validating basic features.
-
-"""
-
-from TestFixtures import HeliosProjectFixture
-
-import os
-import pytest
-import sqlite3
-import time
-import codecs
-
-def AssertProductHasDependencies(engineRoot, projectName, buildInfo, dbCheckWaitTime, product, pathDependencies, assetIdDependencies):
- productNameInDB = os.path.join(buildInfo.cacheSubfolder, projectName, product)
- productNameInDB = productNameInDB.replace("\\", "/")
-
- sqlDatabasePath = os.path.join(engineRoot, "Cache", projectName, "assetdb.sqlite")
- print (" * Connecting to database {}".format(sqlDatabasePath))
- sqlConnection = sqlite3.connect(sqlDatabasePath)
- productRowsList = list()
- productDbWait = dbCheckWaitTime
- while len(productRowsList) == 0 and productDbWait > 0:
- productRows = sqlConnection.execute(
- "SELECT ProductID FROM Products where ProductName='{}'".format(productNameInDB))
- productRowsList = list(productRows.fetchall())
- time.sleep(1)
- productDbWait = productDbWait - 1
- assert len(productRowsList) == 1, str.format("productRowsList= {}", productRowsList)
- productId = int(productRowsList[0][0])
-
- foundDependencies = list()
- dependencyDbTimeout = dbCheckWaitTime
- while len(foundDependencies) == 0 and dependencyDbTimeout > 0:
- dependencyRows = sqlConnection.execute(
- "SELECT * FROM ProductDependencies where ProductPK={}".format(productId))
- foundDependencies = list(dependencyRows.fetchall())
- time.sleep(1)
- dependencyDbTimeout = dependencyDbTimeout - 1
-
- foundAssetIds = list()
- foundUnresolvedPaths = list()
-
- uuidIndex = 2
- subIdIndex = 3
- unresolvedPathIndex = 6
- for foundDependency in foundDependencies:
- if foundDependency[unresolvedPathIndex] != "":
- # If there's a path, there won't be an asset ID
- foundUnresolvedPaths.append(foundDependency[unresolvedPathIndex])
- else:
- dependencyUUIDAsHex = codecs.encode(foundDependency[uuidIndex], 'hex_codec')
- subId = str(foundDependency[subIdIndex])
- assetId = "{}:{}".format(dependencyUUIDAsHex.decode('utf8'), subId)
- foundAssetIds.append(assetId)
-
- assert sorted(pathDependencies) == sorted(foundUnresolvedPaths)
- assert sorted(assetIdDependencies) == sorted(foundAssetIds)
-
-
-def test_VegdescriptorlistValidDependencies_DependenciesInDb(HeliosProjectFixture):
- engineRoot, projectName, buildInfo, dbCheckWaitTime = HeliosProjectFixture
- pathDependencies = {}
- assetIdDependencies = {
- # MeshAsset reference to "objects/default/primative_wedge_30.cgf"
- "e8b39f901f905e3998aa6f8ec4e91507:0",
- # MaterialAsset reference to "materials/am_grass1.mtl"
- "1151f14d38a65579888abe3139882e68:0"
- }
- AssertProductHasDependencies(engineRoot, projectName, buildInfo, dbCheckWaitTime, "heliosvegetation.vegdescriptorlist", pathDependencies, assetIdDependencies)
-
-def test_CloudLibrarytValidDependencies_DependenciesInDb(HeliosProjectFixture):
- engineRoot, projectName, buildInfo, dbCheckWaitTime = HeliosProjectFixture
- pathDependencies = {}
- assetIdDependencies = {
- # MaterialAsset reference to "materials/clouds/baseclouds.mtl"
- "f249f13854055cfba3b6d95bdc1a3db0:0"
- }
- AssertProductHasDependencies(engineRoot, projectName, buildInfo, dbCheckWaitTime, "libs/clouds/default.xml", pathDependencies, assetIdDependencies)
diff --git a/Tests/pipeline/product_dependency_tests/LvlDepTestDynamicSlice.py b/Tests/pipeline/product_dependency_tests/LvlDepTestDynamicSlice.py
deleted file mode 100755
index de7609c92c..0000000000
--- a/Tests/pipeline/product_dependency_tests/LvlDepTestDynamicSlice.py
+++ /dev/null
@@ -1,228 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Automated scripts for tests calling AssetProcessorBatch validating basic features.
-
-"""
-
-from TestFixtures import EmptyProjectFixture
-
-import fileinput
-import os
-import pytest
-import shutil
-import sqlite3
-import time
-
-import SubprocessUtils
-
-def MakeEditorPythonFile(testLevelName, assetGuid, tempFolder, templatePythonFile):
- outputFileName = templatePythonFile.replace(".template", ".py")
- outputFilePath = os.path.join(tempFolder, outputFileName)
- shutil.copy(os.path.join(os.path.dirname(os.path.realpath(
- __file__)), templatePythonFile), outputFilePath)
- for line in fileinput.FileInput(outputFilePath, inplace=1):
- line = line.replace("${LevelName}", str.format('"{}"', testLevelName))
- line = line.replace("${MeshGuid}", str.format('"{}"', assetGuid))
- print (line)
- return outputFilePath
-
-@pytest.mark.skip(reason="This test takes too long on Jenkins, and bundler tests catch everything we want from here")
-def test_productDependencies_EntityInLevelWithAssetReference_ReferencedAssetIsLevelProductDependency(
- EmptyProjectFixture, tmpdir):
- print ("RunLvlDynamicSliceTest")
- engineRoot, projectName, buildInfo, dbCheckWaitTime = EmptyProjectFixture
-
-
- tempFolder = tmpdir.mkdir("EditorPyScripts")
- print (" * Launch editor with dynamic slice test creation script")
-
- testLevelName = "SimpleLevel"
- expectedDependencyGuid = "81C4A6AF-C57D-5734-81B7-822074358C4D"
- exportLevelScriptPath = MakeEditorPythonFile(testLevelName, expectedDependencyGuid, str(tempFolder), "export_test_level.template")
-
- lyCommand = [buildInfo.editorExe, '/BatchMode', '/runpython', exportLevelScriptPath]
- SubprocessUtils.SubprocessWithTimeout(lyCommand, engineRoot, 60)
-
- # Logic that the export_test_level.py script will run in the editor:
- # * Create new level
- # * Place an entity in the level
- # * Add the mesh component to the entity
- # * Assign a test asset to that component [dev\Engine\Objects\default\primitive_sphere.cgf]
- # * Export the level
-
- print (" * Wait for the Asset Processor to copy the asset to the cache and update the asset database")
-
- projectCacheRoot = os.path.join(engineRoot, "Cache", projectName)
- levelRelativeSubFolder = os.path.join("Levels", testLevelName)
- cachePath = os.path.join(projectCacheRoot, buildInfo.cacheSubfolder, projectName, levelRelativeSubFolder, "level.pak")
- # On an i7 running Lumberyard on an SSD, it normally takes about 1-2 minutes to complete this step.
- # Add a few minutes onto that because the Jenkins machines may not be as fast.
- pakTimeoutSeconds = 10 * 60
- pakTimeoutWaitTimeSeconds = 1
- # Wait for the level.pak file to exist in the cache
- while not os.path.exists(cachePath) and pakTimeoutSeconds > 0:
- time.sleep(pakTimeoutWaitTimeSeconds)
- pakTimeoutSeconds -= pakTimeoutWaitTimeSeconds
-
- assert(os.path.exists(cachePath))
-
- print (" * Open the asset database, check that the correct product dependency is set for the exported level.pak")
-
- # A newly created level will have all of these dependencies by default.
- # These are tracked by the relative source path instead of the UUID because it's more readable.
- expectedDependencyPaths = {
- "materials/material_terrain_default.mtl", # from leveldata.xml
- "EngineAssets/Materials/sky/sky.mtl", # from mission_mission0.xml
- "EngineAssets/Materials/Water/ocean_default.mtl", # from mission_mission0.xml
- "textures/skys/night/half_moon.tif"
- }
-
- # Nothing is currently expected to unresolved, but this is left here in case that changes.
- expectedUnresolvedPaths = {
- # Hardcoded levelbuilder relative path output
- os.path.join(levelRelativeSubFolder, "auto_resourcelist.txt"),
- os.path.join(levelRelativeSubFolder, "level.cfg"),
- os.path.join(levelRelativeSubFolder, "levelparticles.xml"),
- os.path.join(levelRelativeSubFolder, "occluder.ocm"),
- os.path.join(levelRelativeSubFolder, "preloadlibs.txt"),
- os.path.join(levelRelativeSubFolder, "terrain", "cover.ctc"),
- os.path.join(levelRelativeSubFolder, "terrain", "merged_meshes_sectors", "mmrm_used_meshes.lst"),
- os.path.join(levelRelativeSubFolder, str.format("{}.xml",testLevelName))
- }
-
- # All expected GUIDs should match the format in the database: Lowercase, with no separators.
- expectedDependencyGuids = {
- expectedDependencyGuid.lower().replace('-','')
- }
-
- CheckDatabaseForDependency(projectCacheRoot, projectName, testLevelName, expectedDependencyGuids,
- expectedDependencyPaths, expectedUnresolvedPaths, buildInfo, dbCheckWaitTime)
-
- print ("/RunLvlDynamicSliceTest")
-
-
-def CheckDatabaseForDependency(projectCacheRoot, projectName, testLevelName, expectedDependencyGuids, expectedDependencyPaths, expectedUnresolvedPaths, buildInfo, dbCheckWaitTime):
- print ("CheckDatabaseForDependency")
-
- print (str.format(" * Checking expected dependencies for level.pak for level {}", testLevelName))
- print (str.format(" * Searching for these GUIDs as dependencies: {}", str(expectedDependencyGuids)))
- print (str.format(" * Searching for these paths as dependencies: {}", str(expectedDependencyPaths)))
- print (str.format(" * Searching for these paths as unresolved paths: {}", str(expectedUnresolvedPaths)))
-
- sqlDatabasePath = os.path.join(projectCacheRoot, "assetdb.sqlite")
- print (" * Connecting to database " + sqlDatabasePath)
- sqlConnection = sqlite3.connect(sqlDatabasePath)
- try:
- # Not using os.path.join because this is an expected string in a database
- levelPakProduct = str.format('{}/{}/levels/{}/level.pak', buildInfo.cacheSubfolder, projectName.lower(), testLevelName.lower())
- print (" * Looking in product table for " + levelPakProduct)
- productRows = sqlConnection.execute(
- str.format("SELECT ProductID FROM Products where ProductName='{}'", levelPakProduct))
-
- productRowsList = list(productRows.fetchall())
-
- productDbWait = dbCheckWaitTime
- while len(productRowsList) == 0 and productDbWait > 0:
- time.sleep(1)
- productDbWait = productDbWait - 1
- productRows = sqlConnection.execute(
- str.format("SELECT ProductID FROM Products where ProductName='{}'", levelPakProduct))
- productRowsList = list(productRows.fetchall())
-
-
- assert len(productRowsList) == 1, "productRowsList= {}".format(productRowsList)
-
- print (" * Searching product results for product ID")
- productId = int(productRowsList[0][0])
-
- assert productId
-
- print (str.format(" * Searching for dependencies for product ID {}", str(productId)))
- dependencyDbSuccess = False
- dependencyDbTimeout = dbCheckWaitTime
- # Make copies of the list in case multiple runs are required
- expectedUnresolvedPathsCopy = []
- expectedDependencyGuidsCopy = []
- remainingDependencies = []
-
- while (not dependencyDbSuccess) and dependencyDbTimeout > 0:
- expectedUnresolvedPathsCopy = expectedUnresolvedPaths.copy()
- expectedDependencyGuidsCopy = expectedDependencyGuids.copy()
- productDependencyRows = sqlConnection.execute("SELECT * FROM ProductDependencies where ProductPK={}".format(productId))
-
- dependencyRowIndex_SourceId = 2
- dependencyRowIndex_SubId = 3
- dependencyRowIndex_UnresolvedPath = 6
-
- productDependencyRowList = list(productDependencyRows.fetchall())
-
- expectedDependencyCount = len(expectedDependencyGuidsCopy) + len(
- expectedDependencyPaths) + len(expectedUnresolvedPathsCopy)
-
- dependencyDbSuccess = len(
- productDependencyRowList) == expectedDependencyCount
-
- expectedSubId = 0
-
- # This will contain SQL data buffers, which are not hashable.
- remainingDependencies = []
-
- for dependencyRow in productDependencyRowList:
- dependencySourceId = dependencyRow[dependencyRowIndex_SourceId]
- dependencySubId = int(dependencyRow[dependencyRowIndex_SubId])
- dependencyDbSuccess = dependencyDbSuccess and dependencySubId == expectedSubId
-
- dependencySourceAsHex = str(dependencySourceId).encode('hex')
- wasExpectedDependency = False
- # If this dependency's UUID is in our expected UUID list, then count it as found.
- if dependencySourceAsHex in expectedDependencyGuidsCopy:
- wasExpectedDependency = True
- expectedDependencyGuidsCopy.remove(dependencySourceAsHex)
-
- # If this dependency has an unresolved path that we expect, then count it as found.
- unresolvedPath = dependencyRow[dependencyRowIndex_UnresolvedPath]
- if unresolvedPath in expectedUnresolvedPathsCopy:
- wasExpectedDependency = True
- expectedUnresolvedPathsCopy.remove(unresolvedPath)
-
- if not wasExpectedDependency:
- remainingDependencies.append(dependencySourceId)
-
- dependencyDbSuccess = dependencyDbSuccess and (len(expectedDependencyGuidsCopy) == 0 and
- len(expectedUnresolvedPathsCopy) == 0 and
- len(remainingDependencies) == len(expectedDependencyPaths))
- if not dependencyDbSuccess:
- time.sleep(1)
- dependencyDbTimeout = dependencyDbTimeout - 1
-
- # do all the checks in asserts, instead of just assert dependencyDbSuccess so that error messages are more specific
- assert len(productDependencyRowList) == expectedDependencyCount, str.format("Expected {} dependencies, found {}", expectedDependencyCount, len(productDependencyRowList))
- assert len(expectedDependencyGuidsCopy) == 0, str.format(
- "Expected dependencies were not found in the asset database: {}", str(expectedDependencyGuids))
- assert len(expectedUnresolvedPathsCopy) == 0, str.format(
- "Expected unresolved paths were not found in the asset database: {}", str(expectedUnresolvedPathsCopy))
- assert len(remainingDependencies) == len(expectedDependencyPaths), str.format("Expected dependency sizes do not match for {} and {}", str(remainingDependencies), str(expectedDependencyPaths))
-
- for remainingDependency in remainingDependencies:
- sourceRows = sqlConnection.execute("SELECT SourceName FROM Sources where SourceGuid=?", (sqlite3.Binary(remainingDependency),) )
- sourceRowsList = list(sourceRows.fetchall())
- assert len(sourceRowsList) == 1, str.format("Expected to find 1 entry for {}, found {} instead.", str(remainingDependency).encode('hex'), len(sourceRowsList))
- sourcePath = sourceRowsList[0][0]
- assert sourcePath in expectedDependencyPaths, str.format("Could not find {} for UUID {} in the list of expected dependencies.", str(sourcePath), str(remainingDependency).encode('hex'))
- expectedDependencyPaths.remove(sourcePath)
- assert len(expectedDependencyPaths) == 0, str.format("Missing expected dependencies {}", str(expectedDependencyPaths))
-
- print (" * Found all expected dependencies")
- finally:
- print (" * Closing database connection")
- sqlConnection.close()
- print ("/CheckDatabaseForDependency")
-
diff --git a/Tests/pipeline/product_dependency_tests/SubprocessUtils.py b/Tests/pipeline/product_dependency_tests/SubprocessUtils.py
deleted file mode 100755
index d5637527f2..0000000000
--- a/Tests/pipeline/product_dependency_tests/SubprocessUtils.py
+++ /dev/null
@@ -1,52 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Automated scripts for tests calling AssetProcessorBatch validating basic features.
-
-"""
-
-import subprocess
-import threading
-import time
-
-class ThreadedSubprocess():
- def __init__(self, command, workingDirectory, timeOutMinutes):
- self.command = command
- self.workingDirectory = workingDirectory
- self.timeOutSeconds=timeOutMinutes*60
- self.process = None
- self.logOutput = []
- # Pytest doesn't handle asserts on other threads, capture them and report on the main thread.
- self.assertError = None
-
- def RunCommand(self):
- def RunThread():
- print (str.format("Subprocess thread starting for command: {}", self.command))
- self.process = subprocess.Popen(self.command, cwd=self.workingDirectory, shell=True, stdout=subprocess.PIPE, universal_newlines=True)
- for stdoutLine in iter(self.process.stdout.readline, ""):
- self.logOutput.append(stdoutLine)
- self.process.communicate()
- if self.process.returncode is None:
- self.assertError = str.format("Subprocess call '{}' had no return code", self.command)
- elif self.process.returncode != 0:
- self.assertError = str.format("Subprocess call '{}' returned code {}", self.command, self.process.returncode)
- print (str.format("Finished command, result {}: {}", self.process.returncode, self.command))
-
- commandThread = threading.Thread(target=RunThread)
- commandThread.start()
- commandThread.join(self.timeOutSeconds)
- assert not commandThread.is_alive(), str.format("Subprocess call '{}' timed out", self.command)
- assert self.assertError is None, self.assertError
-
-
-def SubprocessWithTimeout(command, workingDirectory, timeOutMinutes):
- threadedSubprocess = ThreadedSubprocess(command, workingDirectory, timeOutMinutes)
- threadedSubprocess.RunCommand()
- return threadedSubprocess.logOutput
diff --git a/Tests/pipeline/product_dependency_tests/TestAssets/updated_xml_schema_test.xmlschema b/Tests/pipeline/product_dependency_tests/TestAssets/updated_xml_schema_test.xmlschema
deleted file mode 100644
index a979a1b245..0000000000
--- a/Tests/pipeline/product_dependency_tests/TestAssets/updated_xml_schema_test.xmlschema
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Tests/pipeline/product_dependency_tests/TestAssets/xml_schema_test.xml b/Tests/pipeline/product_dependency_tests/TestAssets/xml_schema_test.xml
deleted file mode 100644
index 95b20dc6c8..0000000000
--- a/Tests/pipeline/product_dependency_tests/TestAssets/xml_schema_test.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/Tests/pipeline/product_dependency_tests/TestAssets/xml_schema_test.xmlschema b/Tests/pipeline/product_dependency_tests/TestAssets/xml_schema_test.xmlschema
deleted file mode 100644
index 69be99578d..0000000000
--- a/Tests/pipeline/product_dependency_tests/TestAssets/xml_schema_test.xmlschema
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Tests/pipeline/product_dependency_tests/TestCleanup.py b/Tests/pipeline/product_dependency_tests/TestCleanup.py
deleted file mode 100755
index d57119db26..0000000000
--- a/Tests/pipeline/product_dependency_tests/TestCleanup.py
+++ /dev/null
@@ -1,76 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Automated scripts for tests calling AssetProcessorBatch validating basic features.
-
-"""
-
-import os, subprocess, shutil, time
-
-import SubprocessUtils
-
-def KillProcess_Windows(processName):
- # This only runs on Windows
- processList = subprocess.check_output(str.format('tasklist /NH /FO CSV /FI "IMAGENAME eq {}"', processName))
- if processList is None or processList.startswith("INFO: No tasks are running which match the specified criteria."):
- # Asset processor isn't running, no need to kill it.
- return
- os.system(str.format('taskkill /F /IM {}', processName))
-
-def KillLumberyardTools():
- if os.name == 'nt':
- KillProcess_Windows("Editor.exe")
- KillProcess_Windows("AssetProcessor.exe")
- else:
- # Other operating systems are not yet supported, so have the test fail
- assert False
-
-
-def RemoveFolder(folderPath):
- # The Asset Processor may take a bit to shut down, retry a few times if it's still holding a lock on a file.
- retryCount = 5
- for retry in range(retryCount):
- if os.path.exists(folderPath) == False:
- return
-
- try:
- shutil.rmtree(folderPath)
- except:
- if retry < retryCount-1:
- # Wait a few seconds for whatever has the file handle open to close it.
- time.sleep(5)
- continue
- else:
- raise
-
-
-def cleanUpArtifacts(engineRoot, projectName, buildInfo):
- print ("cleanUpArtifacts")
-
- print (" * Shutting down Asset Processor")
- KillLumberyardTools()
-
- # Setting the active project to one that is in Perforce will make sure other commands work correctly. Once the
- # project created here is destroyed, lmbr_waf commands won't work.
- if os.path.exists(os.path.join(buildInfo.buildFolder,buildInfo.lmbrCommand)):
- print (" * Setting project to Helios")
- SubprocessUtils.SubprocessWithTimeout(str.format("{} projects set-active Helios", buildInfo.lmbrCommand), buildInfo.buildFolder, 60)
- else:
- print (" * Cannot set project to FeatureTests, lmbr executable is not available.")
- # Clearing the cache to guarantee that no data persists between tests.
- print (" * Clearing the asset cache")
- cachePath = os.path.join(engineRoot, "Cache", projectName)
- RemoveFolder(cachePath)
-
- print (" * Clearing generated data")
- projectPath = os.path.join(engineRoot, projectName)
- RemoveFolder(projectPath)
-
- print ("/cleanUpArtifacts")
diff --git a/Tests/pipeline/product_dependency_tests/TestFixtures.py b/Tests/pipeline/product_dependency_tests/TestFixtures.py
deleted file mode 100755
index 91151748a5..0000000000
--- a/Tests/pipeline/product_dependency_tests/TestFixtures.py
+++ /dev/null
@@ -1,63 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Automated scripts for tests calling AssetProcessorBatch validating basic features.
-
-"""
-
-import os
-import pytest
-
-import LmbrBuildInfo
-import SubprocessUtils
-import TestCleanup
-import TestSetup
-
-@pytest.fixture(scope="session")
-def EmptyProjectFixture(request):
- print ("EmptyProjectFixture")
- engineRoot = TestSetup.FindEngineRoot()
- assert engineRoot
- projectName = "LevelDepTestProj"
- buildInfo = LmbrBuildInfo.GetBuildInfo(request.config.option.buildFlavor, engineRoot)
- TestCleanup.cleanUpArtifacts(engineRoot, projectName, buildInfo)
-
- TestSetup.CreateLvlDepTestProject(engineRoot, projectName, buildInfo, request.config.option.thirdPartyPath)
- # cleanUpArtifacts deleted the temp dir, so create it.
- print ("Finished EmptyProjectFixture setup")
- yield engineRoot, projectName, buildInfo, int(request.config.option.dbWaitTimes)
-
- print ("Tearing down EmptyProjectFixture")
- TestCleanup.cleanUpArtifacts(engineRoot, projectName, buildInfo)
- print ("Finished EmptyProjectFixture tear down")
-
-
-# These tests require the Helios project to be built in profile and active before they are run.
-# This external requirement allows faster iteration on these tests on Jenkins and locally.
-@pytest.fixture(scope="session")
-def HeliosProjectFixture(request):
- print ("HeliosProjectFixture")
- engineRoot = TestSetup.FindEngineRoot()
- assert engineRoot
- projectName = "Helios"
- buildInfo = LmbrBuildInfo.GetBuildInfo(request.config.option.buildFlavor, engineRoot)
-
- # These tests are run on Jenkins after other tests, to minimize time spent on Jenkins jobs.
- # Verify that the correct project has been set before this test starts.
-
- # Temporarily disabling while LY-103017 is not in Helios branch
- # Creating a task to revert this change later: LY-103334
-
- # Run asset processor once to process all assets, so the tests themselves can run at consistent speeds.
- SubprocessUtils.SubprocessWithTimeout([buildInfo.assetProcessorBatch], engineRoot, 120)
-
- print ("Finished HeliosProjectFixture setup")
- yield engineRoot, projectName, buildInfo, int(request.config.option.dbWaitTimes)
- print ("Tearing down EmptyProjectFixture")
diff --git a/Tests/pipeline/product_dependency_tests/XmlSchemaSystemTests.py b/Tests/pipeline/product_dependency_tests/XmlSchemaSystemTests.py
deleted file mode 100755
index 51a349c185..0000000000
--- a/Tests/pipeline/product_dependency_tests/XmlSchemaSystemTests.py
+++ /dev/null
@@ -1,212 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Automated scripts for tests calling AssetProcessorBatch validating basic features.
-
-"""
-
-from TestFixtures import HeliosProjectFixture
-
-import pytest
-import shutil
-import subprocess
-import os
-import sqlite3
-import time
-
-TEST_ASSETS_FOLDER_NAME = 'TestAssetS'
-TEST_XML_NAME = 'xml_schema_test.xml'
-TEST_SCHEMA_NAME = 'xml_schema_test.xmlschema'
-UPDATED_TEST_SCHEMA_NAME = 'updated_xml_schema_test.xmlschema'
-SCHEMA_FOLDER_NAME = 'Schema'
-
-def test_XmlSchemaSystem_AddNewSchema_ReprocessXml(HeliosProjectFixture):
- engineRoot, projectName, buildInfo, dbCheckWaitTime = HeliosProjectFixture
- projectFolder = os.path.join(engineRoot, projectName)
-
- testAssetsFolder = os.path.dirname(os.path.realpath(__file__))
- testAssetsFolder = os.path.join(testAssetsFolder, TEST_ASSETS_FOLDER_NAME)
- testXmlPath = os.path.join(testAssetsFolder, TEST_XML_NAME)
- testSchemaPath = os.path.join(testAssetsFolder, TEST_SCHEMA_NAME)
- updatedTestSchemaPath = os.path.join(testAssetsFolder, UPDATED_TEST_SCHEMA_NAME)
-
- projectXmlPath = os.path.join(projectFolder, TEST_XML_NAME)
- schemaFolderInProject = os.path.join(projectFolder, SCHEMA_FOLDER_NAME)
- projectSchemaPath = os.path.join(schemaFolderInProject, TEST_SCHEMA_NAME)
-
- # Clean up the existing test xml and schema assets
- if CleanUpTestAsset(projectXmlPath) or CleanUpTestAsset(projectSchemaPath):
- # Remove the test assets and its dependencies from the database
- subprocess.call(
- [os.path.join(buildInfo.buildFolder, 'AssetProcessorBatch'), "/gamefolder=Helios"])
-
- # Copy test XML asset to the project
- # No product dependency should be output for the XML asset without a corresponding schema
- print ("Add new XML asset")
- expectedUnresolvedPaths = {}
- UpdateProjectAsset(testXmlPath, projectXmlPath, engineRoot, projectName,
- expectedUnresolvedPaths, buildInfo, dbCheckWaitTime, False)
-
- # Copy the XML schema asset to the project
- # XML assets are expected to be reprocessed and output product dependencies
- print ("Add new XML schema")
- if not os.path.exists(schemaFolderInProject):
- os.makedirs(schemaFolderInProject)
- expectedUnresolvedPaths = { 'dependency1' }
- UpdateProjectAsset(testSchemaPath, projectSchemaPath, engineRoot, projectName,
- expectedUnresolvedPaths, buildInfo, dbCheckWaitTime, False)
-
- # Update the XML schema asset inside the project
- # XML assets are expected to be reprocessed and output product dependencies
- print ("Update XML schema")
- expectedUnresolvedPaths = { 'dependency1', 'dependency2'}
- UpdateProjectAsset(updatedTestSchemaPath, projectSchemaPath, engineRoot, projectName,
- expectedUnresolvedPaths, buildInfo, dbCheckWaitTime, False)
-
- # Delete the schema asset in the project folder
- # No product dependency should be output for the XML asset since the schema has been deleted
- print ("Delete XML schema")
- expectedUnresolvedPaths = {}
- UpdateProjectAsset(updatedTestSchemaPath, projectSchemaPath, engineRoot, projectName,
- expectedUnresolvedPaths, buildInfo, dbCheckWaitTime, True)
-
- # Clean up the test assets
- CleanUpTestAsset(projectXmlPath)
- if not os.listdir(schemaFolderInProject):
- os.rmdir(schemaFolderInProject)
-
-def test_XmlSchemaSystem_MoveSchemaToGem_ReprocessXml(HeliosProjectFixture):
- engineRoot, projectName, buildInfo, dbCheckWaitTime = HeliosProjectFixture
-
- projectFolder = os.path.join(engineRoot, projectName)
- testAssetsFolder = os.path.dirname(os.path.realpath(__file__))
- testAssetsFolder = os.path.join(testAssetsFolder, TEST_ASSETS_FOLDER_NAME)
- testXmlPath = os.path.join(testAssetsFolder, TEST_XML_NAME)
- testSchemaPath = os.path.join(testAssetsFolder, TEST_SCHEMA_NAME)
- projectXmlPath = os.path.join(projectFolder, TEST_XML_NAME)
- projectSchemaPath = os.path.join(projectFolder, SCHEMA_FOLDER_NAME, TEST_SCHEMA_NAME)
- # The CertificateManager Gem was arbitrarily chosen. Schema can be added to any enabled gem
- gemSchemaFolder = os.path.join(engineRoot, 'Gems', 'CertificateManager', 'Assets', SCHEMA_FOLDER_NAME)
- gemSchemaPath = os.path.join(gemSchemaFolder, TEST_SCHEMA_NAME)
-
- # Clean up all the potential test xml and schema assets
- if CleanUpTestAsset(projectXmlPath) or CleanUpTestAsset(projectSchemaPath) or CleanUpTestAsset(gemSchemaPath):
- # Remove the test assets and its dependencies from the database
- subprocess.call(
- [os.path.join(buildInfo.buildFolder, 'AssetProcessorBatch'), "/gamefolder=Helios"])
-
- print ('Add XML schema to CertificateManager gem')
- if not os.path.exists(gemSchemaFolder):
- os.makedirs(gemSchemaFolder)
- shutil.copyfile(testSchemaPath, gemSchemaPath)
-
- print ('Reprocess test assets')
- expectedUnresolvedPaths = { 'dependency1' }
- UpdateProjectAsset(testXmlPath, projectXmlPath, engineRoot, projectName, expectedUnresolvedPaths, buildInfo, dbCheckWaitTime, False)
-
- # Clean up the test assets
- CleanUpTestAsset(projectXmlPath)
- CleanUpTestAsset(gemSchemaPath)
- if not os.listdir(gemSchemaFolder):
- os.rmdir(gemSchemaFolder)
-
-def CleanUpTestAsset(assetName):
- assetExists = False;
- if os.path.exists(assetName):
- assetExists = True;
- os.remove(assetName)
-
- assert not os.path.exists(assetName)
-
- return assetExists
-
-
-def UpdateProjectAsset(testAssetPath, projectAssetPath, engineRoot, projectName, expectedUnresolvedPaths, buildInfo, dbCheckWaitTime, deleteAsset):
- if deleteAsset:
- os.remove(projectAssetPath)
- else:
- shutil.copyfile(testAssetPath, projectAssetPath)
-
- # Let AP reprocess the new/updated asset
- subprocess.call(
- [os.path.join(buildInfo.buildFolder, 'AssetProcessorBatch'), "/gamefolder=Helios"])
-
- projectCacheRoot = os.path.join(engineRoot, 'Cache', projectName)
- CheckDatabaseForDependency(projectCacheRoot, projectName,
- expectedUnresolvedPaths, buildInfo, dbCheckWaitTime)
-
-
-def CheckDatabaseForDependency(projectCacheRoot, projectName, expectedUnresolvedPaths, buildInfo, dbCheckWaitTime):
- print ("CheckDatabaseForDependency")
-
- print (" * Searching for these paths as unresolved paths: {}".format(str(expectedUnresolvedPaths)))
-
- sqlDatabasePath = os.path.join(projectCacheRoot, "assetdb.sqlite")
- print (" * Connecting to database " + sqlDatabasePath)
- sqlConnection = sqlite3.connect(sqlDatabasePath)
- try:
- # Not using os.path.join because this is an expected string in a database
- xmlProduct = '{}/{}/xml_schema_test.xml'.format(buildInfo.cacheSubfolder, projectName.lower())
- print (" * Looking in product table for " + xmlProduct)
- productRows = sqlConnection.execute(
- "SELECT ProductID FROM Products where ProductName='{}'".format(xmlProduct))
- productRowsList = list(productRows.fetchall())
-
- productDbWait = dbCheckWaitTime
- while len(productRowsList) == 0 and productDbWait > 0:
- time.sleep(1)
- productDbWait = productDbWait - 1
- productRows = sqlConnection.execute(
- "SELECT ProductID FROM Products where ProductName='{}'".format(xmlProduct))
- productRowsList = list(productRows.fetchall())
-
- assert len(productRowsList) == 1, "productRowsList= {}".format(productRowsList)
-
- print (" * Searching product results for product ID")
- productId = int(productRowsList[0][0])
-
- assert productId
-
- print (" * Searching for dependencies for product ID {}".format(productId))
- dependencyDbSuccess = False
- dependencyDbTimeout = dbCheckWaitTime
- # Make copies of the list in case multiple runs are required
- expectedUnresolvedPathsCopy = []
- dependencyRowIndex_UnresolvedPath = 6
- while (not dependencyDbSuccess) and dependencyDbTimeout > 0:
- expectedUnresolvedPathsCopy = expectedUnresolvedPaths.copy()
- productDependencyRows = sqlConnection.execute("SELECT * FROM ProductDependencies where ProductPK={}".format(productId))
-
- productDependencyRowList = list(productDependencyRows.fetchall())
- expectedDependencyCount = len(expectedUnresolvedPathsCopy)
- dependencyDbSuccess = len(
- productDependencyRowList) == expectedDependencyCount
-
- for dependencyRow in productDependencyRowList:
- # If this dependency has an unresolved path that we expect, then count it as found.
- unresolvedPath = dependencyRow[dependencyRowIndex_UnresolvedPath]
- if unresolvedPath in expectedUnresolvedPathsCopy:
- expectedUnresolvedPathsCopy.remove(unresolvedPath)
-
- dependencyDbSuccess = dependencyDbSuccess and len(expectedUnresolvedPathsCopy) == 0
-
- if not dependencyDbSuccess:
- time.sleep(1)
- dependencyDbTimeout = dependencyDbTimeout - 1
-
- # do all the checks in asserts, instead of just assert dependencyDbSuccess so that error messages are more specific
- assert len(expectedUnresolvedPathsCopy) == 0, str.format(
- "Expected unresolved paths were not found in the asset database: {}", str(expectedUnresolvedPathsCopy))
-
- print (" * Found all expected dependencies")
- finally:
- print (" * Closing database connection")
- sqlConnection.close()
- print ("/CheckDatabaseForDependency")
\ No newline at end of file
diff --git a/Tests/pipeline/product_dependency_tests/conftest.py b/Tests/pipeline/product_dependency_tests/conftest.py
deleted file mode 100755
index cdac03401a..0000000000
--- a/Tests/pipeline/product_dependency_tests/conftest.py
+++ /dev/null
@@ -1,36 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Automated scripts for tests calling AssetProcessorBatch validating basic features.
-
-"""
-
-def pytest_addoption(parser):
- parser.addoption(
- "--buildFlavor", action="store", default="WindowsVS2017", help="Sets the build type (see lmbrBuildInfo.py for what's available)"
- )
-
- parser.addoption(
- "--dbWaitTimes", action="store", default=60, help="How long (in seconds) to wait for a condition to be met in the database before timing out"
- )
-
- parser.addoption(
- "--thirdPartyPath", action="store", help="Path to the 3rd party folder"
- )
-
-def pytest_generate_tests(metafunc):
- if "buildFlavor" in metafunc.fixturenames:
- metafunc.parametrize("buildFlavor", metafunc.config.getoption("buildFlavor"), scope="session")
-
- if "dbWaitTimes" in metafunc.fixturenames:
- metafunc.parametrize("dbWaitTimes", metafunc.config.getoption("dbWaitTimes"), scope="session")
-
- if "thirdPartyPath" in metafunc.fixturenames:
- metafunc.parametrize("thirdPartyPath", metafunc.config.getoption("thirdPartyPath"), scope="session")
\ No newline at end of file
diff --git a/Tests/pipeline/product_dependency_tests/export_test_level.template b/Tests/pipeline/product_dependency_tests/export_test_level.template
deleted file mode 100644
index 2a6567904e..0000000000
--- a/Tests/pipeline/product_dependency_tests/export_test_level.template
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-#
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the "License"). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#
-
-import os
-
-game_folder = general.get_game_folder()
-levelName = ${LevelName}
-meshGuid = ${MeshGuid}
-
-# Don't use terrain because creating a level with terrain causes a popup message that requires user input.
-general.create_level(levelName, 128, 1, False)
-levelPath = os.path.join(game_folder, "Levels", levelName, str.format("{}.ly", levelName))
-
-if not isinstance(input, str):
- # general.open_level_no_prompt expects the file path in utf8 format
- levelPath = levelName.encode("utf-8")
-
-general.open_level_no_prompt(levelPath)
-
-newEntityIdStr = str(general.create_entity("TestEntityName"))
-
-componentResult = general.add_mesh_component_with_mesh(newEntityIdStr, meshGuid)
-
-if not componentResult:
- raise Exception('Export Test Level', str.format('Failed to add mesh ID {} to entity ID {}', str(meshGuid), str(newEntityIdStr)))
-
-general.save_level()
-general.export_to_engine()
-
-general.exit()
diff --git a/Tests/samples/__init__.py b/Tests/samples/__init__.py
deleted file mode 100755
index e912252f4e..0000000000
--- a/Tests/samples/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
diff --git a/Tests/samples/sample_tests.py b/Tests/samples/sample_tests.py
deleted file mode 100755
index aef6dc0f97..0000000000
--- a/Tests/samples/sample_tests.py
+++ /dev/null
@@ -1,163 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Sample tests to demonstrate typical functionality of PythonTestTools and how to integrate into the BAT.
-"""
-# Workaround for tests which depend on old tools, before they are updated to ly_test_tools and Python 3
-import pytest
-pytest.importorskip('test_tools')
-
-# System level imports
-import os
-import subprocess
-
-# Basic PythonTestTools imports, in most cases you should always import these
-import test_tools.builtin.fixtures as fixtures
-from test_tools import HOST_PLATFORM, WINDOWS_LAUNCHER
-
-# test_tools and shared are modules with a lot of useful utility functions already written, use them!
-# Pick and choose the ones below that you need, don't just blindly copy/paste
-import test_tools.launchers.phase
-import test_tools.shared.process_utils as process_utils
-from test_tools.shared.file_utils import gather_error_logs, clear_out_config_file, delete_screenshot_folder, move_file
-from shared.network_utils import check_for_listening_port
-from test_tools.shared.remote_console_commands import RemoteConsole
-from test_tools.shared.waiter import wait_for
-
-
-# This is where you should access lumberyard - building, asset processing, finding paths/logs, etc. Do NOT change or
-# remove this unless you know what you're doing.
-# See the documentation for PythonTestTools for more information.
-workspace = fixtures.use_fixture(fixtures.builtin_empty_workspace_fixture, scope='function')
-
-# What are fixtures?
-# Fixtures set up a testing process (or test) by running all necessary code to satisfy its preconditions.
-# More reading here: https://docs.pytest.org/en/latest/fixture.html
-
-# This is a shared instance of the remote console that be used across multiple tests. It must have the @pytest.fixture!
-# You should remove this if you aren't going to use the remote console.
-@pytest.fixture
-def remote_console_instance(request):
- """
- Creates a remote console instance to send console commands.
- """
- console = RemoteConsole()
-
- def teardown():
- try:
- console.stop()
- except:
- pass
-
- request.addfinalizer(teardown)
-
- return console
-
-
-# This is a shared instance of the launcher that can be used across multiple tests within this file and any that it
-# includes. It must have the @pytest.fixture for pytest to automatically pass it around!
-# You should remove this if you aren't going to use the level-specific launchers.
-@pytest.fixture
-def launcher_instance(request, workspace, level):
- """
- Creates a launcher fixture instance with an extra teardown for error log grabbing.
- """
- def teardown_launcher_copy_logs():
- """
- Tries to grab any error logs before moving on to the next test.
- """
-
- for file_name in os.listdir(launcher.workspace.release.paths.project_log()):
- move_file(launcher.workspace.release.paths.project_log(),
- launcher.workspace.artifact_manager.get_save_artifact_path(),
- file_name)
-
- logs_exist = lambda: gather_error_logs(
- launcher.workspace.release.paths.dev(),
- launcher.workspace.artifact_manager.get_save_artifact_path())
- try:
- test_tools.shared.waiter.wait_for(logs_exist)
- except AssertionError:
- print("No error logs found. Completing test...")
-
- request.addfinalizer(teardown_launcher_copy_logs)
-
- launcher = fixtures.launcher(request, workspace, level)
- return launcher
-
-# For the rest of the file, these are sample tests that you should remove entirely, or cannibalize them to help your
-# own test-writing process.
-class TestSamplesAPBatch:
-
- # This is a shared instance of test teardown that will be used across all tests in this class.
- # It must have the @pytest.fixture(autouse=True)!
- @pytest.fixture(autouse=True)
- def setup_teardown(self, request):
-
- # This is the teardown function that will be run after *each* test finishes
- def teardown():
- pass
-
- # This is the setup section that will be run before *each* test starts
- request.addfinalizer(teardown)
-
- # mark.BAT adds this test to the BAT.
- # mark.test_case is used to link to your testrail id.
- # mark.parameterize allows you to run the same test multiple times but with different parameters, such as platform,
- # configuration, project, level, and more. See more on parameters here: https://docs.pytest.org/en/latest/parametrize.html
- @pytest.mark.BAT
- @pytest.mark.test_case(testrail_id='Foo')
- @pytest.mark.parametrize('platform,configuration,project,spec', (
- pytest.param('win_x64_vs2017', 'profile', 'StarterGame', 'all',
- marks=pytest.mark.skipif(HOST_PLATFORM != 'win_x64', reason='Only supported on Windows hosts')),
- pytest.param('darwin_x64', 'profile', 'StarterGame', 'all',
- marks=pytest.mark.skipif(HOST_PLATFORM != 'darwin_x64', reason='Only supported on Mac hosts')),
- ))
- def test_RunAPBatch_WorkspacePreconfigured_NoLeftoverProcessesExist(self, workspace):
- """
- Tests that the Asset Processor Batch and run and doesn't leave leftover processes.
- """
- # Your function docstrings (the above text) will be part of the test catalog!
-
- subprocess.check_call([os.path.join(workspace.release.paths.bin(), 'AssetProcessorBatch')])
-
- # This is how you should do timeouts
- wait_for(lambda: not process_utils.process_exists('AssetProcessorBatch', True), timeout=10)
-
- # Make sure to include an informative assert message to make debugging easier
- assert not process_utils.process_exists('rc', True), 'rc process still exists'
- assert not process_utils.process_exists('AssetBuilder', True), 'AssetBuilder process still exists'
-
-
-# Notice that you can put the marks both on the class and on the individual methods (seen above).
-@pytest.mark.BAT
-@pytest.mark.parametrize("platform,configuration,project,spec,level", [
- pytest.param("win_x64_vs2017", "profile", "StarterGame", "all", "StarterGame",
- marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")),
- pytest.param("win_x64_vs2019", "profile", "StarterGame", "all", "StarterGame",
- marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts"))
-])
-class TestSamplesRemoteConsole(object):
-
- # Notice here that both the launcher_instance and remote_console_instance fixtures are being reused from above
- def test_LaunchRemoteConsoleAndLauncher_CanLaunch(self, launcher_instance, platform, configuration, project, spec,
- level, remote_console_instance):
- """
- Verifies launcher & remote console can successfully launch. Notice that there are no asserts here, and that is
- because the called functions will raise exceptions if there is unexpected behavior.
- """
- launcher_instance.launch()
-
- launcher_instance.run(test_tools.launchers.phase.TimePhase(120, 120))
-
- test_tools.shared.waiter.wait_for(lambda: check_for_listening_port(4600), timeout=300,
- exc=AssertionError('Port 4600 not listening.'))
-
- remote_console_instance.start()
diff --git a/Tests/samples/sanity_test.py b/Tests/samples/sanity_test.py
deleted file mode 100755
index 062bfeea63..0000000000
--- a/Tests/samples/sanity_test.py
+++ /dev/null
@@ -1,58 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-A simple sanity test.
-"""
-import os
-import pytest
-
-import ly_test_tools.builtin.helpers
-
-
-class TestSanity:
-
- @pytest.fixture(autouse=True)
- def setup_teardown(self, request, legacy_workspace):
- def teardown():
- # Per-test cleanup goes here
- pass
- request.addfinalizer(teardown) # adds teardown to pytest important to hook before setup in case setup fails
-
- # Per-test setup goes here
-
- # builtin_empty_workspace_fixture doesn't configure lumberyard to run, it leaves all the configuration to
- # the test.
- # To run lumberayrd you need to at least setup 3rdParty and run setup assistant using the following lines.
- # Alternatively, you can use 'builtin_workspace_fixture'.
- # This sanity test only checks if the framework is sane, so there is no need to configure LY.
- # workspace.run_waf_configure()
- # workspace.setup_assistant.enable_default_capabilities()
-
- @pytest.mark.bvt
- # Example of dynamically parametrized test, these parameters are consumed by the workspace fixture:
- # TODO LY-109331 @pytest.mark.parametrize("platform", ["win_x64_vs2017", "win_x64_vs2019", "darwin_x64"])
- @pytest.mark.parametrize("platform", ["win_x64_vs2017", "win_x64_vs2019"])
- @pytest.mark.parametrize("configuration", ["profile"])
- @pytest.mark.parametrize("project", ["AutomatedTesting"])
- @pytest.mark.parametrize("spec", ["all"])
- def test_Paths_DevPathExists_PathItsADirectory(self, legacy_workspace, platform, configuration, project, spec):
- # type: (WorkspaceManager, str, str, str, str) -> None
-
- # Test code goes here
- # os.makedirs(workspace.paths.dev())
-
- # These asserts verify that the parameters were correctly received by the workspace fixture
- assert legacy_workspace.platform == platform, "Platform does not match parameters"
- assert legacy_workspace.configuration == configuration, "Configuration does not match parameters"
- assert legacy_workspace.project == project, "Project does not match parameters"
- assert legacy_workspace.spec == spec, "Spec does not match parameters"
-
- # Verify that the dev folder exists
- assert os.path.isdir(legacy_workspace.paths.dev())
diff --git a/Tests/shared/__init__.py b/Tests/shared/__init__.py
deleted file mode 100755
index e912252f4e..0000000000
--- a/Tests/shared/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
diff --git a/Tests/shared/file_utils.py b/Tests/shared/file_utils.py
deleted file mode 100755
index 98bf08c29a..0000000000
--- a/Tests/shared/file_utils.py
+++ /dev/null
@@ -1,182 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import os
-import shutil
-import subprocess
-import logging
-
-import test_tools.shared.file_system as file_system
-from test_tools.shared.waiter import wait_for
-
-logger = logging.getLogger(__name__)
-
-
-def clear_out_config_file(project_path, script_name):
- """
- Clears out the specified config file to be empty.
- :param project_path: The directory where the file is.
- :param script_name: The file name.
- """
- path = os.path.join(project_path, '{}.cfg'.format(script_name))
-
- if os.path.exists(path):
- # Clears read only flag
- file_system.unlock_file(path)
-
- with open(path, 'w') as initialmap_script:
- initialmap_script.write('')
-
-
-def add_commands_to_config_file(config_file_dir, config_file_name, command_list):
- """
- From the command list, appends each command to the specified config file.
- :param config_file_dir: The directory the config file is contained in.
- :param config_file_name: The config file name.
- :param command_list: The commands to add to the file.
- :return:
- """
- config_file_path = os.path.join(config_file_dir, config_file_name)
- os.chmod(config_file_path, 0755)
- with open(config_file_path, 'w') as launch_config_file:
- for command in command_list:
- launch_config_file.write("{}\n".format(command))
-
-
-def gather_error_logs(dev_path, logs_path):
- """
- Grabs all error logs (if there are any) and puts them into the specified logs path.
- :param dev_path: Path to the dev directory.
- :param logs_path: Path to the destination directory for the logs (the test results path).
- """
- error_logs_sent = False
- error_log_path = os.path.join(dev_path, 'error.log')
- artifact_log_path = os.path.join(logs_path, 'error.log')
- error_dump_path = os.path.join(dev_path, 'error.dmp')
- artifact_dump_path = os.path.join(logs_path, 'error.dmp')
- if os.path.exists(error_dump_path) and os.path.exists(error_log_path):
- shutil.move(error_dump_path, artifact_dump_path)
- shutil.move(error_log_path, artifact_log_path)
- error_logs_sent = True
- return error_logs_sent
-
-
-def delete_screenshot_folder(platform_path):
- """
- Deletes screenshot folder from platform path
- :param platform_path: Platform Path
- :return: None
- """
- platform_path = r'{}\user\screenshots'.format(platform_path)
- shutil.rmtree(platform_path, ignore_errors=True)
-
-
-def move_file(src_dir, dest_dir, file_name, timeout=120):
- """
- Attempts to move a file from the source directory to the destination directory. Raises an IOError if
- the file is in use.
- :param src_dir: Directory of the file to be moved.
- :param dest_dir: Directory where the file will be moved to.
- :param file_name: Name of the file to be moved.
- :param timeout: Number of seconds to wait for the file to be released.
- """
- file_path = os.path.join(src_dir, file_name)
- if os.path.exists(file_path):
- wait_for(lambda: move_file_check(src_dir, dest_dir, file_name),
- timeout=timeout,
- exc=IOError('Cannot move file {} while in use'.format(file_path)))
-
-
-def move_file_check(src_dir, dest_dir, file_name):
- """
- Moves file and checks if the file has been moved from the source to the destination directory.
- """
- try:
- shutil.move(os.path.join(src_dir, file_name), os.path.join(dest_dir, file_name))
- except OSError as e:
- print e
- return False
-
- return True
-
-
-def revert_config_files(launcher):
- """
- Reverts modified config files from test. Runs the perforce revert command.
- :param launcher: The launcher instance to revert files from.
- """
- files_revert = [os.path.join(launcher.workspace.release.paths.dev(), 'bootstrap.cfg'),
- os.path.join(launcher.workspace.release.paths.dev(), 'AssetProcessorPlatformConfig.ini'),
- launcher.workspace.release.paths.platform_config_file()]
-
- for file_path in files_revert:
- subprocess.check_call(['p4', 'revert', file_path])
- subprocess.check_call(['p4', 'sync', '-f', file_path])
-
-
-def create_file(path, file_name):
- """
- Creates a file with specified file name
- :param path: The path of where the file needs to be created
- :param file_name: The file name
- :return:
- """
- file_path = os.path.join(path, file_name)
-
- if not os.path.exists(file_path):
- new_file = open(file_path, "w")
- new_file.close()
- else:
- print "{} already exists".format(file_name)
-
-def delete_level(launcher, level_dir, timeout=120):
- """
- Attempts to delete an entire level folder from the project.
- :param launcher: The launcher instance to delete the level from.
- :param level_dir: The level folder to delete
- """
-
- if (not level_dir):
- logger.warning("level_dir is empty, nothing to delete.")
- return
-
- full_level_dir = os.path.join(launcher.workspace.release.paths.project(), 'Levels', level_dir)
- if (not os.path.isdir(full_level_dir)):
- if (os.path.exists(full_level_dir)):
- logger.error("level '{}' isn't a directory, it won't be deleted.".format(full_level_dir))
- else:
- logger.info("level '{}' doesn't exist, nothing to delete.".format(full_level_dir))
- return
-
- wait_for(lambda: delete_check(full_level_dir),
- timeout=timeout,
- exc=IOError('Cannot delete directory {} while in use'.format(full_level_dir)))
-
-def delete_check(src_dir):
- """
- Deletes directory and verifies that it's been deleted.
- :param src_dir: The directory to delete
- """
- try:
- shutil.rmtree(src_dir)
- except OSError as e:
- logger.debug("Delete for '{}' failed: {}".format(src_dir, e))
- return False
-
- return (not os.path.exists(src_dir))
-
-def get_log_file_path(launcher, project_name):
- """
- Creates a log file path.
- :param launcher: The launcher instance to get a path from.
- :param project_name: The name of the project.
- """
- return os.path.join(launcher.workspace.release.paths.dev(), 'Cache', project_name, 'pc', 'user', 'log', 'Editor.log')
diff --git a/Tests/shared/hydra_test_utils.py b/Tests/shared/hydra_test_utils.py
deleted file mode 100755
index cce54a0f45..0000000000
--- a/Tests/shared/hydra_test_utils.py
+++ /dev/null
@@ -1,78 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import logging
-import os
-import tempfile
-import test_tools.shared.log_monitor
-import test_tools.launchers.phase
-
-logger = logging.getLogger(__name__)
-
-
-def prepare_cfg_file(editor_python_script_name, args=[]):
- """
- Create a temporary .cfg file containing the python script and args to pass to the Editor.
- Ex: If you pass in 'create_level.py', ['LevelName'], you'll get a cfg file with this:
- pyRunFile create_level.py LevelName
- :param editor_python_script_name: Name of script that will execute in the Editor.
- :param args: Additional arguments for CFG, such as LevelName.
- :return Config file for Hydra execution
- """
- cfg_contents = '-- Auto-generated cfg file\n'
- cfg_contents += 'pyRunFile ' + editor_python_script_name
- for arg in args:
- cfg_contents += ' ' + arg
- cfg_contents += '\n'
-
- logger.debug("Preparing a cfg file with the following contents:\n{}".format(cfg_contents))
- f = tempfile.NamedTemporaryFile(mode='w+', suffix='.cfg', delete=False)
- cfg_filename = f.name
- f.write(cfg_contents)
- f.close()
- logger.debug("Cfg file name: {}".format(cfg_filename))
- return cfg_filename
-
-
-def cleanup_cfg_file(cfg_filename):
- """
- Removes the temporary cfg file created in prepare_cfg_file.
- :param cfg_filename: Config file for Hydra execution to delete
- """
- logger.debug('Cleaning up the generated cfg file')
- if os.path.exists(cfg_filename):
- os.remove(cfg_filename)
-
-
-def launch_and_validate_results(test_directory, editor, editor_script, editor_timeout, expected_lines, cfg_args=[]):
- """
- Creates a temporary config file for Hydra execution, runs the Editor with the specified script, and monitors for
- expected log lines.
- :param test_directory: Path to test directory that editor_script lives in.
- :param editor: Configured editor object to run test against.
- :param editor_script: Name of script that will execute in the Editor.
- :param editor_timeout: Timeout for editor run.
- :param expected_lines: Expected lines to search log for.
- :param cfg_args: Additional arguments for CFG, such as LevelName.
- """
- cfg_file_name = prepare_cfg_file(os.path.join(test_directory, editor_script), cfg_args)
-
- logger.debug("Running automated test: {}".format(editor_script))
-
- editor.deploy()
- editor.launch(["--skipWelcomeScreenDialog", "--autotest_mode", "--exec", cfg_file_name])
-
- editorlog_file = os.path.join(editor.workspace.release.paths.project_log(), 'Editor.log')
-
- test_tools.shared.log_monitor.monitor_for_expected_lines(editor, editorlog_file, expected_lines)
-
- # Rely on the test script to quit after running
- editor.run(test_tools.launchers.phase.WaitForLauncherToQuit(editor, editor_timeout))
diff --git a/Tests/shared/jenkins-3rdparty-symlink/symlink_utils.py b/Tests/shared/jenkins-3rdparty-symlink/symlink_utils.py
deleted file mode 100755
index c8fa8b7023..0000000000
--- a/Tests/shared/jenkins-3rdparty-symlink/symlink_utils.py
+++ /dev/null
@@ -1,71 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import argparse
-import logging
-import os
-import subprocess
-
-logger = logging.getLogger(__name__)
-
-
-def create_symlink(path, name, reference):
- """
- Checks if the defined symlink exists and returns True if it does. If it does not, it will create a
- new symlink and return True. Unsuccessful commands will return False.
- :param path: Path to where symlink should be created.
- :param name: Name of the symlink.
- :param reference: Source path of directory.
- """
- sym_path = os.path.join(path, name)
-
- if not os.path.exists(sym_path):
- if os.path.isfile(reference):
- proc = subprocess.Popen('cmd /c mklink "{}" "{}"'.format(name, reference), cwd=path,
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- elif os.path.isdir(reference):
- proc = subprocess.Popen('cmd /c mklink /J "{}" "{}"'.format(name, reference), cwd=path,
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-
- exit_code = proc.wait()
-
- if exit_code == 0:
- logger.info("Successfully created symlink from {} to {}".format(reference, sym_path))
- return True
- elif "You do not have sufficient privilege to perform this operation" in proc.stderr.read():
- raise AssertionError("Permissions denied. You should be running this script with Admin rights.")
-
- else:
- raise AssertionError("The command could not run successfully.")
-
- else:
- logger.info("Directory or file already exists: {}".format(os.path.join(path, name)))
- return False
-
-
-if __name__ == "__main__":
- parser = argparse.ArgumentParser(description='Creates 3rdParty symlink.')
- parser.add_argument('-symlink_path', metavar='symlink_path', type=str, required=True,
- help='The path to create the 3rdParty symlink. If folder exists, symlinks will be'
- 'created inside the 3rdParty folder.')
- parser.add_argument('-name', metavar='symlink_name', type=str, default='3rdParty',
- help='Name of symlink created. Defaults to 3rdParty.')
- parser.add_argument('-source_path', metavar='source_path', type=str, required=True,
- help='The path where the source 3rdParty is located.')
- args = parser.parse_args()
-
- sym_path = os.path.join(args.symlink_path, args.name)
-
- # If there is an existing directory, copy all source contents as symlinks.
- if not create_symlink(args.symlink_path, args.name, args.source_path):
- for file_dir in os.listdir(args.source_path):
- create_symlink(sym_path, file_dir, os.path.join(args.source_path, file_dir))
diff --git a/Tests/shared/logging_utils.py b/Tests/shared/logging_utils.py
deleted file mode 100755
index 0d822c077d..0000000000
--- a/Tests/shared/logging_utils.py
+++ /dev/null
@@ -1,36 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-def extract_log_lines(start_line_marker, end_line_marker, log_file, platform, level):
- """
- Parses log for a start and end marker, and extracts all lines between the markers.
- :param start_line_marker: String that marks beginning of loglines to extract.
- :param end_line_marker: String that marks end of loglines to extract.
- :param log_file: Path to log to parse.
- :param platform: Platform under test passed from test parameterization.
- :param level: Level under test passed from test parameterization.
- """
- extracted_log = '{}_{}_log.txt'.format(platform, level)
-
- with open(log_file) as log:
- match = False
- new_log = None
-
- for line in log:
- if start_line_marker in line:
- match = True
- new_log = open(extracted_log, 'w')
- elif end_line_marker in line:
- break
- elif match:
- new_log.write(line)
- if new_log:
- new_log.close()
diff --git a/Tests/shared/network_utils.py b/Tests/shared/network_utils.py
deleted file mode 100755
index b51e12e2c5..0000000000
--- a/Tests/shared/network_utils.py
+++ /dev/null
@@ -1,65 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import logging
-import psutil
-import socket
-
-
-logger = logging.getLogger(__name__)
-
-
-def check_for_listening_port(port):
- """
- Checks to see if the connection to the designated port was established.
- :param port: Port to listen to.
- :return: True if port is listening.
- """
- port_listening = False
- for conn in psutil.net_connections():
- if 'port={}'.format(port) in str(conn):
- port_listening = True
- return port_listening
-
-
-def check_for_remote_listening_port(port, ip_addr='127.0.0.1'):
- """
- Tries to connect to a port to see if port is listening.
- :param port: Port being tested.
- :param ip_addr: IP address of the host being connected to.
- :return: True if connection to the port is established.
- """
- port_listening = True
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- try:
- sock.connect((ip_addr, port))
- except socket.error as err:
- if err.errno == 10061:
- port_listening = False
- finally:
- sock.close()
- return port_listening
-
-
-def get_local_ip_address():
- """
- Finds the IP address for the primary ethernet adapter by opening a connection and grabbing its IP address.
- :return: The IP address for the adapter used to make the connection.
- """
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- try:
- # Connecting to Google's public DNS so there is an open connection
- # and then getting the address used for that connection
- sock.connect(('8.8.8.8', 80))
- host_ip = sock.getsockname()[0]
- finally:
- sock.close()
- return host_ip
diff --git a/Tests/shared/pipeline_utils.py b/Tests/shared/pipeline_utils.py
deleted file mode 100755
index a909c7a685..0000000000
--- a/Tests/shared/pipeline_utils.py
+++ /dev/null
@@ -1,170 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Small library of functions to support autotests for asset processor
-
-"""
-
-import os
-import shutil
-import re
-import ly_test_tools.environment.file_system as fs
-import hashlib
-import shutil
-import logging
-
-logger = logging.getLogger(__name__)
-
-def compare_assets_with_cache(assets, assets_cache_path):
- """
- Given a list of assets names, will try to find them (disrespecting file extensions) from project's Cache folder with test assets
- :param assets: A list of assets to be compared with Cache
- :param assets_cache_path: A path to cache test assets folder
- :return: A tuple with two lists - first is missing in cache assets, second is existing in cache assets
- """
- missing_assets = []
- existing_assets = []
- if os.path.exists(assets_cache_path):
- files_in_cache = list(map(fs.remove_path_and_extension, os.listdir(assets_cache_path)))
- for asset in assets:
- file_without_ext = fs.remove_path_and_extension(asset).lower()
- if file_without_ext in files_in_cache:
- existing_assets.append(file_without_ext)
- files_in_cache.remove(file_without_ext)
- else:
- missing_assets.append(file_without_ext)
- else:
- missing_assets = assets
- return missing_assets, existing_assets
-
-
-def copy_assets_to_project(assets, source_directory, target_asset_dir):
- """
- Given a list of asset names and a directory, copy those assets into the target project directory
- :param assets: A list of asset names to be copied
- :param source_directory: A path string where assets are located
- :param target_asset_dir: A path to project tests assets directory where assets will be copied over to
- :return: None
- """
- for asset in assets:
- full_name = os.path.join(source_directory, asset)
- shutil.copy(full_name, target_asset_dir)
-
-
-def prepare_test_assets(assets_path, function_name, project_test_assets_dir):
- """
- Given function name and assets cache path, will clear cache and copy test assets assigned to function name to project's folder
- :param assets_path: Path to tests assets folder
- :param function_name: Name of a function that corresponds to folder with assets
- :param project_test_assets_dir: A path to project directory with test assets
- :return: Returning path to copied assets folder
- """
- test_assets_folder = os.path.join(assets_path, 'assets', function_name)
- copy_assets_to_project(os.listdir(test_assets_folder), test_assets_folder, project_test_assets_dir)
- return test_assets_folder
-
-
-def find_joblog_file(joblogs_path, regexp):
- """
- Given path to joblogs files and asset name in form of regexp, will try to find joblog file for provided asset; if multiple - will return first occurrence
- :param joblogs_path: Path to a folder with joblogs files to look for needed file
- :param regexp: Python Regexp containing name of the asset that was processed, for which we're looking joblog file for
- :return: Full path to joblog file, empty string if not found
- """
- for file_name in os.listdir(joblogs_path):
- if re.match(regexp, file_name):
- return os.path.join(joblogs_path, file_name)
- return ''
-
-
-def find_missing_lines_in_joblog(joblog_location, strings_to_verify):
- """
- Given joblog file full path and list of strings to verify, will find all missing strings in the file
- :param joblog_location: Full path to joblog file
- :param strings_to_verify: List of string to look for in joblog file
- :return: Subset of original strings list, that were not found in the file
- """
- lines_not_found = []
- with open(joblog_location, 'r') as f:
- read_data = f.read()
- for line in strings_to_verify:
- if line not in read_data:
- lines_not_found.append(line)
- return lines_not_found
-
-
-def clear_project_test_assets_dir(test_assets_dir):
- """
- On call - deletes test assets dir if it exists and creates new empty one
- :param test_assets_dir: A path to tests assets dir
- :return: None
- """
- if os.path.exists(test_assets_dir):
- fs.delete([test_assets_dir], True, True)
- os.mkdir(test_assets_dir)
-
-
-def get_files_hashsum(path_to_files_dir):
- """
- On call - calculates md5 hashsums for filecontents.
- :param path_to_files_dir: A path to files directory
- :return: Returns a dict with initial filenames from path_to_files_dir as keys and their contents hashsums as values
- """
- checksum_dict = {}
- try:
- for fname in os.listdir(path_to_files_dir):
- with open(os.path.join(path_to_files_dir, fname), 'rb') as fopen:
- checksum_dict[fname] = hashlib.sha256(fopen.read()).digest()
- except IOError:
- logger.error('An error occured trying to read file')
- return checksum_dict
-
-
-def append_to_filename(file_name, path_to_file, append_text, ignore_extension):
- """
- Function for appending text to file and folder names
- :param file_name: Name of a file or folder
- :param path_to_file: Path to file or folder
- :param append_text: Text to append
- :param ignore_extension: True or False for ignoring extensions
- :return: None
- """
- new_name = ''
- if not ignore_extension:
- (name, extension) = file_name.split('.')
- new_name = name + append_text + '.' + extension
- else:
- new_name = file_name + append_text
- os.rename(os.path.join(path_to_file, file_name), os.path.join(path_to_file, new_name))
-
-
-def create_asset_processor_backup_directories(backup_root_directory, test_backup_directory):
- """
- Function for creating the asset processor logs backup directory structure
- :param backup_root_directory: The location where logs should be stored
- :param test_backup_directory: The directory for the specific test being ran
- :return: None
- """
- if not os.path.exists(os.path.join(backup_root_directory, test_backup_directory)):
- os.makedirs(os.path.join(backup_root_directory, test_backup_directory))
-
-
-def backup_asset_processor_logs(bin_directory, backup_directory):
- """
- Function for backing up the logs created by asset processor to designated backup directory
- :param bin_directory: The bin directory created by the lumberyard build process
- :param backup_directory: The location where asset processor logs should be backed up to
- :return: None
- """
- ap_logs = os.path.join(bin_directory, 'logs')
-
- if os.path.exists(ap_logs):
- destination = os.path.join(backup_directory, 'logs')
- shutil.copytree(ap_logs, destination)
diff --git a/Tests/shared/process_utils.py b/Tests/shared/process_utils.py
deleted file mode 100755
index 33ab175600..0000000000
--- a/Tests/shared/process_utils.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-from contextlib import contextmanager
-import psutil
-import subprocess
-
-
-@contextmanager
-def managed_popen(args_list, cwd=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT):
- """
- Context manager for subprocess.Popen objects which allows Popen to be used in a with/as statement.
- This should not be used with processes that are to continue running outside of the with block.
- :param args_list: Sequence of arguments as they would be passed to a terminal.
- :param cwd: The current working directory to use when issuing the command.
- :param stdout: File handle or pipe to use for stdout.
- :param stderr: File handle or pipe to use for stderr.
- """
- process = subprocess.Popen(args_list, cwd=cwd, stdout=stdout, stderr=stderr)
- try:
- yield process
- finally:
- if not process.poll():
- process.terminate()
-
-
-def get_psutil_process(process_name):
- """
- Gets a reference to a psutil.Process object with the given process name.
- :return: A reference to the first process encountered with the given name or None if no process is found.
- """
- for process in psutil.process_iter():
- if process_name == process.name():
- return process
- return None
diff --git a/Tests/shared/s3_utils.py b/Tests/shared/s3_utils.py
deleted file mode 100755
index 403cf75642..0000000000
--- a/Tests/shared/s3_utils.py
+++ /dev/null
@@ -1,145 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import boto3
-import botocore.exceptions
-import logging
-import os
-
-import test_tools.shared.file_system as file_system
-
-logger = logging.getLogger(__name__)
-s3 = boto3.resource('s3')
-
-
-class BucketNotExists(Exception):
- pass
-
-
-class KeyExistsError(Exception):
- pass
-
-
-class KeyDoesNotExistError(Exception):
- pass
-
-
-def create_folder_in_bucket(bucket_name, folder_key):
- """
- Given bucket name and folder key will create specified folder if it doesn't exist
- :param bucket_name: name of the bucket where folder will be created
- :param folder_key: key in s3 where folder will be created (i.e. specifying full path to folder in s3)
- :return: True if folder was successfully created, False otherwise, will raise BucketNotExists exception if
- bucket doesn't exist
- """
- if not bucket_exists_in_s3(bucket_name):
- raise BucketNotExists("Bucket {} does not exist.".format(bucket_name))
-
- if key_exists_in_bucket(bucket_name, '{}/'.format(folder_key)):
- logger.error("Key {} already exists in bucket {}".format(folder_key, bucket_name))
- return False
-
- s3_bucket = s3.Bucket(bucket_name)
- logger.info("Creating {} folder in a {} bucket".format(folder_key, bucket_name))
- s3_bucket.put_object(Bucket=bucket_name, Key=(folder_key+'/'))
- return True
-
-
-def upload_to_bucket(bucket_name, file_path, file_key=None, overwrite=False):
- """
- Uploads a given file to the given S3 bucket.
- :param bucket_name: Name of the S3 bucket where the file should be uploaded.
- :param file_path: Full Path to the target file on hard drive.
- :param file_key: Needed path to file on s3 (including file name).
- :param overwrite: Overwrite the key if it exists.
- """
- if not bucket_exists_in_s3(bucket_name):
- s3.create_bucket(Bucket=bucket_name)
-
- s3_bucket = s3.Bucket(bucket_name)
-
- if file_key is None:
- file_key = os.path.basename(file_path)
-
- if not overwrite and key_exists_in_bucket(bucket_name, file_key):
- raise KeyExistsError("Key '{}' already exists in S3 bucket {}".format(file_key, bucket_name))
-
- s3_bucket.upload_file(file_path, file_key)
- logger.info("Uploading {} to S3 bucket {}".format(file_key, bucket_name))
-
-
-def download_from_bucket(bucket_name, file_key, destination_dir, file_name=None):
- """
- Download the given key from the given S3 bucket to the given destination. Logs an error if there is not enough \
- space available for the download.
- :param bucket_name: Name of the S3 bucket containing the desired file.
- :param file_key: Name of the file stored in S3.
- :param destination_dir: Directory where the file should be downloaded to.
- :param file_name: The name of the file you want to save it as. Defaults to the file_key.
- """
- bucket_exists_in_s3(bucket_name)
-
- if not key_exists_in_bucket(bucket_name, file_key):
- raise KeyDoesNotExistError("Key '{}' does not exist in S3 bucket {}".format(file_key, bucket_name))
-
- obj_summary = s3.ObjectSummary(bucket_name, file_key)
- required_space = obj_summary.size
- disk_name = os.path.splitdrive(destination_dir)[0]
-
- file_system.check_free_space(disk_name, required_space, "Insufficient space available for download:")
-
- if not os.path.exists(destination_dir):
- os.makedirs(destination_dir)
-
- if file_name is None:
- file_name = file_key
- destination_path = os.path.join(destination_dir, file_name)
- s3.Object(bucket_name, file_key).download_file(destination_path)
- logger.info("Downloading {} to {}".format(file_key, destination_path))
-
-
-def bucket_exists_in_s3(bucket_name):
- """
- Verifies that the S3 bucket exists.
- :param bucket_name: Name of the S3 bucket that may or may not exist.
- :return: True if the bucket exists. False otherwise.
- """
- bucket_exists = True
-
- try:
- s3.meta.client.head_bucket(Bucket=bucket_name)
- except botocore.exceptions.ClientError as err:
- if err.response['Error']['Code'] == '404':
- bucket_exists = False
-
- return bucket_exists
-
-
-def key_exists_in_bucket(bucket_name, file_key):
- """
- Verifies that the given key does not already exist in the given S3 bucket.
- :param bucket_name: Name of the S3 bucket that may or may not contain the file key.
- :param file_key: Name of the file key in question.
- :return: True if the key exists. False otherwise.
- """
- key_exists = True
- obj_summary = s3.ObjectSummary(bucket_name, file_key)
-
- # Attempting to access any member of ObjectSummary for a nonexistent key will throw an exception
- # There is no built-in way to check key existence otherwise
- try:
- obj_summary.size
- except botocore.exceptions.ClientError as err:
- if err.response['Error']['Code'] == '404':
- key_exists = False
-
- return key_exists
-
diff --git a/Tests/shared/screenshot_utils.py b/Tests/shared/screenshot_utils.py
deleted file mode 100755
index 0c64bb848a..0000000000
--- a/Tests/shared/screenshot_utils.py
+++ /dev/null
@@ -1,203 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import os
-import botocore.exceptions
-import string
-import boto3
-
-from test_tools.shared.file_utils import move_file
-
-import test_tools.launchers.phase as phase
-import shared.s3_utils as s3_utils
-from test_tools.shared.remote_console_commands import get_screenshot_command
-from test_tools.shared.waiter import wait_for
-from test_tools import HOST_PLATFORM
-from test_tools.shared.images.qssim import qssim as compare_screenshots
-from test_tools.shared.launcher_testlib import retry_console_command
-
-
-def take_screenshot(remote_console_instance, launcher, screenshot_name):
- """
- Takes an in game screenshot using the remote console instance passed in, validates that the screenshot exists
- and then renames that screenshot to something defined by the user of this function.
- :param remote_console_instance: Remote console instance that is attached to a specific launcher instance
- :param launcher: Launcher instance so we can use the file exists functionality provided by test_tools
- :param screenshot_name: Name of the screenshot
- :return: None
- """
- get_screenshot_command(remote_console_instance)
- screenshot_path = os.path.join(launcher.workspace.release.paths.platform_cache(), 'user', 'screenshots')
- launcher.run(phase.FileExistsPhase(os.path.join(screenshot_path, 'screenshot0000.jpg')))
- wait_for(lambda: rename_screenshot(screenshot_path, screenshot_name),
- timeout=120,
- exc=AssertionError('Screenshot at path:{} and with name:{} is still in use.'.format(screenshot_path, screenshot_name)))
-
-
-def rename_screenshot(screenshot_path, screenshot_name):
- """
- Tries to rename the screenshot when the file is done being written to
- :param screenshot_path: Path to the Screenshot folder
- :param screenshot_name: Name we wish to change the screenshot to
- :return: True when operation is completed, False if the file is still in use
- """
- try:
- print 'Trying to rename {} to {}.'.format(os.path.join(screenshot_path, 'screenshot0000.jpg'), os.path.join(screenshot_path, '{}.jpg'.format(screenshot_name)))
- os.rename(os.path.join(screenshot_path, 'screenshot0000.jpg'),
- os.path.join(screenshot_path, '{}.jpg'.format(screenshot_name)))
- return True
- except OSError as e:
- print ('Found error {0} when trying to rename screenshot. {1}'.format(str(e), str(e.message)))
- return False
-
-
-def move_screenshots(screenshot_path, file_type, logs_path):
- """
- Moves screenshots of a specific file type to the flume location so we can gather all of the screenshots we took.
- :param screenshot_path: Path to the screenshot folder
- :param file_type: Types of Files to look for. IE .jpg, .tif, etc
- :param logs_path: Path where flume gathers logs to be upload
- """
- for file_name in os.listdir(screenshot_path):
- if file_name.endswith(file_type):
- move_file(screenshot_path, logs_path, file_name)
-
-
-def screenshot_command(remote_console_instance, command_to_run, expected_log_line):
- """
- This is just a helper function to help send and validate against screenshot console commands.
- :param remote_console_instance: Remote console instance
- :param command_to_run: The Screenshot command that you wish to run
- :param expected_log_line: The console log line to expect in order to set the event to true
- :return:
- """
- return retry_console_command(remote_console_instance, command_to_run, expected_log_line)
-
-
-def get_screenshot_command_with_retries(remote_console_instance):
- """
- Used for an in-game screenshot
- :param remote_console_instance: Remote console instance
- :return: None
- """
- if (HOST_PLATFORM == 'win_x64'):
- command = 'Screenshot: @user@\screenshots/'
- else:
- command = 'Screenshot: @user@/screenshots/'
-
- wait_for(lambda: screenshot_command(remote_console_instance, 'r_GetScreenShot 1', command), timeout=240,
- exc=AssertionError('Screenshot command failed'))
-
-
-def take_screenshot_with_retries(remote_console_instance, launcher, screenshot_name):
- """
- Takes an in game screenshot using the remote console instance passed in, validates that the screenshot exists
- and then renames that screenshot to something defined by the user of this function.
- :param remote_console_instance: Remote console instance that is attached to a specific launcher instance
- :param launcher: Launcher instance so we can use the file exists functionality provided by test_tools
- :param screenshot_name: Name of the screenshot
- :return: None
- """
- get_screenshot_command_with_retries(remote_console_instance)
- screenshot_path = os.path.join(launcher.workspace.release.paths.platform_cache(), 'user', 'screenshots')
- launcher.run(phase.FileExistsPhase(os.path.join(screenshot_path, 'screenshot0000.jpg')))
- wait_for(lambda: rename_screenshot(screenshot_path, screenshot_name),
- timeout=120,
- exc=AssertionError('Screenshot taken is still in use'))
-
-
-def compare_golden_image(similarity_threshold, screenshot, screenshot_path, golden_image_name,
- golden_image_path=None):
- """
- This function assumes that your golden image filename contains the same base screenshot name and the word "golden"
- ex. pc_gamelobby_golden
-
- :param similarity_threshold: A float from 0.0 - 1.0 that determines how similar images must be or an asserts
- :param screenshot: A string that is the full name of the screenshot (ex. 'gamelobby_host.jpg')
- :param screenshot_path: A string that contains the path to the screenshots
- :param golden_image_path: A string that contains the path to the golden images, defaults to the screenshot_path
- :return:
- """
- if golden_image_path is None:
- golden_image_path = screenshot_path
-
- mean_similarity = compare_screenshots('{}\{}'.format(screenshot_path, screenshot),
- '{}\{}'.format(golden_image_path, golden_image_name))
- assert mean_similarity > similarity_threshold, \
- '{} screenshot comparison failed! Mean similarity value is: {}'\
- .format(screenshot, mean_similarity)
-
-
-def take_screenshot_and_compare(remote_console, launcher, screenshot, similarity_threshold,
- golden_image_name, screenshot_path=None, file_type='.jpg'):
- """
- Takes a screenshot and compares it with its golden image. This utilizes the take_screenshot_with_retries function
- which is only used for PC. There are some assumptions with the golden image naming convention that is explained in
- the compare_golden_image function. This also assumes it is a jpg file.
-
- This function enforces a naming convention such that the golden image and screenshot share part of the same name.
- Also, the screenshot will be appended with the screenshot_key as shown below.
-
- The screenshot name will be screenshot_base + screenshot_key + filetype
- (ex. 'gamelobby_host.jpg', 'MultiplayerSampleClient_1.png')
-
- :param screenshot_base: A string that is the base name of the screenshot (ex. 'gamelobby')
- :param screenshot_key: A string that acts as a key identifier for the screenshot.
- :param similarity_threshold: A float from 0.0 - 1.0 that determines how similar images must be or it asserts
- :param screenshot_path: A string for the screenshot path. Defaults to user/screenshots
- :param file_type: A string for the screenshot filetype. Defaults to '.jpg'
- :return:
- """
- if screenshot_path is None:
- screenshot_path = r'{}\user\screenshots'.format(launcher.workspace.release.paths.platform_cache())
-
- take_screenshot_with_retries(remote_console, launcher, screenshot)
- compare_golden_image(similarity_threshold, '{}{}'.format(screenshot, file_type),
- screenshot_path, golden_image_name)
-
-
-def download_qa_golden_images(project_name, destination_dir, platform):
- """
- Downloads the golden images for a specified project from s3. The project_name, platform, and filetype are used to
- filter which images will be downloaded as the golden images.
-
- https://s3.console.aws.amazon.com/s3/buckets/ly-qae-jenkins-configs/golden-images/?region=us-west-1&tab=overview
-
- :param project_name: a string of the project name of the folder in s3. ex: 'MultiplayerSample'
- :param destination_dir: a string of where the images will be downloaded to
- :param platform: a string for the platform type ('pc', 'android', 'ios', 'darwin')
- :param filetype: a string for the file type. ex: '.jpg', '.png'
- :return:
- """
- bucket_name = 'ly-qae-jenkins-configs'
- path = 'golden-images/{}/{}/'.format(project_name, platform)
-
- if not s3_utils.key_exists_in_bucket(bucket_name, path):
- raise s3_utils.KeyDoesNotExistError("Key '{}' does not exist in S3 bucket {}".format(path, bucket_name))
- for image in s3_utils.s3.Bucket(bucket_name).objects.filter(Prefix=path):
- file_name = string.replace(image.key, path, '')
- if file_name != '':
- s3_utils.download_from_bucket(bucket_name, image.key, destination_dir, file_name)
-
-
-def prepare_for_screenshot_compare(remote_console_instance):
- """
- Prepares launcher for screenshot comparison. Removes any debug text and antialiasing that may result in interference
- with the comparison.
-
- :param remote_console_instance: Remote console instance that is attached to a specific launcher instance
- :return:
- """
- wait_for(lambda: retry_console_command(remote_console_instance, 'r_displayinfo 0',
- '$3r_DisplayInfo = $60 $5[DUMPTODISK, RESTRICTEDMODE]$4'), timeout=120)
- wait_for(lambda: retry_console_command(remote_console_instance, 'r_antialiasingmode 0',
- '$3r_AntialiasingMode = $60 $5[]$4'), timeout=120)
-
diff --git a/Tests/shared/shader_compile_server_utils.py b/Tests/shared/shader_compile_server_utils.py
deleted file mode 100755
index 4c93970561..0000000000
--- a/Tests/shared/shader_compile_server_utils.py
+++ /dev/null
@@ -1,120 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import logging
-import os
-import psutil
-import subprocess
-
-import test_tools.shared.file_system as file_system
-from test_tools.shared.process_utils import kill_processes_named
-from test_tools import HOST_PLATFORM
-
-logger = logging.getLogger(__name__)
-
-
-def start_shader_compile_server(tools_dir, build_config, win_x64_compiler, clean=True):
- """
- Starts the shader compile server for the given compiler version. Failure is currently not checked due to issues
- with detecting if the process is alive immediately after requesting it to be spun up.
- :param tools_dir: Tools directory inside of the dev root.
- :param build_config: Build configuration name (profile, debug, etc.).
- :param win_x64_compiler: Windows compiler version used to build the project.
- :param clean: Removes Cache, Error, Shaders, and Temp directories if set to True.
- """
- shader_compile_server_dir = os.path.join(tools_dir, 'CrySCompileServer', 'x64', build_config)
- os.chdir(shader_compile_server_dir)
-
- shader_compile_server_exe = build_shader_compile_server_file_name(win_x64_compiler)
-
- # Only one shader compile server can run at a time, so kill the currently running process if any
- kill_processes_named(shader_compile_server_exe)
-
- if clean:
- clean_shader_compile_server_files(tools_dir, build_config)
-
- logger.info("Attempting to start shader compile server")
- # Running with basic user permissions since the shader compile server warns against running as admin
- subprocess.Popen(['RunAs', '/trustlevel:0x20000', shader_compile_server_exe])
-
-
-def start_mac_shader_compile_server(tools_dir, build_config, clean=True):
- """
- Mac version of starting shader compiler given build configuration. Failure is currently not checked due to issues
- with detecting if the process is alive immediately after requesting it to be spun up.
- :param tools_dir: Tools directory inside of the dev root.
- :param build_config: Build configuration name (profile, debug, etc.).
- :param clean: Removes Cache, Error, Shaders, and Temp directories if set to True.
- :return: Returns the actual process.
- """
- shader_compile_server_dir = os.path.join(tools_dir, 'CrySCompileServer', 'osx', build_config)
- os.chdir(shader_compile_server_dir)
-
- kill_processes_named('CrySCompileServer')
-
- if clean:
- clean_shader_compile_server_files(tools_dir, build_config)
-
- logger.info("Attempting to start shader compile server")
- subprocess.Popen('./CrySCompileServer', shell=True)
-
-
-def build_shader_compile_server_file_name(win_x64_compiler):
- """
- Puts together the shader compile server file name based on the specified VC compiler version.
- :param win_x64_compiler: The VC compiler version specified in vsyyyy format, where yyyy is a year (ex: vs2017)
- :return: The shader compile server file name complete with extension.
- """
- shader_compile_server_exe = 'CrySCompileServer'
-
- return '{}.exe'.format(shader_compile_server_exe)
-
-
-def clean_shader_compile_server_files(tools_dir, build_config):
- """
- Removes the shader compile server generated Cache, Error, Shaders, and Temp directories.
- :param tools_dir: Tools directory inside of the dev root.
- :param build_config: Build configuration name (profile, debug, etc.).
- """
- if HOST_PLATFORM == 'win_x64':
- shader_compile_server_dir = os.path.join(tools_dir, 'CrySCompileServer', 'x64', build_config)
- else:
- shader_compile_server_dir = os.path.join(tools_dir, 'CrySCompileServer', 'osx', build_config)
- os.chdir(shader_compile_server_dir)
-
- shader_compile_server_dirs = [os.path.join(shader_compile_server_dir, 'Cache'),
- os.path.join(shader_compile_server_dir, 'Error'),
- os.path.join(shader_compile_server_dir, 'Shaders'),
- os.path.join(shader_compile_server_dir, 'Temp')]
- if not file_system.delete(shader_compile_server_dirs, True, True):
- directories_still_present = []
- for directory in shader_compile_server_dirs:
- if os.path.exists(directory):
- directories_still_present.append(directory)
- raise RuntimeError("Failed to clean folders {} from directory {}".format(directories_still_present,
- shader_compile_server_dir))
-
-
-def stop_shader_compile_server():
- """
- Finds any process with CrySCompileServer in its name and kills it.
- """
- # This is necessary because the shader compile server is spawned from another process which
- # immediately terminates after spawning its child
- for process in psutil.process_iter():
- try:
- if 'CrySCompileServer' in process.name():
- success_code = process.kill()
- if success_code == 0:
- logger.error("Failed to terminate CrySCompileServer process")
- except psutil.NoSuchProcess:
- # Process was already killed but caught as a zombie process, so pass as normal.
- pass
diff --git a/Tests/shared/substring.py b/Tests/shared/substring.py
deleted file mode 100755
index 45c5f6d3af..0000000000
--- a/Tests/shared/substring.py
+++ /dev/null
@@ -1,73 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-String and search related functions.
-"""
-import os
-import re
-
-
-def in_file(file_path, pattern_string):
- """
- This method checks if pattern_string exists in any line in the file specified in file_path.
- It cannot match multi-line patterns.
- :param file_path: files path for the file to search in
- :param pattern_string: string to search for.
- :return: True if the String is found, False otherwise.
- """
- if not os.path.exists(file_path):
- raise RuntimeError("File does not exist at {}".format(file_path))
- if not pattern_string:
- raise RuntimeError("Must provide string to search for")
-
- with open(file_path, "r") as game_log:
- for line in game_log.readlines():
- if pattern_string in line:
- return True
- return False
-
-
-def regex_in_file(file_path, pattern_string):
- """
- This method uses regex to check if pattern_string exists in the file specified in file_path.
- It can match multi-line patterns but is a lot heavier as it parses whole file as string.
- :param file_path: files path for the file to search in
- :param pattern_string: regex-pattern to search for.
- :return: True if the regex-pattern is found found in file, False otherwise.
- """
- if not os.path.exists(file_path):
- raise RuntimeError("File does not exist at {}".format(file_path))
- if not pattern_string:
- raise RuntimeError("Must provide string to search for")
-
- re.compile(pattern_string)
- with open(file_path, "r") as game_log:
- return re.search(pattern_string, game_log.read())
-
-
-def regex_in_lines_in_file(file_path, pattern_string):
- """
- This method uses regex to check if pattern_string exists in any line in the file specified in file_path.
- It cannot match multi-line patterns, but will often more performant than regex_in_file.
- :param file_path: files path for the file to search in
- :param pattern_string: regex-pattern to search for.
- :return: True if the regex-pattern is found found in file, False otherwise.
- """
- if not os.path.exists(file_path):
- raise RuntimeError("File does not exist at {}".format(file_path))
- if not pattern_string:
- raise RuntimeError("Must provide string to search for")
-
- re.compile(pattern_string)
- with open(file_path, "r") as game_log:
- for line in game_log.readlines():
- if re.search(pattern_string, line):
- return True
- return False
diff --git a/Tests/shared/windows_registry_utils.py b/Tests/shared/windows_registry_utils.py
deleted file mode 100755
index 9f10317ea9..0000000000
--- a/Tests/shared/windows_registry_utils.py
+++ /dev/null
@@ -1,96 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Small library of functions to support autotests for utilizing Windows Utilities
-
-"""
-
-import logging
-import winreg
-logger = logging.getLogger(__name__)
-
-
-def registry_key_exists(registry_hive, registry_key, registry_subkey):
- """
- Searches the Windows registry for the existance of a registry key
- :param registry_hive: The hive in which to find keys & subkeys. EG: HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER
- :param registry_key: The bin directory from which to launch the AssetProcessor executable.
- :param registry_subkey: The subkey that can contain a value assignment
- :return: A boolean value of the existance of the key
- """
-
- try:
- registryKey = winreg.OpenKey(registry_hive, registry_key)
- logger.debug("Registry Key: {0} found.".format(registry_key))
-
- winreg.QueryValueEx(registryKey, registry_subkey)
- logger.debug("Registry Subkey: {0} found.".format(registry_subkey))
-
- registryKey.Close()
-
- return True
- except WindowsError:
- # Do not raise an assert since tests could revolve around a non-existant key
- logger.debug("Registry SubKey: {0} was not found.".format(registry_key))
- return False
-
-
-def get_registry_key_value(registry_hive, registry_key, registry_subkey):
- """
- If a registry key exists, it will return the value else return None
- :param registry_hive: The hive in which to find keys & subkeys. EG: HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER
- :param registry_key: The bin directory from which to launch the AssetProcessor executable.
- :param registry_subkey: The subkey that can contain a value assignment
- :return: The value of the registry key value
- """
-
- if registry_key_exists(registry_hive, registry_key, registry_subkey):
-
- registryKey = winreg.OpenKey(registry_hive, registry_key)
- logger.debug("Registry Key: {0} found.".format(registry_key))
-
- subkeyValue = winreg.QueryValueEx(registryKey, registry_subkey)
- logger.debug("Registry Subkey: {0} value found is is set to {1}".format(registry_subkey, subkeyValue))
-
- registryKey.Close()
- logger.debug("Registry Key hander closed")
-
- return str(subkeyValue[0]) # Index 0 contains the value, Index 1 contains the registry value type
- else:
- assert None, "Could not retrieve Registry Key Value since Registry Key '{0}' was not found.".format(registry_key)
-
-
-def check_registry_key_value(registry_hive, registry_key, registry_subkey, expected='', case_sensitive=True):
- """
- If registry key exists, then case insensitively checks that the registry key value is as expected
- :param registry_hive: The hive in which to find keys & subkeys. EG: HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER
- :param registry_key: The bin directory from which to launch the AssetProcessor executable.
- :param registry_subkey: The subkey that can contain a value assignment
- :param expected: The expected value to be found in the registry
- :param case_sensitive: Whether or not to perform a case sensitive or insentive validation
- :return: A boolean value if the registry key value matches expected
- """
-
- if registry_key_exists(registry_hive, registry_key, registry_subkey):
-
- subkeyValue = get_registry_key_value(registry_hive, registry_key, registry_subkey)
-
- if case_sensitive:
- logger.debug("Case sensitive comparison of Subkey '{0}' to Expected Value '{1}'"
- .format(subkeyValue, expected))
- return subkeyValue == expected
- else:
- logger.debug("Case insensitive comparison of Subkey '{0}' to Expected Value '{1}'"
- .format(subkeyValue, expected))
- return subkeyValue.lower() == expected.lower()
- else:
- logger.debug("Could not compare Subkey Value to expected value, Subkey '{0}' was not found at Key {1}."
- .format(registry_subkey, registry_key))
- return False
diff --git a/Tests/shared/windows_utils.py b/Tests/shared/windows_utils.py
deleted file mode 100755
index a6bcff8d91..0000000000
--- a/Tests/shared/windows_utils.py
+++ /dev/null
@@ -1,130 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Small library of functions to support autotests for utilizing Windows Utilities
-
-"""
-
-import logging
-import psutil
-import os
-import subprocess
-import pyscreenshot as winScreenshot
-
-from _winreg import *
-
-logger = logging.getLogger(__name__)
-
-def kill_app_by_name(project):
- """
- Kills the app on windows for the specified app name
- :param name: name of app running on the devkit to kill
- """
- process_name = project + 'Launcher.exe'
- for proc in psutil.process_iter():
- # check whether the process to kill name matches
- if proc.name() == process_name:
- proc.kill()
-
-def take_screenshot(result_path, image_filename, project=None):
- """
- Takes a windows screenshot
- :param result_path: path for the output file
- :param image_filename: filename for the new image
- :param project: project name for the running process, if provided only the window for this process will be captured
- """
- if not os.path.exists(result_path):
- os.mkdir(result_path)
-
- filename = "{}.png".format(image_filename)
- filename = os.path.join(result_path, filename)
-
- image = winScreenshot.grab() # bbox=(10, 10, 510, 510)) # X1,Y1,X2,Y2
- image.save(filename)
-
- if not os.path.exists(filename):
- # Capture failed
- return False
-
- return True
-
-def launch(bin_path, project, parameters = None):
- command_line = [os.path.join(bin_path, project + 'Launcher.exe')]
- if parameters != None:
- command_line = command_line + parameters
- process = subprocess.Popen(command_line, stdout=subprocess.PIPE)
- process.poll()
-
-def check_registry_key_exits(registry_key):
- """
- Searches the Windows registry for the existance of a registry key
- :param registry_key: The bin directory from which to launch the AssetProcessor executable.
- :return: A boolean value of the existance of the key
- """
- try:
- registryHandle = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
- registryKey = OpenKey(registryHandle, registry_key)
-
- logger.info("Registry Key: {0} found.".format(registry_key))
- registryKey.Close()
- registryHandle.Close()
-
- return True
- except:
- logger.error("Registry Key: {0} was not found.".format(registry_key))
- return False
-
-def get_registry_key_value(registry_key):
- """
- If a registry key exists, it will return the value else return None
- :param registry_key: The bin directory from which to launch the AssetProcessor executable.
- :return: The value of the registry key value
- """
- if check_registry_key_exits(registry_key):
- logger.log("Retrieving the value of Registry Key '{0}'"
- .format(registry_key))
-
- registryHandle = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
- registryKey = OpenKey(registryHandle, registry_key)
-
- keyValue = registryKey.Value()
-
- registryKey.Close()
- registryHandle.Close()
-
- return keyValue
- else:
- logger.error("Could not retrieve Registry Key Value since Registry Key '{0}' was not found."
- .format(registry_key))
- return None
-
-
-def check_registry_key_value(registry_key, expected):
- """
- If registry key exists, then checks that the registry key value is as expected
- :param registry_key: The bin directory from which to launch the AssetProcessor executable.
- :return: A boolean value if the registry key value matches expected
- """
- if check_registry_key_exits(registry_key):
-
- keyValue = get_registry_key_value(registry_key)
-
- if str.lower(keyValue) == str.lower(expected):
- logger.info("The value of Registry Key '{0}' matched the expected '{1}'"
- .format(registry_key, expected))
- return True
- else:
- logger.error("The value of Registry Key '{0}' die not match the expected '{1}'"
- .format(registry_key, expected))
- return False
- else:
- logger.error("Could not compare Registry Key Value to expected Registry Key '{0}' was not found."
- .format(registry_key))
- return False
diff --git a/Tests/test_lib/launcher_testlib.py b/Tests/test_lib/launcher_testlib.py
deleted file mode 100755
index 00ff8bc598..0000000000
--- a/Tests/test_lib/launcher_testlib.py
+++ /dev/null
@@ -1,194 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-This launcher_testlib file is used for a collection of reusable functionality that QA will use in their scripts.
-"""
-
-import os
-
-import test_tools.shared.asset_processor_utils as asset_processor_utils
-import test_tools.shared.file_utils as file_utils
-import shared.shader_compile_server_utils as compile_server
-import test_tools.shared.file_system as file_system
-
-
-def setup_win_launcher_test(launcher):
- """
- Assert that the launcher was able to build and that assets were processed successfully.
-
- :param launcher: The test-tools Launcher to be built.
- """
- assert_build_success(launcher)
- assert_process_assets(launcher)
-
-
-def setup_mac_launcher_test(launcher, configuration):
- """
- Assert that the launcher was able to build and that assets were processed successfully. Also starts the Mac
- shader compile server.
-
- :param launcher: The test-tools Launcher to be built.
- :param configuration: The shader compile server configuration to be launched.
- """
- assert_build_success(launcher)
- assert_process_assets(launcher)
- start_mac_shader_compile_server(launcher, configuration, '127.0.0.1')
-
-
-def setup_android_launcher_test(launcher, configuration, win_x64_compiler_version):
- """
- Builds the Windows asset processor, asserts that the launcher was able to build and that assets were processed
- successfully, and starts the Windows shader compile server.
-
- :param launcher: The test-tools Launcher to be built.
- :param configuration: The shader compile server configuration to be launched.
- :param win_x64_compiler_version: The msvc compiler version used to build the shader compile server executable.
- """
- assert_asset_processor_build_success(launcher.workspace.release, win_x64_compiler_version)
- assert_build_success(launcher)
- assert_process_assets(launcher)
-
- start_shader_compile_server(launcher, configuration, '127.0.0.1', win_x64_compiler_version)
-
-
-def assert_asset_processor_build_success(release, win_x64_compiler_version):
- """
- Builds the win_x64 AssetProcessor and asserts on build failure.
-
- For use with platforms that require Windows tools but not the Windows launcher.
-
- :param release: The test-tools Release which holds path info for the test environment in use.
- :param win_x64_compiler_version: The msvc compiler version used to build the AssetProcessor.
- """
- asset_proc_build_success = asset_processor_utils.build_win_x64(release.paths.dev(), release.configuration,
- win_x64_compiler_version)
- assert asset_proc_build_success, "AssetProcessor did not build properly"
-
-
-def assert_process_assets(launcher):
- """
- Runs the Asset Processor Batch and asserts if any assets fail to process.
-
- :param launcher: The test-tools Launcher to be built.
- """
- process_assets_success = launcher.workspace.release.process_assets()
- assert process_assets_success, 'Assets did not process correctly'
-
-
-def assert_build_success(launcher):
- """
- Runs the build command for specified launcher configuration and asserts if the build fails.
-
- :param launcher: The test-tools Launcher to be built.
- """
- build_success = launcher.workspace.release.build()
- assert build_success, "{} - Build Failed! - {} {} {}".format(launcher.workspace.release.project,
- launcher.workspace.release.platform,
- launcher.workspace.release.configuration,
- launcher.workspace.release.spec)
-
-def start_shader_compile_server(launcher, configuration, ip_addr, win_x64_compiler_version):
- """
- Deals with the extra setup to start the Windows shader compiler.
-
- :param launcher: The test-tools Launcher to be built.
- :param configuration: The shader compile server configuration to be launched.
- :param ip_addr: The IP address of the remote shader compile server and AssetProcessor.
- :param win_x64_compiler_version: The msvc compiler version used to build the shader compile server executable.
- """
- launcher.workspace.release.modify_bootstrap_setting('remote_ip', ip_addr)
- launcher.workspace.release.modify_platform_setting('r_ShaderCompilerServer', ip_addr)
- launcher.workspace.release.modify_platform_setting('log_RemoteConsoleAllowedAddresses', ip_addr)
- compile_server.start_shader_compile_server(launcher.workspace.release.paths.tools(), configuration,
- win_x64_compiler_version)
-
-
-def start_mac_shader_compile_server(launcher, configuration, ip_addr='127.0.0.1'):
- """
- Deals with the extra setup to start the Mac shader compiler.
-
- :param launcher: The test-tools Launcher to be built.
- :param configuration: The shader compile server configuration to be launched.
- :param ip_addr: The IP address of the remote shader compile server and AssetProcessor.
- """
- launcher.workspace.release.modify_bootstrap_setting('remote_ip', ip_addr)
- launcher.workspace.release.modify_platform_setting('r_ShaderCompilerServer', ip_addr)
- launcher.workspace.release.modify_platform_setting('log_RemoteConsoleAllowedAddresses', ip_addr)
- compile_server.start_mac_shader_compile_server(launcher.workspace.release.paths.tools(), configuration)
-
-
-def set_launcher_startup_config_file(launcher, project_name, config_name, commands):
- """
- Clears out the specified config_name file and adds the commands specified to the cfg file.
-
- :param launcher: The test-tools Launcher to be built.
- :param project_name: Name of the game project in test.
- :param config_name: Name of the config file holding the launcher's startup commands.
- :param commands: List of commands to append to the specified config file.
- """
- file_utils.clear_out_config_file(launcher.workspace.release.paths.project(), config_name)
- config_path = os.path.join(launcher.workspace.release.paths.platform_cache(), project_name)
- file_utils.add_commands_to_config_file(config_path, '{}.cfg'.format(config_name), commands)
-
-
-def configure_setup(launcher, delete_logs=True, delete_shaders=True):
- """
- Deletes old artifact folders and clears out any config files.
-
- :param launcher:
- :param delete_logs: Delete the game project's logs directory if True.
- :param delete_shaders: Delete the project's cache directory if True.
- """
- if delete_logs:
- delete_project_logs(launcher)
-
- if delete_shaders:
- delete_shader_cache(launcher)
-
- file_utils.delete_screenshot_folder(launcher.workspace.release.paths.platform_cache())
-
- file_utils.clear_out_config_file(launcher.workspace.release.paths.project(), 'initialmap')
- file_utils.clear_out_config_file(launcher.workspace.release.paths.project(), 'autoexec')
-
-
-def delete_project_logs(launcher):
- """
- Deletes project logs in the launcher's project folder.
- """
- if os.path.exists(launcher.workspace.release.paths.project_log()):
- file_system.delete([launcher.workspace.release.paths.project_log()], True, True)
-
-
-def delete_shader_cache(launcher, asset_type="pc"):
- """
- Deletes shader cache in the launcher's project folder.
- """
- user_folder = os.path.join(launcher.workspace.release.paths.project_cache(), asset_type, "user", "cache")
- if os.path.exists(user_folder):
- file_system.delete([user_folder], True, True)
-
-
-def retry_console_command(remote_console, command, output, tries=10, timeout=10):
- """
- Retries specified console command multiple times and asserts if it still can not send.
- :param remote_console: the remote console connected to the launcher.
- :param command: the command to send to the console.
- :param output: The expected output to check if the command was sent successfully.
- :param tries: The amount of times to try before asserting.
- :param timeout: The amount of time in seconds to wait for each retry send.
- :return: True if succeeded, will assert otherwise.
- """
- while tries > 0:
- check_command = remote_console.expect_log_line(output, timeout)
- remote_console.send_command(command)
- if check_command():
- return True
- tries -= 1
- assert False, "Command \"{}\" failed to run in remote console.".format(command)
diff --git a/Tests/workflow/__init__.py b/Tests/workflow/__init__.py
deleted file mode 100755
index e912252f4e..0000000000
--- a/Tests/workflow/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
diff --git a/Tests/workflow/android/__init__.py b/Tests/workflow/android/__init__.py
deleted file mode 100755
index e912252f4e..0000000000
--- a/Tests/workflow/android/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
diff --git a/Tests/workflow/android/workflow_android.py b/Tests/workflow/android/workflow_android.py
deleted file mode 100755
index 4eb0f578b1..0000000000
--- a/Tests/workflow/android/workflow_android.py
+++ /dev/null
@@ -1,15 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-"""
-import logging
-import pytest
-
-import workflow.shared.workflow_shared as workflow_shared
\ No newline at end of file
diff --git a/Tests/workflow/ios/__init__.py b/Tests/workflow/ios/__init__.py
deleted file mode 100755
index e912252f4e..0000000000
--- a/Tests/workflow/ios/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
diff --git a/Tests/workflow/ios/workflow_ios.py b/Tests/workflow/ios/workflow_ios.py
deleted file mode 100755
index 4eb0f578b1..0000000000
--- a/Tests/workflow/ios/workflow_ios.py
+++ /dev/null
@@ -1,15 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-"""
-import logging
-import pytest
-
-import workflow.shared.workflow_shared as workflow_shared
\ No newline at end of file
diff --git a/Tests/workflow/mac/__init__.py b/Tests/workflow/mac/__init__.py
deleted file mode 100755
index e912252f4e..0000000000
--- a/Tests/workflow/mac/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
diff --git a/Tests/workflow/mac/workflow_mac.py b/Tests/workflow/mac/workflow_mac.py
deleted file mode 100755
index 4eb0f578b1..0000000000
--- a/Tests/workflow/mac/workflow_mac.py
+++ /dev/null
@@ -1,15 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-"""
-import logging
-import pytest
-
-import workflow.shared.workflow_shared as workflow_shared
\ No newline at end of file
diff --git a/Tests/workflow/shared/__init__.py b/Tests/workflow/shared/__init__.py
deleted file mode 100755
index e912252f4e..0000000000
--- a/Tests/workflow/shared/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
diff --git a/Tests/workflow/shared/workflow_shared.py b/Tests/workflow/shared/workflow_shared.py
deleted file mode 100755
index 3581f9349e..0000000000
--- a/Tests/workflow/shared/workflow_shared.py
+++ /dev/null
@@ -1,95 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-This demos_testlib file is used for a collection of reusable functionality that QA will use in their scripts specific
-to the setup of demo level tests.
-"""
-import sys
-
-import shared.network_utils as network_utils
-from shared.screenshot_utils import move_screenshots, take_screenshot_with_retries
-
-from test_tools.shared.launcher_testlib import *
-
-import test_tools.shared.waiter
-import test_tools.launchers.phase
-
-
-def start_launcher(launcher):
- """
- For PC: Used to start launcher and give time to load.
- """
- launcher.launch()
- launcher.run(test_tools.launchers.phase.TimePhase(120, 120))
-
-
-def remote_console_load_level(launcher, remote_console, level):
- """
- Uses the remote console to use the map command to load a level and checks the console output for a successful load.
- """
- command = 'map {}'.format(level)
- load = remote_console.expect_log_line('LEVEL_LOAD_COMPLETE', 300)
- retry_console_command(remote_console, command, "Executing console command '{}'".format(command))
- assert load(), "{} level failed to load.".format(level)
-
- # Allow one minute to let level fully render and to test for stability
- launcher.run(test_tools.launchers.phase.TimePhase(60, 60))
-
-
-def start_remote_console(launcher, remote_console, on_devkit=False):
- """
- Starts the remote console. Used in QA scripts that require the use of remote console.
- """
- if on_devkit:
- test_tools.shared.waiter.wait_for(lambda: network_utils.check_for_remote_listening_port(4600, launcher.ip),
- timeout=600, exc=AssertionError('Port 4600 not listening.'))
- else:
- test_tools.shared.waiter.wait_for(lambda: network_utils.check_for_listening_port(4600), timeout=300,
- exc=AssertionError('Port 4600 not listening.'))
-
- remote_console.start()
-
- # Allows remote console time to connect to launcher.
- launcher.run(test_tools.launchers.phase.TimePhase(60, 60))
-
-
-def remote_console_take_screenshot(launcher, remote_console, level):
- """
- Uses the remote console to run the r_GetScreenshot command to take a screenshot of the current launcher and move
- the screenshot to the test results location.
- """
- screenshot_path = os.path.join(launcher.workspace.release.paths.platform_cache(), "user", "screenshots")
- take_screenshot_with_retries(remote_console, launcher, level)
- if os.path.exists(screenshot_path):
- move_screenshots(screenshot_path, '.jpg', launcher.workspace.artifact_manager.get_save_artifact_path())
-
-
-def build_setup(launcher, project_dir):
- game_cfg = os.path.join(project_dir, 'game.cfg')
- test_tools.shared.settings.edit_text_settings_file(game_cfg, 'sys_primaryUserSelectionEnabled', 0)
- test_tools.shared.settings.edit_text_settings_file(game_cfg, 'sys_localUserLobbyEnabled', 0)
-
-
-def enable_full_mode(launcher, console_remote_filesystem, console_paks):
- print("Enabling FULL Mode")
- launcher.workspace.release.modify_bootstrap_setting(console_remote_filesystem, 0)
- launcher.workspace.release.modify_user_setting(console_paks, "False")
-
-
-def enable_pak_mode(launcher, console_remote_filesystem, console_paks):
- print("Enabling PAK Mode")
- launcher.workspace.release.modify_bootstrap_setting(console_remote_filesystem, 0)
- launcher.workspace.release.modify_user_setting(console_paks, "True")
-
-
-def enable_vfs_mode(launcher, console_remote_filesystem, console_paks):
- print("Enabling VFS Mode")
- launcher.workspace.release.modify_bootstrap_setting(console_remote_filesystem, 1)
- launcher.workspace.release.modify_user_setting(console_paks, "False")
diff --git a/Tests/workflow/win/__init__.py b/Tests/workflow/win/__init__.py
deleted file mode 100755
index e912252f4e..0000000000
--- a/Tests/workflow/win/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-
- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- its licensors.
-
- For complete copyright and license terms please see the LICENSE at the root of this
- distribution (the "License"). All use of this software is governed by the License,
- or, if provided, by the license below or the license accompanying this file. Do not
- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
diff --git a/Tests/workflow/win/workflow_win.py b/Tests/workflow/win/workflow_win.py
deleted file mode 100755
index 4eb0f578b1..0000000000
--- a/Tests/workflow/win/workflow_win.py
+++ /dev/null
@@ -1,15 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-"""
-import logging
-import pytest
-
-import workflow.shared.workflow_shared as workflow_shared
\ No newline at end of file