Roman Elizarov | 1f74a2d | 2018-06-29 19:19:45 +0300 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. |
| 3 | */ |
| 4 | |
Vsevolod Tolstopyatov | 74bcc92 | 2018-05-03 20:07:54 +0300 | [diff] [blame] | 5 | package kotlinx.coroutines.experimental.tools |
| 6 | |
| 7 | import org.junit.* |
Roman Elizarov | 53c0028 | 2018-08-22 11:00:10 +0300 | [diff] [blame] | 8 | import org.junit.runner.* |
| 9 | import org.junit.runners.* |
Vsevolod Tolstopyatov | 74bcc92 | 2018-05-03 20:07:54 +0300 | [diff] [blame] | 10 | import java.io.* |
Roman Elizarov | 53c0028 | 2018-08-22 11:00:10 +0300 | [diff] [blame] | 11 | import java.util.* |
Vsevolod Tolstopyatov | 74bcc92 | 2018-05-03 20:07:54 +0300 | [diff] [blame] | 12 | import java.util.jar.* |
Roman Elizarov | 53c0028 | 2018-08-22 11:00:10 +0300 | [diff] [blame] | 13 | import kotlin.collections.ArrayList |
Vsevolod Tolstopyatov | 74bcc92 | 2018-05-03 20:07:54 +0300 | [diff] [blame] | 14 | |
Roman Elizarov | 53c0028 | 2018-08-22 11:00:10 +0300 | [diff] [blame] | 15 | @RunWith(Parameterized::class) |
| 16 | class PublicApiTest( |
| 17 | private val rootDir: String, |
| 18 | private val moduleName: String |
| 19 | ) { |
| 20 | companion object { |
| 21 | private val apiProps = ClassLoader.getSystemClassLoader() |
| 22 | .getResource("api.properties").openStream().use { Properties().apply { load(it) } } |
| 23 | private val nonPublicPackages = apiProps.getProperty("packages.internal")!!.split(" ") |
Vsevolod Tolstopyatov | 74bcc92 | 2018-05-03 20:07:54 +0300 | [diff] [blame] | 24 | |
Roman Elizarov | 53c0028 | 2018-08-22 11:00:10 +0300 | [diff] [blame] | 25 | @Parameterized.Parameters(name = "{1}") |
| 26 | @JvmStatic |
| 27 | fun modules(): List<Array<Any>> { |
| 28 | val moduleRoots = apiProps.getProperty("module.roots").split(" ") |
| 29 | val moduleMarker = apiProps.getProperty("module.marker")!! |
| 30 | val moduleIgnore = apiProps.getProperty("module.ignore")!!.split(" ").toSet() |
| 31 | val modules = ArrayList<Array<Any>>() |
| 32 | for (rootDir in moduleRoots) { |
| 33 | File("../$rootDir").listFiles( FileFilter { it.isDirectory })?.forEach { dir -> |
| 34 | if (dir.name !in moduleIgnore && File(dir, moduleMarker).exists()) { |
| 35 | modules += arrayOf<Any>(rootDir, dir.name) |
| 36 | } |
| 37 | } |
| 38 | } |
| 39 | return modules |
| 40 | } |
Vsevolod Tolstopyatov | 74bcc92 | 2018-05-03 20:07:54 +0300 | [diff] [blame] | 41 | } |
| 42 | |
| 43 | @Test |
Roman Elizarov | 53c0028 | 2018-08-22 11:00:10 +0300 | [diff] [blame] | 44 | fun testApi() { |
| 45 | val libsDir = File("../$rootDir/$moduleName/build/libs").absoluteFile.normalize() |
| 46 | val jarFile = getJarPath(libsDir) |
| 47 | val kotlinJvmMappingsFiles = listOf(libsDir.resolve("../visibilities.json")) |
Vsevolod Tolstopyatov | 74bcc92 | 2018-05-03 20:07:54 +0300 | [diff] [blame] | 48 | val visibilities = |
| 49 | kotlinJvmMappingsFiles |
Roman Elizarov | 53c0028 | 2018-08-22 11:00:10 +0300 | [diff] [blame] | 50 | .map { readKotlinVisibilities(it) } |
Vsevolod Tolstopyatov | 74bcc92 | 2018-05-03 20:07:54 +0300 | [diff] [blame] | 51 | .reduce { m1, m2 -> m1 + m2 } |
Vsevolod Tolstopyatov | 74bcc92 | 2018-05-03 20:07:54 +0300 | [diff] [blame] | 52 | val api = getBinaryAPI(JarFile(jarFile), visibilities).filterOutNonPublic(nonPublicPackages) |
Roman Elizarov | 53c0028 | 2018-08-22 11:00:10 +0300 | [diff] [blame] | 53 | api.dumpAndCompareWith(File("reference-public-api").resolve("$moduleName.txt")) |
Vsevolod Tolstopyatov | 74bcc92 | 2018-05-03 20:07:54 +0300 | [diff] [blame] | 54 | } |
| 55 | |
Roman Elizarov | 53c0028 | 2018-08-22 11:00:10 +0300 | [diff] [blame] | 56 | private fun getJarPath(libsDir: File): File { |
| 57 | val regex = Regex("$moduleName-.+\\.jar") |
| 58 | val files = (libsDir.listFiles() ?: throw Exception("Cannot list files in $libsDir")) |
Vsevolod Tolstopyatov | 74bcc92 | 2018-05-03 20:07:54 +0300 | [diff] [blame] | 59 | .filter { it.name.let { |
| 60 | it matches regex |
| 61 | && !it.endsWith("-sources.jar") |
| 62 | && !it.endsWith("-javadoc.jar") |
| 63 | && !it.endsWith("-tests.jar")} } |
Roman Elizarov | 53c0028 | 2018-08-22 11:00:10 +0300 | [diff] [blame] | 64 | return files.singleOrNull() ?: throw Exception("No single file matching $regex in $libsDir:\n${files.joinToString("\n")}") |
Vsevolod Tolstopyatov | 74bcc92 | 2018-05-03 20:07:54 +0300 | [diff] [blame] | 65 | } |
| 66 | } |