mirror of https://github.com/knative/func.git
				
				
				
			
		
			
				
	
	
		
			91 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| package docker_test
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"strings"
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"knative.dev/func/pkg/docker"
 | |
| 	. "knative.dev/func/pkg/testing"
 | |
| )
 | |
| 
 | |
| // Test that we are starting podman service on behalf of user
 | |
| // if docker daemon is not present.
 | |
| func TestNewDockerClientWithAutomaticPodmanSuccess(t *testing.T) {
 | |
| 
 | |
| 	ctx, cancel := context.WithTimeout(context.Background(), time.Minute*1)
 | |
| 	defer cancel()
 | |
| 
 | |
| 	WithExecutable(t, "podman", mockPodmanSrc)
 | |
| 	t.Setenv("DOCKER_HOST", "")
 | |
| 
 | |
| 	dockerClient, dockerHostToMount, err := docker.NewClient("unix:///var/run/nonexistent.sock")
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	defer dockerClient.Close()
 | |
| 	if !strings.Contains(dockerHostToMount, "func-podman") {
 | |
| 		t.Error("got bad socket to mount")
 | |
| 	}
 | |
| 
 | |
| 	_, err = dockerClient.Ping(ctx)
 | |
| 	if err != nil {
 | |
| 		t.Error(err)
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| func TestNewDockerClientWithAutomaticPodmanFail(t *testing.T) {
 | |
| 	src := `package main;import ("os";"fmt");func main(){fmt.Println("something went wrong");os.Exit(1);}`
 | |
| 
 | |
| 	WithExecutable(t, "podman", src)
 | |
| 	t.Setenv("DOCKER_HOST", "")
 | |
| 
 | |
| 	_, _, err := docker.NewClient("unix:///var/run/nonexistent.sock")
 | |
| 	if err == nil {
 | |
| 		t.Error("expected error but got nil")
 | |
| 		return
 | |
| 	}
 | |
| 	if !strings.Contains(err.Error(), "something went wrong") {
 | |
| 		t.Error("error doesn't contain stdout of the podman command")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Go source code of mock podman implementation.
 | |
| // It just emulates docker /_ping endpoint for all URIs.
 | |
| const mockPodmanSrc = `package main
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"net"
 | |
| 	"net/http"
 | |
| 	"net/url"
 | |
| 	"os"
 | |
| )
 | |
| 
 | |
| func main() {
 | |
| 	dockerHost := os.Args[3]
 | |
| 	u, err := url.Parse(dockerHost)
 | |
| 	if err != nil {
 | |
| 		fmt.Fprintln(os.Stderr, err)
 | |
| 		os.Exit(1)
 | |
| 	}
 | |
| 	sock := u.Path
 | |
| 
 | |
| 	server := http.Server{}
 | |
| 	listener, err := net.Listen("unix", sock)
 | |
| 	if err != nil {
 | |
| 		fmt.Fprintln(os.Stderr, err)
 | |
| 		os.Exit(1)
 | |
| 	}
 | |
| 	// mimics /_ping endpoint
 | |
| 	server.Handler = http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
 | |
| 		writer.Header().Add("Content-Type", "text/plain")
 | |
| 		writer.WriteHeader(200)
 | |
| 		writer.Write([]byte("OK"))
 | |
| 	})
 | |
| 	server.Serve(listener)
 | |
| }
 | |
| `
 |