xref: /openbsd/gnu/usr.bin/perl/cpan/Win32/t/GetOSName.t (revision d415bd75)
1use strict;
2use Test::More;
3use Win32;
4
5# The "description" value is extracted from the $pretty field:
6#
7#     "2000 [Server]" => "Server"
8#     "{Home Server}" => "Windows Home Server" (prefixed with "Windows ")
9#     "Anything R2"   => "R2 Anything"         (R2 moved to front)
10#
11# The "display name" value is the same as the $pretty field,
12# prefixed by "Windows ", with all "[]{}" characters removed.
13
14# $pretty, $os $id, $major, $minor, $sm, $pt, $metric
15
16my @intel_tests = (
17["Win32s",                          "Win32s",  0                     ],
18
19["95",                              "95",      1, 4, 0               ],
20["98",                              "98",      1, 4, 10              ],
21["Me",                              "Me",      1, 4, 90              ],
22
23["NT 3.51",                         "NT3.51",  2, 3, 51              ],
24["NT 4",                            "NT4",     2, 4, 0               ],
25
26["2000 [Professional]",             "2000",    2, 5, 0, 0x0000, 1,  0],
27["2000 [Server]",                   "2000",    2, 5, 0, 0x0000, 2,  0],
28["[Small Business Server] 2000",    "2000",    2, 5, 0, 0x0020, 2,  0],
29["2000 [Advanced Server]",          "2000",    2, 5, 0, 0x0002, 2,  0],
30["2000 [Datacenter Server]",        "2000",    2, 5, 0, 0x0080, 2,  0],
31
32["XP [Home Edition]",               "XP/.Net", 2, 5, 1, 0x0200, 1,  0],
33["XP [Professional]",               "XP/.Net", 2, 5, 1, 0x0000, 1,  0],
34["XP [Tablet PC Edition]",          "XP/.Net", 2, 5, 1, 0x0000, 1, 86],
35["XP [Media Center Edition]",       "XP/.Net", 2, 5, 1, 0x0000, 1, 87],
36["XP [Starter Edition]",            "XP/.Net", 2, 5, 1, 0x0000, 1, 88],
37
38["2003 [Standard Edition]",         "2003",    2, 5, 2, 0x0000, 2,  0],
39["[Small Business Server] 2003",    "2003",    2, 5, 2, 0x0020, 2,  0],
40["{Storage Server} 2003",           "2003",    2, 5, 2, 0x2000, 2,  0],
41["{Home Server}",                   "2003",    2, 5, 2, 0x8000, 2,  0],
42
43["{Compute Cluster Server} 2003",   "2003",    2, 5, 2, 0x4000, 2,  0],
44["2003 [Datacenter Edition]",       "2003",    2, 5, 2, 0x0080, 2,  0],
45["2003 [Enterprise Edition]",       "2003",    2, 5, 2, 0x0002, 2,  0],
46["2003 [Web Edition]",              "2003",    2, 5, 2, 0x0400, 2,  0],
47
48["2003 [R2 Standard Edition]",      "2003",    2, 5, 2, 0x0000, 2, 89],
49["[Small Business Server] 2003 R2", "2003",    2, 5, 2, 0x0020, 2, 89],
50["{Storage Server} 2003 R2",        "2003",    2, 5, 2, 0x2000, 2, 89],
51# ??? test for more R2 versions?
52);
53
54my @amd64_tests = (
55["{XP Professional x64 Edition}",   "2003",    2, 5, 2, 0x0000, 1,  0],
56["2003 [Datacenter x64 Edition]",   "2003",    2, 5, 2, 0x0080, 2,  0],
57["2003 [Enterprise x64 Edition]",   "2003",    2, 5, 2, 0x0002, 2,  0],
58["2003 [Standard x64 Edition]",     "2003",    2, 5, 2, 0x0000, 2,  0],
59);
60
61my @dual_tests = (
62["Vista",                           "Vista",   2, 6, 0               ],
63
64["Vista [Starter]",                 "Vista",   2, 6, 0, 0x0b         ],
65["Vista [Home Basic]",              "Vista",   2, 6, 0, 0x02         ],
66["Vista [Home Premium]",            "Vista",   2, 6, 0, 0x03         ],
67["Vista [Business]",                "Vista",   2, 6, 0, 0x06         ],
68["Vista [Enterprise]",              "Vista",   2, 6, 0, 0x04         ],
69["Vista [Ultimate]",                "Vista",   2, 6, 0, 0x01         ],
70
71#["Vista Business for Embedded Systems", "Vista",   2, 6, 0           ],
72#["Vista Ultimate for Embedded Systems", "Vista",   2, 6, 0           ],
73
74["2008 [Standard]",                 "2008",    2, 6, 0, 0x07, 2      ],
75["2008 [Enterprise]",               "2008",    2, 6, 0, 0x04, 2      ],
76["[HPC Server] 2008",               "2008",    2, 6, 0, 0x12, 2      ],
77["[Web Server] 2008",               "2008",    2, 6, 0, 0x11, 2      ],
78#["[Storage Server] 2008",           "2008",    2, 6, 0, ????, 2      ],
79["[Small Business Server] 2008",    "2008",    2, 6, 0, 0x09, 2,  0  ],
80
81#    * Windows Server 2008 Standard (x86 and x86-64)
82#    * Windows Server 2008 Enterprise (x86 and x86-64)
83#    * Windows HPC Server 2008 (replacing Windows Compute Cluster Server 2003)
84#    * Windows Web Server 2008 (x86 and x86-64)
85#    * Windows Storage Server 2008 (x86 and x86-64)
86#    * Windows Small Business Server 2008 (Codenamed "Cougar") (x86-64) for small businesses
87#    * Windows Essential Business Server 2008 (Codenamed "Centro") (x86-64) for medium-sized businesses [25]
88#    * Windows Server 2008 for Itanium-based Systems
89#    * Windows Server 2008 Foundation
90#
91# Server Core is available in the Web, Standard, Enterprise and Datacenter editions.
92
93["7",                               "7",       2, 6, 1               ],
94["7 [Starter]",                     "7",       2, 6, 1, 0x0b         ],
95["7 [Home Basic]",                  "7",       2, 6, 1, 0x02         ],
96["7 [Home Premium]",                "7",       2, 6, 1, 0x03         ],
97["7 [Professional]",                "7",       2, 6, 1, 0x06         ],
98["7 [Professional]",                "7",       2, 6, 1, 0x30         ],
99["7 [Enterprise]",                  "7",       2, 6, 1, 0x04         ],
100["7 [Ultimate]",                    "7",       2, 6, 1, 0x01         ],
101
102["8",                               "8",       2, 6, 2               ],
103["2008 [R2 Standard]",              "2008",    2, 6, 1, 0x07, 2, 89  ],
104["2012 [Standard]",                 "2012",    2, 6, 2, 0x07, 2, 89  ],
105["[Small Business Server] 2008 R2", "2008",    2, 6, 1, 0x09, 2, 89  ],
106
107["8.1",                             "8.1",     2, 6, 3               ],
108["2012 [R2]",                       "2012",    2, 6, 3, 0x00, 2, 89  ],
109);
110
111my @win10_tests = (
112["10 [Build 9840]",                                                "10", 2, 10, 0, 0x00, 0, 0, 9840],
113
114["10 [Version 1507 (Preview Build 9841)]",                         "10", 2, 10, 0, 0x00, 0, 0, 9841],
115["10 [Version 1507 (RTM)]",                                        "10", 2, 10, 0, 0x00, 0, 0, 10240],
116
117["10 [Version 1511 (November Update) (Preview Build 10525)]",      "10", 2, 10, 0, 0x00, 0, 0, 10525],
118["10 [Version 1511 (November Update)]",                            "10", 2, 10, 0, 0x00, 0, 0, 10586],
119
120["10 [Version 1607 (Anniversary Update) (Preview Build 11082)]",   "10", 2, 10, 0, 0x00, 0, 0, 11082],
121["10 [Version 1607 (Anniversary Update)]",                         "10", 2, 10, 0, 0x00, 0, 0, 14393],
122
123["10 [Version 1703 (Creators Update) (Preview Build 14901)]",      "10", 2, 10, 0, 0x00, 0, 0, 14901],
124["10 [Version 1703 (Creators Update)]",                            "10", 2, 10, 0, 0x00, 0, 0, 15063],
125
126["10 [Version 1709 (Fall Creators Update) (Preview Build 16170)]", "10", 2, 10, 0, 0x00, 0, 0, 16170],
127["10 [Version 1709 (Fall Creators Update)]",                       "10", 2, 10, 0, 0x00, 0, 0, 16299],
128
129["10 [Version 1803 (April 2018 Update) (Preview Build 16353)]",    "10", 2, 10, 0, 0x00, 0, 0, 16353],
130["10 [Version 1803 (April 2018 Update)]",                          "10", 2, 10, 0, 0x00, 0, 0, 17134],
131
132["10 [Version 1809 (October 2018 Update) (Preview Build 17604)]",  "10", 2, 10, 0, 0x00, 0, 0, 17604],
133["10 [Version 1809 (October 2018 Update)]",                        "10", 2, 10, 0, 0x00, 0, 0, 17763],
134
135["10 [Version 1903 (May 2019 Update) (Preview Build 18204)]",      "10", 2, 10, 0, 0x00, 0, 0, 18204],
136["10 [Version 1903 (May 2019 Update)]",                            "10", 2, 10, 0, 0x00, 0, 0, 18362],
137
138["2016 [Version 1607]",                                    "2016",    2, 10, 0, 0x07, 2, 0, 14393],
139["2019 [Version 1809]",                                    "2019",    2, 10, 0, 0x07, 2, 0, 17763],
140
141["Server [Version 1709]",                                  "Server",  2, 10, 0, 0x07, 2, 0, 16299],
142["Server [Version 1803]",                                  "Server",  2, 10, 0, 0x07, 2, 0, 17134],
143# The 1809 version from the semi-annual channel will identify as "Windows Server 2019 Version 1809"
144#["Server [Version 1809]",                                 "Server",  2, 10, 0, 0x07, 2, 0, 17763],
145["Server [Version 1903]",                                  "Server",  2, 10, 0, 0x07, 2, 0, 18362],
146["Server [Build 12345]",                                   "Server",  2, 10, 0, 0x07, 2, 0, 12345],
147
148);
149
150my @ia64_tests = (
151["2003 [Datacenter Edition for Itanium-based Systems]", "2003", 2, 5, 2, 0x0080, 2, 0],
152["2003 [Enterprise Edition for Itanium-based Systems]", "2003", 2, 5, 2, 0x0002, 2, 0],
153);
154
155plan tests => 6 * (@intel_tests + @amd64_tests + 2*@dual_tests + @ia64_tests) + 3 * @win10_tests;
156
157# Test internal implementation function
158sub check {
159    my($test, $arch) = @_;
160    my($pretty, $expect, $id, $major, $minor, $sm, $pt, $metrics, $build) = @$test;
161    $metrics = [$metrics] if defined($metrics) && not ref $metrics;
162
163    my $tag = "";
164    ($pretty, $tag) = ("$1$2$3", "$2") if $pretty =~ /^(.*)\[(.*)\](.*)$/;
165    ($pretty, $tag) = ("$1$2$3", "Windows $2") if $pretty =~ /^(.*)\{(.*)\}(.*)$/;
166    $tag = "R2 $tag" if $tag !~ /R2/ && $pretty =~ /R2$/;
167
168    # All display names start with "Windows";
169    # and 2003/2008 start with "Windows Server"
170    unless ($pretty eq "Win32s") {
171	my $prefix = "Windows";
172	$prefix .= " Server" if $pretty =~ /^20(03|08|12|16|19)/;
173	$pretty = "$prefix $pretty";
174    }
175
176    # @dual_tests: Vista and later all come in both 32-bit and 64-bit versions
177    if ($id == 2 && $major >= 6) {
178	my $suffix = "";
179	$suffix = " (32-bit)" if $arch == Win32::PROCESSOR_ARCHITECTURE_INTEL;
180	$suffix = " (64-bit)" if $arch == Win32::PROCESSOR_ARCHITECTURE_AMD64;
181	$_ .= $suffix for $pretty, $tag;
182	$tag =~ s/^\s*//;
183    }
184
185    # We pass the same value for $suitemask and $productinfo.  The former is
186    # used for Windows up to 2003, the latter is used for Vista and later.
187    my($os, $desc) = Win32::_GetOSName("", $major||0, $minor||0, $build,
188				       $id, $sm||0, $pt||1, $sm||0, $arch, $metrics);
189    my $display = Win32::GetOSDisplayName($os, $desc);
190
191    note($pretty) if defined &note;
192    is($display, $pretty);
193    is($os, "Win$expect", "os:   $os");
194    is($desc, $tag, "desc: $desc");
195
196    next if $major == 10;
197
198    my $sp = "Service Pack 42";
199    ($os, $desc) = Win32::_GetOSName($sp, $major||0, $minor||0, 0,
200				     $id, $sm||0, $pt||1, $sm||0, $arch, $metrics);
201    $display = Win32::GetOSDisplayName($os, $desc);
202
203    is($display, "$pretty $sp", "display: $display");
204    is($os,      "Win$expect",  "os:      $os");
205    $expect = length($tag) ? "$tag $sp" : $sp;
206    is($desc,    $expect,       "desc:    $desc");
207}
208
209check($_, Win32::PROCESSOR_ARCHITECTURE_INTEL) for @intel_tests, @dual_tests, @win10_tests;
210check($_, Win32::PROCESSOR_ARCHITECTURE_AMD64) for @amd64_tests, @dual_tests;
211check($_, Win32::PROCESSOR_ARCHITECTURE_IA64)  for @ia64_tests;
212
213