make primary executable a more robust integration test harness
This commit is contained in:
		
							parent
							
								
									06479b8cb7
								
							
						
					
					
						commit
						93536aa4ad
					
				
					 1 changed files with 68 additions and 36 deletions
				
			
		
							
								
								
									
										104
									
								
								src/main.zig
									
										
									
									
									
								
							
							
						
						
									
										104
									
								
								src/main.zig
									
										
									
									
									
								
							|  | @ -2,6 +2,8 @@ const std = @import("std"); | |||
| const aws = @import("aws.zig"); | ||||
| const json = @import("json.zig"); | ||||
| 
 | ||||
| var verbose = false; | ||||
| 
 | ||||
| pub fn log( | ||||
|     comptime level: std.log.Level, | ||||
|     comptime scope: @TypeOf(.EnumLiteral), | ||||
|  | @ -9,7 +11,7 @@ pub fn log( | |||
|     args: anytype, | ||||
| ) void { | ||||
|     // Ignore awshttp messages | ||||
|     if (scope == .awshttp and @enumToInt(level) >= @enumToInt(std.log.Level.debug)) | ||||
|     if (!verbose and scope == .awshttp and @enumToInt(level) >= @enumToInt(std.log.Level.debug)) | ||||
|         return; | ||||
|     const scope_prefix = "(" ++ @tagName(scope) ++ "): "; | ||||
|     const prefix = "[" ++ @tagName(level) ++ "] " ++ scope_prefix; | ||||
|  | @ -21,60 +23,90 @@ pub fn log( | |||
|     nosuspend stderr.print(prefix ++ format ++ "\n", args) catch return; | ||||
| } | ||||
| 
 | ||||
| const Tests = enum { | ||||
|     query_no_input, | ||||
|     query_with_input, | ||||
|     ec2_query_no_input, | ||||
| }; | ||||
| 
 | ||||
| pub fn main() anyerror!void { | ||||
|     // Uncomment if you want to log allocations | ||||
|     // const file = try std.fs.cwd().createFile("/tmp/allocations.log", .{ .truncate = true }); | ||||
|     // defer file.close(); | ||||
|     // var child_allocator = std.heap.c_allocator; | ||||
|     // const allocator = &std.heap.loggingAllocator(child_allocator, file.writer()).allocator; | ||||
| 
 | ||||
|     // Flip to true to run a second time. This will help debug | ||||
|     // allocation/deallocation issues | ||||
|     const test_twice = false; | ||||
| 
 | ||||
|     // Flip to true to run through the json parsing changes made to stdlib | ||||
|     const test_json = false; | ||||
|     if (test_json) try jsonFun(); | ||||
| 
 | ||||
|     const c_allocator = std.heap.c_allocator; | ||||
|     var gpa = std.heap.GeneralPurposeAllocator(.{}){ | ||||
|         .backing_allocator = c_allocator, | ||||
|     }; | ||||
|     defer if (!gpa.deinit()) @panic("memory leak detected"); | ||||
|     defer _ = gpa.deinit(); | ||||
|     const allocator = &gpa.allocator; | ||||
|     // const allocator = std.heap.c_allocator; | ||||
|     var tests = std.ArrayList(Tests).init(allocator); | ||||
|     defer tests.deinit(); | ||||
|     var args = std.process.args(); | ||||
|     while (args.next(allocator)) |arg_or_error| { | ||||
|         const arg = try arg_or_error; | ||||
|         defer allocator.free(arg); | ||||
|         if (std.mem.eql(u8, "-v", arg)) { | ||||
|             verbose = true; | ||||
|             continue; | ||||
|         } | ||||
|         inline for (@typeInfo(Tests).Enum.fields) |f| { | ||||
|             if (std.mem.eql(u8, f.name, arg)) { | ||||
|                 try tests.append(@field(Tests, f.name)); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     if (tests.items.len == 0) { | ||||
|         inline for (@typeInfo(Tests).Enum.fields) |f| | ||||
|             try tests.append(@field(Tests, f.name)); | ||||
|     } | ||||
| 
 | ||||
|     const options = aws.Options{ | ||||
|         .region = "us-west-2", | ||||
|     }; | ||||
|     std.log.info("Start", .{}); | ||||
| 
 | ||||
|     std.log.info("Start\n", .{}); | ||||
|     var client = aws.Aws.init(allocator); | ||||
|     defer client.deinit(); | ||||
| 
 | ||||
|     const services = aws.Services(.{.sts}){}; | ||||
|     const resp = try client.call(services.sts.get_caller_identity.Request{}, options); | ||||
|     // TODO: This is a bit wonky. Root cause is lack of declarations in | ||||
|     //       comptime-generated types | ||||
|     defer resp.deinit(); | ||||
| 
 | ||||
|     if (test_twice) { | ||||
|         std.time.sleep(1000 * std.time.ns_per_ms); | ||||
|         std.log.info("second request", .{}); | ||||
| 
 | ||||
|         var client2 = aws.Aws.init(allocator); | ||||
|         defer client2.deinit(); | ||||
|         const resp2 = try client2.call(services.sts.get_caller_identity.Request{}, options); // catch here and try alloc? | ||||
|         defer resp2.deinit(); | ||||
|     for (tests.items) |t| { | ||||
|         std.log.info("===== Start Test: {s} =====", .{@tagName(t)}); | ||||
|         switch (t) { | ||||
|             .query_no_input => { | ||||
|                 const resp = try client.call(services.sts.get_caller_identity.Request{}, options); | ||||
|                 defer resp.deinit(); | ||||
|                 std.log.info("arn: {s}", .{resp.response.arn}); | ||||
|                 std.log.info("id: {s}", .{resp.response.user_id}); | ||||
|                 std.log.info("account: {s}", .{resp.response.account}); | ||||
|                 std.log.info("requestId: {s}", .{resp.response_metadata.request_id}); | ||||
|             }, | ||||
|             .query_with_input => { | ||||
|                 // TODO: Find test without sensitive info | ||||
|                 const access = try client.call(services.sts.get_session_token.Request{ | ||||
|                     .duration_seconds = 900, | ||||
|                 }, options); | ||||
|                 defer access.deinit(); | ||||
|                 std.log.info("access key: {s}", .{access.response.credentials.access_key_id}); | ||||
|             }, | ||||
|             .ec2_query_no_input => { | ||||
|                 // TODO: Find test | ||||
|             }, | ||||
|         } | ||||
|         std.log.info("===== End Test: {s} =====\n", .{@tagName(t)}); | ||||
|     } | ||||
| 
 | ||||
|     std.log.info("arn: {s}", .{resp.response.arn}); | ||||
|     std.log.info("id: {s}", .{resp.response.user_id}); | ||||
|     std.log.info("account: {s}", .{resp.response.account}); | ||||
|     std.log.info("requestId: {s}", .{resp.response_metadata.request_id}); | ||||
|     // if (test_twice) { | ||||
|     //     std.time.sleep(1000 * std.time.ns_per_ms); | ||||
|     //     std.log.info("second request", .{}); | ||||
|     // | ||||
|     //     var client2 = aws.Aws.init(allocator); | ||||
|     //     defer client2.deinit(); | ||||
|     //     const resp2 = try client2.call(services.sts.get_caller_identity.Request{}, options); // catch here and try alloc? | ||||
|     //     defer resp2.deinit(); | ||||
|     // } | ||||
| 
 | ||||
|     std.log.info("Departing main", .{}); | ||||
|     std.log.info("===== Tests complete =====", .{}); | ||||
| } | ||||
| 
 | ||||
| // TODO: Move into json.zig | ||||
| pub fn jsonFun() !void { | ||||
|     // Standard behavior | ||||
|     const payload = | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue