1require_relative '../../spec_helper'
2
3describe "Process.euid" do
4  it "returns the effective user ID for this process" do
5    Process.euid.should be_kind_of(Fixnum)
6  end
7
8  it "also goes by Process::UID.eid" do
9    Process::UID.eid.should == Process.euid
10  end
11
12  it "also goes by Process::Sys.geteuid" do
13    Process::Sys.geteuid.should == Process.euid
14  end
15end
16
17describe "Process.euid=" do
18
19  platform_is_not :windows do
20    it "raises TypeError if not passed an Integer" do
21      lambda { Process.euid = Object.new }.should raise_error(TypeError)
22    end
23
24    as_user do
25      it "raises Errno::ERPERM if run by a non superuser trying to set the superuser id" do
26        lambda { (Process.euid = 0)}.should raise_error(Errno::EPERM)
27      end
28
29      it "raises Errno::ERPERM if run by a non superuser trying to set the superuser id from username" do
30        lambda { Process.euid = "root" }.should raise_error(Errno::EPERM)
31      end
32    end
33
34    as_superuser do
35      describe "if run by a superuser" do
36        with_feature :fork do
37          it "sets the effective user id for the current process if run by a superuser" do
38            read, write = IO.pipe
39            pid = Process.fork do
40              begin
41                read.close
42                Process.euid = 1
43                write << Process.euid
44                write.close
45              rescue Exception => e
46                write << e << e.backtrace
47              end
48              Process.exit!
49            end
50            write.close
51            euid = read.gets
52            euid.should == "1"
53            Process.wait pid
54          end
55        end
56      end
57    end
58  end
59end
60