...

Source file src/github.com/coreos/go-systemd/v22/unit/deserialize_test.go

Documentation: github.com/coreos/go-systemd/v22/unit

     1  // Copyright 2015 CoreOS, Inc.
     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 unit
    16  
    17  import (
    18  	"bytes"
    19  	"fmt"
    20  	"reflect"
    21  	"testing"
    22  )
    23  
    24  func TestDeserialize(t *testing.T) {
    25  	tests := []struct {
    26  		input  []byte
    27  		output []*UnitOption
    28  	}{
    29  		// multiple options underneath a section
    30  		{
    31  			[]byte(`[Unit]
    32  Description=Foo
    33  Description=Bar
    34  Requires=baz.service
    35  After=baz.service
    36  `),
    37  			[]*UnitOption{
    38  				&UnitOption{"Unit", "Description", "Foo"},
    39  				&UnitOption{"Unit", "Description", "Bar"},
    40  				&UnitOption{"Unit", "Requires", "baz.service"},
    41  				&UnitOption{"Unit", "After", "baz.service"},
    42  			},
    43  		},
    44  
    45  		// multiple sections
    46  		{
    47  			[]byte(`[Unit]
    48  Description=Foo
    49  
    50  [Service]
    51  ExecStart=/usr/bin/sleep infinity
    52  
    53  [X-Third-Party]
    54  Pants=on
    55  
    56  `),
    57  			[]*UnitOption{
    58  				&UnitOption{"Unit", "Description", "Foo"},
    59  				&UnitOption{"Service", "ExecStart", "/usr/bin/sleep infinity"},
    60  				&UnitOption{"X-Third-Party", "Pants", "on"},
    61  			},
    62  		},
    63  
    64  		// multiple sections with no options
    65  		{
    66  			[]byte(`[Unit]
    67  [Service]
    68  [X-Third-Party]
    69  `),
    70  			[]*UnitOption{},
    71  		},
    72  
    73  		// multiple values not special-cased
    74  		{
    75  			[]byte(`[Service]
    76  Environment= "FOO=BAR" "BAZ=QUX"
    77  `),
    78  			[]*UnitOption{
    79  				&UnitOption{"Service", "Environment", "\"FOO=BAR\" \"BAZ=QUX\""},
    80  			},
    81  		},
    82  
    83  		// line continuations unmodified
    84  		{
    85  			[]byte(`[Unit]
    86  Description= Unnecessarily wrapped \
    87      words here
    88  `),
    89  			[]*UnitOption{
    90  				&UnitOption{"Unit", "Description", `Unnecessarily wrapped \
    91      words here`},
    92  			},
    93  		},
    94  
    95  		// comments ignored
    96  		{
    97  			[]byte(`; comment alpha
    98  # comment bravo
    99  [Unit]
   100  ; comment charlie
   101  # comment delta
   102  #Description=Foo
   103  Description=Bar
   104  ; comment echo
   105  # comment foxtrot
   106  `),
   107  			[]*UnitOption{
   108  				&UnitOption{"Unit", "Description", "Bar"},
   109  			},
   110  		},
   111  
   112  		// apparent comment lines inside of line continuations not ignored
   113  		{
   114  			[]byte(`[Unit]
   115  Description=Bar\
   116  # comment alpha
   117  
   118  Description=Bar\
   119  # comment bravo \
   120  Baz
   121  `),
   122  			[]*UnitOption{
   123  				&UnitOption{"Unit", "Description", "Bar\\\n# comment alpha"},
   124  				&UnitOption{"Unit", "Description", "Bar\\\n# comment bravo \\\nBaz"},
   125  			},
   126  		},
   127  
   128  		// options outside of sections are ignored
   129  		{
   130  			[]byte(`Description=Foo
   131  [Unit]
   132  Description=Bar
   133  `),
   134  			[]*UnitOption{
   135  				&UnitOption{"Unit", "Description", "Bar"},
   136  			},
   137  		},
   138  
   139  		// garbage outside of sections are ignored
   140  		{
   141  			[]byte(`<<<<<<<<
   142  [Unit]
   143  Description=Bar
   144  `),
   145  			[]*UnitOption{
   146  				&UnitOption{"Unit", "Description", "Bar"},
   147  			},
   148  		},
   149  
   150  		// garbage used as unit option
   151  		{
   152  			[]byte(`[Unit]
   153  <<<<<<<<=Bar
   154  `),
   155  			[]*UnitOption{
   156  				&UnitOption{"Unit", "<<<<<<<<", "Bar"},
   157  			},
   158  		},
   159  
   160  		// option name with spaces are valid
   161  		{
   162  			[]byte(`[Unit]
   163  Some Thing = Bar
   164  `),
   165  			[]*UnitOption{
   166  				&UnitOption{"Unit", "Some Thing", "Bar"},
   167  			},
   168  		},
   169  
   170  		// lack of trailing newline doesn't cause problem for non-continued file
   171  		{
   172  			[]byte(`[Unit]
   173  Description=Bar`),
   174  			[]*UnitOption{
   175  				&UnitOption{"Unit", "Description", "Bar"},
   176  			},
   177  		},
   178  
   179  		// unit file with continuation but no following line is ok, too
   180  		{
   181  			[]byte(`[Unit]
   182  Description=Bar \`),
   183  			[]*UnitOption{
   184  				&UnitOption{"Unit", "Description", "Bar \\"},
   185  			},
   186  		},
   187  
   188  		// Assert utf8 characters are preserved
   189  		{
   190  			[]byte(`[©]
   191  µ☃=ÇôrèÕ$`),
   192  			[]*UnitOption{
   193  				&UnitOption{"©", "µ☃", "ÇôrèÕ$"},
   194  			},
   195  		},
   196  
   197  		// whitespace removed around option name
   198  		{
   199  			[]byte(`[Unit]
   200   Description   =words here
   201  `),
   202  			[]*UnitOption{
   203  				&UnitOption{"Unit", "Description", "words here"},
   204  			},
   205  		},
   206  
   207  		// whitespace around option value stripped
   208  		{
   209  			[]byte(`[Unit]
   210  Description= words here `),
   211  			[]*UnitOption{
   212  				&UnitOption{"Unit", "Description", "words here"},
   213  			},
   214  		},
   215  
   216  		// whitespace around option value stripped, regardless of continuation
   217  		{
   218  			[]byte(`[Unit]
   219  Description= words here \
   220    `),
   221  			[]*UnitOption{
   222  				&UnitOption{"Unit", "Description", "words here \\\n"},
   223  			},
   224  		},
   225  
   226  		// backslash not considered continuation if followed by text
   227  		{
   228  			[]byte(`[Service]
   229  ExecStart=/bin/bash -c "while true; do echo \"ping\"; sleep 1; done"
   230  `),
   231  			[]*UnitOption{
   232  				&UnitOption{"Service", "ExecStart", `/bin/bash -c "while true; do echo \"ping\"; sleep 1; done"`},
   233  			},
   234  		},
   235  
   236  		// backslash not considered continuation if followed by whitespace, but still trimmed
   237  		{
   238  			[]byte(`[Service]
   239  ExecStart=/bin/bash echo poof \  `),
   240  			[]*UnitOption{
   241  				&UnitOption{"Service", "ExecStart", `/bin/bash echo poof \`},
   242  			},
   243  		},
   244  		// a long unit file line that's just equal to the maximum permitted length
   245  		{
   246  			[]byte(`[Service]
   247  ExecStart=/bin/bash -c "echo ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................."`),
   248  			[]*UnitOption{
   249  				&UnitOption{"Service", "ExecStart", `/bin/bash -c "echo ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................."`},
   250  			},
   251  		},
   252  		// the same, but with a trailing newline
   253  		{
   254  			[]byte(`[Service]
   255  ExecStart=/bin/bash -c "echo ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................."
   256  Option=value
   257  `),
   258  			[]*UnitOption{
   259  				&UnitOption{"Service", "ExecStart", `/bin/bash -c "echo ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................."`},
   260  				&UnitOption{"Service", "Option", "value"},
   261  			},
   262  		},
   263  	}
   264  
   265  	assert := func(expect, output []*UnitOption) error {
   266  		if len(expect) != len(output) {
   267  			return fmt.Errorf("expected %d items, got %d", len(expect), len(output))
   268  		}
   269  
   270  		for i := range expect {
   271  			if !reflect.DeepEqual(expect[i], output[i]) {
   272  				return fmt.Errorf("item %d: expected %v, got %v", i, expect[i], output[i])
   273  			}
   274  		}
   275  
   276  		return nil
   277  	}
   278  
   279  	for i, tt := range tests {
   280  		output, err := DeserializeOptions(bytes.NewReader(tt.input))
   281  		if err != nil {
   282  			t.Errorf("case %d: unexpected error parsing unit: %v", i, err)
   283  			continue
   284  		}
   285  
   286  		err = assert(tt.output, output)
   287  		if err != nil {
   288  			t.Errorf("case %d: %v", i, err)
   289  			t.Log("Expected options:")
   290  			logUnitOptionSlice(t, tt.output)
   291  			t.Log("Actual options:")
   292  			logUnitOptionSlice(t, output)
   293  		}
   294  	}
   295  }
   296  
   297  func TestDeserializeSections(t *testing.T) {
   298  	tests := []struct {
   299  		input  []byte
   300  		output []*UnitSection
   301  	}{
   302  		// multiple options underneath a section
   303  		{
   304  			[]byte(`[Unit]
   305  Description=Foo
   306  Description=Bar
   307  Requires=baz.service
   308  After=baz.service
   309  `),
   310  			[]*UnitSection{
   311  				&UnitSection{
   312  					Section: "Unit",
   313  					Entries: []*UnitEntry{
   314  						&UnitEntry{"Description", "Foo"},
   315  						&UnitEntry{"Description", "Bar"},
   316  						&UnitEntry{"Requires", "baz.service"},
   317  						&UnitEntry{"After", "baz.service"},
   318  					},
   319  				},
   320  			},
   321  		},
   322  		{
   323  			[]byte(`[Route]
   324  Destination=10.0.0.1/24
   325  Gateway=10.0.10.1
   326  
   327  [Route]
   328  Destination=10.0.2.1/24
   329  Gateway=10.0.10.1
   330  `),
   331  			[]*UnitSection{
   332  				&UnitSection{
   333  					Section: "Route",
   334  					Entries: []*UnitEntry{
   335  						&UnitEntry{"Destination", "10.0.0.1/24"},
   336  						&UnitEntry{"Gateway", "10.0.10.1"},
   337  					},
   338  				},
   339  				&UnitSection{
   340  					Section: "Route",
   341  					Entries: []*UnitEntry{
   342  						&UnitEntry{"Destination", "10.0.2.1/24"},
   343  						&UnitEntry{"Gateway", "10.0.10.1"},
   344  					},
   345  				},
   346  			},
   347  		},
   348  	}
   349  
   350  	assert := func(expect, output []*UnitSection) error {
   351  		if len(expect) != len(output) {
   352  			return fmt.Errorf("expected %d sections, got %d", len(expect), len(output))
   353  		}
   354  
   355  		for i := range expect {
   356  			if !reflect.DeepEqual(expect[i], output[i]) {
   357  				return fmt.Errorf("item %d: expected %v, got %v", i, expect[i], output[i])
   358  			}
   359  		}
   360  
   361  		return nil
   362  	}
   363  
   364  	for i, tt := range tests {
   365  		output, err := DeserializeSections(bytes.NewReader(tt.input))
   366  		if err != nil {
   367  			t.Errorf("case %d: unexpected error parsing unit: %v", i, err)
   368  			continue
   369  		}
   370  
   371  		err = assert(tt.output, output)
   372  		if err != nil {
   373  			t.Errorf("case %d: %v", i, err)
   374  			t.Log("Expected options:")
   375  			for _, s := range tt.output {
   376  				t.Log(s)
   377  			}
   378  			t.Log("Actual options:")
   379  			for _, s := range output {
   380  				t.Log(s)
   381  			}
   382  		}
   383  	}
   384  }
   385  
   386  func TestDeserializeFail(t *testing.T) {
   387  	tests := [][]byte{
   388  		// malformed section header
   389  		[]byte(`[Unit
   390  Description=Foo
   391  `),
   392  
   393  		// garbage following section header
   394  		[]byte(`[Unit] pants
   395  Description=Foo
   396  `),
   397  
   398  		// option without value
   399  		[]byte(`[Unit]
   400  Description
   401  `),
   402  
   403  		// garbage inside of section
   404  		[]byte(`[Unit]
   405  <<<<<<
   406  Description=Foo
   407  `),
   408  	}
   409  
   410  	for i, tt := range tests {
   411  		output, err := DeserializeOptions(bytes.NewReader(tt))
   412  		if err == nil {
   413  			t.Errorf("case %d: unexpected nil error", i)
   414  			t.Log("Output:")
   415  			logUnitOptionSlice(t, output)
   416  		}
   417  	}
   418  }
   419  
   420  func logUnitOptionSlice(t *testing.T, opts []*UnitOption) {
   421  	for idx, opt := range opts {
   422  		t.Logf("%d: %v", idx, opt)
   423  	}
   424  }
   425  
   426  func TestDeserializeLineTooLong(t *testing.T) {
   427  	tests := [][]byte{
   428  		// section header that's far too long
   429  		[]byte(`[Seeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeervice]
   430  `),
   431  		// sane-looking unit file with a line just greater than the maximum allowed (currently, 2048)
   432  		[]byte(`[Service]
   433  ExecStart=/bin/bash -c "echo ..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................."
   434  `),
   435  		// sane-looking unit file with option value way too long
   436  		[]byte(`
   437  # test unit file
   438  
   439  [Service]
   440  ExecStartPre=-/usr/bin/docker rm %p
   441  ExecStartPre=-/usr/bin/docker pull busybox
   442  ExecStart=/usr/bin/docker run --rm --name %p --net=host \
   443    -e "test=1123t" \
   444    -e "test=1123t" \
   445    -e "fiz=1123t" \
   446    -e "buz=1123t" \
   447    -e "FOO=BARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBABARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARRBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBAR"BARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBABARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARRBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBARBAR" \
   448    busybox sleep 10
   449  ExecStop=-/usr/bin/docker kill %p
   450  SyslogIdentifier=busybox
   451  Restart=always
   452  RestartSec=10s
   453  `),
   454  		// single arbitrary line that's way too long
   455  		[]byte(`arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 character arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 character arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 character arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 character arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters arbitrary and extraordinarily long line that is far greater than 2048 characters`),
   456  		// sane-looking unit file with option name way too long
   457  		[]byte(`[Service]
   458  ExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStartExecStart=/bin/true
   459  `),
   460  	}
   461  
   462  	for i, tt := range tests {
   463  		output, err := DeserializeOptions(bytes.NewReader(tt))
   464  		if err != ErrLineTooLong {
   465  			t.Errorf("case %d: unexpected err: %v", i, err)
   466  			t.Log("Output:")
   467  			logUnitOptionSlice(t, output)
   468  		}
   469  	}
   470  }
   471  

View as plain text