| 
									
										
										
										
											2019-07-22 12:17:27 +03:00
										 |  |  | // Copyright 2015 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | package compiler | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2017-01-06 15:39:35 +01:00
										 |  |  | 	"os/exec" | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 00:36:31 +02:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2017-01-06 15:39:35 +01:00
										 |  |  | 	testSource = ` | 
					
						
							| 
									
										
										
										
											2019-02-03 12:41:38 +01:00
										 |  |  | pragma solidity >0.0.0; | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | contract test { | 
					
						
							|  |  |  |    /// @notice Will multiply ` + "`a`" + ` by 7. | 
					
						
							| 
									
										
										
										
											2019-02-03 12:41:38 +01:00
										 |  |  |    function multiply(uint a) public returns(uint d) { | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  |        return a * 7; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ` | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-06 15:39:35 +01:00
										 |  |  | func skipWithoutSolc(t *testing.T) { | 
					
						
							|  |  |  | 	if _, err := exec.LookPath("solc"); err != nil { | 
					
						
							| 
									
										
										
										
											2016-06-15 00:36:31 +02:00
										 |  |  | 		t.Skip(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-05-18 15:31:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-18 12:29:26 +00:00
										 |  |  | func TestSolidityCompiler(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2017-01-06 15:39:35 +01:00
										 |  |  | 	skipWithoutSolc(t) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 00:36:31 +02:00
										 |  |  | 	contracts, err := CompileSolidityString("", testSource) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("error compiling source. result %v: %v", contracts, err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-20 04:11:48 +01:00
										 |  |  | 	if len(contracts) != 1 { | 
					
						
							| 
									
										
										
										
											2016-04-15 11:06:57 +02:00
										 |  |  | 		t.Errorf("one contract expected, got %d", len(contracts)) | 
					
						
							| 
									
										
										
										
											2015-05-20 04:11:48 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-06-15 00:36:31 +02:00
										 |  |  | 	c, ok := contracts["test"] | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							| 
									
										
										
										
											2017-01-25 14:57:13 -08:00
										 |  |  | 		c, ok = contracts["<stdin>:test"] | 
					
						
							|  |  |  | 		if !ok { | 
					
						
							|  |  |  | 			t.Fatal("info for contract 'test' not present in result") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-06-15 00:36:31 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-06 15:39:35 +01:00
										 |  |  | 	if c.Code == "" { | 
					
						
							|  |  |  | 		t.Error("empty code") | 
					
						
							| 
									
										
										
										
											2016-06-15 00:36:31 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if c.Info.Source != testSource { | 
					
						
							|  |  |  | 		t.Error("wrong source") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-06 15:39:35 +01:00
										 |  |  | 	if c.Info.CompilerVersion == "" { | 
					
						
							|  |  |  | 		t.Error("empty version") | 
					
						
							| 
									
										
										
										
											2015-05-18 15:31:26 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-18 12:29:26 +00:00
										 |  |  | func TestSolidityCompileError(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2017-01-06 15:39:35 +01:00
										 |  |  | 	skipWithoutSolc(t) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 00:36:31 +02:00
										 |  |  | 	contracts, err := CompileSolidityString("", testSource[4:]) | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 	if err == nil { | 
					
						
							| 
									
										
										
										
											2015-05-20 04:11:48 +01:00
										 |  |  | 		t.Errorf("error expected compiling source. got none. result %v", contracts) | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-06-15 00:36:31 +02:00
										 |  |  | 	t.Logf("error: %v", err) | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | } |