From c753ad3dd301be7355836535374daeb050dad41b Mon Sep 17 00:00:00 2001 From: Leo Neat Date: Fri, 29 May 2020 12:19:18 -0700 Subject: [PATCH 1/5] Iterations for test suites --- .../mediacontroller/MediaAppTestSuite.kt | 207 ++++++++++++------ .../MediaAppTestingActivity.kt | 42 ++-- .../res/layout/media_test_suite_result.xml | 7 - .../main/res/layout/run_suite_iter_dialog.xml | 38 ++++ .../src/main/res/values/testing_strings.xml | 5 +- 5 files changed, 201 insertions(+), 98 deletions(-) create mode 100644 mediacontroller/src/main/res/layout/run_suite_iter_dialog.xml diff --git a/mediacontroller/src/main/java/com/example/android/mediacontroller/MediaAppTestSuite.kt b/mediacontroller/src/main/java/com/example/android/mediacontroller/MediaAppTestSuite.kt index c536e0f..43df6a7 100644 --- a/mediacontroller/src/main/java/com/example/android/mediacontroller/MediaAppTestSuite.kt +++ b/mediacontroller/src/main/java/com/example/android/mediacontroller/MediaAppTestSuite.kt @@ -15,6 +15,7 @@ */ package com.example.android.mediacontroller +import android.animation.ArgbEvaluator import android.app.Dialog import android.content.Context import android.content.SharedPreferences @@ -26,20 +27,15 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.Window -import android.widget.Button -import android.widget.LinearLayout -import android.widget.ScrollView -import android.widget.TextView +import android.widget.* import androidx.cardview.widget.CardView import androidx.core.content.ContextCompat import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.animation.ArgbEvaluatorCompat import kotlinx.android.synthetic.main.media_test_option.view.card_header import kotlinx.android.synthetic.main.media_test_option.view.card_text -import kotlinx.android.synthetic.main.media_test_suite_result.view.tests_passing_header -import kotlinx.android.synthetic.main.media_test_suite_result.view.loading_bar -import kotlinx.android.synthetic.main.media_test_suite_result.view.tests_passing -import kotlinx.android.synthetic.main.media_test_suite_result.view.total_tests +import kotlinx.android.synthetic.main.media_test_suite_result.view.* import java.util.concurrent.Semaphore import kotlin.concurrent.thread @@ -47,34 +43,56 @@ import kotlin.concurrent.thread class MediaAppTestSuite(testSuiteName: String, testSuiteDescription: String, testList: Array, private val testSuiteResultsLayout: RecyclerView, context: Context) { + private val SLEEP_TIME = 1000L + private val TAG = "MediaAppTestSuite" + private val PASSING_COLOR = ContextCompat.getColor(context, R.color.test_result_pass) + private val FAILING_COLOR = ContextCompat.getColor(context, R.color.test_result_fail) + val name = testSuiteName val description = testSuiteDescription private val singleSuiteTestList = testList val context = context - private val resultsAdapter = ResultsAdapter(singleSuiteTestList) + private var resultsAdapter = ResultsAdapter(singleSuiteTestList) private val testSemaphore = Semaphore(1) private val mHandler = Handler(Looper.getMainLooper()) - private val iDToPositionMap = hashMapOf() - private val TAG = "MediaAppTestSuite" + private val positionToIDMap = hashMapOf() + private val iDToResultsMap = hashMapOf() private var suiteRunning = false - private var screenHeight = 0 - private val SLEEP_TIME = 1000L + private var argbEvaluator = ArgbEvaluator() private val sharedPreferences: SharedPreferences + private lateinit var suiteThread: Thread + init { for (i in testList.indices) { - iDToPositionMap[testList[i].id] = i + positionToIDMap[i] = testList[i].id + iDToResultsMap[testList[i].id] = TestCaseResults() } - context.applicationContext sharedPreferences = context.getSharedPreferences(MediaAppTestingActivity.SHARED_PREF_KEY_SUITE_CONFIG, Context.MODE_PRIVATE) } - val callback = { result: TestResult, testId: Int, testLogs: ArrayList -> - val index = iDToPositionMap[testId] - Log.d(TAG, "Finished Test: " + testList[index!!].name + " with result " + result) - testList[index].testResult = result - testList[index].testLogs = testLogs - mHandler.post { resultsAdapter.notifyItemChanged(index) } + private val callback = { result: TestResult, testId: Int, testLogs: ArrayList -> + val testCaseResults = iDToResultsMap[testId]!! + Log.d(TAG, "Finished Test: $testId with result $result") + testCaseResults.totalRuns += 1 + when (result) { + TestResult.PASS -> { + testCaseResults.numPassing += 1 + testCaseResults.passingLogs.add(testLogs) + } + TestResult.FAIL -> { + testCaseResults.failingLogs.add(testLogs) + } + TestResult.OPTIONAL_FAIL -> { + testCaseResults.failingLogs.add(testLogs) + } + TestResult.CONFIG_REQUIRED -> { + testCaseResults.totalRuns -= 1 + } + else -> { + Log.d(TAG, "There was an error with $testId return code") + } + } testSemaphore.release() } @@ -93,48 +111,108 @@ class MediaAppTestSuite(testSuiteName: String, testSuiteDescription: String, tes } fun runSuite(numIter: Int) { - suiteRunning = true resetTests() - thread(start = true) { + var progressBar :ProgressBar + val dialog = Dialog(context) + dialog.apply { + setCancelable(false) + requestWindowFeature(Window.FEATURE_NO_TITLE) + setContentView(R.layout.run_suite_iter_dialog) + progressBar = findViewById(R.id.suite_iter_progress_bar).apply { + max = numIter * singleSuiteTestList.size + progress = -1 + } + findViewById