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