code:
package de.marmaro.krt.ffupdater.app.impl

import android.content.Context
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import com.google.gson.Gson
import de.marmaro.krt.ffupdater.R
import de.marmaro.krt.ffupdater.app.App
import de.marmaro.krt.ffupdater.app.impl.fetch.ApiConsumer
import de.marmaro.krt.ffupdater.app.impl.fetch.github.GithubConsumer
import de.marmaro.krt.ffupdater.device.ABI
import de.marmaro.krt.ffupdater.device.DeviceEnvironment
import io.mockk.*
import io.mockk.impl.annotations.MockK
import kotlinx.coroutines.runBlocking
import org.junit.*
import org.junit.Assert.*
import java.io.FileReader
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter

class LockwiseIT {
    @MockK
    lateinit var context: Context

    @MockK
    lateinit var packageManager: PackageManager

    @Before
    fun setUp() {
        MockKAnnotations.init(this, relaxUnitFun = true)
        every { context.packageManager } returns packageManager
        every { context.getString(R.string.available_version, any()) } returns "/"
    }

    companion object {
        const val API_URL = "https://api.github.com/repos/mozilla-lockwise/lockwise-android/" +
                "releases"
        const val DOWNLOAD_URL = "https://github.com/mozilla-lockwise/lockwise-android/releases/" +
                "download"

        @JvmStatic
        @BeforeClass
        fun beforeTests() {
            mockkObject(ApiConsumer)
            mockkObject(DeviceEnvironment)
        }

        @JvmStatic
        @AfterClass
        fun afterTests() {
            unmockkObject(ApiConsumer)
            unmockkObject(DeviceEnvironment)
        }
    }

    private fun makeReleaseJsonObjectAvailableUnderUrl(fileName: String, url: String) {
        val path = "src/test/resources/de/marmaro/krt/ffupdater/app/impl/Lockwise/$fileName"
        coEvery {
            ApiConsumer.consumeNetworkResource(url, GithubConsumer.Release::class)
        } returns Gson().fromJson(FileReader(path), GithubConsumer.Release::class.java)
    }

    private fun makeReleaseJsonArrayAvailableUnderUrl(fileName: String, url: String) {
        val path = "src/test/resources/de/marmaro/krt/ffupdater/app/impl/Lockwise//$fileName"
        coEvery {
            ApiConsumer.consumeNetworkResource(url, Array<GithubConsumer.Release>::class)
        } returns Gson().fromJson(FileReader(path), Array<GithubConsumer.Release>::class.java)
    }

    @Test
    fun updateCheck_latestRelease_checkDownloadUrlForABI() {
        makeReleaseJsonObjectAvailableUnderUrl("latest.json", "$API_URL/latest")
        val packageInfo = PackageInfo()
        packageInfo.versionName = "4.0.3"
        every {
            packageManager.getPackageInfo(App.LOCKWISE.detail.packageName, any())
        } returns packageInfo

        for (abi in ABI.values()) {
            every { DeviceEnvironment.abis } returns listOf(abi)
            val actual = runBlocking {
                Lockwise().updateCheck(context).downloadUrl
            }
            val expected = "$DOWNLOAD_URL/release-v4.0.3/lockbox-app-release-6584-signed.apk"
            assertEquals(expected, actual)
        }
    }

    @Test
    fun updateCheck_latestRelease_updateCheck() {
        makeReleaseJsonObjectAvailableUnderUrl("latest.json", "$API_URL/latest")
        val packageInfo = PackageInfo()
        every {
            packageManager.getPackageInfo(App.LOCKWISE.detail.packageName, any())
        } returns packageInfo
        every { DeviceEnvironment.abis } returns listOf(ABI.ARMEABI_V7A)

        // installed app is up-to-date
        runBlocking {
            packageInfo.versionName = "4.0.3"
            val actual = Lockwise().updateCheck(context)
            assertFalse(actual.isUpdateAvailable)
            assertEquals("4.0.3", actual.version)
            assertEquals(37188004L, actual.fileSizeBytes)
            assertEquals(
                ZonedDateTime.parse("2020-12-10T18:40:16Z", DateTimeFormatter.ISO_ZONED_DATE_TIME),
                actual.publishDate
            )
        }

        // installed app is old
        runBlocking {
            packageInfo.versionName = "4.0.0"
            val actual = Lockwise().updateCheck(context)
            assertTrue(actual.isUpdateAvailable)
            assertEquals("4.0.3", actual.version)
            assertEquals(37188004L, actual.fileSizeBytes)
            assertEquals(
                ZonedDateTime.parse("2020-12-10T18:40:16Z", DateTimeFormatter.ISO_ZONED_DATE_TIME),
                actual.publishDate
            )
        }
    }

    @Test
    fun updateCheck_2releases_checkDownloadUrlForABI() {
        makeReleaseJsonObjectAvailableUnderUrl("2releases_latest.json", "$API_URL/latest")
        makeReleaseJsonArrayAvailableUnderUrl("2releases_page1.json", "$API_URL?per_page=5&page=1")
        val packageInfo = PackageInfo()
        every {
            packageManager.getPackageInfo(App.LOCKWISE.detail.packageName, any())
        } returns packageInfo

        for (abi in ABI.values()) {
            every { DeviceEnvironment.abis } returns listOf(abi)
            val actual = runBlocking {
                Lockwise().updateCheck(context).downloadUrl
            }
            val expected = "$DOWNLOAD_URL/release-v3.3.0-RC-2/lockbox-app-release-5784-signed.apk"
            assertEquals(expected, actual)
        }
    }

    @Test
    fun updateCheck_2releases_updateCheck() {
        makeReleaseJsonObjectAvailableUnderUrl("2releases_latest.json", "$API_URL/latest")
        makeReleaseJsonArrayAvailableUnderUrl("2releases_page1.json", "$API_URL?per_page=5&page=1")
        val packageInfo = PackageInfo()
        every {
            packageManager.getPackageInfo(App.LOCKWISE.detail.packageName, any())
        } returns packageInfo
        every { DeviceEnvironment.abis } returns listOf(ABI.ARMEABI_V7A)

        // installed app is up-to-date
        runBlocking {
            packageInfo.versionName = "3.3.0"
            val actual = Lockwise().updateCheck(context)
            assertFalse(actual.isUpdateAvailable)
            assertEquals("3.3.0", actual.version)
            assertEquals(19367045L, actual.fileSizeBytes)
            assertEquals(
                ZonedDateTime.parse("2019-12-13T19:34:17Z", DateTimeFormatter.ISO_ZONED_DATE_TIME),
                actual.publishDate
            )
        }

        // installed app is old
        runBlocking {
            packageInfo.versionName = "3.2.0"
            val actual = Lockwise().updateCheck(context)
            assertTrue(actual.isUpdateAvailable)
            assertEquals("3.3.0", actual.version)
            assertEquals(19367045L, actual.fileSizeBytes)
            assertEquals(
                ZonedDateTime.parse("2019-12-13T19:34:17Z", DateTimeFormatter.ISO_ZONED_DATE_TIME),
                actual.publishDate
            )
        }
    }
}


code:
package de.marmaro.krt.ffupdater.app.impl

import android.content.Context
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import com.google.gson.Gson
import de.marmaro.krt.ffupdater.R
import de.marmaro.krt.ffupdater.app.App
import de.marmaro.krt.ffupdater.app.impl.fetch.ApiConsumer
import de.marmaro.krt.ffupdater.app.impl.fetch.github.GithubConsumer
import de.marmaro.krt.ffupdater.device.ABI
import de.marmaro.krt.ffupdater.device.DeviceEnvironment
import io.mockk.*
import io.mockk.impl.annotations.MockK
import kotlinx.coroutines.runBlocking
import org.junit.*
import java.io.FileReader

class UngoogledChromiumIT {
    @MockK
    lateinit var context: Context

    @MockK
    lateinit var packageManager: PackageManager
    private var packageInfo = PackageInfo()

    @Before
    fun setUp() {
        MockKAnnotations.init(this, relaxUnitFun = true)
        every { context.packageManager } returns packageManager
        every { context.getString(R.string.available_version, any()) } returns "/"
        every {
            packageManager.getPackageInfo(App.UNGOOGLED_CHROMIUM.detail.packageName, any())
        } returns packageInfo
    }

    companion object {
        const val API_URL = "https://api.github.com/repos/ungoogled-software/ungoogled-chromium-android/" +
                "releases?per_page=2&page=1"
        const val DOWNLOAD_URL =
            "https://github.com/ungoogled-software/ungoogled-chromium-android/releases/" +
                    "download/95.0.4638.74-1"

        @JvmStatic
        @BeforeClass
        fun beforeTests() {
            mockkObject(ApiConsumer)
            mockkObject(DeviceEnvironment)
        }

        @JvmStatic
        @AfterClass
        fun afterTests() {
            unmockkObject(ApiConsumer)
            unmockkObject(DeviceEnvironment)
        }
    }

    private fun makeReleasesJsonAvailable() {
        val path =
            "src/test/resources/de/marmaro/krt/ffupdater/app/impl/UngoogledChromium/releases?per_page=2.json"
        coEvery {
            ApiConsumer.consumeNetworkResource(API_URL, Array<GithubConsumer.Release>::class)
        } returns Gson().fromJson(FileReader(path), Array<GithubConsumer.Release>::class.java)
    }

    @Test
    fun updateCheck_armeabiv7a_checkVersionAndDownloadLink() {
        makeReleasesJsonAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.ARMEABI_V7A)
        val actual = runBlocking { UngoogledChromium().updateCheck(context) }
        Assert.assertEquals("95.0.4638.74", actual.version)
        Assert.assertEquals("$DOWNLOAD_URL/ChromeModernPublic_arm.apk", actual.downloadUrl)
    }

    @Test
    fun updateCheck_arm64v8a_checkVersionAndDownloadLink() {
        makeReleasesJsonAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.ARM64_V8A)
        val actual = runBlocking { UngoogledChromium().updateCheck(context) }
        Assert.assertEquals("95.0.4638.74", actual.version)
        Assert.assertEquals("$DOWNLOAD_URL/ChromeModernPublic_arm64.apk", actual.downloadUrl)
    }

    @Test
    fun updateCheck_x86_checkVersionAndDownloadLink() {
        makeReleasesJsonAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.X86)
        val actual = runBlocking { UngoogledChromium().updateCheck(context) }
        Assert.assertEquals("95.0.4638.74", actual.version)
        Assert.assertEquals("$DOWNLOAD_URL/ChromeModernPublic_x86.apk", actual.downloadUrl)
    }

    @Test
    fun updateCheck_armeabiv7a_latestVersionIsInstalled() {
        makeReleasesJsonAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.ARMEABI_V7A)
        packageInfo.versionName = "95.0.4638.74"
        val actual = runBlocking { UngoogledChromium().updateCheck(context) }
        Assert.assertFalse(actual.isUpdateAvailable)
    }

    @Test
    fun updateCheck_armeabiv7a_oldVersionIsInstalled() {
        makeReleasesJsonAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.ARMEABI_V7A)
        packageInfo.versionName = "95.0.4638.54"
        val actual = runBlocking { UngoogledChromium().updateCheck(context) }
        Assert.assertTrue(actual.isUpdateAvailable)
    }

    @Test
    fun updateCheck_arm64v8a_latestVersionIsInstalled() {
        makeReleasesJsonAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.ARM64_V8A)
        packageInfo.versionName = "95.0.4638.74"
        val actual = runBlocking { UngoogledChromium().updateCheck(context) }
        Assert.assertFalse(actual.isUpdateAvailable)
    }

    @Test
    fun updateCheck_arm64v8a_oldVersionIsInstalled() {
        makeReleasesJsonAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.ARM64_V8A)
        packageInfo.versionName = "95.0.4638.54"
        val actual = runBlocking { UngoogledChromium().updateCheck(context) }
        Assert.assertTrue(actual.isUpdateAvailable)
    }

    @Test
    fun updateCheck_x86_latestVersionIsInstalled() {
        makeReleasesJsonAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.X86)
        packageInfo.versionName = "95.0.4638.74"
        val actual = runBlocking { UngoogledChromium().updateCheck(context) }
        Assert.assertFalse(actual.isUpdateAvailable)
    }

    @Test
    fun updateCheck_x86_oldVersionIsInstalled() {
        makeReleasesJsonAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.X86)
        packageInfo.versionName = "95.0.4638.54"
        val actual = runBlocking { UngoogledChromium().updateCheck(context) }
        Assert.assertTrue(actual.isUpdateAvailable)
    }
}

repo_name: BadStarOne/ffupdater

license: mit


code:
package de.marmaro.krt.ffupdater.app.impl

