github.com/huiliang/nomad@v0.2.1-0.20151124023127-7a8b664699ff/client/driver/java_test.go (about) 1 package driver 2 3 import ( 4 "os/exec" 5 "testing" 6 "time" 7 8 "github.com/hashicorp/nomad/client/config" 9 "github.com/hashicorp/nomad/nomad/structs" 10 11 ctestutils "github.com/hashicorp/nomad/client/testutil" 12 ) 13 14 // javaLocated checks whether java is installed so we can run java stuff. 15 func javaLocated() bool { 16 _, err := exec.Command("java", "-version").CombinedOutput() 17 return err == nil 18 } 19 20 // The fingerprinter test should always pass, even if Java is not installed. 21 func TestJavaDriver_Fingerprint(t *testing.T) { 22 ctestutils.JavaCompatible(t) 23 d := NewJavaDriver(testDriverContext("")) 24 node := &structs.Node{ 25 Attributes: make(map[string]string), 26 } 27 apply, err := d.Fingerprint(&config.Config{}, node) 28 if err != nil { 29 t.Fatalf("err: %v", err) 30 } 31 if apply != javaLocated() { 32 t.Fatalf("Fingerprinter should detect Java when it is installed") 33 } 34 if node.Attributes["driver.java"] != "1" { 35 t.Fatalf("missing driver") 36 } 37 for _, key := range []string{"driver.java.version", "driver.java.runtime", "driver.java.vm"} { 38 if node.Attributes[key] == "" { 39 t.Fatalf("missing driver key (%s)", key) 40 } 41 } 42 } 43 44 func TestJavaDriver_StartOpen_Wait(t *testing.T) { 45 if !javaLocated() { 46 t.Skip("Java not found; skipping") 47 } 48 49 ctestutils.JavaCompatible(t) 50 task := &structs.Task{ 51 Name: "demo-app", 52 Config: map[string]interface{}{ 53 "artifact_source": "https://dl.dropboxusercontent.com/u/47675/jar_thing/demoapp.jar", 54 "jvm_options": []string{"-Xmx64m", "-Xms32m"}, 55 "checksum": "sha256:58d6e8130308d32e197c5108edd4f56ddf1417408f743097c2e662df0f0b17c8", 56 }, 57 Resources: basicResources, 58 } 59 60 driverCtx := testDriverContext(task.Name) 61 ctx := testDriverExecContext(task, driverCtx) 62 defer ctx.AllocDir.Destroy() 63 d := NewJavaDriver(driverCtx) 64 65 handle, err := d.Start(ctx, task) 66 if err != nil { 67 t.Fatalf("err: %v", err) 68 } 69 if handle == nil { 70 t.Fatalf("missing handle") 71 } 72 73 // Attempt to open 74 handle2, err := d.Open(ctx, handle.ID()) 75 if err != nil { 76 t.Fatalf("err: %v", err) 77 } 78 if handle2 == nil { 79 t.Fatalf("missing handle") 80 } 81 82 time.Sleep(2 * time.Second) 83 // need to kill long lived process 84 err = handle.Kill() 85 if err != nil { 86 t.Fatalf("Error: %s", err) 87 } 88 } 89 90 func TestJavaDriver_Start_Wait(t *testing.T) { 91 if !javaLocated() { 92 t.Skip("Java not found; skipping") 93 } 94 95 ctestutils.JavaCompatible(t) 96 task := &structs.Task{ 97 Name: "demo-app", 98 Config: map[string]interface{}{ 99 "artifact_source": "https://dl.dropboxusercontent.com/u/47675/jar_thing/demoapp.jar", 100 "checksum": "sha256:58d6e8130308d32e197c5108edd4f56ddf1417408f743097c2e662df0f0b17c8", 101 }, 102 Resources: basicResources, 103 } 104 105 driverCtx := testDriverContext(task.Name) 106 ctx := testDriverExecContext(task, driverCtx) 107 defer ctx.AllocDir.Destroy() 108 d := NewJavaDriver(driverCtx) 109 110 handle, err := d.Start(ctx, task) 111 if err != nil { 112 t.Fatalf("err: %v", err) 113 } 114 if handle == nil { 115 t.Fatalf("missing handle") 116 } 117 118 // Task should terminate quickly 119 select { 120 case res := <-handle.WaitCh(): 121 if !res.Successful() { 122 t.Fatalf("err: %v", res) 123 } 124 case <-time.After(2 * time.Second): 125 // expect the timeout b/c it's a long lived process 126 break 127 } 128 129 // need to kill long lived process 130 err = handle.Kill() 131 if err != nil { 132 t.Fatalf("Error: %s", err) 133 } 134 } 135 136 func TestJavaDriver_Start_Kill_Wait(t *testing.T) { 137 if !javaLocated() { 138 t.Skip("Java not found; skipping") 139 } 140 141 ctestutils.JavaCompatible(t) 142 task := &structs.Task{ 143 Name: "demo-app", 144 Config: map[string]interface{}{ 145 "artifact_source": "https://dl.dropboxusercontent.com/u/47675/jar_thing/demoapp.jar", 146 }, 147 Resources: basicResources, 148 } 149 150 driverCtx := testDriverContext(task.Name) 151 ctx := testDriverExecContext(task, driverCtx) 152 defer ctx.AllocDir.Destroy() 153 d := NewJavaDriver(driverCtx) 154 155 handle, err := d.Start(ctx, task) 156 if err != nil { 157 t.Fatalf("err: %v", err) 158 } 159 if handle == nil { 160 t.Fatalf("missing handle") 161 } 162 163 go func() { 164 time.Sleep(100 * time.Millisecond) 165 err := handle.Kill() 166 if err != nil { 167 t.Fatalf("err: %v", err) 168 } 169 }() 170 171 // Task should terminate quickly 172 select { 173 case res := <-handle.WaitCh(): 174 if res.Successful() { 175 t.Fatal("should err") 176 } 177 case <-time.After(8 * time.Second): 178 t.Fatalf("timeout") 179 } 180 181 // need to kill long lived process 182 err = handle.Kill() 183 if err != nil { 184 t.Fatalf("Error: %s", err) 185 } 186 }