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