From 3a346a9ddd923ccedeb4a34102937367ebf6d6b6 Mon Sep 17 00:00:00 2001 From: Dmitriy Voronin Date: Mon, 17 Feb 2020 14:45:42 +0300 Subject: [PATCH 01/12] more release instructions (#187) --- docs/content/Infrastructure.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/content/Infrastructure.md b/docs/content/Infrastructure.md index 343ac6090a..b084ebcc6d 100644 --- a/docs/content/Infrastructure.md +++ b/docs/content/Infrastructure.md @@ -140,8 +140,12 @@ Shared modules between android-test and gradle. [Bintray project](https://bintray.com/avito-tech/maven/avito-android), mirroring to jcenter +1. Make sure integration tests passed via `CI integration tests against avito` 1. Make sure new project version specified in develop head 1. Manually run [Teamcity configuration (internal)](http://links.k.avito.ru/releaseAvitoTools) +1. Use new version in `avito` +1. Create PR with new `infraVersion` +1. Create release on [releases page](https://github.com/avito-tech/avito-android/releases) ### Local integration tests against avito From b019826e2ef397b379eae5eaee2a773c7cad67b6 Mon Sep 17 00:00:00 2001 From: Andrey Danilov Date: Mon, 17 Feb 2020 15:11:09 +0300 Subject: [PATCH 02/12] fixed package name (#188) fixed package name --- .../src/main/kotlin/com/avito/plugin/PullScreenshotsTask.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/gradle/design-screenshots/src/main/kotlin/com/avito/plugin/PullScreenshotsTask.kt b/subprojects/gradle/design-screenshots/src/main/kotlin/com/avito/plugin/PullScreenshotsTask.kt index cc9d903327..1b3047bf1e 100644 --- a/subprojects/gradle/design-screenshots/src/main/kotlin/com/avito/plugin/PullScreenshotsTask.kt +++ b/subprojects/gradle/design-screenshots/src/main/kotlin/com/avito/plugin/PullScreenshotsTask.kt @@ -23,7 +23,7 @@ open class PullScreenshotsTask : DefaultTask() { @TaskAction fun pullScreenshots() { - val applicationId = variant.get().applicationId + val applicationId = variant.get().testVariant.applicationId val adbDevicesManager = AdbDevicesManager(StdOutLogger()) val adbDeviceHandler = AdbDeviceHandlerLocal(ciLogger) val deviceSearch = DeviceSearchLocal(adbDevicesManager) From 9b226b0e3675e311a9e3509c7eebf1b07f0cfaaa Mon Sep 17 00:00:00 2001 From: Sergey Boishtyan Date: Mon, 17 Feb 2020 16:56:38 +0300 Subject: [PATCH 03/12] Test runs slow [Integration check] (#183) * In the end of test run we try to send data to report. It makes test run longer on 15 second * Add common logger module * update version * Update gradle.properties --- settings.gradle.kts | 1 + .../android-test/test-app/build.gradle.kts | 9 ++- .../test-inhouse-runner/build.gradle.kts | 1 + .../monitoring/CompositeTestIssuesMonitor.kt | 2 +- .../kotlin/com/avito/android/runner/Http.kt | 18 +++++- .../InHouseInstrumentationTestRunner.kt | 61 ++++++++++++++++--- .../android/runner/TestRunEnvironment.kt | 39 ++++++++---- .../android-test/test-report/build.gradle.kts | 1 + .../test/report/ReportImplementation.kt | 60 +++--------------- .../report/screenshot/ScreenshotUploader.kt | 5 +- .../report/transport/LocalRunTransport.kt | 10 +-- .../report/video/VideoCaptureTestListener.kt | 36 +++++++---- .../avito/android/test/report/ReportRule.kt | 28 +++++---- .../common/file-storage/build.gradle.kts | 1 + .../avito/filestorage/HttpRemoteStorage.kt | 57 +++++++---------- .../com/avito/filestorage/RemoteStorage.kt | 3 +- subprojects/common/logger/build.gradle.kts | 4 ++ .../main/kotlin/com.avito.logger/Logger.kt | 7 +++ subprojects/common/okhttp/build.gradle.kts | 2 +- .../kotlin/com/avito/http/RetryInterceptor.kt | 7 ++- .../com/avito/http/RetryInterceptorTest.kt | 19 +++++- .../com/avito/http/RetryWithFallbackTest.kt | 18 +++++- .../common/report-viewer/build.gradle.kts | 2 + .../kotlin/com/avito/report/ReportsApi.kt | 3 +- .../kotlin/com/avito/report/ReportsApiImpl.kt | 3 +- .../com/avito/report/ReportsFetchApiImpl.kt | 13 ++-- .../com/avito/report/ReportsHistoryApi.kt | 3 +- .../report/internal/HttpClientProvider.kt | 9 +-- .../kotlin/com/avito/report/ReportsApiTest.kt | 18 +++++- .../avito/report/ReportsFetchApiImplTest.kt | 15 ++++- .../com/avito/report/MockReportsExtension.kt | 19 +++++- .../instrumentation-tests/build.gradle.kts | 1 + .../instrumentation/GetTestResultsAction.kt | 15 ++++- .../InstrumentationTestsAction.kt | 16 ++++- .../listener/ReportViewerTestReporter.kt | 17 ++++-- .../gradle/performance/build.gradle.kts | 1 + .../performance/PerformanceCollectAction.kt | 15 ++++- .../performance/PerformanceCompareAction.kt | 15 ++++- subprojects/gradle/qapps/build.gradle.kts | 1 + .../com/avito/plugin/QAppsUploadAction.kt | 15 ++++- 40 files changed, 385 insertions(+), 185 deletions(-) create mode 100644 subprojects/common/logger/build.gradle.kts create mode 100644 subprojects/common/logger/src/main/kotlin/com.avito.logger/Logger.kt diff --git a/settings.gradle.kts b/settings.gradle.kts index 15b83738ba..439762aa9b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -60,6 +60,7 @@ include(":subprojects:common:test-okhttp") include(":subprojects:common:report-viewer") include(":subprojects:common:sentry") include(":subprojects:common:statsd") +include(":subprojects:common:logger") include(":subprojects:android-test:resource-manager-exceptions") include(":subprojects:android-test:websocket-reporter") diff --git a/subprojects/android-test/test-app/build.gradle.kts b/subprojects/android-test/test-app/build.gradle.kts index 1160e8fcf8..9d6a20adf6 100644 --- a/subprojects/android-test/test-app/build.gradle.kts +++ b/subprojects/android-test/test-app/build.gradle.kts @@ -39,11 +39,10 @@ android { "planSlug" to "AndroidTestApp", "slackToken" to "STUB", "sentryDsn" to "http://stub-project@stub-host/0", - "fileStorageUrl" to "https://stub", - "reportApiUrl" to "https://stub", - "reportApiFallbackUrl" to "https://stub", - "reportViewerUrl" to "https://stub", - "unnecessaryUrl" to "https://localhost" + "fileStorageUrl" to "https://file-storage-stub", + "unnecessaryUrl" to "https://localhost", + // todo move to instrumentation plugin + "avito.report.enabled" to "false" ) ) } diff --git a/subprojects/android-test/test-inhouse-runner/build.gradle.kts b/subprojects/android-test/test-inhouse-runner/build.gradle.kts index da4f422573..bfb8e854b7 100644 --- a/subprojects/android-test/test-inhouse-runner/build.gradle.kts +++ b/subprojects/android-test/test-inhouse-runner/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { implementation(project(":subprojects:common:okhttp")) implementation(project(":subprojects:common:statsd")) implementation(project(":subprojects:common:report-viewer")) + implementation(project(":subprojects:common:logger")) implementation(project(":subprojects:android-test:junit-utils")) implementation(project(":subprojects:android-test:mockito-utils")) implementation(project(":subprojects:android-test:test-report")) diff --git a/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/monitoring/CompositeTestIssuesMonitor.kt b/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/monitoring/CompositeTestIssuesMonitor.kt index 98eeb0cdf3..2cf3e14195 100644 --- a/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/monitoring/CompositeTestIssuesMonitor.kt +++ b/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/monitoring/CompositeTestIssuesMonitor.kt @@ -74,6 +74,6 @@ class CompositeTestIssuesMonitor( .withTag("buildBranch", testRunEnvironment.buildBranch) .withTag("deviceId", testRunEnvironment.deviceId) .withTag("deviceName", testRunEnvironment.deviceName) - .withTag("runId", testRunEnvironment.runId) + .withTag("runId", testRunEnvironment.testRunCoordinates.runId) } } diff --git a/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/Http.kt b/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/Http.kt index 9bc5405040..24c53a3e52 100644 --- a/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/Http.kt +++ b/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/Http.kt @@ -3,6 +3,7 @@ package com.avito.android.runner import android.annotation.SuppressLint import android.util.Log import com.avito.http.RetryInterceptor +import com.avito.logger.Logger import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import java.util.concurrent.TimeUnit @@ -10,8 +11,20 @@ import java.util.concurrent.TimeUnit @SuppressLint("LogNotTimber") internal fun createReportHttpClient(): OkHttpClient { val retryInterceptor = RetryInterceptor(allowedMethods = listOf("GET", "POST"), - logger = { message, error -> Log.v(TAG, message, error) }) - val httpLoggingInterceptor = HttpLoggingInterceptor { Log.v(TAG, it) } + logger = object : Logger { + override fun debug(msg: String) { + Log.v("ReportViewerHttp", msg) + } + + override fun exception(msg: String, error: Throwable) { + Log.v("ReportViewerHttp", msg, error) + } + + override fun critical(msg: String, error: Throwable) { + Log.v("ReportViewerHttp", msg, error) + } + }) + val httpLoggingInterceptor = HttpLoggingInterceptor { Log.v("ReportViewerHttp", it) } .apply { level = HttpLoggingInterceptor.Level.BASIC } @@ -26,4 +39,3 @@ internal fun createReportHttpClient(): OkHttpClient { } private const val TIMEOUT_SECONDS = 30L -private const val TAG = "ReportViewerHttp" diff --git a/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/InHouseInstrumentationTestRunner.kt b/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/InHouseInstrumentationTestRunner.kt index 8522cd91d9..c030871e8f 100644 --- a/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/InHouseInstrumentationTestRunner.kt +++ b/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/InHouseInstrumentationTestRunner.kt @@ -21,9 +21,17 @@ import com.avito.android.test.report.model.TestMetadata import com.avito.android.test.report.model.TestType import com.avito.android.test.report.performance.PerformanceProvider import com.avito.android.test.report.performance.PerformanceTestReporter +import com.avito.android.test.report.transport.ExternalStorageTransport +import com.avito.android.test.report.transport.LocalRunTransport +import com.avito.android.test.report.transport.Transport import com.avito.android.test.report.video.VideoCaptureTestListener import com.avito.android.util.DeviceSettingsChecker import com.avito.android.util.ImitateFlagProvider +import com.avito.logger.Logger +import com.avito.report.model.DeviceName +import com.avito.report.model.EntryTypeAdapterFactory +import com.google.gson.Gson +import com.google.gson.GsonBuilder import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.mockwebserver.MockWebServer @@ -43,26 +51,61 @@ abstract class InHouseInstrumentationTestRunner : ) } + private val testReportLogger: Logger = object : Logger { + override fun debug(msg: String) { + Log.d("TestReport", msg) + } + + override fun exception(msg: String, error: Throwable) { + Log.e("TestReport", msg, error) + } + + override fun critical(msg: String, error: Throwable) { + Log.e("TestReport", msg, error) + sentry.sendException(error) + } + + } + override val performanceTestReporter = PerformanceTestReporter() override val report: Report by lazy { val runEnvironment = testRunEnvironment.asRunEnvironmentOrThrow() + val isLocalRun = runEnvironment.teamcityBuildId <= 0 + val transport: List = when { + isLocalRun -> { + if (runEnvironment.reportConfig != null) { + listOf( + LocalRunTransport( + reportApiHost = runEnvironment.reportConfig.reportApiUrl, + reportFallbackUrl = runEnvironment.reportConfig.reportApiFallbackUrl, + reportViewerUrl = runEnvironment.reportConfig.reportViewerUrl, + reportCoordinates = runEnvironment.testRunCoordinates, + deviceName = DeviceName(runEnvironment.deviceName), + logger = testReportLogger + ) + ) + } else { + emptyList() + } + } + else -> { + val gson: Gson = GsonBuilder() + .registerTypeAdapterFactory(EntryTypeAdapterFactory()) + .create() + listOf(ExternalStorageTransport(gson)) + } + } ReportImplementation( - planSlug = runEnvironment.planSlug, - jobSlug = runEnvironment.jobSlug, - runId = runEnvironment.runId, - deviceName = runEnvironment.deviceName, - isLocalRun = runEnvironment.teamcityBuildId <= 0, sentry = sentry, fileStorageUrl = runEnvironment.fileStorageUrl, - reportApiUrl = runEnvironment.reportApiUrl, - reportApiFallbackUrl = runEnvironment.reportApiFallbackUrl, - reportViewerUrl = runEnvironment.reportViewerUrl, onDeviceCacheDirectory = runEnvironment.outputDirectory, httpClient = reportHttpClient, onIncident = { testIssuesMonitor.onFailure(it) }, - performanceTestReporter = performanceTestReporter + performanceTestReporter = performanceTestReporter, + transport = transport, + logger = testReportLogger ) } diff --git a/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/TestRunEnvironment.kt b/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/TestRunEnvironment.kt index 6ec02cdc4a..d42dd05456 100644 --- a/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/TestRunEnvironment.kt +++ b/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/TestRunEnvironment.kt @@ -9,12 +9,19 @@ import com.avito.android.runner.annotation.resolver.TEST_METADATA_KEY import com.avito.android.test.report.ArgsProvider import com.avito.android.test.report.model.TestMetadata import com.avito.android.test.report.video.VideoFeatureValue +import com.avito.report.model.ReportCoordinates import okhttp3.HttpUrl import java.io.File import java.util.UUID sealed class TestRunEnvironment { + data class ReportConfig( + val reportApiUrl: String, + val reportApiFallbackUrl: String, + val reportViewerUrl: String + ) + fun asRunEnvironmentOrThrow(): RunEnvironment { if (this !is RunEnvironment) { throw RuntimeException("Expected run environment type: RunEnvironment, actual: $this") @@ -49,10 +56,7 @@ sealed class TestRunEnvironment { val isImitation: Boolean, val deviceId: String, - val planSlug: String, - val jobSlug: String, val deviceName: String, - val runId: String, val teamcityBuildId: Int, val buildBranch: String, @@ -78,9 +82,8 @@ sealed class TestRunEnvironment { val outputDirectory: Lazy, val sentryDsn: String, val fileStorageUrl: String, - val reportApiUrl: String, - val reportApiFallbackUrl: String, - val reportViewerUrl: String + val reportConfig: ReportConfig?, + val testRunCoordinates: ReportCoordinates ) : TestRunEnvironment() } @@ -96,14 +99,27 @@ fun provideEnvironment( return when (isFakeOrchestratorRun) { true -> TestRunEnvironment.OrchestratorFakeRunEnvironment false -> try { + val coordinates = ReportCoordinates( + planSlug = argumentsProvider.getMandatoryArgument("planSlug"), + jobSlug = argumentsProvider.getMandatoryArgument("jobSlug"), + runId = argumentsProvider.getMandatoryArgument("runId") + ) + // todo move to instrumentation plugin + val isReportEnabled = (argumentsProvider.getOptionalArgument("avito.report.enabled") ?: "true").toBoolean() + val reportConfig = if (isReportEnabled) { + TestRunEnvironment.ReportConfig( + reportApiUrl = argumentsProvider.getMandatoryArgument("reportApiUrl"), + reportApiFallbackUrl = argumentsProvider.getMandatoryArgument("reportApiFallbackUrl"), + reportViewerUrl = argumentsProvider.getMandatoryArgument("reportViewerUrl") + ) + } else { + null + } TestRunEnvironment.RunEnvironment( isImitation = argumentsProvider.getOptionalArgument("imitation") == "true", deviceId = argumentsProvider.getOptionalArgument("deviceId") ?: UUID.randomUUID().toString(), - planSlug = argumentsProvider.getMandatoryArgument("planSlug"), - jobSlug = argumentsProvider.getMandatoryArgument("jobSlug"), deviceName = argumentsProvider.getMandatoryArgument("deviceName"), - runId = argumentsProvider.getMandatoryArgument("runId"), teamcityBuildId = argumentsProvider.getMandatoryArgument("teamcityBuildId").toInt(), buildBranch = argumentsProvider.getMandatoryArgument("buildBranch"), buildCommit = argumentsProvider.getMandatoryArgument("buildCommit"), @@ -128,9 +144,8 @@ fun provideEnvironment( slackToken = argumentsProvider.getMandatoryArgument("slackToken"), sentryDsn = argumentsProvider.getMandatoryArgument("sentryDsn"), fileStorageUrl = argumentsProvider.getMandatoryArgument("fileStorageUrl"), - reportApiUrl = argumentsProvider.getMandatoryArgument("reportApiUrl"), - reportApiFallbackUrl = argumentsProvider.getMandatoryArgument("reportApiFallbackUrl"), - reportViewerUrl = argumentsProvider.getMandatoryArgument("reportViewerUrl") + testRunCoordinates = coordinates, + reportConfig = reportConfig ) } catch (e: Throwable) { TestRunEnvironment.InitError(e.message ?: "Unknown error") diff --git a/subprojects/android-test/test-report/build.gradle.kts b/subprojects/android-test/test-report/build.gradle.kts index e457962381..ea5266810b 100644 --- a/subprojects/android-test/test-report/build.gradle.kts +++ b/subprojects/android-test/test-report/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { implementation(project(":subprojects:common:time")) implementation(project(":subprojects:common:file-storage")) implementation(project(":subprojects:common:report-viewer")) + implementation(project(":subprojects:common:logger")) implementation(project(":subprojects:android-test:test-annotations")) implementation(project(":subprojects:android-test:ui-testing-core")) implementation(project(":subprojects:android-test:resource-manager-exceptions")) diff --git a/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/ReportImplementation.kt b/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/ReportImplementation.kt index 757f74c4d6..7afee5c780 100644 --- a/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/ReportImplementation.kt +++ b/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/ReportImplementation.kt @@ -20,20 +20,14 @@ import com.avito.android.test.report.model.TestMetadata import com.avito.android.test.report.performance.PerformanceTestReporter import com.avito.android.test.report.screenshot.ScreenshotCapturer import com.avito.android.test.report.screenshot.ScreenshotUploader -import com.avito.android.test.report.transport.ExternalStorageTransport -import com.avito.android.test.report.transport.LocalRunTransport import com.avito.android.test.report.transport.Transport import com.avito.filestorage.FutureValue import com.avito.filestorage.RemoteStorage -import com.avito.report.model.DeviceName +import com.avito.logger.Logger import com.avito.report.model.Entry -import com.avito.report.model.EntryTypeAdapterFactory import com.avito.report.model.Incident -import com.avito.report.model.ReportCoordinates import com.avito.time.DefaultTimeProvider import com.avito.time.TimeProvider -import com.google.gson.Gson -import com.google.gson.GsonBuilder import io.sentry.SentryClient import okhttp3.OkHttpClient import java.io.File @@ -47,48 +41,15 @@ import java.io.File @Suppress("FoldInitializerAndIfToElvis") @SuppressLint("LogNotTimber") class ReportImplementation( - planSlug: String, - jobSlug: String, - runId: String, - deviceName: String, onDeviceCacheDirectory: Lazy, httpClient: OkHttpClient, - isLocalRun: Boolean, fileStorageUrl: String, - reportApiUrl: String, - reportApiFallbackUrl: String, - reportViewerUrl: String, + // TODO hide sentry override val sentry: SentryClient, private val onIncident: (Throwable) -> Unit = {}, private val performanceTestReporter: PerformanceTestReporter, - private val logger: (String, Throwable?) -> Unit = { msg, error -> - Log.d(TAG, msg, error) - if (error != null) { - sentry.sendException(error) - } - }, - private val gson: Gson = GsonBuilder() - .registerTypeAdapterFactory(EntryTypeAdapterFactory()) - .create(), - private val testRunCoordinates: ReportCoordinates = ReportCoordinates( - planSlug = planSlug, - jobSlug = jobSlug, - runId = runId - ), - private val transport: List = if (isLocalRun) { - listOf( - LocalRunTransport( - reportApiHost = reportApiUrl, - reportFallbackUrl = reportApiFallbackUrl, - reportViewerUrl = reportViewerUrl, - reportCoordinates = testRunCoordinates, - deviceName = DeviceName(deviceName), - logger = logger - ) - ) - } else { - listOf(ExternalStorageTransport(gson)) - } + private val logger: Logger, + private val transport: List ) : Report, StepLifecycleListener by StepLifecycleNotifier, TestLifecycleListener by TestLifecycleNotifier, @@ -244,10 +205,9 @@ class ReportImplementation( currentState.endTime = timeProvider.nowInSeconds() afterTestStop(this) } - - logger("Start waiting for uploads inside reportTestCase", null) + logger.debug("Start waiting for uploads inside reportTestCase") waitUploads(currentState) - logger("Waiting for uploads inside reportTestCase completed", null) + logger.debug("Waiting for uploads inside reportTestCase completed") currentState.apply { /** @@ -380,7 +340,7 @@ class ReportImplementation( futureUploads.add(screenshotFuture) } } catch (t: Throwable) { - logger("Failed to update step with captured screenshot", t) + logger.critical("Failed to update step with captured screenshot", t) return@methodExecutionTracing null } } @@ -536,11 +496,9 @@ $content } private fun methodExecutionTracing(name: String, action: () -> T): T { - logger("Method: $name execution started", null) + logger.debug("Method: $name execution started") val result = action() - logger("Method: $name execution completed", null) + logger.debug("Method: $name execution completed") return result } } - -private const val TAG = "TestReport" diff --git a/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/screenshot/ScreenshotUploader.kt b/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/screenshot/ScreenshotUploader.kt index e47233fb52..9b4bf9b687 100644 --- a/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/screenshot/ScreenshotUploader.kt +++ b/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/screenshot/ScreenshotUploader.kt @@ -2,6 +2,7 @@ package com.avito.android.test.report.screenshot import com.avito.filestorage.FutureValue import com.avito.filestorage.RemoteStorage +import com.avito.logger.Logger import java.io.File interface ScreenshotUploader { @@ -13,7 +14,7 @@ interface ScreenshotUploader { class Impl( private val remoteStorage: RemoteStorage, private val screenshotCapturer: ScreenshotCapturer, - private val logger: (String, Throwable?) -> Unit + private val logger: Logger ) : ScreenshotUploader { override fun makeAndUploadScreenshot(comment: String): FutureValue? { @@ -22,7 +23,7 @@ interface ScreenshotUploader { val screenshot: File = try { screenshotCapturer.captureToFile() } catch (e: IllegalStateException) { - logger("Unable to make screenshot: ${e.message}", null) + logger.exception("Unable to make screenshot: ${e.message}", e) return null } diff --git a/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/transport/LocalRunTransport.kt b/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/transport/LocalRunTransport.kt index 7fde0bed65..f29643809f 100644 --- a/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/transport/LocalRunTransport.kt +++ b/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/transport/LocalRunTransport.kt @@ -2,6 +2,7 @@ package com.avito.android.test.report.transport import android.os.Looper import com.avito.android.test.report.ReportState +import com.avito.logger.Logger import com.avito.report.ReportViewer import com.avito.report.ReportsApi import com.avito.report.model.AndroidTest @@ -17,7 +18,7 @@ class LocalRunTransport( reportViewerUrl: String, private val reportCoordinates: ReportCoordinates, private val deviceName: DeviceName, - private val logger: (String, Throwable?) -> Unit, + private val logger: Logger, private val reportsApi: ReportsApi = ReportsApi.create( host = reportApiHost, fallbackUrl = reportFallbackUrl, @@ -83,9 +84,8 @@ class LocalRunTransport( ) ) - logger( - "Report link for test ${testName.name}: ${reportViewer.generateSingleTestRunUrl(result.get())}", - null + logger.debug( + "Report link for test ${testName.name}: ${reportViewer.generateSingleTestRunUrl(result.get())}" ) if (reportCoordinates.runId.contains("local", ignoreCase = true)) { @@ -93,7 +93,7 @@ class LocalRunTransport( } } catch (e: Exception) { - logger("Report send failed", e) + logger.critical("Report send failed", e) } } } diff --git a/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/video/VideoCaptureTestListener.kt b/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/video/VideoCaptureTestListener.kt index 961527a528..20f5d4fe3f 100644 --- a/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/video/VideoCaptureTestListener.kt +++ b/subprojects/android-test/test-report/src/main/kotlin/com/avito/android/test/report/video/VideoCaptureTestListener.kt @@ -6,6 +6,7 @@ import com.avito.android.test.report.ReportState import com.avito.android.test.report.listener.TestLifecycleListener import com.avito.filestorage.FutureValue import com.avito.filestorage.RemoteStorage +import com.avito.logger.Logger import com.avito.report.model.Incident import com.avito.report.model.Video import okhttp3.OkHttpClient @@ -18,11 +19,25 @@ class VideoCaptureTestListener( httpClient: OkHttpClient, fileStorageUrl: String, private val shouldRecord: Boolean, - private val logger: (String, Throwable?) -> Unit = { msg, error -> Log.d(LOG_TAG, msg, error) }, private val videoFeature: VideoFeature = VideoFeatureImplementation(videoFeatureValue), private val videoCapturer: VideoCapturer = VideoCapturerImplementation(onDeviceCacheDirectory) ) : TestLifecycleListener { + private val logger: Logger = object : Logger { + override fun debug(msg: String) { + Log.d(LOG_TAG, msg) + } + + override fun exception(msg: String, error: Throwable) { + Log.d(LOG_TAG, msg, error) + } + + override fun critical(msg: String, error: Throwable) { + Log.d(LOG_TAG, msg, error) + } + + } + private val remoteStorage: RemoteStorage = RemoteStorage.create( logger = logger, httpClient = httpClient, @@ -33,11 +48,11 @@ class VideoCaptureTestListener( override fun beforeTestStart(state: ReportState.Initialized.Started) { if (videoFeature.videoRecordingEnabled(shouldRecord)) { - logger("Video recording feature enabled. Recording starting", null) + logger.debug("Video recording feature enabled. Recording starting") videoCapturer.start() - logger("Video recording feature enabled. Recording started", null) + logger.debug("Video recording feature enabled. Recording started") } else { - logger("Video recording feature disabled. Recording hasn't started", null) + logger.debug("Video recording feature disabled. Recording hasn't started") } } @@ -47,9 +62,9 @@ class VideoCaptureTestListener( override fun afterTestStop(state: ReportState.Initialized.Started) { if (videoFeature.videoUploadingEnabled(shouldRecord, savedIncident)) { - logger("Video uploading enabled. Recording stopping...", null) + logger.debug("Video uploading enabled. Recording stopping...") val videoFile = videoCapturer.stop() - logger("Video uploading enabled. Recording stopped", null) + logger.debug("Video uploading enabled. Recording stopped") if (videoFile != null) { val video = remoteStorage.upload( @@ -58,18 +73,17 @@ class VideoCaptureTestListener( ), comment = "video" ) - logger("Video uploading enabled. Video uploaded", null) + logger.debug("Video uploading enabled. Video uploaded") waitUploads(state = state, video = video) } else { - logger( - "Video uploading enabled. Filed to upload video for ${state.testMetadata.className}.${state.testMetadata.methodName}", - null + logger.debug( + "Video uploading enabled. Filed to upload video for ${state.testMetadata.className}.${state.testMetadata.methodName}" ) } } else { videoCapturer.abort() - logger("Video uploading disabled. Video recording process aborted", null) + logger.debug("Video uploading disabled. Video recording process aborted") } } diff --git a/subprojects/android-test/test-report/src/test/kotlin/com/avito/android/test/report/ReportRule.kt b/subprojects/android-test/test-report/src/test/kotlin/com/avito/android/test/report/ReportRule.kt index 7ad9339845..ffc861d0c7 100644 --- a/subprojects/android-test/test-report/src/test/kotlin/com/avito/android/test/report/ReportRule.kt +++ b/subprojects/android-test/test-report/src/test/kotlin/com/avito/android/test/report/ReportRule.kt @@ -10,6 +10,7 @@ import com.avito.android.test.report.performance.PerformanceTestReporter import com.avito.android.test.report.screenshot.ScreenshotUploader import com.avito.android.test.report.transport.LocalRunTransport import com.avito.filestorage.RemoteStorage +import com.avito.logger.Logger import com.avito.report.model.DeviceName import com.avito.report.model.Kind import com.avito.report.model.ReportCoordinates @@ -27,13 +28,26 @@ import okhttp3.mock.MockInterceptor * чтобы посмотреть как оно отображается */ internal class ReportRule( + // todo useless because report urls are empty val sendRealReport: Boolean = false, val mockTimeProvider: TimeProvider = mock(), private val mockInterceptor: MockInterceptor = MockInterceptor(), private val screenshotUploader: ScreenshotUploader = mock(), - private val logger: (String, Throwable?) -> Unit = { message, exception -> - println(message) - exception?.printStackTrace() + private val logger: Logger = object: Logger { + override fun debug(msg: String) { + println(msg) + } + + override fun exception(msg: String, error: Throwable) { + println(msg) + error.printStackTrace() + } + + override fun critical(msg: String, error: Throwable) { + println(msg) + error.printStackTrace() + } + }, private val testRunCoordinates: ReportCoordinates = ReportCoordinates( planSlug = "android-test", @@ -42,16 +56,8 @@ internal class ReportRule( ), private val deviceName: String = "android-test", private val report: Report = ReportImplementation( - planSlug = testRunCoordinates.planSlug, - jobSlug = testRunCoordinates.jobSlug, - runId = testRunCoordinates.runId, - deviceName = deviceName, - isLocalRun = true, sentry = SentryClientFactory.sentryClient(), // TODO required? fileStorageUrl = "https://stub.ru", // TODO required? - reportApiUrl = "", // TODO required? - reportApiFallbackUrl = "", // TODO required - reportViewerUrl = "", // TODO required onDeviceCacheDirectory = lazy { error("nope") }, httpClient = OkHttpClient.Builder() .apply { diff --git a/subprojects/common/file-storage/build.gradle.kts b/subprojects/common/file-storage/build.gradle.kts index 5bd3be0c2e..1515f9e71f 100644 --- a/subprojects/common/file-storage/build.gradle.kts +++ b/subprojects/common/file-storage/build.gradle.kts @@ -10,6 +10,7 @@ val okhttpVersion: String by project dependencies { implementation(project(":subprojects:common:time")) + implementation(project(":subprojects:common:logger")) implementation("com.squareup.retrofit2:retrofit:$retrofitVersion") implementation("com.squareup.okhttp3:okhttp:$okhttpVersion") diff --git a/subprojects/common/file-storage/src/main/kotlin/com/avito/filestorage/HttpRemoteStorage.kt b/subprojects/common/file-storage/src/main/kotlin/com/avito/filestorage/HttpRemoteStorage.kt index 85941f1c28..fe354c8e78 100644 --- a/subprojects/common/file-storage/src/main/kotlin/com/avito/filestorage/HttpRemoteStorage.kt +++ b/subprojects/common/file-storage/src/main/kotlin/com/avito/filestorage/HttpRemoteStorage.kt @@ -1,5 +1,6 @@ package com.avito.filestorage +import com.avito.logger.Logger import com.avito.time.DefaultTimeProvider import com.avito.time.TimeProvider import okhttp3.HttpUrl @@ -13,7 +14,7 @@ class HttpRemoteStorage( private val endpoint: HttpUrl, httpClient: OkHttpClient, private val timeSource: TimeProvider = DefaultTimeProvider(), - private val logger: (String, Throwable?) -> Unit + private val logger: Logger ) : RemoteStorage { private val storageClient: FileStorageClient = @@ -56,7 +57,7 @@ class HttpRemoteStorage( } .enqueue(object : Callback { override fun onFailure(call: Call, t: Throwable) { - logUploadingError(uploadRequest) + logger.critical(getUploadRequestErrorMessage(uploadRequest), t) deleteUploadedFile( uploadRequest = uploadRequest, @@ -82,13 +83,10 @@ class HttpRemoteStorage( uploadRequest = uploadRequest ) } else { - logUploadingError( - uploadRequest = uploadRequest, - body = response.body() - ) - + val exception = RuntimeException("Uploading failed with response: ${response.body()}") + logger.critical(getUploadRequestErrorMessage(uploadRequest, response.body()), exception) RemoteStorage.Result.Error( - t = RuntimeException("Uploading failed with response: ${response.body()}") + t = exception ) } @@ -120,17 +118,15 @@ class HttpRemoteStorage( ) { when (uploadRequest) { is RemoteStorage.Request.FileRequest -> - logger( + logger.debug( "RemoteStorage: Uploading file: ${uploadRequest.file.absolutePath} " + - "with size: ${uploadRequest.file.length()} bytes", - null + "with size: ${uploadRequest.file.length()} bytes" ) is RemoteStorage.Request.ContentRequest -> - logger( + logger.debug( "RemoteStorage: Uploading content with size: ${uploadRequest.content.length} " + - "with extension: ${uploadRequest.extension}", - null + "with extension: ${uploadRequest.extension}" ) } } @@ -141,39 +137,28 @@ class HttpRemoteStorage( ) { when (uploadRequest) { is RemoteStorage.Request.FileRequest -> - logger( - "RemoteStorage: File: ${uploadRequest.file.absolutePath} uploaded to url: $url", - null + logger.debug( + "RemoteStorage: File: ${uploadRequest.file.absolutePath} uploaded to url: $url" ) is RemoteStorage.Request.ContentRequest -> - logger( - "RemoteStorage: Content with size: ${uploadRequest.content.length} uploaded to url: $url", - null + logger.debug( + "RemoteStorage: Content with size: ${uploadRequest.content.length} uploaded to url: $url" ) } } - private fun logUploadingError( + private fun getUploadRequestErrorMessage( uploadRequest: RemoteStorage.Request, - t: Throwable? = null, body: String? = null - ) { + ) = when (uploadRequest) { is RemoteStorage.Request.FileRequest -> - logger( - "RemoteStorage: Filed to upload file: ${uploadRequest.file.absolutePath}" + - if (body != null) " with body: $body" else "", - t - ) - + "RemoteStorage: Filed to upload file: ${uploadRequest.file.absolutePath}" + + if (body != null) " with body: $body" else "" is RemoteStorage.Request.ContentRequest -> - logger( - "RemoteStorage: Filed to upload content with size: ${uploadRequest.content.length} " + - "as ${uploadRequest.extension}" + - if (body != null) " with body: $body" else "", - t - ) + "RemoteStorage: Filed to upload content with size: ${uploadRequest.content.length} " + + "as ${uploadRequest.extension}" + + if (body != null) " with body: $body" else "" } - } } diff --git a/subprojects/common/file-storage/src/main/kotlin/com/avito/filestorage/RemoteStorage.kt b/subprojects/common/file-storage/src/main/kotlin/com/avito/filestorage/RemoteStorage.kt index 29db0dd2c0..c919a848e0 100644 --- a/subprojects/common/file-storage/src/main/kotlin/com/avito/filestorage/RemoteStorage.kt +++ b/subprojects/common/file-storage/src/main/kotlin/com/avito/filestorage/RemoteStorage.kt @@ -1,5 +1,6 @@ package com.avito.filestorage +import com.avito.logger.Logger import okhttp3.HttpUrl import okhttp3.MediaType import okhttp3.OkHttpClient @@ -11,7 +12,7 @@ interface RemoteStorage { fun create( endpoint: String, - logger: (String, Throwable?) -> Unit, + logger: Logger, httpClient: OkHttpClient = OkHttpClient() ): RemoteStorage = HttpRemoteStorage( endpoint = requireNotNull(HttpUrl.parse(endpoint)) , diff --git a/subprojects/common/logger/build.gradle.kts b/subprojects/common/logger/build.gradle.kts new file mode 100644 index 0000000000..58602ab7a3 --- /dev/null +++ b/subprojects/common/logger/build.gradle.kts @@ -0,0 +1,4 @@ +plugins { + id("kotlin") + `maven-publish` +} diff --git a/subprojects/common/logger/src/main/kotlin/com.avito.logger/Logger.kt b/subprojects/common/logger/src/main/kotlin/com.avito.logger/Logger.kt new file mode 100644 index 0000000000..0c8c599d0b --- /dev/null +++ b/subprojects/common/logger/src/main/kotlin/com.avito.logger/Logger.kt @@ -0,0 +1,7 @@ +package com.avito.logger + +interface Logger { + fun debug(msg: String) + fun exception(msg: String, error: Throwable) + fun critical(msg: String, error: Throwable) +} diff --git a/subprojects/common/okhttp/build.gradle.kts b/subprojects/common/okhttp/build.gradle.kts index d3b6357a91..d21f6de4ad 100644 --- a/subprojects/common/okhttp/build.gradle.kts +++ b/subprojects/common/okhttp/build.gradle.kts @@ -10,7 +10,7 @@ val retrofitVersion: String by project dependencies { implementation("com.squareup.okhttp3:okhttp:$okhttpVersion") - + implementation(project(":subprojects:common:logger")) testImplementation(project(":subprojects:common:test-okhttp")) testImplementation("org.funktionale:funktionale-try:$funktionaleVersion") testImplementation("com.squareup.okhttp3:mockwebserver:$okhttpVersion") diff --git a/subprojects/common/okhttp/src/main/kotlin/com/avito/http/RetryInterceptor.kt b/subprojects/common/okhttp/src/main/kotlin/com/avito/http/RetryInterceptor.kt index 55c70b9f3c..304786ee8b 100644 --- a/subprojects/common/okhttp/src/main/kotlin/com/avito/http/RetryInterceptor.kt +++ b/subprojects/common/okhttp/src/main/kotlin/com/avito/http/RetryInterceptor.kt @@ -1,5 +1,6 @@ package com.avito.http +import com.avito.logger.Logger import okhttp3.Interceptor import okhttp3.Response import java.io.IOException @@ -21,7 +22,7 @@ class RetryInterceptor( ), private val delayMs: Long = TimeUnit.SECONDS.toMillis(1), private val useIncreasingDelay: Boolean = true, - private val logger: (message: String, error: Throwable?) -> Unit, + private val logger: Logger, private val onSuccess: (Response) -> Unit = {}, private val onFailure: (Response) -> Unit = {} ) : Interceptor { @@ -42,10 +43,10 @@ class RetryInterceptor( try { prepareForRetry(response) response = chain.proceed(request) - logger("Try: $tryCount. Response: $response", null) + logger.debug("Try: $tryCount. Response: $response") } catch (exception: IOException) { error = exception - logger("Try: $tryCount. Failed to execute request. Error: ${error.message}", error) + logger.critical("Try: $tryCount. Failed to execute request. Error: ${error.message}", exception) } if (response != null) { diff --git a/subprojects/common/okhttp/src/test/kotlin/com/avito/http/RetryInterceptorTest.kt b/subprojects/common/okhttp/src/test/kotlin/com/avito/http/RetryInterceptorTest.kt index dc0832890d..bbe3ba39fd 100644 --- a/subprojects/common/okhttp/src/test/kotlin/com/avito/http/RetryInterceptorTest.kt +++ b/subprojects/common/okhttp/src/test/kotlin/com/avito/http/RetryInterceptorTest.kt @@ -1,5 +1,6 @@ package com.avito.http +import com.avito.logger.Logger import com.google.common.truth.Truth.assertThat import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockWebServer @@ -101,9 +102,21 @@ internal class RetryInterceptorTest { RetryInterceptor( retries = maxAttempts, delayMs = 1, - logger = { message, error -> - println(message) - error?.printStackTrace() + logger = object : Logger { + override fun debug(msg: String) { + println(msg) + } + + override fun exception(msg: String, error: Throwable) { + println(msg) + error.printStackTrace() + + } + + override fun critical(msg: String, error: Throwable) { + println(msg) + error.printStackTrace() + } }, allowedMethods = listOf("GET", "POST"), useIncreasingDelay = false diff --git a/subprojects/common/okhttp/src/test/kotlin/com/avito/http/RetryWithFallbackTest.kt b/subprojects/common/okhttp/src/test/kotlin/com/avito/http/RetryWithFallbackTest.kt index c26963f901..b481bd5110 100644 --- a/subprojects/common/okhttp/src/test/kotlin/com/avito/http/RetryWithFallbackTest.kt +++ b/subprojects/common/okhttp/src/test/kotlin/com/avito/http/RetryWithFallbackTest.kt @@ -1,5 +1,6 @@ package com.avito.http +import com.avito.logger.Logger import com.avito.test.http.MockDispatcher import com.google.common.truth.Truth.assertThat import okhttp3.mockwebserver.MockResponse @@ -29,7 +30,22 @@ class RetryWithFallbackTest { RetryInterceptor( allowedMethods = listOf("POST"), allowedCodes = listOf(503), - logger = { _, _ -> }) + logger = object : Logger { + override fun debug(msg: String) { + println(msg) + } + + override fun exception(msg: String, error: Throwable) { + println(msg) + error.printStackTrace() + + } + + override fun critical(msg: String, error: Throwable) { + println(msg) + error.printStackTrace() + } + }) ) addInterceptor( FallbackInterceptor( diff --git a/subprojects/common/report-viewer/build.gradle.kts b/subprojects/common/report-viewer/build.gradle.kts index b437ec2e02..b2e369562d 100644 --- a/subprojects/common/report-viewer/build.gradle.kts +++ b/subprojects/common/report-viewer/build.gradle.kts @@ -13,6 +13,7 @@ val funktionaleVersion: String by project dependencies { implementation(project(":subprojects:common:okhttp")) + implementation(project(":subprojects:common:logger")) implementation("com.squareup.okhttp3:logging-interceptor:$okhttpVersion") implementation("com.google.code.gson:gson:$gsonVersion") implementation("com.github.salomonbrys.kotson:kotson:$kotsonVersion") @@ -24,6 +25,7 @@ dependencies { testImplementation("com.jayway.jsonpath:json-path-assert:$jsonPathVersion") testFixturesImplementation(project(":subprojects:common:test-okhttp")) + testFixturesImplementation(project(":subprojects:common:logger")) testFixturesImplementation("com.google.code.gson:gson:$gsonVersion") testFixturesImplementation("org.funktionale:funktionale-try:$funktionaleVersion") } diff --git a/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsApi.kt b/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsApi.kt index 2d6df37d66..b525b37612 100644 --- a/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsApi.kt +++ b/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsApi.kt @@ -1,5 +1,6 @@ package com.avito.report +import com.avito.logger.Logger import com.avito.report.internal.JsonRpcRequestProvider import com.avito.report.internal.getHttpClient import com.avito.report.model.CreateResult @@ -59,7 +60,7 @@ interface ReportsApi : ReportsAddApi, ReportsFetchApi { fun create( host: String, fallbackUrl: String, - logger: (String, Throwable?) -> Unit, + logger: Logger, verboseHttp: Boolean = false ): ReportsApi { diff --git a/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsApiImpl.kt b/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsApiImpl.kt index f2c1561519..c793540f45 100644 --- a/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsApiImpl.kt +++ b/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsApiImpl.kt @@ -1,5 +1,6 @@ package com.avito.report +import com.avito.logger.Logger import com.avito.report.internal.JsonRpcRequestProvider import com.avito.report.internal.model.ConclusionStatus import com.avito.report.internal.model.CreateResponse @@ -17,7 +18,7 @@ import org.funktionale.tries.Try internal class ReportsApiImpl( private val gson: Gson, - private val logger: (String, Throwable?) -> Unit, + private val logger: Logger, private val requestProvider: JsonRpcRequestProvider ) : ReportsApi, ReportsAddApi by ReportsAddApiImpl(requestProvider), diff --git a/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsFetchApiImpl.kt b/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsFetchApiImpl.kt index 4cea4bbc93..e84ddccc22 100644 --- a/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsFetchApiImpl.kt +++ b/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsFetchApiImpl.kt @@ -2,6 +2,7 @@ package com.avito.report import com.avito.android.test.annotations.TestCaseBehavior import com.avito.android.test.annotations.TestCasePriority +import com.avito.logger.Logger import com.avito.report.internal.JsonRpcRequestProvider import com.avito.report.internal.model.ConclusionStatus import com.avito.report.internal.model.ListResult @@ -30,7 +31,7 @@ import org.funktionale.tries.Try internal class ReportsFetchApiImpl( private val requestProvider: JsonRpcRequestProvider, private val gson: Gson, - private val logger: (String, Throwable?) -> Unit + private val logger: Logger ) : ReportsFetchApi { override fun getReportsList( @@ -232,7 +233,7 @@ internal class ReportsFetchApiImpl( val verdict = reportModel.preparedData?.lastOrNull()?.verdict if (verdict.isNullOrBlank()) { //todo fallback - logger.invoke("Can't get verdict for test: $reportModel", null) + logger.debug("Can't get verdict for test: $reportModel") Status.Failure( "Can't get verdict", reportModel.lastErrorHash ?: "hash unavailable" @@ -251,15 +252,15 @@ internal class ReportsFetchApiImpl( private fun determineStability(reportModel: ListResult): Stability { return when { reportModel.attemptsCount == null || reportModel.successCount == null -> { - logger.invoke("should not be here $reportModel", null) + logger.debug("should not be here $reportModel") Stability.Stable } reportModel.attemptsCount < 1 -> { - logger.invoke("test without attempts? $reportModel", null) + logger.debug("test without attempts? $reportModel") Stability.Failing(reportModel.attemptsCount) // на самом деле не совсем, репортим эту ситуацию как невероятную } reportModel.successCount > reportModel.attemptsCount -> { - logger.invoke("success count > attempts count?? $reportModel", null) + logger.debug("success count > attempts count?? $reportModel") Stability.Stable // на самом деле не совсем, репортим эту ситуацию как невероятную } reportModel.successCount == 0 -> Stability.Failing(reportModel.attemptsCount) @@ -270,7 +271,7 @@ internal class ReportsFetchApiImpl( reportModel.successCount ) else -> { - logger.invoke("should not be here $reportModel", null) + logger.debug("should not be here $reportModel") Stability.Stable } } diff --git a/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsHistoryApi.kt b/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsHistoryApi.kt index 6a90639925..83d76c1e3e 100644 --- a/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsHistoryApi.kt +++ b/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/ReportsHistoryApi.kt @@ -1,5 +1,6 @@ package com.avito.report +import com.avito.logger.Logger import com.avito.report.internal.JsonRpcRequestProvider import com.avito.report.internal.getHttpClient import com.avito.report.model.HistoryListResult @@ -16,7 +17,7 @@ interface ReportsHistoryApi { fun create( host: String, fallbackUrl: String, - logger: (String, Throwable?) -> Unit, + logger: Logger, verboseHttp: Boolean = false, gson: Gson = GsonBuilder().create() ): ReportsHistoryApi { diff --git a/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/internal/HttpClientProvider.kt b/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/internal/HttpClientProvider.kt index 62343c65c5..3b47decf31 100644 --- a/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/internal/HttpClientProvider.kt +++ b/subprojects/common/report-viewer/src/main/kotlin/com/avito/report/internal/HttpClientProvider.kt @@ -2,15 +2,16 @@ package com.avito.report.internal import com.avito.http.FallbackInterceptor import com.avito.http.RetryInterceptor +import com.avito.logger.Logger import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import okhttp3.logging.HttpLoggingInterceptor.Level import java.util.concurrent.TimeUnit -internal fun getHttpClient(verbose: Boolean, fallbackUrl: String, logger: (String, Throwable?) -> Unit): OkHttpClient = +internal fun getHttpClient(verbose: Boolean, fallbackUrl: String, logger: Logger): OkHttpClient = OkHttpClient.Builder() .readTimeout(60, TimeUnit.SECONDS) - .addInterceptor(RetryInterceptor(logger = { message, error -> logger.invoke(message, error) })) + .addInterceptor(RetryInterceptor(logger = logger)) .addInterceptor( FallbackInterceptor( fallbackRequest = { request -> @@ -18,11 +19,11 @@ internal fun getHttpClient(verbose: Boolean, fallbackUrl: String, logger: (Strin .url(fallbackUrl) .build() }, - onFallback = { logger.invoke("Fallback to ingress", null) }) + onFallback = { logger.debug("Fallback to ingress") }) ) .apply { addInterceptor( - HttpLoggingInterceptor { logger.invoke(it, null) } + HttpLoggingInterceptor { logger.debug(it) } .setLevel(if (verbose) Level.BODY else Level.BASIC) ) } diff --git a/subprojects/common/report-viewer/src/test/kotlin/com/avito/report/ReportsApiTest.kt b/subprojects/common/report-viewer/src/test/kotlin/com/avito/report/ReportsApiTest.kt index a561a08ac5..d6876d36d4 100644 --- a/subprojects/common/report-viewer/src/test/kotlin/com/avito/report/ReportsApiTest.kt +++ b/subprojects/common/report-viewer/src/test/kotlin/com/avito/report/ReportsApiTest.kt @@ -1,5 +1,6 @@ package com.avito.report +import com.avito.logger.Logger import com.avito.report.model.GetReportResult import com.avito.report.model.ReportCoordinates import com.avito.test.gradle.fileFromJarResources @@ -24,9 +25,20 @@ internal class ReportsApiTest { reportsApi = ReportsApi.create( host = host, fallbackUrl = "", - logger = { message, error -> - println(message) - error?.printStackTrace() + logger = object : Logger { + override fun debug(msg: String) { + println(msg) + } + + override fun exception(msg: String, error: Throwable) { + println(msg) + error.printStackTrace() + } + + override fun critical(msg: String, error: Throwable) { + println(msg) + error.printStackTrace() + } } ) } diff --git a/subprojects/common/report-viewer/src/test/kotlin/com/avito/report/ReportsFetchApiImplTest.kt b/subprojects/common/report-viewer/src/test/kotlin/com/avito/report/ReportsFetchApiImplTest.kt index 63e361cff1..9b44c4ed4a 100644 --- a/subprojects/common/report-viewer/src/test/kotlin/com/avito/report/ReportsFetchApiImplTest.kt +++ b/subprojects/common/report-viewer/src/test/kotlin/com/avito/report/ReportsFetchApiImplTest.kt @@ -1,5 +1,6 @@ package com.avito.report +import com.avito.logger.Logger import com.avito.test.gradle.fileFromJarResources import com.avito.test.http.MockDispatcher import com.google.common.truth.Truth @@ -17,7 +18,19 @@ internal class ReportsFetchApiImplTest { private val fetchApi: ReportsFetchApi = ReportsApi.create( host = mockWebServer.url("/").toString(), fallbackUrl = "", - logger = { _, _ -> } + logger = object : Logger { + override fun debug(msg: String) { + // empty + } + + override fun exception(msg: String, error: Throwable) { + // empty + } + + override fun critical(msg: String, error: Throwable) { + // empty + } + } ) @Test diff --git a/subprojects/common/report-viewer/src/testFixtures/kotlin/com/avito/report/MockReportsExtension.kt b/subprojects/common/report-viewer/src/testFixtures/kotlin/com/avito/report/MockReportsExtension.kt index c3ce7a9e44..35945747dc 100644 --- a/subprojects/common/report-viewer/src/testFixtures/kotlin/com/avito/report/MockReportsExtension.kt +++ b/subprojects/common/report-viewer/src/testFixtures/kotlin/com/avito/report/MockReportsExtension.kt @@ -2,6 +2,7 @@ package com.avito.report import com.avito.test.http.MockDispatcher import okhttp3.mockwebserver.MockWebServer +import com.avito.logger.Logger import org.junit.jupiter.api.extension.AfterEachCallback import org.junit.jupiter.api.extension.BeforeEachCallback import org.junit.jupiter.api.extension.ExtensionContext @@ -21,9 +22,21 @@ class MockReportsExtension : BeforeEachCallback, AfterEachCallback, ParameterRes realApi = ReportsApi.create( host = mockWebServer.url("/").toString(), fallbackUrl = "", - logger = { message, error -> - println(message) - error?.printStackTrace() + logger = object : Logger { + override fun debug(msg: String) { + println(msg) + } + + override fun exception(msg: String, error: Throwable) { + println(msg) + error.printStackTrace() + + } + + override fun critical(msg: String, error: Throwable) { + println(msg) + error.printStackTrace() + } } ), mockDispatcher = mockDispatcher diff --git a/subprojects/gradle/instrumentation-tests/build.gradle.kts b/subprojects/gradle/instrumentation-tests/build.gradle.kts index 5a0bf79801..168a4004bc 100644 --- a/subprojects/gradle/instrumentation-tests/build.gradle.kts +++ b/subprojects/gradle/instrumentation-tests/build.gradle.kts @@ -37,6 +37,7 @@ dependencies { implementation(project(":subprojects:gradle:bitbucket")) implementation(project(":subprojects:common:file-storage")) implementation(project(":subprojects:common:sentry")) + implementation(project(":subprojects:common:logger")) implementation(project(":subprojects:gradle:kubernetes")) implementation(project(":subprojects:gradle:upload-cd-build-result")) implementation("org.smali:dexlib2:2.3") diff --git a/subprojects/gradle/instrumentation-tests/src/main/kotlin/com/avito/instrumentation/GetTestResultsAction.kt b/subprojects/gradle/instrumentation-tests/src/main/kotlin/com/avito/instrumentation/GetTestResultsAction.kt index fab4d1be1f..a52ecf8538 100644 --- a/subprojects/gradle/instrumentation-tests/src/main/kotlin/com/avito/instrumentation/GetTestResultsAction.kt +++ b/subprojects/gradle/instrumentation-tests/src/main/kotlin/com/avito/instrumentation/GetTestResultsAction.kt @@ -3,6 +3,7 @@ package com.avito.instrumentation import com.avito.cd.CdBuildResult import com.avito.instrumentation.configuration.InstrumentationConfiguration import com.avito.instrumentation.report.Report +import com.avito.logger.Logger import com.avito.report.ReportViewer import com.avito.report.ReportsApi import com.avito.report.model.ReportCoordinates @@ -25,7 +26,19 @@ internal class GetTestResultsAction( reportsApi = ReportsApi.create( host = reportApiUrl, fallbackUrl = reportApiFallbackUrl, - logger = { message, error -> ciLogger.debug(message, error) } + logger = object : Logger { + override fun debug(msg: String) { + ciLogger.debug(msg) + } + + override fun exception(msg: String, error: Throwable) { + ciLogger.debug(msg, error) + } + + override fun critical(msg: String, error: Throwable) { + ciLogger.debug(msg, error) + } + } ), logger = ciLogger, reportCoordinates = reportCoordinates, diff --git a/subprojects/gradle/instrumentation-tests/src/main/kotlin/com/avito/instrumentation/InstrumentationTestsAction.kt b/subprojects/gradle/instrumentation-tests/src/main/kotlin/com/avito/instrumentation/InstrumentationTestsAction.kt index 209c5e4052..7ebc6f9b59 100644 --- a/subprojects/gradle/instrumentation-tests/src/main/kotlin/com/avito/instrumentation/InstrumentationTestsAction.kt +++ b/subprojects/gradle/instrumentation-tests/src/main/kotlin/com/avito/instrumentation/InstrumentationTestsAction.kt @@ -22,6 +22,7 @@ import com.avito.instrumentation.scheduling.TestsScheduler import com.avito.instrumentation.suite.TestSuiteProvider import com.avito.instrumentation.suite.dex.check.AllChecks import com.avito.instrumentation.suite.model.TestWithTarget +import com.avito.logger.Logger import com.avito.report.ReportViewer import com.avito.report.ReportsApi import com.avito.report.model.ReportCoordinates @@ -49,7 +50,20 @@ class InstrumentationTestsAction( private val reportsApi: ReportsApi = ReportsApi.create( host = params.reportApiUrl, fallbackUrl = params.reportApiFallbackUrl, - logger = { message, error -> logger.debug(message, error) } + logger = object : Logger { + override fun debug(msg: String) { + logger.debug(msg) + } + + override fun exception(msg: String, error: Throwable) { + logger.debug(msg, error) + } + + override fun critical(msg: String, error: Throwable) { + logger.debug(msg, error) + } + } + ), private val reportCoordinates: ReportCoordinates = params.instrumentationConfiguration.instrumentationParams.reportCoordinates(), private val targetReportCoordinates: ReportCoordinates = reportCoordinates.copy( diff --git a/subprojects/gradle/instrumentation-tests/src/main/kotlin/com/avito/instrumentation/report/listener/ReportViewerTestReporter.kt b/subprojects/gradle/instrumentation-tests/src/main/kotlin/com/avito/instrumentation/report/listener/ReportViewerTestReporter.kt index 7584066387..ef4b68a186 100644 --- a/subprojects/gradle/instrumentation-tests/src/main/kotlin/com/avito/instrumentation/report/listener/ReportViewerTestReporter.kt +++ b/subprojects/gradle/instrumentation-tests/src/main/kotlin/com/avito/instrumentation/report/listener/ReportViewerTestReporter.kt @@ -5,6 +5,7 @@ import com.avito.filestorage.RemoteStorage import com.avito.filestorage.RemoteStorage.Request import com.avito.filestorage.RemoteStorage.Result import com.avito.instrumentation.report.Report +import com.avito.logger.Logger import com.avito.report.model.AndroidTest import com.avito.report.model.EntryTypeAdapterFactory import com.avito.report.model.TestRuntimeData @@ -35,11 +36,17 @@ class ReportViewerTestReporter( private val remoteStorage: RemoteStorage = RemoteStorage.create( endpoint = fileStorageUrl, - logger = { message: String, error: Throwable? -> - if (error != null) { - logger.critical(message, error) - } else { - logger.info(message) + logger = object : Logger { + override fun debug(msg: String) { + logger.info(msg) + } + + override fun exception(msg: String, error: Throwable) { + logger.critical(msg, error) + } + + override fun critical(msg: String, error: Throwable) { + logger.critical(msg, error) } }) // todo переместить ближе к DeviceWorker diff --git a/subprojects/gradle/performance/build.gradle.kts b/subprojects/gradle/performance/build.gradle.kts index 6968493f2d..b65921019d 100644 --- a/subprojects/gradle/performance/build.gradle.kts +++ b/subprojects/gradle/performance/build.gradle.kts @@ -18,6 +18,7 @@ val truthVersion: String by project dependencies { implementation(project(":subprojects:common:report-viewer")) + implementation(project(":subprojects:common:logger")) implementation(project(":subprojects:gradle:android")) implementation(project(":subprojects:gradle:bitbucket")) implementation(project(":subprojects:gradle:kotlin-dsl-support")) diff --git a/subprojects/gradle/performance/src/main/kotlin/com/avito/performance/PerformanceCollectAction.kt b/subprojects/gradle/performance/src/main/kotlin/com/avito/performance/PerformanceCollectAction.kt index 131eca8aaa..35e3625c7e 100644 --- a/subprojects/gradle/performance/src/main/kotlin/com/avito/performance/PerformanceCollectAction.kt +++ b/subprojects/gradle/performance/src/main/kotlin/com/avito/performance/PerformanceCollectAction.kt @@ -4,6 +4,7 @@ import com.avito.android.stats.StatsDConfig import com.avito.android.stats.StatsDSender import com.avito.bitbucket.Bitbucket import com.avito.bitbucket.BitbucketConfig +import com.avito.logger.Logger import com.avito.report.ReportsApi import com.avito.report.model.ReportCoordinates import com.avito.utils.getStackTraceString @@ -18,7 +19,19 @@ class PerformanceCollectAction( private val reports: ReportsApi = ReportsApi.create( host = params.reportApiUrl, fallbackUrl = params.reportApiFallbackUrl, - logger = { message, error -> logger.debug(message, error) } + logger = object: Logger { + override fun debug(msg: String) { + logger.debug(msg) + } + + override fun exception(msg: String, error: Throwable) { + logger.debug(msg, error) + } + + override fun critical(msg: String, error: Throwable) { + logger.debug(msg, error) + } + } ), private val statsSender: StatsDSender = StatsDSender.Impl( config = params.statsdConfig, diff --git a/subprojects/gradle/performance/src/main/kotlin/com/avito/performance/PerformanceCompareAction.kt b/subprojects/gradle/performance/src/main/kotlin/com/avito/performance/PerformanceCompareAction.kt index 891fa018f2..f28ee2cf3e 100644 --- a/subprojects/gradle/performance/src/main/kotlin/com/avito/performance/PerformanceCompareAction.kt +++ b/subprojects/gradle/performance/src/main/kotlin/com/avito/performance/PerformanceCompareAction.kt @@ -5,6 +5,7 @@ import com.avito.android.stats.StatsDSender import com.avito.bitbucket.AtlassianCredentials import com.avito.bitbucket.Bitbucket import com.avito.bitbucket.BitbucketConfig +import com.avito.logger.Logger import com.avito.performance.stats.Stats import com.avito.performance.stats.StatsApi import com.avito.performance.stats.comparison.ComparedTest @@ -24,7 +25,19 @@ open class PerformanceCompareAction( private val reports: ReportsApi = ReportsApi.create( host = params.reportApiUrl, fallbackUrl = params.reportApiFallbackUrl, - logger = { message, error -> logger.debug(message, error) } + logger = object: Logger { + override fun debug(msg: String) { + logger.debug(msg) + } + + override fun exception(msg: String, error: Throwable) { + logger.debug(msg, error) + } + + override fun critical(msg: String, error: Throwable) { + logger.debug(msg, error) + } + } ), private val statsSender: StatsDSender = StatsDSender.Impl( config = params.statsdConfig, diff --git a/subprojects/gradle/qapps/build.gradle.kts b/subprojects/gradle/qapps/build.gradle.kts index e754fc4b5a..0163b29dea 100644 --- a/subprojects/gradle/qapps/build.gradle.kts +++ b/subprojects/gradle/qapps/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { implementation(project(":subprojects:gradle:utils")) implementation(project(":subprojects:gradle:git")) implementation(project(":subprojects:gradle:logging")) + implementation(project(":subprojects:common:logger")) implementation("org.funktionale:funktionale-try:$funktionaleVersion") implementation("com.android.tools.build:gradle:$androidGradlePluginVersion") implementation("com.squareup.retrofit2:retrofit:$retrofitVersion") diff --git a/subprojects/gradle/qapps/src/main/kotlin/com/avito/plugin/QAppsUploadAction.kt b/subprojects/gradle/qapps/src/main/kotlin/com/avito/plugin/QAppsUploadAction.kt index a3068bb83a..caaa544137 100644 --- a/subprojects/gradle/qapps/src/main/kotlin/com/avito/plugin/QAppsUploadAction.kt +++ b/subprojects/gradle/qapps/src/main/kotlin/com/avito/plugin/QAppsUploadAction.kt @@ -1,6 +1,7 @@ package com.avito.plugin import com.avito.http.RetryInterceptor +import com.avito.logger.Logger import com.avito.utils.logging.CILogger import com.google.gson.GsonBuilder import okhttp3.MultipartBody @@ -78,7 +79,19 @@ internal class QAppsUploadAction( RetryInterceptor( retries = 3, allowedMethods = listOf("POST", "GET"), - logger = { message, error -> logger.info(message, error) } + logger = object : Logger { + override fun debug(msg: String) { + logger.info(msg) + } + + override fun exception(msg: String, error: Throwable) { + logger.info(msg, error) + } + + override fun critical(msg: String, error: Throwable) { + logger.info(msg, error) + } + } ) ) .addInterceptor(HttpLoggingInterceptor { message -> From 5125e4be0e4a075ff9e4ea8d52cb73cf2e5df65f Mon Sep 17 00:00:00 2001 From: Dmitriy Voronin Date: Tue, 18 Feb 2020 11:08:50 +0300 Subject: [PATCH 04/12] add missing bintray plugin for :common:logger (#191) add `tasks` to pr check --- build.sh | 3 ++- subprojects/common/logger/build.gradle.kts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 4c43b67015..2ad6b2e1c9 100755 --- a/build.sh +++ b/build.sh @@ -5,7 +5,8 @@ set -e source $(dirname $0)/_main.sh TEMP_PROJECT_VERSION="temp-version" -runInBuilder "./gradlew build publishToMavenLocal ${GRADLE_ARGS} -PprojectVersion=${TEMP_PROJECT_VERSION}; +# `tasks` triggers full tasks graph resolving, checking for possible misconfigurations +runInBuilder "./gradlew tasks build publishToMavenLocal ${GRADLE_ARGS} -PprojectVersion=${TEMP_PROJECT_VERSION}; ./gradlew :subprojects:android-test:test-app:instrumentationUi ${GRADLE_ARGS} -PinfraVersion=${TEMP_PROJECT_VERSION}" docs/check.sh diff --git a/subprojects/common/logger/build.gradle.kts b/subprojects/common/logger/build.gradle.kts index 58602ab7a3..8a5a51d654 100644 --- a/subprojects/common/logger/build.gradle.kts +++ b/subprojects/common/logger/build.gradle.kts @@ -1,4 +1,5 @@ plugins { id("kotlin") `maven-publish` + id("com.jfrog.bintray") } From 298c759b619ed1b46f1f2e99b0352a4c69d3709c Mon Sep 17 00:00:00 2001 From: Dmitriy Voronin Date: Tue, 18 Feb 2020 11:40:15 +0300 Subject: [PATCH 05/12] gradlew 6.2 (#190) * gradlew 6.2 https://docs.gradle.org/6.2/release-notes.html * use exclusiveContent * fix avito modules regexp * fix modules regexp remove info and stacktrace --- .gitignore | 1 + _main.sh | 3 +- build.gradle.kts | 26 ++++++++-- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew.bat | 3 ++ settings.gradle.kts | 61 +++++++++++++++++------- 7 files changed, 72 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index 3a7b1ecb8d..5a4c1e3f77 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ local.properties public/ .DS_Store outputs/ +gh-pages-generated/ diff --git a/_main.sh b/_main.sh index 6f02072440..7ad6aa7596 100755 --- a/_main.sh +++ b/_main.sh @@ -41,8 +41,7 @@ GIT_COMMANDS="git config --global core.sshCommand 'ssh -o UserKnownHostsFile=/de git config --global user.name 'builder'; git config --global user.email 'builder@avito.ru';" -GRADLE_ARGS="--info --stacktrace \\ - -PartifactoryUrl=$ARTIFACTORY_URL \\ +GRADLE_ARGS="-PartifactoryUrl=$ARTIFACTORY_URL \\ -Pci=true \\ -PteamcityUrl \\ -PteamcityBuildType \\ diff --git a/build.gradle.kts b/build.gradle.kts index 5d1f581a3d..8c3c14b826 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,10 +11,6 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile buildscript { val r8Version: String by project - - repositories { - maven { setUrl("http://storage.googleapis.com/r8-releases/raw") } - } dependencies { classpath("com.android.tools:r8:$r8Version") } @@ -54,7 +50,27 @@ subprojects { repositories { jcenter() - google() + exclusiveContent { + forRepository { + google() + } + filter { + includeModuleByRegex("com\\.android.*", "(?!r8).*") + includeModuleByRegex("com\\.google\\.android.*", ".*") + includeGroupByRegex("androidx\\..*") + } + } + exclusiveContent { + forRepository { + maven { + name = "R8 releases" + setUrl("http://storage.googleapis.com/r8-releases/raw") + } + } + filter { + includeModule("com.android.tools", "r8") + } + } } group = "com.avito.android" diff --git a/gradle.properties b/gradle.properties index d0d90edf45..62d4244ca9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,7 +13,7 @@ syncAndroidModules=true projectVersion=2020.2.7 # Previous stable version to be used in this project infraVersion=2020.2.7 -gradleVersion=6.1.1 +gradleVersion=6.2 javaVersion=1.8 # We use exact version to provide consistent environment and avoid build cache issues # (AGP tasks has artifacts from build tools) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4e1cc9db6b..8422670206 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew.bat b/gradlew.bat index 24467a141f..9109989e3c 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -29,6 +29,9 @@ 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" diff --git a/settings.gradle.kts b/settings.gradle.kts index 439762aa9b..e763f5917b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -87,33 +87,60 @@ pluginManagement { val infraVersion: String by settings repositories { - mavenLocal { - content { - includeGroupByRegex("com\\.avito\\.android\\.*") + exclusiveContent { + forRepository { + mavenLocal() } - } - if (!artifactoryUrl.isNullOrBlank()) { - maven { - name = "Local Artifactory" - setUrl("$artifactoryUrl/libs-release-local") - content { - includeGroupByRegex("com\\.avito\\.android\\.*") + forRepository { + jcenter() + } + if (!artifactoryUrl.isNullOrBlank()) { + forRepository { + maven { + name = "Local Artifactory" + setUrl("$artifactoryUrl/libs-release-local") + } } } + filter { + includeModuleByRegex("com\\.avito\\.android", ".*") + } + } + exclusiveContent { + forRepository { + gradlePluginPortal() + } + filter { + includeGroup("org.jetbrains.kotlin.jvm") + includeGroup("com.jfrog.bintray") + includeGroup("com.slack.keeper") + includeGroup("digital.wup.android-maven-publish") + includeGroup("nebula.integtest") + } } - jcenter { - content { - includeGroupByRegex("com\\.avito\\.android\\.*") + exclusiveContent { + forRepository { + google() + } + filter { + includeGroupByRegex("com\\.android\\.tools\\.build\\.*") + } + } + exclusiveContent { + forRepository { + maven { + name = "R8 releases" + setUrl("http://storage.googleapis.com/r8-releases/raw") + } + } + filter { + includeModule("com.android.tools", "r8") } } - gradlePluginPortal() - google() } plugins { id("digital.wup.android-maven-publish") version "3.6.3" - id("kotlin") version kotlinVersion - id("kotlin-android") version kotlinVersion id("nebula.integtest") version "7.0.7" } From 68492b9a100c3971d912e9c924bcc10be2184d9b Mon Sep 17 00:00:00 2001 From: Sergey Boishtyan Date: Tue, 18 Feb 2020 11:59:51 +0300 Subject: [PATCH 06/12] fix api breaking changes (#189) --- .../android/runner/TestRunEnvironment.kt | 7 +++- .../kotlin/com/avito/http/RetryInterceptor.kt | 41 ++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/TestRunEnvironment.kt b/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/TestRunEnvironment.kt index d42dd05456..97e96b7cdf 100644 --- a/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/TestRunEnvironment.kt +++ b/subprojects/android-test/test-inhouse-runner/src/main/kotlin/com/avito/android/runner/TestRunEnvironment.kt @@ -84,7 +84,12 @@ sealed class TestRunEnvironment { val fileStorageUrl: String, val reportConfig: ReportConfig?, val testRunCoordinates: ReportCoordinates - ) : TestRunEnvironment() + ) : TestRunEnvironment() { + + @Deprecated("since 2020.2.8", ReplaceWith("testRunCoordinates.runId")) + val runId: String + get() = testRunCoordinates.runId + } } fun provideEnvironment( diff --git a/subprojects/common/okhttp/src/main/kotlin/com/avito/http/RetryInterceptor.kt b/subprojects/common/okhttp/src/main/kotlin/com/avito/http/RetryInterceptor.kt index 304786ee8b..132576f988 100644 --- a/subprojects/common/okhttp/src/main/kotlin/com/avito/http/RetryInterceptor.kt +++ b/subprojects/common/okhttp/src/main/kotlin/com/avito/http/RetryInterceptor.kt @@ -10,7 +10,7 @@ import java.util.concurrent.TimeUnit * See also: * - [okhttp3.internal.http.RetryAndFollowUpInterceptor] */ -class RetryInterceptor( +class RetryInterceptor constructor( private val retries: Int = 5, private val allowedMethods: List = listOf("GET"), private val allowedCodes: List = listOf( @@ -27,6 +27,45 @@ class RetryInterceptor( private val onFailure: (Response) -> Unit = {} ) : Interceptor { + @Deprecated("since 2020.2.8") + constructor( + retries: Int = 5, + allowedMethods: List = listOf("GET"), + allowedCodes: List = listOf( + 408, // client timeout + 500, // internal error + 502, // bad gateway + 503, // unavailable + 504 // gateway timeout + ), + delayMs: Long = TimeUnit.SECONDS.toMillis(1), + useIncreasingDelay: Boolean = true, + logger: (String, Throwable?) -> Unit, + onSuccess: (Response) -> Unit = {}, + onFailure: (Response) -> Unit = {} + ) : this( + retries = retries, + allowedMethods = allowedMethods, + allowedCodes = allowedCodes, + delayMs = delayMs, + useIncreasingDelay = useIncreasingDelay, + logger = object : Logger { + override fun debug(msg: String) { + logger.invoke(msg, null) + } + + override fun exception(msg: String, error: Throwable) { + logger.invoke(msg, error) + } + + override fun critical(msg: String, error: Throwable) { + logger.invoke(msg, error) + } + }, + onFailure = onFailure, + onSuccess = onSuccess + ) + init { require(retries >= 1) } From be8aed0567e10264a521f915fb51d1354917f56b Mon Sep 17 00:00:00 2001 From: Dmitriy Voronin Date: Tue, 18 Feb 2020 14:54:28 +0300 Subject: [PATCH 07/12] Upgrade slack client (#179) * fixes MBS-7643 jslack is now an official slack client, but without first stable release i used last version from: https://github.com/seratch/jslack-maintenance-releases and rich_text unsupported exception is gone * fix dependencies --- gradle.properties | 2 +- subprojects/gradle/logging/build.gradle.kts | 6 +++++- subprojects/gradle/performance/build.gradle.kts | 5 ++++- subprojects/gradle/slack/build.gradle.kts | 6 +++++- .../com/avito/slack/SlackConditionalSender.kt | 5 +++-- .../com/avito/test/summary/TestSummarySender.kt | 14 +++++++------- 6 files changed, 25 insertions(+), 13 deletions(-) diff --git a/gradle.properties b/gradle.properties index 62d4244ca9..5fa4252c08 100644 --- a/gradle.properties +++ b/gradle.properties @@ -34,7 +34,7 @@ retrofitVersion=2.6.2 gsonVersion=2.8.5 bcelVersion=6.3.1 kotsonVersion=2.5.0 -jslackVersion=1.7.6 +jslackVersion=3.4.1 truthVersion=1.0 jsonPathVersion=2.4.0 teamcityRestClientVersion=1.6.1 diff --git a/subprojects/gradle/logging/build.gradle.kts b/subprojects/gradle/logging/build.gradle.kts index 18bcdeb0f8..0d3138567c 100644 --- a/subprojects/gradle/logging/build.gradle.kts +++ b/subprojects/gradle/logging/build.gradle.kts @@ -7,10 +7,14 @@ plugins { val kotlinVersion: String by project val jslackVersion: String by project +val okhttpVersion: String by project dependencies { implementation(gradleApi()) - implementation("com.github.seratch:jslack:$jslackVersion") + implementation("com.github.seratch:jslack-api-client:$jslackVersion") { + exclude(group = "com.squareup.okhttp3") + } + implementation("com.squareup.okhttp3:okhttp:$okhttpVersion") implementation(project(":subprojects:gradle:utils")) implementation(project(":subprojects:gradle:sentry-config")) implementation(project(":subprojects:gradle:kotlin-dsl-support")) diff --git a/subprojects/gradle/performance/build.gradle.kts b/subprojects/gradle/performance/build.gradle.kts index b65921019d..36f738cc79 100644 --- a/subprojects/gradle/performance/build.gradle.kts +++ b/subprojects/gradle/performance/build.gradle.kts @@ -34,7 +34,10 @@ dependencies { implementation("com.timgroup:java-statsd-client:$statsdVersion") implementation("com.google.code.gson:gson:$gsonVersion") implementation("com.github.salomonbrys.kotson:kotson:$kotsonVersion") - implementation("com.github.seratch:jslack:$jslackVersion") + implementation("com.github.seratch:jslack-api-client:$jslackVersion") { + exclude(group = "com.squareup.okhttp3") + } + implementation("com.squareup.okhttp3:okhttp:$okhttpVersion") implementation("com.squareup.retrofit2:retrofit:$retrofitVersion") implementation("org.funktionale:funktionale-try:$funktionaleVersion") implementation("com.squareup.okhttp3:logging-interceptor:$okhttpVersion") diff --git a/subprojects/gradle/slack/build.gradle.kts b/subprojects/gradle/slack/build.gradle.kts index 45442241f8..606ba7303a 100644 --- a/subprojects/gradle/slack/build.gradle.kts +++ b/subprojects/gradle/slack/build.gradle.kts @@ -10,13 +10,17 @@ val kotlinVersion: String by project val jslackVersion: String by project val funktionaleVersion: String by project val kotlinCoroutinesVersion: String by project +val okhttpVersion: String by project dependencies { implementation(project(":subprojects:gradle:utils")) implementation(project(":subprojects:gradle:logging")) implementation(project(":subprojects:common:time")) implementation("org.funktionale:funktionale-try:$funktionaleVersion") - implementation("com.github.seratch:jslack:$jslackVersion") + implementation("com.github.seratch:jslack-api-client:$jslackVersion") { + exclude(group = "com.squareup.okhttp3") + } + implementation("com.squareup.okhttp3:okhttp:$okhttpVersion") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinCoroutinesVersion") testImplementation(project(":subprojects:gradle:test-project")) diff --git a/subprojects/gradle/slack/src/main/kotlin/com/avito/slack/SlackConditionalSender.kt b/subprojects/gradle/slack/src/main/kotlin/com/avito/slack/SlackConditionalSender.kt index 71503e1728..18b88e18ec 100644 --- a/subprojects/gradle/slack/src/main/kotlin/com/avito/slack/SlackConditionalSender.kt +++ b/subprojects/gradle/slack/src/main/kotlin/com/avito/slack/SlackConditionalSender.kt @@ -29,8 +29,9 @@ class SlackConditionalSender( }, { throwable -> logger.info( - "[Slack] Previous message not found, posting new one in channel=${message.channel}; " + - "message=${SlackStringFormat.ellipsize(string = message.text, limit = 50)}", throwable + message = "[Slack] Previous message not found, posting new one in channel=${message.channel}; " + + "message=${SlackStringFormat.ellipsize(string = message.text, limit = 50)}", + error = throwable ) slackClient.sendMessage(message) } diff --git a/subprojects/gradle/test-summary/src/main/kotlin/com/avito/test/summary/TestSummarySender.kt b/subprojects/gradle/test-summary/src/main/kotlin/com/avito/test/summary/TestSummarySender.kt index 355e99c957..c392001f01 100644 --- a/subprojects/gradle/test-summary/src/main/kotlin/com/avito/test/summary/TestSummarySender.kt +++ b/subprojects/gradle/test-summary/src/main/kotlin/com/avito/test/summary/TestSummarySender.kt @@ -35,8 +35,8 @@ class TestSummarySenderImplementation( private val reportCoordinates: ReportCoordinates, private val globalSummaryChannel: SlackChannel = summaryChannel, private val unitToChannelMapping: Map, - private val mentionOnFailures: Set = setOf(Team("buyer-x")), - private val reserveSlackChannel: SlackChannel = SlackChannel("#speed-testing-team") + private val mentionOnFailures: Set = setOf(Team("buyer-x")), //todo move to config + private val reserveSlackChannel: SlackChannel = SlackChannel("#speed-testing-team") //todo move to config ) : TestSummarySender { private val slackSummaryComposer: SlackSummaryComposer = SlackSummaryComposerImpl(reportViewer) @@ -56,11 +56,11 @@ class TestSummarySenderImplementation( ), logger = logger ) - private val slackBulkSender: SlackBulkSender = - CoroutinesSlackBulkSender( - sender = slackConditionalSender, // todo запрашивали опциональность этого (слать в любом случае для некоторых юнитов) - logger = { s, throwable -> logger.critical(s, throwable) } - ) + private val slackBulkSender: SlackBulkSender = CoroutinesSlackBulkSender( + sender = slackConditionalSender, + logger = { s, throwable -> logger.critical(s, throwable) } + ) + private val slackEmojiProvider = SlackEmojiProvider() override fun send(suite: CrossDeviceSuite, reportId: String) { From bdaf5dd35734eb4f28b70d59c936a1df3daff7bc Mon Sep 17 00:00:00 2001 From: Dmitriy Voronin Date: Tue, 18 Feb 2020 15:07:32 +0300 Subject: [PATCH 08/12] fix bash path (#194) --- _main.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_main.sh b/_main.sh index 7ad6aa7596..7e98fec299 100755 --- a/_main.sh +++ b/_main.sh @@ -2,7 +2,9 @@ set -e -source $(dirname $0)/ci/_environment.sh +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" + +source "$DIR"/ci/_environment.sh # shellcheck disable=SC2086 USER_ID=$(id -u ${USER}) From 187b65d250ad55c45c8822234c19fa76c0a0fd59 Mon Sep 17 00:00:00 2001 From: Daniil Popov Date: Tue, 18 Feb 2020 16:18:01 +0300 Subject: [PATCH 09/12] remove mentions of experimental app (#192) --- .../test/resources/teamcity_artifacts_response.json | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/subprojects/gradle/instrumentation-tests/src/test/resources/teamcity_artifacts_response.json b/subprojects/gradle/instrumentation-tests/src/test/resources/teamcity_artifacts_response.json index 14dc980102..d9bfeae1ee 100644 --- a/subprojects/gradle/instrumentation-tests/src/test/resources/teamcity_artifacts_response.json +++ b/subprojects/gradle/instrumentation-tests/src/test/resources/teamcity_artifacts_response.json @@ -27,12 +27,6 @@ "size": 35412239, "modificationTime": "20190204T175728+0300" }, - { - "name": "avito-48.0-(270)-experimental.apk", - "fullName": "avito/build/outputs/apk/experimental/avito-48.0-(270)-experimental.apk", - "size": 24589879, - "modificationTime": "20190204T175729+0300" - }, { "name": "avito-48.0-(270)-release.apk", "fullName": "avito/build/outputs/apk/release/avito-48.0-(270)-release.apk", @@ -51,12 +45,6 @@ "size": 29668204, "modificationTime": "20190204T175730+0300" }, - { - "name": "mapping.txt", - "fullName": "avito/build/outputs/mapping/experimental/mapping.txt", - "size": 45688464, - "modificationTime": "20190204T175730+0300" - }, { "name": "mapping.txt", "fullName": "avito/build/outputs/mapping/release/mapping.txt", From 50b4299795b3ab9aa289bdad8da2315097b8ae7c Mon Sep 17 00:00:00 2001 From: Daniil Popov Date: Wed, 19 Feb 2020 12:46:57 +0300 Subject: [PATCH 10/12] add documentation for LocationRule (#197) --- docs/content/test_framework/Mocking.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/content/test_framework/Mocking.md b/docs/content/test_framework/Mocking.md index 2b736b5228..6ad22acd85 100644 --- a/docs/content/test_framework/Mocking.md +++ b/docs/content/test_framework/Mocking.md @@ -26,6 +26,21 @@ val analytics = AnalyticsRule() analytics.checks.assertEventTracked() ``` +### Mocking location + +`LocationRule` serves for mocking location in tests. + +```kotlin +@get:Rule +val locationRule = LocationRule() + +locationRule.setLocation(getTestLocation()) +``` + +**KEEP IN MIND** that above rule does not mock location for the whole device but rather replace the best known location +in `BaseGeoProvider`. That is technically possible that device location providers would give better location that was mocked. +To avoid that mock location with high accuracy. + ## Writing custom mocks for tests Different tests need different mocks. We have to adapt an application state for these requirements.\ From 6e012427012b88f13e78cf6ff134ec4b3620be92 Mon Sep 17 00:00:00 2001 From: Eugene Krivobokov Date: Wed, 19 Feb 2020 13:00:42 +0300 Subject: [PATCH 11/12] MBS 7699 Minor fixes in documentation (#185) * MBS-7669 Make english by default in docs * MBS-7669 Update a link to custom lint checks * MBS-7669 Recommend using external file storage for images in the documentation * MBS-7669 Recommend a style for describing UI elements in the documentation * MBS-7669 Translate a tutorial recommendations * MBS-7688 Ignore markdown rule due to false positive Co-authored-by: Dmitriy Voronin --- docs/config.toml | 5 +- docs/content/KnownIssues.md | 2 +- docs/content/architecture/Dagger.md | 2 +- docs/content/assemble/Mirakle.md | 2 +- docs/content/assemble/Troubleshooting.md | 8 +-- docs/content/checks/AndroidLint.md | 14 ++--- docs/content/ci/CustomGradlePlugins.md | 4 +- docs/content/contributing/CodeStyle.md | 2 +- docs/content/contributing/Docs.md | 71 +++++++++++++---------- docs/content/contributing/HowToStart.md | 4 +- docs/content/ide/Benchmarking.md | 2 +- docs/content/ide/Speedup.md | 21 +++---- docs/content/menu/index.md | 2 +- docs/content/performance/Analytics.md | 2 +- docs/content/tech_radar/buildSrc.md | 2 +- docs/content/test/Run.md | 2 +- docs/markdownlint.rb | 4 ++ docs/static/image/rating_publish.png | Bin 167022 -> 0 bytes docs/themes/book/i18n/en.yaml | 2 +- docs/themes/book/i18n/ru.yaml | 14 ----- 20 files changed, 77 insertions(+), 88 deletions(-) delete mode 100644 docs/static/image/rating_publish.png delete mode 100644 docs/themes/book/i18n/ru.yaml diff --git a/docs/config.toml b/docs/config.toml index 592f6888b0..fbe1d30686 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -6,9 +6,8 @@ googleAnalytics = "UA-157613383-1" baseURL = "https://avito-tech.github.io/avito-android" title = "Avito Android" -# TODO: use english as default -languageCode = "ru-ru" -DefaultContentLanguage = "ru" +languageCode = "en-us" +DefaultContentLanguage = "en" theme = "book" # WARNING: publishDir outside the project breaks i18n publishDir = "public" diff --git a/docs/content/KnownIssues.md b/docs/content/KnownIssues.md index c21896e062..0bcd7b00b3 100644 --- a/docs/content/KnownIssues.md +++ b/docs/content/KnownIssues.md @@ -8,6 +8,6 @@ type: docs ## New Gradle Sync is not supported due to containing Kotlin modules -Disable _Settings | Experimental | Only sync the active variant_ +Disable **Settings > Experimental > Only sync the active variant** https://stackoverflow.com/questions/54201216/android-studio-3-3-new-gradle-sync-is-not-supported-due-to-containing-kotlin-mo/ diff --git a/docs/content/architecture/Dagger.md b/docs/content/architecture/Dagger.md index 3b3b579bbe..719bb72e20 100644 --- a/docs/content/architecture/Dagger.md +++ b/docs/content/architecture/Dagger.md @@ -476,7 +476,7 @@ DaggerSettingsComponent.factory() Компонент отображается красным, как будто его нет. -- Проверь что файлы kapt не добавлены в исключения: _Preferences > Editor > File Types > Ignore Files and Folders_ +- Проверь что файлы kapt не добавлены в исключения: **Preferences > Editor > File Types > Ignore Files and Folders** ### Dagger: error.NonExistentClass cannot be provided / converted diff --git a/docs/content/assemble/Mirakle.md b/docs/content/assemble/Mirakle.md index 8dddace854..1692dcea48 100644 --- a/docs/content/assemble/Mirakle.md +++ b/docs/content/assemble/Mirakle.md @@ -49,7 +49,7 @@ Here's Mirakle ... - Проверь **кастомные системные параметры сборки** в `~/.gradle/gradle.properties` Они не переносятся на удаленную машину. Выбираем один из вариантов: - Добавь в аналогичный файл на android-builder - - Добавь аргументами `-Pname=value` в _Preferences | Build, Execution, Deployment | Compiler | Command-line Options_ + - Добавь аргументами `-Pname=value` в **Preferences > Build, Execution, Deployment > Compiler > Command-line Options** NB: про такие настройки легко забыть, по возможности избегай их. В следующие разы нужно только включать `./mirakle.py --enable` diff --git a/docs/content/assemble/Troubleshooting.md b/docs/content/assemble/Troubleshooting.md index a320c91b1b..077c037578 100644 --- a/docs/content/assemble/Troubleshooting.md +++ b/docs/content/assemble/Troubleshooting.md @@ -28,12 +28,12 @@ type: docs - Проверь версию IDE и Kotlin плагина. Возможно они слишком старые или наоборот, alpha/beta версии. - Добавь `--stacktrace` чтобы увидеть детали ошибки:\ -_Settings > Build, Execution, Deployment > Compiler > Command-line Options:_ +**Settings > Build, Execution, Deployment > Compiler > Command-line Options:**_ - Проверь что не включен offline mode на вкладке Gradle - Возможно ошибка в .iml, .idea/ файлах: - - `./clean.py --all` или _File > Re-Import Gradle project_ - - _File > Invalidate Caches / Restart_ -- Посмотри логи _Help > Show log in Finder_ + - `./clean.py --all` или **File > Re-Import Gradle project** + - **File > Invalidate Caches / Restart** +- Посмотри логи **Help > Show log in Finder** ### Если причина в Mirakle diff --git a/docs/content/checks/AndroidLint.md b/docs/content/checks/AndroidLint.md index 35b9c48d38..4eb4c14115 100644 --- a/docs/content/checks/AndroidLint.md +++ b/docs/content/checks/AndroidLint.md @@ -3,7 +3,7 @@ title: Android Lint type: docs --- -# Lint +# Android Lint https://developer.android.com/studio/write/lint @@ -28,15 +28,11 @@ https://developer.android.com/studio/write/lint - Приложения (android application) - Всего репозитория. Отключит проверку во всех модулях. -## Кастомные проверки +## Custom lint checks -Все кастомные проверки лежат в модуле `lint-checks`. +All customs android lint checks are in `lint-checks` (internal) module. -### Как написать свою проверку? +### Writing a custom lint check -- KotlinConf 2017 - Kotlin Static Analysis with Android Lint by Tor Norbye: -[video](https://youtu.be/p8yX5-lPS6o), -[presentation](https://docs.google.com/presentation/d/1Sr-6E3Tk1lBguUob0GigqSEsfN-04qS56Whj0UEr0AE/edit#slide=id.g29100eff00_2_156) +- [Static Analysis with Android Lint by Tor Norbye (mDevCamp 2019)](https://slideslive.com/38916502) - [Sample project](https://github.com/googlesamples/android-custom-lint-rules) - -Отлично покрываются тестами, но если нужна отладка, то используем общий подход - [debugging]({{< ref "/ci/CustomGradlePlugins.md#debugging" >}}) diff --git a/docs/content/ci/CustomGradlePlugins.md b/docs/content/ci/CustomGradlePlugins.md index 2a5e2e1287..3516cd5a66 100644 --- a/docs/content/ci/CustomGradlePlugins.md +++ b/docs/content/ci/CustomGradlePlugins.md @@ -26,7 +26,7 @@ type: docs 1. Предпочтительно использовать IntelliJ IDEA 1. Import project 1. Согласись использовать gradle wrapper -1. Settings > Build, Execution, Deployment > Build Tools > Gradle > Runner +1. **Settings > Build, Execution, Deployment > Build Tools > Gradle > Runner** 1. Delegate IDE build/run actions to gradle (check) 1. Run tests using : Gradle Test Runner @@ -85,7 +85,7 @@ open class MyPlugin : Plugin { Часто нужно править плагин совместно с ./ci/ Чтобы работать одновременно со всем этим кодом, к уже открытому проекту -добавь модуль ci: File > New > Module from existing sources > путь до папки ci > ok > ok +добавь модуль ci: **File > New > Module from existing sources > путь до папки ci > ok > ok** ## Интеграция плагина в CI diff --git a/docs/content/contributing/CodeStyle.md b/docs/content/contributing/CodeStyle.md index cde88fc7f6..7c35899f59 100644 --- a/docs/content/contributing/CodeStyle.md +++ b/docs/content/contributing/CodeStyle.md @@ -12,7 +12,7 @@ type: docs За настройку code style отвечает [editor config](https://editorconfig.org/). А точнее [плагин для IDE](https://plugins.jetbrains.com/plugin/7294-editorconfig/). -Нужно убедиться, что плагин установлен и включен (Preferences > Plugins > Installed > search: EditorConfig) +Нужно убедиться, что плагин установлен и включен (**Preferences > Plugins > Installed > search: EditorConfig**) После этого все настройки авто-формата должны применяться по порядку: 1. EditorConfig настройка на уровне папки diff --git a/docs/content/contributing/Docs.md b/docs/content/contributing/Docs.md index 665180bb80..7559988797 100644 --- a/docs/content/contributing/Docs.md +++ b/docs/content/contributing/Docs.md @@ -21,7 +21,7 @@ Extra materials about technical writing: - [Jetbrains - Как писать полезные технические тексты](https://youtu.be/8SPq-9kS69M) - [Microsoft Writing Style Guide](https://docs.microsoft.com/en-us/style-guide/welcome/) -- [GitLab documentaion styleguide](https://docs.gitlab.com/ee/development/documentation/styleguide.html) +- [GitLab documentation styleguide](https://docs.gitlab.com/ee/development/documentation/styleguide.html) - [What nobody tells you about documentation](https://www.divio.com/blog/documentation/) @@ -69,16 +69,21 @@ Naming: --- -- Ориентация на обучение. -- Полезно для новых пользователей. -- Дает практическое понимание вместо теоретического знания. Показывает скорее _как_, а не _что_. +- Assist newcomers to get started +- Is learning-oriented +- Shows _how_ to do in form of a lesson -Приводит к конкретной цели через серию шагов: +The tutorial declares a goal in the beginning. +After it guides by a series of steps. Each step is: -- Простые и понятные -- Повторяемые и надежные, всегда работают -- Дают регулярную позитивную обратную связь -- Минимум теории и объяснений, не грузят лишним +- Easy to follow +- Robust and reliable +- Gives a positive feedback by an immediate result +- Has as minimum theory as possible + +Examples: + +- [Creating Web Applications with Flask](https://www.jetbrains.com/help/pycharm/creating-web-application-with-flask.html) <---> @@ -168,17 +173,13 @@ Anchor: `{{}}`. Чтобы посмотреть статистику по ссылке, добавь к ней `+`. -### Shortcuts - -Кастомные сниппеты для отображения того, что не поддерживает markdown.\ -Их несложно создавать. Напиши, если тебе не хватает какого-то типа контента. - -#### Diagrams +### Diagrams -Для диаграм используем [Mermaid](https://mermaid-js.github.io/mermaid/#/), описываем их в текстовом виде: +Diagrams is a preferable way for schemes and processes.\ +They are cheaper in maintenance. Text is the source of truth.\ +You don't need an original image and can edit it in a text editor. -- Содержимое читается без отрисовки картинки -- Для редактирования не нужны никакие программы +Use [mermaid](https://mermaid-js.github.io/mermaid/#/) shortcode: [Live editor](https://mermaid-js.github.io/mermaid-live-editor/) @@ -198,7 +199,16 @@ stateDiagram B --> [*] {{}} -#### Hints +### Images + +Images are good for illustrating an explanation.\ +Use any public file storage for them. For example, a Github CDN: + +![](https://user-images.githubusercontent.com/499192/57450172-1a955f80-725e-11e9-9fed-267179bdab15.gif) + +There is a html [figure](https://gohugo.io/content-management/shortcodes/#figure) element for more control. + +### Hints ```tpl {{}} @@ -222,7 +232,7 @@ Lorem markdownum insigne. Olympo signis Delphis! {{< button relref="/" >}}Home{{< /button >}} {{< button href="http://repo/CONTRIBUTING.md" >}}Contribute{{< /button >}} -#### Tabs +### Tabs ```tpl {{}} @@ -238,7 +248,7 @@ Lorem markdownum insigne. Olympo signis Delphis! {{< tab "Windows" >}} Windows Content {{< /tab >}} {{< /tabs >}} -#### Columns +### Columns ```tpl {{}} @@ -255,7 +265,7 @@ Right Content {{< /columns >}} -#### Expand +### Expand ```tpl {{}} @@ -282,15 +292,6 @@ Markdown content \overline{a \lor b} = \overline{a} \land \overline{b} {{< /katex >}} - -### Images - -Попробуй сначала выразить текстом и диаграммами. -Картинки и скриншоты дороже поддерживать в актуальном состоянии.\ -Загружаем картинки в любой публичный image storage.\ -На крайний случай, в репозиторий в `docs/static` ( [Static files](https://gohugo.io/content-management/static-files/) ) -Для более гибкого отображения картинок используй [shortcode](https://gohugo.io/content-management/shortcodes/#figure) - ### Lists #### Нумерованный или ненумерованный @@ -318,6 +319,14 @@ Markdown content {{< /columns >}} +## Language + +### Interaction with UI + +- Use bold text for describing menu items and `>` as separator\ +Open **Preferences > Build, Execution, Deployment > Debugger** +- Use exact words as shown in UI + ### Выделение терминов Выделяй символом ` команды, параметры, значения, имена файлов и т.п.: diff --git a/docs/content/contributing/HowToStart.md b/docs/content/contributing/HowToStart.md index 8b622b0590..c598df4882 100644 --- a/docs/content/contributing/HowToStart.md +++ b/docs/content/contributing/HowToStart.md @@ -5,7 +5,7 @@ type: docs # How to start -## Минимальные требования +## Minimal requirements - 16Gb RAM - Linux/OSX/Windows @@ -31,7 +31,7 @@ type: docs ### Обнови Kotlin плагин до последней версии -_Preferences | Languages & Frameworks | Kotlin_ +**Preferences > Languages & Frameworks > Kotlin** ### Подключи необходимые плагины diff --git a/docs/content/ide/Benchmarking.md b/docs/content/ide/Benchmarking.md index 30e72361f3..760b977738 100644 --- a/docs/content/ide/Benchmarking.md +++ b/docs/content/ide/Benchmarking.md @@ -10,7 +10,7 @@ type: docs ## Как попробовать? 1. Установи плагин -1. Запусти Help > Diagnostic > Execute Performance Scrip from File\ +1. Запусти **Help > Diagnostic > Execute Performance Scrip from File**\ Выбери готовый сценарий из /benchmarks/ide ## Как проверить гипотезу и измерить разницу? diff --git a/docs/content/ide/Speedup.md b/docs/content/ide/Speedup.md index 4336853520..e18dfea7fd 100644 --- a/docs/content/ide/Speedup.md +++ b/docs/content/ide/Speedup.md @@ -12,7 +12,7 @@ type: docs По умолчанию IDE выделяет мало, чтобы суметь запуститься на слабой машине. -_Help | Edit custom VM Options_ +**Help > Edit custom VM Options** ```none -Xmx4g @@ -20,7 +20,7 @@ _Help | Edit custom VM Options_ Слишком много не нужно. Чтобы посмотреть реальное потребление памяти: -_Appearance & Behavior | Appearance | Show memory indicator_ +**Appearance & Behavior > Appearance > Show memory indicator** ## Включи удаленную сборку @@ -44,14 +44,9 @@ sync... ## Отключи излишние действия во время синхронизации -- _Preferences | Experimental | Skip source generation on Gradle sync_ -- _Preferences | Experimental | Skip download of sources and javadoc on Gradle sync_ -- _Preferences | Experimental | Gradle | Only sync the active variant_ - - -## Отключи автоматическую синхронизацию проекта - -_Preferences | Build, Execution, Deployment | Compiler | Sync project with Gradle before building_ +- **Preferences > Experimental > Skip source generation on Gradle sync** +- **Preferences > Experimental > Skip download of sources and javadoc on Gradle sync** +- **Preferences > Build, Execution, Deployment > Compiler > Sync project with Gradle before building** ## Проверь что Gradle и Kotlin не запускают несколько демонов @@ -86,7 +81,7 @@ _Preferences | Build, Execution, Deployment | Compiler | Sync project with Gradl OSX -Добавь в исключения Spotlight: _System preferences | Spotlight | Privacy_ +Добавь в исключения Spotlight: **System preferences > Spotlight > Privacy** - Директории с android проектами (обязательно) - Android SDK @@ -106,7 +101,7 @@ tip: показать скрытые директории в Finder: _Cmd + Shif Проект большой и в нем много сгенерированных файлов, что нагружает IDE. Чтобы немного помочь, скрой файлы, которые никогда не нужны: -_Preferences | Editor | File Types | Ignore Files and Folders_ +**Preferences > Editor > File Types > Ignore Files and Folders** Недостатки: @@ -138,4 +133,4 @@ A light class is a representation of a Kotlin class as the Java PSI, allowing In Отключает инспекции и подсветку синтаксиса -_File | Power Save Mode_ +**File > Power Save Mode** diff --git a/docs/content/menu/index.md b/docs/content/menu/index.md index a367f46060..fe56b420c0 100644 --- a/docs/content/menu/index.md +++ b/docs/content/menu/index.md @@ -49,7 +49,7 @@ headless: true - [Design System](http://links.k.avito.ru/ff) - Performance - [Аналитика]({{< ref "/performance/Analytics.md" >}}) -- Проверки +- Checks - [Android lint]({{< ref "/checks/AndroidLint.md" >}}) - CI - [Требования]({{< ref "/ci/CIValues.md" >}}) diff --git a/docs/content/performance/Analytics.md b/docs/content/performance/Analytics.md index 5ca09b9761..15bf8e0f71 100644 --- a/docs/content/performance/Analytics.md +++ b/docs/content/performance/Analytics.md @@ -546,7 +546,7 @@ fun bindScreenTransferRecovery(recovery: ScreenTransferRecovery.Impl): ScreenTra Пример с экрана `RatingPublish` -![Пример](/docs/static/image/rating_publish.png) +![](https://user-images.githubusercontent.com/1104540/74605039-2a877d00-50d5-11ea-9172-2364796b848f.png) В панели Steps можно увидеть: diff --git a/docs/content/tech_radar/buildSrc.md b/docs/content/tech_radar/buildSrc.md index a2e562c739..9127f78b22 100644 --- a/docs/content/tech_radar/buildSrc.md +++ b/docs/content/tech_radar/buildSrc.md @@ -13,7 +13,7 @@ It's a default and convenient way for organizing custom plugins and tasks: ## Pros -No versions. It works as implicitly included build. +No binary versions and releases. It works as implicitly included build. ## Cons diff --git a/docs/content/test/Run.md b/docs/content/test/Run.md index 5745808b24..98de4225af 100644 --- a/docs/content/test/Run.md +++ b/docs/content/test/Run.md @@ -15,7 +15,7 @@ type: docs Важно чтобы в настройках запуск был делегирован Gradle: -`Preferences > Build, Exceution, Deployment > Build Tools > Gradle` +**Preferences > Build, Execution, Deployment > Build Tools > Gradle** {{< tabs "robolectric" >}} {{< tab "AS 3.6+" >}} diff --git a/docs/markdownlint.rb b/docs/markdownlint.rb index 46cd0c2b6f..95637e5b6d 100644 --- a/docs/markdownlint.rb +++ b/docs/markdownlint.rb @@ -48,6 +48,10 @@ # Rationale: false-positive on auto-links exclude_rule 'MD034' +# MD036 - Emphasis used instead of a header +# Rationale: false-positive on UI-elements description **Menu > Settings** +exclude_rule 'MD036' + # MD041 First line in file should be a top level header # Rationale: false-positive on headless pages (e.g. menu index) exclude_rule 'MD041' diff --git a/docs/static/image/rating_publish.png b/docs/static/image/rating_publish.png deleted file mode 100644 index bbcfbdf406f204a2ee8d9d079f54e1c3e73f2712..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167022 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%0AL+VYcQ1o48;d()bM>F(h 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
L^$=aD5#nZv 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 Ya2Jk1q(r%LUcq1T(kh>-B~8BmFE(x9_5c6? diff --git a/docs/themes/book/i18n/en.yaml b/docs/themes/book/i18n/en.yaml index 94b9c77510..a9c4d31682 100644 --- a/docs/themes/book/i18n/en.yaml +++ b/docs/themes/book/i18n/en.yaml @@ -11,4 +11,4 @@ translation: Expand - id: bookSearchConfig - translation: '{ cache: true }' + translation: '{ cache: true, split: /[^a-zа-яё0-9\w]/gi }' diff --git a/docs/themes/book/i18n/ru.yaml b/docs/themes/book/i18n/ru.yaml deleted file mode 100644 index 1e4d1247ec..0000000000 --- a/docs/themes/book/i18n/ru.yaml +++ /dev/null @@ -1,14 +0,0 @@ -- id: Search - translation: Поиск - -- id: Edit this page - translation: Редактировать - -- id: Last modified by - translation: Last modified by - -- id: Expand - translation: Развернуть - -- id: bookSearchConfig - translation: '{ split: /[^a-zа-яё0-9\w]/gi }' From 2f462334e0ba46830a05630cb4d5ab2edbd390fc Mon Sep 17 00:00:00 2001 From: Dmitriy Voronin Date: Wed, 19 Feb 2020 14:49:34 +0300 Subject: [PATCH 12/12] add docs about integration testing against avito (#195) --- docs/content/Infrastructure.md | 18 ++++++++++++++---- .../avito/android/lint/LintResultsParser.kt | 1 - 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/docs/content/Infrastructure.md b/docs/content/Infrastructure.md index b084ebcc6d..bd6b44ec52 100644 --- a/docs/content/Infrastructure.md +++ b/docs/content/Infrastructure.md @@ -155,8 +155,18 @@ Shared modules between android-test and gradle. ### CI integration tests against avito -1. Run [Teamcity configuration (internal)](http://links.k.avito.ru/fastCheckIntegration). You can also change build branch if you need to test unmerged code. -1. Pull request checks of avito would run against generated version of tools project. +1. Run [Teamcity configuration (internal)](http://links.k.avito.ru/fastCheck) to check pull request builds. +1. And/or [This one](http://links.k.avito.ru/fullCheck) to check full set of checks. +1. You don't need to be bothered about versions here, checks of avito would run against generated version of tools project. + +{{< hint info>}} +You can also change build branch if you need to test unmerged code. +But be careful, Teamcity is tricky about this one: + +- By default build will use develop from github agains develop from avito +- If you pick a different branch of avito, it will run against develop on github +- If you pick a different branch of github, it will run against develop on avito +- (UNTESTED) To build both projects of special branch, they should have the same name + +{{< /hint >}} -To re-check these changes locally you need to find android tools version in build parameters. Look for `integrationVersion`.\ -Also, to resolve this version you have to provide `artifactoryUrl` gradle property. diff --git a/subprojects/gradle/lint-report/src/main/kotlin/com/avito/android/lint/LintResultsParser.kt b/subprojects/gradle/lint-report/src/main/kotlin/com/avito/android/lint/LintResultsParser.kt index 62625a9b98..1437c2d12a 100644 --- a/subprojects/gradle/lint-report/src/main/kotlin/com/avito/android/lint/LintResultsParser.kt +++ b/subprojects/gradle/lint-report/src/main/kotlin/com/avito/android/lint/LintResultsParser.kt @@ -82,7 +82,6 @@ internal class LintResultsParser( if (event.isEndElement) { val endElement = event.asEndElement() if (endElement.name.localPart == "issue") { - println("GO AGAIN") issues.add( LintIssue( message = issue!!.message,