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 }