blob: 27065aac30c1a28c5df3f468ee4bcdd25ad08de2 [file] [log] [blame]
// Copyright 2019 The Pigweed Authors
//
// Licensed 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
//
// https://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 client implements a gRPC client for a unit test server.
package client
import (
"context"
"errors"
"fmt"
"path/filepath"
"time"
"google.golang.org/grpc"
pb "pigweed.dev/module/pw_test_server/gen"
)
// Client is a gRPC client that communicates with a TestServer service.
type Client struct {
conn *grpc.ClientConn
}
// New creates a gRPC client which connects to a gRPC server hosted at the
// specified address.
func New(host string, port int) (*Client, error) {
// The server currently only supports running locally over an insecure
// connection.
// TODO(frolv): Investigate adding TLS support to the server and client.
opts := []grpc.DialOption{grpc.WithInsecure()}
conn, err := grpc.Dial(fmt.Sprintf("%s:%d", host, port), opts...)
if err != nil {
return nil, err
}
return &Client{conn}, nil
}
// RunTest sends a RunUnitTest RPC to the test server.
func (c *Client) RunTest(path string) error {
abspath, err := filepath.Abs(path)
if err != nil {
return err
}
client := pb.NewTestServerClient(c.conn)
req := &pb.UnitTestDescriptor{FilePath: abspath}
res, err := client.RunUnitTest(context.Background(), req)
if err != nil {
return err
}
fmt.Printf("%s\n", path)
fmt.Printf(
"Queued for %v, ran in %v\n\n",
time.Duration(res.QueueTimeNs),
time.Duration(res.RunTimeNs),
)
fmt.Println(string(res.Output))
if res.Result != pb.TestStatus_SUCCESS {
return errors.New("Unit test failed")
}
return nil
}