launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/utils/apt_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package utils_test
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"launchpad.net/errgo/errors"
    10  	gc "launchpad.net/gocheck"
    11  
    12  	"launchpad.net/juju-core/juju/osenv"
    13  	jc "launchpad.net/juju-core/testing/checkers"
    14  	"launchpad.net/juju-core/testing/testbase"
    15  	"launchpad.net/juju-core/utils"
    16  )
    17  
    18  type AptSuite struct {
    19  	testbase.LoggingSuite
    20  }
    21  
    22  var _ = gc.Suite(&AptSuite{})
    23  
    24  func (s *AptSuite) TestOnePackage(c *gc.C) {
    25  	cmdChan := s.HookCommandOutput(&utils.AptCommandOutput, []byte{}, nil)
    26  	err := utils.AptGetInstall("test-package")
    27  	c.Assert(err, gc.IsNil)
    28  	cmd := <-cmdChan
    29  	c.Assert(cmd.Args, gc.DeepEquals, []string{
    30  		"apt-get", "--option=Dpkg::Options::=--force-confold",
    31  		"--option=Dpkg::options::=--force-unsafe-io", "--assume-yes", "--quiet",
    32  		"install", "test-package",
    33  	})
    34  	c.Assert(cmd.Env[len(cmd.Env)-1], gc.Equals, "DEBIAN_FRONTEND=noninteractive")
    35  }
    36  
    37  func (s *AptSuite) TestAptGetError(c *gc.C) {
    38  	const expected = `E: frobnicator failure detected`
    39  	cmdError := errors.Newf("error")
    40  	cmdChan := s.HookCommandOutput(&utils.AptCommandOutput, []byte(expected), cmdError)
    41  	err := utils.AptGetInstall("foo")
    42  	c.Assert(err, gc.ErrorMatches, "apt-get failed: error")
    43  	cmd := <-cmdChan
    44  	c.Assert(cmd.Args, gc.DeepEquals, []string{
    45  		"apt-get", "--option=Dpkg::Options::=--force-confold",
    46  		"--option=Dpkg::options::=--force-unsafe-io", "--assume-yes", "--quiet",
    47  		"install", "foo",
    48  	})
    49  }
    50  
    51  func (s *AptSuite) TestConfigProxyEmpty(c *gc.C) {
    52  	cmdChan := s.HookCommandOutput(&utils.AptCommandOutput, []byte{}, nil)
    53  	out, err := utils.AptConfigProxy()
    54  	c.Assert(err, gc.IsNil)
    55  	cmd := <-cmdChan
    56  	c.Assert(cmd.Args, gc.DeepEquals, []string{
    57  		"apt-config", "dump", "Acquire::http::Proxy",
    58  		"Acquire::https::Proxy", "Acquire::ftp::Proxy",
    59  	})
    60  	c.Assert(out, gc.Equals, "")
    61  }
    62  
    63  func (s *AptSuite) TestConfigProxyConfigured(c *gc.C) {
    64  	const expected = `Acquire::http::Proxy "10.0.3.1:3142";
    65  Acquire::https::Proxy "false";`
    66  	cmdChan := s.HookCommandOutput(&utils.AptCommandOutput, []byte(expected), nil)
    67  	out, err := utils.AptConfigProxy()
    68  	c.Assert(err, gc.IsNil)
    69  	cmd := <-cmdChan
    70  	c.Assert(cmd.Args, gc.DeepEquals, []string{
    71  		"apt-config", "dump", "Acquire::http::Proxy",
    72  		"Acquire::https::Proxy", "Acquire::ftp::Proxy",
    73  	})
    74  	c.Assert(out, gc.Equals, expected)
    75  }
    76  
    77  func (s *AptSuite) TestDetectAptProxy(c *gc.C) {
    78  	const output = `CommandLine::AsString "apt-config dump";
    79  Acquire::http::Proxy  "10.0.3.1:3142";
    80  Acquire::https::Proxy "false";
    81  Acquire::ftp::Proxy "none";
    82  Acquire::magic::Proxy "none";
    83  `
    84  	_ = s.HookCommandOutput(&utils.AptCommandOutput, []byte(output), nil)
    85  
    86  	proxy, err := utils.DetectAptProxies()
    87  	c.Assert(err, gc.IsNil)
    88  	c.Assert(proxy, gc.DeepEquals, osenv.ProxySettings{
    89  		Http:  "10.0.3.1:3142",
    90  		Https: "false",
    91  		Ftp:   "none",
    92  	})
    93  }
    94  
    95  func (s *AptSuite) TestDetectAptProxyNone(c *gc.C) {
    96  	_ = s.HookCommandOutput(&utils.AptCommandOutput, []byte{}, nil)
    97  	proxy, err := utils.DetectAptProxies()
    98  	c.Assert(err, gc.IsNil)
    99  	c.Assert(proxy, gc.DeepEquals, osenv.ProxySettings{})
   100  }
   101  
   102  func (s *AptSuite) TestDetectAptProxyPartial(c *gc.C) {
   103  	const output = `CommandLine::AsString "apt-config dump";
   104  Acquire::http::Proxy  "10.0.3.1:3142";
   105  Acquire::ftp::Proxy "here-it-is";
   106  Acquire::magic::Proxy "none";
   107  `
   108  	_ = s.HookCommandOutput(&utils.AptCommandOutput, []byte(output), nil)
   109  
   110  	proxy, err := utils.DetectAptProxies()
   111  	c.Assert(err, gc.IsNil)
   112  	c.Assert(proxy, gc.DeepEquals, osenv.ProxySettings{
   113  		Http: "10.0.3.1:3142",
   114  		Ftp:  "here-it-is",
   115  	})
   116  }
   117  
   118  func (s *AptSuite) TestAptProxyContentEmpty(c *gc.C) {
   119  	output := utils.AptProxyContent(osenv.ProxySettings{})
   120  	c.Assert(output, gc.Equals, "")
   121  }
   122  
   123  func (s *AptSuite) TestAptProxyContentPartial(c *gc.C) {
   124  	proxy := osenv.ProxySettings{
   125  		Http: "user@10.0.0.1",
   126  	}
   127  	output := utils.AptProxyContent(proxy)
   128  	expected := `Acquire::http::Proxy "user@10.0.0.1";`
   129  	c.Assert(output, gc.Equals, expected)
   130  }
   131  
   132  func (s *AptSuite) TestAptProxyContentRoundtrip(c *gc.C) {
   133  	proxy := osenv.ProxySettings{
   134  		Http:  "http://user@10.0.0.1",
   135  		Https: "https://user@10.0.0.1",
   136  		Ftp:   "ftp://user@10.0.0.1",
   137  	}
   138  	output := utils.AptProxyContent(proxy)
   139  
   140  	s.HookCommandOutput(&utils.AptCommandOutput, []byte(output), nil)
   141  
   142  	detected, err := utils.DetectAptProxies()
   143  	c.Assert(err, gc.IsNil)
   144  	c.Assert(detected, gc.DeepEquals, proxy)
   145  }
   146  
   147  func (s *AptSuite) TestConfigProxyConfiguredFilterOutput(c *gc.C) {
   148  	const (
   149  		output = `CommandLine::AsString "apt-config dump";
   150  Acquire::http::Proxy  "10.0.3.1:3142";
   151  Acquire::https::Proxy "false";`
   152  		expected = `Acquire::http::Proxy  "10.0.3.1:3142";
   153  Acquire::https::Proxy "false";`
   154  	)
   155  	cmdChan := s.HookCommandOutput(&utils.AptCommandOutput, []byte(output), nil)
   156  	out, err := utils.AptConfigProxy()
   157  	c.Assert(err, gc.IsNil)
   158  	cmd := <-cmdChan
   159  	c.Assert(cmd.Args, gc.DeepEquals, []string{
   160  		"apt-config", "dump", "Acquire::http::Proxy",
   161  		"Acquire::https::Proxy", "Acquire::ftp::Proxy",
   162  	})
   163  	c.Assert(out, gc.Equals, expected)
   164  }
   165  
   166  func (s *AptSuite) TestConfigProxyError(c *gc.C) {
   167  	const expected = `E: frobnicator failure detected`
   168  	cmdError := errors.Newf("error")
   169  	cmdChan := s.HookCommandOutput(&utils.AptCommandOutput, []byte(expected), cmdError)
   170  	out, err := utils.AptConfigProxy()
   171  	c.Assert(err, gc.ErrorMatches, "apt-config failed: error")
   172  	cmd := <-cmdChan
   173  	c.Assert(cmd.Args, gc.DeepEquals, []string{
   174  		"apt-config", "dump", "Acquire::http::Proxy",
   175  		"Acquire::https::Proxy", "Acquire::ftp::Proxy",
   176  	})
   177  	c.Assert(out, gc.Equals, "")
   178  }
   179  
   180  func (s *AptSuite) patchLsbRelease(c *gc.C, name string) {
   181  	content := fmt.Sprintf("#!/bin/bash --norc\necho %s", name)
   182  	patchExecutable(s, c.MkDir(), "lsb_release", content)
   183  }
   184  
   185  func (s *AptSuite) TestIsUbuntu(c *gc.C) {
   186  	s.patchLsbRelease(c, "Ubuntu")
   187  	c.Assert(utils.IsUbuntu(), jc.IsTrue)
   188  }
   189  
   190  func (s *AptSuite) TestIsNotUbuntu(c *gc.C) {
   191  	s.patchLsbRelease(c, "Windows NT")
   192  	c.Assert(utils.IsUbuntu(), jc.IsFalse)
   193  }
   194  
   195  func (s *AptSuite) patchDpkgQuery(c *gc.C, installed bool) {
   196  	rc := 0
   197  	if !installed {
   198  		rc = 1
   199  	}
   200  	content := fmt.Sprintf("#!/bin/bash --norc\nexit %v", rc)
   201  	patchExecutable(s, c.MkDir(), "dpkg-query", content)
   202  }
   203  
   204  func (s *AptSuite) TestIsPackageInstalled(c *gc.C) {
   205  	s.patchDpkgQuery(c, true)
   206  	c.Assert(utils.IsPackageInstalled("foo-bar"), jc.IsTrue)
   207  }
   208  
   209  func (s *AptSuite) TestIsPackageNotInstalled(c *gc.C) {
   210  	s.patchDpkgQuery(c, false)
   211  	c.Assert(utils.IsPackageInstalled("foo-bar"), jc.IsFalse)
   212  }