1: %%
    2: %% %CopyrightBegin%
    3: %% 
    4: %% Copyright Ericsson AB 1997-2012. All Rights Reserved.
    5: %% 
    6: %% The contents of this file are subject to the Erlang Public License,
    7: %% Version 1.1, (the "License"); you may not use this file except in
    8: %% compliance with the License. You should have received a copy of the
    9: %% Erlang Public License along with this software. If not, it can be
   10: %% retrieved online at http://www.erlang.org/.
   11: %% 
   12: %% Software distributed under the License is distributed on an "AS IS"
   13: %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
   14: %% the License for the specific language governing rights and limitations
   15: %% under the License.
   16: %% 
   17: %% %CopyrightEnd%
   18: %%
   19: -module(filename_SUITE).
   20: -export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, 
   21: 	 init_per_group/2,end_per_group/2]).
   22: -export([absname/1, absname_2/1, 
   23: 	 basename_1/1, basename_2/1,
   24: 	 dirname/1, extension/1, join/1, t_nativename/1]).
   25: -export([pathtype/1,rootname/1,split/1,find_src/1]).
   26: -export([absname_bin/1, absname_bin_2/1, 
   27: 	 basename_bin_1/1, basename_bin_2/1,
   28: 	 dirname_bin/1, extension_bin/1, join_bin/1, t_nativename_bin/1]).
   29: -export([pathtype_bin/1,rootname_bin/1,split_bin/1]).
   30: 
   31: -include_lib("test_server/include/test_server.hrl").
   32: 
   33: suite() -> [{ct_hooks,[ts_install_cth]}].
   34: 
   35: all() -> 
   36:     [absname, absname_2, basename_1, basename_2, dirname,
   37:      extension,
   38:      join, pathtype, rootname, split, t_nativename, find_src,
   39:      absname_bin, absname_bin_2, basename_bin_1, basename_bin_2, dirname_bin,
   40:      extension_bin,
   41:      join_bin, pathtype_bin, rootname_bin, split_bin, t_nativename_bin].
   42: 
   43: groups() -> 
   44:     [].
   45: 
   46: init_per_suite(Config) ->
   47:     Config.
   48: 
   49: end_per_suite(_Config) ->
   50:     ok.
   51: 
   52: init_per_group(_GroupName, Config) ->
   53:     Config.
   54: 
   55: end_per_group(_GroupName, Config) ->
   56:     Config.
   57: 
   58: 
   59: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   60: 
   61: absname(Config) when is_list(Config) ->
   62:     case os:type() of
   63: 	{win32, _} -> 
   64: 	    ?line [Drive|_] = ?config(priv_dir, Config),
   65: 	    ?line Temp = filename:join([Drive|":/"], "temp"),
   66: 	    ?line case file:make_dir(Temp) of
   67: 		      ok -> ok;
   68: 		      {error,eexist} -> ok
   69: 		  end,
   70: 	    ?line {ok,Cwd} = file:get_cwd(),
   71: 	    ?line ok = file:set_cwd(Temp),
   72: 	    ?line [Drive|":/temp/foo"] = filename:absname(foo),
   73: 	    ?line [Drive|":/temp/foo"] = filename:absname("foo"),
   74: 	    ?line [Drive|":/temp/../ebin"] = filename:absname("../ebin"),
   75: 	    ?line [Drive|":/erlang"] = filename:absname("/erlang"),
   76: 	    ?line [Drive|":/erlang/src"] = filename:absname("/erlang/src"),
   77: 	    ?line [Drive|":/erlang/src"] = filename:absname("\\erlang\\src"),
   78: 	    ?line [Drive|":/temp/erlang"] = filename:absname([Drive|":erlang"]),
   79: 	    ?line [Drive|":/temp/erlang/src"] =
   80: 		filename:absname([Drive|":erlang/src"]),
   81: 	    ?line [Drive|":/temp/erlang/src"] =
   82: 		filename:absname([Drive|":erlang\\src\\"]),
   83: 	    ?line "a:/erlang" = filename:absname("a:erlang"),
   84: 	    
   85: 	    ?line file:set_cwd([Drive|":/"]),
   86: 	    ?line [Drive|":/foo"] = filename:absname(foo),
   87: 	    ?line [Drive|":/foo"] = filename:absname("foo"),
   88: 	    ?line [Drive|":/../ebin"] = filename:absname("../ebin"),
   89: 	    ?line [Drive|":/erlang"] = filename:absname("/erlang"),
   90: 	    ?line [Drive|":/erlang/src"] = filename:absname("/erlang/src"),
   91: 	    ?line [Drive|":/erlang/src"] = filename:absname(["/erlang",'/src']),
   92: 	    ?line [Drive|":/erlang/src"] = filename:absname("\\erlang\\\\src"),
   93: 	    ?line [Drive|":/erlang"] = filename:absname([Drive|":erlang"]),
   94: 	    ?line [Drive|":/erlang/src"] = filename:absname([Drive|":erlang/src"]),
   95: 	    ?line "a:/erlang" = filename:absname("a:erlang"),
   96: 	    
   97: 	    ?line file:set_cwd(Cwd),
   98: 	    ok;
   99: 	{unix, _} ->  
  100: 	    ?line ok = file:set_cwd("/usr"),
  101: 	    ?line "/usr/foo" = filename:absname(foo),
  102: 	    ?line "/usr/foo" = filename:absname("foo"),
  103: 	    ?line "/usr/../ebin" = filename:absname("../ebin"),
  104: 	    
  105: 	    ?line file:set_cwd("/"),
  106: 	    ?line "/foo" = filename:absname(foo),
  107: 	    ?line "/foo" = filename:absname("foo"),
  108: 	    ?line "/../ebin" = filename:absname("../ebin"),
  109: 	    ?line "/erlang" = filename:absname("/erlang"),
  110: 	    ?line "/erlang/src" = filename:absname("/erlang/src"),
  111: 	    ?line "/erlang/src" = filename:absname(["/erl",'ang/s',"rc"]),
  112: 	    ?line "/erlang/src" = filename:absname(["/erl",'a','ng',"/",'s',"rc"]),
  113: 	    ?line "/erlang/src" = filename:absname("/erlang///src"),
  114: 	    ?line "/file_sorter.erl" = filename:absname([file_sorter|'.erl']),
  115: 	    ok
  116:     end.
  117: 
  118: 
  119: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  120: 
  121: absname_2(Config) when is_list(Config) ->
  122:     case os:type() of
  123: 	{win32, _} ->
  124: 	    ?line [Drive|_] = ?config(priv_dir, Config),
  125: 	    ?line [Drive|":/temp/foo"] = filename:absname(foo, [Drive|":/temp"]),
  126: 	    ?line [Drive|":/temp/foo"] = filename:absname("foo", [Drive|":/temp"]),
  127: 	    ?line [Drive|":/temp/../ebin"] = filename:absname("../ebin",
  128: 							      [Drive|":/temp"]),
  129: 	    ?line [Drive|":/erlang"] = filename:absname("/erlang", [Drive|":/temp"]),
  130: 	    ?line [Drive|":/erlang/src"] = filename:absname("/erlang/src",
  131: 							    [Drive|":/temp"]),
  132: 	    ?line [Drive|":/erlang/src"] = filename:absname("\\erlang\\src",
  133: 							    [Drive|":/temp"]),
  134: 	    ?line [Drive|":/temp/erlang"] = filename:absname([Drive|":erlang"],
  135: 							     [Drive|":/temp"]),
  136: 	    ?line [Drive|":/temp/erlang/src"] = filename:absname([Drive|":erlang/src"],
  137: 								 [Drive|":/temp"]),
  138: 	    ?line [Drive|":/temp/erlang/src"] =
  139: 		filename:absname([Drive|":erlang\\src\\"], [Drive|":/temp"]),
  140: 	    ?line "a:/erlang" = filename:absname("a:erlang", [Drive|":/temp"]),
  141: 	    
  142: 	    ?line file:set_cwd([Drive|":/"]),
  143: 	    ?line [Drive|":/foo"] = filename:absname(foo, [Drive|":/"]),
  144: 	    ?line [Drive|":/foo"] = filename:absname("foo", [Drive|":/"]),
  145: 	    ?line [Drive|":/../ebin"] = filename:absname("../ebin", [Drive|":/"]),
  146: 	    ?line [Drive|":/erlang"] = filename:absname("/erlang", [Drive|":/"]),
  147: 	    ?line [Drive|":/erlang/src"] = filename:absname("/erlang/src",
  148: 							    [Drive|":/"]),
  149: 	    ?line [Drive|":/erlang/src"] = filename:absname("\\erlang\\\\src",
  150: 							    [Drive|":/"]),
  151: 	    ?line [Drive|":/erlang"] = filename:absname([Drive|":erlang"],
  152: 							[Drive|":/"]),
  153: 	    ?line [Drive|":/erlang/src"] = filename:absname([Drive|":erlang/src"],
  154: 							    [Drive|":/"]),
  155: 	    ?line "a:/erlang" = filename:absname("a:erlang", [Drive|":/"]),
  156: 	    
  157: 	    ok;
  158: 	{unix, _} ->
  159: 	    ?line "/usr/foo" = filename:absname(foo, "/usr"),
  160: 	    ?line "/usr/foo" = filename:absname("foo", "/usr"),
  161: 	    ?line "/usr/../ebin" = filename:absname("../ebin", "/usr"),
  162: 	    
  163: 	    ?line "/foo" = filename:absname(foo, "/"),
  164: 	    ?line "/foo" = filename:absname("foo", "/"),
  165: 	    ?line "/../ebin" = filename:absname("../ebin", "/"),
  166: 	    ?line "/erlang" = filename:absname("/erlang", "/"),
  167: 	    ?line "/erlang/src" = filename:absname("/erlang/src", "/"),
  168: 	    ?line "/erlang/src" = filename:absname("/erlang///src", "/"),
  169: 	    ok
  170:     end.
  171: 
  172: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  173: 
  174: basename_1(Config) when is_list(Config) ->
  175:     ?line Dog = test_server:timetrap(test_server:seconds(10)),
  176:     ?line "." = filename:basename("."),
  177:     ?line "foo" = filename:basename("foo"),
  178:     ?line "foo" = filename:basename("/usr/foo"),
  179:     ?line "foo.erl" = filename:basename("A:usr/foo.erl"),
  180:     ?line "foo" = filename:basename('/usr/foo'),
  181:     ?line "foo" = filename:basename(["/usr","/","f","o","o"]),
  182:     ?line "foo" = filename:basename(["/usr/",foo]),
  183:     ?line "foo" = filename:basename(["/usr/f",oo]),
  184:     ?line "foo" = filename:basename(["usr/", "foo"]),
  185:     ?line "foo" = filename:basename(["usr/"|foo]),
  186:     ?line "foo" = filename:basename(["usr/foo/"]),
  187:     ?line case os:type() of
  188: 	      {win32, _} ->
  189: 		  ?line "foo" = filename:basename(["usr\\foo\\"]),
  190: 		  ?line "foo" = filename:basename("A:\\usr\\foo"),
  191: 		  ?line "foo" = filename:basename("A:foo");
  192: 	      {unix, _} ->
  193: 		  ?line "strange\\but\\true" =
  194: 		      filename:basename("strange\\but\\true")
  195: 	  end,
  196:     ?line test_server:timetrap_cancel(Dog),
  197:     ok.
  198: 
  199: basename_2(Config) when is_list(Config) ->
  200:     ?line Dog = test_server:timetrap(test_server:seconds(10)),
  201:     ?line "." = filename:basename(".", ".erl"),
  202:     ?line "foo" = filename:basename("foo.erl", ".erl"),
  203:     ?line "foo" = filename:basename('foo.erl', ".erl"),
  204:     ?line "foo" = filename:basename("foo.erl", '.erl'),
  205:     ?line "foo" = filename:basename(["/usr","/","f","oo"], ".erl"),
  206:     ?line "foo.erl" = filename:basename("/usr/foo.erl", ".hrl"),
  207:     ?line "foo.erl" = filename:basename("/usr.hrl/foo.erl", ".hrl"),
  208:     ?line "foo" = filename:basename("/usr.hrl/foo", ".hrl"),
  209:     ?line "foo" = filename:basename("usr/foo/", ".erl"),
  210:     ?line "foo.erl" = filename:basename("usr/foo.erl/", ".erl"),
  211:     ?line "foo.erl" = filename:basename("usr/foo.erl/", '.erl'),
  212:     ?line "foo" = filename:basename(["/usr",'/','f','oo'], ".erl"),
  213:     ?line "foo.erl" = filename:basename(["usr/foo.e",'rl/'], ".erl"),
  214:     ?line case os:type() of
  215: 	      {win32, _} ->
  216: 		  ?line "foo" = filename:basename("A:foo", ".erl"),
  217: 		  ?line "foo.erl" = filename:basename("a:\\usr\\foo.erl",
  218: 						      ".hrl"),
  219: 		  ?line "foo.erl" = filename:basename("c:\\usr.hrl\\foo.erl",
  220: 						      ".hrl"),
  221: 		  ?line "foo" = filename:basename("A:\\usr\\foo", ".hrl");
  222: 	      {unix, _} ->
  223: 		  ?line "strange\\but\\true" =
  224: 		      filename:basename("strange\\but\\true.erl", ".erl"),
  225: 		  ?line "strange\\but\\true" =
  226: 		      filename:basename("strange\\but\\true", ".erl")
  227: 	  end,
  228:     ?line test_server:timetrap_cancel(Dog),
  229:     ok.
  230: 
  231: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  232: 
  233: dirname(Config) when is_list(Config) ->
  234:     case os:type() of
  235:        {win32,_} ->
  236: 	    "A:/usr" = filename:dirname("A:/usr/foo.erl"),
  237: 	    "A:usr" = filename:dirname("A:usr/foo.erl"),
  238: 	    "/usr" = filename:dirname("\\usr\\foo.erl"),
  239: 	    "/" = filename:dirname("\\usr"),
  240: 	    "A:" = filename:dirname("A:");
  241: 	_ -> true
  242:     end,
  243:     "usr" = filename:dirname("usr///foo.erl"),
  244:     "." = filename:dirname("foo.erl"),
  245:     "." = filename:dirname("."),
  246:     "usr" = filename:dirname('usr/foo.erl'),
  247:     "usr" = filename:dirname(['usr','/foo.erl']),
  248:     "usr" = filename:dirname(['us','r/foo.erl']),
  249:     "usr" = filename:dirname(['usr/','/foo.erl']),
  250:     "usr" = filename:dirname(['usr/','foo.erl']),
  251:     "usr" = filename:dirname(['usr/'|'foo.erl']),
  252:     "usr" = filename:dirname(['usr/f','oo.erl']),
  253:     "/" = filename:dirname("/"),
  254:     "/" = filename:dirname("/usr"),
  255:     ok.
  256:     
  257: 
  258: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  259: 
  260: extension(Config) when is_list(Config) ->
  261:     ?line ".erl" = filename:extension("A:/usr/foo.erl"),
  262:     ?line ".erl" = filename:extension("A:/usr/foo.nisse.erl"),
  263:     ?line ".erl" = filename:extension(["A:/usr/", 'foo.ni', "sse.erl"]),
  264:     ?line ".erl" = filename:extension(["A:/usr/", 'foo.ni', "sse.e", 'rl']),
  265:     ?line ".erl" = filename:extension(["A:/usr/", 'foo.ni', "sse.e"|'rl']),
  266:     ?line ".erl" = filename:extension("A:/usr.bar/foo.nisse.erl"),
  267:     ?line "" = filename:extension("A:/usr.bar/foo"),
  268:     ?line "" = filename:extension("A:/usr/foo"),
  269:     ?line case os:type() of
  270: 	      {win32, _} ->
  271: 		  ?line "" = filename:extension("A:\\usr\\foo"),
  272: 		  ?line ".erl" =
  273: 		      filename:extension("A:/usr.bar/foo.nisse.erl"),
  274: 		  ?line "" = filename:extension("A:/usr.bar/foo"),
  275: 		  ok;
  276: 	      _ -> ok
  277: 	  end.
  278: 
  279: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  280:     
  281: join(Config) when is_list(Config) ->
  282:     ?line "/" = filename:join(["/"]),
  283:     ?line "/" = filename:join(["//"]),
  284:     ?line "usr/foo.erl" = filename:join("usr","foo.erl"),
  285:     ?line "/src/foo.erl" = filename:join(usr, "/src/foo.erl"),
  286:     ?line "/src/foo.erl" = filename:join(["/src/",'foo.erl']),
  287:     ?line "/src/foo.erl" = filename:join(usr, ["/sr", 'c/foo.erl']),
  288:     ?line "/src/foo.erl" = filename:join("usr", "/src/foo.erl"),
  289: 
  290:     %% Make sure that redundant slashes work too.
  291:     ?line "a/b/c/d/e/f/g" = filename:join(["a//b/c/////d//e/f/g"]),
  292:     ?line "a/b/c/d/e/f/g" = filename:join(["a//b/c/", "d//e/f/g"]),
  293:     ?line "a/b/c/d/e/f/g" = filename:join(["a//b/c", "d//e/f/g"]),
  294:     ?line "/d/e/f/g" = filename:join(["a//b/c", "/d//e/f/g"]),
  295:     ?line "/d/e/f/g" = filename:join(["a//b/c", "//d//e/f/g"]),
  296: 
  297:     ?line "foo/bar" = filename:join([$f,$o,$o,$/,[]], "bar"),
  298: 
  299:     ?line case os:type() of
  300: 	      {win32, _} ->
  301: 		  ?line "d:/" = filename:join(["D:/"]),
  302: 		  ?line "d:/" = filename:join(["D:\\"]),
  303: 		  ?line "d:/abc" = filename:join(["D:/", "abc"]),
  304: 		  ?line "d:abc" = filename:join(["D:", "abc"]),
  305: 		  ?line "a/b/c/d/e/f/g" =
  306: 		      filename:join(["a//b\\c//\\/\\d/\\e/f\\g"]),
  307: 		  ?line "a:usr/foo.erl" =
  308: 		      filename:join(["A:","usr","foo.erl"]),
  309: 		  ?line "/usr/foo.erl" =
  310: 		      filename:join(["A:","/usr","foo.erl"]),
  311: 		  ?line "c:usr" = filename:join("A:","C:usr"),
  312: 		  ?line "a:usr" = filename:join("A:","usr"),
  313: 		  ?line "c:/usr" = filename:join("A:", "C:/usr"),
  314: 		  ?line "c:/usr/foo.erl" =
  315: 		      filename:join(["A:","C:/usr","foo.erl"]),
  316: 		  ?line "c:usr/foo.erl" =
  317: 		      filename:join(["A:","C:usr","foo.erl"]),
  318: 		  ?line "d:/foo" = filename:join([$D, $:, $/, []], "foo"),
  319: 		  ok;
  320: 	      {unix, _} ->
  321: 		  ok
  322: 	  end.
  323: 
  324: pathtype(Config) when is_list(Config) ->
  325:     ?line relative = filename:pathtype(".."),
  326:     ?line relative = filename:pathtype("foo"),
  327:     ?line relative = filename:pathtype("foo/bar"),
  328:     ?line relative = filename:pathtype('foo/bar'),
  329:     ?line relative = filename:pathtype(['f','oo',"/bar"]),
  330:     case os:type() of
  331: 	{win32, _} ->
  332: 	    ?line volumerelative = filename:pathtype("/usr/local/bin"),
  333: 	    ?line volumerelative = filename:pathtype("A:usr/local/bin"),
  334: 	    ok;
  335: 	{unix, _} ->
  336: 	    ?line absolute = filename:pathtype("/"),
  337: 	    ?line absolute = filename:pathtype("/usr/local/bin"),
  338: 	    ok
  339:     end.
  340: 
  341: rootname(Config) when is_list(Config) ->
  342:     ?line "/jam.src/kalle" = filename:rootname("/jam.src/kalle"),
  343:     ?line "/jam.src/foo" = filename:rootname("/jam.src/foo.erl"),
  344:     ?line "/jam.src/foo" = filename:rootname(["/ja",'m.sr',"c/foo.erl"]),
  345:     ?line "/jam.src/foo" = filename:rootname("/jam.src/foo.erl", ".erl"),
  346:     ?line "/jam.src/foo.jam" = filename:rootname("/jam.src/foo.jam", ".erl"),
  347:     ?line "/jam.src/foo.jam" = filename:rootname(["/jam.sr",'c/foo.j',"am"],".erl"),
  348:     ?line "/jam.src/foo.jam" = filename:rootname(["/jam.sr",'c/foo.j'|am],".erl"),
  349:     ok.
  350: 
  351: split(Config) when is_list(Config) ->
  352:     ?line ["/","usr","local","bin"] = filename:split("/usr/local/bin"),
  353:     ?line ["foo","bar"]= filename:split("foo/bar"),
  354:     ?line ["foo", "bar", "hello"]= filename:split("foo////bar//hello"),
  355:     ?line ["foo", "bar", "hello"]= filename:split(["foo//",'//bar//h',"ello"]),
  356:     ?line ["foo", "bar", "hello"]= filename:split(["foo//",'//bar//h'|ello]),
  357:     case os:type() of
  358:        {win32,_} ->
  359: 	    ?line ["a:/","msdev","include"] =
  360: 		filename:split("a:/msdev/include"),
  361: 	    ?line ["a:/","msdev","include"] =
  362: 		filename:split("A:/msdev/include"),
  363: 	    ?line ["msdev","include"] =
  364: 		filename:split("msdev\\include"),
  365: 	    ?line ["a:/","msdev","include"] =
  366: 		filename:split("a:\\msdev\\include"),
  367: 	    ?line ["a:","msdev","include"] =
  368: 		filename:split("a:msdev\\include"),
  369: 	    ok;
  370:        _ ->
  371: 	    ok
  372:     end.
  373: 
  374: t_nativename(Config) when is_list(Config) ->
  375:     ?line "abcedf" = filename:nativename(abcedf),
  376:     ?line "abcedf" = filename:nativename(["abc", "edf"]),
  377:     ?line "abcgluff" = filename:nativename(["abc", gluff]),
  378:     case os:type() of
  379: 	{win32, _} ->
  380: 	    ?line "a:\\temp\\arne.exe" =
  381: 		filename:nativename("A:/temp//arne.exe/");
  382: 	_ ->
  383: 	    ?line "/usr/tmp/arne" =
  384: 		filename:nativename("/usr/tmp//arne/")
  385:     end.
  386: 
  387: find_src(Config) when is_list(Config) ->
  388:     ?line {Source,_} = filename:find_src(file),
  389:     ?line ["file"|_] = lists:reverse(filename:split(Source)),
  390:     ?line {_,_} = filename:find_src(init, [{".","."}, {"ebin","src"}]),
  391:     
  392:     %% Try to find the source for a preloaded module.
  393:     ?line {error,{preloaded,init}} = filename:find_src(init),
  394: 
  395:     %% Make sure that find_src works for a slim BEAM file.
  396:     OldPath = code:get_path(),
  397:     try
  398: 	PrivDir = ?config(priv_dir, Config),
  399: 	code:add_patha(PrivDir),
  400: 	Src = "simple",
  401: 	SrcPath = filename:join(PrivDir, Src) ++ ".erl",
  402: 	SrcContents = "-module(simple).\n",
  403: 	ok = file:write_file(SrcPath, SrcContents),
  404: 	{ok,simple} = compile:file(SrcPath, [slim,{outdir,PrivDir}]),
  405: 	BeamPath = filename:join(PrivDir, Src),
  406: 	{BeamPath,[]} = filename:find_src(simple)
  407:     after
  408: 	code:set_path(OldPath)
  409:     end,
  410:     ok.
  411: 
  412: %%
  413: %%
  414: %% With binaries
  415: %%
  416: %%
  417: 
  418: absname_bin(Config) when is_list(Config) ->
  419:     case os:type() of
  420: 	{win32, _} -> 
  421: 	    ?line [Drive|_] = ?config(priv_dir, Config),
  422: 	    ?line Temp = filename:join([Drive|":/"], "temp"),
  423: 	    ?line case file:make_dir(Temp) of
  424: 		      ok -> ok;
  425: 		      {error,eexist} -> ok
  426: 		  end,
  427: 	    ?line {ok,Cwd} = file:get_cwd(),
  428: 	    ?line ok = file:set_cwd(Temp),
  429: 	    ?line <<Drive:8,":/temp/foo">> = filename:absname(<<"foo">>),
  430: 	    ?line <<Drive:8,":/temp/../ebin">> = filename:absname(<<"../ebin">>),
  431: 	    ?line <<Drive:8,":/erlang">> = filename:absname(<<"/erlang">>),
  432: 	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"/erlang/src">>),
  433: 	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"\\erlang\\src">>),
  434: 	    ?line <<Drive:8,":/temp/erlang">> = filename:absname(<<Drive:8,":erlang">>),
  435: 	    ?line <<Drive:8,":/temp/erlang/src">> =
  436: 		filename:absname(<<Drive:8,":erlang/src">>),
  437: 	    ?line <<Drive:8,":/temp/erlang/src">> =
  438: 		filename:absname(<<Drive:8,":erlang\\src\\">>),
  439: 	    ?line <<"a:/erlang">> = filename:absname(<<"a:erlang">>),
  440: 	    
  441: 	    ?line file:set_cwd(<<Drive:8,":/">>),
  442: 	    ?line <<Drive:8,":/foo">> = filename:absname(<<"foo">>),
  443: 	    ?line <<Drive:8,":/../ebin">> = filename:absname(<<"../ebin">>),
  444: 	    ?line <<Drive:8,":/erlang">> = filename:absname(<<"/erlang">>),
  445: 	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"/erlang/src">>),
  446: 	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"\\erlang\\\\src">>),
  447: 	    ?line <<Drive:8,":/erlang">> = filename:absname(<<Drive:8,":erlang">>),
  448: 	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<Drive:8,":erlang/src">>),
  449: 	    ?line <<"a:/erlang">> = filename:absname(<<"a:erlang">>),
  450: 	    
  451: 	    ?line file:set_cwd(Cwd),
  452: 	    ok;
  453: 	{unix, _} ->  
  454: 	    ?line ok = file:set_cwd(<<"/usr">>),
  455: 	    ?line <<"/usr/foo">> = filename:absname(<<"foo">>),
  456: 	    ?line <<"/usr/../ebin">> = filename:absname(<<"../ebin">>),
  457: 	    
  458: 	    ?line file:set_cwd(<<"/">>),
  459: 	    ?line <<"/foo">> = filename:absname(<<"foo">>),
  460: 	    ?line <<"/../ebin">> = filename:absname(<<"../ebin">>),
  461: 	    ?line <<"/erlang">> = filename:absname(<<"/erlang">>),
  462: 	    ?line <<"/erlang/src">> = filename:absname(<<"/erlang/src">>),
  463: 	    ?line <<"/erlang/src">> = filename:absname(<<"/erlang///src">>),
  464: 	    ok
  465:     end.
  466: 
  467: 
  468: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  469: 
  470: absname_bin_2(Config) when is_list(Config) ->
  471:     case os:type() of
  472: 	{win32, _} ->
  473: 	    ?line [Drive|_] = ?config(priv_dir, Config),
  474: 	    ?line <<Drive:8,":/temp/foo">> = filename:absname(<<"foo">>, <<Drive:8,":/temp">>),
  475: 	    ?line <<Drive:8,":/temp/../ebin">> = filename:absname(<<"../ebin">>,
  476: 							      <<Drive:8,":/temp">>),
  477: 	    ?line <<Drive:8,":/erlang">> = filename:absname(<<"/erlang">>, <<Drive:8,":/temp">>),
  478: 	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"/erlang/src">>,
  479: 							    <<Drive:8,":/temp">>),
  480: 	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"\\erlang\\src">>,
  481: 							    <<Drive:8,":/temp">>),
  482: 	    ?line <<Drive:8,":/temp/erlang">> = filename:absname(<<Drive:8,":erlang">>,
  483: 							     <<Drive:8,":/temp">>),
  484: 	    ?line <<Drive:8,":/temp/erlang/src">> = filename:absname(<<Drive:8,":erlang/src">>,
  485: 								 <<Drive:8,":/temp">>),
  486: 	    ?line <<Drive:8,":/temp/erlang/src">> =
  487: 		filename:absname(<<Drive:8,":erlang\\src\\">>, <<Drive:8,":/temp">>),
  488: 	    ?line <<"a:/erlang">> = filename:absname(<<"a:erlang">>, <<Drive:8,":/temp">>),
  489: 	    
  490: 	    ?line file:set_cwd(<<Drive:8,":/">>),
  491: 	    ?line <<Drive:8,":/foo">> = filename:absname(foo, <<Drive:8,":/">>),
  492: 	    ?line <<Drive:8,":/foo">> = filename:absname(<<"foo">>, <<Drive:8,":/">>),
  493: 	    ?line <<Drive:8,":/../ebin">> = filename:absname(<<"../ebin">>, <<Drive:8,":/">>),
  494: 	    ?line <<Drive:8,":/erlang">> = filename:absname(<<"/erlang">>, <<Drive:8,":/">>),
  495: 	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"/erlang/src">>,
  496: 							    <<Drive:8,":/">>),
  497: 	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"\\erlang\\\\src">>,
  498: 							    <<Drive:8,":/">>),
  499: 	    ?line <<Drive:8,":/erlang">> = filename:absname(<<Drive:8,":erlang">>,
  500: 							<<Drive:8,":/">>),
  501: 	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<Drive:8,":erlang/src">>,
  502: 							    <<Drive:8,":/">>),
  503: 	    ?line <<"a:/erlang">> = filename:absname(<<"a:erlang">>, <<Drive:8,":/">>),
  504: 	    
  505: 	    ok;
  506: 	{unix, _} ->
  507: 	    ?line <<"/usr/foo">> = filename:absname(<<"foo">>, <<"/usr">>),
  508: 	    ?line <<"/usr/../ebin">> = filename:absname(<<"../ebin">>, <<"/usr">>),
  509: 	    
  510: 	    ?line <<"/foo">> = filename:absname(<<"foo">>, <<"/">>),
  511: 	    ?line <<"/../ebin">> = filename:absname(<<"../ebin">>, <<"/">>),
  512: 	    ?line <<"/erlang">> = filename:absname(<<"/erlang">>, <<"/">>),
  513: 	    ?line <<"/erlang/src">> = filename:absname(<<"/erlang/src">>, <<"/">>),
  514: 	    ?line <<"/erlang/src">> = filename:absname(<<"/erlang///src">>, <<"/">>),
  515: 	    ok
  516:     end.
  517: 
  518: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  519: 
  520: basename_bin_1(Config) when is_list(Config) ->
  521:     ?line Dog = test_server:timetrap(test_server:seconds(10)),
  522:     ?line <<".">> = filename:basename(<<".">>),
  523:     ?line <<"foo">> = filename:basename(<<"foo">>),
  524:     ?line <<"foo">> = filename:basename(<<"/usr/foo">>),
  525:     ?line <<"foo.erl">> = filename:basename(<<"A:usr/foo.erl">>),
  526:     ?line case os:type() of
  527: 	      {win32, _} ->
  528: 		  ?line <<"foo">> = filename:basename(<<"A:\\usr\\foo">>),
  529: 		  ?line <<"foo">> = filename:basename(<<"A:foo">>);
  530: 	      {unix, _} ->
  531: 		  ?line <<"strange\\but\\true">> =
  532: 		      filename:basename(<<"strange\\but\\true">>)
  533: 	  end,
  534:     ?line test_server:timetrap_cancel(Dog),
  535:     ok.
  536: 
  537: basename_bin_2(Config) when is_list(Config) ->
  538:     ?line Dog = test_server:timetrap(test_server:seconds(10)),
  539:     ?line <<".">> = filename:basename(<<".">>, <<".erl">>),
  540:     ?line <<"foo">> = filename:basename(<<"foo.erl">>, <<".erl">>),
  541:     ?line <<"foo.erl">> = filename:basename(<<"/usr/foo.erl">>, <<".hrl">>),
  542:     ?line <<"foo.erl">> = filename:basename(<<"/usr.hrl/foo.erl">>, <<".hrl">>),
  543:     ?line <<"foo">> = filename:basename(<<"/usr.hrl/foo">>, <<".hrl">>),
  544:     ?line <<"foo">> = filename:basename(<<"usr/foo/">>, <<".erl">>),
  545:     ?line <<"foo.erl">> = filename:basename(<<"usr/foo.erl/">>, <<".erl">>),
  546:     ?line case os:type() of
  547: 	      {win32, _} ->
  548: 		  ?line <<"foo">> = filename:basename(<<"A:foo">>, <<".erl">>),
  549: 		  ?line <<"foo.erl">> = filename:basename(<<"a:\\usr\\foo.erl">>,
  550: 						      <<".hrl">>),
  551: 		  ?line <<"foo.erl">> = filename:basename(<<"c:\\usr.hrl\\foo.erl">>,
  552: 						      <<".hrl">>),
  553: 		  ?line <<"foo">> = filename:basename(<<"A:\\usr\\foo">>, <<".hrl">>);
  554: 	      {unix, _} ->
  555: 		  ?line <<"strange\\but\\true">> =
  556: 		      filename:basename(<<"strange\\but\\true.erl">>, <<".erl">>),
  557: 		  ?line <<"strange\\but\\true">> =
  558: 		      filename:basename(<<"strange\\but\\true">>, <<".erl">>)
  559: 	  end,
  560:     ?line test_server:timetrap_cancel(Dog),
  561:     ok.
  562: 
  563: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  564: 
  565: dirname_bin(Config) when is_list(Config) ->
  566:     case os:type() of
  567:        {win32,_} ->
  568: 	    <<"A:/usr">> = filename:dirname(<<"A:/usr/foo.erl">>),
  569: 	    <<"A:usr">> = filename:dirname(<<"A:usr/foo.erl">>),
  570: 	    <<"/usr">> = filename:dirname(<<"\\usr\\foo.erl">>),
  571: 	    <<"/">> = filename:dirname(<<"\\usr">>),
  572: 	    <<"A:">> = filename:dirname(<<"A:">>);
  573: 	_ -> true
  574:     end,
  575:     <<"usr">> = filename:dirname(<<"usr///foo.erl">>),
  576:     <<".">> = filename:dirname(<<"foo.erl">>),
  577:     <<".">> = filename:dirname(<<".">>),
  578:     <<"/">> = filename:dirname(<<"/">>),
  579:     <<"/">> = filename:dirname(<<"/usr">>),
  580:     ok.
  581:     
  582: 
  583: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  584: 
  585: extension_bin(Config) when is_list(Config) ->
  586:     <<".erl">> = filename:extension(<<"A:/usr/foo.erl">>),
  587:     <<".erl">> = filename:extension(<<"A:/usr/foo.nisse.erl">>),
  588:     <<".erl">> = filename:extension(<<"A:/usr.bar/foo.nisse.erl">>),
  589:     <<"">> = filename:extension(<<"A:/usr.bar/foo">>),
  590:     <<"">> = filename:extension(<<"A:/usr/foo">>),
  591:     case os:type() of
  592:         {win32, _} ->
  593:             ?line <<"">> = filename:extension(<<"A:\\usr\\foo">>),
  594:             ?line <<".erl">> =
  595:                 filename:extension(<<"A:/usr.bar/foo.nisse.erl">>),
  596:             ?line <<"">> = filename:extension(<<"A:/usr.bar/foo">>),
  597:             ok;
  598:         _ -> ok
  599:     end.
  600: 
  601: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  602:     
  603: join_bin(Config) when is_list(Config) ->
  604:     ?line <<"/">> = filename:join([<<"/">>]),
  605:     ?line <<"/">> = filename:join([<<"//">>]),
  606:     ?line <<"usr/foo.erl">> = filename:join(<<"usr">>,<<"foo.erl">>),
  607:     ?line <<"/src/foo.erl">> = filename:join(usr, <<"/src/foo.erl">>),
  608:     ?line <<"/src/foo.erl">> = filename:join([<<"/src/">>,'foo.erl']),
  609:     ?line <<"/src/foo.erl">> = filename:join(<<"usr">>, ["/sr", 'c/foo.erl']),
  610:     ?line <<"/src/foo.erl">> = filename:join(<<"usr">>, <<"/src/foo.erl">>),
  611: 
  612:     %% Make sure that redundant slashes work too.
  613:     ?line <<"a/b/c/d/e/f/g">> = filename:join([<<"a//b/c/////d//e/f/g">>]),
  614:     ?line <<"a/b/c/d/e/f/g">> = filename:join([<<"a//b/c/">>, <<"d//e/f/g">>]),
  615:     ?line <<"a/b/c/d/e/f/g">> = filename:join([<<"a//b/c">>, <<"d//e/f/g">>]),
  616:     ?line <<"/d/e/f/g">> = filename:join([<<"a//b/c">>, <<"/d//e/f/g">>]),
  617:     ?line <<"/d/e/f/g">> = filename:join([<<"a//b/c">>, <<"//d//e/f/g">>]),
  618: 
  619:     ?line <<"foo/bar">> = filename:join([$f,$o,$o,$/,[]], <<"bar">>),
  620: 
  621:     ?line case os:type() of
  622: 	      {win32, _} ->
  623: 		  ?line <<"d:/">> = filename:join([<<"D:/">>]),
  624: 		  ?line <<"d:/">> = filename:join([<<"D:\\">>]),
  625: 		  ?line <<"d:/abc">> = filename:join([<<"D:/">>, <<"abc">>]),
  626: 		  ?line <<"d:abc">> = filename:join([<<"D:">>, <<"abc">>]),
  627: 		  ?line <<"a/b/c/d/e/f/g">> =
  628: 		      filename:join([<<"a//b\\c//\\/\\d/\\e/f\\g">>]),
  629: 		  ?line <<"a:usr/foo.erl">> =
  630: 		      filename:join([<<"A:">>,<<"usr">>,<<"foo.erl">>]),
  631: 		  ?line <<"/usr/foo.erl">> =
  632: 		      filename:join([<<"A:">>,<<"/usr">>,<<"foo.erl">>]),
  633: 		  ?line <<"c:usr">> = filename:join(<<"A:">>,<<"C:usr">>),
  634: 		  ?line <<"a:usr">> = filename:join(<<"A:">>,<<"usr">>),
  635: 		  ?line <<"c:/usr">> = filename:join(<<"A:">>, <<"C:/usr">>),
  636: 		  ?line <<"c:/usr/foo.erl">> =
  637: 		      filename:join([<<"A:">>,<<"C:/usr">>,<<"foo.erl">>]),
  638: 		  ?line <<"c:usr/foo.erl">> =
  639: 		      filename:join([<<"A:">>,<<"C:usr">>,<<"foo.erl">>]),
  640: 		  ?line <<"d:/foo">> = filename:join([$D, $:, $/, []], <<"foo">>),
  641: 		  ok;
  642: 	      {unix, _} ->
  643: 		  ok
  644: 	  end.
  645: 
  646: pathtype_bin(Config) when is_list(Config) ->
  647:     relative = filename:pathtype(<<"..">>),
  648:     relative = filename:pathtype(<<"foo">>),
  649:     relative = filename:pathtype(<<"foo/bar">>),
  650:     relative = filename:pathtype('foo/bar'),
  651:     case os:type() of
  652: 	{win32, _} ->
  653: 	    volumerelative = filename:pathtype(<<"/usr/local/bin">>),
  654: 	    volumerelative = filename:pathtype(<<"A:usr/local/bin">>),
  655: 	    ok;
  656: 	{unix, _} ->
  657: 	    absolute = filename:pathtype(<<"/">>),
  658: 	    absolute = filename:pathtype(<<"/usr/local/bin">>),
  659: 	    ok
  660:     end.
  661: 
  662: rootname_bin(Config) when is_list(Config) ->
  663:     <<"/jam.src/kalle">> = filename:rootname(<<"/jam.src/kalle">>),
  664:     <<"/jam.src/foo">> = filename:rootname(<<"/jam.src/foo.erl">>),
  665:     <<"/jam.src/foo">> = filename:rootname(<<"/jam.src/foo.erl">>, <<".erl">>),
  666:     <<"/jam.src/foo.jam">> = filename:rootname(<<"/jam.src/foo.jam">>, <<".erl">>),
  667:     <<"/jam.src/foo.jam">> = filename:rootname(["/jam.sr",'c/foo.j',"am"],<<".erl">>),
  668:     <<"/jam.src/foo.jam">> = filename:rootname(["/jam.sr",'c/foo.j'|am],<<".erl">>),
  669:     ok.
  670: 
  671: split_bin(Config) when is_list(Config) ->
  672:     [<<"/">>,<<"usr">>,<<"local">>,<<"bin">>] = filename:split(<<"/usr/local/bin">>),
  673:     [<<"foo">>,<<"bar">>]= filename:split(<<"foo/bar">>),
  674:     [<<"foo">>, <<"bar">>, <<"hello">>]= filename:split(<<"foo////bar//hello">>),
  675:     case os:type() of
  676:        {win32,_} ->
  677: 	    [<<"a:/">>,<<"msdev">>,<<"include">>] =
  678: 		filename:split(<<"a:/msdev/include">>),
  679: 	    [<<"a:/">>,<<"msdev">>,<<"include">>] =
  680: 		filename:split(<<"A:/msdev/include">>),
  681: 	    [<<"msdev">>,<<"include">>] =
  682: 		filename:split(<<"msdev\\include">>),
  683: 	    [<<"a:/">>,<<"msdev">>,<<"include">>] =
  684: 		filename:split(<<"a:\\msdev\\include">>),
  685: 	    [<<"a:">>,<<"msdev">>,<<"include">>] =
  686: 		filename:split(<<"a:msdev\\include">>),
  687: 	    ok;
  688:        _ ->
  689: 	    ok
  690:     end.
  691: 
  692: t_nativename_bin(Config) when is_list(Config) ->
  693:     ?line <<"abcedf">> = filename:nativename(<<"abcedf">>),
  694:     case os:type() of
  695: 	{win32, _} ->
  696: 	    ?line <<"a:\\temp\\arne.exe">> =
  697: 		filename:nativename(<<"A:/temp//arne.exe/">>);
  698: 	_ ->
  699: 	    ?line <<"/usr/tmp/arne">> =
  700: 		filename:nativename(<<"/usr/tmp//arne/">>)
  701:     end.