github.com/iron-io/functions@v0.0.0-20180820112432-d59d7d1c40b2/api/datastore/redis/redis_test.go (about)

     1  package redis
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"log"
     7  	"net/url"
     8  	"os/exec"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/garyburd/redigo/redis"
    13  	"github.com/iron-io/functions/api/datastore/internal/datastoretest"
    14  )
    15  
    16  const tmpRedis = "redis://%v:6301/"
    17  
    18  func prepareRedisTest(logf, fatalf func(string, ...interface{})) (func(), func()) {
    19  	fmt.Println("initializing redis for test")
    20  	tryRun(logf, "remove old redis container", exec.Command("docker", "rm", "-f", "iron-redis-test"))
    21  	mustRun(fatalf, "start redis container", exec.Command("docker", "run", "--name", "iron-redis-test", "-p", "6301:6379", "-d", "redis"))
    22  	timeout := time.After(20 * time.Second)
    23  
    24  	for {
    25  		c, err := redis.DialURL(fmt.Sprintf(tmpRedis, datastoretest.GetContainerHostIP()))
    26  		if err == nil {
    27  			_, err = c.Do("PING")
    28  			c.Close()
    29  			if err == nil {
    30  				break
    31  			}
    32  		}
    33  		fmt.Println("failed to PING redis:", err)
    34  		select {
    35  		case <-timeout:
    36  			log.Fatal("timed out waiting for redis")
    37  		case <-time.After(500 * time.Millisecond):
    38  			continue
    39  		}
    40  	}
    41  	fmt.Println("redis for test ready")
    42  	return func() {},
    43  		func() {
    44  			tryRun(logf, "stop redis container", exec.Command("docker", "rm", "-f", "iron-redis-test"))
    45  		}
    46  }
    47  
    48  func TestDatastore(t *testing.T) {
    49  	_, close := prepareRedisTest(t.Logf, t.Fatalf)
    50  	defer close()
    51  
    52  	u, err := url.Parse(fmt.Sprintf(tmpRedis, datastoretest.GetContainerHostIP()))
    53  	if err != nil {
    54  		t.Fatal("failed to parse url: ", err)
    55  	}
    56  	ds, err := New(u)
    57  	if err != nil {
    58  		t.Fatal("failed to create redis datastore:", err)
    59  	}
    60  
    61  	datastoretest.Test(t, ds)
    62  }
    63  
    64  func tryRun(logf func(string, ...interface{}), desc string, cmd *exec.Cmd) {
    65  	var b bytes.Buffer
    66  	cmd.Stderr = &b
    67  	if err := cmd.Run(); err != nil {
    68  		logf("failed to %s: %s", desc, b.String())
    69  	}
    70  }
    71  
    72  func mustRun(fatalf func(string, ...interface{}), desc string, cmd *exec.Cmd) {
    73  	var b bytes.Buffer
    74  	cmd.Stderr = &b
    75  	if err := cmd.Run(); err != nil {
    76  		fatalf("failed to %s: %s", desc, b.String())
    77  	}
    78  }