def METHOD_NAME(self):
    cmd_ev = test_lib.InitCommandEvaluator(arena=self.arena,
                                           ext_prog=self.ext_prog)
    Banner('ls | cut -d . -f 1 | head')
    p = process.Pipeline(False, self.job_control, self.job_list)
    p.Add(self._ExtProc(['ls']))
    p.Add(self._ExtProc(['cut', '-d', '.', '-f', '1']))
    node = _CommandNode('head', self.arena)
    p.AddLast((cmd_ev, node))
    p.StartPipeline(self.waiter)
    print(p.RunLastPart(self.waiter, self.fd_state))
    # Simulating subshell for each command
    node1 = _CommandNode('ls', self.arena)
    node2 = _CommandNode('head', self.arena)
    node3 = _CommandNode('sort --reverse', self.arena)
    thunk1 = process.SubProgramThunk(cmd_ev, node1, self.trap_state)
    thunk2 = process.SubProgramThunk(cmd_ev, node2, self.trap_state)
    thunk3 = process.SubProgramThunk(cmd_ev, node3, self.trap_state)
    p = process.Pipeline(False, self.job_control, self.job_list)
    p.Add(Process(thunk1, self.job_control, self.job_list, self.tracer))
    p.Add(Process(thunk2, self.job_control, self.job_list, self.tracer))
    p.Add(Process(thunk3, self.job_control, self.job_list, self.tracer))
    last_thunk = (cmd_ev, _CommandNode('cat', self.arena))
    p.AddLast(last_thunk)
    p.StartPipeline(self.waiter)
    print(p.RunLastPart(self.waiter, self.fd_state))
    # TODO: Combine pipelines for other things:
    # echo foo 1>&2 | tee stdout.txt
    #
    # foo=$(ls | head)
    #
    # foo=$(<<EOF ls | head)
    # stdin
    # EOF
    #
    # ls | head &
    # Or technically we could fork the whole interpreter for foo|bar|baz and
    # capture stdout of that interpreter.