import android.content.Context
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import de.marmaro.krt.ffupdater.R
import de.marmaro.krt.ffupdater.app.App
import de.marmaro.krt.ffupdater.app.impl.fetch.ApiConsumer
import de.marmaro.krt.ffupdater.device.ABI
import de.marmaro.krt.ffupdater.device.DeviceEnvironment
import io.mockk.*
import io.mockk.impl.annotations.MockK
import kotlinx.coroutines.runBlocking
import org.junit.AfterClass
import org.junit.Assert.*
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test
import java.io.File

class VivaldiIT {
    @MockK
    lateinit var context: Context

    @MockK
    lateinit var packageManager: PackageManager
    private var packageInfo = PackageInfo()

    @Before
    fun setUp() {
        MockKAnnotations.init(this, relaxUnitFun = true)
        every { context.packageManager } returns packageManager
        every { context.getString(R.string.available_version, any()) } returns "/"
        every {
            packageManager.getPackageInfo(App.VIVALDI.detail.packageName, any())
        } returns packageInfo
    }

    companion object {
        @JvmStatic
        @BeforeClass
        fun beforeTests() {
            mockkObject(ApiConsumer)
            mockkObject(DeviceEnvironment)
        }

        @JvmStatic
        @AfterClass
        fun afterTests() {
            unmockkObject(ApiConsumer)
            unmockkObject(DeviceEnvironment)
        }
    }

    private fun makeHtmlAvailable() {
        val path = "src/test/resources/de/marmaro/krt/ffupdater/app/impl/Vivaldi/download.html"
        coEvery {
            ApiConsumer.consumeNetworkResource("https://vivaldi.com/download/", String::class)
        } returns File(path).readText()
    }

    @Test
    fun updateCheck_armeabiv7a_checkVersionAndDownloadLink() {
        makeHtmlAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.ARMEABI_V7A)
        val actual = runBlocking { Vivaldi().updateCheck(context) }
        assertEquals("4.3.2439.61", actual.version)
        assertEquals(
            "https://downloads.vivaldi.com/stable/Vivaldi.4.3.2439.61_armeabi-v7a.apk",
            actual.downloadUrl
        )
    }

    @Test
    fun updateCheck_arm64v8a_checkVersionAndDownloadLink() {
        makeHtmlAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.ARM64_V8A)
        val actual = runBlocking { Vivaldi().updateCheck(context) }
        assertEquals("4.3.2439.61", actual.version)
        assertEquals(
            "https://downloads.vivaldi.com/stable/Vivaldi.4.3.2439.61_arm64-v8a.apk",
            actual.downloadUrl
        )
    }

    @Test
    fun updateCheck_x8664_checkVersionAndDownloadLink() {
        makeHtmlAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.X86_64)
        val actual = runBlocking { Vivaldi().updateCheck(context) }
        assertEquals("4.3.2439.61", actual.version)
        assertEquals(
            "https://downloads.vivaldi.com/stable/Vivaldi.4.3.2439.61_x86-64.apk",
            actual.downloadUrl
        )
    }

    @Test
    fun updateCheck_armeabiv7a_latestVersionIsInstalled() {
        makeHtmlAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.ARMEABI_V7A)
        packageInfo.versionName = "4.3.2439.61"
        val actual = runBlocking { Vivaldi().updateCheck(context) }
        assertFalse(actual.isUpdateAvailable)
    }

    @Test
    fun updateCheck_armeabiv7a_oldVersionIsInstalled() {
        makeHtmlAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.ARMEABI_V7A)
        packageInfo.versionName = "4.3.2439.43"
        val actual = runBlocking { Vivaldi().updateCheck(context) }
        assertTrue(actual.isUpdateAvailable)
    }

    @Test
    fun updateCheck_arm64v8a_latestVersionIsInstalled() {
        makeHtmlAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.ARM64_V8A)
        packageInfo.versionName = "4.3.2439.61"
        val actual = runBlocking { Vivaldi().updateCheck(context) }
        assertFalse(actual.isUpdateAvailable)
    }

    @Test
    fun updateCheck_arm64v8a_oldVersionIsInstalled() {
        makeHtmlAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.ARM64_V8A)
        packageInfo.versionName = "4.3.2439.43"
        val actual = runBlocking { Vivaldi().updateCheck(context) }
        assertTrue(actual.isUpdateAvailable)
    }

    @Test
    fun updateCheck_x8664_latestVersionIsInstalled() {
        makeHtmlAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.X86_64)
        packageInfo.versionName = "4.3.2439.61"
        val actual = runBlocking { Vivaldi().updateCheck(context) }
        assertFalse(actual.isUpdateAvailable)
    }

    @Test
    fun updateCheck_x8664_oldVersionIsInstalled() {
        makeHtmlAvailable()
        every { DeviceEnvironment.abis } returns listOf(ABI.X86_64)
        packageInfo.versionName = "4.3.2439.43"
        val actual = runBlocking { Vivaldi().updateCheck(context) }
        assertTrue(actual.isUpdateAvailable)
    }
}


code:
package de.marmaro.krt.ffupdater.security

import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.content.pm.PackageManager.GET_SIGNATURES
import android.content.pm.Signature
import de.marmaro.krt.ffupdater.app.App
import io.mockk.MockKAnnotations
import io.mockk.every
import io.mockk.impl.annotations.MockK
import kotlinx.coroutines.runBlocking
import org.junit.AfterClass
import org.junit.Assert.*
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test
import java.io.File
import kotlin.io.path.createTempFile
import kotlin.random.Random

class FingerprintValidatorTest {

    @MockK
    lateinit var packageManager: PackageManager

    @MockK
    lateinit var signature: Signature
    private lateinit var fingerprintValidator: FingerprintValidator

    companion object {
        lateinit var signatureBytes: ByteArray
        @Suppress("SpellCheckingInspection")
        const val signatureFingerprint = "a78b62a5165b4494b2fead9e76a280d22d937fee6251aece599446b2ea319b04"
        val file = createTempFile("FIREFOX_RELEASE__2021_04_30__244384144", ".apk").toFile()!!

        @BeforeClass
        @JvmStatic
        fun setUpStatic() {
            val path = "src/test/resources/de/marmaro/krt/ffupdater/security/FirefoxReleaseAppSignature.bin"
            signatureBytes = File(path).readBytes()
        }

        @AfterClass
        @JvmStatic
        fun tearDownClass() {
            file.delete()
        }
    }

    @Before
    fun setUp() {
        MockKAnnotations.init(this, relaxUnitFun = true)
        fingerprintValidator = FingerprintValidator(packageManager)
    }

    @Test
    fun checkApkFile_withCorrectSignature_returnValid() {
        val packageInfo = PackageInfo()
        packageInfo.signatures = arrayOf(signature)
        every { signature.toByteArray() } returns signatureBytes
        every {
            packageManager.getPackageArchiveInfo(file.absolutePath, GET_SIGNATURES)
        } returns packageInfo

        val actual = runBlocking { fingerprintValidator.checkApkFile(file, App.FIREFOX_RELEASE) }
        assertTrue(actual.isValid)
        assertEquals(signatureFingerprint, actual.hexString)
        assertEquals(signatureFingerprint, App.FIREFOX_RELEASE.detail.signatureHash)
    }

    @Test
    fun checkApkFile_withWrongApp_returnInvalid() {
        val packageInfo = PackageInfo()
        packageInfo.signatures = arrayOf(signature)
        every { signature.toByteArray() } returns signatureBytes
        every {
            packageManager.getPackageArchiveInfo(file.absolutePath, GET_SIGNATURES)
        } returns packageInfo

        val actual = runBlocking { fingerprintValidator.checkApkFile(file, App.BRAVE) }
        assertFalse(actual.isValid)
    }

    @Test(expected = FingerprintValidator.UnableCheckApkException::class)
    fun checkApkFile_withIncorrectSignature_throwException() {
        val packageInfo = PackageInfo()
        packageInfo.signatures = arrayOf(signature)
        every { signature.toByteArray() } returns Random.nextBytes(938)
        every {
            packageManager.getPackageArchiveInfo(file.absolutePath, GET_SIGNATURES)
        } returns packageInfo
        runBlocking { fingerprintValidator.checkApkFile(file, App.FIREFOX_RELEASE) }
    }

    @Test
    fun checkInstalledApp_withFirefoxRelease_returnValid() {
        val packageInfo = PackageInfo()
        packageInfo.signatures = arrayOf(signature)
        every { signature.toByteArray() } returns signatureBytes
        every {
            packageManager.getPackageInfo(App.FIREFOX_RELEASE.detail.packageName, GET_SIGNATURES)
        } returns packageInfo
        val actual = runBlocking {
            fingerprintValidator.checkInstalledApp(App.FIREFOX_RELEASE)
        }
        assertTrue(actual.isValid)
        assertEquals(signatureFingerprint, actual.hexString)
        assertEquals(signatureFingerprint, App.FIREFOX_RELEASE.detail.signatureHash)
    }

    @Test
    fun checkInstalledApp_withAppIsNotInstalled_returnInvalid() {
        val packageInfo = PackageInfo()
        packageInfo.signatures = arrayOf(signature)
        every {
            packageManager.getPackageInfo(App.LOCKWISE.detail.packageName, GET_SIGNATURES)
        } throws PackageManager.NameNotFoundException()
        val actual = runBlocking {
            fingerprintValidator.checkInstalledApp(App.LOCKWISE)
        }
        assertFalse(actual.isValid)
    }

    @Test(expected = FingerprintValidator.UnableCheckApkException::class)
    fun checkInstalledApp_withInvalidCertificate_throwException() {
        val packageInfo = PackageInfo()
        packageInfo.signatures = arrayOf(signature)
        every { signature.toByteArray() } returns Random.nextBytes(938)
        every {
            packageManager.getPackageInfo(App.FIREFOX_RELEASE.detail.packageName, GET_SIGNATURES)
        } returns packageInfo
        runBlocking {
            fingerprintValidator.checkInstalledApp(App.FIREFOX_RELEASE)
        }
    }
}


code:
package de.marmaro.krt.ffupdater.settings

import android.content.Context
import android.content.SharedPreferences
import androidx.appcompat.app.AppCompatDelegate.*
import com.github.ivanshafran.sharedpreferencesmock.SPMockBuilder
import de.marmaro.krt.ffupdater.app.App
import de.marmaro.krt.ffupdater.device.DeviceEnvironment
import io.mockk.MockKAnnotations
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.mockkObject
import io.mockk.unmockkObject
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.`is`
import org.hamcrest.Matchers.empty
import org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder
import org.junit.AfterClass
import org.junit.Assert.*
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test
import java.time.Duration

class SettingsHelperTest {

    @MockK
    lateinit var context: Context
    private lateinit var sharedPreferences: SharedPreferences

    @Before
    fun setUp() {
        MockKAnnotations.init(this, relaxUnitFun = true)
        sharedPreferences = SPMockBuilder().createSharedPreferences()
        every { context.getSharedPreferences(any(), any()) } returns sharedPreferences
        every { context.packageName } returns "de.marmaro.krt.ffupdater"
    }

    companion object {
        @JvmStatic
        @BeforeClass
        fun beforeTests() {
            mockkObject(DeviceEnvironment)
        }

        @JvmStatic
        @AfterClass
        fun afterTests() {
            unmockkObject(DeviceEnvironment)
        }
    }

    @Test
    fun getAutomaticCheck_userHasNotChangedSetting_returnDefaultValueTrue() {
        assertTrue(SettingsHelper(context).automaticCheck)
    }

    @Test
    fun getAutomaticCheck_userEnabledIt_returnTrue() {
        sharedPreferences.edit().putBoolean("automaticCheck", true).commit()
        assertTrue(SettingsHelper(context).automaticCheck)
    }

    @Test
    fun getAutomaticCheck_userDisabledIt_returnFalse() {
        sharedPreferences.edit().putBoolean("automaticCheck", false).commit()
        assertFalse(SettingsHelper(context).automaticCheck)
    }

    private val defaultCheckIntervalDuration = Duration.ofHours(6)

    @Test
    fun getCheckInterval_userHasNotChangedSetting_returnDefaultValue() {
        assertEquals(defaultCheckIntervalDuration, SettingsHelper(context).checkInterval)
    }

    @Test
    fun getCheckInterval_withInvalidStoredData_null_returnDefaultValue() {
        sharedPreferences.edit().putString("checkInterval", null).commit()
        assertEquals(defaultCheckIntervalDuration, SettingsHelper(context).checkInterval)
    }

    @Test
    fun getCheckInterval_withInvalidStoredData_emptyString_returnDefaultValue() {
        sharedPreferences.edit().putString("checkInterval", "").commit()
        assertEquals(defaultCheckIntervalDuration, SettingsHelper(context).checkInterval)
    }

    @Test
    fun getCheckInterval_withInvalidStoredData_text_returnDefaultValue() {
        sharedPreferences.edit().putString("checkInterval", "lorem ipsum").commit()
        assertEquals(defaultCheckIntervalDuration, SettingsHelper(context).checkInterval)
    }

