| package dynamicdiff |
| |
| import ( |
| "image" |
| "image/color" |
| "os" |
| "path/filepath" |
| "strings" |
| "testing" |
| |
| assert "github.com/stretchr/testify/require" |
| "go.skia.org/infra/go/fileutil" |
| "go.skia.org/infra/go/testutils" |
| "go.skia.org/infra/golden/go/diffstore" |
| "go.skia.org/infra/golden/go/mocks" |
| ) |
| |
| const ( |
| // Test image IDs for PixelDiffIDPathMapper. |
| TEST_PIXEL_DIFF_LEFT = "lchoi-20170714123456/nopatch/1/http___www_google_com" |
| TEST_PIXEL_DIFF_RIGHT = "lchoi-20170714123456/withpatch/1/http___www_google_com" |
| |
| // PNG extension. |
| DOT_EXT = ".png" |
| |
| // Directory with testdata. |
| TEST_DATA_BASE_DIR = "./testdata" |
| |
| // Bucket to test loading images through a GS path. |
| TEST_GS_BUCKET = "cluster-telemetry" |
| |
| // Directory to test loading images through a GS path. |
| TEST_GS_BASE_DIR = "tasks/pixel_diff_runs" |
| |
| // Image to test loading images through a GS path. |
| TEST_IMG_PATH = "lchoi-20170804012953/nopatch/1/http___www_google_com" |
| ) |
| |
| func TestIsDynamicContentPixel(t *testing.T) { |
| testutils.SmallTest(t) |
| assert.True(t, isDynamicContentPixel(0, 255, 255)) |
| assert.False(t, isDynamicContentPixel(128, 128, 128)) |
| } |
| |
| func TestDeltaOffset(t *testing.T) { |
| testutils.SmallTest(t) |
| assert.Equal(t, 6, deltaOffset(765)) |
| assert.Equal(t, 2, deltaOffset(256)) |
| assert.Equal(t, 0, deltaOffset(1)) |
| } |
| |
| func TestDynamicContentDiff(t *testing.T) { |
| testutils.SmallTest(t) |
| |
| left := image.NewNRGBA(image.Rect(0, 0, 2, 2)) |
| left.SetNRGBA(0, 0, color.NRGBA{0, 255, 255, 255}) |
| left.SetNRGBA(0, 1, color.NRGBA{7, 7, 7, 255}) |
| |
| right := image.NewNRGBA(image.Rect(0, 0, 2, 2)) |
| right.SetNRGBA(0, 1, color.NRGBA{7, 7, 7, 255}) |
| right.SetNRGBA(1, 0, color.NRGBA{128, 128, 128, 255}) |
| right.SetNRGBA(1, 1, color.NRGBA{0, 255, 255, 255}) |
| |
| // Calculate the diff. Only two pixels are not cyan and out of those, only one |
| // is different. |
| diffMetrics, diffImg := DynamicContentDiff(left, right) |
| |
| // Verify the diff image is correct. |
| expectedImg := image.NewNRGBA(image.Rect(0, 0, 2, 2)) |
| expectedImg.SetNRGBA(0, 0, color.NRGBA{0, 255, 255, 255}) |
| expectedImg.SetNRGBA(1, 0, color.NRGBA{241, 105, 19, 255}) |
| expectedImg.SetNRGBA(1, 1, color.NRGBA{0, 255, 255, 255}) |
| assert.Equal(t, expectedImg, diffImg) |
| |
| // Verify the diff metrics are correct. |
| expectedDiffMetrics := &DynamicDiffMetrics{ |
| NumDiffPixels: 1, |
| PixelDiffPercent: 50, |
| MaxRGBDiffs: []int{128, 128, 128}, |
| NumStaticPixels: 2, |
| NumDynamicPixels: 2, |
| } |
| assert.Equal(t, expectedDiffMetrics, diffMetrics) |
| } |
| |
| func TestPixelDiffStoreMapper(t *testing.T) { |
| testutils.SmallTest(t) |
| |
| mapper := PixelDiffStoreMapper{} |
| dirs := strings.Split(TEST_PIXEL_DIFF_LEFT, "/") |
| |
| // Test DiffID and SplitDiffID |
| expectedDiffID := strings.Join([]string{dirs[0], dirs[2], dirs[3]}, ":") |
| actualDiffID := mapper.DiffID(TEST_PIXEL_DIFF_LEFT, TEST_PIXEL_DIFF_RIGHT) |
| actualLeft, actualRight := mapper.SplitDiffID(expectedDiffID) |
| assert.Equal(t, expectedDiffID, actualDiffID) |
| assert.Equal(t, TEST_PIXEL_DIFF_LEFT, actualLeft) |
| assert.Equal(t, TEST_PIXEL_DIFF_RIGHT, actualRight) |
| |
| // Test DiffPath |
| expectedDiffPath := dirs[0] + "/" + dirs[3] + DOT_EXT |
| actualDiffPath := mapper.DiffPath(TEST_PIXEL_DIFF_LEFT, TEST_PIXEL_DIFF_RIGHT) |
| assert.Equal(t, expectedDiffPath, actualDiffPath) |
| |
| // Test ImagePaths |
| expectedLocalPath := TEST_PIXEL_DIFF_LEFT + DOT_EXT |
| runID := strings.Split(dirs[0], "-") |
| timeStamp := runID[1] |
| // YYYY/MM/DD/HH directories |
| datePath := filepath.Join(timeStamp[0:4], timeStamp[4:6], timeStamp[6:8], timeStamp[8:10]) |
| expectedGSPath := filepath.Join(datePath, expectedLocalPath) |
| localPath, gsBucket, gsPath := mapper.ImagePaths(TEST_PIXEL_DIFF_LEFT) |
| assert.Equal(t, expectedLocalPath, localPath) |
| assert.Equal(t, expectedGSPath, gsPath) |
| assert.Equal(t, "", gsBucket) |
| |
| // Test IsValidDiffImgID |
| // Trim the image extension first |
| expectedDiffImgID := expectedDiffPath[:len(expectedDiffPath)-len(DOT_EXT)] |
| assert.True(t, mapper.IsValidDiffImgID(expectedDiffImgID)) |
| |
| // Test IsValidImgID |
| assert.True(t, mapper.IsValidImgID(TEST_PIXEL_DIFF_LEFT)) |
| assert.True(t, mapper.IsValidImgID(TEST_PIXEL_DIFF_RIGHT)) |
| } |
| |
| // Tests loading GS images that are specified through a path. |
| func TestImageLoaderGetGSPath(t *testing.T) { |
| testutils.MediumTest(t) |
| |
| baseDir := TEST_DATA_BASE_DIR + "-imgloader" |
| defer testutils.RemoveAll(t, baseDir) |
| |
| assert.NoError(t, os.MkdirAll(baseDir, 0777)) |
| client := mocks.GetHTTPClient(t) |
| |
| workingDir := filepath.Join(baseDir, "images") |
| assert.Nil(t, os.Mkdir(workingDir, 0777)) |
| |
| gsBuckets := []string{TEST_GS_BUCKET} |
| |
| mapper := PixelDiffStoreMapper{} |
| imgLoader, err := diffstore.NewImgLoader(client, baseDir, workingDir, gsBuckets, TEST_GS_BASE_DIR, 0, mapper) |
| assert.NoError(t, err) |
| |
| // Get the images and wait until they are written to disk |
| _, pendingWrites, err := imgLoader.Get(1, []string{TEST_IMG_PATH}) |
| assert.NoError(t, err) |
| pendingWrites.Wait() |
| |
| assert.NoError(t, err) |
| assert.True(t, fileutil.FileExists(filepath.Join(workingDir, TEST_IMG_PATH+DOT_EXT))) |
| } |