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