    @Test
    fun getCheckInterval_withPositiveValue_returnValue() {
        sharedPreferences.edit().putString("checkInterval", "42").commit()
        assertEquals(Duration.ofMinutes(42), SettingsHelper(context).checkInterval)
    }

    @Test
    fun getCheckInterval_withNegativeValue_returnDefaultValue() {
        sharedPreferences.edit().putString("checkInterval", "-1").commit()
        assertEquals(defaultCheckIntervalDuration, SettingsHelper(context).checkInterval)
    }

    @Test
    fun getCheckInterval_withTooHighNumber_returnDefaultValue() {
        sharedPreferences.edit().putString("checkInterval", "57600" /*40 days*/).commit()
        assertEquals(defaultCheckIntervalDuration, SettingsHelper(context).checkInterval)
    }

    @Test
    fun getDisableApps_userHasNotChangedSetting_returnEmptySet() {
        assertTrue(SettingsHelper(context).disabledApps.isEmpty())
    }

    @Test
    fun getDisableApps_withValue_null_returnEmptySet() {
        sharedPreferences.edit().putStringSet("disabledApps", null).commit()
        assertTrue(SettingsHelper(context).disabledApps.isEmpty())
    }

    @Test
    fun getDisableApps_withEmptySet_returnEmptySet() {
        sharedPreferences.edit().putStringSet("disabledApps", setOf()).commit()
        assertTrue(SettingsHelper(context).disabledApps.isEmpty())
    }

    @Test
    fun getDisableApps_withOneApp_Brave_returnApps() {
        sharedPreferences.edit().putStringSet("disableApps", setOf("BRAVE")).commit()
        assertThat(SettingsHelper(context).disabledApps, containsInAnyOrder(App.BRAVE))
    }

    @Test
    fun getDisableApps_withOneApp_FirefoxBeta_returnApps() {
        sharedPreferences.edit().putStringSet("disableApps", setOf("FIREFOX_BETA")).commit()
        assertThat(SettingsHelper(context).disabledApps, containsInAnyOrder(App.FIREFOX_BETA))
    }

    @Test
    fun getDisableApps_withOneApp_FirefoxFocus_returnApps() {
        sharedPreferences.edit().putStringSet("disableApps", setOf("FIREFOX_FOCUS")).commit()
        assertThat(SettingsHelper(context).disabledApps, containsInAnyOrder(App.FIREFOX_FOCUS))
    }

    @Test
    fun getDisableApps_withOneApp_FirefoxKlar_returnApps() {
        sharedPreferences.edit().putStringSet("disableApps", setOf("FIREFOX_KLAR")).commit()
        assertThat(SettingsHelper(context).disabledApps, containsInAnyOrder(App.FIREFOX_KLAR))
    }

    @Test
    fun getDisableApps_withOneApp_FirefoxNightly_returnApps() {
        sharedPreferences.edit().putStringSet("disableApps", setOf("FIREFOX_NIGHTLY")).commit()
        assertThat(SettingsHelper(context).disabledApps, containsInAnyOrder(App.FIREFOX_NIGHTLY))
    }

    @Test
    fun getDisableApps_withOneApp_FirefoxRelease_returnApps() {
        sharedPreferences.edit().putStringSet("disableApps", setOf("FIREFOX_RELEASE")).commit()
        assertThat(SettingsHelper(context).disabledApps, containsInAnyOrder(App.FIREFOX_RELEASE))
    }

    @Test
    fun getDisableApps_withOneApp_Iceraven_returnApps() {
        sharedPreferences.edit().putStringSet("disableApps", setOf("ICERAVEN")).commit()
        assertThat(SettingsHelper(context).disabledApps, containsInAnyOrder(App.ICERAVEN))
    }

    @Test
    fun getDisableApps_withOneApp_Lockwise_returnApps() {
        sharedPreferences.edit().putStringSet("disableApps", setOf("LOCKWISE")).commit()
        assertThat(SettingsHelper(context).disabledApps, containsInAnyOrder(App.LOCKWISE))
    }

    @Test
    fun getDisableApps_withInvalidApps_ignoreThem() {
        sharedPreferences.edit().putStringSet("disableApps", setOf("invalid")).commit()
        assertThat(SettingsHelper(context).disabledApps, `is`(empty()))
    }

    @Test
    fun getDisableApps_withAllApps_returnApps() {
        sharedPreferences.edit().putStringSet(
            "disableApps",
            setOf(
                "BRAVE",
                "FIREFOX_BETA",
                "FIREFOX_FOCUS",
                "FIREFOX_KLAR",
                "FIREFOX_NIGHTLY",
                "FIREFOX_RELEASE",
                "ICERAVEN",
                "LOCKWISE",
                "BROMITE",
                "VIVALDI",
                "UNGOOGLED_CHROMIUM"
            )
        ).commit()
        assertTrue(SettingsHelper(context).disabledApps.containsAll(App.values().toList()))
    }

    @Test
    fun getDisableApps_withRemovedApps_returnEmptyList() {
        sharedPreferences.edit().putStringSet(
            "disableApps", setOf(
                "FIREFOX_LITE",
                "FIREFOX_NIGHTLY"
            )
        ).commit()
        assertTrue(SettingsHelper(context).disabledApps.contains(App.FIREFOX_NIGHTLY))
    }

    @Test
    fun getThemePreference_userHasNotChangedSetting_AndroidPAndBelow_returnDefaultValue() {
        every { DeviceEnvironment.supportsAndroid10() } returns false
        assertEquals(MODE_NIGHT_AUTO_BATTERY, SettingsHelper(context).getThemePreference())
    }

    @Test
    fun getThemePreference_userHasNotChangedSetting_AndroidQAndHigher_returnDefaultValue() {
        every { DeviceEnvironment.supportsAndroid10() } returns true
        assertEquals(MODE_NIGHT_FOLLOW_SYSTEM, SettingsHelper(context).getThemePreference())
    }

    @Test
    fun getThemePreference_withInvalidValue_null_returnDefault() {
        sharedPreferences.edit().putString("themePreference", null).commit()

        every { DeviceEnvironment.supportsAndroid10() } returns false
        assertEquals(MODE_NIGHT_AUTO_BATTERY, SettingsHelper(context).getThemePreference())

        every { DeviceEnvironment.supportsAndroid10() } returns true
        assertEquals(MODE_NIGHT_FOLLOW_SYSTEM, SettingsHelper(context).getThemePreference())
    }

    @Test
    fun getThemePreference_withInvalidValue_emptyString_returnDefault() {
        sharedPreferences.edit().putString("themePreference", "").commit()

        every { DeviceEnvironment.supportsAndroid10() } returns false
        assertEquals(MODE_NIGHT_AUTO_BATTERY, SettingsHelper(context).getThemePreference())

        every { DeviceEnvironment.supportsAndroid10() } returns true
        assertEquals(MODE_NIGHT_FOLLOW_SYSTEM, SettingsHelper(context).getThemePreference())
    }

    @Test
    fun getThemePreference_withInvalidValue_text_returnDefault() {
        sharedPreferences.edit().putString("themePreference", "lorem ipsum").commit()

        every { DeviceEnvironment.supportsAndroid10() } returns false
        assertEquals(MODE_NIGHT_AUTO_BATTERY, SettingsHelper(context).getThemePreference())

        every { DeviceEnvironment.supportsAndroid10() } returns true
        assertEquals(MODE_NIGHT_FOLLOW_SYSTEM, SettingsHelper(context).getThemePreference())
    }

    @Test
    fun getThemePreference_withInvalidValue_nonExistingNumber_returnDefault() {
        sharedPreferences.edit().putString("themePreference", "6").commit()

        every { DeviceEnvironment.supportsAndroid10() } returns false
        assertEquals(MODE_NIGHT_AUTO_BATTERY, SettingsHelper(context).getThemePreference())

        every { DeviceEnvironment.supportsAndroid10() } returns true
        assertEquals(MODE_NIGHT_FOLLOW_SYSTEM, SettingsHelper(context).getThemePreference())
    }

    @Test
    fun getThemePreference_withValidValue_MODE_NIGHT_FOLLOW_SYSTEM_returnValue() {
        sharedPreferences.edit().putString("themePreference", "-1").commit()

        every { DeviceEnvironment.supportsAndroid10() } returns false
        assertEquals(MODE_NIGHT_FOLLOW_SYSTEM, SettingsHelper(context).getThemePreference())

        every { DeviceEnvironment.supportsAndroid10() } returns true
        assertEquals(MODE_NIGHT_FOLLOW_SYSTEM, SettingsHelper(context).getThemePreference())
    }

    @Test
    fun getThemePreference_withValidValue_MODE_NIGHT_NO_returnValue() {
        sharedPreferences.edit().putString("themePreference", "1").commit()

        every { DeviceEnvironment.supportsAndroid10() } returns false
        assertEquals(MODE_NIGHT_NO, SettingsHelper(context).getThemePreference())

        every { DeviceEnvironment.supportsAndroid10() } returns true
        assertEquals(MODE_NIGHT_NO, SettingsHelper(context).getThemePreference())
    }

    @Test
    fun getThemePreference_withValidValue_MODE_NIGHT_YES_returnValue() {
        sharedPreferences.edit().putString("themePreference", "2").commit()

        every { DeviceEnvironment.supportsAndroid10() } returns false
        assertEquals(MODE_NIGHT_YES, SettingsHelper(context).getThemePreference())

        every { DeviceEnvironment.supportsAndroid10() } returns true
        assertEquals(MODE_NIGHT_YES, SettingsHelper(context).getThemePreference())
    }

    @Test
    fun getThemePreference_withValidValue_MODE_NIGHT_AUTO_BATTERY_returnValue() {
        sharedPreferences.edit().putString("themePreference", "3").commit()

        every { DeviceEnvironment.supportsAndroid10() } returns false
        assertEquals(MODE_NIGHT_AUTO_BATTERY, SettingsHelper(context).getThemePreference())

        every { DeviceEnvironment.supportsAndroid10() } returns true
        assertEquals(MODE_NIGHT_AUTO_BATTERY, SettingsHelper(context).getThemePreference())
    }
}


code:
package de.marmaro.krt.ffupdater.utils

import android.os.Build
import org.junit.Assert.assertEquals
import org.junit.Test

class UtilsTest {

    @Test
    fun getVersionAndCodenameForApiLevel_withAndroidR_returnCorrectText() {
        assertEquals("11 (R)", AndroidVersionCodes.getVersionForApiLevel(Build.VERSION_CODES.R))
    }
}


Release v1.19.92

login: brave-browser-releases

type: User

target_commitish: master

content_type: application/octet-stream

state: uploaded

body:
# Android
Pick the APK file suitable for your device's architecture.

# iOS
`brave-core-ios.tgz` contains Brave core frameworks for iOS.

# Linux
`DEB` and `RPM` packages attached below, details at https://brave.com/linux

# macOS
`Brave-Browser-*.dmg` or `Brave-Browser-*.pkg` will install this version.

# Windows
`BraveBrowserSetup.exe` and `BraveBrowserSetup32.exe` will fetch and install the latest available version from our update servers.

