blob: b971f33333aa86b2766415ddb7e1acd3023ba855 [file] [log] [blame]
// Copyright 2017 The Goma 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 descriptor
import (
"reflect"
"testing"
pb "go.chromium.org/goma/server/proto/command"
)
func TestRelocateCmd(t *testing.T) {
// Real example from chromium linux.
cs := &pb.CmdDescriptor_Setup{
CmdFile: &pb.FileSpec{
Path: "bin/clang",
Size: 86885440,
Hash: "daacc7bcef72015968bfdda381b8ac27fe735d125314ed17d8320dbda89d7be3",
IsExecutable: true,
},
CmdDir: "/var/opt/chromium_clang_linux/third_party/llvm-build/Release+Asserts",
Files: []*pb.FileSpec{
{
Path: "/usr/bin/as",
Size: 356952,
Hash: "ffc7f9fee274e30e308577761adc5fe97b2b22403874500a4c9f26517755ec33",
IsExecutable: true,
},
{
Path: "/usr/bin/objcopy",
Size: 220128,
Hash: "e6ddd34643b436bfe1754f2719ac8ec17ff15497091db592e1b4e335f3653291",
IsExecutable: true,
},
{
Path: "/usr/bin/ld",
Symlink: "ld.bfd",
},
{
Path: "/usr/bin/ld.bfd",
Size: 1050912,
Hash: "850873e6c4def272aea40f906df43bcb5ad6a7343593dde2dcb89e1a0e4cd6f4",
IsExecutable: true,
},
{
Path: "/usr/bin/nm",
Size: 40704,
Hash: "9119a26b9dffd94cf2f87f10ff0baef81f0912a84a920f5f3441b3cfaf59ff2b",
IsExecutable: true,
},
{
Path: "/usr/bin/strip",
Size: 220128,
Hash: "86aa93fd3010abe601c179a4600acbd348b13d76c66f861591c4d9c615687264",
IsExecutable: true,
},
},
PathType: pb.CmdDescriptor_POSIX,
}
subprogSetups := map[string]*pb.CmdDescriptor_Setup{
"/home/goma/work/chrome/src/out/Release/../../third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so": {
CmdFile: &pb.FileSpec{
Path: "lib/libFindBadConstructs.so",
Size: 521748,
Hash: "1c5e11d7975e49ab4396570f54f13d71685005a18593be29bf462b51f45954f6",
IsExecutable: true,
},
CmdDir: "/var/opt/chromium_clang_linux/third_party/llvm-build/Release+Asserts",
PathType: pb.CmdDescriptor_POSIX,
},
}
const reqCmdPath = "/home/goma/work/chrome/src/third_party/llvm-build/Release+Asserts/bin/clang++"
cmdFiles, err := RelocateCmd(reqCmdPath, cs, subprogSetups)
if err != nil {
t.Errorf("RelocateCmd(%q, %q, %q)=_, _, %v; want nil-error", reqCmdPath, cs, subprogSetups, err)
}
want := []*pb.FileSpec{
{
Path: "/home/goma/work/chrome/src/third_party/llvm-build/Release+Asserts/bin/clang++",
Size: 86885440,
Hash: "daacc7bcef72015968bfdda381b8ac27fe735d125314ed17d8320dbda89d7be3",
IsExecutable: true,
},
{
Path: "/usr/bin/as",
Size: 356952,
Hash: "ffc7f9fee274e30e308577761adc5fe97b2b22403874500a4c9f26517755ec33",
IsExecutable: true,
},
{
Path: "/usr/bin/objcopy",
Size: 220128,
Hash: "e6ddd34643b436bfe1754f2719ac8ec17ff15497091db592e1b4e335f3653291",
IsExecutable: true,
},
{
Path: "/usr/bin/ld",
Symlink: "ld.bfd",
},
{
Path: "/usr/bin/ld.bfd",
Size: 1050912,
Hash: "850873e6c4def272aea40f906df43bcb5ad6a7343593dde2dcb89e1a0e4cd6f4",
IsExecutable: true,
},
{
Path: "/usr/bin/nm",
Size: 40704,
Hash: "9119a26b9dffd94cf2f87f10ff0baef81f0912a84a920f5f3441b3cfaf59ff2b",
IsExecutable: true,
},
{
Path: "/usr/bin/strip",
Size: 220128,
Hash: "86aa93fd3010abe601c179a4600acbd348b13d76c66f861591c4d9c615687264",
IsExecutable: true,
},
{
Path: "/home/goma/work/chrome/src/out/Release/../../third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so",
Size: 521748,
Hash: "1c5e11d7975e49ab4396570f54f13d71685005a18593be29bf462b51f45954f6",
IsExecutable: true,
},
}
if !reflect.DeepEqual(cmdFiles, want) {
t.Errorf("RelocateCmd(%q, %q, %q)=%v; want=%v", reqCmdPath, cs, subprogSetups, cmdFiles, want)
}
}
func TestRelocateCmdSubprog(t *testing.T) {
// The main binary is not relocatable, but subprogram is relocatable.
cs := &pb.CmdDescriptor_Setup{
CmdFile: &pb.FileSpec{
Path: "/usr/bin/clang",
Size: 1,
Hash: "a",
IsExecutable: true,
},
CmdDir: "/tmp",
PathType: pb.CmdDescriptor_POSIX,
}
// objdump is relocatable, and it's requested to place at /opt/bin/objdump.
subprogSetups := map[string]*pb.CmdDescriptor_Setup{
"/opt/bin/objdump": {
CmdFile: &pb.FileSpec{
Path: "bin/objdump",
Size: 2,
Hash: "b",
IsExecutable: true,
},
CmdDir: "/cmddir",
PathType: pb.CmdDescriptor_POSIX,
},
}
const reqCmdPath = "/usr/bin/clang"
cmdFiles, err := RelocateCmd(reqCmdPath, cs, subprogSetups)
if err != nil {
t.Errorf("RelocateCmd(%q, %q, %q)=_, _, %v; want nil-error", reqCmdPath, cs, subprogSetups, err)
}
// objdump must be included in FileSpec. clang is not relocatable, so it will be included as is.
got := cmdFiles
want := []*pb.FileSpec{
{
Path: "/usr/bin/clang",
Size: 1,
Hash: "a",
IsExecutable: true,
},
{
Path: "/opt/bin/objdump",
Size: 2,
Hash: "b",
IsExecutable: true,
},
}
if !reflect.DeepEqual(got, want) {
t.Errorf("RelocateCmd(%q, %q, %q)=_, %v, nil; want=_, %v, nil", reqCmdPath, cs, subprogSetups, got, want)
}
}