1# Copyright 2013 The Chromium Authors 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import("//build/buildflag_header.gni") 6import("//testing/libfuzzer/fuzzer_test.gni") 7import("//testing/test.gni") 8import("features.gni") 9 10import("//build/config/cronet/config.gni") 11import("//third_party/jni_zero/jni_zero.gni") 12 13if (is_android) { 14 import("//build/config/android/rules.gni") 15} 16 17buildflag_header("buildflags") { 18 header = "buildflags.h" 19 flags = [ "USE_PLATFORM_ICU_ALTERNATIVES=$use_platform_icu_alternatives" ] 20} 21 22component("url") { 23 sources = [ 24 "gurl.cc", 25 "gurl.h", 26 "origin.cc", 27 "origin.h", 28 "scheme_host_port.cc", 29 "scheme_host_port.h", 30 "third_party/mozilla/url_parse.cc", 31 "third_party/mozilla/url_parse.h", 32 "url_canon.cc", 33 "url_canon.h", 34 "url_canon_etc.cc", 35 "url_canon_filesystemurl.cc", 36 "url_canon_fileurl.cc", 37 "url_canon_host.cc", 38 "url_canon_internal.cc", 39 "url_canon_internal.h", 40 "url_canon_internal_file.h", 41 "url_canon_ip.cc", 42 "url_canon_ip.h", 43 "url_canon_mailtourl.cc", 44 "url_canon_non_special_url.cc", 45 "url_canon_path.cc", 46 "url_canon_pathurl.cc", 47 "url_canon_query.cc", 48 "url_canon_relative.cc", 49 "url_canon_stdstring.cc", 50 "url_canon_stdstring.h", 51 "url_canon_stdurl.cc", 52 "url_constants.h", 53 "url_features.cc", 54 "url_features.h", 55 "url_file.h", 56 "url_parse_file.cc", 57 "url_parse_internal.h", 58 "url_util.cc", 59 "url_util.h", 60 "url_util_internal.h", 61 ] 62 63 defines = [ "IS_URL_IMPL" ] 64 65 deps = [] 66 67 public_deps = [ 68 "//base", 69 "//build:robolectric_buildflags", 70 ] 71 72 configs += [ "//build/config/compiler:wexit_time_destructors" ] 73 74 if (is_android || is_robolectric) { 75 deps += [ ":url_jni_headers" ] 76 if (!is_cronet_build) { 77 sources += [ 78 "android/gurl_android.cc", 79 "android/gurl_android.h", 80 "android/origin_android.cc", 81 "android/parsed_android.cc", 82 "android/parsed_android.h", 83 ] 84 } 85 } 86 87 if (is_robolectric) { 88 # Make jni.h available. 89 public_configs = [ "//third_party/jdk" ] 90 } 91 92 if (is_win) { 93 # Don't conflict with Windows' "url.dll". 94 output_name = "url_lib" 95 } 96 97 # ICU support. 98 if (use_platform_icu_alternatives) { 99 if (is_android) { 100 sources += [ "url_idna_icu_alternatives_android.cc" ] 101 deps += [ ":buildflags" ] 102 } else if (is_ios) { 103 sources += [ "url_idna_icu_alternatives_ios.mm" ] 104 } else { 105 assert(false, 106 "ICU alternative is not implemented for platform: " + target_os) 107 } 108 } else { 109 # Use ICU. 110 sources += [ 111 "url_canon_icu.cc", 112 "url_canon_icu.h", 113 "url_idna_icu.cc", 114 ] 115 deps += [ 116 "//base:i18n", 117 "//third_party/icu", 118 ] 119 } 120} 121 122if (is_android || is_robolectric) { 123 generate_jni("url_jni_headers") { 124 sources = [ "android/java/src/org/chromium/url/IDNStringUtil.java" ] 125 if (!is_cronet_build) { 126 sources += [ 127 "android/java/src/org/chromium/url/GURL.java", 128 "android/java/src/org/chromium/url/Origin.java", 129 "android/java/src/org/chromium/url/Parsed.java", 130 ] 131 } 132 } 133} 134if (is_android && current_toolchain == default_toolchain) { 135 # TODO(agrieve): Remove alias once usages are removed. 136 java_group("gurl_java") { 137 deps = [ ":url_java" ] 138 } 139 140 android_library("url_java") { 141 sources = [ "android/java/src/org/chromium/url/IDNStringUtil.java" ] 142 srcjar_deps = [ ":url_jni_headers" ] 143 deps = [ "//third_party/jni_zero:jni_zero_java" ] 144 if (!is_cronet_build) { 145 sources += [ 146 "android/java/src/org/chromium/url/GURL.java", 147 "android/java/src/org/chromium/url/Origin.java", 148 "android/java/src/org/chromium/url/Parsed.java", 149 "android/java/src/org/chromium/url/URI.java", 150 ] 151 deps += [ 152 "//base:base_java", 153 "//build/android:build_java", 154 "//mojo/public/java:bindings_java", 155 "//mojo/public/mojom/base:base_java", 156 "//third_party/android_deps:com_google_errorprone_error_prone_annotations_java", 157 "//third_party/androidx:androidx_annotation_annotation_java", 158 "//url/mojom:url_mojom_gurl_java", 159 "//url/mojom:url_mojom_origin_java", 160 ] 161 } 162 } 163} 164 165source_set("url_test_support") { 166 testonly = true 167 168 sources = [ 169 "gurl_abstract_tests.h", 170 "origin_abstract_tests.cc", 171 "origin_abstract_tests.h", 172 "url_canon_icu_test_helpers.h", 173 ] 174 175 public_deps = [ 176 ":url", 177 "//base", 178 "//base/test:test_support", 179 "//testing/gmock", 180 "//testing/gtest", 181 ] 182} 183 184test("url_unittests") { 185 sources = [ 186 "gurl_unittest.cc", 187 "origin_unittest.cc", 188 "run_all_unittests.cc", 189 "scheme_host_port_unittest.cc", 190 "url_canon_icu_unittest.cc", 191 "url_canon_unittest.cc", 192 "url_parse_unittest.cc", 193 "url_test_utils.h", 194 "url_util_unittest.cc", 195 ] 196 197 deps = [ 198 ":url", 199 ":url_test_support", 200 "//base", 201 "//base/test:test_support", 202 "//testing/gmock", 203 "//testing/gtest", 204 ] 205 206 if (use_platform_icu_alternatives) { 207 # Unit tests that are not supported by the current ICU alternatives on Android. 208 if (is_android) { 209 sources -= [ 210 "url_canon_icu_unittest.cc", 211 "url_canon_unittest.cc", 212 ] 213 deps += [ ":url_java" ] 214 } 215 216 # Unit tests that are not supported by the current ICU alternatives on iOS. 217 if (is_ios) { 218 sources -= [ 219 "origin_unittest.cc", 220 "scheme_host_port_unittest.cc", 221 "url_canon_icu_unittest.cc", 222 "url_canon_unittest.cc", 223 ] 224 } 225 } else { # !use_platform_icu_alternatives 226 deps += [ "//third_party/icu:icuuc" ] 227 } 228 229 if (!is_ios && !is_cronet_build) { 230 sources += [ 231 "mojom/scheme_host_port_mojom_traits_unittest.cc", 232 "mojom/url_gurl_mojom_traits_unittest.cc", 233 ] 234 deps += [ 235 "//mojo/core/embedder", 236 "//mojo/public/cpp/test_support:test_utils", 237 "//url/ipc:url_ipc_unittests", 238 "//url/mojom:mojom_traits", 239 "//url/mojom:test_url_mojom_gurl", 240 ] 241 } 242} 243 244test("url_perftests") { 245 sources = [ 246 "run_all_perftests.cc", 247 "url_parse_perftest.cc", 248 ] 249 250 deps = [ 251 ":url", 252 "//base", 253 "//base/test:test_support", 254 "//testing/gtest", 255 ] 256} 257 258fuzzer_test("gurl_fuzzer") { 259 sources = [ "gurl_fuzzer.cc" ] 260 deps = [ 261 ":url", 262 "//base", 263 "//base:i18n", 264 ] 265 dict = "gurl_fuzzer.dict" 266} 267 268fuzzer_test("url_idna_icu_fuzzer") { 269 sources = [ "url_idna_icu_fuzzer.cc" ] 270 deps = [ 271 ":url", 272 "//third_party/icu:icuuc", 273 "//third_party/icu/fuzzers:fuzzer_support", 274 ] 275} 276 277fuzzer_test("url_canon_icu_fuzzer") { 278 sources = [ "url_canon_icu_fuzzer.cc" ] 279 deps = [ 280 ":url", 281 ":url_test_support", 282 "//third_party/icu:icuuc", 283 ] 284} 285 286if (is_android && !is_cronet_build) { 287 source_set("android_test_helper") { 288 testonly = true 289 sources = [ 290 "android/gurl_java_test_helper.cc", 291 "android/origin_java_test_helper.cc", 292 ] 293 deps = [ 294 ":j_test_jni_headers($default_toolchain)", 295 ":url", 296 "//base/test:test_support", 297 ] 298 } 299 300 if (current_toolchain == default_toolchain) { 301 android_library("android_test_helper_java") { 302 testonly = true 303 304 srcjar_deps = [ ":j_test_jni_headers" ] 305 sources = [ 306 "android/javatests/src/org/chromium/url/GURLJavaTestHelper.java", 307 "android/javatests/src/org/chromium/url/OriginJavaTestHelper.java", 308 ] 309 deps = [ 310 ":url_java", 311 "//base:base_java_test_support", 312 "//third_party/jni_zero:jni_zero_java", 313 ] 314 } 315 316 # Targets depending on gurl_junit_test_support do not need to bypass platform 317 # checks. 318 android_library("gurl_junit_test_support") { 319 testonly = true 320 sources = [ "android/test/java/src/org/chromium/url/JUnitTestGURLs.java" ] 321 deps = [ ":url_java" ] 322 } 323 324 android_library("url_java_unit_tests") { 325 testonly = true 326 sources = [ 327 "android/javatests/src/org/chromium/url/GURLJavaTest.java", 328 "android/javatests/src/org/chromium/url/OriginJavaTest.java", 329 ] 330 deps = [ 331 ":android_test_helper_java", 332 ":gurl_junit_test_support", 333 ":url_java", 334 "//base:base_java", 335 "//base:base_java_test_support", 336 "//build/android:build_java", 337 "//content/public/test/android:content_java_test_support", 338 "//mojo/public/mojom/base:base_java", 339 "//third_party/androidx:androidx_core_core_java", 340 "//third_party/androidx:androidx_test_runner_java", 341 "//third_party/jni_zero:jni_zero_java", 342 "//third_party/junit", 343 "//third_party/mockito:mockito_java", 344 "//url/mojom:url_mojom_gurl_java", 345 "//url/mojom:url_mojom_origin_java", 346 ] 347 } 348 349 # See https://bugs.chromium.org/p/chromium/issues/detail?id=908819 for why we 350 # can't put 'java' in the name here. 351 generate_jni("j_test_jni_headers") { 352 testonly = true 353 sources = [ 354 "android/javatests/src/org/chromium/url/GURLJavaTestHelper.java", 355 "android/javatests/src/org/chromium/url/OriginJavaTestHelper.java", 356 ] 357 } 358 } 359} 360 361# Use this in robolectric_binary() targets if you just need GURL and //base 362# functionality. Otherwise, define a custom shared_library(). 363if (!is_cronet_build && target_os == "android") { 364 shared_library_with_jni("libgurl_robolectric") { 365 testonly = true 366 enable_target = is_robolectric 367 java_targets = [ 368 ":gurl_java", 369 ":url_java", 370 ] 371 deps = [ ":robolectric_jni_onload($robolectric_toolchain)" ] 372 } 373 if (is_robolectric) { 374 # Depend on this if you need to write a custom JNI_OnLoad() 375 source_set("gurl_test_init") { 376 testonly = true 377 sources = [ 378 "android/gurl_test_init.cc", 379 "android/gurl_test_init.h", 380 ] 381 deps = [ ":url" ] 382 } 383 384 # Depend on this if you do not need to write a custom JNI_OnLoad() 385 source_set("robolectric_jni_onload") { 386 testonly = true 387 sources = [ "android/robolectric_jni_onload.cc" ] 388 deps = [ 389 ":gurl_test_init", 390 "//base", 391 ] 392 393 # Make jni.h available. 394 configs += [ "//third_party/jdk" ] 395 } 396 } 397} 398