github.com/getgauge/gauge@v1.6.9/api/lang/runner.go (about)

     1  /*----------------------------------------------------------------
     2   *  Copyright (c) ThoughtWorks, Inc.
     3   *  Licensed under the Apache License, Version 2.0
     4   *  See LICENSE in the project root for license information.
     5   *----------------------------------------------------------------*/
     6  
     7  package lang
     8  
     9  import (
    10  	"fmt"
    11  	"os"
    12  
    13  	gm "github.com/getgauge/gauge-proto/go/gauge_messages"
    14  	"github.com/getgauge/gauge/config"
    15  	"github.com/getgauge/gauge/logger"
    16  	"github.com/getgauge/gauge/manifest"
    17  	"github.com/getgauge/gauge/runner"
    18  	"github.com/getgauge/gauge/util"
    19  	"github.com/sourcegraph/go-langserver/pkg/lsp"
    20  )
    21  
    22  type langRunner struct {
    23  	lspID  string
    24  	runner *runner.GrpcRunner
    25  }
    26  
    27  var lRunner langRunner
    28  
    29  var recommendedExtensions = map[string]string{
    30  	"java":   "vscjava.vscode-java-pack",
    31  	"dotnet": "ms-dotnettools.csharp",
    32  	"python": "ms-python.python",
    33  	"ruby":   "rebornix.ruby",
    34  }
    35  
    36  func startRunner() error {
    37  	var err = connectToRunner()
    38  	if err != nil {
    39  		var installMessage = ""
    40  		m, e := manifest.ProjectManifest()
    41  		if e == nil {
    42  			installMessage = fmt.Sprintf(" Install '%s' extension for code insights.", recommendedExtensions[m.Language])
    43  		}
    44  		errStr := "Gauge could not initialize.%s For more information see" +
    45  			"[Problems](command:workbench.actions.view.problems), check logs." +
    46  			"[Troubleshooting](https://docs.gauge.org/troubleshooting.html?language=javascript&ide=vscode#gauge-could-not-initialize-for-more-information-see-problems)"
    47  		return fmt.Errorf(errStr, installMessage)
    48  	}
    49  	return nil
    50  }
    51  
    52  func connectToRunner() error {
    53  	logInfo(nil, "Starting language runner")
    54  	outFile, err := util.OpenFile(logger.ActiveLogFile)
    55  	if err != nil {
    56  		return err
    57  	}
    58  	err = os.Setenv("GAUGE_LSP_GRPC", "true")
    59  	if err != nil {
    60  		return err
    61  	}
    62  	manifest, err := manifest.ProjectManifest()
    63  	if err != nil {
    64  		return err
    65  	}
    66  
    67  	lRunner.runner, err = runner.StartGrpcRunner(manifest, outFile, outFile, config.IdeRequestTimeout(), false)
    68  	return err
    69  }
    70  
    71  func cacheFileOnRunner(uri lsp.DocumentURI, text string, isClosed bool, status gm.CacheFileRequest_FileStatus) error {
    72  	r := &gm.Message{
    73  		MessageType: gm.Message_CacheFileRequest,
    74  		CacheFileRequest: &gm.CacheFileRequest{
    75  			Content:  text,
    76  			FilePath: string(util.ConvertURItoFilePath(uri)),
    77  			IsClosed: false,
    78  			Status:   status,
    79  		},
    80  	}
    81  	_, err := lRunner.runner.ExecuteMessageWithTimeout(r)
    82  	return err
    83  }
    84  
    85  func globPatternRequest() (*gm.ImplementationFileGlobPatternResponse, error) {
    86  	implFileGlobPatternRequest := &gm.Message{MessageType: gm.Message_ImplementationFileGlobPatternRequest, ImplementationFileGlobPatternRequest: &gm.ImplementationFileGlobPatternRequest{}}
    87  	response, err := lRunner.runner.ExecuteMessageWithTimeout(implFileGlobPatternRequest)
    88  	if err != nil {
    89  		return nil, err
    90  	}
    91  	return response.GetImplementationFileGlobPatternResponse(), nil
    92  }
    93  
    94  func getStepPositionResponse(uri lsp.DocumentURI) (*gm.StepPositionsResponse, error) {
    95  	stepPositionsRequest := &gm.Message{MessageType: gm.Message_StepPositionsRequest, StepPositionsRequest: &gm.StepPositionsRequest{FilePath: util.ConvertURItoFilePath(uri)}}
    96  	response, err := lRunner.runner.ExecuteMessageWithTimeout(stepPositionsRequest)
    97  	if err != nil {
    98  		return nil, fmt.Errorf("error while connecting to runner : %s", err)
    99  	}
   100  	if response.GetStepPositionsResponse().GetError() != "" {
   101  		return nil, fmt.Errorf("error while connecting to runner : %s", response.GetStepPositionsResponse().GetError())
   102  	}
   103  	return response.GetStepPositionsResponse(), nil
   104  }
   105  
   106  func getImplementationFileList() (*gm.ImplementationFileListResponse, error) {
   107  	implementationFileListRequest := &gm.Message{MessageType: gm.Message_ImplementationFileListRequest}
   108  	response, err := lRunner.runner.ExecuteMessageWithTimeout(implementationFileListRequest)
   109  	if err != nil {
   110  		return nil, fmt.Errorf("error while connecting to runner : %s", err.Error())
   111  	}
   112  	return response.GetImplementationFileListResponse(), nil
   113  }
   114  
   115  func getStepNameResponse(stepValue string) (*gm.StepNameResponse, error) {
   116  	stepNameRequest := &gm.Message{MessageType: gm.Message_StepNameRequest, StepNameRequest: &gm.StepNameRequest{StepValue: stepValue}}
   117  	response, err := lRunner.runner.ExecuteMessageWithTimeout(stepNameRequest)
   118  	if err != nil {
   119  		return nil, fmt.Errorf("error while connecting to runner : %s", err)
   120  	}
   121  	return response.GetStepNameResponse(), nil
   122  }
   123  
   124  func putStubImplementation(filePath string, codes []string) (*gm.FileDiff, error) {
   125  	stubImplementationCodeRequest := &gm.Message{
   126  		MessageType: gm.Message_StubImplementationCodeRequest,
   127  		StubImplementationCodeRequest: &gm.StubImplementationCodeRequest{
   128  			ImplementationFilePath: filePath,
   129  			Codes:                  codes,
   130  		},
   131  	}
   132  	response, err := lRunner.runner.ExecuteMessageWithTimeout(stubImplementationCodeRequest)
   133  	if err != nil {
   134  		return nil, fmt.Errorf("error while connecting to runner : %s", err.Error())
   135  	}
   136  	return response.GetFileDiff(), nil
   137  }
   138  
   139  func getAllStepsResponse() (*gm.StepNamesResponse, error) {
   140  	getAllStepsRequest := &gm.Message{MessageType: gm.Message_StepNamesRequest, StepNamesRequest: &gm.StepNamesRequest{}}
   141  	response, err := lRunner.runner.ExecuteMessageWithTimeout(getAllStepsRequest)
   142  	if err != nil {
   143  		return nil, fmt.Errorf("error while connecting to runner : %s", err.Error())
   144  	}
   145  	return response.GetStepNamesResponse(), nil
   146  }
   147  
   148  func killRunner() error {
   149  	if lRunner.runner != nil {
   150  		return lRunner.runner.Kill()
   151  	}
   152  	return nil
   153  }
   154  
   155  func getLanguageIdentifier() (string, error) {
   156  	m, err := manifest.ProjectManifest()
   157  	if err != nil {
   158  		return "", err
   159  	}
   160  	info, err := runner.GetRunnerInfo(m.Language)
   161  	if err != nil {
   162  		return "", err
   163  	}
   164  	return info.LspLangId, nil
   165  }