| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| package testsharder_test |
| |
| import ( |
| "fmt" |
| "reflect" |
| "testing" |
| |
| "fuchsia.googlesource.com/tools/testsharder" |
| ) |
| |
| // Note that just printing a list of shard pointers will print a list of memory addresses, |
| // which would make for an unhelpful error message. |
| func assertEqual(t *testing.T, expected, actual []*testsharder.Shard) { |
| if !reflect.DeepEqual(expected, actual) { |
| errMsg := "expected:\n" |
| for _, shard := range expected { |
| errMsg += fmt.Sprintf("%+v,\n", shard) |
| } |
| errMsg += "actual:\n" |
| for _, shard := range actual { |
| errMsg += fmt.Sprintf("%+v,\n", shard) |
| } |
| t.Fatalf(errMsg) |
| } |
| } |
| |
| func TestMakeShards(t *testing.T) { |
| test1 := testsharder.Test{ |
| Location: "/path/to/binary", |
| } |
| test2 := testsharder.Test{ |
| Location: "/path/to/binary2", |
| } |
| env1 := testsharder.Environment{ |
| Dimensions: testsharder.DimensionSet{DeviceType: "QEMU"}, |
| } |
| env2 := testsharder.Environment{ |
| Dimensions: testsharder.DimensionSet{DeviceType: "NUC"}, |
| } |
| env3 := testsharder.Environment{ |
| Dimensions: testsharder.DimensionSet{DeviceType: "NUC"}, |
| Label: "LABEL", |
| } |
| spec1 := testsharder.TestSpec{ |
| Test: test1, |
| Envs: []testsharder.Environment{env1}, |
| } |
| spec2 := testsharder.TestSpec{ |
| Test: test1, |
| Envs: []testsharder.Environment{env1}, |
| } |
| spec3 := testsharder.TestSpec{ |
| Test: test2, |
| Envs: []testsharder.Environment{env1, env2}, |
| } |
| spec4 := testsharder.TestSpec{ |
| Test: test2, |
| Envs: []testsharder.Environment{env1, env2, env3}, |
| } |
| t.Run("Ensure that environments have names", func(t *testing.T) { |
| // This will in turn ensure that the associated shards too have |
| // names. |
| if env1.Name() == "" { |
| t.Fatalf("Environment\n%+v\n has an empty name", env1) |
| } |
| if env2.Name() == "" { |
| t.Fatalf("Environment\n%+v\n has an empty name", env2) |
| } |
| }) |
| |
| t.Run("Ensure env shared", func(t *testing.T) { |
| actual := testsharder.MakeShards([]testsharder.TestSpec{spec1, spec2, spec3}, "") |
| expected := []*testsharder.Shard{ |
| // Ensure that the order of the shards is the order in which their |
| // corresponding environments appear in the input. This is the simplest |
| // deterministic order we can produce for the shards. |
| { |
| Name: env1.Name(), |
| // Ensure that we actually specify the test _twice_, that is, don't |
| // necessarily deduplicate tests for a shared environment. |
| Tests: []testsharder.Test{test1, test1, test2}, |
| Env: env1, |
| }, |
| { |
| Name: env2.Name(), |
| Tests: []testsharder.Test{test2}, |
| Env: env2, |
| }, |
| } |
| assertEqual(t, expected, actual) |
| }) |
| |
| t.Run("Ensure label respected", func(t *testing.T) { |
| actual := testsharder.MakeShards([]testsharder.TestSpec{spec1, spec2, spec3, spec4}, env3.Label) |
| expected := []*testsharder.Shard{ |
| { |
| Name: env3.Name(), |
| Tests: []testsharder.Test{test2}, |
| Env: env3, |
| }, |
| } |
| assertEqual(t, expected, actual) |
| }) |
| } |