Esempio n. 1
0
    def _bundle_and_run(self, bundle_args, classpath):
        self.assert_success(self.run_pants(['clean-all']))
        pants_command = list(bundle_args)
        pants_command.append(
            'testprojects/src/java/org/pantsbuild/testproject/shading:third')
        self.assert_success(self.run_pants(pants_command))

        main_class = 'org.pantsbuild.testproject.shading.Third'
        with subsystem_instance(DistributionLocator):
            executor = SubprocessExecutor(
                DistributionLocator.cached(minimum_version='1.7'))
            p = executor.spawn(classpath,
                               main_class,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE)
            out, err = p.communicate()
            self.assertEqual(0, p.returncode, err)
            class_names = json.loads(out.strip())
            self.assertEqual(
                {
                    'Gson': 'moc.elgoog.nosg.Gson',
                    'Third': 'org.pantsbuild.testproject.shading.Third',
                    'Second':
                    'hello.org.pantsbuild.testproject.shading.Second',
                }, class_names)
 def execute_tool(self, classpath, main, args=None):
   init_subsystem(DistributionLocator)
   executor = SubprocessExecutor(DistributionLocator.cached())
   process = executor.spawn(classpath, main, args=args,
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
   out, err = process.communicate()
   self.assertEqual(0, process.returncode)
   self.assertEqual('', err.strip().decode())
   yield out.decode()
 def execute_tool(self, classpath, main, args=None):
   init_subsystem(DistributionLocator)
   executor = SubprocessExecutor(DistributionLocator.cached())
   process = executor.spawn(classpath, main, args=args,
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
   out, err = process.communicate()
   self.assertEqual(0, process.returncode)
   self.assertEqual('', err.strip())
   yield out
Esempio n. 4
0
 def assert_run_ant_version(classpath):
   with subsystem_instance(DistributionLocator):
     executor = SubprocessExecutor(DistributionLocator.cached())
     process = executor.spawn(classpath, 'org.apache.tools.ant.Main', args=['-version'],
                              stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     out, err = process.communicate()
     self.assertEqual(0, process.returncode)
     self.assertTrue(out.strip().startswith('Apache Ant(TM) version 1.9.4'))
     self.assertEqual('', err.strip())
Esempio n. 5
0
 def do_test_jre_env_var(self, env_var, env_value, scrubbed=True):
   with self.jre(env_var=env_var) as jre:
     executor = SubprocessExecutor(Distribution(bin_path=jre))
     with environment_as(**{env_var: env_value}):
       self.assertEqual(env_value, os.getenv(env_var))
       process = executor.spawn(classpath=['dummy/classpath'],
                                main='dummy.main',
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)
       _, stderr = process.communicate()
       self.assertEqual(0, process.returncode)
       self.assertEqual('' if scrubbed else env_value, stderr.decode().strip())
Esempio n. 6
0
 def do_test_jre_env_var(self, env_var, env_value, scrubbed=True):
   with self.jre(env_var=env_var) as jre:
     executor = SubprocessExecutor(Distribution(bin_path=jre))
     with environment_as(**{env_var: env_value}):
       self.assertEqual(env_value, os.getenv(env_var))
       process = executor.spawn(classpath=['dummy/classpath'],
                                main='dummy.main',
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)
       _, stderr = process.communicate()
       self.assertEqual(0, process.returncode)
       self.assertEqual('' if scrubbed else env_value, stderr.strip())
Esempio n. 7
0
  def post_fork_child(self, fingerprint, jvm_options, classpath, stdout, stderr):
    """Post-fork() child callback for ProcessManager.daemon_spawn()."""
    java = SubprocessExecutor(self._distribution)

    subproc = java.spawn(classpath=classpath,
                         main='com.martiansoftware.nailgun.NGServer',
                         jvm_options=jvm_options,
                         args=[':0'],
                         stdin=safe_open('/dev/null', 'r'),
                         stdout=safe_open(self._ng_stdout, 'w'),
                         stderr=safe_open(self._ng_stderr, 'w'),
                         close_fds=True)

    self.write_pid(subproc.pid)
Esempio n. 8
0
  def post_fork_child(self, fingerprint, jvm_options, classpath, stdout, stderr):
    """Post-fork() child callback for ProcessManager.daemon_spawn()."""
    java = SubprocessExecutor(self._distribution)

    subproc = java.spawn(classpath=classpath,
                         main='com.martiansoftware.nailgun.NGServer',
                         jvm_options=jvm_options,
                         args=[':0'],
                         stdin=safe_open('/dev/null', 'r'),
                         stdout=safe_open(self._ng_stdout, 'w'),
                         stderr=safe_open(self._ng_stderr, 'w'),
                         close_fds=True)

    self.write_pid(subproc.pid)
Esempio n. 9
0
    def _spawn_nailgun_server(self, fingerprint, jvm_options, classpath,
                              stdout, stderr):
        logger.debug(
            'No ng server found with fingerprint {fingerprint}, spawning...'.
            format(fingerprint=fingerprint))

        with safe_open(self._ng_out, 'w'):
            pass  # truncate

        pid = os.fork()
        if pid != 0:
            # In the parent tine - block on ng being up for connections
            return self._await_nailgun_server(
                stdout, stderr,
                'jvm_options={jvm_options} classpath={classpath}'.format(
                    jvm_options=jvm_options, classpath=classpath))

        os.setsid()
        in_fd = open('/dev/null', 'r')
        out_fd = safe_open(self._ng_out, 'w')
        err_fd = safe_open(self._ng_err, 'w')

        java = SubprocessExecutor(self._distribution)

        jvm_options = jvm_options + [
            self._PANTS_NG_ARG,
            self.create_owner_arg(self._workdir),
            self._create_fingerprint_arg(fingerprint)
        ]

        process = java.spawn(classpath=classpath,
                             main='com.martiansoftware.nailgun.NGServer',
                             jvm_options=jvm_options,
                             args=[':0'],
                             stdin=in_fd,
                             stdout=out_fd,
                             stderr=err_fd,
                             close_fds=True)

        logger.debug(
            'Spawned ng server with fingerprint {fingerprint} @ {pid}'.format(
                fingerprint=fingerprint, pid=process.pid))
        # Prevents finally blocks and atexit handlers from being executed, unlike sys.exit(). We
        # don't want to execute finally blocks because we might, e.g., clean up tempfiles that the
        # parent still needs.
        os._exit(0)
Esempio n. 10
0
  def _bundle_and_run(self, bundle_args, classpath):
    self.assert_success(self.run_pants(['clean-all']))
    pants_command = list(bundle_args)
    pants_command.append('testprojects/src/java/org/pantsbuild/testproject/shading:third')
    self.assert_success(self.run_pants(pants_command))

    main_class = 'org.pantsbuild.testproject.shading.Third'
    with subsystem_instance(DistributionLocator):
      executor = SubprocessExecutor(DistributionLocator.cached(minimum_version='1.7'))
      p = executor.spawn(classpath, main_class, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
      out, err = p.communicate()
      self.assertEqual(0, p.returncode, err)
      class_names = json.loads(out.strip())
      self.assertEqual({
        'Gson': 'moc.elgoog.nosg.Gson',
        'Third': 'org.pantsbuild.testproject.shading.Third',
        'Second': 'hello.org.pantsbuild.testproject.shading.Second',
      }, class_names)
Esempio n. 11
0
    def _spawn_jdeps_command(self, target, target_artifact_classpaths,
                             potential_deps_classpaths):
        jdk = DistributionLocator.cached(jdk=True)
        tool_classpath = jdk.find_libs(['tools.jar'])
        potential_deps_classpath = ":".join(
            cp for cp in potential_deps_classpaths)

        args = ["-summary"]
        if potential_deps_classpath:
            args.extend(['-classpath', potential_deps_classpath])

        args.extend(target_artifact_classpaths)

        java_executor = SubprocessExecutor(jdk)
        return java_executor.spawn(classpath=tool_classpath,
                                   main='com.sun.tools.jdeps.Main',
                                   jvm_options=self.get_options().jvm_options,
                                   args=args,
                                   stdout=subprocess.PIPE)
Esempio n. 12
0
  def _spawn_nailgun_server(self, fingerprint, jvm_options, classpath, stdout, stderr):
    logger.debug('No ng server found with fingerprint {fingerprint}, spawning...'
                 .format(fingerprint=fingerprint))

    with safe_open(self._ng_out, 'w'):
      pass  # truncate

    pid = os.fork()
    if pid != 0:
      # In the parent tine - block on ng being up for connections
      return self._await_nailgun_server(stdout, stderr,
                                        'jvm_options={jvm_options} classpath={classpath}'
                                        .format(jvm_options=jvm_options, classpath=classpath))


    os.setsid()
    in_fd = open('/dev/null', 'r')
    out_fd = safe_open(self._ng_out, 'w')
    err_fd = safe_open(self._ng_err, 'w')

    java = SubprocessExecutor(self._distribution)

    jvm_options = jvm_options + [self._PANTS_NG_ARG,
                           self.create_owner_arg(self._workdir),
                           self._create_fingerprint_arg(fingerprint)]

    process = java.spawn(classpath=classpath,
                         main='com.martiansoftware.nailgun.NGServer',
                         jvm_options=jvm_options,
                         args=[':0'],
                         stdin=in_fd,
                         stdout=out_fd,
                         stderr=err_fd,
                         close_fds=True)

    logger.debug('Spawned ng server with fingerprint {fingerprint} @ {pid}'
                 .format(fingerprint=fingerprint, pid=process.pid))
    # Prevents finally blocks and atexit handlers from being executed, unlike sys.exit(). We
    # don't want to execute finally blocks because we might, e.g., clean up tempfiles that the
    # parent still needs.
    os._exit(0)