|  | // Copyright 2021 Google Inc. All rights reserved. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | package build | 
|  |  | 
|  | import ( | 
|  | "os" | 
|  | "testing" | 
|  | ) | 
|  |  | 
|  | func TestMain(m *testing.M) { | 
|  | // set src dir of sandbox | 
|  | sandboxConfig.srcDir = "/my/src/dir" | 
|  | os.Exit(m.Run()) | 
|  | } | 
|  |  | 
|  | func TestMountFlagsSrcDir(t *testing.T) { | 
|  | testCases := []struct { | 
|  | srcDirIsRO         bool | 
|  | expectedSrcDirFlag string | 
|  | }{ | 
|  | { | 
|  | srcDirIsRO:         false, | 
|  | expectedSrcDirFlag: "-B", | 
|  | }, | 
|  | { | 
|  | srcDirIsRO:         true, | 
|  | expectedSrcDirFlag: "-R", | 
|  | }, | 
|  | } | 
|  | for _, testCase := range testCases { | 
|  | c := testCmd() | 
|  | c.config.sandboxConfig.SetSrcDirIsRO(testCase.srcDirIsRO) | 
|  | c.wrapSandbox() | 
|  | if !isExpectedMountFlag(c.Args, sandboxConfig.srcDir, testCase.expectedSrcDirFlag) { | 
|  | t.Error("Mount flag of srcDir is not correct") | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestMountFlagsSrcDirRWAllowlist(t *testing.T) { | 
|  | testCases := []struct { | 
|  | srcDirRWAllowlist []string | 
|  | }{ | 
|  | { | 
|  | srcDirRWAllowlist: []string{}, | 
|  | }, | 
|  | { | 
|  | srcDirRWAllowlist: []string{"my/path"}, | 
|  | }, | 
|  | { | 
|  | srcDirRWAllowlist: []string{"my/path1", "my/path2"}, | 
|  | }, | 
|  | } | 
|  | for _, testCase := range testCases { | 
|  | c := testCmd() | 
|  | c.config.sandboxConfig.SetSrcDirIsRO(true) | 
|  | c.config.sandboxConfig.SetSrcDirRWAllowlist(testCase.srcDirRWAllowlist) | 
|  | c.wrapSandbox() | 
|  | for _, allowlistPath := range testCase.srcDirRWAllowlist { | 
|  | if !isExpectedMountFlag(c.Args, allowlistPath, "-B") { | 
|  | t.Error("Mount flag of srcDirRWAllowlist is not correct, expect -B") | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // utils for setting up test | 
|  | func testConfig() Config { | 
|  | // create a minimal testConfig | 
|  | env := Environment([]string{}) | 
|  | sandboxConfig := SandboxConfig{} | 
|  | return Config{&configImpl{environ: &env, | 
|  | sandboxConfig: &sandboxConfig}} | 
|  | } | 
|  |  | 
|  | func testCmd() *Cmd { | 
|  | return Command(testContext(), testConfig(), "sandbox_test", "path/to/nsjail") | 
|  | } | 
|  |  | 
|  | func isExpectedMountFlag(cmdArgs []string, dirName string, expectedFlag string) bool { | 
|  | indexOfSrcDir := index(cmdArgs, dirName) | 
|  | return cmdArgs[indexOfSrcDir-1] == expectedFlag | 
|  | } | 
|  |  | 
|  | func index(arr []string, target string) int { | 
|  | for idx, element := range arr { | 
|  | if element == target { | 
|  | return idx | 
|  | } | 
|  | } | 
|  | panic("element could not be located in input array") | 
|  | } |