[TC Added] dotnettool option(--ni-regen-all-ro-app) test in TOOL
authorj-h.choi <j-h.choi@samsung.com>
Wed, 30 Dec 2020 05:07:54 +0000 (14:07 +0900)
committer조웅석/Common Platform Lab(SR)/Principal Engineer/삼성전자 <ws77.cho@samsung.com>
Thu, 7 Jan 2021 04:31:12 +0000 (13:31 +0900)
Change-Id: Ibad71585e1fdabada656ccaac8630bd33d77af3e

tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.sln [new file with mode: 0644]
tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/Launcher_TC_TOOL_08.Tizen.cs [new file with mode: 0644]
tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/Launcher_TC_TOOL_08.Tizen.csproj [new file with mode: 0644]
tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/Launcher_TC_TOOL_08.Tizen.csproj.user [new file with mode: 0644]
tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/shared/res/Launcher_TC_TOOL_08.Tizen.png [new file with mode: 0644]
tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/tizen-manifest.xml [new file with mode: 0644]
tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.cs [new file with mode: 0644]
tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.csproj [new file with mode: 0644]
tests/Apps/README.md
tests/TCs/6_TOOL/README.md
tests/TCs/6_TOOL/TOOL.py

diff --git a/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.sln b/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.sln
new file mode 100644 (file)
index 0000000..99a3ba6
--- /dev/null
@@ -0,0 +1,31 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio Version 16\r
+VisualStudioVersion = 16.0.29613.14\r
+MinimumVisualStudioVersion = 10.0.40219.1\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Launcher_TC_TOOL_08", "Launcher_TC_TOOL_08\Launcher_TC_TOOL_08\Launcher_TC_TOOL_08.csproj", "{14607BEA-C6C6-41B6-BB37-20072CBFD953}"\r
+EndProject\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Launcher_TC_TOOL_08.Tizen", "Launcher_TC_TOOL_08\Launcher_TC_TOOL_08.Tizen\Launcher_TC_TOOL_08.Tizen.csproj", "{D47AC382-0C20-4AD2-9D52-5F1A26BF7C97}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Any CPU = Debug|Any CPU\r
+               Release|Any CPU = Release|Any CPU\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {14607BEA-C6C6-41B6-BB37-20072CBFD953}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {14607BEA-C6C6-41B6-BB37-20072CBFD953}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {14607BEA-C6C6-41B6-BB37-20072CBFD953}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {14607BEA-C6C6-41B6-BB37-20072CBFD953}.Release|Any CPU.Build.0 = Release|Any CPU\r
+               {D47AC382-0C20-4AD2-9D52-5F1A26BF7C97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {D47AC382-0C20-4AD2-9D52-5F1A26BF7C97}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {D47AC382-0C20-4AD2-9D52-5F1A26BF7C97}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {D47AC382-0C20-4AD2-9D52-5F1A26BF7C97}.Release|Any CPU.Build.0 = Release|Any CPU\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityGlobals) = postSolution\r
+               SolutionGuid = {5DA771A9-1046-4DD4-89E4-5CF034C3BF06}\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/Launcher_TC_TOOL_08.Tizen.cs b/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/Launcher_TC_TOOL_08.Tizen.cs
new file mode 100644 (file)
index 0000000..3da222e
--- /dev/null
@@ -0,0 +1,22 @@
+using System;\r
+using Xamarin.Forms;\r
+\r
+namespace Launcher_TC_TOOL_08\r
+{\r
+    class Program : global::Xamarin.Forms.Platform.Tizen.FormsApplication\r
+    {\r
+        protected override void OnCreate()\r
+        {\r
+            base.OnCreate();\r
+\r
+            LoadApplication(new App());\r
+        }\r
+\r
+        static void Main(string[] args)\r
+        {\r
+            var app = new Program();\r
+            Forms.Init(app);\r
+            app.Run(args);\r
+        }\r
+    }\r
+}\r
diff --git a/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/Launcher_TC_TOOL_08.Tizen.csproj b/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/Launcher_TC_TOOL_08.Tizen.csproj
new file mode 100644 (file)
index 0000000..6ec12f8
--- /dev/null
@@ -0,0 +1,26 @@
+<Project Sdk="Tizen.NET.Sdk/1.1.5">\r
+\r
+  <PropertyGroup>\r
+    <OutputType>Exe</OutputType>\r
+    <TargetFramework>tizen70</TargetFramework>\r
+  </PropertyGroup>\r
+\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">\r
+    <DebugType>portable</DebugType>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">\r
+    <DebugType>None</DebugType>\r
+  </PropertyGroup>\r
+\r
+  <ItemGroup>\r
+    <Folder Include="lib\" />\r
+    <Folder Include="res\" />\r
+  </ItemGroup>\r
+\r
+  \r
+  <ItemGroup>\r
+    <ProjectReference Include="..\Launcher_TC_TOOL_08\Launcher_TC_TOOL_08.csproj" />\r
+  </ItemGroup>\r
+  \r
+\r
+</Project>\r
diff --git a/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/Launcher_TC_TOOL_08.Tizen.csproj.user b/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/Launcher_TC_TOOL_08.Tizen.csproj.user
new file mode 100644 (file)
index 0000000..36eec2c
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <PropertyGroup>\r
+    <ActiveDebugProfile>Launcher_TC_TOOL_08.Tizen</ActiveDebugProfile>\r
+  </PropertyGroup>\r
+</Project>
\ No newline at end of file
diff --git a/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/shared/res/Launcher_TC_TOOL_08.Tizen.png b/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/shared/res/Launcher_TC_TOOL_08.Tizen.png
new file mode 100644 (file)
index 0000000..9f3cb98
Binary files /dev/null and b/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/shared/res/Launcher_TC_TOOL_08.Tizen.png differ
diff --git a/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/tizen-manifest.xml b/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.Tizen/tizen-manifest.xml
new file mode 100644 (file)
index 0000000..756432b
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<manifest xmlns="http://tizen.org/ns/packages" api-version="5.5" package="org.tizen.example.Launcher_TC_TOOL_08.Tizen" version="1.0.0">\r
+       <profile name="common" />\r
+       <ui-application appid="org.tizen.example.Launcher_TC_TOOL_08.Tizen"\r
+                                       exec="Launcher_TC_TOOL_08.Tizen.dll"\r
+                                       type="dotnet"\r
+                                       multiple="false"\r
+                                       taskmanage="true"\r
+                                       nodisplay="false"\r
+                                       launch_mode="single"\r
+                                       api-version="6">\r
+  <label>Launcher_TC_TOOL_08.Tizen</label>\r
+       <icon>Launcher_TC_TOOL_08.Tizen.png</icon>\r
+        <metadata key="http://tizen.org/metadata/prefer_dotnet_aot" value="true" />\r
+       </ui-application>\r
+</manifest>\r
diff --git a/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.cs b/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.cs
new file mode 100644 (file)
index 0000000..f6e0ee2
--- /dev/null
@@ -0,0 +1,45 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+using Xamarin.Forms;\r
+\r
+namespace Launcher_TC_TOOL_08\r
+{\r
+    public class App : Application\r
+    {\r
+        public App()\r
+        {\r
+            // The root page of your application\r
+            MainPage = new ContentPage\r
+            {\r
+                Content = new StackLayout\r
+                {\r
+                    VerticalOptions = LayoutOptions.Center,\r
+                    Children = {\r
+                        new Label {\r
+                            HorizontalTextAlignment = TextAlignment.Center,\r
+                            Text = "Welcome to Xamarin Forms!"\r
+                        }\r
+                    }\r
+                }\r
+            };\r
+        }\r
+\r
+        protected override void OnStart()\r
+        {\r
+            // Handle when your app starts\r
+        }\r
+\r
+        protected override void OnSleep()\r
+        {\r
+            // Handle when your app sleeps\r
+        }\r
+\r
+        protected override void OnResume()\r
+        {\r
+            // Handle when your app resumes\r
+        }\r
+    }\r
+}\r
diff --git a/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.csproj b/tests/Apps/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08/Launcher_TC_TOOL_08.csproj
new file mode 100644 (file)
index 0000000..be3d00f
--- /dev/null
@@ -0,0 +1,11 @@
+<Project Sdk="Tizen.NET.Sdk/1.1.5">\r
+\r
+  <PropertyGroup>\r
+    <TargetFramework>netstandard2.0</TargetFramework>\r
+  </PropertyGroup>\r
+\r
+  <ItemGroup>\r
+    <PackageReference Include="Xamarin.Forms" Version="4.6.0.967" />\r
+  </ItemGroup>\r
+\r
+</Project>\r
index e01f9ca..0fa4ae0 100644 (file)
@@ -116,6 +116,7 @@ Build complete : org.tizen.example.Launcher_TC_TAC_01.Tizen-1.0.0.tpk
  Launcher_TC_TOOL_05 | org.tizen.example.Launcher_TC_TOOL_05.Tizen | X                 | True               | Xamarin.Forms(4.6.0.967)
  Launcher_TC_TOOL_06 | org.tizen.example.Launcher_TC_TOOL_06.Tizen | X                 | True               | Xamarin.Forms(4.6.0.967)
  Launcher_TC_TOOL_07 | org.tizen.example.Launcher_TC_TOOL_07.Tizen | True              | True               | Xamarin.Forms(4.6.0.967), SkiaSharp(2.80.2)