# Release Notes

  - Upgraded Chromium to 88.0.4324.152. ([#13969](https://github.com/brave/brave-browser/issues/13969))


Bromite v90.0.4430.59

body: See [Changelog](https://github.com/bromite/bromite/blob/master/CHANGELOG.md).


code:
2021-07-22T13:48:04     INFO - Running scriptworker version 38.2.0
2021-07-22T13:48:04     INFO - build_task_dependencies scriptworker RoPvBDsmTTC2BNIQvsFmZA
2021-07-22T13:48:04     INFO - find_sorted_task_dependencies scriptworker RoPvBDsmTTC2BNIQvsFmZA
2021-07-22T13:48:04     INFO - found dependencies: [('scriptworker:parent', 'AN5CJA6vQ-GM0gk376U-Qg'), ('scriptworker:build', 'NFQtnriGRTyv-qvkmWJ-Mg')]
2021-07-22T13:48:04    DEBUG -  scriptworker:parent AN5CJA6vQ-GM0gk376U-Qg is docker-worker
2021-07-22T13:48:04    DEBUG -  makedirs(/app/workdir/cot/AN5CJA6vQ-GM0gk376U-Qg)
2021-07-22T13:48:04     INFO - build_task_dependencies scriptworker:parent AN5CJA6vQ-GM0gk376U-Qg
2021-07-22T13:48:04     INFO - find_sorted_task_dependencies scriptworker:parent AN5CJA6vQ-GM0gk376U-Qg
2021-07-22T13:48:04     INFO - found dependencies: [('scriptworker:parent:parent', 'AN5CJA6vQ-GM0gk376U-Qg')]
2021-07-22T13:48:04    DEBUG -  scriptworker:build NFQtnriGRTyv-qvkmWJ-Mg is docker-worker
2021-07-22T13:48:04    DEBUG -  makedirs(/app/workdir/cot/NFQtnriGRTyv-qvkmWJ-Mg)
2021-07-22T13:48:04     INFO - build_task_dependencies scriptworker:build NFQtnriGRTyv-qvkmWJ-Mg
2021-07-22T13:48:04     INFO - find_sorted_task_dependencies scriptworker:build NFQtnriGRTyv-qvkmWJ-Mg
2021-07-22T13:48:04     INFO - found dependencies: [('scriptworker:build:parent', 'AN5CJA6vQ-GM0gk376U-Qg'), ('scriptworker:build:docker-image', 'bcWUDOGKTlCWiAakcEa3NA')]
2021-07-22T13:48:04    DEBUG -  scriptworker:build:docker-image bcWUDOGKTlCWiAakcEa3NA is docker-worker
2021-07-22T13:48:04    DEBUG -  makedirs(/app/workdir/cot/bcWUDOGKTlCWiAakcEa3NA)
2021-07-22T13:48:04     INFO - build_task_dependencies scriptworker:build:docker-image bcWUDOGKTlCWiAakcEa3NA
2021-07-22T13:48:04     INFO - find_sorted_task_dependencies scriptworker:build:docker-image bcWUDOGKTlCWiAakcEa3NA
2021-07-22T13:48:04     INFO - found dependencies: [('scriptworker:build:docker-image:parent', 'fzQ7E273T7yAVtJbH1GMxQ')]
2021-07-22T13:48:04    DEBUG -  scriptworker:build:docker-image:parent fzQ7E273T7yAVtJbH1GMxQ is docker-worker
2021-07-22T13:48:04    DEBUG -  makedirs(/app/workdir/cot/fzQ7E273T7yAVtJbH1GMxQ)
2021-07-22T13:48:04     INFO - build_task_dependencies scriptworker:build:docker-image:parent fzQ7E273T7yAVtJbH1GMxQ
2021-07-22T13:48:04     INFO - find_sorted_task_dependencies scriptworker:build:docker-image:parent fzQ7E273T7yAVtJbH1GMxQ
2021-07-22T13:48:04     INFO - found dependencies: [('scriptworker:build:docker-image:parent:parent', 'fzQ7E273T7yAVtJbH1GMxQ')]
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/AN5CJA6vQ-GM0gk376U-Qg/artifacts/public%2Fchain-of-trust.json
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/AN5CJA6vQ-GM0gk376U-Qg/artifacts/public%2Fchain-of-trust.json.sig
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/NFQtnriGRTyv-qvkmWJ-Mg/artifacts/public%2Fchain-of-trust.json
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/NFQtnriGRTyv-qvkmWJ-Mg/artifacts/public%2Fchain-of-trust.json.sig
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/bcWUDOGKTlCWiAakcEa3NA/artifacts/public%2Fchain-of-trust.json
2021-07-22T13:48:04    DEBUG -  makedirs(/app/workdir/cot/bcWUDOGKTlCWiAakcEa3NA/./public)
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/bcWUDOGKTlCWiAakcEa3NA/artifacts/public%2Fchain-of-trust.json.sig
2021-07-22T13:48:04    DEBUG -  makedirs(/app/workdir/cot/AN5CJA6vQ-GM0gk376U-Qg/./public)
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/fzQ7E273T7yAVtJbH1GMxQ/artifacts/public%2Fchain-of-trust.json
2021-07-22T13:48:04    DEBUG -  makedirs(/app/workdir/cot/NFQtnriGRTyv-qvkmWJ-Mg/./public)
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/fzQ7E273T7yAVtJbH1GMxQ/artifacts/public%2Fchain-of-trust.json.sig
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04    DEBUG -  makedirs(/app/workdir/cot/fzQ7E273T7yAVtJbH1GMxQ/./public)
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04    DEBUG -  /app/workdir/cot/AN5CJA6vQ-GM0gk376U-Qg/./public/chain-of-trust.json downloaded; hash is c333b81cbf628fe48b6fd61b679c391a3316664cdfe84fbaa570a34c7f01c202
2021-07-22T13:48:04    DEBUG -  /app/workdir/cot/NFQtnriGRTyv-qvkmWJ-Mg/./public/chain-of-trust.json downloaded; hash is 1b7482e7f6baa88bbda250ee266626753153a5ee08515dd3036df5864980e92e
2021-07-22T13:48:04    DEBUG -  /app/workdir/cot/bcWUDOGKTlCWiAakcEa3NA/./public/chain-of-trust.json downloaded; hash is 678f68ad7ca72b718c2d8f4323081525810529198e5ec86f04e0e36ed507281f
2021-07-22T13:48:04    DEBUG -  /app/workdir/cot/fzQ7E273T7yAVtJbH1GMxQ/./public/chain-of-trust.json downloaded; hash is 05d2a8ab5714dbbab311fe015a51c2f61a8ae50c74d4fc17eebd55362197f719
2021-07-22T13:48:04    DEBUG -  Verifying the scriptworker:parent AN5CJA6vQ-GM0gk376U-Qg docker-worker ed25519 chain of trust signature
2021-07-22T13:48:04    DEBUG -  scriptworker:parent AN5CJA6vQ-GM0gk376U-Qg: ed25519 cot signature verified.
2021-07-22T13:48:04    DEBUG -  Verifying the scriptworker:build NFQtnriGRTyv-qvkmWJ-Mg docker-worker ed25519 chain of trust signature
2021-07-22T13:48:04    DEBUG -  scriptworker:build NFQtnriGRTyv-qvkmWJ-Mg: ed25519 cot signature verified.
2021-07-22T13:48:04    DEBUG -  Verifying the scriptworker:build:docker-image bcWUDOGKTlCWiAakcEa3NA docker-worker ed25519 chain of trust signature
2021-07-22T13:48:04    DEBUG -  scriptworker:build:docker-image bcWUDOGKTlCWiAakcEa3NA: ed25519 cot signature verified.
2021-07-22T13:48:04    DEBUG -  Verifying the scriptworker:build:docker-image:parent fzQ7E273T7yAVtJbH1GMxQ docker-worker ed25519 chain of trust signature
2021-07-22T13:48:04    DEBUG -  scriptworker:build:docker-image:parent fzQ7E273T7yAVtJbH1GMxQ: ed25519 cot signature verified.
2021-07-22T13:48:04    DEBUG -  Verifying public/actions.json is in AN5CJA6vQ-GM0gk376U-Qg cot artifacts...
2021-07-22T13:48:04     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/AN5CJA6vQ-GM0gk376U-Qg/artifacts/public%2Factions.json
2021-07-22T13:48:04    DEBUG -  Verifying public/parameters.yml is in AN5CJA6vQ-GM0gk376U-Qg cot artifacts...
2021-07-22T13:48:04     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/AN5CJA6vQ-GM0gk376U-Qg/artifacts/public%2Fparameters.yml
2021-07-22T13:48:04    DEBUG -  Verifying public/task-graph.json is in AN5CJA6vQ-GM0gk376U-Qg cot artifacts...
2021-07-22T13:48:04     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/AN5CJA6vQ-GM0gk376U-Qg/artifacts/public%2Ftask-graph.json
2021-07-22T13:48:04    DEBUG -  Verifying public/actions.json is in fzQ7E273T7yAVtJbH1GMxQ cot artifacts...
2021-07-22T13:48:04     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/fzQ7E273T7yAVtJbH1GMxQ/artifacts/public%2Factions.json
2021-07-22T13:48:04    DEBUG -  Verifying public/parameters.yml is in fzQ7E273T7yAVtJbH1GMxQ cot artifacts...
2021-07-22T13:48:04     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/fzQ7E273T7yAVtJbH1GMxQ/artifacts/public%2Fparameters.yml
2021-07-22T13:48:04    DEBUG -  Verifying public/task-graph.json is in fzQ7E273T7yAVtJbH1GMxQ cot artifacts...
2021-07-22T13:48:04     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/fzQ7E273T7yAVtJbH1GMxQ/artifacts/public%2Ftask-graph.json
2021-07-22T13:48:04    DEBUG -  Verifying public/build/arm64-v8a/target.apk is in NFQtnriGRTyv-qvkmWJ-Mg cot artifacts...
2021-07-22T13:48:04     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/NFQtnriGRTyv-qvkmWJ-Mg/artifacts/public%2Fbuild%2Farm64-v8a%2Ftarget.apk
2021-07-22T13:48:04    DEBUG -  Verifying public/build/armeabi-v7a/target.apk is in NFQtnriGRTyv-qvkmWJ-Mg cot artifacts...
2021-07-22T13:48:04     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/NFQtnriGRTyv-qvkmWJ-Mg/artifacts/public%2Fbuild%2Farmeabi-v7a%2Ftarget.apk
2021-07-22T13:48:04    DEBUG -  Verifying public/build/x86/target.apk is in NFQtnriGRTyv-qvkmWJ-Mg cot artifacts...
2021-07-22T13:48:04     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/NFQtnriGRTyv-qvkmWJ-Mg/artifacts/public%2Fbuild%2Fx86%2Ftarget.apk
2021-07-22T13:48:04    DEBUG -  Verifying public/build/x86_64/target.apk is in NFQtnriGRTyv-qvkmWJ-Mg cot artifacts...
2021-07-22T13:48:04     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/NFQtnriGRTyv-qvkmWJ-Mg/artifacts/public%2Fbuild%2Fx86_64%2Ftarget.apk
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/AN5CJA6vQ-GM0gk376U-Qg/artifacts/public%2Factions.json
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/AN5CJA6vQ-GM0gk376U-Qg/artifacts/public%2Fparameters.yml
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/AN5CJA6vQ-GM0gk376U-Qg/artifacts/public%2Ftask-graph.json
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/fzQ7E273T7yAVtJbH1GMxQ/artifacts/public%2Factions.json
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/fzQ7E273T7yAVtJbH1GMxQ/artifacts/public%2Fparameters.yml
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/fzQ7E273T7yAVtJbH1GMxQ/artifacts/public%2Ftask-graph.json
2021-07-22T13:48:04    DEBUG -  /app/workdir/cot/fzQ7E273T7yAVtJbH1GMxQ/public/parameters.yml matches the expected sha256 72e193d2f680e0cb0e6800464b4e9927a92f6f003054a02fa94745762116c9e7
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/NFQtnriGRTyv-qvkmWJ-Mg/artifacts/public%2Fbuild%2Farm64-v8a%2Ftarget.apk
2021-07-22T13:48:04    DEBUG -  /app/workdir/cot/fzQ7E273T7yAVtJbH1GMxQ/public/actions.json matches the expected sha256 8d4d680c7a147b87ff0685ded0c59685f10eaed72ff4cd72391dcf50e357d18b
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/NFQtnriGRTyv-qvkmWJ-Mg/artifacts/public%2Fbuild%2Farmeabi-v7a%2Ftarget.apk
2021-07-22T13:48:04    DEBUG -  /app/workdir/cot/AN5CJA6vQ-GM0gk376U-Qg/public/actions.json matches the expected sha256 e19ff239f67629dd7e6fd2f16040affa0a1b97a4422b63e5dda906243283c0de
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/NFQtnriGRTyv-qvkmWJ-Mg/artifacts/public%2Fbuild%2Fx86%2Ftarget.apk
2021-07-22T13:48:04    DEBUG -  /app/workdir/cot/AN5CJA6vQ-GM0gk376U-Qg/public/parameters.yml matches the expected sha256 51f02bcacbedb35bc2cdccb973eeb07d6add4a76979f0f22c6c2715ec43ffb82
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/NFQtnriGRTyv-qvkmWJ-Mg/artifacts/public%2Fbuild%2Fx86_64%2Ftarget.apk
2021-07-22T13:48:04    DEBUG -  /app/workdir/cot/fzQ7E273T7yAVtJbH1GMxQ/public/task-graph.json matches the expected sha256 e8a5b10a1ac58d7ab78aa3bd7e706a1fd384ad8d11dff8b8da17dd5903330da2
2021-07-22T13:48:04     INFO - Done
2021-07-22T13:48:04    DEBUG -  /app/workdir/cot/AN5CJA6vQ-GM0gk376U-Qg/public/task-graph.json matches the expected sha256 2c40d947b2b1ff2b39ad833bf9eba17f98c291188d3884026eda43ae42970f71
2021-07-22T13:48:04    DEBUG -  makedirs(/app/workdir/cot/NFQtnriGRTyv-qvkmWJ-Mg/./public/build/arm64-v8a)
2021-07-22T13:48:04    DEBUG -  makedirs(/app/workdir/cot/NFQtnriGRTyv-qvkmWJ-Mg/./public/build/armeabi-v7a)
2021-07-22T13:48:04    DEBUG -  makedirs(/app/workdir/cot/NFQtnriGRTyv-qvkmWJ-Mg/./public/build/x86_64)
2021-07-22T13:48:04    DEBUG -  makedirs(/app/workdir/cot/NFQtnriGRTyv-qvkmWJ-Mg/./public/build/x86)
2021-07-22T13:48:12     INFO - Done
2021-07-22T13:48:12    DEBUG -  /app/workdir/cot/NFQtnriGRTyv-qvkmWJ-Mg/public/build/armeabi-v7a/target.apk matches the expected sha256 ea9a6d370a688d741dd89d481bb6ff8ed50180fdc7d8d281b4e656de2c21b4b0
2021-07-22T13:48:12     INFO - Done
2021-07-22T13:48:12    DEBUG -  /app/workdir/cot/NFQtnriGRTyv-qvkmWJ-Mg/public/build/arm64-v8a/target.apk matches the expected sha256 8aad13e29d27987c99131dc623f80a3a5ce06e08a6c206eebd11ffd4aa3c20bb
2021-07-22T13:48:12     INFO - Done
2021-07-22T13:48:13    DEBUG -  /app/workdir/cot/NFQtnriGRTyv-qvkmWJ-Mg/public/build/x86_64/target.apk matches the expected sha256 1ae2069b578019542ba21cbc5f1a0c74979f3b65d19624a1fa6756c92d35cfb6
2021-07-22T13:48:13     INFO - Done
2021-07-22T13:48:13    DEBUG -  /app/workdir/cot/NFQtnriGRTyv-qvkmWJ-Mg/public/build/x86/target.apk matches the expected sha256 ffe1b559a539fdbb00a78acfaa4360f198381d22ac92c2a1e482346fe62ec7f5
2021-07-22T13:48:13     INFO - Verifying scriptworker RoPvBDsmTTC2BNIQvsFmZA as a scriptworker task...
2021-07-22T13:48:13     INFO - Verifying scriptworker:parent AN5CJA6vQ-GM0gk376U-Qg as a decision task...
2021-07-22T13:48:13     INFO - Verifying the scriptworker RoPvBDsmTTC2BNIQvsFmZA task definition is part of the scriptworker:parent AN5CJA6vQ-GM0gk376U-Qg task graph...
2021-07-22T13:48:13     INFO - Found RoPvBDsmTTC2BNIQvsFmZA in the graph; it's a match
2021-07-22T13:48:13     INFO - Verifying the scriptworker:build NFQtnriGRTyv-qvkmWJ-Mg task definition is part of the scriptworker:parent AN5CJA6vQ-GM0gk376U-Qg task graph...
2021-07-22T13:48:13     INFO - Found NFQtnriGRTyv-qvkmWJ-Mg in the graph; it's a match
2021-07-22T13:48:13     INFO - Verifying scriptworker:parent AN5CJA6vQ-GM0gk376U-Qg definition...
2021-07-22T13:48:13    DEBUG -  scriptworker:parent .taskcluster.yml is at https://raw.githubusercontent.com/mozilla-mobile/fenix/v91.0.0-beta.3/.taskcluster.yml
2021-07-22T13:48:13     INFO - Downloading https://raw.githubusercontent.com/mozilla-mobile/fenix/v91.0.0-beta.3/.taskcluster.yml
2021-07-22T13:48:13     INFO - Done
2021-07-22T13:48:13    DEBUG -  task_ids: {'default': 'AN5CJA6vQ-GM0gk376U-Qg', 'decision': 'AN5CJA6vQ-GM0gk376U-Qg'}
2021-07-22T13:48:14    DEBUG -  scriptworker:parent json-e context:
2021-07-22T13:48:14    DEBUG -  {'as_slugid': <function populate_jsone_context.<locals>.<lambda> at 0x7f5ca583be50>,
 'event': {'action': 'published',
           'release': {'published_at': '2021-07-22T13:29:07Z',
                       'tag_name': 'v91.0.0-beta.3',
                       'target_commitish': 'b2eb636ce49aa69fb43dda5479110ea221c686bd'},
           'repository': {'clone_url': 'https://github.com/mozilla-mobile/fenix.git',
                          'full_name': 'mozilla-mobile/fenix',
                          'html_url': 'https://github.com/mozilla-mobile/fenix',
                          'name': 'fenix'},
           'sender': {'login': 'moz-releng-automation'}},
 'now': '2021-07-22T13:29:09.251Z',
 'ownTaskId': 'AN5CJA6vQ-GM0gk376U-Qg',
 'taskId': None,
 'tasks_for': 'github-release'}
2021-07-22T13:48:14     INFO - scriptworker:parent: Good.
2021-07-22T13:48:14     INFO - Verifying scriptworker:build NFQtnriGRTyv-qvkmWJ-Mg as a build task...
2021-07-22T13:48:14     INFO - Verifying scriptworker:build:docker-image bcWUDOGKTlCWiAakcEa3NA as a docker-image task...
2021-07-22T13:48:14     INFO - Verifying scriptworker:build:docker-image:parent fzQ7E273T7yAVtJbH1GMxQ as a decision task...
2021-07-22T13:48:14     INFO - Verifying the scriptworker:build:docker-image bcWUDOGKTlCWiAakcEa3NA task definition is part of the scriptworker:build:docker-image:parent fzQ7E273T7yAVtJbH1GMxQ task graph...
2021-07-22T13:48:14     INFO - Found bcWUDOGKTlCWiAakcEa3NA in the graph; it's a match
2021-07-22T13:48:14     INFO - Verifying scriptworker:build:docker-image:parent fzQ7E273T7yAVtJbH1GMxQ definition...
2021-07-22T13:48:14    DEBUG -  scriptworker:build:docker-image:parent .taskcluster.yml is at https://raw.githubusercontent.com/mozilla-mobile/fenix/2339ab664e7150d603794eb419235e830e54957a/.taskcluster.yml
2021-07-22T13:48:14     INFO - Downloading https://raw.githubusercontent.com/mozilla-mobile/fenix/2339ab664e7150d603794eb419235e830e54957a/.taskcluster.yml
2021-07-22T13:48:14     INFO - Done
2021-07-22T13:48:14    DEBUG -  task_ids: {'default': 'fzQ7E273T7yAVtJbH1GMxQ', 'decision': 'fzQ7E273T7yAVtJbH1GMxQ'}
2021-07-22T13:48:14    DEBUG -  scriptworker:build:docker-image:parent json-e context:
2021-07-22T13:48:14    DEBUG -  {'as_slugid': <function populate_jsone_context.<locals>.<lambda> at 0x7f5ca57cc670>,
 'event': {'after': '2339ab664e7150d603794eb419235e830e54957a',
           'before': None,
           'pusher': {'email': 'aki@mozilla.com'},
           'ref': 'refs/heads/master',
           'repository': {'full_name': 'mozilla-mobile/fenix',
                          'html_url': 'https://github.com/mozilla-mobile/fenix',
                          'name': 'fenix',
                          'pushed_at': None,
                          'ssh_url': 'git@github.com:mozilla-mobile/fenix.git'},
           'sender': {'login': 'ahal'}},
 'now': '2021-06-09T19:52:30.782Z',
 'ownTaskId': 'fzQ7E273T7yAVtJbH1GMxQ',
 'taskId': None,
 'tasks_for': 'github-push'}
2021-07-22T13:48:14     INFO - scriptworker:build:docker-image:parent: Good.
2021-07-22T13:48:14     INFO - Verifying scriptworker RoPvBDsmTTC2BNIQvsFmZA as a scriptworker task...
2021-07-22T13:48:14     INFO - Verifying scriptworker:parent AN5CJA6vQ-GM0gk376U-Qg as a docker-worker task...
2021-07-22T13:48:14     INFO - Checking for scriptworker:parent AN5CJA6vQ-GM0gk376U-Qg interactive docker-worker
2021-07-22T13:48:14     INFO - Verifying scriptworker:build NFQtnriGRTyv-qvkmWJ-Mg as a docker-worker task...
2021-07-22T13:48:14     INFO - Checking for scriptworker:build NFQtnriGRTyv-qvkmWJ-Mg interactive docker-worker
2021-07-22T13:48:14    DEBUG -  Verifying scriptworker:build NFQtnriGRTyv-qvkmWJ-Mg against docker-image bcWUDOGKTlCWiAakcEa3NA
2021-07-22T13:48:14    DEBUG -  Found matching docker-image sha a29f22e6ebcc7469997dbeb37011549cab3141f1fd7682e1d9aece58081ce201
2021-07-22T13:48:14     INFO - Verifying scriptworker:build:docker-image bcWUDOGKTlCWiAakcEa3NA as a docker-worker task...
2021-07-22T13:48:14     INFO - Checking for scriptworker:build:docker-image bcWUDOGKTlCWiAakcEa3NA interactive docker-worker
2021-07-22T13:48:14     INFO - Verifying scriptworker:build:docker-image:parent fzQ7E273T7yAVtJbH1GMxQ as a docker-worker task...
2021-07-22T13:48:14     INFO - Checking for scriptworker:build:docker-image:parent fzQ7E273T7yAVtJbH1GMxQ interactive docker-worker
2021-07-22T13:48:14    DEBUG -  Getting source url for scriptworker RoPvBDsmTTC2BNIQvsFmZA...
2021-07-22T13:48:14     INFO - scriptworker RoPvBDsmTTC2BNIQvsFmZA: found https://github.com/mozilla-mobile/fenix/blob/b2eb636ce49aa69fb43dda5479110ea221c686bd/taskcluster/ci/signing
2021-07-22T13:48:14    DEBUG -  Getting source url for scriptworker:parent AN5CJA6vQ-GM0gk376U-Qg...
2021-07-22T13:48:14     INFO - scriptworker:parent AN5CJA6vQ-GM0gk376U-Qg: found https://github.com/mozilla-mobile/fenix/raw/v91.0.0-beta.3/.taskcluster.yml
2021-07-22T13:48:14    DEBUG -  Getting source url for scriptworker:build NFQtnriGRTyv-qvkmWJ-Mg...
2021-07-22T13:48:14     INFO - scriptworker:build NFQtnriGRTyv-qvkmWJ-Mg: found https://github.com/mozilla-mobile/fenix/blob/b2eb636ce49aa69fb43dda5479110ea221c686bd/taskcluster/ci/build
2021-07-22T13:48:14    DEBUG -  Getting source url for scriptworker:build:docker-image bcWUDOGKTlCWiAakcEa3NA...
2021-07-22T13:48:14     INFO - scriptworker:build:docker-image bcWUDOGKTlCWiAakcEa3NA: found https://github.com/mozilla-mobile/fenix/blob/2339ab664e7150d603794eb419235e830e54957a/taskcluster/ci/docker-image
2021-07-22T13:48:14    DEBUG -  Getting source url for scriptworker:build:docker-image:parent fzQ7E273T7yAVtJbH1GMxQ...
2021-07-22T13:48:14     INFO - scriptworker:build:docker-image:parent fzQ7E273T7yAVtJbH1GMxQ: found https://github.com/mozilla-mobile/fenix/raw/2339ab664e7150d603794eb419235e830e54957a/.taskcluster.yml
2021-07-22T13:48:14     INFO - Found privileged scope project:mobile:fenix:releng:signing:cert:fennec-production-signing
2021-07-22T13:48:17     INFO - Good.


Focus / Klar v92.1.1

login: rvandermeulen

Focus-arm.apk

login: jonalmeida

body: - Update to Android Components 92.0.15 (containing GeckoView 92.0.20210903235534).


groupName: Nightly-related tasks

groupSymbol: nightly

jobKind: build

platform: android-all

symbol: Bs

treeherder-platform: android-all/opt

signing-nightly

description: Sign Fenix ([Treeherder push](https://treeherder.mozilla.org/#/jobs?repo=fenix&revision=9bfb31519a0defe9ff4d317a6772dc155ded5c61))

taskType: build

priority: highest

requires: all-completed

kind: signing

label: signing-nightly

os: scriptworker

worker-implementation: scriptworker


code:
2021-07-19T15:21:28     INFO - Running scriptworker version 38.2.0
2021-07-19T15:21:28     INFO - build_task_dependencies scriptworker WFLMjMoySVSmOol0bbOSPA
2021-07-19T15:21:28     INFO - find_sorted_task_dependencies scriptworker WFLMjMoySVSmOol0bbOSPA
2021-07-19T15:21:28     INFO - found dependencies: [('scriptworker:parent', 'YdSRyh2eQbmWRSVnrNqUUg'), ('scriptworker:build', 'a4IsgWwYRSundiUFj7VVwQ')]
2021-07-19T15:21:28    DEBUG -  scriptworker:parent YdSRyh2eQbmWRSVnrNqUUg is docker-worker
2021-07-19T15:21:28    DEBUG -  makedirs(/app/workdir/cot/YdSRyh2eQbmWRSVnrNqUUg)
2021-07-19T15:21:28     INFO - build_task_dependencies scriptworker:parent YdSRyh2eQbmWRSVnrNqUUg
2021-07-19T15:21:28     INFO - find_sorted_task_dependencies scriptworker:parent YdSRyh2eQbmWRSVnrNqUUg
2021-07-19T15:21:28     INFO - found dependencies: [('scriptworker:parent:parent', 'TPRrMS8sRqyUlhyX_P1m_w')]
2021-07-19T15:21:28    DEBUG -  scriptworker:parent:parent TPRrMS8sRqyUlhyX_P1m_w is docker-worker
2021-07-19T15:21:28    DEBUG -  makedirs(/app/workdir/cot/TPRrMS8sRqyUlhyX_P1m_w)
2021-07-19T15:21:28     INFO - build_task_dependencies scriptworker:parent:parent TPRrMS8sRqyUlhyX_P1m_w
2021-07-19T15:21:28     INFO - find_sorted_task_dependencies scriptworker:parent:parent TPRrMS8sRqyUlhyX_P1m_w
2021-07-19T15:21:28     INFO - found dependencies: [('scriptworker:parent:parent:parent', 'TPRrMS8sRqyUlhyX_P1m_w')]
2021-07-19T15:21:28    DEBUG -  scriptworker:build a4IsgWwYRSundiUFj7VVwQ is docker-worker
2021-07-19T15:21:28    DEBUG -  makedirs(/app/workdir/cot/a4IsgWwYRSundiUFj7VVwQ)
2021-07-19T15:21:28     INFO - build_task_dependencies scriptworker:build a4IsgWwYRSundiUFj7VVwQ
2021-07-19T15:21:28     INFO - find_sorted_task_dependencies scriptworker:build a4IsgWwYRSundiUFj7VVwQ
2021-07-19T15:21:28     INFO - found dependencies: [('scriptworker:build:parent', 'YdSRyh2eQbmWRSVnrNqUUg'), ('scriptworker:build:docker-image', 'XGGmdDBTSPOa1ZFu6Roldg')]
2021-07-19T15:21:28    DEBUG -  scriptworker:build:docker-image XGGmdDBTSPOa1ZFu6Roldg is docker-worker
2021-07-19T15:21:28    DEBUG -  makedirs(/app/workdir/cot/XGGmdDBTSPOa1ZFu6Roldg)
2021-07-19T15:21:28     INFO - build_task_dependencies scriptworker:build:docker-image XGGmdDBTSPOa1ZFu6Roldg
2021-07-19T15:21:28     INFO - find_sorted_task_dependencies scriptworker:build:docker-image XGGmdDBTSPOa1ZFu6Roldg
2021-07-19T15:21:28     INFO - found dependencies: [('scriptworker:build:docker-image:parent', 'Lt9aXLUtSU2lhskGjQCJLg')]
2021-07-19T15:21:28    DEBUG -  scriptworker:build:docker-image:parent Lt9aXLUtSU2lhskGjQCJLg is docker-worker
2021-07-19T15:21:28    DEBUG -  makedirs(/app/workdir/cot/Lt9aXLUtSU2lhskGjQCJLg)
2021-07-19T15:21:28     INFO - build_task_dependencies scriptworker:build:docker-image:parent Lt9aXLUtSU2lhskGjQCJLg
2021-07-19T15:21:28     INFO - find_sorted_task_dependencies scriptworker:build:docker-image:parent Lt9aXLUtSU2lhskGjQCJLg
2021-07-19T15:21:28     INFO - found dependencies: [('scriptworker:build:docker-image:parent:parent', 'Lt9aXLUtSU2lhskGjQCJLg')]
2021-07-19T15:21:28     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/YdSRyh2eQbmWRSVnrNqUUg/artifacts/public%2Fchain-of-trust.json
2021-07-19T15:21:28     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/YdSRyh2eQbmWRSVnrNqUUg/artifacts/public%2Fchain-of-trust.json.sig
2021-07-19T15:21:28     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/TPRrMS8sRqyUlhyX_P1m_w/artifacts/public%2Fchain-of-trust.json
2021-07-19T15:21:28     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/TPRrMS8sRqyUlhyX_P1m_w/artifacts/public%2Fchain-of-trust.json.sig
2021-07-19T15:21:28     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/a4IsgWwYRSundiUFj7VVwQ/artifacts/public%2Fchain-of-trust.json
2021-07-19T15:21:28    DEBUG -  makedirs(/app/workdir/cot/TPRrMS8sRqyUlhyX_P1m_w/./public)
2021-07-19T15:21:28     INFO - Done
2021-07-19T15:21:28     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/a4IsgWwYRSundiUFj7VVwQ/artifacts/public%2Fchain-of-trust.json.sig
2021-07-19T15:21:28     INFO - Done
2021-07-19T15:21:28     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/XGGmdDBTSPOa1ZFu6Roldg/artifacts/public%2Fchain-of-trust.json
2021-07-19T15:21:28    DEBUG -  makedirs(/app/workdir/cot/YdSRyh2eQbmWRSVnrNqUUg/./public)
2021-07-19T15:21:28     INFO - Done
2021-07-19T15:21:28     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/XGGmdDBTSPOa1ZFu6Roldg/artifacts/public%2Fchain-of-trust.json.sig
2021-07-19T15:21:28    DEBUG -  makedirs(/app/workdir/cot/XGGmdDBTSPOa1ZFu6Roldg/./public)
2021-07-19T15:21:28     INFO - Done
2021-07-19T15:21:28     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/Lt9aXLUtSU2lhskGjQCJLg/artifacts/public%2Fchain-of-trust.json
2021-07-19T15:21:29    DEBUG -  makedirs(/app/workdir/cot/a4IsgWwYRSundiUFj7VVwQ/./public)
2021-07-19T15:21:29     INFO - Done
2021-07-19T15:21:29     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/Lt9aXLUtSU2lhskGjQCJLg/artifacts/public%2Fchain-of-trust.json.sig
2021-07-19T15:21:29    DEBUG -  makedirs(/app/workdir/cot/Lt9aXLUtSU2lhskGjQCJLg/./public)
2021-07-19T15:21:29     INFO - Done
2021-07-19T15:21:29     INFO - Done
2021-07-19T15:21:29     INFO - Done
2021-07-19T15:21:29     INFO - Done
2021-07-19T15:21:29     INFO - Done
2021-07-19T15:21:29    DEBUG -  /app/workdir/cot/YdSRyh2eQbmWRSVnrNqUUg/./public/chain-of-trust.json downloaded; hash is e5c415d3a9337de22545163f461420e10865a4c83beb7d7072d962538c7dbd17
2021-07-19T15:21:29    DEBUG -  /app/workdir/cot/TPRrMS8sRqyUlhyX_P1m_w/./public/chain-of-trust.json downloaded; hash is 5b84eb8e56dc3f0dced0f7c1acc9998fb612167407cc73c981f1ae151fa439be
2021-07-19T15:21:29    DEBUG -  /app/workdir/cot/a4IsgWwYRSundiUFj7VVwQ/./public/chain-of-trust.json downloaded; hash is c424b6bdcd6e6bc775b0775e7f6718dfc6b07189e7212f14fe09989cf1331dcf
2021-07-19T15:21:29    DEBUG -  /app/workdir/cot/XGGmdDBTSPOa1ZFu6Roldg/./public/chain-of-trust.json downloaded; hash is 61d74cd1c814dedaa99b686edebf85cb4b7ba3372728e5e4164c6cec01a1a98d
2021-07-19T15:21:29    DEBUG -  /app/workdir/cot/Lt9aXLUtSU2lhskGjQCJLg/./public/chain-of-trust.json downloaded; hash is 5ec67192c03fb93a62d2f0bce02eebda21e70c888cafba05b0c33082b4613f5d
2021-07-19T15:21:29    DEBUG -  Verifying the scriptworker:parent YdSRyh2eQbmWRSVnrNqUUg docker-worker ed25519 chain of trust signature
2021-07-19T15:21:29    DEBUG -  scriptworker:parent YdSRyh2eQbmWRSVnrNqUUg: ed25519 cot signature verified.
2021-07-19T15:21:29    DEBUG -  Verifying the scriptworker:parent:parent TPRrMS8sRqyUlhyX_P1m_w docker-worker ed25519 chain of trust signature
2021-07-19T15:21:29    DEBUG -  scriptworker:parent:parent TPRrMS8sRqyUlhyX_P1m_w: ed25519 cot signature verified.
2021-07-19T15:21:29    DEBUG -  Verifying the scriptworker:build a4IsgWwYRSundiUFj7VVwQ docker-worker ed25519 chain of trust signature
2021-07-19T15:21:29    DEBUG -  scriptworker:build a4IsgWwYRSundiUFj7VVwQ: ed25519 cot signature verified.
2021-07-19T15:21:29    DEBUG -  Verifying the scriptworker:build:docker-image XGGmdDBTSPOa1ZFu6Roldg docker-worker ed25519 chain of trust signature
2021-07-19T15:21:29    DEBUG -  scriptworker:build:docker-image XGGmdDBTSPOa1ZFu6Roldg: ed25519 cot signature verified.
2021-07-19T15:21:29    DEBUG -  Verifying the scriptworker:build:docker-image:parent Lt9aXLUtSU2lhskGjQCJLg docker-worker ed25519 chain of trust signature
2021-07-19T15:21:29    DEBUG -  scriptworker:build:docker-image:parent Lt9aXLUtSU2lhskGjQCJLg: ed25519 cot signature verified.
2021-07-19T15:21:29    DEBUG -  Verifying public/task-graph.json is in YdSRyh2eQbmWRSVnrNqUUg cot artifacts...
2021-07-19T15:21:29     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/YdSRyh2eQbmWRSVnrNqUUg/artifacts/public%2Ftask-graph.json
2021-07-19T15:21:29    DEBUG -  Verifying public/actions.json is in TPRrMS8sRqyUlhyX_P1m_w cot artifacts...
2021-07-19T15:21:29     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/TPRrMS8sRqyUlhyX_P1m_w/artifacts/public%2Factions.json
2021-07-19T15:21:29    DEBUG -  Verifying public/parameters.yml is in TPRrMS8sRqyUlhyX_P1m_w cot artifacts...
2021-07-19T15:21:29     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/TPRrMS8sRqyUlhyX_P1m_w/artifacts/public%2Fparameters.yml
2021-07-19T15:21:29    DEBUG -  Verifying public/task-graph.json is in TPRrMS8sRqyUlhyX_P1m_w cot artifacts...
2021-07-19T15:21:29     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/TPRrMS8sRqyUlhyX_P1m_w/artifacts/public%2Ftask-graph.json
2021-07-19T15:21:29    DEBUG -  Verifying public/actions.json is in Lt9aXLUtSU2lhskGjQCJLg cot artifacts...
2021-07-19T15:21:29     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/Lt9aXLUtSU2lhskGjQCJLg/artifacts/public%2Factions.json
2021-07-19T15:21:29    DEBUG -  Verifying public/parameters.yml is in Lt9aXLUtSU2lhskGjQCJLg cot artifacts...
2021-07-19T15:21:29     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/Lt9aXLUtSU2lhskGjQCJLg/artifacts/public%2Fparameters.yml
2021-07-19T15:21:29    DEBUG -  Verifying public/task-graph.json is in Lt9aXLUtSU2lhskGjQCJLg cot artifacts...
2021-07-19T15:21:29     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/Lt9aXLUtSU2lhskGjQCJLg/artifacts/public%2Ftask-graph.json
2021-07-19T15:21:29    DEBUG -  Verifying public/build/arm64-v8a/target.apk is in a4IsgWwYRSundiUFj7VVwQ cot artifacts...
2021-07-19T15:21:29     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/a4IsgWwYRSundiUFj7VVwQ/artifacts/public%2Fbuild%2Farm64-v8a%2Ftarget.apk
2021-07-19T15:21:29    DEBUG -  Verifying public/build/armeabi-v7a/target.apk is in a4IsgWwYRSundiUFj7VVwQ cot artifacts...
2021-07-19T15:21:29     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/a4IsgWwYRSundiUFj7VVwQ/artifacts/public%2Fbuild%2Farmeabi-v7a%2Ftarget.apk
2021-07-19T15:21:29    DEBUG -  Verifying public/build/x86/target.apk is in a4IsgWwYRSundiUFj7VVwQ cot artifacts...
2021-07-19T15:21:29     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/a4IsgWwYRSundiUFj7VVwQ/artifacts/public%2Fbuild%2Fx86%2Ftarget.apk
2021-07-19T15:21:29    DEBUG -  Verifying public/build/x86_64/target.apk is in a4IsgWwYRSundiUFj7VVwQ cot artifacts...
2021-07-19T15:21:29     INFO - Downloading Chain of Trust artifact:
https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/a4IsgWwYRSundiUFj7VVwQ/artifacts/public%2Fbuild%2Fx86_64%2Ftarget.apk
2021-07-19T15:21:29     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/YdSRyh2eQbmWRSVnrNqUUg/artifacts/public%2Ftask-graph.json
2021-07-19T15:21:29     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/TPRrMS8sRqyUlhyX_P1m_w/artifacts/public%2Factions.json
2021-07-19T15:21:29     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/TPRrMS8sRqyUlhyX_P1m_w/artifacts/public%2Fparameters.yml
2021-07-19T15:21:29     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/TPRrMS8sRqyUlhyX_P1m_w/artifacts/public%2Ftask-graph.json
2021-07-19T15:21:29     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/Lt9aXLUtSU2lhskGjQCJLg/artifacts/public%2Factions.json
2021-07-19T15:21:29     INFO - Done
2021-07-19T15:21:29     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/Lt9aXLUtSU2lhskGjQCJLg/artifacts/public%2Fparameters.yml
2021-07-19T15:21:29    DEBUG -  /app/workdir/cot/Lt9aXLUtSU2lhskGjQCJLg/public/actions.json matches the expected sha256 1a09b88fd0157d0dd7fe653de6302f0a09b1edf3b2a09454cce1e37a0d4674da
2021-07-19T15:21:29     INFO - Done
2021-07-19T15:21:29     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/Lt9aXLUtSU2lhskGjQCJLg/artifacts/public%2Ftask-graph.json
2021-07-19T15:21:29     INFO - Done
2021-07-19T15:21:29    DEBUG -  /app/workdir/cot/TPRrMS8sRqyUlhyX_P1m_w/public/actions.json matches the expected sha256 aad6a20d9ad3d5c14cc690751f7fda020b7c3590007f02d2286ac86ecb2a7625
2021-07-19T15:21:29     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/a4IsgWwYRSundiUFj7VVwQ/artifacts/public%2Fbuild%2Farm64-v8a%2Ftarget.apk
2021-07-19T15:21:29    DEBUG -  /app/workdir/cot/TPRrMS8sRqyUlhyX_P1m_w/public/parameters.yml matches the expected sha256 e898c4da1a8a98da880779a961abd237a99d0d3b452bd00d3b52baf743a01b48
2021-07-19T15:21:29     INFO - Done
2021-07-19T15:21:29     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/a4IsgWwYRSundiUFj7VVwQ/artifacts/public%2Fbuild%2Farmeabi-v7a%2Ftarget.apk
2021-07-19T15:21:29    DEBUG -  /app/workdir/cot/TPRrMS8sRqyUlhyX_P1m_w/public/task-graph.json matches the expected sha256 c9cb9315707ab0e5e41db54a1760495e94bae4b6b945d32fbceaa0d0908d381a
2021-07-19T15:21:29     INFO - Done
2021-07-19T15:21:29     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/a4IsgWwYRSundiUFj7VVwQ/artifacts/public%2Fbuild%2Fx86%2Ftarget.apk
2021-07-19T15:21:29    DEBUG -  /app/workdir/cot/Lt9aXLUtSU2lhskGjQCJLg/public/parameters.yml matches the expected sha256 4e44911e0823e735d69b06cd5f1ac56e4f8c2d4a57008ae76589db5de58efe58
2021-07-19T15:21:29     INFO - Done
2021-07-19T15:21:29     INFO - Downloading https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/a4IsgWwYRSundiUFj7VVwQ/artifacts/public%2Fbuild%2Fx86_64%2Ftarget.apk
2021-07-19T15:21:29    DEBUG -  /app/workdir/cot/Lt9aXLUtSU2lhskGjQCJLg/public/task-graph.json matches the expected sha256 53016d3f4f4516fdc8d8ff1ee305bd0d6782674b65a992c739fb0889c221f12c
2021-07-19T15:21:29     INFO - Done
2021-07-19T15:21:29    DEBUG -  /app/workdir/cot/YdSRyh2eQbmWRSVnrNqUUg/public/task-graph.json matches the expected sha256 033ca4b5a2e748e2c42335ead87afb97b3bcfe57cddbbee5f1f385e44e34232f
2021-07-19T15:21:29    DEBUG -  makedirs(/app/workdir/cot/a4IsgWwYRSundiUFj7VVwQ/./public/build/armeabi-v7a)
2021-07-19T15:21:29    DEBUG -  makedirs(/app/workdir/cot/a4IsgWwYRSundiUFj7VVwQ/./public/build/arm64-v8a)
2021-07-19T15:21:29    DEBUG -  makedirs(/app/workdir/cot/a4IsgWwYRSundiUFj7VVwQ/./public/build/x86)
2021-07-19T15:21:29    DEBUG -  makedirs(/app/workdir/cot/a4IsgWwYRSundiUFj7VVwQ/./public/build/x86_64)
2021-07-19T15:21:36     INFO - Done
2021-07-19T15:21:37    DEBUG -  /app/workdir/cot/a4IsgWwYRSundiUFj7VVwQ/public/build/armeabi-v7a/target.apk matches the expected sha256 c1eed0fc8f4d74b4fad9d342e78fd5ca5be9b2cb7bc455c43aa8abbf7c9df924
2021-07-19T15:21:37     INFO - Done
2021-07-19T15:21:37     INFO - Done
2021-07-19T15:21:38    DEBUG -  /app/workdir/cot/a4IsgWwYRSundiUFj7VVwQ/public/build/x86_64/target.apk matches the expected sha256 e3ae44e3ffd7245bf652ebcead514b8d2dc12474a5d9af8e7bd21fc6382aa367
2021-07-19T15:21:38    DEBUG -  /app/workdir/cot/a4IsgWwYRSundiUFj7VVwQ/public/build/arm64-v8a/target.apk matches the expected sha256 3e9f6c0bd291c3cf1f33c74ffdeb92baba35e127102abb35cf2d0b138ec132fa
2021-07-19T15:21:38     INFO - Done
2021-07-19T15:21:38    DEBUG -  /app/workdir/cot/a4IsgWwYRSundiUFj7VVwQ/public/build/x86/target.apk matches the expected sha256 ae1699bdad110a9dc05b4a3e97bfe5b2f53e85c451395a1281d3d4a325371447
2021-07-19T15:21:38     INFO - Verifying scriptworker WFLMjMoySVSmOol0bbOSPA as a scriptworker task...
2021-07-19T15:21:38     INFO - Verifying scriptworker:parent YdSRyh2eQbmWRSVnrNqUUg as a action task...
2021-07-19T15:21:38     INFO - Verifying the scriptworker WFLMjMoySVSmOol0bbOSPA task definition is part of the scriptworker:parent YdSRyh2eQbmWRSVnrNqUUg task graph...
2021-07-19T15:21:38     INFO - Found WFLMjMoySVSmOol0bbOSPA in the graph; it's a match
2021-07-19T15:21:38     INFO - Verifying the scriptworker:build a4IsgWwYRSundiUFj7VVwQ task definition is part of the scriptworker:parent YdSRyh2eQbmWRSVnrNqUUg task graph...
2021-07-19T15:21:38     INFO - Found a4IsgWwYRSundiUFj7VVwQ in the graph; it's a match
2021-07-19T15:21:38     INFO - Verifying scriptworker:parent YdSRyh2eQbmWRSVnrNqUUg definition...
2021-07-19T15:21:38    DEBUG -  task_ids: {'default': 'YdSRyh2eQbmWRSVnrNqUUg', 'decision': 'TPRrMS8sRqyUlhyX_P1m_w'}
2021-07-19T15:21:38    DEBUG -  scriptworker:parent json-e context:
2021-07-19T15:21:38    DEBUG -  {'as_slugid': <function populate_jsone_context.<locals>.<lambda> at 0x7f3f1f5e1e50>,
 'clientId': 'project/releng/shipit/production',
 'input': {'build_number': 1,
           'next_version': '90.1.3',
           'previous_graph_ids': ['TPRrMS8sRqyUlhyX_P1m_w'],
           'release_enable_emefree': False,
           'release_enable_partner_attribution': False,
           'release_enable_partner_repack': False,
           'release_eta': None,
           'release_promotion_flavor': 'ship',
           'version': '90.1.2'},
 'now': '2021-07-19T15:07:50.886Z',
 'ownTaskId': 'YdSRyh2eQbmWRSVnrNqUUg',
 'taskGroupId': 'TPRrMS8sRqyUlhyX_P1m_w',
 'taskId': None,
 'tasks_for': 'action'}
2021-07-19T15:21:38    DEBUG -  scriptworker:parent:parent .taskcluster.yml is at https://raw.githubusercontent.com/mozilla-mobile/fenix/3dc8ef806ec95ead8a34c66ca1872b87629d8974/.taskcluster.yml
2021-07-19T15:21:38     INFO - Downloading https://raw.githubusercontent.com/mozilla-mobile/fenix/3dc8ef806ec95ead8a34c66ca1872b87629d8974/.taskcluster.yml
2021-07-19T15:21:38     INFO - Done
2021-07-19T15:21:38     INFO - scriptworker:parent: Good.
2021-07-19T15:21:38     INFO - Verifying scriptworker:parent:parent TPRrMS8sRqyUlhyX_P1m_w as a decision task...
2021-07-19T15:21:38     INFO - Verifying scriptworker:parent:parent TPRrMS8sRqyUlhyX_P1m_w definition...
2021-07-19T15:21:38    DEBUG -  scriptworker:parent:parent .taskcluster.yml is at https://raw.githubusercontent.com/mozilla-mobile/fenix/3dc8ef806ec95ead8a34c66ca1872b87629d8974/.taskcluster.yml
2021-07-19T15:21:38    DEBUG -  task_ids: {'default': 'TPRrMS8sRqyUlhyX_P1m_w', 'decision': 'TPRrMS8sRqyUlhyX_P1m_w'}
2021-07-19T15:21:39    DEBUG -  scriptworker:parent:parent json-e context:
2021-07-19T15:21:39    DEBUG -  {'as_slugid': <function populate_jsone_context.<locals>.<lambda> at 0x7f3f1e828430>,
 'event': {'after': '3dc8ef806ec95ead8a34c66ca1872b87629d8974',
           'before': None,
           'pusher': {'email': ''},
           'ref': 'refs/heads/releases_v90.0.0',
           'repository': {'full_name': 'mozilla-mobile/fenix',
                          'html_url': 'https://github.com/mozilla-mobile/fenix',
                          'name': 'fenix',
                          'pushed_at': None,
                          'ssh_url': 'git@github.com:mozilla-mobile/fenix.git'},
           'sender': {'login': 'mergify[bot]'}},
 'now': '2021-07-19T14:55:05.306Z',
 'ownTaskId': 'TPRrMS8sRqyUlhyX_P1m_w',
 'taskId': None,
 'tasks_for': 'github-push'}
2021-07-19T15:21:39     INFO - scriptworker:parent:parent: Good.
2021-07-19T15:21:39     INFO - Verifying scriptworker:build a4IsgWwYRSundiUFj7VVwQ as a build task...
2021-07-19T15:21:39     INFO - Verifying scriptworker:build:docker-image XGGmdDBTSPOa1ZFu6Roldg as a docker-image task...
2021-07-19T15:21:39     INFO - Verifying scriptworker:build:docker-image:parent Lt9aXLUtSU2lhskGjQCJLg as a decision task...
2021-07-19T15:21:39     INFO - Verifying the scriptworker:build:docker-image XGGmdDBTSPOa1ZFu6Roldg task definition is part of the scriptworker:build:docker-image:parent Lt9aXLUtSU2lhskGjQCJLg task graph...
2021-07-19T15:21:39     INFO - Found XGGmdDBTSPOa1ZFu6Roldg in the graph; it's a match
2021-07-19T15:21:39     INFO - Verifying scriptworker:build:docker-image:parent Lt9aXLUtSU2lhskGjQCJLg definition...
2021-07-19T15:21:39    DEBUG -  scriptworker:build:docker-image:parent .taskcluster.yml is at https://raw.githubusercontent.com/mozilla-mobile/fenix/7d3b23ceeb12c0e3edcb36836e9041b9ca7a1800/.taskcluster.yml
2021-07-19T15:21:39     INFO - Downloading https://raw.githubusercontent.com/mozilla-mobile/fenix/7d3b23ceeb12c0e3edcb36836e9041b9ca7a1800/.taskcluster.yml
2021-07-19T15:21:39     INFO - Done
2021-07-19T15:21:39    DEBUG -  task_ids: {'default': 'Lt9aXLUtSU2lhskGjQCJLg', 'decision': 'Lt9aXLUtSU2lhskGjQCJLg'}
2021-07-19T15:21:39    DEBUG -  scriptworker:build:docker-image:parent json-e context:
2021-07-19T15:21:39    DEBUG -  {'as_slugid': <function populate_jsone_context.<locals>.<lambda> at 0x7f3f1e828700>,
 'event': {'after': '7d3b23ceeb12c0e3edcb36836e9041b9ca7a1800',
           'before': None,
           'pusher': {'email': 'jlorenzo@mozilla.com'},
           'ref': 'refs/heads/master',
           'repository': {'full_name': 'mozilla-mobile/fenix',
                          'html_url': 'https://github.com/mozilla-mobile/fenix',
                          'name': 'fenix',
                          'pushed_at': None,
                          'ssh_url': 'git@github.com:mozilla-mobile/fenix.git'},
           'sender': {'login': 'MihaiTabara'}},
 'now': '2020-11-16T14:22:03.386Z',
 'ownTaskId': 'Lt9aXLUtSU2lhskGjQCJLg',
 'taskId': None,
 'tasks_for': 'github-push'}
2021-07-19T15:21:39     INFO - scriptworker:build:docker-image:parent: Good.
2021-07-19T15:21:39     INFO - Verifying scriptworker WFLMjMoySVSmOol0bbOSPA as a scriptworker task...
2021-07-19T15:21:39     INFO - Verifying scriptworker:parent YdSRyh2eQbmWRSVnrNqUUg as a docker-worker task...
2021-07-19T15:21:39     INFO - Checking for scriptworker:parent YdSRyh2eQbmWRSVnrNqUUg interactive docker-worker
2021-07-19T15:21:39     INFO - Verifying scriptworker:parent:parent TPRrMS8sRqyUlhyX_P1m_w as a docker-worker task...
2021-07-19T15:21:39     INFO - Checking for scriptworker:parent:parent TPRrMS8sRqyUlhyX_P1m_w interactive docker-worker
2021-07-19T15:21:39     INFO - Verifying scriptworker:build a4IsgWwYRSundiUFj7VVwQ as a docker-worker task...
2021-07-19T15:21:39     INFO - Checking for scriptworker:build a4IsgWwYRSundiUFj7VVwQ interactive docker-worker
2021-07-19T15:21:39    DEBUG -  Verifying scriptworker:build a4IsgWwYRSundiUFj7VVwQ against docker-image XGGmdDBTSPOa1ZFu6Roldg
2021-07-19T15:21:39    DEBUG -  Found matching docker-image sha ef714fa5c8c2aa0df0d48708f2f5e3a411918a894e21fc5243959c4bb8e00bf2
2021-07-19T15:21:39     INFO - Verifying scriptworker:build:docker-image XGGmdDBTSPOa1ZFu6Roldg as a docker-worker task...
2021-07-19T15:21:39     INFO - Checking for scriptworker:build:docker-image XGGmdDBTSPOa1ZFu6Roldg interactive docker-worker
2021-07-19T15:21:39     INFO - Verifying scriptworker:build:docker-image:parent Lt9aXLUtSU2lhskGjQCJLg as a docker-worker task...
2021-07-19T15:21:39     INFO - Checking for scriptworker:build:docker-image:parent Lt9aXLUtSU2lhskGjQCJLg interactive docker-worker
2021-07-19T15:21:39    DEBUG -  Getting source url for scriptworker WFLMjMoySVSmOol0bbOSPA...
2021-07-19T15:21:39     INFO - scriptworker WFLMjMoySVSmOol0bbOSPA: found https://github.com/mozilla-mobile/fenix/blob/3dc8ef806ec95ead8a34c66ca1872b87629d8974/taskcluster/ci/signing
2021-07-19T15:21:39    DEBUG -  Getting source url for scriptworker:parent YdSRyh2eQbmWRSVnrNqUUg...
2021-07-19T15:21:39     INFO - scriptworker:parent YdSRyh2eQbmWRSVnrNqUUg: found https://github.com/mozilla-mobile/fenix/raw/3dc8ef806ec95ead8a34c66ca1872b87629d8974/.taskcluster.yml
2021-07-19T15:21:39    DEBUG -  Getting source url for scriptworker:parent:parent TPRrMS8sRqyUlhyX_P1m_w...
2021-07-19T15:21:39     INFO - scriptworker:parent:parent TPRrMS8sRqyUlhyX_P1m_w: found https://github.com/mozilla-mobile/fenix/raw/3dc8ef806ec95ead8a34c66ca1872b87629d8974/.taskcluster.yml
2021-07-19T15:21:39    DEBUG -  Getting source url for scriptworker:build a4IsgWwYRSundiUFj7VVwQ...
2021-07-19T15:21:39     INFO - scriptworker:build a4IsgWwYRSundiUFj7VVwQ: found https://github.com/mozilla-mobile/fenix/blob/3dc8ef806ec95ead8a34c66ca1872b87629d8974/taskcluster/ci/build
2021-07-19T15:21:39    DEBUG -  Getting source url for scriptworker:build:docker-image XGGmdDBTSPOa1ZFu6Roldg...
2021-07-19T15:21:39     INFO - scriptworker:build:docker-image XGGmdDBTSPOa1ZFu6Roldg: found https://github.com/mozilla-mobile/fenix/blob/7d3b23ceeb12c0e3edcb36836e9041b9ca7a1800/taskcluster/ci/docker-image
2021-07-19T15:21:39    DEBUG -  Getting source url for scriptworker:build:docker-image:parent Lt9aXLUtSU2lhskGjQCJLg...
2021-07-19T15:21:39     INFO - scriptworker:build:docker-image:parent Lt9aXLUtSU2lhskGjQCJLg: found https://github.com/mozilla-mobile/fenix/raw/7d3b23ceeb12c0e3edcb36836e9041b9ca7a1800/.taskcluster.yml
2021-07-19T15:21:39     INFO - Found privileged scope project:mobile:fenix:releng:signing:cert:fennec-production-signing
2021-07-19T15:21:41     INFO - Good.


4.0.0 (Build 6013)

login: eliserichards

body:
Manual create.

All changes since version 3.3.0:

- Import l10n: add EN-GB, UK, RU, ZH-RTW, CS (#1119)
- Manual create (#1093)
- Fixup autofill footer in dark mode. (#1115)
- Add missing locales screengrab file (#1132)
- Fixup edit regressions introduced during edit/create refactor (#1133)
- Update app services to version 0.46.0 (#1124)
- Update string names to send update upstream to l10n (#1142)
- Show errors in create and edit only after the user makes one (#1140)
- Successful create toast notification (#1123)
- Use red trash icon and fix deleted toast (#1146)


3.3.0 (Build 5784)

content_type: text/plain

body:
Stability and UI cleanup.

All changes since version 3.2.0:

- Bump the required Android Components version to 19.0.1 (#1070)
- Update ui tests (#1083)
- Fix interrupts causing the app to go to the item list. (#1075)
- UX cleanup part deux (#1071)
- Introduce Glean SDK (#1085)
- Metadata cleanups for datastore and autofill. (#1102)
- Localization updates (#1110)

3.2.0 (Build 5522)

body:
Stability and UI cleanup.

All changes since version 3.1.0:

- Search bar text handles have violet background (#1035)
- Reconcile l10n strings for translation #1020
- Close keyboard when exiting feedback form (#1057)
- Update ---feature.md (#1063)
- The device back button doesn't have the same functionality with the X button in Edit Login Mode (#994)
- Remove "name" field from the edit view (#1010)
- Whooops! Wrong URL displayed when accessing Learn More from Lockwise settings (#1048)

3.1.0 (Build 5362)

body:
Improve autofill detection and increase target SDK to 28.

All changes since version 3.0.1:

- Hide soft keyboard on unlock with pin (#1024)
- Fixup crash in isButton with Java/Kotlin null dereference (#1039)
- Make autofill detection more robust (#1031)
- Increase target sdk to 28. (#1026)
- Remove color state change on hostname when clicking outside of the cardview (#1030)
- Remove name field from edit view (#1025)


4.0.3 (Build 6584)

body: This version brings the project up to date with Android SDK 29. It only includes minor code changes to deal with API deprecations and changes and has no functional changes.


body: Please see [CHANGELOG](https://github.com/ungoogled-software/ungoogled-chromium-android/blob/master/CHANGELOG.md) for latest updates.


code:
#!/bin/sh

#
# Copyright © 2015-2021 the original authors.
#
# 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
#
#      https://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.
#

##############################################################################
#
#   Gradle start up script for POSIX generated by Gradle.
#
#   Important for running:
#
#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
#       noncompliant, but you have some other compliant shell such as ksh or
#       bash, then to run this script, type that shell name before the whole
#       command line, like:
#
#           ksh Gradle
#
#       Busybox and similar reduced shells will NOT work, because this script
#       requires all of these POSIX shell features:
#         * functions;
#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
#         * compound commands having a testable exit status, especially «case»;
#         * various built-in commands including «command», «set», and «ulimit».
#
#   Important for patching:
#
#   (2) This script targets any POSIX shell, so it avoids extensions provided
#       by Bash, Ksh, etc; in particular arrays are avoided.
#
#       The "traditional" practice of packing multiple parameters into a
#       space-separated string is a well documented source of bugs and security
#       problems, so this is (mostly) avoided, by progressively accumulating
#       options in "$@", and eventually passing that to Java.
#
#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
#       see the in-line comments for details.
#
#       There are tweaks for specific operating systems such as AIX, CygWin,
#       Darwin, MinGW, and NonStop.
#
#   (3) This script is generated from the Groovy template
#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
#       within the Gradle project.
#
#       You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################

# Attempt to set APP_HOME

# Resolve links: $0 may be a link
app_path=$0

# Need this for daisy-chained symlinks.
while
    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
    [ -h "$app_path" ]
do
    ls=$( ls -ld "$app_path" )
    link=${ls#*' -> '}
    case $link in             #(
      /*)   app_path=$link ;; #(
      *)    app_path=$APP_HOME$link ;;
    esac
done

APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit

APP_NAME="Gradle"
APP_BASE_NAME=${0##*/}

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum

warn () {
    echo "$*"
} >&2

die () {
    echo
    echo "$*"
    echo
    exit 1
} >&2

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in                #(
  CYGWIN* )         cygwin=true  ;; #(
  Darwin* )         darwin=true  ;; #(
  MSYS* | MINGW* )  msys=true    ;; #(
  NONSTOP* )        nonstop=true ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD=$JAVA_HOME/jre/sh/java
    else
        JAVACMD=$JAVA_HOME/bin/java
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD=java
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
    case $MAX_FD in #(
      max*)
        MAX_FD=$( ulimit -H -n ) ||
            warn "Could not query maximum file descriptor limit"
    esac
    case $MAX_FD in  #(
      '' | soft) :;; #(
      *)
        ulimit -n "$MAX_FD" ||
            warn "Could not set maximum file descriptor limit to $MAX_FD"
    esac
fi

# Collect all arguments for the java command, stacking in reverse order:
#   * args from the command line
#   * the main class name
#   * -classpath
#   * -D...appname settings
#   * --module-path (only if needed)
#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.

# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )

    JAVACMD=$( cygpath --unix "$JAVACMD" )

    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    for arg do
        if
            case $arg in                                #(
              -*)   false ;;                            # don't mess with options #(
              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
                    [ -e "$t" ] ;;                      #(
              *)    false ;;
            esac
        then
            arg=$( cygpath --path --ignore --mixed "$arg" )
        fi
        # Roll the args list around exactly as many times as the number of
        # args, so each arg winds up back in the position where it started, but
        # possibly modified.
        #
        # NB: a `for` loop captures its iteration list before it begins, so
        # changing the positional parameters here affects neither the number of
        # iterations, nor the values presented in `arg`.
        shift                   # remove old arg
        set -- "$@" "$arg"      # push replacement arg
    done
fi

# Collect all arguments for the java command;
#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
#     shell script including quotes and variable substitutions, so put them in
#     double quotes to make sure that they get re-expanded; and
#   * put everything else in single quotes, so that it's not re-expanded.

set -- \
        "-Dorg.gradle.appname=$APP_BASE_NAME" \
        -classpath "$CLASSPATH" \
        org.gradle.wrapper.GradleWrapperMain \
        "$@"

# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
#   set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#

eval "set -- $(
        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
        xargs -n1 |
        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
        tr '\n' ' '
    )" '"$@"'

exec "$JAVACMD" "$@"

path: gradlew


code:
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem      https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem

@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto execute

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


code:
#!/bin/bash

./gradlew testDebug --fail-fast --tests="*IT"


code:
#!/bin/bash

./gradlew testDebug --fail-fast --tests="*Test"


code: include ':ffupdater'


code:
avatar/*
background/*
files/*
file/*
local/*
_darcs/*
logs/*
log/*
run/*
config.php
.htaccess
httpd.conf
*.tmproj
dataobject.ini
*~
*.bak
*.orig
*.rej
.#*
*.swp
.buildpath
.project
.settings
TODO.rym
config-*.php
good-config.php
lac08.log
php.log
.DS_Store
nbproject
*.mo

path: .gitignore