func TestParseComposeForVersion1WithEnvFile(t *testing.T) {
	envKey := "rails_env"
	envValue := "development"
	envContents := []byte(envKey + "=" + envValue)

	envFile, err := ioutil.TempFile("", "example")
	if err != nil {
		t.Fatal("Error creating tmp file:", err)
	}
	defer os.Remove(envFile.Name()) // clean up
	if _, err := envFile.Write(envContents); err != nil {
		t.Fatal("Error writing to tmp file:", err)
	}

	webImage := "webapp"

	composeFileString := `web:
  image: webapp
  env_file:
  - ` + envFile.Name()

	// setup project and parse
	composeBytes := [][]byte{}
	composeBytes = append(composeBytes, []byte(composeFileString))
	project := setupTestProject(t)
	project.context.ComposeBytes = composeBytes

	if err := project.parseCompose(); err != nil {
		t.Fatalf("Unexpected error parsing the compose string [%s]", composeFileString, err)
	}

	configs := project.ServiceConfigs()

	// verify wordpress ServiceConfig
	web, ok := configs.Get("web")
	if web == nil || !ok || web.Image != webImage {
		t.Fatalf("Expected [%s] as a service with image [%s] but got configs [%v]", "redis", webImage, configs)
	}

	// skips the second one if envKey2
	if web.Environment == nil || len(web.Environment) != 1 {
		t.Fatalf("Expected non empty Environment, but was [%v]", web.Environment)
	}
	if string(envContents) != web.Environment[0] {
		t.Errorf("Expected env [%s]=[%s] But was [%v]", envKey, envValue, web.Environment)
	}
}
func TestParseComposeForVersion2Files(t *testing.T) {
	wordpressImage := "wordpress"
	mysqlImage := "mysql"
	ports := []string{"80:80"}

	composeFileString := `version: '2'
services:
  wordpress:
    image: wordpress
    ports: ["80:80"]
  mysql:
    image: mysql`

	// setup project and parse
	composeBytes := [][]byte{}
	composeBytes = append(composeBytes, []byte(composeFileString))
	project := setupTestProject(t)
	project.context.ComposeBytes = composeBytes

	if err := project.parseCompose(); err != nil {
		t.Fatalf("Unexpected error parsing the compose string [%s]", composeFileString, err)
	}

	configs := project.ServiceConfigs()

	// verify wordpress ServiceConfig
	wordpress, ok := configs.Get("wordpress")
	if wordpress == nil || !ok || wordpress.Image != wordpressImage {
		t.Fatalf("Expected [%s] as a service with image [%s] but got configs [%v]", "redis", wordpressImage, configs)
	}
	if !reflect.DeepEqual(ports, wordpress.Ports) {
		t.Errorf("Expected ports to be [%v] but got [%v]", ports, wordpress.Ports)
	}

	// verify mysql ServiceConfig
	mysql, ok := configs.Get("mysql")
	if mysql == nil || !ok || mysql.Image != mysqlImage {
		t.Fatalf("Expected [%s] as a service with image [%s] but got configs [%v]", "redis", mysqlImage, configs)
	}
}
func TestParseComposeForVersion1Files(t *testing.T) {
	// test data
	redisImage := "redis"
	cpuShares := int64(73)
	command := []string{"bundle exec thin -p 3000"}
	dnsServers := []string{"1.2.3.4"}
	dnsSearchDomains := []string{"search.example.com"}
	entryPoint := "/code/entrypoint.sh"
	env := []string{"RACK_ENV=development", "SESSION_PORT=session_port"}
	extraHosts := []string{"test.local:127.10.10.10"}
	hostname := "foobarbaz"
	labels := map[string]string{
		"label1":         "",
		"com.foo.label2": "value",
	}
	links := []string{"redis:redis"}
	logDriver := "json-file"
	logOpts := map[string]string{
		"max-file": "50",
		"max-size": "50k",
	}
	memLimit := int64(1000000000)
	ports := []string{"5000:5000", "127.0.0.1:8001:8001"}
	privileged := true
	readonly := true
	securityOpts := []string{"label:type:test_virt"}
	user := "******"
	volume := yaml.Volume{Destination: "./code"}
	volumes := yaml.Volumes{Volumes: []*yaml.Volume{&volume}}
	workingDir := "/var"

	composeFileString := `web:
  cpu_shares: 73
  command:
   - bundle exec thin -p 3000
  dns:
   - 1.2.3.4
  dns_search: search.example.com
  entrypoint: /code/entrypoint.sh
  environment:
    RACK_ENV: development
    SESSION_PORT: session_port
  extra_hosts:
   - test.local:127.10.10.10
  hostname: "foobarbaz"
  image: web
  labels:
   - label1
   - com.foo.label2=value
  links:
   - "redis:redis"
  log_driver: json-file
  log_opt:
    max-file: 50
    max-size: 50k
  mem_limit: 1000000000
  ports:
   - '5000:5000'
   - "127.0.0.1:8001:8001"
  privileged: true
  read_only: true
  security_opt:
   - label:type:test_virt
  ulimits:
    nofile: 1024
  user: user
  volumes:
   - ./code
  working_dir: /var
redis:
  image: redis`

	// setup project and parse
	composeBytes := [][]byte{}
	composeBytes = append(composeBytes, []byte(composeFileString))
	project := setupTestProject(t)
	project.context.ComposeBytes = composeBytes

	if err := project.parseCompose(); err != nil {
		t.Fatalf("Unexpected error parsing the compose string [%s]", composeFileString, err)
	}

	if testProjectName != project.context.ProjectName {
		t.Errorf("ProjectName not overriden. Expected [%s] Got [%s]", testProjectName, project.context.ProjectName)
	}

	configs := project.ServiceConfigs()
	// verify redis ServiceConfig
	redis, _ := configs.Get("redis")
	if redis == nil || redis.Image != redisImage {
		t.Fatalf("Expected [%s] as a service with image [%s] but got configs [%v]", "redis", redisImage, configs)
	}

	// verify web ServiceConfig
	web, _ := configs.Get("web")
	if web == nil {
		t.Fatalf("Expected [%s] as a service but got configs [%v]", "web", configs)
	}
	if cpuShares != int64(web.CPUShares) {
		t.Errorf("Expected cpuShares to be [%s] but got [%s]", cpuShares, web.CPUShares)
	}
	if len(web.Command) != 1 || !reflect.DeepEqual(command[0], web.Command[0]) {
		t.Errorf("Expected command to be [%v] but got [%v]", command, web.Command)
	}
	if len(web.DNS) != 1 || !reflect.DeepEqual(dnsServers[0], web.DNS[0]) {
		t.Errorf("Expected dns to be [%v] but got [%v]", dnsServers, web.DNS)
	}
	if len(web.DNSSearch) != 1 || !reflect.DeepEqual(dnsSearchDomains[0], web.DNSSearch[0]) {
		t.Errorf("Expected dns search to be [%v] but got [%v]", dnsSearchDomains, web.DNSSearch)
	}
	if len(web.Entrypoint) != 1 || entryPoint != web.Entrypoint[0] {
		t.Errorf("Expected entryPoint to be [%s] but got [%s]", entryPoint, web.Entrypoint)
	}

	sort.Strings(env)
	webEnv := []string{}
	for _, val := range web.Environment {
		webEnv = append(webEnv, val)
	}
	sort.Strings(webEnv)
	if !reflect.DeepEqual(env, webEnv) {
		t.Errorf("Expected Environment to be [%v] but got [%v]", env, webEnv)
	}
	if !reflect.DeepEqual(extraHosts, web.ExtraHosts) {
		t.Errorf("Expected extraHosts to be [%v] but got [%v]", extraHosts, web.ExtraHosts)
	}
	if hostname != web.Hostname {
		t.Errorf("Expected Hostname to be [%s] but got [%s]", hostname, web.Hostname)
	}
	if len(labels) != len(web.Labels) ||
		labels["label1"] != web.Labels["label1"] || labels["com.foo.label2"] != web.Labels["com.foo.label2"] {
		t.Errorf("Expected labels to be [%v] but got [%v]", labels, web.Labels)
	}
	if len(web.Links) != 1 || !reflect.DeepEqual(links[0], web.Links[0]) {
		t.Errorf("Expected links to be [%v] but got [%v]", links, web.Links)
	}
	if logDriver != web.Logging.Driver {
		t.Errorf("Expected logDriver to be [%s] but got [%s]", logDriver, web.Logging.Driver)
	}
	if !reflect.DeepEqual(logOpts, web.Logging.Options) {
		t.Errorf("Expected logOpts to be [%v] but got [%v]", logOpts, web.Logging.Options)
	}
	if memLimit != int64(web.MemLimit) {
		t.Errorf("Expected memLimit to be [%s] but got [%s]", memLimit, web.MemLimit)
	}
	if !reflect.DeepEqual(ports, web.Ports) {
		t.Errorf("Expected ports to be [%v] but got [%v]", ports, web.Ports)
	}
	if privileged != web.Privileged {
		t.Errorf("Expected privileged to be [%s] but got [%s]", privileged, web.Privileged)
	}
	if readonly != web.ReadOnly {
		t.Errorf("Expected readonly to be [%s] but got [%s]", readonly, web.ReadOnly)
	}
	if !reflect.DeepEqual(securityOpts, web.SecurityOpt) {
		t.Errorf("Expected securityOpts to be [%v] but got [%v]", securityOpts, web.SecurityOpt)
	}
	if user != web.User {
		t.Errorf("Expected user to be [%s] but got [%s]", user, web.User)
	}
	if len(volumes.Volumes) != len(web.Volumes.Volumes) {
		t.Errorf("Expected len of volumes to be [%d] but got [%d]", len(volumes.Volumes), len(web.Volumes.Volumes))
	}
	if !reflect.DeepEqual(*volumes.Volumes[0], *web.Volumes.Volumes[0]) {
		t.Errorf("Expected volumes to be [%v] but got [%v]", volumes.Volumes[0], web.Volumes.Volumes[0])
	}
	if workingDir != web.WorkingDir {
		t.Errorf("Expected workingDir to be [%s] but got [%s]", user, web.WorkingDir)
	}

}