+ Launcher_TC_TOOL_08 | org.tizen.example.Launcher_TC_TOOL_08.Tizen | True              | X                  | Xamarin.Forms(4.6.0.967)
 
 ----
 ### Note
index ae1cf6a..5fb6790 100644 (file)
@@ -110,6 +110,17 @@ launcher/tests/TCs/6_TOOL$ ./TOOL.py TC_01
   PASS : The Database of the restored TAC and TLC must be a valid value.
 ```
   1. sh-3.2# dotnettool --tac-restore-db
+* TC_17
+```
+  PASS : The prefer_dotnet_aot metadata value of true will regenerates the native image in all .NET applications of read-only type.
+```
+  1. sh-3.2# dotnettool --ni-regen-all-ro-app
+* TC_18
+```
+  PASS : The Launcher_TC_TOOL_08 application should load the newly generated native image.
+```
+ 1. Regenerated NI files of read-only application is stored at "/opt/usr/dotnet/apps/[PkgID]/bin/.native_image/".
+ 2. The assembly in the "/opt/usr/dotnet/apps/[PkgId]/bin/.native/image/" should be loaded when running the application.
 ----
 
 ### Note
index 83de4ae..e2ed2f8 100755 (executable)
@@ -245,30 +245,29 @@ def TC_12():
     cmd(f"shell dotnettool --ni-regen-all-app")
 
     raw = subprocess.run((f"sdb -s {serial} shell pkginfo --metadata-flt").split(), stdout=subprocess.PIPE, input=f"http://tizen.org/metadata/prefer_dotnet_aot\ntrue\n", encoding="utf-8").stdout
-    lines1 = [l for l in raw.splitlines() if "appid" in l]
-    lines2 = []
-    for app in lines1:
+    lines = [l for l in raw.splitlines() if "appid" in l]
+    for app in lines:
         pkg_id = app.split(": ")[1]
         raw = subprocess.run((f"sdb -s {serial} shell pkginfo --pkg {pkg_id}").split(), stdout=subprocess.PIPE, encoding="utf-8").stdout
-        lines2 = [l for l in raw.splitlines() if "root_path" in l]
-
-    for path in lines2:
-        root_path = path.split(": ")[1]
-        raw = cmd(f"shell find {root_path}/bin/.native_image/ -name *.ni.dll")
-        lines3 = [l for l in raw.splitlines()]
-        raw = cmd(f"shell find {root_path}/bin/ -maxdepth 1 -name *.dll -not -name *.ni.dll")
-        lines4 = [l for l in raw.splitlines()]
-        if len(lines3) != len(lines4):
-            return "FAIL : The number of .dll and .ni.dll must match in the application"
-
-        for ni in lines3:
-            is_same = False
-            for dll in lines4:
-                if Path(ni).name.replace(".ni.dll", "") == Path(dll).name.replace(".dll", ""):
-                    is_same = True
-                    break
-            if not is_same:
-                return "FAIL : The file name of .dll and .ni.dll must match in the application"
+        readonly = [l for l in raw.splitlines() if "Readonly" in l]
+        if "0" == readonly[0].split(": ")[1]:
+            path = [l for l in raw.splitlines() if "root_path" in l]
+            root_path = path[0].split(": ")[1]
+            raw = cmd(f"shell find {root_path}/bin/.native_image/ -name *.ni.dll")
+            lines1 = [l for l in raw.splitlines()]
+            raw = cmd(f"shell find {root_path}/bin/ -maxdepth 1 -name *.dll -not -name *.ni.dll")
+            lines2 = [l for l in raw.splitlines()]
+            if len(lines1) != len(lines2):
+                return "FAIL : The number of .dll and .ni.dll must match in the application"
+
+            for ni in lines1:
+                is_same = False
+                for dll in lines2:
+                    if Path(ni).name.replace(".ni.dll", "") == Path(dll).name.replace(".dll", ""):
+                        is_same = True
+                        break
+                if not is_same:
+                    return "FAIL : The file name of .dll and .ni.dll must match in the application"
 
     return "PASS"
 
@@ -417,15 +416,79 @@ def TC_16():
 
     return "PASS"
 
+# The prefer_dotnet_aot metadata value of true will regenerates the native image in all .NET applications of read-only type.
+def TC_17():
+    sln_name = "Launcher_TC_TOOL_08.Tizen"
 
-#def TC_17():
-#dotnettool --resolve-all-app
+    tpk_path = get_tpk_path(tpk_list, f"{sln_name}")
+    if tpk_path == None:
+        return f"FAIL : Get the tpk path for {sln_name}"
+
+    raw = cmd(f"push {tpk_path} /usr/apps/.preload-tpk/")
+    if "1 file(s) pushed. 0 file(s) skipped." in raw:
+        cmd(f"shell install_preload_pkg")
+
+    cmd(f"shell dotnettool --ni-regen-all-ro-app")
+
+    raw = subprocess.run((f"sdb -s {serial} shell pkginfo --metadata-flt").split(), stdout=subprocess.PIPE, input=f"http://tizen.org/metadata/prefer_dotnet_aot\ntrue\n", encoding="utf-8").stdout
+    lines = [l for l in raw.splitlines() if "appid" in l]
+    for app in lines:
+        pkg_id = app.split(": ")[1]
+        raw = subprocess.run((f"sdb -s {serial} shell pkginfo --pkg {pkg_id}").split(), stdout=subprocess.PIPE, encoding="utf-8").stdout
+        readonly = [l for l in raw.splitlines() if "Readonly" in l]
+        if "1" == readonly[0].split(": ")[1]:
+            path = [l for l in raw.splitlines() if "root_path" in l]
+            root_path = path[0].split(": ")[1]
+            raw = cmd(f"shell find {DOTNET_DIR}apps/{pkg_id}/bin/.native_image/ -name *.ni.dll")
+            lines1 = [l for l in raw.splitlines()]
+            raw = cmd(f"shell find {root_path}/bin/ -maxdepth 1 -name *.dll -not -name *.ni.dll")
+            lines2 = [l for l in raw.splitlines()]
+            if len(lines1) != len(lines2):
+                return "FAIL : The number of .dll and .ni.dll must match in the application"
+
+            for ni in lines1:
+                is_same = False
+                for dll in lines2:
+                    if Path(ni).name.replace(".ni.dll", "") == Path(dll).name.replace(".dll", ""):
+                        is_same = True
+                        break
+                if not is_same:
+                    return "FAIL : The file name of .dll and .ni.dll must match in the application"
+
+    return "PASS"
 
-#def TC_18():
-#dotnettool --instrument
+# The `Launcher_TC_TOOL_08` application should load the newly generated native image.
+def TC_18():
+    pkg_id = f"org.tizen.example.Launcher_TC_TOOL_08.Tizen"
+
+    pid = launch_and_get_pid(f"-e", f"{pkg_id}")
+    if 0 == pid:
+        return f"FAIL : Get the pid for {pkg_id}"
+
+    raw = cmd(f"shell cat /proc/{pid}/smaps | grep Xamarin.Forms.*.dll")
+    if (f"{DOTNET_DIR}apps/{pkg_id}/bin/.native_image/Xamarin.Forms.Platform.Tizen.ni.dll" not in raw) or \
+       (f"{DOTNET_DIR}apps/{pkg_id}/bin/.native_image/Xamarin.Forms.Core.ni.dll" not in raw) or \
+       (f"{DOTNET_DIR}apps/{pkg_id}/bin/.native_image/Xamarin.Forms.Platform.ni.dll" not in raw):
+        return "FAIL : The Xamarin.Forms in the application should be loaded when running the application"
+
+    cmd(f"shell app_launcher -t {pkg_id}")
+
+    return "PASS"
+
+# It should be done together for update test.
+def TC_17_18():
+    ret = TC_17()
+    if "PASS" != ret:
+        return f"{ret}"
+
+    ret = TC_18()
+    if  "PASS" != ret:
+        return f"{ret}"
+
+    return "PASS"
 
 #def TC_19():
-#dotnettool --compatibility
+#dotnettool --resolve-all-app
 
 
 # Run the test
@@ -457,6 +520,8 @@ def clean():
 
     cmd(f"shell rm -rf {IBCDATA_DIR}")
 
+    cmd(f"shell rm -rf {DOTNET_DIR}apps/org.tizen.example.Launcher_TC_TOOL_08.Tizen")
+
 # Main entry point
 def main():
     parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter)
@@ -473,7 +538,7 @@ def main():
             else:
                 tc_array.append(funcMap[tc_num])
     else:
-        tc_array = [TC_01, TC_02, TC_03, TC_04, TC_05, TC_06, TC_07, TC_08, TC_09, TC_10, TC_11, TC_12, TC_13, TC_14, TC_15, TC_16]
+        tc_array = [TC_01, TC_02, TC_03, TC_04, TC_05, TC_06, TC_07, TC_08, TC_09, TC_10, TC_11, TC_12, TC_13, TC_14, TC_15, TC_16, TC_17, TC_18]
 
     global serial
     if len(sys.argv) >= 2 and "TC_" not in sys.argv[1]:
@@ -493,12 +558,12 @@ def main():
 
 
 funcMap = {
-'TC_01': TC_01, 'TC_02': TC_02, 'TC_03': TC_03, 'TC_04': TC_04, 'TC_05': TC_05,
-'TC_06': TC_06, 'TC_07': TC_07, 'TC_08': TC_08, 'TC_09': TC_09, 'TC_10': TC_10,
-'TC_11': TC_11, 'TC_12': TC_12, 'TC_13': TC_13, 'TC_14': TC_14, 'TC_15': TC_15, 'TC_16': TC_16,
-'TOOL_TC_01': TC_01, 'TOOL_TC_02': TC_02, 'TOOL_TC_03': TC_03, 'TOOL_TC_04': TC_04, 'TOOL_TC_05': TC_05,
-'TOOL_TC_06': TC_06, 'TOOL_TC_07': TC_07, 'TOOL_TC_08': TC_08, 'TOOL_TC_09': TC_09, 'TOOL_TC_10': TC_10,
-'TOOL_TC_11': TC_11, 'TOOL_TC_12': TC_12, 'TOOL_TC_13': TC_13, 'TOOL_TC_14': TC_14, 'TOOL_TC_15': TC_15, 'TOOL_TC_16': TC_16
+'TC_01': TC_01, 'TC_02': TC_02, 'TC_03': TC_03, 'TC_04': TC_04, 'TC_05': TC_05, 'TC_06': TC_06,
+'TC_07': TC_07, 'TC_08': TC_08, 'TC_09': TC_09, 'TC_10': TC_10, 'TC_11': TC_11, 'TC_12': TC_12,
+'TC_13': TC_13, 'TC_14': TC_14, 'TC_15': TC_15, 'TC_16': TC_16, 'TC_17': TC_17, 'TC_18': TC_17_18,
+'TOOL_TC_01': TC_01, 'TOOL_TC_02': TC_02, 'TOOL_TC_03': TC_03, 'TOOL_TC_04': TC_04, 'TOOL_TC_05': TC_05, 'TOOL_TC_06': TC_06,
+'TOOL_TC_07': TC_07, 'TOOL_TC_08': TC_08, 'TOOL_TC_09': TC_09, 'TOOL_TC_10': TC_10, 'TOOL_TC_11': TC_11, 'TOOL_TC_12': TC_12,
+'TOOL_TC_13': TC_13, 'TOOL_TC_14': TC_14, 'TOOL_TC_15': TC_15, 'TOOL_TC_16': TC_16, 'TOOL_TC_17': TC_17, 'TOOL_TC_18': TC_17_18
 }