#
# @(#) Test the getent command returns domain/local users and groups
#

load_lib util-defs.exp
load_lib compile.exp
load_lib $srcdir/lib/nsswitch-config.exp

#
#   @(#) Test getent passwd returns domain users
#

set wbinfo_output [util_start "bin/wbinfo" "-u"]
set getent_output [util_start "getent" "passwd" ""]

if { ![regexp "$domain/" $getent_output] } {
    fail "no domain users in getent passwd"
    return
}

if { [regexp "Error" $wbinfo_output] } {
    fail "wbinfo -u failed"
    return
}

#
#   @(#) Test each user in the output of wbinfo is also in the output of
#   @(#) getent.
#

# Test wbinfo user names are in getent user names

foreach { user } [split $wbinfo_output "\n"] {

    verbose "looking for $user"

    set test_desc "getent passwd does not contain $user"

    if { ![regexp "$user" $getent_output] } {
        fail $test_desc
    } else {
        pass $test_desc
    }
}

# Test getent user names are in wbinfo user names

foreach { user } [split $getent_output "\n"] {

    set user_info [split $user ":"]
    set username [lindex $user_info 0]

    if { [regexp {^[^/]+/} $username] } {

	set test_desc "wbinfo -u does not contain $username"

	if { ![regexp "$username" $wbinfo_output] } {
	    fail $test_desc
	} else {
	    pass $test_desc
	}
    } else {
	verbose "ignoring non-domain user $username"
    }
}

#
#   @(#) Test each group in the output of wbinfo is also in the output of
#   @(#) getent.
#

set wbinfo_output [util_start "bin/wbinfo" "-g"]
set getent_output [util_start "getent" "group" ""]

if { ![regexp "$domain/" $getent_output] } {
    fail "no domain groups in getent passwd"
    return
}

if { [regexp "Error" $wbinfo_output] } {
    fail "wbinfo -g failed"
    return
}

# Test wbinfo group names are in getent group names

foreach { group } [split $wbinfo_output "\n"] {

    verbose "looking for $group"

    set test_desc "getent group does not contain $group"

    if { ![regexp "$group" $getent_output] } {
        fail $test_desc
    } else {
        pass $test_desc
    }
}

# Test getent group names are in wbinfo group names

foreach { group } [split $getent_output "\n"] {

    set group_info [split $group ":"]
    set groupname [lindex $group_info 0]

    if { [regexp {^[^/]+/} $groupname] } {

	set test_desc "wbinfo -g does not contain $groupname"

	if { ![regexp "$groupname" $wbinfo_output] } {
	    fail $test_desc
	} else {
	    pass $test_desc
	}
    } else {
	verbose "ignoring non-domain group $groupname"
    }
}

#
#   @(#) Test out of order and repeat calls of pwent functions
#   @(#) Test out of order and repeat calls of grent functions
#

set getent_tests [list \
	{ "out of order pwent operations" "getent_pwent" } \
	{ "out of order grent operations" "getent_grent" } \
	]

# Compile and run each test

foreach { test } $getent_tests {
    set test_desc [lindex $test 0]
    set test_file [lindex $test 1]

    simple_compile $test_file
    set output [util_start "$srcdir/$subdir/$test_file" ]

    if { [regexp "PASS" $output] } {
        pass $test_desc
        file delete "$srcdir/$subdir/$test_file" "$srcdir/$subdir/$test_file.o"
    } else {
        fail $test_desc
        puts $output
    }

}
