<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[146728] trunk/base/src/port1.0/tests/portactivate.test</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="https://trac.macports.org/changeset/146728">146728</a></dd>
<dt>Author</dt> <dd>cal@macports.org</dd>
<dt>Date</dt> <dd>2016-03-16 02:20:02 -0700 (Wed, 16 Mar 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>port1.0/tests: Do not req. root for activate_start

The activate_start test needs root privileges if we don't mock the
elevateToRoot function. Let's mock the function to avoid this requirement. The
same work should be continued for the currently failing activate_main test.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkbasesrcport10testsportactivatetest">trunk/base/src/port1.0/tests/portactivate.test</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkbasesrcport10testsportactivatetest"></a>
<div class="modfile"><h4>Modified: trunk/base/src/port1.0/tests/portactivate.test (146727 => 146728)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/base/src/port1.0/tests/portactivate.test        2016-03-16 07:48:43 UTC (rev 146727)
+++ trunk/base/src/port1.0/tests/portactivate.test        2016-03-16 09:20:02 UTC (rev 146728)
</span><span class="lines">@@ -19,38 +19,70 @@
</span><span class="cx"> macports_worker_init
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-test activate_start {
-    Activate start unit test.
-    Requires root for setting euid.
-} -constraints {
-    root
-} -setup {
</del><ins>+set activate_start_fixture_setup {
+    global prefix
+
+    set _save_prefix ${prefix}
+    file mkdir ${pwd}/tmpdir
+    set prefix ${pwd}/tmpdir
+
+    rename getuid _save_getuid
+    rename geteuid _save_geteuid
+
+    set fake_uid 0
+    set fake_euid 0
+    set elevateToRootCalls [list]
+
+    proc getuid {} {
+        global fake_uid
+        return ${fake_uid}
+    }
+    proc geteuid {} {
+        global fake_euid
+        return ${fake_euid}
+    }
+
+    proc elevateToRoot {phase} {
+        global elevateToRootCalls
+        lappend elevateToRootCalls $phase
+    }
+}
+set activate_start_fixture_cleanup {
+    rename getuid &quot;&quot;
+    rename geteuid &quot;&quot;
+
+    rename _save_getuid getuid
+    rename _save_geteuid geteuid
+
+    file delete -force ${pwd}/tmpdir
+}
+
+test activate_start_elevate {
+    Test portactivate::activate_start to make sure it elevates to root if necessary
+} -setup $activate_start_fixture_setup -cleanup $activate_start_fixture_cleanup -body {
</ins><span class="cx">     # file writable $prefix is used to determine whether privilege escalation
</span><span class="cx">     # is needed, so set prefix to a directory unwritable for this user
</span><span class="cx">     set prefix /usr/bin
</span><ins>+    set fake_uid 0
+    set fake_euid 500
</ins><span class="cx"> 
</span><del>-    # elevateToRoot uses $euid and $egid as the IDs to set
-    set euid 0
-    set egid 0
</del><ins>+    portactivate::activate_start
</ins><span class="cx"> 
</span><del>-} -body {
-    # drop privileges; the code won't attempt to elevate privileges without
-    # that
-    seteuid 333
-    if {[catch {portactivate::activate_start args}] != 0} {
-        return &quot;FAIL: couldn't elevate privileges&quot;
-    }
</del><ins>+    return ${elevateToRootCalls}
+} -result [list &quot;activate&quot;] -errorOutput &quot;&quot;
</ins><span class="cx"> 
</span><del>-    # when uid == 0 and euid == 0, the code will not attempt to elevate
-    # privileges
-    seteuid 0
-    if {[catch {portactivate::activate_start args}] != 0} {
-        return &quot;FAIL: couldn't elevate privileges&quot;
-    }
-    return &quot;Activate_start successful.&quot;
-} -result &quot;Activate_start successful.&quot;
</del><ins>+test activate_start_noelevate {
+    Test portactivate::activate_start to make sure that it does not elevate to root if it cannot
+} -setup $activate_start_fixture_setup -cleanup $activate_start_fixture_cleanup -body {
+    set fake_uid 500
+    set fake_euid 500
</ins><span class="cx"> 
</span><ins>+    portactivate::activate_start
</ins><span class="cx"> 
</span><ins>+    return ${elevateToRootCalls}
+} -result [list] -errorOutput &quot;&quot;
+
+
</ins><span class="cx"> test activate_main {
</span><span class="cx">     Activate main unit test.
</span><span class="cx"> } -constraints {
</span><span class="lines">@@ -100,7 +132,7 @@
</span><span class="cx">     array set macports::channels $oldchannels
</span><span class="cx"> 
</span><span class="cx">     mportclose $mport
</span><del>-} -result &quot;Port activate successful.&quot;
</del><ins>+} -result &quot;Port activate successful.&quot; -errorOutput &quot;&quot;
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> cleanupTests
</span></span></pre>
</div>
</div>

</body>
</html>