/* * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package rec import ( "context" "encoding/json" "fotff/pkg" "fotff/tester" "fotff/utils" "github.com/sirupsen/logrus" "time" ) var Records = make(map[string]Record) func init() { data, err := utils.ReadRuntimeData("records.json") if err != nil { return } if err := json.Unmarshal(data, &Records); err != nil { logrus.Errorf("unmarshal records err: %v", err) } } func Save() { data, err := json.MarshalIndent(Records, "", "\t") if err != nil { logrus.Errorf("marshal records err: %v", err) return } if err := utils.WriteRuntimeData("records.json", data); err != nil { logrus.Errorf("save records err: %v", err) return } logrus.Infof("save records successfully") } func HandleResults(t tester.Tester, dev string, pkgName string, results []tester.Result) []string { var passes, fails []tester.Result for _, result := range results { switch result.Status { case tester.ResultPass: passes = append(passes, result) case tester.ResultFail: fails = append(fails, result) } } handlePassResults(pkgName, passes) return handleFailResults(t, dev, pkgName, fails) } func handlePassResults(pkgName string, results []tester.Result) { for _, result := range results { logrus.Infof("recording [%s] as a success, the lastest success package is [%s]", result.TestCaseName, pkgName) Records[result.TestCaseName] = Record{ UpdateTime: time.Now().Format("2006-01-02 15:04:05"), Status: tester.ResultPass, LatestSuccessPkg: pkgName, EarliestFailPkg: "", FailIssueURL: "", } } } func handleFailResults(t tester.Tester, dev string, pkgName string, results []tester.Result) []string { var fotffTestCases []string for _, result := range results { if record, ok := Records[result.TestCaseName]; ok && record.Status != tester.ResultPass { logrus.Warnf("test case %s had failed before, skip handle it", result.TestCaseName) continue } status := tester.ResultFail for i := 0; i < 3; i++ { r, err := t.DoTestCase(dev, result.TestCaseName, context.TODO()) if err != nil { logrus.Errorf("failed to do test case %s: %v", result.TestCaseName, err) continue } logrus.Infof("do testcase %s at %s done, result is %s", r.TestCaseName, dev, r.Status) if r.Status == tester.ResultPass { logrus.Warnf("testcase %s result is %s", r.TestCaseName, tester.ResultOccasionalFail) status = tester.ResultOccasionalFail break } } if status == tester.ResultFail && Records[result.TestCaseName].LatestSuccessPkg != "" && Records[result.TestCaseName].EarliestFailPkg == "" { fotffTestCases = append(fotffTestCases, result.TestCaseName) } Records[result.TestCaseName] = Record{ UpdateTime: time.Now().Format("2006-01-02 15:04:05"), Status: status, LatestSuccessPkg: Records[result.TestCaseName].LatestSuccessPkg, EarliestFailPkg: pkgName, FailIssueURL: "", } } return fotffTestCases } func Analysis(m pkg.Manager, t tester.Tester, pkgName string, testcases []string) { for i, testcase := range testcases { record := Records[testcase] logrus.Infof("%s failed, the lastest success package is [%s], earliest fail package is [%s], now finding out the first fail...", testcase, record.LatestSuccessPkg, pkgName) issueURL, err := FindOutTheFirstFail(m, t, testcase, record.LatestSuccessPkg, pkgName, testcases[i+1:]...) if err != nil { logrus.Errorf("failed to find out the first fail issue, err: %v", err) issueURL = err.Error() } logrus.Infof("recording %s as a failure, the lastest success package is [%s], the earliest fail package is [%s], fail issue URL is [%s]", testcase, record.LatestSuccessPkg, pkgName, issueURL) Records[testcase] = Record{ UpdateTime: time.Now().Format("2006-01-02 15:04:05"), Status: tester.ResultFail, LatestSuccessPkg: record.LatestSuccessPkg, EarliestFailPkg: pkgName, FailIssueURL: issueURL, } } }