| // Copyright 2018 Google LLC. All Rights Reserved. |
| |
| package remoteexec |
| |
| import ( |
| "context" |
| "io" |
| "reflect" |
| "testing" |
| |
| rpb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2" |
| |
| pb "go.chromium.org/goma/server/proto/command" |
| "go.chromium.org/goma/server/remoteexec/digest" |
| "go.chromium.org/goma/server/remoteexec/merkletree" |
| ) |
| |
| type dummyCmdStorage struct { |
| } |
| |
| func (dcs dummyCmdStorage) Open(ctx context.Context, hash string) (io.ReadCloser, error) { |
| return nil, nil |
| } |
| |
| func TestFileSpecToEntry(t *testing.T) { |
| tests := []struct { |
| input *pb.FileSpec |
| wantEntry merkletree.Entry |
| wantErr bool |
| }{ |
| // Executable files. |
| { |
| &pb.FileSpec{ |
| Path: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/pnacl-clang++", |
| Hash: "7bf4c008d0321a9956279edd58fd2078569e9595fbfe5775c228836b36d71796", |
| Size: 1234, |
| IsExecutable: true, |
| }, |
| merkletree.Entry{ |
| Name: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/pnacl-clang++", |
| IsExecutable: true, |
| Data: digest.New( |
| cmdFileObj{ |
| hash: "7bf4c008d0321a9956279edd58fd2078569e9595fbfe5775c228836b36d71796", |
| storage: dummyCmdStorage{}, |
| }, |
| &rpb.Digest{ |
| Hash: "7bf4c008d0321a9956279edd58fd2078569e9595fbfe5775c228836b36d71796", |
| SizeBytes: 1234, |
| }), |
| }, false, |
| }, { |
| &pb.FileSpec{ |
| Path: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/clang", |
| Hash: "42151bf3845e7b44d0339964cdc19ce55427e7eee9e4bf0d306fe313ed8b5db8", |
| Size: 4567, |
| IsExecutable: true, |
| }, |
| merkletree.Entry{ |
| Name: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/clang", |
| IsExecutable: true, |
| Data: digest.New( |
| cmdFileObj{ |
| hash: "42151bf3845e7b44d0339964cdc19ce55427e7eee9e4bf0d306fe313ed8b5db8", |
| storage: dummyCmdStorage{}, |
| }, |
| &rpb.Digest{ |
| Hash: "42151bf3845e7b44d0339964cdc19ce55427e7eee9e4bf0d306fe313ed8b5db8", |
| SizeBytes: 4567, |
| }), |
| }, false, |
| }, { |
| // Test IsExecutable=false. |
| &pb.FileSpec{ |
| Path: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/../lib/libc++.so.1.0", |
| Hash: "7fc88a31bbededbe1f276c23a66797b21cf8d7f837e6580e70b2755a817a08c7", |
| Size: 1111, |
| IsExecutable: false, |
| }, |
| merkletree.Entry{ |
| Name: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/../lib/libc++.so.1.0", |
| IsExecutable: false, |
| Data: digest.New( |
| cmdFileObj{ |
| hash: "7fc88a31bbededbe1f276c23a66797b21cf8d7f837e6580e70b2755a817a08c7", |
| storage: dummyCmdStorage{}, |
| }, |
| &rpb.Digest{ |
| Hash: "7fc88a31bbededbe1f276c23a66797b21cf8d7f837e6580e70b2755a817a08c7", |
| SizeBytes: 1111, |
| }), |
| }, false, |
| }, { |
| // Invalid entry. |
| &pb.FileSpec{ |
| Path: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/../lib/libc++.so.1.0", |
| Hash: "7fc88a31bbededbe1f276c23a66797b21cf8d7f837e6580e70b2755a817a08c7", |
| Symlink: "libc++.so.1.0", |
| }, |
| merkletree.Entry{}, true, |
| }, { |
| // Dir. |
| &pb.FileSpec{ |
| Path: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin", |
| }, |
| merkletree.Entry{ |
| Name: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin", |
| }, false, |
| }, { |
| // Symlinks. |
| &pb.FileSpec{ |
| Path: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/clang++", |
| Symlink: "clang", |
| }, |
| merkletree.Entry{ |
| Name: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/clang++", |
| Target: "clang", |
| }, false, |
| }, { |
| &pb.FileSpec{ |
| Path: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/../lib/libc++.so", |
| Symlink: "libc++.so.1", |
| }, |
| merkletree.Entry{ |
| Name: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/../lib/libc++.so", |
| Target: "libc++.so.1", |
| }, false, |
| }, { |
| &pb.FileSpec{ |
| Path: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/clang++", |
| Symlink: "libc++.so.1.0", |
| }, |
| merkletree.Entry{ |
| Name: "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/clang++", |
| Target: "libc++.so.1.0", |
| }, false, |
| }, |
| } |
| |
| for _, test := range tests { |
| entry, err := fileSpecToEntry(context.Background(), test.input, dummyCmdStorage{}) |
| if !reflect.DeepEqual(entry, test.wantEntry) || test.wantErr != (err != nil) { |
| t.Errorf("fileSpecToEntry(ctx, %v, dummyCmdStorage)=%v, %v, want=%v, wantErr=%v", test.input, |
| entry, err, test.wantEntry, test.wantErr) |
| } |
| } |
| } |