Initial builds using bazel

Change-Id: I38123b396a2ffda5f36cdca43f3ad1fa67a7ab52
diff --git a/tools/build/bazel/generate_test_rules.bzl b/tools/build/bazel/generate_test_rules.bzl
new file mode 100644
index 0000000..c8c3976
--- /dev/null
+++ b/tools/build/bazel/generate_test_rules.bzl
@@ -0,0 +1,113 @@
+# -*- mode:python; -*-
+#
+# Copyright 2016 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Generate java test rules from given test_files.
+Instead of having to create one test rule per test in the BUILD file, this rule
+provides a handy way to create a bunch of test rules for the specified test
+files.
+"""
+
+def testIsExcluded(exclude_tests, test):
+  for excluded_test in exclude_tests:
+    normalized_excluded_test = excluded_test.replace('.', '/')
+    if test.endswith(normalized_excluded_test):
+      return True;
+  return False
+
+def generate_test_rules(name,
+                 test_files,
+                 deps,
+                 exclude_tests=[],
+                 default_test_size="small",
+                 small_tests=[],
+                 medium_tests=[],
+                 large_tests=[],
+                 enormous_tests=[],
+                 resources=[],
+                 flaky_tests=[],
+                 tags=[],
+                 prefix="",
+                 jvm_flags=["-XX:MaxPermSize=128m"],
+                 args=[],
+                 visibility=None,
+                 shard_count=1):
+  for test in _get_test_names(test_files):
+    if testIsExcluded(exclude_tests, test):
+      continue
+    test_size = default_test_size
+    if test in small_tests:
+      test_size = "small"
+    if test in medium_tests:
+      test_size = "medium"
+    if test in large_tests:
+      test_size = "large"
+    if test in enormous_tests:
+      test_size = "enormous"
+    flaky = 0
+    if (test in flaky_tests) or ("flaky" in tags):
+      flaky = 1
+    java_class = _package_from_path(
+        PACKAGE_NAME + "/" + _strip_right(test, ".java"))
+    package = java_class[:java_class.rfind(".")]
+    native.java_test(name = prefix + test,
+                     runtime_deps = deps,
+                     resources = resources,
+                     size = test_size,
+                     jvm_flags = jvm_flags,
+                     args = args,
+                     flaky = flaky,
+                     tags = tags,
+                     test_class = java_class,
+                     visibility = visibility,
+                     shard_count = shard_count)
+
+
+def _get_test_names(test_files):
+  test_names = []
+  for test_file in test_files:
+    if not test_file.endswith("Test.java"):
+      continue
+    test_names += [test_file[:-5]]
+  return test_names
+
+
+def _package_from_path(package_path, src_impls=None):
+  src_impls = src_impls or ['javatests/', 'java/']
+  for src_impl in src_impls:
+    if not src_impl.endswith('/'):
+      src_impl += '/'
+    index = _index_of_end(package_path, src_impl)
+    if index >= 0:
+      package_path = package_path[index:]
+      break
+  return package_path.replace('/', '.')
+
+
+def _strip_right(str, suffix):
+  """Returns str without the suffix if it ends with suffix."""
+  if str.endswith(suffix):
+    return str[0: len(str) - len(suffix)]
+  else:
+    return str
+
+
+def _index_of_end(str, part):
+  """If part is in str, return the index of the first character after part.
+  Return -1 if part is not in str."""
+  index = str.find(part)
+  if index >= 0:
+    return index + len(part)
+  return -1