github.com/schwarzm/garden-linux@v0.0.0-20150507151835-33bca2147c47/integration/lifecycle/lifecycle_suite_test.go (about) 1 package lifecycle_test 2 3 import ( 4 "fmt" 5 "log" 6 "os" 7 "os/exec" 8 "syscall" 9 "testing" 10 11 "github.com/cloudfoundry-incubator/garden" 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 "github.com/onsi/gomega/gexec" 15 "github.com/tedsuo/ifrit" 16 17 "github.com/cloudfoundry-incubator/garden-linux/integration/runner" 18 ) 19 20 var binPath = "../../old/linux_backend/bin" // relative to test suite directory 21 var rootFSPath = os.Getenv("GARDEN_TEST_ROOTFS") 22 var graphPath = os.Getenv("GARDEN_TEST_GRAPHPATH") 23 24 var gardenBin string 25 26 var gardenRunner *runner.Runner 27 var gardenProcess ifrit.Process 28 29 var client garden.Client 30 31 func startGarden(argv ...string) garden.Client { 32 gardenAddr := fmt.Sprintf("/tmp/garden_%d.sock", GinkgoParallelNode()) 33 34 { // Check this test suite is in the correct directory 35 b, err := os.Open(binPath) 36 Expect(err).ToNot(HaveOccurred()) 37 b.Close() 38 } 39 40 gardenRunner = runner.New("unix", gardenAddr, gardenBin, binPath, rootFSPath, graphPath, argv...) 41 42 gardenProcess = ifrit.Invoke(gardenRunner) 43 44 return gardenRunner.NewClient() 45 } 46 47 func restartGarden(argv ...string) { 48 Expect(client.Ping()).To(Succeed(), "tried to restart garden while it was not running") 49 gardenProcess.Signal(syscall.SIGTERM) 50 Eventually(gardenProcess.Wait(), 10).Should(Receive()) 51 52 startGarden(argv...) 53 } 54 55 func ensureGardenRunning() { 56 if err := client.Ping(); err != nil { 57 client = startGarden() 58 } 59 Expect(client.Ping()).ToNot(HaveOccurred()) 60 } 61 62 func TestLifecycle(t *testing.T) { 63 if rootFSPath == "" { 64 log.Println("GARDEN_TEST_ROOTFS undefined; skipping") 65 return 66 } 67 68 SynchronizedBeforeSuite(func() []byte { 69 gardenPath, err := gexec.Build("github.com/cloudfoundry-incubator/garden-linux", "-a", "-race", "-tags", "daemon") 70 Expect(err).ToNot(HaveOccurred()) 71 return []byte(gardenPath) 72 }, func(gardenPath []byte) { 73 gardenBin = string(gardenPath) 74 }) 75 76 AfterEach(func() { 77 ensureGardenRunning() 78 gardenProcess.Signal(syscall.SIGQUIT) 79 Eventually(gardenProcess.Wait(), 10).Should(Receive()) 80 }) 81 82 SynchronizedAfterSuite(func() { 83 //noop 84 }, func() { 85 gexec.CleanupBuildArtifacts() 86 }) 87 88 RegisterFailHandler(Fail) 89 RunSpecs(t, "Lifecycle Suite") 90 } 91 92 func containerIP(ctr garden.Container) string { 93 info, err := ctr.Info() 94 Expect(err).ToNot(HaveOccurred()) 95 return info.ContainerIP 96 } 97 98 func dumpIP() { 99 cmd := exec.Command("ip", "a") 100 op, err := cmd.CombinedOutput() 101 Expect(err).ToNot(HaveOccurred()) 102 fmt.Println("IP status:\n", string(op)) 103 104 cmd = exec.Command("iptables", "--list") 105 op, err = cmd.CombinedOutput() 106 Expect(err).ToNot(HaveOccurred()) 107 fmt.Println("IP tables chains:\n", string(op)) 108 109 cmd = exec.Command("iptables", "--list-rules") 110 op, err = cmd.CombinedOutput() 111 Expect(err).ToNot(HaveOccurred()) 112 fmt.Println("IP tables rules:\n", string(op)) 113 }