Add testing of grpc-node for Linux and MacOS
diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py
index b66c5f7..bcf09de 100755
--- a/tools/run_tests/run_tests.py
+++ b/tools/run_tests/run_tests.py
@@ -445,6 +445,67 @@
     return self.make_target
 
 
+# This tests Node on grpc/grpc-node and will become the standard for Node testing
+class RemoteNodeLanguage(object):
+
+  def __init__(self):
+    self.platform = platform_string()
+
+  def configure(self, config, args):
+    self.config = config
+    self.args = args
+    # Note: electron ABI only depends on major and minor version, so that's all
+    # we should specify in the compiler argument
+    _check_compiler(self.args.compiler, ['default', 'node0.12',
+                                         'node4', 'node5', 'node6',
+                                         'node7', 'node8',
+                                         'electron1.3', 'electron1.6'])
+    if self.args.compiler == 'default':
+      self.runtime = 'node'
+      self.node_version = '8'
+    else:
+      if self.args.compiler.startswith('electron'):
+        self.runtime = 'electron'
+        self.node_version = self.args.compiler[8:]
+      else:
+        self.runtime = 'node'
+        # Take off the word "node"
+        self.node_version = self.args.compiler[4:]
+
+  # TODO: update with Windows/electron scripts when available for grpc/grpc-node
+  def test_specs(self):
+    if self.platform == 'windows':
+      return [self.config.job_spec(['tools\\run_tests\\helper_scripts\\run_node.bat'])]
+    else:
+      return [self.config.job_spec(['tools/run_tests/helper_scripts/run_grpc-node.sh'],
+                                   None,
+                                   environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
+
+  def pre_build_steps(self):
+    return []
+
+  def make_targets(self):
+    return []
+
+  def make_options(self):
+    return []
+
+  def build_steps(self):
+    return []
+
+  def post_tests_steps(self):
+    return []
+
+  def makefile_name(self):
+    return 'Makefile'
+
+  def dockerfile_dir(self):
+    return 'tools/dockerfile/test/node_jessie_%s' % _docker_arch_suffix(self.args.arch)
+
+  def __str__(self):
+    return 'grpc-node'
+
+
 class NodeLanguage(object):
 
   def __init__(self):
@@ -1063,6 +1124,7 @@
 _LANGUAGES = {
     'c++': CLanguage('cxx', 'c++'),
     'c': CLanguage('c', 'c'),
+    'grpc-node': RemoteNodeLanguage(),
     'node': NodeLanguage(),
     'node_express': NodeExpressLanguage(),
     'php': PhpLanguage(),