From 513a1eb6027cb5bc689143bdaf788c76e6132c8b Mon Sep 17 00:00:00 2001 From: Lars Wiegman Date: Thu, 15 May 2014 15:57:40 +0200 Subject: [PATCH] Trim newlines from the cloud-config-url kernel parameter and added a test - In the Fetch function trim whitespace from /proc/cmdline - New test for Fetch function - Added Location field to the procCmdline struct for testing --- datasource/proc_cmdline.go | 11 +++++---- datasource/proc_cmdline_test.go | 41 +++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/datasource/proc_cmdline.go b/datasource/proc_cmdline.go index 4f38fcf..b527605 100644 --- a/datasource/proc_cmdline.go +++ b/datasource/proc_cmdline.go @@ -12,19 +12,22 @@ const ( ProcCmdlineCloudConfigFlag = "cloud-config-url" ) -type procCmdline struct{} +type procCmdline struct{ + Location string +} func NewProcCmdline() *procCmdline { - return &procCmdline{} + return &procCmdline{Location: ProcCmdlineLocation} } func (self *procCmdline) Fetch() ([]byte, error) { - cmdline, err := ioutil.ReadFile(ProcCmdlineLocation) + contents, err := ioutil.ReadFile(self.Location) if err != nil { return nil, err } - url, err := findCloudConfigURL(string(cmdline)) + cmdline := strings.TrimSpace(string(contents)) + url, err := findCloudConfigURL(cmdline) if err != nil { return nil, err } diff --git a/datasource/proc_cmdline_test.go b/datasource/proc_cmdline_test.go index 7f0f2d3..bee6e64 100644 --- a/datasource/proc_cmdline_test.go +++ b/datasource/proc_cmdline_test.go @@ -1,6 +1,11 @@ package datasource import ( + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "os" "testing" ) @@ -45,3 +50,39 @@ func TestParseCmdlineCloudConfigFound(t *testing.T) { } } } + +func TestProcCmdlineAndFetchConfig(t *testing.T) { + + var ( + ProcCmdlineTmpl = "foo=bar cloud-config-url=%s/config\n" + CloudConfigContent = "#cloud-config\n" + ) + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == "GET" && r.RequestURI == "/config" { + fmt.Fprint(w, CloudConfigContent) + } + })) + defer ts.Close() + + file, err := ioutil.TempFile(os.TempDir(), "test_proc_cmdline") + defer os.Remove(file.Name()) + if err != nil { + t.Errorf("Test produced error: %v", err) + } + _, err = file.Write([]byte(fmt.Sprintf(ProcCmdlineTmpl, ts.URL))) + if err != nil { + t.Errorf("Test produced error: %v", err) + } + + p := NewProcCmdline() + p.Location = file.Name() + cfg, err := p.Fetch() + if err != nil { + t.Errorf("Test produced error: %v", err) + } + + if string(cfg) != CloudConfigContent { + t.Errorf("Test failed, response body: %s != %s", cfg, CloudConfigContent) + } +}