1#!/usr/bin/python
2# -*- coding: UTF-8 -*-
3"""
4 * Copyright (c) 2023 Huawei Device Co., Ltd.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16"""
17
18import os
19import subprocess
20
21G_SUITE = ""
22G_MAXCASECNT = 5
23G_MUSTPASSPATH = "mustpass"
24G_MUSTPASSFILE = ".txt"
25G_TMPPATH = "template/"
26G_TMPDIRPATH = G_TMPPATH + "ace_ets_template"
27G_HAPDIRPATH = "../act_etc_component_"
28G_IMPORTTEST = "import {}Jsunit from \'./{}.test.ets\';"
29G_IMPORTTESTCASE = "{}Jsunit()"
30G_PATHDIRPATH = "entry/src/main/ets/MainAbility/pages"
31G_PAGETEMPPATH = "pagetemplate.ets"
32G_PAGEATTRTEMPPATH = "pageattrtemplate.ets"
33G_TESTDIRPATH = "entry/src/main/ets/test"
34G_TESTCASETEMPPATH = "testcasetemplate.ets"
35G_TESTTEMPPATH = "List.test.ets"
36G_LISTTESTETSPATH = "entry/src/main/ets/test/List.test.ets"
37G_PAGENAMEPATTERN = "##PAGENAME"
38G_ATTRNAMEPATTERN = "##ATTRNAME"
39G_LOWATTRNAMEPATTERN = "##LOWATTRNAME"
40G_PAGENAMETESETPATTERN = "##PAGENAMETEST"
41G_PAGEFILENAMEPATTERN = "##PAGEFILENAME"
42G_SUITENAMEPATTERN = "##SUITENAME"
43G_PAGENAMETESTPATTERN = "##PAGENAMETEXT"
44G_CONFIGJSONPATH = "entry/src/main/config.json"
45G_BUILDGNPATH = "BUILD.gn"
46G_TESTJSONPATH = "Test.json"
47G_INDEXETSPATH = "entry/src/main/ets/MainAbility/pages/index.ets"
48
49
50def writemultestcase():
51    # 生成testcase
52    print("writemultestcase")
53    writemultestcasecpp()
54    print("writemulbuildgn")
55    writemulbuildgn()
56
57
58def run_cmd(commond):
59    # 执行命令
60    subprocess.run(commond.split(" "), shell=False, capture_output=True)
61
62
63def writemulbuildgn():
64    # 生成buildgn
65    for suiteitem in G_SUITE:
66        subcasecnt = 0
67        subattcnt = 0
68        subgncnt = 0
69        suiteitemcap = "{}{}".format(suiteitem[:1].upper(), suiteitem[1:])
70        print("suite:", suiteitem, "----------------------")
71        # 创建一个hap目录
72        hapdirpath = "{}{}".format(G_HAPDIRPATH, suiteitem.lower())
73        if os.path.exists(hapdirpath):
74            run_cmd(r"rm -rf {}".format(hapdirpath))
75            run_cmd(r"cp {} {} -r".format(G_TMPDIRPATH, hapdirpath))
76        else:
77            run_cmd(r"cp {} {} -r".format(G_TMPDIRPATH, hapdirpath))
78
79        mustpass =  os.path.join(G_MUSTPASSPATH, "{}{}".format(suiteitem, G_MUSTPASSFILE))
80        with open(mustpass) as mastpassfile:
81            compdict = {"": 1}
82            importtestheads = []
83            importtests = []
84
85            for line in mastpassfile:
86                if line[0] == "#":
87                    continue
88                line = line.replace("\n", "")
89                linelist = line.split(",")
90                suitename = linelist[0]
91                casename = linelist[1]
92
93                if suitename in compdict:
94                    #同文件里加属性
95                    ind = compdict[suitename]
96                    subattcnt += 1
97                    #在page文件里追加attr内容
98                    casenamecap = "{}{}".format(casename[:1].upper(), casename[1:])
99                    pagenametext = "{}-{}".format(suitename, casenamecap)
100                    pagefilename = os.path.join(hapdirpath, G_PATHDIRPATH, "{}.ets".format(suitename))
101                    attrtmp = os.path.join(G_TMPPATH, G_PAGEATTRTEMPPATH)
102                    with open(attrtmp, encoding="utf-8", mode="r") as attrtmpfile:
103                        for attrtempline in attrtmpfile:
104                            attrtempline = attrtempline.replace(" ", "\ ")
105                            attrtempline = attrtempline.replace(G_PAGENAMETESTPATTERN, pagenametext)
106                            attrtempline = attrtempline.replace(G_ATTRNAMEPATTERN, casename)
107                            run_cmd(r"sed -i '{}a {}' {}".format(ind, attrtempline, pagefilename))
108                            ind += 1
109                    compdict[suitename] = ind
110                else:
111                    # 创建不同页面
112                    subgncnt += 1
113                    subattcnt = 1
114                    ind = 29
115                    compdict[suitename] = ind
116                    temppagefilename = os.path.join(G_TMPPATH, G_PAGETEMPPATH)
117                    suitenamecap = "{}{}".format(suitename[:1].upper(), suitename[1:])
118                    casenamecap = "{}{}".format(casename[:1].upper(), casename[1:])
119                    pagename = "{}{}".format(suitename, casenamecap)
120                    capagename = "{}{}".format(suitenamecap, casenamecap)
121                    testname = pagename
122                    pagefilename = os.path.join(hapdirpath, G_PATHDIRPATH, "{}.ets".format(suitename))
123                    run_cmd(r"cp {} {}".format(temppagefilename, pagefilename))
124                    # 替换page里的名称
125                    run_cmd(r"sed -i 's/{}/{}/g' {}".format(G_PAGENAMEPATTERN, capagename, pagefilename))
126                    # 追加page里的attr
127                    pagenametext = "{}-{}".format(suitename, casenamecap)
128                    attrtmp = os.path.join(G_TMPPATH, G_PAGEATTRTEMPPATH)
129                    with open(attrtmp, encoding="utf-8", mode="r") as attrtmpfile:
130                        for attrtempline in attrtmpfile:
131                            attrtempline = attrtempline.replace(" ", "\ ")
132                            attrtempline = attrtempline.replace(G_PAGENAMETESTPATTERN, pagenametext)
133                            attrtempline = attrtempline.replace(G_ATTRNAMEPATTERN, casename)
134                            run_cmd(r"sed -i '{}a {}' {}".format(ind, attrtempline, pagefilename))
135                            ind += 1
136                    compdict[suitename] = ind
137
138                    temptestfilename = os.path.join(G_TMPPATH, G_TESTCASETEMPPATH)
139                    testfilename = os.path.join(hapdirpath, G_TESTDIRPATH, "{}.test.ets".format(suitename))
140                    run_cmd(r"cp {} {}".format(temptestfilename, testfilename))
141                    # 替换test里的名称
142                    run_cmd(r"sed -i 's/{}/{}/g' {}".format(G_ATTRNAMEPATTERN, testname, testfilename))
143                    run_cmd(r"sed -i 's/{}/{}/g' {}".format(G_PAGENAMETESETPATTERN, "{}Test".format(testname),
144					testfilename))
145                    run_cmd(r"sed -i 's/{}/{}/g' {}".format(G_PAGEFILENAMEPATTERN, pagename, testfilename))
146                    run_cmd(r"sed -i 's/{}/{}/g' {}".format(G_LOWATTRNAMEPATTERN, casename, testfilename))
147                    # 替换config.json里的名称
148                    configjsonname = os.path.join(hapdirpath, G_CONFIGJSONPATH)
149                    run_cmd(r"sed -i 's/{}/{}/g' {}".format(G_SUITENAMEPATTERN, suiteitemcap, configjsonname))
150                    run_cmd(r"sed -i 's/{}/{}/g' {}".format(G_PAGEFILENAMEPATTERN, casenamecap, configjsonname))
151                    # 替换BUILD.gn里的名称
152                    buildgnname = os.path.join(hapdirpath, G_BUILDGNPATH)
153                    run_cmd(r"sed -i 's/{}/{}/g' {}".format(G_SUITENAMEPATTERN, suiteitemcap, buildgnname))
154                    # formate gn
155                    formatcmd = "cat {} | ~/workspace/oh31/prebuilts/build-tools/linux-x86/bin/gn format --stdin "
156                    "> FORMAT_RESULT.gn;cp -f FORMAT_RESULT.gn {};rm FORMAT_RESULT.gn".format(buildgnname, buildgnname)
157                    run_cmd(formatcmd)
158                    # 替换index.ets里的名称
159                    indexetsname = os.path.join(hapdirpath, G_INDEXETSPATH)
160                    run_cmd(r"sed -i 's/{}/{}/g' {}".format(G_SUITENAMEPATTERN, suiteitemcap, indexetsname))
161
162                    # 替换Test.json里的名称
163                    testjsonname = os.path.join(hapdirpath, G_TESTJSONPATH)
164                    run_cmd(r"sed -i 's/{}/{}/g' {}".format(G_SUITENAMEPATTERN, suiteitemcap, testjsonname))
165
166                    importtestheads.append(G_IMPORTTEST.format(testname, suitename))
167                    importtests.append(G_IMPORTTESTCASE.format(testname))
168                subcasecnt += 1
169            # 插入List.test.ets,装载多个testcase
170            ind = 16
171            for importtestsline in importtests:
172                run_cmd(r"sed -i '{}a \ \ {}' {}".format(ind, importtestsline, os.path.join(hapdirpath, G_LISTTESTETSPATH)))
173                ind += 1
174            ind = 14
175            for importtestheadsline in importtestheads:
176                run_cmd(r"sed -i '{}a {}' {}".format(ind, importtestheadsline, os.path.join(hapdirpath, G_LISTTESTETSPATH)))
177                ind += 1
178
179def writemultestcasecpp():
180    # 生成testcase
181    for suiteitem in G_SUITE:
182        print("suite:", suiteitem)
183
184def removedir(rootdir):
185    # 删除文件夹
186    for _, dirs, files in os.walk(rootdir, topdown=False):
187        for name in files:
188            os.remove(os.path.join(rootdir, name))
189        for name in dirs:
190            os.rmdir(os.path.join(rootdir, name))
191    os.rmdir(rootdir)
192
193
194def printhelp():
195    # 打印提示信息
196    print("Need testsuite and codepattern:\n")
197    print("For example\n")
198    print("python3 .\GenerateTestCase.py apilack\n")
199    print("codepattern contains: apilack, attrlack\n")
200
201def new_report(bakdir, str1):
202    # 列出目录的下所有文件和文件夹保存到lists
203    files = os.listdir(bakdir)
204    lists = []
205    for f in files:
206        if "latest" in f:
207            continue
208        lists.append(f)
209
210    # 按时间排序
211    lists.sort(key=lambda fn:os.path.getmtime(os.path.join(bakdir, fn)))
212    # 获取最新的文件保存到file_new
213    file_new = os.path.join(bakdir, lists[-1])
214    print("latest file:", file_new)
215    return file_new
216
217
218if __name__ == '__main__':
219    latestpath = new_report("reports", "")
220    tmpfile = "tmptestsuite.xml"
221    putfile = "result/ActsLibuvTest.xml"
222    tasklogfile = "log/task_log.log"
223    putdir = os.path.join(latestpath, putfile)
224    tasklogpath = os.path.join(latestpath, tasklogfile)
225
226    timelist = latestpath.split("/")
227    curtime = timelist[1].replace("\n", "")
228    testcaselist = []
229    total = 0
230    passcnt = 0
231    failcnt = 0
232    suitename = ""
233    # 读取最近的tasklog文件
234    with open(tasklogpath) as tasklogbuf:
235        # 从tasklog文件中获取运行的testcase的信息
236        for tasklogline in tasklogbuf:
237            if "[Start test suite [" in tasklogline:
238                suitelist = tasklogline.split("[Start test suite [")
239                suiteitem = suitelist[1].split("]")
240                suitename = suiteitem[0]
241            if "[ok " in tasklogline:
242                freslist = tasklogline.split("ok")
243                numcase = freslist[1]
244                numcase = numcase.replace(" ", "")
245                numcase = numcase.replace("]", "")
246                caseline = numcase.split("-")
247                total += 1
248                passcnt += 1
249                testcaselist.append("{}-true".format(caseline[1]))
250            if "[not ok " in tasklogline:
251                freslist = tasklogline.split("not ok")
252                numcase = freslist[1]
253                numcase = numcase.replace(" ", "")
254                numcase = numcase.replace("]", "")
255                caseline = numcase.split("-")
256                total +=1
257                failcnt += 1
258                testcaselist.append("{}-false".format(caseline[1]))
259    # 将testcase信息生成文件
260    xmlfile = open(tmpfile, mode='w+')
261    xmlfile.write("<?xml version='1.0' encoding='UTF-8'?>\n")
262    xmlfile.write("<testsuites name=\"{}\" timestamp=\"{}\" time=\"0.0\" errors=\"0\" disabled=\"0\" failures=\"{}\" "
263	"tests=\"{}\" ignored=\"0\" unavailable=\"0\" productinfo=\"{}\">\n"
264	.format(suitename, curtime, failcnt, total, "{}"))
265    xmlfile.write("  <testsuite name=\"{}\" time=\"0.0\" errors=\"0\" disabled=\"0\" failures=\"{}\" ignored=\"0\" "
266	"tests=\"{}\" message=\"\">\n".format(suitename, failcnt, total))
267    for casename in testcaselist:
268        casename = casename.replace("\n", "")
269        loccasename = casename.split("-")
270        recasename = loccasename[0]
271        casestate = loccasename[1]
272        xmlfile.write("    <testcase name=\"{}\" status=\"run\" time=\"0.0\" classname=\"{}\" result=\"{}\" "
273		"level=\"1\" message=\"\" />\n".format(recasename, suitename, casestate))
274    xmlfile.write("  </testsuite>\n")
275    xmlfile.write("</testsuites>\n")
276    xmlfile.close()
277    # 将tmp文件替换xts框架的result
278    run_cmd(r"cp {} {}".format(tmpfile, putdir))
279