diff --git a/internal/discover/csv/csv.go b/internal/discover/csv/csv.go new file mode 100644 index 00000000..56b2d4ea --- /dev/null +++ b/internal/discover/csv/csv.go @@ -0,0 +1,90 @@ +/** +# Copyright (c) 2021, NVIDIA CORPORATION. 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 csv + +import ( + "bufio" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "strings" + + "github.com/sirupsen/logrus" +) + +const ( + // DefaultRoot is default location of CSV files that define the modifications required to the OCI spec + DefaultRoot = "/etc/nvidia-container-runtime/host-files-for-container.d" +) + +// GetFileList returns the (non-recursive) list of CSV files in the specified +// folder +func GetFileList(root string) ([]string, error) { + contents, err := os.ReadDir(root) + if err != nil && errors.Is(err, os.ErrNotExist) { + return nil, nil + } else if err != nil { + return nil, fmt.Errorf("failed to read the contents of %v: %v", root, err) + } + + var csvFilePaths []string + for _, c := range contents { + if c.IsDir() { + continue + } + if c.Name() == ".csv" { + continue + } + ext := strings.ToLower(filepath.Ext(c.Name())) + if ext != ".csv" { + continue + } + + csvFilePaths = append(csvFilePaths, filepath.Join(root, c.Name())) + } + + return csvFilePaths, nil +} + +// ParseFile parses the specified file and returns a list of required jetson mounts +func ParseFile(logger *logrus.Logger, filename string) ([]*MountSpec, error) { + csvFile, err := os.Open(filename) + if err != nil { + return nil, fmt.Errorf("failed to open %v for reading: %v", filename, err) + } + return parseCSVFromReader(logger, csvFile), nil +} + +// parseCSVFromReader parses the specified file and returns a list of required jetson mounts +func parseCSVFromReader(logger *logrus.Logger, reader io.Reader) []*MountSpec { + var targets []*MountSpec + + scanner := bufio.NewScanner(reader) + for scanner.Scan() { + line := scanner.Text() + target, err := NewMountSpecFromLine(line) + if err != nil { + logger.Debugf("Skipping invalid mount spec '%v': %v", line, err) + continue + } + targets = append(targets, target) + } + + return targets +} diff --git a/internal/discover/csv/csv_test.go b/internal/discover/csv/csv_test.go new file mode 100644 index 00000000..919f4add --- /dev/null +++ b/internal/discover/csv/csv_test.go @@ -0,0 +1,83 @@ +/** +# Copyright (c) 2021, NVIDIA CORPORATION. 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 csv + +import ( + "path/filepath" + "testing" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/test" + "github.com/stretchr/testify/require" +) + +func TestGetFileList(t *testing.T) { + moduleRoot, _ := test.GetModuleRoot() + + testCases := []struct { + description string + root string + files []string + expectedError error + }{ + { + description: "returns list of CSV files", + root: "test/input/csv_samples/", + files: []string{ + "jetson.csv", + "simple_wrong.csv", + "simple.csv", + "spaced.csv", + }, + }, + { + description: "handles empty folder", + root: "test/input/csv_samples/empty", + }, + { + description: "handles non-existent folder", + root: "test/input/csv_samples/NONEXISTENT", + }, + { + description: "handles non-existent folder root", + root: "/NONEXISTENT/test/input/csv_samples/", + }, + } + + for _, tc := range testCases { + t.Run(tc.description, func(t *testing.T) { + root := filepath.Join(moduleRoot, tc.root) + files, err := GetFileList(root) + + if tc.expectedError != nil { + require.Error(t, err) + require.Empty(t, files) + return + } + + require.NoError(t, err) + + var foundFiles []string + for _, f := range files { + require.Equal(t, root, filepath.Dir(f)) + require.Equal(t, ".csv", filepath.Ext(f)) + foundFiles = append(foundFiles, filepath.Base(f)) + } + + require.ElementsMatch(t, tc.files, foundFiles) + }) + } +} diff --git a/internal/discover/csv/mount_spec.go b/internal/discover/csv/mount_spec.go new file mode 100644 index 00000000..44a453b8 --- /dev/null +++ b/internal/discover/csv/mount_spec.go @@ -0,0 +1,73 @@ +/** +# Copyright (c) 2021-2022, NVIDIA CORPORATION. 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 csv + +import ( + "fmt" + "strings" +) + +// MountSpecType defines the mount types allowed in a CSV file +type MountSpecType string + +const ( + // MountSpecDev is used for character devices + MountSpecDev = MountSpecType("dev") + // MountSpecDir is used for directories + MountSpecDir = MountSpecType("dir") + // MountSpecLib is used for libraries or regular files + MountSpecLib = MountSpecType("lib") + // MountSpecSym is used for symlinks. + MountSpecSym = MountSpecType("sym") +) + +// MountSpec represents a Jetson mount consisting of a type and a path. +type MountSpec struct { + Type MountSpecType + Path string +} + +// NewMountSpecFromLine parses the specified line and returns the MountSpec or an error if the line is malformed +func NewMountSpecFromLine(line string) (*MountSpec, error) { + parts := strings.SplitN(strings.TrimSpace(line), ",", 2) + if len(parts) < 2 { + return nil, fmt.Errorf("failed to parse line: %v", line) + } + mountType := strings.TrimSpace(parts[0]) + path := strings.TrimSpace(parts[1]) + + return NewMountSpec(mountType, path) +} + +// NewMountSpec creates a MountSpec with the specified type and path. An error is returned if the type is invalid. +func NewMountSpec(mountType string, path string) (*MountSpec, error) { + switch mountType { + case "dev", "lib", "sym", "dir": + default: + return nil, fmt.Errorf("unexpected mount type: %v", mountType) + } + if path == "" { + return nil, fmt.Errorf("invalid path: %v", path) + } + + mount := MountSpec{ + Type: MountSpecType(mountType), + Path: path, + } + + return &mount, nil +} diff --git a/internal/discover/csv/mount_spec_test.go b/internal/discover/csv/mount_spec_test.go new file mode 100644 index 00000000..110ca8c1 --- /dev/null +++ b/internal/discover/csv/mount_spec_test.go @@ -0,0 +1,82 @@ +/** +# Copyright (c) 2022, NVIDIA CORPORATION. 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 csv + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestNewMountSpecFromLine(t *testing.T) { + parseError := fmt.Errorf("failed to parse line") + unexpectedError := fmt.Errorf("unexpected mount type") + + testCases := []struct { + line string + expectedError error + expectedValue MountSpec + }{ + { + line: "", + expectedError: parseError, + }, + { + line: "\t", + expectedError: parseError, + }, + { + line: ",", + expectedError: parseError, + }, + { + line: "dev,", + expectedError: parseError, + }, + { + line: "dev ,/a/path", + expectedValue: MountSpec{ + Path: "/a/path", + Type: "dev", + }, + }, + { + line: "dev ,/a/path,with,commas", + expectedValue: MountSpec{ + Path: "/a/path,with,commas", + Type: "dev", + }, + }, + { + line: "not-dev ,/a/path", + expectedError: unexpectedError, + }, + } + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + target, err := NewMountSpecFromLine(tc.line) + if tc.expectedError != nil { + require.Error(t, err) + return + } + require.NoError(t, err) + require.EqualValues(t, &tc.expectedValue, target) + }) + } +} diff --git a/test/input/csv_samples/.csv b/test/input/csv_samples/.csv new file mode 100644 index 00000000..e69de29b diff --git a/test/input/csv_samples/empty/.gitignore b/test/input/csv_samples/empty/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/test/input/csv_samples/jetson.csv b/test/input/csv_samples/jetson.csv new file mode 100644 index 00000000..99a573cc --- /dev/null +++ b/test/input/csv_samples/jetson.csv @@ -0,0 +1,171 @@ +dev, nvidiactl +dev, nvhost-gpu +dev, nvhost-ctrl +dev, nvhost-nvdec +dev, nvhost-ctrl-gpu +dev, nvhost-prof-gpu +dev, nvhost-dbg-gpu +dev, nvmap +dev, tegra_dc_ctrl +dev, tegra_dc_0 +dev, tegra_dc_1 +dev, nvhost-vic +dev, nvhost-as-gpu +dir, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/include +dir, /usr/lib/aarch64-linux-gnu/tegra-egl +dir, /usr/src/tensorrt +dir, /usr/local/cuda +lib, /usr/lib/aarch64-linux-gnu/libv4l/plugins/libv4l2_nvvidconv.so +lib, /usr/lib/aarch64-linux-gnu/libv4l/plugins/libv4l2_nvvideocodec.so +lib, /usr/lib/aarch64-linux-gnu/libv4l1.so.0 +lib, /usr/lib/aarch64-linux-gnu/libv4l2.so +lib, /usr/lib/aarch64-linux-gnu/libv4lconvert.so.0 +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvarguscamerasrc.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvcompositor.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvdrmvideosink.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnveglglessink.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnveglstreamsrc.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvegltransform.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvivafilter.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvjpeg.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvtee.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvvidconv.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvvideo4linux2.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvvideocuda.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvvideosink.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvvideosinks.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstomx.so +lib, /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstpulseaudio.so +lib, /usr/lib/aarch64-linux-gnu/libgstnvivameta.so +lib, /usr/lib/aarch64-linux-gnu/libgstnvexifmeta.so +lib, /usr/lib/aarch64-linux-gnu/libgstnvegl-1.0.so.0 +lib, /usr/lib/aarch64-linux-gnu/libnvonnxparser.so +lib, /usr/lib/aarch64-linux-gnu/libnvinfer.so +lib, /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so +lib, /usr/lib/aarch64-linux-gnu/libnvparsers.so +lib, /usr/lib/aarch64-linux-gnu/libcudnn.so +lib, /usr/lib/aarch64-linux-gnu/libnvsample_cudaprocess.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libdrm.so.2 +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvapputil.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvargus.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvargus_socketclient.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvargus_socketserver.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvavp.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvbuf_utils.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvcam_imageencoder.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvcameratools.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvcamerautils.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvcamlog.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvcamv4l2.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvcolorutil.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvdc.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvddk_2d_v2.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvddk_vic.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnveglstream_camconsumer.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnveglstreamproducer.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnveventlib.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvexif.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvfnet.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvfnetstoredefog.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvfnetstorehdfx.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvgov_boot.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvgov_camera.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvgov_force.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvgov_generic.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvgov_gpucompute.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvgov_graphics.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvgov_il.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvgov_spincircle.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvgov_tbc.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvgov_ui.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvid_mapper.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvidia-egl-wayland.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvidia-eglcore.so.32.1.0 +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvidia-fatbinaryloader.so.32.1.0 +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvidia-glcore.so.32.1.0 +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvidia-glsi.so.32.1.0 +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvidia-glvkspirv.so.32.1.0 +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvidia-ptxjitcompiler.so.1 +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvidia-rmapi-tegra.so.32.1.0 +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvidia-tls.so.32.1.0 +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvimp.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvjpeg.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvll.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvmedia.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvmm.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvmm_contentpipe.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvmm_parser.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvmm_utils.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvmmlite.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvmmlite_image.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvmmlite_utils.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvmmlite_video.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvodm_imager.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvomx.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvomxilclient.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvos.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvosd.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvparser.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvphs.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvphsd.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvrm.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvrm_gpu.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvrm_graphics.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvscf.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvtestresults.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvtnr.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvtracebuf.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvtvmr.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvtx_helper.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libnvwinsys.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libsensors.hal-client.nvs.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libsensors.l4t.no_fusion.nvs.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libsensors_hal.nvs.so +lib, /usr/lib/aarch64-linux-gnu/tegra/libtegrav4l2.so +lib, /usr/lib/aarch64-linux-gnu/tegra/nvidia_icd.json +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/EGLWLInputEventExample +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/EGLWLMockNavigation +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/LayerManagerControl +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/desktop-shell.so +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/drm-backend.so +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/eglstream-backend.so +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/gl-renderer.so +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/hmi-controller.so +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/ivi-controller.so +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/ivi-shell.so +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/libilmClient.so.2.0.0 +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/libilmCommon.so.2.0.0 +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/libilmControl.so.2.0.0 +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/libilmInput.so.2.0.0 +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/libinput.so.10.10.1 +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/spring-tool +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/wayland-backend.so +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-calibrator +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-clickdot +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-cliptest +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-desktop-shell +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-dnd +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-eventdemo +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-flower +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-fullscreen +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-image +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-info +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-ivi-shell-user-interface +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-keyboard +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-launch +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-multi-resource +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-resizor +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-scaler +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-screenshooter +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-simple-egl +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-simple-shm +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-simple-touch +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-smoke +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-stacking +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-subsurfaces +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-terminal +lib, /usr/lib/aarch64-linux-gnu/tegra/weston/weston-transformed +lib, /usr/lib/libvisionworks_tracking.so.0.88 +lib, /usr/lib/libvisionworks_sfm.so.0.90 +lib, /usr/lib/libvisionworks.so diff --git a/test/input/csv_samples/other.not_csv b/test/input/csv_samples/other.not_csv new file mode 100644 index 00000000..e69de29b diff --git a/test/input/csv_samples/simple.csv b/test/input/csv_samples/simple.csv new file mode 100644 index 00000000..8469c422 --- /dev/null +++ b/test/input/csv_samples/simple.csv @@ -0,0 +1,6 @@ +lib,/lib/target +dir,/lib/target +dev,/dev/null +dev,full +dev,/dev/target +sym,/source diff --git a/test/input/csv_samples/simple_wrong.csv b/test/input/csv_samples/simple_wrong.csv new file mode 100644 index 00000000..0d2ecd7f --- /dev/null +++ b/test/input/csv_samples/simple_wrong.csv @@ -0,0 +1 @@ +dir diff --git a/test/input/csv_samples/spaced.csv b/test/input/csv_samples/spaced.csv new file mode 100644 index 00000000..83dd46b0 --- /dev/null +++ b/test/input/csv_samples/spaced.csv @@ -0,0 +1,9 @@ + dev , /dev/target +lib, /lib/target + +dir,/lib/target + +sym, /source + + +