github.com/jk-he/cni@v0.8.1/pkg/invoke/find_test.go (about)

     1  // Copyright 2016 CNI authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package invoke_test
    16  
    17  import (
    18  	"fmt"
    19  	"io/ioutil"
    20  	"os"
    21  	"path/filepath"
    22  	"strings"
    23  
    24  	"github.com/containernetworking/cni/pkg/invoke"
    25  	. "github.com/onsi/ginkgo"
    26  	. "github.com/onsi/gomega"
    27  )
    28  
    29  var _ = Describe("FindInPath", func() {
    30  	var (
    31  		multiplePaths         []string
    32  		pluginName            string
    33  		plugin2NameWithExt    string
    34  		plugin2NameWithoutExt string
    35  		pluginDir             string
    36  		anotherTempDir        string
    37  	)
    38  
    39  	BeforeEach(func() {
    40  		tempDir, err := ioutil.TempDir("", "cni-find")
    41  		Expect(err).NotTo(HaveOccurred())
    42  
    43  		plugin, err := ioutil.TempFile(tempDir, "a-cni-plugin")
    44  		Expect(err).NotTo(HaveOccurred())
    45  
    46  		plugin2Name := "a-plugin-with-extension" + invoke.ExecutableFileExtensions[0]
    47  		plugin2, err := os.Create(filepath.Join(tempDir, plugin2Name))
    48  		Expect(err).NotTo(HaveOccurred())
    49  
    50  		anotherTempDir, err = ioutil.TempDir("", "nothing-here")
    51  		Expect(err).NotTo(HaveOccurred())
    52  
    53  		multiplePaths = []string{anotherTempDir, tempDir}
    54  		pluginDir, pluginName = filepath.Split(plugin.Name())
    55  		_, plugin2NameWithExt = filepath.Split(plugin2.Name())
    56  		plugin2NameWithoutExt = strings.Split(plugin2NameWithExt, ".")[0]
    57  	})
    58  
    59  	AfterEach(func() {
    60  		os.RemoveAll(pluginDir)
    61  		os.RemoveAll(anotherTempDir)
    62  	})
    63  
    64  	Context("when multiple paths are provided", func() {
    65  		It("returns only the path to the plugin", func() {
    66  			pluginPath, err := invoke.FindInPath(pluginName, multiplePaths)
    67  			Expect(err).NotTo(HaveOccurred())
    68  			Expect(pluginPath).To(Equal(filepath.Join(pluginDir, pluginName)))
    69  		})
    70  	})
    71  
    72  	Context("when a plugin name without its file name extension is provided", func() {
    73  		It("returns the path to the plugin, including its extension", func() {
    74  			pluginPath, err := invoke.FindInPath(plugin2NameWithoutExt, multiplePaths)
    75  			Expect(err).NotTo(HaveOccurred())
    76  			Expect(pluginPath).To(Equal(filepath.Join(pluginDir, plugin2NameWithExt)))
    77  		})
    78  	})
    79  
    80  	Context("when an error occurs", func() {
    81  		Context("when no paths are provided", func() {
    82  			It("returns an error noting no paths were provided", func() {
    83  				_, err := invoke.FindInPath(pluginName, []string{})
    84  				Expect(err).To(MatchError("no paths provided"))
    85  			})
    86  		})
    87  
    88  		Context("when no plugin is provided", func() {
    89  			It("returns an error noting the plugin name wasn't found", func() {
    90  				_, err := invoke.FindInPath("", multiplePaths)
    91  				Expect(err).To(MatchError("no plugin name provided"))
    92  			})
    93  		})
    94  
    95  		Context("when the plugin cannot be found", func() {
    96  			It("returns an error noting the path", func() {
    97  				pathsWithNothing := []string{anotherTempDir}
    98  				_, err := invoke.FindInPath(pluginName, pathsWithNothing)
    99  				Expect(err).To(MatchError(fmt.Sprintf("failed to find plugin %q in path %s", pluginName, pathsWithNothing)))
   100  			})
   101  		})
   102  
   103  		Context("When the plugin contains a directory separator", func() {
   104  			It("returns an error", func() {
   105  				bogusPlugin := ".." + string(os.PathSeparator) + "pluginname"
   106  				_, err := invoke.FindInPath(bogusPlugin, []string{anotherTempDir})
   107  				Expect(err).To(MatchError("invalid plugin name: " + bogusPlugin))
   108  			})
   109  		})
   110  	})
   111  })