How to use postProcess method of csource Package

Best Syzkaller code snippet using csource.postProcess

csource.go

Source:csource.go Github

copy

Full Screen

...76 return nil, err77 }78 const header = "// autogenerated by syzkaller (https://github.com/google/syzkaller)\n\n"79 result = append([]byte(header), result...)80 result = ctx.postProcess(result)81 return result, nil82}83type context struct {84 p *prog.Prog85 opts Options86 target *prog.Target87 sysTarget *targets.Target88 calls map[string]uint64 // CallName -> NR89}90func (ctx *context) generateSyscalls(calls []string, hasVars bool) string {91 opts := ctx.opts92 buf := new(bytes.Buffer)93 if !opts.Threaded && !opts.Collide {94 if hasVars || opts.Trace {95 fmt.Fprintf(buf, "\tintptr_t res = 0;\n")96 }97 if opts.Repro {98 fmt.Fprintf(buf, "\tif (write(1, \"executing program\\n\", sizeof(\"executing program\\n\") - 1)) {}\n")99 }100 if opts.Trace {101 fmt.Fprintf(buf, "\tfprintf(stderr, \"### start\\n\");\n")102 }103 for _, c := range calls {104 fmt.Fprintf(buf, "%s", c)105 }106 } else {107 if hasVars || opts.Trace {108 fmt.Fprintf(buf, "\tintptr_t res = 0;\n")109 }110 fmt.Fprintf(buf, "\tswitch (call) {\n")111 for i, c := range calls {112 fmt.Fprintf(buf, "\tcase %v:\n", i)113 fmt.Fprintf(buf, "%s", strings.Replace(c, "\t", "\t\t", -1))114 fmt.Fprintf(buf, "\t\tbreak;\n")115 }116 fmt.Fprintf(buf, "\t}\n")117 }118 return buf.String()119}120func (ctx *context) generateSyscallDefines() string {121 var calls []string122 for name, nr := range ctx.calls {123 if !ctx.sysTarget.SyscallNumbers ||124 strings.HasPrefix(name, "syz_") || !ctx.sysTarget.NeedSyscallDefine(nr) {125 continue126 }127 calls = append(calls, name)128 }129 sort.Strings(calls)130 buf := new(bytes.Buffer)131 prefix := ctx.sysTarget.SyscallPrefix132 for _, name := range calls {133 fmt.Fprintf(buf, "#ifndef %v%v\n", prefix, name)134 fmt.Fprintf(buf, "#define %v%v %v\n", prefix, name, ctx.calls[name])135 fmt.Fprintf(buf, "#endif\n")136 }137 if ctx.target.OS == "linux" && ctx.target.PtrSize == 4 {138 // This is a dirty hack.139 // On 32-bit linux mmap translated to old_mmap syscall which has a different signature.140 // mmap2 has the right signature. syz-extract translates mmap to mmap2, do the same here.141 fmt.Fprintf(buf, "#undef __NR_mmap\n")142 fmt.Fprintf(buf, "#define __NR_mmap __NR_mmap2\n")143 }144 return buf.String()145}146func (ctx *context) generateProgCalls(p *prog.Prog, trace bool) ([]string, []uint64, error) {147 exec := make([]byte, prog.ExecBufferSize)148 progSize, err := p.SerializeForExec(exec)149 if err != nil {150 return nil, nil, fmt.Errorf("failed to serialize program: %v", err)151 }152 decoded, err := ctx.target.DeserializeExec(exec[:progSize])153 if err != nil {154 return nil, nil, err155 }156 calls, vars := ctx.generateCalls(decoded, trace)157 return calls, vars, nil158}159func (ctx *context) generateCalls(p prog.ExecProg, trace bool) ([]string, []uint64) {160 var calls []string161 csumSeq := 0162 for ci, call := range p.Calls {163 w := new(bytes.Buffer)164 // Copyin.165 for _, copyin := range call.Copyin {166 ctx.copyin(w, &csumSeq, copyin)167 }168 if ctx.opts.Fault && ctx.opts.FaultCall == ci {169 fmt.Fprintf(w, "\tinject_fault(%v);\n", ctx.opts.FaultNth)170 }171 // Call itself.172 callName := call.Meta.CallName173 resCopyout := call.Index != prog.ExecNoCopyout174 argCopyout := len(call.Copyout) != 0175 emitCall := ctx.opts.NetInjection ||176 callName != "syz_emit_ethernet" &&177 callName != "syz_extract_tcp_res"178 // TODO: if we don't emit the call we must also not emit copyin, copyout and fault injection.179 // However, simply skipping whole iteration breaks tests due to unused static functions.180 if emitCall {181 ctx.emitCall(w, call, ci, resCopyout || argCopyout, trace)182 } else if trace {183 fmt.Fprintf(w, "\t(void)res;\n")184 }185 // Copyout.186 if resCopyout || argCopyout {187 ctx.copyout(w, call, resCopyout)188 }189 calls = append(calls, w.String())190 }191 return calls, p.Vars192}193func (ctx *context) emitCall(w *bytes.Buffer, call prog.ExecCall, ci int, haveCopyout, trace bool) {194 callName := call.Meta.CallName195 native := ctx.sysTarget.SyscallNumbers && !strings.HasPrefix(callName, "syz_")196 fmt.Fprintf(w, "\t")197 if haveCopyout || trace {198 fmt.Fprintf(w, "res = ")199 }200 ctx.emitCallName(w, call, native)201 for ai, arg := range call.Args {202 if native || ai > 0 {203 fmt.Fprintf(w, ", ")204 }205 switch arg := arg.(type) {206 case prog.ExecArgConst:207 if arg.Format != prog.FormatNative && arg.Format != prog.FormatBigEndian {208 panic("sring format in syscall argument")209 }210 fmt.Fprintf(w, "%v", ctx.constArgToStr(arg, true, native))211 case prog.ExecArgResult:212 if arg.Format != prog.FormatNative && arg.Format != prog.FormatBigEndian {213 panic("sring format in syscall argument")214 }215 val := ctx.resultArgToStr(arg)216 if native && ctx.target.PtrSize == 4 {217 // syscall accepts args as ellipsis, resources are uint64218 // and take 2 slots without the cast, which would be wrong.219 val = "(intptr_t)" + val220 }221 fmt.Fprintf(w, "%v", val)222 default:223 panic(fmt.Sprintf("unknown arg type: %+v", arg))224 }225 }226 for i := 0; i < call.Meta.MissingArgs; i++ {227 if native || len(call.Args) != 0 {228 fmt.Fprintf(w, ", ")229 }230 fmt.Fprintf(w, "0")231 }232 fmt.Fprintf(w, ");")233 comment := ctx.target.AnnotateCall(call)234 if len(comment) != 0 {235 fmt.Fprintf(w, " /* %s */", comment)236 }237 fmt.Fprintf(w, "\n")238 if trace {239 cast := ""240 if !native && !strings.HasPrefix(callName, "syz_") {241 // Potentially we casted a function returning int to a function returning intptr_t.242 // So instead of intptr_t -1 we can get 0x00000000ffffffff. Sign extend it to intptr_t.243 cast = "(intptr_t)(int)"244 }245 fmt.Fprintf(w, "\tfprintf(stderr, \"### call=%v errno=%%u\\n\", %vres == -1 ? errno : 0);\n", ci, cast)246 }247}248func (ctx *context) emitCallName(w *bytes.Buffer, call prog.ExecCall, native bool) {249 callName := call.Meta.CallName250 if native {251 fmt.Fprintf(w, "syscall(%v%v", ctx.sysTarget.SyscallPrefix, callName)252 } else if strings.HasPrefix(callName, "syz_") {253 fmt.Fprintf(w, "%v(", callName)254 } else {255 args := strings.Repeat(",intptr_t", len(call.Args))256 if args != "" {257 args = args[1:]258 }259 fmt.Fprintf(w, "((intptr_t(*)(%v))CAST(%v))(", args, callName)260 }261}262func (ctx *context) generateCsumInet(w *bytes.Buffer, addr uint64, arg prog.ExecArgCsum, csumSeq int) {263 fmt.Fprintf(w, "\tstruct csum_inet csum_%d;\n", csumSeq)264 fmt.Fprintf(w, "\tcsum_inet_init(&csum_%d);\n", csumSeq)265 for i, chunk := range arg.Chunks {266 switch chunk.Kind {267 case prog.ExecArgCsumChunkData:268 fmt.Fprintf(w, "\tNONFAILING(csum_inet_update(&csum_%d, (const uint8*)0x%x, %d));\n",269 csumSeq, chunk.Value, chunk.Size)270 case prog.ExecArgCsumChunkConst:271 fmt.Fprintf(w, "\tuint%d csum_%d_chunk_%d = 0x%x;\n",272 chunk.Size*8, csumSeq, i, chunk.Value)273 fmt.Fprintf(w, "\tcsum_inet_update(&csum_%d, (const uint8*)&csum_%d_chunk_%d, %d);\n",274 csumSeq, csumSeq, i, chunk.Size)275 default:276 panic(fmt.Sprintf("unknown checksum chunk kind %v", chunk.Kind))277 }278 }279 fmt.Fprintf(w, "\tNONFAILING(*(uint16*)0x%x = csum_inet_digest(&csum_%d));\n",280 addr, csumSeq)281}282func (ctx *context) copyin(w *bytes.Buffer, csumSeq *int, copyin prog.ExecCopyin) {283 switch arg := copyin.Arg.(type) {284 case prog.ExecArgConst:285 if arg.BitfieldOffset == 0 && arg.BitfieldLength == 0 {286 ctx.copyinVal(w, copyin.Addr, arg.Size, ctx.constArgToStr(arg, true, false), arg.Format)287 } else {288 if arg.Format != prog.FormatNative && arg.Format != prog.FormatBigEndian {289 panic("bitfield+string format")290 }291 htobe := ""292 if arg.Format == prog.FormatBigEndian {293 htobe = fmt.Sprintf("htobe%v", arg.Size*8)294 }295 fmt.Fprintf(w, "\tNONFAILING(STORE_BY_BITMASK(uint%v, %v, 0x%x, %v, %v, %v));\n",296 arg.Size*8, htobe, copyin.Addr, ctx.constArgToStr(arg, false, false),297 arg.BitfieldOffset, arg.BitfieldLength)298 }299 case prog.ExecArgResult:300 ctx.copyinVal(w, copyin.Addr, arg.Size, ctx.resultArgToStr(arg), arg.Format)301 case prog.ExecArgData:302 fmt.Fprintf(w, "\tNONFAILING(memcpy((void*)0x%x, \"%s\", %v));\n",303 copyin.Addr, toCString(arg.Data, arg.Readable), len(arg.Data))304 case prog.ExecArgCsum:305 switch arg.Kind {306 case prog.ExecArgCsumInet:307 *csumSeq++308 ctx.generateCsumInet(w, copyin.Addr, arg, *csumSeq)309 default:310 panic(fmt.Sprintf("unknown csum kind %v", arg.Kind))311 }312 default:313 panic(fmt.Sprintf("bad argument type: %+v", arg))314 }315}316func (ctx *context) copyinVal(w *bytes.Buffer, addr, size uint64, val string, bf prog.BinaryFormat) {317 switch bf {318 case prog.FormatNative, prog.FormatBigEndian:319 fmt.Fprintf(w, "\tNONFAILING(*(uint%v*)0x%x = %v);\n", size*8, addr, val)320 case prog.FormatStrDec:321 if size != 20 {322 panic("bad strdec size")323 }324 fmt.Fprintf(w, "\tNONFAILING(sprintf((char*)0x%x, \"%%020llu\", (long long)%v));\n", addr, val)325 case prog.FormatStrHex:326 if size != 18 {327 panic("bad strdec size")328 }329 fmt.Fprintf(w, "\tNONFAILING(sprintf((char*)0x%x, \"0x%%016llx\", (long long)%v));\n", addr, val)330 case prog.FormatStrOct:331 if size != 23 {332 panic("bad strdec size")333 }334 fmt.Fprintf(w, "\tNONFAILING(sprintf((char*)0x%x, \"%%023llo\", (long long)%v));\n", addr, val)335 default:336 panic("unknown binary format")337 }338}339func (ctx *context) copyout(w *bytes.Buffer, call prog.ExecCall, resCopyout bool) {340 if ctx.sysTarget.OS == "fuchsia" {341 // On fuchsia we have real system calls that return ZX_OK on success,342 // and libc calls that are casted to function returning intptr_t,343 // as the result int -1 is returned as 0x00000000ffffffff rather than full -1.344 if strings.HasPrefix(call.Meta.CallName, "zx_") {345 fmt.Fprintf(w, "\tif (res == ZX_OK)")346 } else {347 fmt.Fprintf(w, "\tif ((int)res != -1)")348 }349 } else {350 fmt.Fprintf(w, "\tif (res != -1)")351 }352 copyoutMultiple := len(call.Copyout) > 1 || resCopyout && len(call.Copyout) > 0353 if copyoutMultiple {354 fmt.Fprintf(w, " {")355 }356 fmt.Fprintf(w, "\n")357 if resCopyout {358 fmt.Fprintf(w, "\t\tr[%v] = res;\n", call.Index)359 }360 for _, copyout := range call.Copyout {361 fmt.Fprintf(w, "\t\tNONFAILING(r[%v] = *(uint%v*)0x%x);\n",362 copyout.Index, copyout.Size*8, copyout.Addr)363 }364 if copyoutMultiple {365 fmt.Fprintf(w, "\t}\n")366 }367}368func (ctx *context) constArgToStr(arg prog.ExecArgConst, handleBigEndian, native bool) string {369 mask := (uint64(1) << (arg.Size * 8)) - 1370 v := arg.Value & mask371 val := fmt.Sprintf("%v", v)372 if v == ^uint64(0)&mask {373 val = "-1"374 } else if v >= 10 {375 val = fmt.Sprintf("0x%x", v)376 }377 if native && arg.Size == 8 {378 // syscall() is variadic, so constant arguments must be explicitly379 // promoted. Otherwise the compiler is free to leave garbage in the380 // upper 32 bits of the argument value. In practice this can happen381 // on amd64 with arguments that are passed on the stack, i.e.,382 // arguments beyond the first six. For example, on freebsd/amd64,383 // syscall(SYS_mmap, ..., 0) causes clang to emit a 32-bit store of384 // 0 to the stack, but the kernel expects a 64-bit value.385 //386 // syzkaller's argument type representations do not always match387 // the OS ABI. For instance, "flags" is always 64 bits wide on 64-bit388 // platforms, but is a 32-bit value ("unsigned int" or so) in many389 // cases. Thus, we assume here that passing a 64-bit argument where390 // a 32-bit argument is expected won't break anything. On amd64391 // this should be fine: arguments are passed in 64-bit registers or392 // at 64 bit-aligned addresses on the stack.393 if ctx.target.PtrSize == 4 {394 val += "ull"395 } else {396 val += "ul"397 }398 }399 if ctx.opts.Procs > 1 && arg.PidStride != 0 {400 val += fmt.Sprintf(" + procid*%v", arg.PidStride)401 }402 if handleBigEndian && arg.Format == prog.FormatBigEndian {403 val = fmt.Sprintf("htobe%v(%v)", arg.Size*8, val)404 }405 return val406}407func (ctx *context) resultArgToStr(arg prog.ExecArgResult) string {408 res := fmt.Sprintf("r[%v]", arg.Index)409 if arg.DivOp != 0 {410 res = fmt.Sprintf("%v/%v", res, arg.DivOp)411 }412 if arg.AddOp != 0 {413 res = fmt.Sprintf("%v+%v", res, arg.AddOp)414 }415 if arg.Format == prog.FormatBigEndian {416 res = fmt.Sprintf("htobe%v(%v)", arg.Size*8, res)417 }418 return res419}420func (ctx *context) postProcess(result []byte) []byte {421 // Remove NONFAILING, debug, fail, etc calls.422 if !ctx.opts.HandleSegv {423 result = regexp.MustCompile(`\t*NONFAILING\((.*)\);\n`).ReplaceAll(result, []byte("$1;\n"))424 }425 result = bytes.Replace(result, []byte("NORETURN"), nil, -1)426 result = bytes.Replace(result, []byte("doexit("), []byte("exit("), -1)427 result = regexp.MustCompile(`PRINTF\(.*?\)`).ReplaceAll(result, nil)428 result = regexp.MustCompile(`\t*debug\((.*\n)*?.*\);\n`).ReplaceAll(result, nil)429 result = regexp.MustCompile(`\t*debug_dump_data\((.*\n)*?.*\);\n`).ReplaceAll(result, nil)430 result = regexp.MustCompile(`\t*exitf\((.*\n)*?.*\);\n`).ReplaceAll(result, []byte("\texit(1);\n"))431 result = regexp.MustCompile(`\t*fail\((.*\n)*?.*\);\n`).ReplaceAll(result, []byte("\texit(1);\n"))432 result = ctx.hoistIncludes(result)433 result = ctx.removeEmptyLines(result)434 return result...

Full Screen

Full Screen

postProcess

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 csource := NewCSource()4 csource.AddRune('A')5 csource.AddRune('B')6 csource.AddRune('C')7 csource.AddRune('D')8 csource.AddRune('E')9 csource.AddRune('F')10 csource.AddRune('G')11 csource.AddRune('H')12 csource.AddRune('I')13 csource.AddRune('J')14 csource.AddRune('K')15 csource.AddRune('L')16 csource.AddRune('M')17 csource.AddRune('N')18 csource.AddRune('O')19 csource.AddRune('P')20 csource.AddRune('Q')21 csource.AddRune('R')22 csource.AddRune('S')23 csource.AddRune('T')24 csource.AddRune('U')25 csource.AddRune('V')26 csource.AddRune('W')27 csource.AddRune('X')28 csource.AddRune('Y')29 csource.AddRune('Z')30 csource.AddRune('\n')31 csource.AddRune('a')32 csource.AddRune('b')33 csource.AddRune('c')34 csource.AddRune('d')35 csource.AddRune('e')36 csource.AddRune('f')37 csource.AddRune('g')38 csource.AddRune('h')39 csource.AddRune('i')40 csource.AddRune('j')41 csource.AddRune('k')42 csource.AddRune('l')43 csource.AddRune('m')44 csource.AddRune('n')45 csource.AddRune('o')46 csource.AddRune('p')47 csource.AddRune('q')48 csource.AddRune('r')49 csource.AddRune('s')50 csource.AddRune('t')51 csource.AddRune('u')52 csource.AddRune('v')53 csource.AddRune('w')54 csource.AddRune('x')55 csource.AddRune('y')56 csource.AddRune('z')57 csource.AddRune('\n')58 csource.AddRune('0')59 csource.AddRune('1')60 csource.AddRune('2')61 csource.AddRune('3')

Full Screen

Full Screen

postProcess

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 csource.postProcess()4}5import (6func main() {7 csource.postProcess()8}9import (10func main() {11 csource.postProcess()12}13import (14func main() {15 csource.postProcess()16}17import (18func main() {19 csource.postProcess()20}21import (22func main() {23 csource.postProcess()24}25import (26func main() {27 csource.postProcess()28}29import (30func main() {31 csource.postProcess()32}33import (34func main() {35 csource.postProcess()36}37import (

Full Screen

Full Screen

postProcess

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 c := csource.New()4 c.PostProcessFunc = func(s string) string {5 }6 err := c.Compile()7 if err != nil {8 fmt.Println(err)9 }10 fmt.Println(c.OutputFile)11}12import (13func main() {14 c := csource.New()15 err := c.Compile()16 if err != nil {17 fmt.Println(err)18 }19 fmt.Println(c.OutputFile)20}21import (22func main() {23 c := csource.New()24 c.CompilerArgs = []string{"-O2"}25 err := c.Compile()26 if err != nil {27 fmt.Println(err)28 }29 fmt.Println(c.OutputFile)30}

Full Screen

Full Screen

postProcess

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 csrc.Set("name", "deviceQuery")4 csrc.Set("file", "deviceQuery.cu")5 csrc.Set("arch", "sm_61")6 csrc.Set("ptx", "deviceQuery.ptx")7 csrc.Set("bin", "deviceQuery.bin")8 csrc.Set("cubin", "deviceQuery.cubin")9 csrc.Set("compiler", "nvcc")10 csrc.Set("compilerOptions", "-O3")11 csrc.Set("linker", "nvcc")12 csrc.Set("linkerOptions", "-O3")13 csrc.Set("linkerLibs", "")14 csrc.Set("linkerLibPaths", "")15 csrc.Set("linkerRPaths", "")16 csrc.Set("linkerDefines", "")17 csrc.Set("linkerUndefines", "")18 csrc.Set("linkerIncludes", "")19 csrc.Set("linkerCudaLibs", "")20 csrc.Set("linkerCudaLibPaths", "")21 csrc.Set("linkerCudaRPaths", "")22 csrc.Set("linkerCudaDefines", "")23 csrc.Set("linkerCudaUndefines", "")24 csrc.Set("linkerCudaIncludes", "")25 csrc.Set("linkerCudaOptions", "")26 csrc.Set("linkerCudaDeviceLibs", "")27 csrc.Set("linkerCudaDeviceLibPaths", "")28 csrc.Set("linkerCudaDeviceRPaths", "")29 csrc.Set("linkerCudaDeviceDefines", "")30 csrc.Set("linkerCudaDeviceUndefines", "")31 csrc.Set("linkerCudaDeviceIncludes", "")32 csrc.Set("linkerCudaDeviceOptions", "")33 csrc.Set("linkerCudaFatbin", "")34 csrc.Set("linkerCudaFatbinOptions", "")35 csrc.Set("linkerCudaFatbinArchs", "")36 csrc.Set("linkerCudaFatbinCode", "")37 csrc.Set("linkerCudaFatbinCodeOptions", "")38 csrc.Set("linkerCudaFatbinCodeArchs", "")39 csrc.Set("linkerCudaFatbinDeviceCode", "")40 csrc.Set("linker

Full Screen

Full Screen

postProcess

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 fmt.Printf(stringutil.PostProcess("hello, world\n"))4}5import (6func main() {7 fmt.Printf(stringutil.PostProcess("hello, world\n"))8}9import (10func main() {11 fmt.Printf(stringutil.PostProcess("hello, world\n"))12}13import (14func main() {15 fmt.Printf(stringutil.PostProcess("hello, world\n"))16}17import (18func main() {19 fmt.Printf(stringutil.PostProcess("hello, world\n"))20}21import (22func main() {23 fmt.Printf(stringutil.PostProcess("hello, world\n"))24}25import (26func main() {27 fmt.Printf(stringutil.PostProcess("hello, world\n"))28}29import (30func main() {31 fmt.Printf(stringutil.PostProcess("hello, world\n"))32}33import (34func main()

Full Screen

Full Screen

postProcess

Using AI Code Generation

copy

Full Screen

1using namespace std;2#define REP(i,n) for(int i=0;i<(n);++i)3#define REPD(i,n) for(int i=(n)-1;i>=0;--i)4#define FOR(i,a,b) for(int i=(a);i<(b);++i)5#define FORD(i,a,b) for(int i=(a)-1;i>=(b);--i)6#define FOREACH(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();++it)7#define ALL(c) (c).begin(), (c).end()8#define SIZE(x) ((int)(x).size())9#define FILL(x,v) memset(x, v, sizeof(x))10typedef long long LL;11typedef unsigned long long ULL;12typedef vector<int> VI;13typedef vector<VI> VVI;14typedef vector<string> VS;15typedef pair<int, int> PII;16template <typename T> ostream& operator<<(ostream& os, const vector<T>& v) {17 copy(v.begin(), v.end(), ostream_iterator<T>(cout, " "));18 return os;19}20template <typename T> istream& operator>>(istream& is, vector<T>& v) {21 copy(v.begin(), v.end(), istream_iterator<T>(is));22 return is;23}24class csource {25 csource();26 csource(string);27 void postProcess();28 void print();29 void printToFile(string);30 vector<string> code;31 vector<string> funcNames;32 vector<string> funcArgs;33 vector<string> funcTypes;34 vector<string> varNames;

Full Screen

Full Screen

postProcess

Using AI Code Generation

copy

Full Screen

1import "fmt"2import "github.com/01-edu/z01"3func main() {4 csource.postProcess(path, path2)5 fmt.Println("File created")6}7import "fmt"8import "github.com/01-edu/z01"9func main() {10 csource.preProcess(path, path2)11 fmt.Println("File created")12}13import "fmt"14import "github.com/01-edu/z01"15func main() {16 csource.preProcess(path, path2)17 fmt.Println("File created")18}19import "fmt"20import "github.com/01-edu/z01"21func main() {22 csource.postProcess(path, path2)23 fmt.Println("File created")24}25import "fmt"26import "github.com/01-edu/z01"27func main() {28 csource.postProcess(path, path2)29 fmt.Println("File

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful