Source file
src/go/build/deps_test.go
1
2
3
4
5
6
7
8 package build
9
10 import (
11 "bytes"
12 "fmt"
13 "go/token"
14 "internal/dag"
15 "internal/testenv"
16 "io/fs"
17 "os"
18 "path/filepath"
19 "slices"
20 "strings"
21 "testing"
22 )
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 var depsRules = `
39 # No dependencies allowed for any of these packages.
40 NONE
41 < unsafe
42 < cmp,
43 container/list,
44 container/ring,
45 internal/byteorder,
46 internal/cfg,
47 internal/coverage,
48 internal/coverage/rtcov,
49 internal/coverage/uleb128,
50 internal/coverage/calloc,
51 internal/cpu,
52 internal/goarch,
53 internal/godebugs,
54 internal/goexperiment,
55 internal/goos,
56 internal/goversion,
57 internal/nettrace,
58 internal/platform,
59 internal/profilerecord,
60 internal/syslist,
61 internal/trace/tracev2,
62 internal/trace/traceviewer/format,
63 log/internal,
64 math/bits,
65 structs,
66 unicode,
67 unicode/utf8,
68 unicode/utf16;
69
70 internal/goarch < internal/abi;
71 internal/byteorder, internal/cpu, internal/goarch < internal/chacha8rand;
72
73 # RUNTIME is the core runtime group of packages, all of them very light-weight.
74 internal/abi,
75 internal/chacha8rand,
76 internal/coverage/rtcov,
77 internal/cpu,
78 internal/goarch,
79 internal/godebugs,
80 internal/goexperiment,
81 internal/goos,
82 internal/profilerecord,
83 internal/trace/tracev2,
84 math/bits,
85 structs
86 < internal/bytealg
87 < internal/stringslite
88 < internal/itoa
89 < internal/unsafeheader
90 < internal/race
91 < internal/msan
92 < internal/asan
93 < internal/runtime/sys
94 < internal/runtime/syscall/linux
95 < internal/runtime/syscall/windows
96 < internal/runtime/atomic
97 < internal/runtime/exithook
98 < internal/runtime/gc
99 < internal/runtime/math
100 < internal/runtime/maps
101 < internal/runtime/strconv
102 < internal/runtime/cgroup
103 < runtime
104 < sync/atomic
105 < internal/sync
106 < weak
107 < internal/synctest
108 < sync
109 < internal/bisect
110 < internal/godebug
111 < internal/reflectlite
112 < errors
113 < internal/oserror;
114
115 cmp, runtime, math/bits
116 < iter
117 < maps, slices;
118
119 internal/oserror, maps, slices
120 < RUNTIME;
121
122 RUNTIME
123 < sort
124 < container/heap
125 < unique;
126
127 RUNTIME
128 < io;
129
130 RUNTIME
131 < arena;
132
133 syscall !< io;
134 reflect !< sort;
135
136 RUNTIME, unicode/utf8
137 < path;
138
139 unicode !< path;
140
141 # SYSCALL is RUNTIME plus the packages necessary for basic system calls.
142 RUNTIME, unicode/utf8, unicode/utf16, internal/synctest
143 < internal/syscall/windows/sysdll, syscall/js
144 < syscall
145 < internal/syscall/unix, internal/syscall/windows, internal/syscall/windows/registry
146 < internal/syscall/execenv
147 < SYSCALL;
148
149 # TIME is SYSCALL plus the core packages about time, including context.
150 SYSCALL
151 < time/tzdata
152 < time
153 < context
154 < TIME;
155
156 TIME, io, path, slices
157 < io/fs;
158
159 # MATH is RUNTIME plus the basic math packages.
160 RUNTIME
161 < math
162 < MATH;
163
164 unicode !< math;
165
166 MATH
167 < math/cmplx;
168
169 MATH
170 < math/rand, math/rand/v2;
171
172 MATH
173 < runtime/metrics;
174
175 MATH, unicode/utf8
176 < strconv;
177
178 unicode !< strconv;
179
180 # STR is basic string and buffer manipulation.
181 RUNTIME, io, unicode/utf8, unicode/utf16, unicode
182 < bytes, strings
183 < bufio;
184
185 bufio, path, strconv
186 < STR;
187
188 # OS is basic OS access, including helpers (path/filepath, os/exec, etc).
189 # OS includes string routines, but those must be layered above package os.
190 # OS does not include reflection.
191 io/fs
192 < internal/testlog
193 < internal/poll
194 < internal/filepathlite
195 < os
196 < os/signal;
197
198 io/fs
199 < embed;
200
201 unicode, fmt !< net, os, os/signal;
202
203 os/signal, internal/filepathlite, STR
204 < path/filepath
205 < io/ioutil;
206
207 path/filepath, internal/godebug < os/exec;
208
209 io/ioutil, os/exec, os/signal
210 < OS;
211
212 reflect !< OS;
213
214 OS
215 < golang.org/x/sys/cpu;
216
217 # FMT is OS (which includes string routines) plus reflect and fmt.
218 # It does not include package log, which should be avoided in core packages.
219 arena, strconv, unicode
220 < reflect;
221
222 os, reflect
223 < internal/fmtsort
224 < fmt;
225
226 OS, fmt
227 < FMT;
228
229 log !< FMT;
230
231 # Misc packages needing only FMT.
232 FMT
233 < html,
234 internal/dag,
235 internal/goroot,
236 internal/types/errors,
237 mime/quotedprintable,
238 net/internal/socktest,
239 net/url,
240 runtime/trace,
241 text/scanner,
242 text/tabwriter;
243
244 io, reflect
245 < internal/saferio;
246
247 # encodings
248 # core ones do not use fmt.
249 io, strconv, slices
250 < encoding, encoding/base32, encoding/base64;
251
252 encoding, reflect
253 < encoding/binary;
254
255 FMT, encoding < flag;
256
257 fmt !< encoding/base32, encoding/base64;
258
259 FMT, encoding, encoding/base32, encoding/base64, encoding/binary,
260 internal/saferio
261 < encoding/ascii85, encoding/csv, encoding/gob, encoding/hex,
262 encoding/pem, encoding/xml, mime;
263
264 STR, errors
265 < encoding/json/internal
266 < encoding/json/internal/jsonflags
267 < encoding/json/internal/jsonopts
268 < encoding/json/internal/jsonwire
269 < encoding/json/jsontext;
270
271 FMT,
272 encoding/hex,
273 encoding/base32,
274 encoding/base64,
275 encoding/binary,
276 encoding/json/jsontext,
277 encoding/json/internal,
278 encoding/json/internal/jsonflags,
279 encoding/json/internal/jsonopts,
280 encoding/json/internal/jsonwire
281 < encoding/json/v2
282 < encoding/json;
283
284 # hashes
285 io
286 < hash
287 < hash/adler32, hash/crc32, hash/crc64, hash/fnv;
288
289 # math/big
290 FMT, math/rand
291 < math/big;
292
293 # compression
294 FMT, encoding/binary, hash/adler32, hash/crc32, sort
295 < compress/bzip2, compress/flate, compress/lzw, internal/zstd
296 < archive/zip, compress/gzip, compress/zlib;
297
298 # templates
299 FMT
300 < text/template/parse;
301
302 net/url, text/template/parse
303 < text/template
304 < internal/lazytemplate;
305
306 # regexp
307 FMT, sort
308 < regexp/syntax
309 < regexp
310 < internal/lazyregexp;
311
312 encoding/json, html, text/template, regexp
313 < html/template;
314
315 # suffix array
316 encoding/binary, regexp
317 < index/suffixarray;
318
319 # executable parsing
320 FMT, encoding/binary, compress/zlib, internal/saferio, internal/zstd, sort
321 < runtime/debug
322 < debug/dwarf
323 < debug/elf, debug/gosym, debug/macho, debug/pe, debug/plan9obj, internal/xcoff
324 < debug/buildinfo
325 < DEBUG;
326
327 # go parser and friends.
328 FMT, sort
329 < internal/gover
330 < go/version
331 < go/token
332 < go/scanner
333 < go/ast
334 < go/internal/typeparams;
335
336 FMT
337 < go/build/constraint;
338
339 FMT, sort
340 < go/doc/comment;
341
342 go/internal/typeparams, go/build/constraint
343 < go/parser;
344
345 go/doc/comment, go/parser, text/tabwriter
346 < go/printer
347 < go/format;
348
349 math/big, go/token
350 < go/constant;
351
352 FMT, internal/goexperiment
353 < internal/buildcfg;
354
355 container/heap, go/constant, go/parser, internal/buildcfg, internal/goversion, internal/types/errors
356 < go/types;
357
358 # The vast majority of standard library packages should not be resorting to regexp.
359 # go/types is a good chokepoint. It shouldn't use regexp, nor should anything
360 # that is low-enough level to be used by go/types.
361 regexp !< go/types;
362
363 go/doc/comment, go/parser, internal/lazyregexp, text/template
364 < go/doc;
365
366 go/build/constraint, go/doc, go/parser, internal/buildcfg, internal/goroot, internal/goversion, internal/platform, internal/syslist
367 < go/build;
368
369 # databases
370 FMT
371 < database/sql/internal
372 < database/sql/driver;
373
374 database/sql/driver, math/rand/v2 < database/sql;
375
376 # images
377 FMT, compress/lzw, compress/zlib
378 < image/color
379 < image, image/color/palette
380 < image/internal/imageutil
381 < image/draw
382 < image/gif, image/jpeg, image/png;
383
384 # cgo, delayed as long as possible.
385 # If you add a dependency on CGO, you must add the package
386 # to cgoPackages in cmd/dist/test.go as well.
387 RUNTIME
388 < C
389 < runtime/cgo
390 < CGO
391 < runtime/msan, runtime/asan;
392
393 # runtime/race
394 NONE < runtime/race/internal/amd64v1;
395 NONE < runtime/race/internal/amd64v3;
396 CGO, runtime/race/internal/amd64v1, runtime/race/internal/amd64v3 < runtime/race;
397
398 # Bulk of the standard library must not use cgo.
399 # The prohibition stops at net and os/user.
400 C !< fmt, go/types, CRYPTO-MATH, log/slog;
401
402 CGO, OS
403 < plugin;
404
405 CGO, FMT
406 < os/user
407 < archive/tar;
408
409 sync
410 < internal/singleflight;
411
412 os
413 < golang.org/x/net/dns/dnsmessage,
414 golang.org/x/net/lif;
415
416 internal/bytealg, internal/itoa, math/bits, slices, strconv, unique
417 < net/netip;
418
419 os, net/netip
420 < internal/routebsd;
421
422 # net is unavoidable when doing any networking,
423 # so large dependencies must be kept out.
424 # This is a long-looking list but most of these
425 # are small with few dependencies.
426 CGO,
427 golang.org/x/net/dns/dnsmessage,
428 golang.org/x/net/lif,
429 internal/godebug,
430 internal/nettrace,
431 internal/poll,
432 internal/routebsd,
433 internal/singleflight,
434 net/netip,
435 os,
436 sort
437 < net;
438
439 fmt, unicode !< net;
440 math/rand !< net; # net uses runtime instead
441
442 # NET is net plus net-helper packages.
443 FMT, net
444 < net/textproto;
445
446 mime, net/textproto, net/url
447 < NET;
448
449 # logging - most packages should not import; http and up is allowed
450 FMT, log/internal
451 < log;
452
453 log, log/slog !< crypto/tls, database/sql, go/importer, testing;
454
455 FMT, log, net
456 < log/syslog;
457
458 RUNTIME
459 < log/slog/internal, log/slog/internal/buffer;
460
461 FMT,
462 encoding, encoding/json,
463 log, log/internal,
464 log/slog/internal, log/slog/internal/buffer,
465 slices
466 < log/slog
467 < log/slog/internal/slogtest, log/slog/internal/benchmarks;
468
469 NET, log
470 < net/mail;
471
472 # FIPS is the FIPS 140 module.
473 # It must not depend on external crypto packages.
474 # Package hash is ok as it's only the interface.
475 # See also fips140deps.AllowedInternalPackages.
476
477 io, math/rand/v2 < crypto/internal/randutil;
478
479 STR < crypto/internal/impl;
480
481 OS < crypto/internal/sysrand
482 < crypto/internal/entropy;
483
484 internal/byteorder < crypto/internal/fips140deps/byteorder;
485 internal/cpu, internal/goarch < crypto/internal/fips140deps/cpu;
486 internal/godebug < crypto/internal/fips140deps/godebug;
487
488 STR, hash,
489 crypto/internal/impl,
490 crypto/internal/entropy,
491 crypto/internal/randutil,
492 crypto/internal/fips140deps/byteorder,
493 crypto/internal/fips140deps/cpu,
494 crypto/internal/fips140deps/godebug
495 < crypto/internal/fips140
496 < crypto/internal/fips140/alias
497 < crypto/internal/fips140/subtle
498 < crypto/internal/fips140/sha256
499 < crypto/internal/fips140/sha512
500 < crypto/internal/fips140/sha3
501 < crypto/internal/fips140/hmac
502 < crypto/internal/fips140/check
503 < crypto/internal/fips140/pbkdf2
504 < crypto/internal/fips140/aes
505 < crypto/internal/fips140/drbg
506 < crypto/internal/fips140/aes/gcm
507 < crypto/internal/fips140/hkdf
508 < crypto/internal/fips140/mlkem
509 < crypto/internal/fips140/ssh
510 < crypto/internal/fips140/tls12
511 < crypto/internal/fips140/tls13
512 < crypto/internal/fips140/bigmod
513 < crypto/internal/fips140/nistec/fiat
514 < crypto/internal/fips140/nistec
515 < crypto/internal/fips140/ecdh
516 < crypto/internal/fips140/ecdsa
517 < crypto/internal/fips140/edwards25519/field
518 < crypto/internal/fips140/edwards25519
519 < crypto/internal/fips140/ed25519
520 < crypto/internal/fips140/rsa
521 < FIPS < crypto/fips140;
522
523 crypto !< FIPS;
524
525 # CRYPTO is core crypto algorithms - no cgo, fmt, net.
526 # Mostly wrappers around the FIPS module.
527
528 NONE < crypto/internal/boring/sig, crypto/internal/boring/syso;
529 sync/atomic < crypto/internal/boring/bcache;
530
531 FIPS, internal/godebug, embed,
532 crypto/internal/boring/sig,
533 crypto/internal/boring/syso,
534 crypto/internal/boring/bcache
535 < crypto/internal/fips140only
536 < crypto
537 < crypto/subtle
538 < crypto/sha3
539 < crypto/internal/fips140hash
540 < crypto/cipher
541 < crypto/internal/boring
542 < crypto/boring
543 < crypto/aes,
544 crypto/des,
545 crypto/rc4,
546 crypto/md5,
547 crypto/sha1,
548 crypto/sha256,
549 crypto/sha512,
550 crypto/hmac,
551 crypto/hkdf,
552 crypto/pbkdf2,
553 crypto/ecdh,
554 crypto/mlkem
555 < CRYPTO;
556
557 CGO, fmt, net !< CRYPTO;
558
559 # CRYPTO-MATH is crypto that exposes math/big APIs - no cgo, net; fmt now ok.
560
561 CRYPTO, FMT, math/big
562 < crypto/internal/boring/bbig
563 < crypto/internal/fips140cache
564 < crypto/rand
565 < crypto/ed25519 # depends on crypto/rand.Reader
566 < encoding/asn1
567 < golang.org/x/crypto/cryptobyte/asn1
568 < golang.org/x/crypto/cryptobyte
569 < crypto/dsa, crypto/elliptic, crypto/rsa
570 < crypto/ecdsa
571 < CRYPTO-MATH;
572
573 CGO, net !< CRYPTO-MATH;
574
575 # TLS, Prince of Dependencies.
576
577 crypto/fips140, sync/atomic < crypto/tls/internal/fips140tls;
578
579 crypto/internal/boring/sig, crypto/tls/internal/fips140tls < crypto/tls/fipsonly;
580
581 CRYPTO, golang.org/x/sys/cpu, encoding/binary, reflect
582 < golang.org/x/crypto/internal/alias
583 < golang.org/x/crypto/internal/subtle
584 < golang.org/x/crypto/chacha20
585 < golang.org/x/crypto/internal/poly1305
586 < golang.org/x/crypto/chacha20poly1305;
587
588 CRYPTO-MATH, NET, container/list, encoding/hex, encoding/pem,
589 golang.org/x/crypto/chacha20poly1305, crypto/tls/internal/fips140tls
590 < crypto/internal/hpke
591 < crypto/x509/internal/macos
592 < crypto/x509/pkix
593 < crypto/x509
594 < crypto/tls;
595
596 # crypto-aware packages
597
598 DEBUG, go/build, go/types, text/scanner, crypto/sha256
599 < internal/pkgbits, internal/exportdata
600 < go/internal/gcimporter, go/internal/gccgoimporter, go/internal/srcimporter
601 < go/importer;
602
603 NET, crypto/rand, mime/quotedprintable
604 < mime/multipart;
605
606 crypto/tls
607 < net/smtp;
608
609 crypto/rand
610 < hash/maphash; # for purego implementation
611
612 # HTTP, King of Dependencies.
613
614 FMT
615 < golang.org/x/net/http2/hpack
616 < net/http/internal, net/http/internal/ascii, net/http/internal/testcert;
617
618 FMT, NET, container/list, encoding/binary, log
619 < golang.org/x/text/transform
620 < golang.org/x/text/unicode/norm
621 < golang.org/x/text/unicode/bidi
622 < golang.org/x/text/secure/bidirule
623 < golang.org/x/net/idna
624 < golang.org/x/net/http/httpguts, golang.org/x/net/http/httpproxy;
625
626 NET, crypto/tls
627 < net/http/httptrace;
628
629 compress/gzip,
630 golang.org/x/net/http/httpguts,
631 golang.org/x/net/http/httpproxy,
632 golang.org/x/net/http2/hpack,
633 net/http/internal,
634 net/http/internal/ascii,
635 net/http/internal/testcert,
636 net/http/httptrace,
637 mime/multipart,
638 log
639 < net/http/internal/httpcommon
640 < net/http;
641
642 # HTTP-aware packages
643
644 encoding/json, net/http
645 < expvar;
646
647 net/http, net/http/internal/ascii
648 < net/http/cookiejar, net/http/httputil;
649
650 net/http, flag
651 < net/http/httptest;
652
653 net/http, regexp
654 < net/http/cgi
655 < net/http/fcgi;
656
657 # Profiling
658 FMT, compress/gzip, encoding/binary, sort, text/tabwriter
659 < runtime/pprof;
660
661 OS, compress/gzip, internal/lazyregexp
662 < internal/profile;
663
664 html, internal/profile, net/http, runtime/pprof, runtime/trace
665 < net/http/pprof;
666
667 # RPC
668 encoding/gob, encoding/json, go/token, html/template, net/http
669 < net/rpc
670 < net/rpc/jsonrpc;
671
672 # System Information
673 bufio, bytes, internal/cpu, io, os, strings, sync
674 < internal/sysinfo;
675
676 # Test-only
677 log
678 < testing/iotest
679 < testing/fstest;
680
681 FMT, flag, math/rand
682 < testing/quick;
683
684 FMT, DEBUG, flag, runtime/trace, internal/sysinfo, math/rand
685 < testing;
686
687 log/slog, testing
688 < testing/slogtest;
689
690 FMT, crypto/sha256, encoding/binary, encoding/json,
691 go/ast, go/parser, go/token,
692 internal/godebug, math/rand, encoding/hex
693 < internal/fuzz;
694
695 OS, flag, testing, internal/cfg, internal/platform, internal/goroot
696 < internal/testenv;
697
698 OS, encoding/base64
699 < internal/obscuretestdata;
700
701 CGO, OS, fmt
702 < internal/testpty;
703
704 NET, testing, math/rand
705 < golang.org/x/net/nettest;
706
707 syscall
708 < os/exec/internal/fdtest;
709
710 FMT, sort
711 < internal/diff;
712
713 FMT
714 < internal/txtar;
715
716 internal/synctest, testing
717 < testing/synctest;
718
719 testing
720 < internal/testhash;
721
722 CRYPTO-MATH, testing, internal/testenv, internal/testhash, encoding/json
723 < crypto/internal/cryptotest;
724
725 CGO, FMT
726 < crypto/internal/sysrand/internal/seccomp;
727
728 FIPS
729 < crypto/internal/fips140/check/checktest;
730
731 # v2 execution trace parser.
732 FMT, io, internal/trace/tracev2
733 < internal/trace/version;
734
735 FMT, encoding/binary, internal/trace/version
736 < internal/trace/raw;
737
738 FMT, internal/trace/version, io, sort, encoding/binary
739 < internal/trace/internal/tracev1;
740
741 FMT, encoding/binary, internal/trace/version, internal/trace/internal/tracev1, container/heap, math/rand
742 < internal/trace;
743
744 regexp, internal/trace, internal/trace/raw, internal/txtar
745 < internal/trace/testtrace;
746
747 regexp, internal/txtar, internal/trace, internal/trace/raw
748 < internal/trace/internal/testgen;
749
750 # cmd/trace dependencies.
751 FMT,
752 embed,
753 encoding/json,
754 html/template,
755 internal/profile,
756 internal/trace,
757 internal/trace/traceviewer/format,
758 net/http
759 < internal/trace/traceviewer;
760
761 # Coverage.
762 FMT, hash/fnv, encoding/binary, regexp, sort, text/tabwriter,
763 internal/coverage, internal/coverage/uleb128
764 < internal/coverage/cmerge,
765 internal/coverage/pods,
766 internal/coverage/slicereader,
767 internal/coverage/slicewriter;
768
769 internal/coverage/slicereader, internal/coverage/slicewriter
770 < internal/coverage/stringtab
771 < internal/coverage/decodecounter, internal/coverage/decodemeta,
772 internal/coverage/encodecounter, internal/coverage/encodemeta;
773
774 internal/coverage/cmerge
775 < internal/coverage/cformat;
776
777 internal/coverage, crypto/sha256, FMT
778 < cmd/internal/cov/covcmd;
779
780 encoding/json,
781 runtime/debug,
782 internal/coverage/calloc,
783 internal/coverage/cformat,
784 internal/coverage/decodecounter, internal/coverage/decodemeta,
785 internal/coverage/encodecounter, internal/coverage/encodemeta,
786 internal/coverage/pods
787 < internal/coverage/cfile
788 < runtime/coverage;
789
790 internal/coverage/cfile, internal/fuzz, internal/testlog, runtime/pprof, regexp
791 < testing/internal/testdeps;
792
793 # Test-only packages can have anything they want
794 FMT, compress/gzip, embed, encoding/binary < encoding/json/internal/jsontest;
795 CGO, internal/syscall/unix < net/internal/cgotest;
796 FMT < math/big/internal/asmgen;
797
798 FMT, testing < internal/cgrouptest;
799 C, CGO < internal/runtime/cgobench;
800 `
801
802
803 func listStdPkgs(goroot string) ([]string, error) {
804
805 var pkgs []string
806
807 src := filepath.Join(goroot, "src") + string(filepath.Separator)
808 walkFn := func(path string, d fs.DirEntry, err error) error {
809 if err != nil || !d.IsDir() || path == src {
810 return nil
811 }
812
813 base := filepath.Base(path)
814 if strings.HasPrefix(base, ".") || strings.HasPrefix(base, "_") || base == "testdata" {
815 return filepath.SkipDir
816 }
817
818 name := filepath.ToSlash(path[len(src):])
819 if name == "builtin" || name == "cmd" {
820 return filepath.SkipDir
821 }
822
823 pkgs = append(pkgs, strings.TrimPrefix(name, "vendor/"))
824 return nil
825 }
826 if err := filepath.WalkDir(src, walkFn); err != nil {
827 return nil, err
828 }
829 return pkgs, nil
830 }
831
832 func TestDependencies(t *testing.T) {
833 testenv.MustHaveSource(t)
834
835 ctxt := Default
836 all, err := listStdPkgs(ctxt.GOROOT)
837 if err != nil {
838 t.Fatal(err)
839 }
840 slices.Sort(all)
841
842 sawImport := map[string]map[string]bool{}
843 policy := depsPolicy(t)
844
845 for _, pkg := range all {
846 imports, err := findImports(pkg)
847 if err != nil {
848 t.Error(err)
849 continue
850 }
851 if sawImport[pkg] == nil {
852 sawImport[pkg] = map[string]bool{}
853 }
854 var bad []string
855 for _, imp := range imports {
856 sawImport[pkg][imp] = true
857 if !policy.HasEdge(pkg, imp) {
858 bad = append(bad, imp)
859 }
860 }
861 if bad != nil {
862 t.Errorf("unexpected dependency: %s imports %v", pkg, bad)
863 }
864 }
865 }
866
867 var buildIgnore = []byte("\n//go:build ignore")
868
869 func findImports(pkg string) ([]string, error) {
870 vpkg := pkg
871 if strings.HasPrefix(pkg, "golang.org") {
872 vpkg = "vendor/" + pkg
873 }
874 dir := filepath.Join(Default.GOROOT, "src", vpkg)
875 files, err := os.ReadDir(dir)
876 if err != nil {
877 return nil, err
878 }
879 var imports []string
880 var haveImport = map[string]bool{}
881 if pkg == "crypto/internal/boring" {
882 haveImport["C"] = true
883 }
884 fset := token.NewFileSet()
885 for _, file := range files {
886 name := file.Name()
887 if name == "slice_go14.go" || name == "slice_go18.go" {
888
889 continue
890 }
891 if !strings.HasSuffix(name, ".go") || strings.HasSuffix(name, "_test.go") {
892 continue
893 }
894 info := fileInfo{
895 name: filepath.Join(dir, name),
896 fset: fset,
897 }
898 f, err := os.Open(info.name)
899 if err != nil {
900 return nil, err
901 }
902 err = readGoInfo(f, &info)
903 f.Close()
904 if err != nil {
905 return nil, fmt.Errorf("reading %v: %v", name, err)
906 }
907 if info.parsed.Name.Name == "main" {
908 continue
909 }
910 if bytes.Contains(info.header, buildIgnore) {
911 continue
912 }
913 for _, imp := range info.imports {
914 path := imp.path
915 if !haveImport[path] {
916 haveImport[path] = true
917 imports = append(imports, path)
918 }
919 }
920 }
921 slices.Sort(imports)
922 return imports, nil
923 }
924
925
926 func depsPolicy(t *testing.T) *dag.Graph {
927 g, err := dag.Parse(depsRules)
928 if err != nil {
929 t.Fatal(err)
930 }
931 return g
932 }
933
934
935
936 func TestStdlibLowercase(t *testing.T) {
937 testenv.MustHaveSource(t)
938
939 ctxt := Default
940 all, err := listStdPkgs(ctxt.GOROOT)
941 if err != nil {
942 t.Fatal(err)
943 }
944
945 for _, pkgname := range all {
946 if strings.ToLower(pkgname) != pkgname {
947 t.Errorf("package %q should not use upper-case path", pkgname)
948 }
949 }
950 }
951
952
953 func TestFindImports(t *testing.T) {
954 imports, err := findImports("go/build")
955 if err != nil {
956 t.Fatal(err)
957 }
958 t.Logf("go/build imports %q", imports)
959 want := []string{"bytes", "os", "path/filepath", "strings"}
960 wantLoop:
961 for _, w := range want {
962 for _, imp := range imports {
963 if imp == w {
964 continue wantLoop
965 }
966 }
967 t.Errorf("expected to find %q in import list", w)
968 }
969 }
970
View as plain text