youngoli commented on a change in pull request #16214:
URL: https://github.com/apache/beam/pull/16214#discussion_r768320322



##########
File path: sdks/go/pkg/beam/core/runtime/xlangx/expansionx/process.go
##########
@@ -0,0 +1,67 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You 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.
+
+package expansionx
+
+import (
+       "fmt"
+       "os/exec"
+)
+
+// ExpansionServiceRunner is a type that holds information required to
+// start up a Beam Expansion Service JAR and maintain a handle on the
+// process running the service to enable shutdown as well.
+type ExpansionServiceRunner struct {
+       jarPath        string
+       serviceCommand *exec.Cmd
+}
+
+// NewExpansionServiceRunner builds an ExpansionServiceRunner struct for a 
given gradle target and
+// Beam version and returns a pointer to it.
+func NewExpansionServiceRunner(jarPath string) *ExpansionServiceRunner {
+       serviceCommand := exec.Command("java", "-jar", jarPath, "8097")

Review comment:
       Good future improvement: Auto-selecting an open port somehow and saving 
the address. In particular because this can cause errors if something's already 
using port 8097 (the Flink runner, for example, uses that for its own expansion 
service that it starts up).

##########
File path: sdks/go/pkg/beam/core/runtime/xlangx/expansionx/process_test.go
##########
@@ -0,0 +1,73 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You 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.
+
+package expansionx
+
+import (
+       "os"
+       "os/exec"
+       "strings"
+       "testing"
+)
+
+func TestNewExpansionServiceRunner(t *testing.T) {
+       testPath := "path/to/jar"
+       serviceRunner := NewExpansionServiceRunner(testPath)
+       if serviceRunner.jarPath != testPath {
+               t.Errorf("JAR path mismatch: wanted %v, got %v", testPath, 
serviceRunner.jarPath)
+       }
+       commandString := strings.Join(serviceRunner.serviceCommand.Args, " ")
+       expCommandString := "java -jar " + testPath + " 8097"
+       if commandString != expCommandString {
+               t.Errorf("command mismatch: wanted %v, got %v", 
expCommandString, commandString)
+       }
+}
+
+func TestStartService_badCommand(t *testing.T) {
+       serviceRunner := NewExpansionServiceRunner("")
+       serviceRunner.serviceCommand = exec.Command("jahva", "-jar")
+       err := serviceRunner.StartService()
+       if err == nil {
+               t.Error("StartService succeeded when it should have failed")
+       }
+}
+
+func TestStartService_good(t *testing.T) {
+       testPath := "path/to/jar"
+       serviceRunner := NewExpansionServiceRunner(testPath)
+       serviceRunner.serviceCommand = exec.Command("which", "go")

Review comment:
       A suggestion in case you want to test these without using actual 
commands: Create an interface that's fulfilled by exec.Cmd containing the 
methods you need to use. That way you can create a mock version of that 
interface for testing purposes, just to make sure it gets properly started and 
stopped.
   
   That seems like a bit too much work for this relatively bare-bones class at 
the moment. But if your code starts to get more complex and you need a way to 
test it, that's what I would recommend.

##########
File path: sdks/go/pkg/beam/core/runtime/xlangx/expansionx/process_test.go
##########
@@ -0,0 +1,73 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You 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.
+
+package expansionx
+
+import (
+       "os"
+       "os/exec"
+       "strings"
+       "testing"
+)
+
+func TestNewExpansionServiceRunner(t *testing.T) {
+       testPath := "path/to/jar"
+       serviceRunner := NewExpansionServiceRunner(testPath)
+       if serviceRunner.jarPath != testPath {
+               t.Errorf("JAR path mismatch: wanted %v, got %v", testPath, 
serviceRunner.jarPath)
+       }
+       commandString := strings.Join(serviceRunner.serviceCommand.Args, " ")
+       expCommandString := "java -jar " + testPath + " 8097"

Review comment:
       This seems like a bit of a brittle test. It might be better to test that 
the command string contains "java" and "-jar testPath", because those seem like 
mandatory parts of the command no matter what port you use, or how you modify 
the command.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to